Visualizing and Understanding Convolutional Networks

论文原址:https://arxiv.org/pdf/1311.2901.pdf

1. 背景

我们都知道 CNN 卷积神经网络 效果好,但是一直以来都是一个黑盒,有2个关键问题:

  1. However there is no clear understanding of why they perform so wel
  2. or how they might be improved

其实包括我自己也是很困惑的,卷积神经网络有非常多。但是你看网上的资源来来回回都是在讲这些神经网络的结构。但是很少人知道为什么要把结构设计成这个样子。比如LeNet-5第一层卷积层为啥需要6个通道?为什么整个网络只需要2个卷积层,能不能更多或者更少?

为了解决这个黑盒问题,论文作者提出了一种可视化的方法,能够观测到卷积层的feature maps到底识别到了图片的什么特征,并以此反馈来改进神经网络的结构设计。最后通过这个方法,作者在ImageNet测试集上取得了非常突出的结果

2. 方法

论文的核心思想:map these activities back to the input pixel space, showing what input pattern originally caused a given activation in the feature maps

以LeNet-5这种经典的2D网络为例,正向的卷积过程一般包括几个步骤:

  1. filter
  2. relu
  3. max pooling
  4. 【optionally】local contrast operation

0


Mlsys & 深度学习相关方向的技术栈梳理

一些系统性的学习资料:

1. 深度网络设计

神经网络

  1. 经典2D/3D网络(LeNet-5,AlexNet,VCG)
  2. 残差网络:ResNet,DesNet,ResNeXt
  3. 时序网络:RNN,LSTM,GRU
  4. 生成对抗网络:DCGAN,LAPGAN,CycleGAN
  5. 其他:AutoML

2. 模型开发库

对神经网络模型的封装,更易用的API,集成度更高

  1. paddleNLP,paddleDetection,paddleOCR
  2. 其他公司好像没

3. 深度学习框架

面向 AI 的深度学习 toolkit 集合,主要研究的我看有两块,一块是深度学习框架本身,一块是深度学习可视化相关的

  1. 计算框架:
    1. tensorflow
    2. pytorch
    3. mxnet
    4. paddlepaddle
  2. 可视化:
    1. tensorboard
    2. VisualDL
    3. visdom

 


使用 LSTM 实现长期预测

pytorch LSTM:https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html

最近看 google 的论文 autopilot,讲的是怎么通过一个app的历史的资源使用数据,来预测这个app到底需要多少资源,才能满足其服务的正常运行

论文讲了2种方法,就是:

  1. 一种是传统的,对历史数据加权
  2. 一种是基于增强学习的,这个有点复杂,没太看懂

不过我有个疑问,像资源使用这种时序的数据,用 lstm 这种循环神经网络不是最简单吗?为什么要用增强学习这么复杂的东西(状态空间复杂,状态的迁移也复杂,并且需要更大的计算量)

所以我打算试试用 lstm 来实现长期的资源预测

我的数据样本:

20220510000000,38.388889
20220510003000,33.722222
20220510010000,31.538889
...
20220510053000,31.183333
20220510060000,32.983333
20220510063000,36.694444

第一列是明文的时间,第二列是app的cpu使用

1. 思路

使用 lstm 有几个关键的地方:

  1. 定义好网络的输入输出,简单来说就是你希望神经网络帮你学习什么样的特征映射。
  2. 怎么实现长期预测

由于典型的 rnn 神经网络,是输入一串历史数据,输出下一个时刻的预测值。这是经典用法,可能也有一些方法,可以直接输出多个历史预测值的,不过我没研究过,这里不讨论

我的方法也比较简单,就是用预测出来的值作为神经网络的数据,继续滚动预测下一个值,通过这种方法,实现“长期”的预测

2. 网络(输入、输出)建模

首先要定义清楚网络的输入,输出是什么

由于经典的 rnn 只有一个输出,就是我们下一步要预测的值,所以这个没什么好讨论的

但是输入是可以多个的,你可以用当前最近的2个数据来预测下一个数据,也可以用当前10个数据预测下一个数据,也可以是N个。但是据我的实测观察来看,使用2个数据预测下一个数据效果好像更好一些

2个数据预测1个

0


VGG-16 神经网络结构详解

视频:https://www.bilibili.com/video/BV1FT4y1E74V?p=120

0

这节课要讲的第三个,也是最后一个范例是VGG,也叫作VGG-16网络。

值得注意的一点是,VGG-16网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。首先用3×3,步幅为1的过滤器构建卷积层,padding参数为same卷积中的参数。然后用一个2×2,步幅为2的过滤器构建最大池化层。因此VGG网络的一大优点是它确实简化了神经网络结构,下面我们具体讲讲这种网络结构。

