1.权值初始化
网络模型搭建完成之后,对网络中的权重进行合适的初始化(可以说是赋初值,这样网络才能运行,梯度才能更新)是非常重要的一个步骤, 初始化好了,比如正好初始化到模型的最优解附近,那么模型训练起来速度也会非常的快, 但如果初始化不好,离最优解很远,那么模型就需要更多次迭代,有时候还会引发梯度消失和爆炸现象, 所以正确的权值初始化还是非常重要的。
2.为什么需要合理的初始化权重?
采用恰当的权值初始化方法,就可以实现多层神经网络的输出值的尺度维持在一定范围内, 这样在反向传播的时候,就有利于缓解梯度消失或者爆炸现象的发生。(其实权值、输出、梯度更新、权重的方差存在一定的关系–大家需要仔细理解正向、反向传播的过程)
详情可参考这位老哥的博客-系统学习Pytorch笔记六:模型的权值初始化与损失函数介绍
3.如何进行合理的初始化
一般来说需要针对具体的网络使用初始化方案,例如:卷积神经网络权重不能全部初始化为0,偏置可以,因为如果如果为0,又每个神经元激活函数一样,完全对称,也就意味着计算同样的函数,并且肯定的是最终经过每次训练的迭代,这两个隐含单元仍然是同一个函数,最终也就起不到训练的效果。
所以可以采用随机初始化的方法,将权值初始化为一个较小的随机数,如0.01。为什么要这样呢?因为如果初始值较大,正向传播一些层的输出也会较大,反向传播时梯度更新容易产生较大或较小的梯度;从而发生梯度消失、爆炸等引起网络不稳定的现象。
4.常用的权重初始化方法
Pytorch里面提供了很多权重初始化的方法,可以分为下面的四大类:
针对饱和激活函数(sigmoid, tanh):Xavier均匀分布, Xavier正态分布
针对非饱和激活函数(relu及变种):Kaiming均匀分布, Kaiming正态分布
三个常用的分布初始化方法:均匀分布,正态分布,常数分布
三个特殊的矩阵初始化方法:正交矩阵初始化,单位矩阵初始化,稀疏矩阵初始化
4.1 Xavier初始化和Kaiming初始化
其实出现这样的网络初始化方法可能是必然的,我们对于深度学习的大部分研究都是在试图缓解梯度消失、爆炸这样一些网络不稳定的现象,假设网络的各层数据独立同分布)(其实这样的假设是有道理的),为了缓解梯度消失、爆炸,我们必须将网络各层的输出限制在一定的范围内,而网络各层的输出又由权值决定,即要限制网络权值的均值和方差(这两其实就是限制数据的偏离程度)-- 数据独立同分布,均值为0,而由网络其实可以推出权值的方差是由网络各层的输入、输出维度决定的,从而产生了一系列的初始化方法。
注意:这些初始化方法通常采用均匀分布、正态分布,其实也可以采用其他的分布,只是因为这两分布有均值、方差的计算公式,方便一点。
这个链接再结合我参考资料中b站沐神的视频,相信会加深你对于初始化的理解。
优快云 系统学习Pytorch笔记六:模型的权值初始化与损失函数介绍
参考资料
优快云 系统学习Pytorch笔记六:模型的权值初始化与损失函数介绍
优快云 3.11 随机初始化-深度学习-Stanford吴恩达教授
bilibili 数值稳定性+模型初始化