Changing Landscape

我们觉得说 error surface 如果很崎岖的时候,它比较难 train,那我们能不能够直接把山铲平,让它变得比较好 train 呢?
Batch Normalization 就是其中一个把山铲平的想法。

如果x1的值都很小,w1有一个变化的时候,它对y的影响也是小的,对e的影响也是小的,它对L的影响就会是小的。
反之如果x2的值都很大,w2有一个变化的时候,它对y的影响也是大的,对e的影响也是大的,它对L的影响就会是大的。
这时候w1,w2两个参数,它们对 Loss 的斜率差别非常大,在 w1这个方向上面,斜率变化很小,在w2这个方向上面,斜率变化很大。
image.png
所以你发现说,当我们 input 的 feature,每一个 dimension 的值,它的 scale 差距很大的时候,我们就可能產生像这样子的 error surface,就可能產生不同方向,斜率非常不同,坡度非常不同的 error surface。


Feature Normalization

我们可以给feature 裡面不同的 dimension,让它有同样的数值的范围,那我们可能就可以製造比较好的 error surface,让 training 变得比较容易一点。
其实有很多不同的方法,这些不同的方法,往往就合起来统称為Feature Normalization。
image.png

以下的方法只是Feature Normalization 的一种可能性,它并不是 Feature Normalization 的全部

这种 normalization 叫做标準化,其实叫 standardization。
image.png

那做完 normalize 以后有什麼好处呢?

  • 做完 normalize 以后啊,这个 dimension 上面的数值就会平均是 0,然后它的 variance就会是 1,所以这一排数值的分布就都会在 0 上下。
  • 对每一个 dimension都做一样的 normalization,就会发现所有 feature 不同 dimension 的数值都在 0 上下,那你可能就可以製造一个,比较好的 error surface。
  • 它可以让你在做 gradient descent 的时候,它的 Loss 收敛更快一点。

    Considering Deep Learning

    那如果你选择的是 Sigmoid,那可能比较推荐对 z 做 Feature Normalization。因為Sigmoid 是一个 s 的形状,那它在 0 附近斜率比较大,所以如果你对 z 做 Feature Normalization,把所有的值都挪到 0 附近,那你到时候算 gradient 的时候,算出来的值会比较大。
    不过你不见得是用 sigmoid ,所以你也不一定要把 Feature Normalization放在 z 这个地方。通常而言,这个normalization,要放在 activation function 之前或之后都是可以的,在实际上可能没有太大的差别
    image.pngimage.png
    也就是说,你现在有一个比较大的 network。
    你之前的 network,都只吃一个 input,得到一个 output。现在你有一个比较大的 network,这个大的 network,它是吃一堆 input,用这堆 input 在这个 network 裡面,要算出 μ跟σ,然后接下来產生一堆 output。
    在实作的时候,你不会让这一个 network 考虑整个 training data 裡面的所有 example,你只会考虑一个 batch 裡面的 example。举例来说,你 batch 设 64,那你这个巨大的 network,就是把 64 笔 data 读进去,算这 64 笔 data 的μ跟σ,对这 64 笔 data 都去做 normalization。
    因為我们在实作的时候,我们只对一个 batch 裡面的 data,做 normalization,所以这招叫做 Batch Normalization
    显然你一定要有一个足够大的 batch,你才算得出μ跟σ。假设你今天batch size 设 1,那你就没有什麼μ跟σ可以算。所以这个 Batch Normalization,是适用於 batch size 比较大的时候。因為 batch size 如果比较大,也许这个 batch size 裡面的 data,就足以表示整个 corpus 的分布
    image.pngimage.png

Testing

在 testing 的时候,根本就没有 batch,那我们要怎麼算这个μ跟σ呢?
image.png
其实你并不需要做什麼特别的处理,PyTorch 帮你处理好了。在 training 的时候,如果你有在做 Batch Normalization 的话,你每一个 batch 计算出来的μ跟σ,他都会拿出来算 moving average。
image.png