0

假设要识别这个图像,在最开始的两层用64个3×3的过滤器对输入图像进行卷积,输出结果是224×224×64,因为使用了same卷积,通道数量也一样。VGG-16其实是一个很深的网络,这里我并没有把所有卷积层都画出来。

0

假设这个小图是我们的输入图像,尺寸是224×224×3,进行第一个卷积之后得到224×224×64的特征图,接着还有一层224×224×64,得到这样2个厚度为64的卷积层,意味着我们用64个过滤器进行了两次卷积。正如我在前面提到的,这里采用的都是大小为3×3,步幅为1的过滤器,并且都是采用same卷积,所以我就不再把所有的层都画出来了,只用一串数字代表这些网络。


AlexNet 神经网络结构详解

视频:https://www.bilibili.com/video/BV1FT4y1E74V?p=120 

我要举例说明的第二种神经网络是AlexNet,是以论文的第一作者Alex Krizhevsky的名字命名的,另外两位合著者是Ilya Sutskever和Geoffery Hinton。

0

AlexNet首先用一张227×227×3的图片作为输入,实际上原文中使用的图像是224×224×3,但是如果你尝试去推导一下,你会发现227×227这个尺寸更好一些。

第一层我们使用96个11×11的过滤器,步幅为4,由于步幅是4,因此尺寸缩小到55×55,缩小了4倍左右。

(以下请有兴趣的同学一定要推导一下,算一算才有长进~)

然后用一个3×3的过滤器构建最大池化层,f=3,步幅s为2,卷积层尺寸缩小为27×27×96。接着再执行一个5×5的卷积,padding之后,输出是27×27×276。然后再次进行最大池化,尺寸缩小到13×13。

再执行一次same卷积,相同的padding,得到的结果是13×13×384,384个过滤器。

再做一次same卷积,就像这样。

再做一次同样的操作,最后再进行一次最大池化,尺寸缩小到6×6×256。

6×6×256等于9216,将其展开为9216个单元,然后是一些全连接层。

最后使用softmax函数输出识别的结果,看它究竟是1000个可能的对象中的哪一个。


LeNet-5 神经网络结构详解

卷积层的参数计算:

  1. 卷积后feature map边长: outputSize =(originalSize + paddingX2 – kernelSize)/ stride + 1 (其中outputSize是卷积之后得到的feature map的边长,originalSize是输⼊图的边长,padding是填充的⼤⼩,kernelSize是卷积核的边长,stride是步长)
  2. 卷积层的可训练的参数个数: trainNum = (outputSize X outputSize + 1) X kernelNum (其中kernelNum是卷积核的个数,加1是因为每⼀个卷积核有⼀个bias参数)
  3. 卷积层的连接数: connectNum = (kernelSize X kernelSize) X (outputSize X outputSize) X kernelNum
  4. 卷积层的神经元个数: neuralNum = (outputSzie X outputSize) X kernelNum

采样层的参数计算:

  1. 采样后map的边长: outputSize =(originalSize + paddingX2 – kernelSize)/ stride + 1 (其中outputSize是卷积之后得到的feature map的边长,originalSize是输⼊图的边长,padding是填充的⼤⼩,kernelSize是卷积核的边长,stride是步长)
  2. 采样层可训练的参数个数: trainNum = (1+ 1) X kernelNum (其中kernelNum是卷积核的个数)
  3. 采样层的连接数: connectNum = (kernelSize X kernelSize) X (outputSize X outputSize) X kernelNum
  4. 采样层的神经元个数: neuralNum = (outputSzie X outputSize) X kernelNum

0


Blink Fast and Generic Collectives for Distributed ML

论文原址:https://arxiv.org/abs/1910.04940

blink 论文最创新的地方,其实就是在训练的过程中,考虑了硬件的拓扑结构,类似于最短路径优化,找到一个训练时间最短的路径

背景介绍

随着机器学习模型,和数据量的不断增长,模型训练逐渐由单机训练,转变为分布式的多机训练。在分布式深度学习中,数据并行是最为常用的模型训练方式。然而数据并行的模型训练过程中,需要频繁的做数据聚合/模型同步。参与运算的 GPU 数量越多,其对应的数据聚合的开销也会越大。当下单个 GPU 的算力不断增加,GPU 间的数据聚合成成了新的分布式机器学习的瓶颈。

