feature scaling
- w1和w2发生同等的变化,因为x2很大,x1很小,所以w2对结果影响较大,loss在w2方向上斜率较大,w1对结果影响较小,loss在w1方向上斜率较小
- 如果进行feature scaling,使得x1和x2有相同的变化范围loss就是正圆形的
好处:
- feature scaling 之前,learning rate在不同方向上不同,要在w1方向上有较大的learning rate, 在w2方向上有较小的learning rate;
- 而feature scaling之后可以在不同方向使用相同的learning rate
典型的feature scaling怎么做?
- 将R个数据的每一维度进行normalization
深度学习里Hidden layer怎么做 feature scaling
解决了Internal Covariate Shift(内部协变量偏移)
对高层的输入做Feature Scaling的问题是,每次做的时候都需要先求出输入的statistics,但是由于上一层的参数变化,每轮训练的statistics都会改变,没有办法用很简单的方法很快求出他们的statistics。解决的方法是使用Batch Normalization
Batch Normalization
假设一个batch有3个数据
- 一般在激活函数之前进行归一化,batch 尽量不要太小
此时怎么做back propogation?
做了Normalization之后,反向传播也会通过μ和σ这两条路径对W1 进行更新,这是因为W1的变化会影响到 z 1 , z 2 , z 3 z^1,z^2,z^3 z1,z2,z3进而影响到μ和σ
有时候可以根据activation function再进行一些变换
有时候不希望均值为0,方差为1,所以引入两个参数
β
,
γ
\beta,\gamma
β,γ,在网络中自己学习
test怎么做?
- test阶段没有batch,
μ
,
σ
\mu,\sigma
μ,σ怎么找?
- 一种理想方法是:在训练过程中我们计算每个batch的μ和σ是为了代替整个training data的平均值和标准差,所以我们在测试的时候也可以采用整个training data的平均值和标准差。但是可能training data很大,去计算平均值和方差并不方便;也有可能training data是分batch进入的,没有保存整体数据,没办法计算平均值和方差
- 实际操作:将训练过程中所有batch的μ和σ都保存下来,然后按权重求和得到用于testing的μ和σ ,由于随着update,accuracy会不断增大,所以一般我们会给后面的μ和σ更大的权重
batch normalization的好处
- 解决了Internal Covariate Shift的问题,使得网络训练可以设置更大的learning rate,从而可以减少网络训练时间
- 在一定程度上可以防止gradient vanish
- 减小参数的初始化对网络学习的影响,例如某层参数的初始化扩大K倍,那对应的这一层的输出也增大K倍,但是这层的输出做了BN之后的输出保持不变
- BN会减少regularization的需求,在一定程度上对抗overfitting