机器学习面试题汇总与解析——初始化方法
本章讲解知识点
-
- 什么是初始化方法
-
- 为什么需要合理的参数初始化
-
- 详细讲解初始化方法
- 本专栏适合于Python已经入门的学生或人士,有一定的编程基础。
- 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。
- 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
- 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
- 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。
-
关于机器学习算法书籍,我强烈推荐一本《百面机器学习算法工程师带你面试》,这个就很类似面经,还有讲解,写得比较好。
-
关于深度学习算法书籍,我强烈推荐一本《解析神经网络——深度学习实践手册》,简称 CNN book,通俗易懂。
1. 什么是初始化方法
1.1 什么是网络参数初始化
深度学习中的初始化方法是指在训练神经网络时,对模型的参数进行初始赋值的方法。合适的初始化方法可以加速模型的收敛速度,提高模型的性能。
神经网络在训练时,前向传播和反向传播都涉及到每个神经元的权重更新 ,也就是我们说的网络参数了,当然这些参数需要一个初始值。方法有很多,全 0 初始、随机初始等等,每个方法都有优缺点。
1.2 常用的深度学习初始化方法
-
随机初始化:最常用的初始化方法之一是随机初始化。它通过从某个分布(如均匀分布或高斯分布)中随机选择初始值来初始化参数。随机初始化可以破坏对称性,使得不同的神经元学习到不同的特征。
-
零初始化:另一种常见的初始化方法是将所有参数初始化为零。然而,零初始化的问题是每个参数的更新将是相同的,导致网络对称性和梯度消失问题。
-
Xavier 初始化:Xavier 初始化是一种常用的初始化方法,特别适用于具有线性激活函数的网络。它根据输入和输出维度来调整参数的初始化范围,以确保梯度的传播保持合适的范围,避免梯度消失或梯度爆炸问题。
-
He 初始化:He 初始化是一种针对具有 ReLU 激活函数的网络的初始化方法。它与 Xavier 初始化类似,但根据激活函数的性质进行了调整,以确保合适的梯度传播范围。
2. 为什么需要合理的参数初始化
理想的网络参数初始化使得模型训练事半功倍,相反,糟糕的初始化可能导致网络梯度消失和梯度爆炸。举个例子,如网络使用 sigmoid 函数作为非线性激活函数,若参数初始化的值过大,前向运算时经过 sigmoid 函数后的输出结果几乎全为 0 或1,而反向传播时梯度全部为 0,这就导致梯度消失了。再如 ReLU,如果初始化不合理,前向运算的结果可能全部为负,发生“死区”现象。
再简单说,就是参数又不能过大,又不能过小。比如在前向传播过程中输出为 ,因为 很小,所以输出很小,同时反向传播过程中梯度的变化也很小,那么参数的改变也很小,在不断的正向传播乘很小的数,反向传播又几乎不变的情况下,最后 会越来越小,趋近于 0,出现梯度消失。反之同理。
从激活函数方面来看,若激活函数的导数绝对值都小于1,那么导致梯度消失;若激活函数的导数绝对值都大于1,那么导致梯度爆炸。这也是为啥Relu激活函数表现好的原因,人家梯度刚好是1。
最理想化的参数初始化
通过我们上面的叙述,当然最理想化的参数初始化就是,经过多层网络后,信号不被过分放大或过分减弱。那么如何保证?数学化的方法就是使每层网络的输入和输出的方差一致。然后我们还要尽量保证每层网络参数分布均值为 0、方差不变,为什么呢?因为这如同归一化,归一化的好处是有助于提高网络的稳定性和收敛速度,防止梯度爆炸或梯度消失;另一个原因也是为了计算方便。
3. 详细讲解初始化方法
3.1. 全0初始化
就是将所有权重置 0。当然是不能这样的,神经网络通过梯度更新参数,参数都是 0,梯度也就是 0,神经网络就停止学习了。
3.2. 随机初始化
将参数随机化,不过随机参数服从高斯分布或均匀分布,假设网络输入神经元个数为 ,输出神经元个数为 ,则服从高斯分布的参数随机初始化为:
其中高斯分布均值为 0,方差为 1。0.001 为控制因子,这样使得参数期望尽量接近 0。
3.3. Xavier 初始化
权重参数随机初始化会带来一个问题,即网络输出数据分布的方差会随着输入神经元个数改变,为解决这一问题,会在初始化的同时加上对方差大小的规划化。
随机初始化没有控制方差,所以对于深层网络而言,随机初始化方法依然可能失效。我们上面已经说了,理想的参数初始化还得控制方差,对 进行一个规范化:
其中, 为 或 ,这便是“Xavier初始化”,维持了输入输出数据分布方差一致性。注意这里是正态分布。如果是均匀分布,则参数的随机取值范围为 [,