Gradient Descent梯度下降
▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头(loss等高线的法线方向)
Tip1: Tuning your learning rates
Adaptive Learning Rates自适应
通常lr会越来越小
Adaptive Learning Rates中每个参数都给它不同的lr
Adagrad
Adagrad也是Adaptive Learning Rates,因此每个参数都给它不同的lr
Tip2: Stochastic Gradient Descent随机
左边走一步,右边已经二十步
天下武功唯快不破
Tip3: Feature Scaling特征缩放
为什么要做归一化处理
如果要predict宝可梦进化以后CP值,有两个input feature:x1是进化前CP值,x2是它的生命值
如果x1和x2分布的range很不一样,建议把它们做scaling,也就是把它们的range分布变成是一样的
希望不同的feature,它们的scale是一样的
左边这种情况下会发现,w1的变化对y的变化而言是比较小的,而w2的变化对y的变化而言是比较大的
如果画error surface会是长椭圆形状的:因此,w1对loss是有比较小的微分的,因此w1方向上比较平滑。此时,在不同方向上,就会需要非常不同的lr,除非Adagrad等adaptive lr否则很难搞定它,很难update参数
正圆形update参数就比较容易,而且注意到梯度方向就是指向最低点的,效率就比较高,而椭圆形开始时不是指向最低点
常见的Feature Scaling方式:
深度学习中典型的特征归一化代表就是Batch Normalization批归一化,具体的计算方法也是较简单即计算批中均值和方差,通过均值和方差对原数据进行归一化操作:
另外,需要注意的是在训练过程中由于大量数据总是可以有batch从而进行归一化,但是在测试集中并不一定都会有batch,这时候参考Pytorch源码中的做法,计算训练过程中均值和方差的move average
Batch Normalization的表现
BN归一化的表现没有说特别突出,因为Normalization不仅仅只有BN,还有其他Layer Normalization,Instance Normalization等等,但是BN所使用最为广泛,并且如图实验数据可以看出BN的加入能够使得模型收敛速度更快并且随着batch的增大表现出更大的优势,特别是在使用sigmoid的时候,由于sigmoid函数曲线的特殊性,使得BN后输入sigmoid激活函数中能够表现出更好的梯度。
Gradient Descent Theory
update参数后,loss不一定会下降
此时,人物往前和往右都会变低,因此会往右前方走,但是却变高了