为什么正则化可以起到对模型容量进行控制_算法岗面经总结(1) --- 批归一化, 随机失活, 正则化...

这个秋天找实习,看了不少面经, 在这里把深度学习部分我的理解做一个小小的总结, 欢迎交流呀~


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
图源网络

2. Dropout

  • Q : dropout层的作用?
  • A : 防止过拟合(每次前向传播只让部分神经元参与, 并且在反向传播时只让这部分神经元更新)
  • Q: dropout为什么能防止过拟合?
  • A: 我的个人理解: 过拟合问题的本质是部分神经元的权重太大, 造成网络对输入数据十分敏感. 正常的神经网络训练很可能导致部分的神经元有相当大的表达能力. dropout的作用就是使模型中的每个神经元得到更加均匀和充分的训练, 使得模型整体的权重是一个非常小的值, 权重变小了, 模型对输入就不那么敏感了, 即使输入数据有微小变动, 输出数据也不会有太大变化.

0baefebb4945489e6b3ca0010795b2af.png
过拟合就表明网络收敛到了sharp minima, 在这儿, 输入左右稍微变动下, 对损失函数的影响都是非常大的, 我们更希望收敛到flat minima, 即使输入微小波动, 损失函数也不会变化太大

3. L1 和 L2正则化

  • Q: L1和L2正则化区别
  • A: L1正则化会得到稀疏解(即网络中部分权重为0),用作特征选择,L2正则化得到趋于0的解(即整个网络的权重都非常小),起到防止过拟合的作用. 至于为什么趋于0的解会防止过拟合, 在上面已经解释过我的观点了, 即网络对数据没那么敏感.
  • Q: L1正则化为什么能得到稀疏解?(参考https://www.zhihu.com/question/26485586)
  • A: 从导数层面来理解, 先看带上L1正则项的损失函数公式:

若我们进行梯度下降优化参数

, 则需要求
的一阶导数, 其中, L1正则项对
的导数为

, 它画在坐标轴上长这样:

33b9a2a67c48ccf4653e848b01b188c9.png

可以看出, 不管 L1 的大小是多少(只要不是0),梯度都是1或者-1,所以每次更新时,它都是稳步向0前进。

  • Q: L2正则化为什么能得趋于0的解?
  • A: 同上,从导数层面来理解, 先看带上L2正则项的损失函数公式:

L2正则项对

的导数为
, 它画在坐标轴上长这样:

cd53bbef7299f54a02a0070e23310020.png

可以看出, 当

越来越小时, L2的梯度也逐渐变小, 导致
逐渐趋于0, 而不会等于0.

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)作为激活函数.

持续更新.......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值