在训练过程中,初始权重直接影响模型的输出,进一步影响损失及回传的梯度。因此,恰当的权重初始化是非常重要的。
常量初始化
权重全部初始化为0,梯度回传后全为0,多于一层的NN就无法学习。 梯度全部初始化为1,梯度回传值全部相同,一层内不同神经元的值全部一样,无意义。
随机初始化
常见的高斯随机初始化,使用均值为0,方差为1的高斯分布采样初始化。 随着层数加深,会出现梯度爆炸及梯度消失的问题。(why?待填坑)
为了修正这一点,设计初始化方法,让输入输出值的方差不变(方差和梯度之间的关系是什么?,为什么方差不变加不会有梯度消失的问题)。针对不同的激活函数,又需要设计不同的方法。
针对tahn: xavier 初始化
(为什么从这里均匀采样就可以保证输入输出的方差值不变?)
从中均匀采样
w = np.random.randn(node_in, node_out) / np.sqrt(node_in)
针对Relu : kaiming 初始化
由于Relu激活函数仅有一半有效,所以xavier初始化失效(为什么?)。
w = np.random.randn(node_in, node_out) / np.sqrt(node_in/2)
batch normalization layer
使用batch normalization后,随机初始化即可(why??)
batch normalization原理
论文中解释说是解决ICS的问题,内部分布平移。根据论文BN真正原理。BN并没有解决ICS问题,反而可能增大ICS问题,BN本质上是让优化空间更加光滑,因此更容易收敛。
在Train阶段,计算mini-batch内的mean和var,使用该mean和var进行归一化。再设置两个可学习的值 和 , 一个用于做水平偏移,一个用于做缩放。在Inference阶段,使用全部mini-batch的mean和var的均值进行归一化,(var = m/m-1 var_batc为什么这里是m/m-1?)公式如下:
1.计算平均值
2.计算方差
3.归一化
4.可学习参数缩放
BN、dropout和激活函数的位置
最初BN放在激活函数前,用于改变分布,以保证数据不过多落入饱和区。但实际上放在前后都可以,效果不一定有区别。放在DNN和CNN前,会有更好的效果。--pre-LN优势
dropout在inference阶段会改变数据分布,因此BN最好放在dropout前。
因此 BN - DNN - RELU - DROPOUT
BN缺点
在小Batch_Size时效果不佳
Layer Normalization
BatchSize 针对某一特征进行normalizaiton, 例如特征[x1,x2],计算一个batch内x1的均值和方差再normalization。Layer则是计算x1和x2的均值和方差进行normalizaiton。 很简单:将Batch改为神经元数量即可。可以对输入数据进行layernorm 也可以对输出数据进行layer norm 1.计算平均值
2.计算方差
3.归一化
4.可学习参数缩放
Instance normalizaiton
主要针对图像,针对[B, HW,channel]的图像,对其HW的纬度求均值。 即某一特征为一个向量时可以使用instance normalization,针对这个特征向量进行正则化
Group Normalization
固定Batch大小进行normalization,而不是对整个mini batch进行normalization
Dropout
训练时,以一定的概率随机使一些神经元失效。 预测时,不让神经元失效。 本质上是强制让某些神经元权重为0,不让某些神经元过度依赖部分特征/输入。