各大公司也发现了数据聚合这个重大瓶颈,因此在软硬件上都提出了自己的解决方案。硬件层面上,GPU 厂商 Nvidia 发布了 GPU 之间直接相连的高速通信通道 NVLink,以及多 GPU 之间的路由器 NVSwitch。软件层面上,各大公司都相继发布了自己的 GPU 通信库(例如:Nvidia 的 NCCL,Baidu 的 Ring-AllReduce),或者针对 GPU 通信进行优化的分布式机器学习平台(最流行的 Uber 的 Horovod)。

然而,这些软件层面上的通信库或者机器学习平台,并没有充分利用所有的,同构和异构的网络通信线路。因此,由 UC Berkeley,Microsoft Research 以及 University of Wisconsin-Madison 组成的研究团队发布,能够充分利用所有同构及异构的网络传输线路,从而实现最优 GPU 间数据聚合的 Blink 项目。

论文摘要

当下流行的分布式机器学习平台(Horovod)或 GPU 间数据聚合的通信库(NCCL),其最大问题在于无法很好的解决网络异构性。网络异构性主要表现为如下三点:

1. 同构的 GPU 间链接线路,例如 NVLink,用于不同型号的 GPU 的对应 NVLink 的版本和带宽不同,其组成的网络的拓扑结构也不相同。具体区别如图一所示。

0

在一个 8 卡的 DGX-1 机器上:如果 GPU 是 P100,其对应的 NVLink 是第一代,带宽为 18-20GB/s,其拓扑结构如图 1 黑线所示。如果 DGX-1 用的 GPU 是 V100,其 NVLink 通信线路为第二代,带宽为 22-25GB/s。于此同时,相比 P100 的 DGX-1,V100 的 DGX-1 的网络拓扑结构也不同,其在 P100 的基础上,新增了一圈红色虚线的 NVLink 线路。


Autopilot: workload autoscaling at Google

autopilot 算是 google 今年混部领域最重磅的论文了吧

论文原址:https://dl.acm.org/doi/pdf/10.1145/3342195.3387524

在传统的数据中心里,资源超售最简单的方式就是把闲置资源回收再分配,total = total – allocated + reclaim

有时候,业务为了应对峰值流量(特别是互联网服务这种有明显流量特征的),都会购买多一些冗余资源。但是这些冗余资源会因为各种原因,不是那么准确。比如流量随着时间流逝会逐渐发生变化、或者用户过于焦虑

用户填的Quota永远都是不准的

这会带来一些问题:

  1. 集群资源浪费,由于Quota不准,导致机器资源被大量闲置和浪费。比如 Quota 分配出去了100c,但实际使用了10c
  2. 集群负载不均衡,同样两个机器,分配率一样,但是实际使用差别很大,对混部性能的影响就不一样

为了解决这个问题,google设计了autopilot,尝试通过自动的校准用户的 Quota,实现一定程度的超售,降低成本


Borg: the next generation

论文原址:https://dl.acm.org/doi/pdf/10.1145/3342195.3387517

这篇论文主要是分析了google内部8个集群的workload数据,并和2011年(1个集群)的数据集做了一些对比,以此来跟踪数据中心这几年的workload变化

相较于2011年的workload数据,可以发现,无论是资源模型、负载分布、混部密度、系统架构,等,都有很大的变化。这里面的很多内容和想法,和我们过去做过的还有正在做的,都不谋而合

1. 资源模型

2011年的时候,google的资源模型只有4个优先级,分别是:

  1. Free tier:免费资源,基本上不承诺任何SLA,通常是研发用来跑一些测试任务
  2. Best-effort Batch (beb) tier:同样不承诺SLA,低优先级资源,一般用来跑离线任务
  3. Production tier:生产级别,承诺SLA,一般用来托管在线服务,比如以下 long runing service
  4. Monitoring tier:监控级别,具有最高级别的SLA,用来运行数据中心的基础系统

机器学习算法之——卷积神经网 (CNN)原理讲解

很经典的一篇文章,存档一下:https://xie.infoq.cn/article/c4d846096c92c7dfcd6539075

一、从神经网络到卷积神经网络

我们知道神经网络的结构是这样的:

那卷积神经网络跟它是什么关系呢?

其实卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。比如下图中就多了许多传统神经网络没有的层次。

1. 定义

简而言之,卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。卷积神经网络的创始人是着名的计算机科学家 Yann LeCun,目前在 Facebook 工作,他是第一个通过卷积神经网络在 MNIST 数据集上解决手写数字问题的人。

Yann LeCunn

2. 卷积神经网络的架构

如上图所示,卷积神经网络架构与常规人工神经网络架构非常相似,特别是在网络的最后一层,即全连接。此外,还注意到卷积神经网络能够接受多个特征图作为输入,而不是向量。