Bug Defender#
好久没发技术类博客了。原因是最近在学习CS230,而CS230网上早已有人做了笔记。但由于CS230的Coursera部分刻意避免了数学,所以有些东西还是讲得不太清楚,故我也有在写一篇很长的补充。
但是一下子全部一起发布好像意义不大(没法水博客文章数了hhh),故从中抽取一些先发了。
Batch Norm#
为什么要用BatchNorm?#
BatchNorm主要是为了解决内部协变量偏移问题。其和RMSprop一样,都能让地形变得更为平坦。
什么是“内部协变量偏移”#
首先,我们要解释一下什么是“协变量偏移”
这里的“协变量”就只是指输入的X。
“协变量偏移” (Covariate Shift) 被严格定义为:
1. 和 的分布不同:
2. 但 和 之间的潜在关系保持不变:
就比如我们原本学习了怎么映射10 - 100的数据,神经网络对于这部分数据的映射极为精确。对于100 - 1000的数据,其实映射的方式是一样的。但是由于神经元没见过这部分数据,所以映射得一塌糊涂。
但是,我们知道,W只要改一点点,输出的Z都会有大变化。这就导致下一层的神经元不仅要学习,还需要学习X的分布。这不是我们想要的。(我们只想学习,不想花时间学习数据的分布)
而BatchNorm(下文简称BN)可以解决这个问题。
它会在训练开始时,先将每一个Z层的分布转化为以0为中心,方差为1的标准正态分布。
这样每一个神经元的激活函数,都拥有了一个以0为中心的“锚点”。
问题一:标准化会降低模型自由度#
聪明的你或许会发现这里有问题:
1、几乎所有激活函数在0附近都是线性的,BN不会导致整个神经网络的非线性学习能力下降吗?(即简化为线性神经网络?)
BN的创造者也想到了这个问题,所以他们在标准化强制归零: 之后,又给标准化后的输出加了一个可学习层: ,这就重塑了分布(不是数据的样子),现在锚点可变(),锚点系的绳子长度也可变(即方差)
问题二:和也会造成漂移?#
聪明的你或许会发现这里又有问题:
2、那既然和是可学习的,那他们也会“漂移”,那不又类似于“内部协变量漂移”了吗?
其实并不一样。因为和是像一样缓慢学习的参数,不会像Z一样偏移得那么厉害。
问题三:测试/应用时只有一个样本,没法标准化?#
还有个在训练时和在测试/应用时不一样的问题:
3、训练时我们可以计算每个mini-batch方差and均值,但是在测试/应用中我们只有一个输入样本,没法计算方差and均值啊?
其实,BN在训练过程中,还悄悄记录了整体训练样本的方差and均值。测试/应用时,我们默认输入来自于这个整体方差and均值的分布。
补充一:一定的正则化效果#
另外 BN 还有一定的正则化效果(防止过拟合),因为每一次 BN所用到的都是mini-batch的方差and均值,这就相当于给每层输入都添加了一点噪声,让神经元不要过度学习具体数值。
补充二: 和 的“初始化”#
- 标准初始化: (缩放) 初始化为 1, (平移) 初始化为 0。
这意味着在训练刚开始时,BN 层“什么都不做”(除了标准化)。它就是一个纯粹的 标准化器。然后它再慢慢通过训练,去学习 和 到底应该是多少。
补充三:记录全局均值和方差用的其实是指数移动平均(而不是简单平均)。#
WHY?
- “冷启动”问题: 这种平均方法给了所有批次相同的权重。
- 这有什么不好? 在训练刚开始时(比如前 1000 步),网络的权重 还是随机的、一塌糊涂的。
- 此时产出的 ,以及计算出的 和 ,完全没有代表性,可以说是“垃圾数据”。
- 如果用“简单平均”,这些“垃圾数据”会**永久地“污染”**你的全局平均值。即使训练到后期,这些早期的数据也始终占有 的权重,拖慢你的平均值“跟上”新状态的速度。
RMSpropVS Batch Norm#
要注意RMSprop和BN较为容易混淆,因为都用到了“标准化”这一工具。
但是BN是用于正向传播过程的(也间接作用在了反向传播过程的计算梯度中),而RMSprop是反向传播中对梯度的修正。
-
BN (地形平整器) 先把损失函数这个“地图”变得非常平滑。
-
RMSprop (智能登山车) 在这个“平滑”的地图上行驶。
-
因为地图已经很平滑了,RMSprop 就可以大胆地使用更大的学习率(油门)。
-
同时,RMSprop 依然在工作:当它遇到一个(BN 没能完全烫平的)小斜坡时( 很大),它会自动“松油门”(除以 );当它在一个平原上时( 很小),它会“踩油门”。
-