这个秋天找实习,看了不少面经, 在这里把深度学习部分我的理解做一个小小的总结, 欢迎交流呀~
1. Batch Normalization
- Q: BN为什么能够使神经网络收敛得更快?
- A: 因为每个batch的数据的分布可能会有些差别, 而我们神经网络本质上学习的就是数据分布, 如果我们不进行归一化, 那么每个batch网络学到的分布其实都不太一样, 即每个batch梯度下降的方向可能都不太一致, 这样收敛起来就很慢. 归一化后, 数据的抖动就减小了, 每个batch梯度下降的方向更一致, 这样就能加速收敛.
- Q: 为什么每层隐藏层前面都要加BN?
- A: 和上面那个是一个道理, 比如把某一层之前的神经网络全部砍掉, 那么这一层就变成了输入层, 在这一层加BN就是很自然的一件事, 因为我们要保证每层的神经网络的输入都在一个同一个分布内.(直观解释: 比如我们有2个batch, 第1个batch经过3层神经网络和第2个batch经过3层神经网络后的分布很可能不太一样, 把他们在第3层的输出都归一化到同一分布更有利于我们第4层神经网络的学习)
- Q: BN为什么能够解决梯度消失和梯度爆炸?(TODO-放bp公式)
- A : 梯度消失: 深度神经网络中, 如果网络的激活函数输出很大, 而一般输出层是sigmoid激活函数,其对应的梯度就会很小(从sigmoid函数曲线就能看出来). 如果不加BN, 每一层输出就会不断偏移, 最后多层偏移累加, 就产生了更大的偏移.
- A : 梯度爆炸: 如果某一层神经网络输入很大, 根据链式求导规则, 这一层的梯度与数据的输入成正比的, 所以就会导致梯度很大.
- A : 总结: 根据链式求导法则, 某一层神经网络的权重的梯度与两个因素有关, 一个就是后一层的梯度大小, 一个就是当前层的数据输入x. 如果后一层梯度过小(通常来说sigmoid层输出太大会导致), 当前层的梯度就会很小, 如果当前层的输入x太大(没有归一化), 就会导致梯度爆炸.
- Q: BN在RNN上的作用?
- A: BN在RNN上效果不好, 在RNN上多用LN.
- Q: 在不同形状的输入下, BN是如何计算的?
- A: 根据输入的不同, BN计算的方式也不同, 这也就是我们写代码时常看到的 BatchNorm1d, BatchNorm2d 和 BatchNorm3d. 下面一一解释.
- BatchNorm1d: 输入的shape是(m, c), 其中m 为batch size, c 为feature数量. 做归一化时, 按列做归一化, 即分别计算每一列的均值和方差, 然后对这一列进行normalization.
- BatchNorm3d: 输入的shape是(m, p, q, c), 这也是CNN中归一化层输入的形式. m为batch size大小, p q为feature map的长和宽, 按照正常的BN的算法, 我们需要把数据展开成 (m, p * q * c)这种形式, 然后对每一列做归一化, 则一共需要p * q * c个可学习的beta, gamma参数. 但是在CNN上,为了简化计算, 通常会不一样. 我们会把数据展开成(m * p * q, c)这种形式, 然后对每个通道的数据做归一化, 则一共只需要c个可学习的beta, gamma参数.
- BatchNorm2d: 输入的shape是(m, p, c), 做归一化时, 同BatchNorm3d, 先将输入的shape转换为(m * p, c), 然后套用BatchNorm1d的公式就行了.
![ad8b1136f97a558ec969ef31fb3effb4.png](https://img-blog.csdnimg.cn/img_convert/ad8b1136f97a558ec969ef31fb3effb4.png)
2. Dropout
- Q : dropout层的作用?
- A : 防止过拟合(每次前向传播只让部分神经元参与, 并且在反向传播时只让这部分神经元更新)
- Q: dropout为什么能防止过拟合?
- A: 我的个人理解: 过拟合问题的本质是部分神经元的权重太大, 造成网络对输入数据十分敏感. 正常的神经网络训练很可能导致部分的神经元有相当大的表达能力. dropout的作用就是使模型中的每个神经元得到更加均匀和充分的训练, 使得模型整体的权重是一个非常小的值, 权重变小了, 模型对输入就不那么敏感了, 即使输入数据有微小变动, 输出数据也不会有太大变化.
![0baefebb4945489e6b3ca0010795b2af.png](https://img-blog.csdnimg.cn/img_convert/0baefebb4945489e6b3ca0010795b2af.png)
3. L1 和 L2正则化
- Q: L1和L2正则化区别
- A: L1正则化会得到稀疏解(即网络中部分权重为0),用作特征选择,L2正则化得到趋于0的解(即整个网络的权重都非常小),起到防止过拟合的作用. 至于为什么趋于0的解会防止过拟合, 在上面已经解释过我的观点了, 即网络对数据没那么敏感.
- Q: L1正则化为什么能得到稀疏解?(参考https://www.zhihu.com/question/26485586)
- A: 从导数层面来理解, 先看带上L1正则项的损失函数公式:
若我们进行梯度下降优化参数
![33b9a2a67c48ccf4653e848b01b188c9.png](https://img-blog.csdnimg.cn/img_convert/33b9a2a67c48ccf4653e848b01b188c9.png)
可以看出, 不管 L1 的大小是多少(只要不是0),梯度都是1或者-1,所以每次更新时,它都是稳步向0前进。
- Q: L2正则化为什么能得趋于0的解?
- A: 同上,从导数层面来理解, 先看带上L2正则项的损失函数公式:
L2正则项对
![cd53bbef7299f54a02a0070e23310020.png](https://img-blog.csdnimg.cn/img_convert/cd53bbef7299f54a02a0070e23310020.png)
可以看出, 当
4. 梯度消失与梯度爆炸
- Q: 哪些因素会导致梯度消失与梯度爆炸?
- A: 网络过深, 激活函数选取不当. 例如, sigmoid函数的梯度取值范围为[0, 0.25], tanh的梯度取值范围为[0, 1], 如果网络的每一层都选取sigmoid或tanh函数, 根据反向传播算法以及链式法则, 浅层神经元的梯度将会越来越小.
- Q: 梯度消失和梯度爆炸产生的原因是什么?
- A: 梯度消失与梯度爆炸本质上是同一个问题, 都是在过深的网络下, 网络对激活函数求导的梯度不为1的情况下造成的. 在反向传播过程中需要对激活函数进行求导,如果导数大于1,那么随着网络层数的增加, 由于链式法则, 累积的梯度将会越来越大, 这就是梯度爆炸。同样如果导数小于1,那么随着网络层数的增加, 累积的梯度会越来越小, 这就是梯度消失.
- Q: 解决梯度消失和梯度爆炸的方法?
- A: 解决梯度爆炸(gradient clipping, batch normalization), 解决梯度消失(减小神经网络层数, 合理选取激活函数, batch normalization), 选取relu函数(梯度恒为1)作为激活函数.
持续更新.......