一、Sigmoid激活函数和梯度消失问题
1、Sigmoid函数
梯度消失:sigmoid函数只有在0附近梯度值正常,在两侧都接近于0,出现梯度消失
ReLU函数在大于0的部分梯度为常数,所以不会产生梯度消失,具有较好的激活性
注:梯度可以理解为斜率
图片参考: (1条消息) Sigmoid和Relu激活函数的对比_bl128ve900的博客-CSDN博客_sigmoid和relu
二、批归一化(Batch Normalization)
做法:使中间层输出结果标准化,网络层的输出具有稳定的分布;
优点:
-
可以是学习快速进行;
-
可以降低模型对初始值的敏感性;
-
可以从一定程度上抑制过拟合;
标准化(样本均值+方差)后 对数据做缩放和平移
-
样本均值:对所有样本的同一个通道(即同一特征)的像素点计算均值
-
方差:对所有样本的同一个通道(即同一特征)的像素点计算方差
eg:数据格式 [N,C,H,W]
沿着C维度展开,分别对每个通道计算N个样本总共N×H×W个像素点计算均值和方差
解决训练集和测试集中同一样本保存在不同mini-Batch中,导致最后预测结果不同的问题
训练时使用全局均值与方差,预测时不计算均值与方差,使用训练时的数据
BatchNorm——论文阅读理解部分
1、解决的问题:
解决训练时每层神经网络参数变化复杂性导致的:模型初始化参数选择和较低的学习率
需要不断适应层输入分布的变化:当学习的输入分布发生变化时,会经历协变量转移,通过域适应解决
协变量:神经网络的参数
协变量转移:协变量是不可控的且在训练过程中是必须变化的,且对输出值会产生影响,所以当参数发生变化时,就发生了协变量转移
域适应:迁移学习中, 当源域和目标的数据分布不同 ,但两个任务相同时,这种特殊的迁移学习叫做域适应
在迁移学习中,当协变量的值发生了变化,输出的样本分布也就发生了变化,从而产生了源域与目标域分布差异,而若是我们能够纠正这个协变量的迁移,就能够将源域与目标域结合起来了训练模型。
较低的学习率和初始化参数选取使非线性模型饱和困难
效果:
可以适当提高学习率
模型初始化参数不需要那么小心
规范化在特定情况可以不需要Dropout
MiniBatch
MiniBatch上的损失梯度是对训练集上的梯度的估计,质量随着批大小的增加而提高
三、Dropout
问题:训练深度神经网络时:
-
容易过拟合
-
费时
Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。
训练时:
使用五个结构完全一样的模型,每个模型都有一定程度的过拟合
每次随机删除一部分神经元,不向前传播所携带的信息,相当于每次都是不同模型在学习
测试时:
以五个网络的平均值作为预测结果,效果好于单个模型
问题:
训练时随机丢弃神经元导致输出数据变小,但预测时不丢弃神经元,使预测和训练时的数据分布不一样。
解决:
-
downgrade_in_infer,预测时不丢弃神经元,把他们的数值变小;
-
upscale_in_train,训练时随机丢弃一部分神经元,但是把保留的那些神经元数值放大(根据丢弃比率放大);预测时原样输出所有神经元的信息;