第一节 卷积神经网络基础
了解卷积层和池化层,并解释填充、步幅、输入通道和输出通道的含义
第二节 LeNet
最早的卷积神经网络之一
结构如下图所示
卷积层块里的基本单位是卷积层后接平均池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的平均池化层则用来降低卷积层对位置的敏感性。
第三节卷积神经网络进阶
LeNet: 在大的真实数据集上的表现并不尽如⼈意。
1.神经网络计算复杂。
2.还没有⼤量深⼊研究参数初始化和⾮凸优化算法等诸多领域。
AlexNet
首次证明了学习到的特征可以超越⼿⼯设计的特征,从而⼀举打破计算机视觉研究的前状。
特征:
8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。
将sigmoid激活函数改成了更加简单的ReLU激活函数(sigmoid可能会引起梯度消失)。
用Dropout来控制全连接层的模型复杂度(使得神经元的结果有p的可能为0,起到稀疏作用,让模型不过分依赖某个神经元,增强泛化能力)。
引入数据增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。
使用重复元素的网络(VGG)
VGG:通过重复使⽤简单的基础块来构建深度模型。
Block:数个相同的填充为1、窗口形状为3×3的卷积层,接上一个步幅为2、窗口形状为2×2的最大池化层。
卷积层保持输入的高和宽不变,而池化层则对其减半。
⽹络中的⽹络(NiN)
LeNet、AlexNet和VGG:先以由卷积层构成的模块充分抽取 空间特征,再以由全连接层构成的模块来输出分类结果。
NiN:串联多个由卷积层和“全连接”层构成的小⽹络来构建⼀个深层⽹络。
(使用1x1卷积层来替代全连接,因为真的全连接层还要先flatten)
⽤了输出通道数等于标签类别数的NiN块,然后使⽤全局平均池化层对每个通道中所有元素求平均并直接⽤于分类。
GoogLeNet
由Inception基础块组成。
Inception块相当于⼀个有4条线路的⼦⽹络。它通过不同窗口形状的卷积层和最⼤池化层来并⾏抽取信息,并使⽤1×1卷积层减少通道数从而降低模型复杂度。
可以⾃定义的超参数是每个层的输出通道数,我们以此来控制模型复杂度。
第四节 进阶循环神经网络
先补充一下:rnn梯度爆炸和梯度衰减
在较深的网络,如多层CNN或者非常长的RNN,由于求导的链式法则,有可能会出现梯度消失(Gradient Vanishing)或梯度爆炸(Gradient Exploding )的问题。
解决方法:设置梯度剪切阈值(gradient clipping threshold),一旦梯度超过该值,直接设置为该值。
rnn的改进算法:gru、lstm、双向循环神经网络
第五节 批量归一化和残差网络
BN:本质上来说就是对数据的标准化处理
bn应用于深层网络中,对于深层,输入标准化是不都用的。利用小批量上的均值和标准差,不断调整网络的中间输出,使网络中数值更佳稳定。
对全连接层做BN:
bn部分放在仿射变换之后,激活函数之前。
x=wh+b output=(x)
在仿射变换之后,对x进行bn操作,使得其变成在batchsize上所有样本上的均值为0,标准差为1(每一个神经元的均值为0,标准差为1)
其中的可学习参数的意义在于,如果模型中bn的效果是不好的,可通过学习,将参数设为xx,使得bn无效。
对卷积层做BN:
与全连接层区别:
全连接层中 m*d(其中m为batch,d为隐藏层层元素个数),bn每次对m个元素操作。
卷积层中 m*c*p*d(其中m为batch,c为通道数,pd为特征的高宽),bn每次对一个通道中mpd个操作。
预测时的BN
在预测时,没有训练时的batch来计算均值、标准差,因此需要对训练集进行预估get。(用移动平均法进行估算)
移动平均法是通过每次训练batch进行更新得到测试用的均值和方差。
残差网络(resnet)
深层网络达到一定深度后,训练误差反而不断升高,训练也很慢,即使是BN使数据更加稳定,易于训练,问题还是存在的。
残差块:
如果所示,拟合问题中,右边只需要去拟合f(x)-x,更容易的进行优化,捕捉细微波动。
稠密连接网络(DenseNet)
rennet的延伸
rennet要求A、B的输出格式(通道数)必须一样,才能相加。
densenet则是将通道数相加。
densenet的主要构建模块:稠密块和过渡层(控制通道数不要过大)
对于一个dense block:
输出结果=input+num*output
(其中input为输入通道数,output为其中conv-block的输出通道,num为一个denseblock中conv层数)
第六节 凸优化
优化在深度学习中的挑战,比如在优化训练误差时。
梯度的优化方式
挑战1:局部最小值
挑战2:鞍点
一阶导数和二阶导数都为0的点。鞍点的一阶导数和梯度为0,但它并不是最优点。
使用Hessian Matrix判断是否为鞍点(海森矩阵是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率)
挑战3:梯度消失
凸性
对一个集合内所有的点中任意两个点的连线都在集合内,才是一个凸集合。
两个凸集合的交集一定是凸集合。两个凸集合的并集不一定是凸集合。
凸函数的性质:无局部最小值
对于有约束的优化问题如何解决:拉格朗日乘子法、惩罚项、投影
第七节 梯度下降
一维梯度下降
沿梯度反方向移动自变量可以减小函数值
学习率:取合适的学习率
挑战:局部极小值(可能有学习率设置的问题)
多维梯度下降
自适应方法(学习率的选择)
现实应用比较少,用到二阶导数对学习率进行选择,计算比较复杂。
1.牛顿法(应用于求根、优化问题)使用牛顿法需要计算Hessian Matrix,计算量很大
2.Hessian Matrix辅助梯度下降
3.共轭梯度
随机梯度下降算法
随机梯度下降法不同于批量梯度下降,随机梯度下降是每次迭代使用一个样本来对参数进行更新。使得训练速度加快。
动态学习率
随着迭代次数,更新学习率。
小批量随机梯度下降算法
每次更新使用一个batch
第八节 优化算法进阶
了解更多dl的优化算法
之前提到的梯度下降算法的基本思想是,由于梯度方向是函数值变大的最快的方向,因此负梯度方向则是函数值变小的最快的方向。沿着负梯度方向一步一步迭代,便能快速地收敛到函数最小值。
为了使得梯度下降算法(存在一些问题,比如ill conditioned(导在不同变量方向的优化速度不一,二阶导大的方向,收敛快,且步长大,导致其他方向收敛缓慢))更加的迅速稳定,提出很多的改进算法。
a ill-conditioned problem
计算海森矩阵
H=最大值/最小值(海森矩阵中),H越大,问题越严重。
max learning rate
在不同的方向都存在一个最大学习率,最大学习率的结论:n<1/L保证最快收敛(沿曲线快快收敛),n<2/L(折跃收敛),L为这个方向的最大二阶导。只有<2/L才会收敛。
比如:f(x)=
x1方向:2/0.2=10
x2方向:2/4=0.5
当n=0.4,x2方向在最优解两侧跳跃逐渐收敛,x1则向着一个方向慢慢收敛过去。
这样就会存在问题,x2为了收敛必须小于0。5,但此时x1收敛很慢,为了解决ill conditioned,两种方法。
1.提出preconditioning进行处理。
梯度左乘海森的逆矩阵 得到新梯度,这样相当于等价优化一个新的问题,它的海森矩阵性质良好,分布均匀,可以有十分接近的最大学习率。这个方法应用在adam、rmdprop等等
2.将历史的梯度平均起来。正负相互抵消,可以有更大的学习率,更快的收敛。比如Momentum,应用于sgd、adam。。
Momentum算法(动量法)
基于上述的方法2
更新公式:
𝑣=𝛽𝑣+(1−𝛽)𝑑𝑤(加权平均)
𝑤=𝑤−𝛼𝑣
𝑑𝑤dw是我们计算出来的原始梯度,𝑣v则是用指数加权平均计算出来的梯度。这相当于对原始梯度做了一个平滑,然后再用来做梯度下降。实验表明,相比于标准梯度下降算法,Momentum算法具有更快的收敛速度。标准梯度下降法,可以看到收敛过程中产生了一些震荡。这些震荡在纵轴方向上是均匀的,几乎可以相互抵消,也就是说如果直接沿着横轴方向迭代,收敛速度可以加快。
即便用超过最大学习率的n,使用mom方法后,也可以不再发散。(原理如下)
加权移动平均(略)
AdaGrad
使用preconditioning的算法很多,先介绍AdaGrad。