讲解的非常好的文章推荐:https://zhuanlan.zhihu.com/p/102708578
一.为什么权重初始化值得学习?
正向传播中:权重w比1小,随着层数增加,权重连乘会导致结果出现指数级减少;
权重比1大,随着层数的增加,权重连乘会导致结果出现指数爆炸式增长。
反向传播中:
这些因子连续相乘,带来的影响是指数级的。
我们希望的是损失函数收敛时,梯度为0(接近0),这时损失函数不再下降。
我们不希望在抵达极小值前,梯度就为0了;(梯度消失)
我们也不希望下降过程过于震荡,甚至不收敛。(梯度爆炸)
从上面的公式可得至少有三个因素可能导致梯度消失or梯度爆炸
1、网络过深
2、不合理的激活函数
3、不良的初始化权重
二.权重应该如何初始化?
一..不合适的初始化方法
1.设置为一个常量或者全为0
设置为一个常量:更新后的权重仍然是相同的常量。初始值相同,变化值相同,更新后的值依然相同,这显然是不能接受的。
不管进行多少轮正向传播以及反向传播,每俩层之间的参数都是一样的。换句话说,本来我们希望不同的结点学习到不同的参数,但是由于参数相同以及输出值都一样,不同的结点根本无法学到不同的特征!!!这样就失去了网络学习特征的意义。
全为0:
此时,学习算法的公式将不能对权重参数做出任何调整,模型将会陷于困局。
2.权重随机初始化
随机分布选择不当就会导致网络优化陷入困境。
为什么不讨论偏置项b的初始化?每层偏置的梯度仅取决于该层的线性激活值,而不取决于较深层的梯度值。因此,对于偏置项不会存在梯度消失和梯度爆炸问题。因此可以安全地将偏置b初始化为0。
一..可行的初始化方法
1.pre-training预训练
借鉴类似问题的训练过的模型。
2.Xavier 初始化
早期的参数初始化普遍是将数据和参数normalize为高斯分布(均值0,方差1),但随着神经网络深度的增加,这个方法并不能解决梯度消失的问题。
讲解视频:
Xavier Glorot and Kaiming He Initialization
Xavier初始化的作者,Xavier Glorot,发现:激活值的方差是逐层递减的,这导致反向传播中的梯度也逐层递减。要解决梯度消失, 就要避免激活值方差的衰减,即每一层输出的方差应该尽量相等。
Xavier初始化的基本思想是,若对于一层网络的 输出和输出可以保持正态分布且方差相近,这样就可以避免输出趋向于0,从而避免梯度消失情况。
缺点:Xavier初始化有一定限制,其推导过程假设激活函数在零点附近接近线性函数,且激活值关于0对称。Relu函数很明显是不对称的。
3、He 初始化
He 初始化 或者叫 Kaiming 初始化,由大牛Kaiming He提出来给激活函数 PReLU 用的。
He 初始化的基本思想是,由于PReLU函数让一半的Z值(负值)趋近于零,实际上移除了大约一半的方差。所以我们需要 加倍权重的方差 以补偿这一点。补偿的方法,只需要对Xavier 初始化进行一项微小的调整——“将权重的方差乘以2”
结论:
其中,d 可以是输出层神经元个数,也可以是输入层神经元个数,二选一。
4、Batch Normalization+随机初始化
随着网络深度加深,输入值的分布逐渐发生偏移,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,导致反向传播时低层神经网络的梯度消失。
上面几种方法,都在说怎么避免或者减小这个偏移的发生。而BN(Batch Normalization)的想法简单粗暴,发生了没关系,我再加一层 layer,不厌其烦得把每次输出的分布都纠正回来。这样我们再权重初始化的时候,就可以放心大胆得随机了。
BN的本质是在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理(均值0、方差为1),然后再进入网络的下一层。(如下图所示)
道理是比较简单,实际上BN层的运算包括了两个步骤,先“归一化(Normalize)”,后“ 变换重构(Scale and shift)”
先归一
后变换重构
为什么需要变换重构呢?因为强行归一化可能会损坏原始某一层学习到的特征分布,有公式可以证明通过学习到的重构参数γ、β,是可以恢复出原始的某一层所学到的特征的。
BN优点
(1) 减轻了对参数初始化的依赖
(2) 训练更快,可以使用更高的学习率。
(3) BN一定程度上增加了泛化能力,dropout等技术可以去掉。
dropout技术
dropout技术:是缓解卷积神经网络CNN过拟合而被提出的一种正则化方法 ,缺点就是可能会减缓模型收敛的速度,因为每次迭代只有一部分参数更新,可能导致梯度下降变慢。
Dropout叫做随机失活,简单来说就是在模型训练阶段的前向传播过程中,让某些神经元的激活值以一定的概率停止工作。
所有神经元以一定概率p失活,输入输出的神经元保持不变
让输入通过部分神经元失活的新网络进行前向传播,然后计算损失并把损失反向传播,一小批样本执行完这个过程后,根据梯度下降算法更新参数(w,b);
Dropout一般只在网络的训练阶段使用,而测试阶段不使用Dropout,也就是说训练时前向传播只使用没有失活的那部分神经元,而测试时使用的是全部的神经元,那么训练和测试阶段就会出现数据尺度不同的问题。所以测试时,所有权重参数都要乘以1−p以保证训练和测试时尺度变化一致。
超参数:
机器学习模型中一般有两类参数:一类需要从数据中学习和估计得到,称为模型参数(Parameter)---即模型本身的参数。比如,线性回归直线的加权系数(斜率)及其偏差项(截距)都是模型参数。还有一类则是机器学习算法中的调优参数(tuning parameters),需要人为设定,称为超参数(Hyperparameter)。比如,正则化系数λ,决策树模型中树的深度。
参数和超参数的区别:
模型参数是模型内部的配置变量,需要用数据估计模型参数的值;模型超参数是模型外部的配置,需要手动设置超参数的值。机器学习中一直说的“调参”,实际上不是调“参数”,而是调“超参数”。
哪些属于超参数?
梯度下降法中的学习速率α,迭代次数epoch,批量大小batch-size,k近邻法中的k(最相近的点的个数),决策树模型中树的深度,等等。
超参数的优化:
有四种主要的策略可用于搜索最佳配置:
- 照看(babysitting,又叫试错)
- 网格搜索
- 随机搜索
- 贝叶斯优化