献给莹莹
一.损失函数
1.BECloss
二分类用的交叉熵,用的时候需要在该层前面加上 Sigmoid 函数。
因为离散版的交叉熵定义是
其中 p,q 都是向量,且都是概率分布。如果是二分类的话,因为只有正例和反例,且两者的概率和为 1,那么只需要预测一个概率就好了,因此可以简化成
注意这里 x,y可以是向量或者矩阵,i只是下标;xi 表示第 i 个样本预测为 正例 的概率,yi 表示第 i个样本的标签,wi表示该项的权重大小。可以看出,loss, x, y, w 的维度都是一样的。
2.MSEloss
即均方误差
3.CrossEntropyLoss
x为一维向量,label为一个数值
用于多分类的交叉熵
二、避免过拟合的方法
1.Dropout
假设我们要训练上图这个网络,在训练开始时,我们随机地“删除”一半的隐层单元,视它们为不存在。
但是:
Dropout能够避免过拟合的原因:
1)减少神经元之间复杂的共适应关系,权值的更新不再依赖于有固定关系的隐含节点的共同作用。
2)取平均,也可以认为是一种集成学习的思想。
2.正则化
1)L2 正则化
L2正则化就是在代价函数后加上一个正则项
C0代表原始的代价函数,后面那一项就是L2正则化项,它是这样来的:所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。
先求导:
可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响
在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为 1−ηλ/n ,因为η、λ、n都是正的,所以 1−ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小
到目前为止,我们只是解释了L2正则化项有让w“变小”的效果,但是还没解释为什么w“变小”可以防止overfitting?一个所谓“显而易见”的解释就是:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀)
过拟合的时候,拟合函数的系数往往非常大,为什么?过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。
2)L1 正则化
在损失函数后添加L1正则项
求导:
上式中sgn(w)表示w的符号。那么权重w的更新规则为
比原始的更新规则多出了η * λ * sgn(w)/n这一项。当w为正时,更新后的w变小。当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。
L1正则化不可导问题的解决:https://blog.csdn.net/xiaocong1990/article/details/83039802
3)L1 正则化 和 L2 正则化的区别
- L1 正则化可以产生更稀疏的权值矩阵,可以用于特征选择,同时一定程度上防止过拟合;L2 正则化主要用于防止模型过拟合
- L1 正则化适用于特征之间有关联的情况;L2 正则化适用于特征之间没有关联的情况
为什么 L1 正则化可以产生稀疏权值,而 L2 不会?
对目标函数添加范数正则化,训练时相当于在范数的约束下求目标函数 J 的最小值
带有L1 范数(左)和L2 范数(右)约束的二维图示
图中 J 与 L1 首次相交的点即是最优解。L1 在和每个坐标轴相交的地方都会有“顶点”出现,多维的情况下,这些顶点会更多;在顶点的位置就会产生稀疏的解。而 J 与这些“顶点”相交的机会远大于其他点,因此 L1 正则化会产生稀疏的解。
L2 不会产生“顶点”,因此 J 与 L2 相交的点具有稀疏性的概率就会变得非常小。
三、反向传播
上标 (l) 表示网络的层,(L) 表示输出层(最后一层);下标 j 和 k 指示神经元的位置;w_jk 表示 l 层的第 j 个神经元与(l-1)层第 k 个神经元连线上的权重
- (w,b) 为网络参数:权值和偏置
- z 表示上一层激活值的线性组合
- a 即 "activation",表示每一层的激活值,上标(l)表示所在隐藏层,(L)表示输出层
- C 表示激活函数,其参数为神经网络输出层的激活值a^(L),与样本的标签y
四、激活函数
1.为什么要加入激活函数
使用激活函数的目的是为了向网络中加入非线性因素;加强网络的表示能力,解决线性模型无法解决的问题
2.常见激活函数
1)Relu函数
2)LeakyRelu函数
3)Softmax函数
4)Sigmoid函数
3.Relu函数与Sigmoid函数的区别
避免梯度消失
sigmoid函数在输入取绝对值非常大的正值或负值时会出现饱和现象——在图像上表现为变得很平,此时函数会对输入的微小变化不敏感——从而造成梯度消失;
ReLU 的导数始终是一个常数——负半区为 0,正半区为 1——所以不会发生梯度消失现象
减缓过拟合
ReLU 在负半区的输出为 0。一旦神经元的激活值进入负半区,那么该激活值就不会产生梯度/不会被训练,造成了网络的稀疏性——稀疏激活
这有助于减少参数的相互依赖,缓解过拟合问题的发生
为什么 ReLU 不是全程可微/可导也能用于基于梯度的学习?
虽然从数学的角度看 ReLU 在 0 点不可导,因为它的左导数和右导数不相等;
但是在实现时通常会返回左导数或右导数的其中一个,而不是报告一个导数不存在的错误。从而避免了这个问题
五、BN标准化(Batch Normalization)
1.引入BN的原因
- 训练的本质是学习数据分布。如果训练数据与测试数据的分布不同会降低模型的泛化能力。因此,应该在开始训练前对所有输入数据做归一化处理。
- 而在神经网络中,因为每个隐层的参数不同,会使下一层的输入发生变化,从而导致每一批数据的分布也发生改变;致使网络在每次迭代中都需要拟合不同的数据分布,增大了网络的训练难度与过拟合的风险。
2.基本原理
BN 方法会针对每一批数据,在网络的每一层输入之前增加归一化处理,使输入的均值为
0
,标准差为1
。目的是将数据限制在统一的分布下。-
具体来说,针对每层的第
k
个神经元,计算这一批数据在第k
个神经元的均值与标准差,然后将归一化后的值作为该神经元的激活值。
BN 可以看作在各层之间加入了一个新的计算层,对数据分布进行额外的约束,从而增强模型的泛化能力;
但同时 BN 也降低了模型的拟合能力,破坏了之前学到的特征分布;
-
为了恢复数据的原始分布,BN 引入了一个重构变换来还原最优的输入数据分布:
3.BN层为什么能够加快网络收敛速度
- BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布
- 这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
4.BN层为什么能够避免梯度消失
见上一问
5.为什么BN层一般用在线性层和卷积层后,而不是放在非线性单元后
- 因为非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移。
- 相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布。
- 其实想想也是的,像relu这样的激活函数,如果你输入的数据是一个高斯分布,经过他变换出来的数据能是一个什么形状?小于0的被抑制了,也就是分布小于0的部分直接变成0了,这样不是很高斯了。