文章目录
卷积神经网络
卷积层
-
局部连接
每个神经元只与输入数据的一个局部区域连接。该连接的空间大小叫做神经元的感受野(receptive field),它的尺寸是一个超参数(其实就是滤波器的空间尺寸)。连接在空间(宽高)上是局部的,但是在深度上总是和输入数据的深度一致。
-
空间排列
4个超参数控制着输出数据体的尺寸:
-
滤波器的数量K
每个滤波器在输入数据中被不同的特征激活。将这些沿着深度方向排列、感受野相同的神经元集合称为深度列(depth column),或纤维(fibre)。
-
步长S
步长为n,滤波器每次移动n个像素。这个操作会让输出数据体在空间上变小。
- ( W − F + 2 P ) / S (W-F+2P)/S (W−F+2P)/S一定要为整数。
-
零填充的尺寸P
可以控制输出数据的空间尺寸(最常用的是用来保持输入数据在空间上的尺寸,这样输入和输出的宽高都相等),并且使图像边缘的信息不会过快地损失掉。
【一般来说,当步长 S = 1 S=1 S=1,零填充尺寸是 P = ( F − 1 ) / 2 P=(F-1)/2 P=(F−1)/2,这样就能保证输入和输出数据有相同的空间尺寸。】
-
滤波器的空间尺寸F
输入数据的尺寸为 W 1 × H 1 × D 1 W_{1}\times H_{1}\times D_{1} W1×H1×D1,
输出数据的尺寸为 W 2 × H 2 × D 2 W_{2}\times H_{2}\times D_{2} W2×H2×D2,
W 2 = ( W 1 − F + 2 P ) / S + 1 W_{2}=(W_{1}-F+2P)/S+1 W2=(W1−F+2P)/S+1
H 2 = ( H 1 − F + 2 P ) / S + 1 H_{2}=(H_{1}-F+2P)/S+1 H2=(H1−F+2P)/S+1
D 2 = K D_{2}=K D2=K
由于参数共享,每个滤波器包含 F ∗ F ∗ D 1 F*F*D_{1} F∗F∗D1个权重,卷积层一共有 F ∗ F ∗ D 1 ∗ K F*F*D_{1}*K F∗F∗D1∗K个权重和 K K K个偏置。
-
-
扩张卷积
举例:在某个维度上滤波器 w w w的尺寸为3,若扩张为0,则计算输入 x x x的方式为 w [ 0 ] ∗ x [ 0 ] + w [ 1 ] ∗ x [ 1 ] + w [ 2 ] ∗ x [ 2 ] w[0]*x[0]+w[1]*x[1]+w[2]*x[2] w[0]∗x[0]+w[1]∗x[1]+w[2]∗x[2];若扩张为1,则计算方式为 w [ 0 ] ∗ x [ 0 ] + w [ 1 ] ∗ x [ 2 ] + w [ 2 ] ∗ x [ 4 ] w[0]*x[0]+w[1]*x[2]+w[2]*x[4] w[0]∗x[0]+w[1]∗x[2]+w[2]∗x[4]。
对卷积进行扩张,那么这个有效感受野就会迅速增长,在很少的层数内更快地汇集输入图片的大尺度特征。
池化层
通常,在连续的卷积层之间会周期性地插入一个池化层。它的作用是逐渐降低数据的空间尺寸,这样就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。
-
公式
-
输入数据尺寸 W 1 ∗ H 1 ∗ D 1 W_{1}*H_{1}*D_{1} W1∗H1∗D1
-
两个超参数
- 滤波器尺寸F
- 步长S
-
输出数据尺寸 W 2 ∗ H 2 ∗ D 2 W_{2}*H_{2}*D_{2} W2∗H2∗D2
W 2 = ( W 1 − F ) / S + 1 W_{2}=(W_{1}-F)/S+1 W2=(W1−F)/S+1
H 2 = ( H 1 − F ) / S + 1 H_{2}=(H_{1}-F)/S+1 H2=(H1−F)/S+1
D 2 = D 1 D_{2}=D_{1} D2=D1
-
对输入进行的是固定函数计算,所以没有引入参数
-
在汇聚层中很少使用零填充
-
-
左边:本例中,输入数据体尺寸[224x224x64]被降采样到了[112x112x64],采取的滤波器尺寸是2,步长为2,而深度不变。右边:最常用的降采样操作是取最大值,也就是最大池化,这里步长为2,每个取最大值操作是从4个数字中选取(即2x2的方块区域中)。
全连接层与卷积层之间的转化
-
卷积层转化为全连接层
对于任一个卷积层,都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵,除了某些特定块(这是因为有局部连接),其余部分都是零。而在其中大部分块中,元素都是相等的(因为参数共享)。
-
全连接层转化为卷积层
比如:一个 K = 4096 K=4096 K=4096的全连接层,输入数据体的尺寸是 7 ∗ 7 ∗ 512 7*7*512 7∗7∗512,这个全连接层可以被等效地看做一个的 F = 7 , P = 0 , S = 1 , K = 4096 F=7,P=0,S=1,K=4096 F=7,P=0,S=1,K=4096卷积层。换句话说,就是将滤波器的尺寸设置为和输入数据体的尺寸一致。因为只有一个单独的深度列覆盖并滑过输入数据体,所以输出将变成 1 ∗ 1 ∗ 4096 1*1*4096 1∗1∗4096,这个结果就和使用初始的那个全连接层一样。
- 应用:把一张更大的图片的不同区域都分别带入到卷积网络,得到每个区域的得分
层的排列规律
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
其中*指的是重复次数,POOL?指的是一个可选的池化层。其中N >=0,通常N<=3,M>=0,K>=0,通常K<3。
-
常见网络规律
- INPUT -> FC,实现一个线性分类器,N = M = K = 0。
- INPUT -> CONV -> RELU -> FC
- INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC。在每个池化层之间有一个卷积层。
- INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC。每个池化前有两个卷积层,适用于更大更深的网络,因为在执行具有破坏性的池化操作前,多重的卷积层可以从输入数据中学习到更多的复杂特征。
-
几个小滤波器卷积层的组合比一个大滤波器卷积层好。
原因:
- 多个卷积层与非线性的激活层交替的结构,比单一卷积层的结构更能提取出深层的更好的特征。
- 使用参数更少
唯一不足:中间的卷积层可能会导致占用更多的内存。
循环神经网络
网络结构
-
普通RNN模型结构
- 循环核心单元有一个内部状态,每次读取一个输入时都更新。
- RNN块返回一个向量
- RNN应用于具有相关性的数据序列。
-
RNN计算图
h t = f w ( h t − 1 , x t ) = t a n h ( W h h h t − 1 + W x h x t ) h_{t}=f_{w}(h_{t-1},x_{t})=tanh(W_{hh}h_{t-1}+W_{xh}x_{t}) ht=fw(ht−1,xt)=tanh(Whhht−1+Wxhxt)
y t = W h y h t y_{t}=W_{hy}h_{t} yt=Whyht
- 在每一个时间步骤中应用递归公式来处理向量x的序列,并保存。
- 在每个时间步长中使用相同的函数和参数集。
- h 0 h_{0} h0初始化为0
- W的梯度是每一步骤计算的W梯度的总和
-
一对一
-
一对多
-
举例:图片标题(图片==>单词序列)
-
计算图:
-
-
多对一
-
举例:情感分类(单词序列==>情感)
-
计算图:
-
-
多对多
-
举例
- 机器翻译(一种语言的单词序列==>另一种语言的单词序列)(不对齐)
- 帧级视频分类(对齐)
-
计算图:
编码和解码思想
-
案例分析
-
构建字符构词模型,使其能够预测序列的下一个字母。例如字符只有“h,e,l,o”,构建单词“hello”。
- 训练
- 这里只有第三个预测是正确的,需要优化损失。
- 可以送入整个单词来训练网络。
- 测试
- 测试阶段一个字符一个字符进行,上一个输出字符是下一个保存有隐藏激活的输入。
- 训练
-
给图片添加标题
-
使用 < START >和< END >指令来控制运行的开始和结束。
-
注意机制的图像添加标题:当RNN生成标题时,它只关注图像的特定部分,而不是整个图像。它也应用于“视觉问答“问题。
-
长短期记忆网络(LSTM)
-
问题:反向传播通过时间在整个序列向前计算损失,然后通过整个序列向后计算梯度。
- 但如果选择整个序列来计算反向传播,它将非常慢,占用大量内存,而且会产生梯度消失和梯度爆炸问题,永远不会收敛!
-
解决方法:
- 截短时间的反向传播:当进行运算时,在一部分序列块中向前计算损失或向后计算梯度,而不是整个序列。隐藏层永远向前计算,只在很少步骤中反向传播。
- 长短期记忆网络(LSTM)。梯度爆炸可以用梯度裁剪控制,梯度消失可以用加性交互作用控制。
-
- LSTM在训练时将数据保存在长记忆或短记忆中,它不仅能记住上一层的东西,还能记住各个层的东西。
- 就像ResNet一样,LSTM梯度很容易计算。
-
LSTM和GRU参考:
识别和分割
语义分割(Semantic Segmentation)
-
用类别标签标记图像中的每个像素。语义分割不区分实例,只关心像素。
-
×滑动窗口
采用一个小尺寸窗口在整个图片上滑动,每个窗口标记中心像素。
- 有效但计算代价昂贵
- 效率很低,不能重新使用重叠部分之间的共享特性。
-
×将网络设计成许多卷积层,一次预测所有像素
- 输入是整个图像。输出是标记每个像素的图像。 损失是每个像素之间提供的交叉熵
- 缺点:
- 需要大量昂贵的标记好的数据。
- 需要一个很深的卷积层
- 在原始图像分辨率下进行卷积使计算非常昂贵
-
√基于上一个方法,在网络中加入上采样和下采样
多层进行下采样,并在最后一层进行上采样
-
下采样如池化和跨步卷积。目的是缩小原图像,减少计算成本。
-
上采样:放大原图像
-
Nearest Neighbor
Input: 1 2 Output: 1 1 2 2 3 4 1 1 2 2 3 3 4 4 3 3 4 4
-
Bed of Nails
Input: 1 2 Output: 1 0 2 0 3 4 0 0 0 0 3 0 4 0 0 0 0 0
-
Max unpooling(最大上采样)
基于最大池化,在发生最大池化的地方填充像素,然后用0填充其他像素。是上采样的最好方法。
-
-
分类和定位(Classification + Localization)
-
识别图像中的主要对象并用矩形对其定位
- 假定图像中只有一个目标
-
方法:构建多任务神经网络
-
结构为卷积网络后加
- 用于对目标分类的全连接层(普通的分类问题)
- 用于连接四个参数(x,y,w,h)的全连接层(将定位看成回归问题)
-
这种方法有两个损失函数
- 分类问题的Softmax损失
- 定位任务中的回归问题损失(L2损失)
-
通常第一层卷积层预训练为像AlexNet那样的神经网络。
-
这种方法也能应用于人体姿态评估模型。
-
目标检测(Object Detection)
-
与分类和定位问题不同的地方在于检测一个或多个不同的目标并对其定位。
-
滑动窗口
- 效果很好但花费时间长
- 步骤:用CNN处理图片的不同区域,CNN将每个区域分类为目标或背景。
- 缺点:
- CNN需要去处理大量不同尺寸的区域,产生大量计算
- 滑动窗口会花费大量时间
-
候选区域(Region Proposals)
决定在哪个区域运行神经网络。
- 找到可能包含物体的图像区域
- 运行相对较快,例如:选择性搜索在CPU上几秒钟内给出1000个候选区域
-
R-CNN
缺点:
- 候选区域是图像的一部分,尺寸各不同,使用CNN前需要进行归一化。
- 运行缓慢。
-
Fast R-CNN
只采用一个CNN
-
Faster R-CNN
插入候选区域网络(RPN)从特征中生成自己的候选区域。
与SSD/YOLO相比,Faster R-CNN较慢,但准确率更高。
实例分割(Instance Segmentation)
不是预测边界框,而是对像素进行标记并区分它们
方法:Mask R-CNN
R-CNN,Fast R-CNN, Faster R-CNN、Mask R-CNN、YOLO、SSD总结参考:
可视化和理解
卷积网络的可视化
-
网络第一层:可视化的滤波器
- 第一层为卷积层,M个滤波器会对应有M个不同的滤波器图片。
- 每个滤波器学习原始形状和有方向的边缘特征
-
网络最后一层
-
最后一层通常为全连接层,收集这些特征向量
-
最近邻
-
在真实图片和特征向量间做最邻近得到的效果要比在真实图片上直接做KNN效果好。
-
说明CNN真正获得了这些图像的语义意义,而不是在像素水平上。
-
-
降维
-
将多维的特征向量压缩至二维
-
方法:PAC,t-SNE
t-SNE更多地用于深度学习来可视化数据
t-SNE的原理和实现参考
-
-
激活映射的可视化
-
若特征映射的尺寸为128 * 13 * 13,可视化会得到128幅13*13的灰度图。
-
输入图片中的某些特征会在特定的特征映射中被激活。
-
-
-
网络中间层
-
最大限度激活块(Maximally Activating Patches)
- 选择一个层和一个通道
- 在这个网络上运行多幅图片,然后记录所选通道的评估值
- 可视化对应于最大激活的图像块
可以发现每个通道在观察图像的特定部分,并使用感受野来提取图像特征。
-
堵塞实验(Occlusion Experiments)
-
在进行CNN前遮挡图片的一部分
-
通过在每个遮挡位置绘制概率热图(输出为真),会发现卷积网络从图像中学到的最重要的部分。
-
-
显著性映射(Saliency Maps)
查明哪个像素对于图像分类最重要
- 计算(非归一化)类分数关于图像像素的梯度,取绝对值和RGB通道上的最大值
- 有时可以用于语义分割
-
(引导的)反向传播
工作类似最大限度激活块,但不同的是获得了关心的像素
- 选择一个像最大限度激活块这样的通道,然后计算神经元值关于图像像素的梯度
- 如果只反向传播通过每个RELU(引导backprop)的正梯度,图像会更好
-
梯度上升(Gradient Ascent)
-
生成合成图像来最大限度激活神经元
-
I ∗ = a r g m a n I f ( I ) + R ( I ) I^{*}=argman_{I}f(I)+R(I) I∗=argmanIf(I)+R(I)
其中 f ( I ) f(I) f(I)为神经元的值, R ( I ) R(I) R(I)为自然图像的正则化,它等于生成图像的L2范数。
-
步骤:
- 初始化图像为0
- 前向计算图像的当前分数
- 后向传播得到关于图片像素的神经元值的梯度
- 对图片进行小更新
-
正则化效果越好,生成图片越清晰
后一层的结果似乎比其他层更有意义。
方法:惩罚图像的L2范数,并且周期性地进行正则化。
- 高斯模糊图像
- 将像素值小地裁剪为0
- 将像素梯度小的裁剪为0
-
-
生成模型
生成模型
-
生成模型为非监督类学习
-
监督学习和非监督学习的比较
监督学习 非监督学习 数据结构 数据: (x, y)。x是数据,y是标签 数据: x。只有数据,没有标签 数据价格 大多数情况下,训练数据是昂贵的 训练数据很便宜 目标 学习一个函数来映射x - >y 学习一些数据的潜在隐藏结构 举例 分类、回归、目标检测、语义分割、图像标题 聚类、降维、特征学习、密度估计 -
用途:
- 艺术品的真实感样品,超分辨率,着色等
- 时间序列数据的生成模型可用于模拟和规划(强化学习应用)
- 训练生成模型还可以对潜在表达进行推断,这些表达可以作为通用特征
-
工作:
给定训练数据,从相同的分布中生成新的样本。解决了非监督学习的核心问题——密度估计。
-
方法:
- 显式密度估计:显式定义并求解生成模型。
- 隐式密度估计:学习模型使其从能生成模型中取样而不是显示定义它
-
生成模型的分类法
PixelRNN和PixelCNN
-
在全可视化信任网络中使用链式法则来分解一幅图片在一维分布的可能性。
p ( x ) = s u m ( p ( x [ i ] ∣ x [ 1 ] x [ 2 ] ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ x [ i − 1 ] ) ) p(x)=sum(p(x[i]|x[1]x[2]······x[i-1])) p(x)=sum(p(x[i]∣x[1]x[2]⋅⋅⋅⋅⋅⋅x[i−1]))
其中 p ( x ) p(x) p(x)是图片 x x x的可能性, x [ i ] x[i] x[i]是在给定之前所有像素后第 i i i个像素值的概率。
-
工作:最大化训练数据的可能性,定义先前像素的顺序。
-
PixelRNN
- 使用RNN (LSTM)建模的以前像素
- 从角落开始生成图片像素
- 缺点:序列生成很慢。因为必须一个像素一个像素地生成
-
PixelCNN
- 也从角落开始生成图片像素
- 使用CNN上下文区域建模,依赖于以前的像素
- 训练比PixelRNN更快(可以并行化卷积,因为上下文区域值从训练图像中得知)
-
PixelRNN和PixelCNN可以产生很好的样本,仍然是活跃的研究领域。
自动编码器(Autoencoders)
-
从未标记训练数据中学习低维特征表示的无监督方法。
-
包含编码和译码。
编码:
- 将输入x转化为特征z,z尺寸比x小,以便只从输入中得到重要的信息。这一步叫降维。
- 组成:
- 早期:线性或非线性层
- 随后:深度全连接神经网络
- 目前用于图像:ReLU、CNN
译码:
- 映射已经产生的特征,以输出类似x或相同x的东西
- 组成与编码器相同
编码器是一个卷积层,而解码器是反卷积层,维度先减少后增加。
-
损失函数是L2损失
L [ i ] = ∣ y [ i ] − y ′ [ i ] ∣ 2 L[i]=|y[i]-y^{'}[i]|^{2} L[i]=∣y[i]−y′[i]∣2
变化自编码器
-
自动编码器上的概率旋转能让我们从模型中取样来生成数据。
-
通过编码器我们已经得到特征z,然后使先验概率p(z)为一个简单分布,如高斯分布。假定p(x|z)是复数(生成图像),用神经网络表示。
生成对抗网络(GANs)
-
GANs不与任何显式密度函数一起工作,采用博弈论的方法:通过2人博弈学习从训练分配中生成模型。
-
问题:问题:想要从复杂的、高维的训练分布中取样,没有直接的方法。
解决方法:从一个简单的分布中取样,例如随机噪声。学习转化为训练分布。
所以我们创建了一个从简单分布中提取的噪声图像并将其输入神经网络,我们称它为生成器网络,它应该学会将其转换成我们想要的分布。
-
训练GUNs:两人游戏:
- 生成网络:试图通过生成真实的图像来愚弄鉴别器。
- 鉴别器网络:尝试区分真实和虚假图像。
如果鉴别器训练地很好,就能训练生成器生成正确的图像。
-
作为极大极小博弈游戏的GANs的损失函数
-
卷积结构
- 生成器是带分步卷积的上采样网络。鉴别器是卷积网络。
深度强化学习
- 强化学习问题涉及到智能体与提供数值奖励信号的环境交互。
- 目的:学习如何采取行动来最大化回报
- 步骤:环境–>状态s[t]–>代理–>行为a[t]–>环境–>回报r[t]–>下一状态s[t+1]–>代理–>·········
- 举例:
- 机器人移动
- 雅达利游戏
- AlphaGo
马尔可夫决策过程
-
由(S,A,R,P, Y)决定
-
S:可能状态的集合
-
A:可能行为的集合
-
R: 给定(状态,行为)对回报的分布
-
P:转移概率
如:给定(状态,行为)对的下一个状态的分布
-
Y:折扣因素(我们更看重即将到来的回报还是以后的回报)
-
-
算法
-
开始时间t为0,环境样本初始化为状态s[0]
-
从t=0直到结束:
- 代理挑选动作a[t]
- 环境样本从(s[t],a[t])的R中给出回报
- 环境样本从(s[t],a[t])的P中到达下一个状态
- 代理得到回报r[t]和下一个状态s[t+1]
-
策略pi是一个从S到A的函数,它指定在每个状态下采取什么行动
-
在状态s遵循策略的预期累积回报:
V [ p i ] ( s ) = S u m ( Y t ∗ r [ t ] ) , t > 0 , 给 定 s [ 0 ] = s , p i V[pi](s)=Sum(Y^{t}*r[t]),t>0,给定s[0]=s,pi V[pi](s)=Sum(Yt∗r[t]),t>0,给定s[0]=s,pi
-
在状态s中采取行动a,然后遵循策略的预期累积回报:
Q [ p i ] ( s , a ) = S u m ( Y t ∗ r [ t ] ) , t > 0 , 给 定 s [ 0 ] = s , a [ 0 ] = a , p i Q[pi](s,a)=Sum(Y^{t}*r[t]),t>0,给定s[0]=s,a[0]=a,pi Q[pi](s,a)=Sum(Yt∗r[t]),t>0,给定s[0]=s,a[0]=a,pi
-
从给定(状态,动作)对中获得的最大预期累积回报:
Q ∗ [ s , a ] = M a x ( f o r a l l o f p i o n ( S u m ( Y t ∗ r [ t ] , t > 0 ) g i v e n s [ 0 ] = s , a [ 0 ] = a , p i ) ) Q^{*}[s,a]=Max(for\ all\ of\ pi\ on\ (Sum(Y^{t}*r[t],\ t>0)\ given\ s[0]=s,a[0]=a,pi)) Q∗[s,a]=Max(for all of pi on (Sum(Yt∗r[t], t>0) given s[0]=s,a[0]=a,pi))
目标:找到测策略 p i ∗ pi^{*} pi∗最大化累计已折扣的回报 ( S u m ( Y t ∗ r [ t ] , t > 0 ) (Sum(Y^{t}*r[t],\ t>0) (Sum(Yt∗r[t], t>0)
-
-
举例:
解决方法:
-