Alexnet 笔记

来源:互联网 发布:淘宝怎么设置金币抵钱 编辑:程序博客网 时间:2024/04/29 19:27

整体网络结构:5层conv + 3层全连接,池化层使用的是最大池化;

relu优势:收敛快,学习速度快

pooling层有重叠:步长小于卷积核大小,为了克服过拟合,因为这样池化层的输出之间有重叠,提升特征的丰富性;

数据扩增:

dropout:削弱联合适应性,即防止整个网络会对部分节点过度依赖,这样有助于防止过拟合;

关于top-1 top-5的概念:

top-1:选择预测结果中置信度最高的label作为预测结果

top-5:选择预测结果中置信度排在前五位的label作为预测结果的范围


正文笔记:

关于激活函数:首先为什么要引进激活函数?因为多层神经网络的本质相当于一个复合函数,而如果没有激活函数,每一层的输出都是下一层输入的线性函数,这样整个神经网路就没有办法逼近任意函数,相当于最原始的感知机。

这里稍稍结合一下我之前跑mnist的经验。在mnist里给的最初的网络结构中,只有第一个全连接层后面加了激活函数。后来我在第一个卷积层后面也加了一个RELU层,发现准确率得到了很明显的提升,从最初的99.18%提升到了99.3%。我自己的理解是,加入了激活函数之后,增加了网络的非线性化,也就是可以使得整个网络更好地拟合实际的模型。

why RELU?:因为relu为不饱和非线性函数,相比于传统的sigmoid等函数要能够使神经网络的学习速度更快。并且RELU会使一部分神经元的输出为0,这样有什么好处呢?这样会减少神经元之间相互的依赖关系,使网络更加稀疏,可以缓解过拟合的问题。

下面具体来阐释一下为什么饱和非线性函数会使网络在某些情况下学习速度很慢: 下图是两个很典型的饱和非线性函数,左边是sigmoid,右边是tanh,所谓饱和的意思就是,如下图所示,当这两个函数的函数值接近他们值域的边界时,譬如sigmoid函数,当函数值接近0或1时,函数的梯度几乎变成0.这样有什么坏处呢?会影响到反向传播。BP算法用于计算损失函数L的偏导,在我们用BP计算时,sigmoid的这个局部的很小梯度将会与整个损失关于该门单元输出的梯度相乘。那么当局部梯度很小时,相乘结果也会接近0,这样就几乎不会有信号反响传回更新权重了,那么这就等同于神经网络停止学习了!


局部响应归一化:这部分暂时没有仔细看,感觉是纯数学公式的推导。

pooling层:与传统池化层近邻关系不重叠不一样的是,本网络使用的池化层有重叠,步长(2)小于卷积核(3)大小,为了克服过拟合,因为这样池化层的输出之间有重叠,提升特征的丰富性。


关于减少过拟合的问题:

本文主要提出了两种解决方案:1.做数据增强。

形式一:使用生成图像和水平反射;

此处参考李飞飞老师的cs231课程:

水平翻转:


随机裁剪,平移变换:


颜色,光照变换:


形式二:改变训练图像中RGB通道的强度;

2.加dropout层:它做的就是以0.5的概率将每个隐层神经元的输出设置为零。以这种方式“dropped out”的神经元既不利于前向传播,也不参与反向传播。所以每次提出一个输入,该神经网络就尝试一个不同的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元而存在,所以这种技术降低了神经元复杂的互适应关系。正因如此,要被迫学习更为鲁棒的特征,削弱联合适应性,增强泛化能力。