一、General Guidance
1.训练过程
(1)写出一个有未知参数θ的函式(函数)function
(2)确定损失函数loss,来判断函式的参数θ的好坏
(3)优化optimization,得到使得loss最小的参数θ*
2.如何得到好的model
- 分析训练数据上损失loss on training data
-
loss on training data过大
可能的原因有两种:- model bias
所有的function集合set太小了,没有包含任何一个有效的function,可以让我们的loss变低。类似于,你在努力地大海捞针,但是从一开始就捞错海了。
解决:重新设计一个model,更复杂的、更有弹性的、有未知参数的、需要更多特征的~类似于,重新选到那个有针的海域做基础先
- optimize
可能卡在了局部最小值/鞍点local minima的地方,没办法找到一个真正让loss很低的参数。类似于又在大海捞针,确实捞对了有针的海域,但是技术不行捞不到
- 如何区分以上两种原因:
- start from shallower networks (or other models),which are easier to train
看到一个之前没做过的问题,可以先跑一些较小的,比较浅的network,甚至用一些不是deep learning的方法,来找到比较容易做optimize,避免optimization失败的问题 - if deeper networks do not obtain smaller loss on training data, then there is optimization issue
当发现更深的model反而比浅的model训练损失更大,说明优化有问题。eg:
- start from shallower networks (or other models),which are easier to train
- model bias
-
loss on training data较小时,分析测试数据上的损失loss on testing data
- 训练数据上的损失小,测试数据上的损失大
可能的两个原因:-
过拟合overfitting
当model的自由度很大时,可能会出现训练数据表现好,而测试数据表现差
- 解决方法:
-
增加训练集
既然model的弹性大,也许数据样本多一些就能增加限制
data augmentation:根据对该问题的理解,从已有的数据中,创造出新的合理的数据
-
增加限制
-
less parameters(如神经元的数量) ,sharing parameters模型共用参数
-
early stopping
-
regularization
-
dropout
-
- 解决方法:
-
mismatch
-
- 训练数据上的损失小,测试数据上的损失大
-
二、局部最小值local minima和鞍点saddle point
- critical point:梯度为0的点
当loss没法再下降时,可能是因为卡在了critical point上- local minima
可能无路可走 - saddle point
旁边还是有路走的
- local minima
- 判断方法:
- 考察θ附近loss的梯度
- 泰勒展开
- 海瑟矩阵H
- 所有特征值eigen value都是正的,H是正定矩阵positive definite,则为local minima
- 所有eigen value都是负的,H是negative definite,则为local maxima
- eigen value有正有负,则为saddle point
例如:
当走到鞍点时,可利用H的特征向量确定参数的更新方向
- local minima 比saddle point少得多
Loss在一个维度很高的空间中,往往只会遇到鞍点而几乎不会遇到局部极小值点
⇒从上图可以看出,正特征值的数目最多只占所有特征值的60%,这就说明剩余40%-50%的维度都仍然“有路可走”
三、批次batch和动量momentum
batch
-
epoch:所有的batch看过一遍,叫做一个epoch
-
shuffle:每个epoch开始前,都重新分配一次batch,则每一次epoch的batch都不一样
-
small batch VS large batch
-
基本现象
左边的large batch case,必须把所有20个emamples都看完后,参数才能够update一次
⇒large batch情况下蓄力时间长,但威力大
右边的small batch case,只需一个样本数据就能update一次参数,但会比较noisy,故update的方向曲曲折折。
⇒small batch情况下冷却时间短,但是较为“不准”
⇒其实noisy的gradient反而能够帮助training
-
考虑“并行计算”左边( large BatchSize)并不一定时间比较长
如图示呀,batch size从1到1000所需要的时间几乎是一样的;
增加到10000乃至增加到60000时,一个batch所耗费的时间才随着batch size的增加而增长地较为显著。
⇒分析,有GPU可以做并行运算,则1000个examples所花费时间并非1个example的1000倍;
GPU平行运算的能力还是有其限度的,当batch size真的很大时,GPU在跑完一个batch计算出gradient所花费的时间,会随着batch size的增加而逐渐增长
对总时间的影响:
基于并行运算的加成,实际上当batch size小的时候,跑完一个epoch花费时间要比batch size大的时候多;反之,batch size大的时候,跑完一个epoch花费时间反而较少
batch size 小的时候,update的次数大大增加 -
总结①:使用small batchsize时,更新参数时会有noisy⇒有利于训练
不同的batch求得的loss略有不同,可避免卡在local minima
-
总结②:使用small batchsize可以避免overfitting
一种解释
在一个峡谷里的loca minima是坏的minima;在一个平原上的loca minima是好的minima
⇒把training的loss向右平移,对于盆地里的minima而言,在training和testing上的结果不会差太多;对于峡谷里的minima,一差就可能天差地别
⇒large batchsize倾向于走到峡谷里,small batchsize倾向于走到盆地里。
因为small batchsize有很多的loss,每次的update方向都不太一样,若峡谷非常窄,可能一不小心就跳走了;large batchsize按照规定update很可能走到一个小峡谷里。 -
batchsize是一个需要调整的参数,会影响训练速度和优化效果
-
momentum
- 一般的梯度下降vanilla gradient descent:只考虑梯度的方向,向反方向移动
vanilla /vəˈnɪlə/
n.香草,香草制品
adj.香草味的;无特色的,普通的;[计算机]原版的
- gradient descent + momentum:综合了 梯度+前一步的方向
另一个方向解读,所谓的momentum,update的方向不只考虑了现在的gradient,而是考虑过去所有gradient总和
四、自动调整学习率
SGD、Momentum、AdaGrad、RMSProp和Adam的区别
2022吴恩达机器学习Deeplearning.ai 优化方法
- training stuck ≠ small gradient
即loss不再下降时,未必说明此时到达critical point,梯度可能还很大
- 鉴于使用“固定的”学习率,即使在“凸面体”的优化,都会让优化的过程非常艰难,故考虑使用“客制化”学习率
- 较小的学习率:梯度较小时几乎难以移动
- 较大的学习率:loss在山谷的两端震荡不会下降
- 客制化梯度:不同的参数大小需要不同的学习率
根据参数的当前实际情况,调整 σ i t \sigma^t_i σit的大小,实现对 θ i \theta_i θi的更新。- 基本原则
- 某一个方向上gradient的值很小,非常平坦
⇒学习率调大些 - 某一个方向上非常的陡峭,坡度很大
⇒学习率调小些
- 某一个方向上gradient的值很小,非常平坦
- 求
σ
\sigma
σ的方法:均方根Root Mean Square
-
Adagrad(考虑之前所有的梯度大小)
把本次和之前计算出的所有梯度 求均方根
gradient都比较大, σ \sigma σ就比较大,在update时参数update的量就比较小
缺点:不能“实时”考虑梯度的变化情况
-
RMSProp(调整“当前步”梯度与“历史”梯度的重要性
添加参数 α \alpha α,越大说明过去的梯度信息越重要- α \alpha α设很小趋近于0,就代表这一步算出的gᵢ相较于之前算出来的gradient而言比较重要
-
α
\alpha
α设很大趋近于1,就代表这一步算出的gᵢ较不重要,之前算出来的gradient比较重要
-
Adam=RMSProp + Momentum(最常用)
使用Pytorch中预设的参数就能够得到较好的结果
-
- 基本原则
- learning rate scheduling:让learning rate和训练时间有关
learning rate decay:随着训练参数不断地update,η越来越小
- warm up:让learning rate先变大再变小
还没有数学上的解释
σ \sigma σ指示某一个方向它到底有多陡/多平滑,这个统计的结果,要看得够多笔数据以后才精准,所以一开始我们的统计是不精准的。一开始learning rate比较小,是让它探索收集一些有关error surface的情报,在这一阶段使用较小的learning rate,限制参数不会走的离初始的地方太远;等到 σ \sigma σ统计得比较精准以后再让learning rate慢慢爬升。 - 总结:
- 使用动量,考虑过去的梯度的大小和方向
- 引入
σ
\sigma
σ,考虑到过去的梯度的大小
-
batch normalization:把崎岖的山铲平
-
现象:不同的参数发生变化,引起的loss function变化程度不同
⇒受“不同维度输入值的差异”的影响
x1的值很小时,当参数w1有一个很小的变化,对y的影响很小,从而对loss的影响也较小;反之,x2的值很大时,当参数w2有一个同样大小的变化,对y的影响则大得多,从而对loss的影响较大。
故不同维度的输入值,大小的scale差距很大,就可能产生在不同方向上,斜率、坡度非常不同的error surface。 -
解决:feature normalization(给不同的dimension同样的数值范围)
- 做完normalize以后,这个dimension上的数值就会平均是0,方差variance会是1,则这一排数值的分布会在0的上下
- 对每一个dimension都做一样的normalization,会发现所有feature不同dimension的数值都在0上下,可能就可以制造一个较好的error surface。
-
在deep learning中,每一层都需要一次normalization
x ~ \tilde{x} x~经过 W 1 W_1 W1矩阵后, a , z a,z a,z数值的分布各维度仍然有很大的差异,要 train 第二层的参数 W 2 W_2 W2,也会有困难。需要对 a 或者 z a或者z a或者z进行Normalization。- 如果你选择的是 Sigmoid,那可能比较推荐对 z 做 Feature Normalization,因Sigmoid 在 0 附近斜率比较大,所以如果你对 z 做 Feature Normalization,把所有的值都挪到 0 附近,算 gradient 的时候,算出来的值会比较大
- 一般而言, normalization要放在 activation function 之前或之后都是可以的
五、损失函数
希望模型输出的y和class编号越接近越好
-
class间的关系:
- class间有某种关系
例如根据身高等数据预测是几年级的小学生,一年级和二年级比较接近,一年级和三年级比较没有关系 - class间没有特定的关系
假设错误
- class间有某种关系
-
独热编码:任何两个分类间的距离都相同
-
Classification with softmax
经过计算后:- 输出值范围0~1
- 输出值的和为1
- 原本大的值和小的值之间的差距变大
softmax的输入称为logit
-
loss of classifcation
-
优化目标:减小 y ^ \hat{y} y^和 y ′ y' y′之间的差距 e e e
衡量方法有mse,cross-entropy等
使用mse时,左上角位置的loss很大但是梯度平坦,难以优化
使用cross-entorpy更容易收敛
⇒改变loss函数也会影响training(数学证明)