深度学习基础
目录
1.3 自适应学习率
临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。图1.16中的横坐标代表参数更新的次数,竖坐标表示损失。一般在训练一个网络的时候,损失原来很大,随着参数不断的更新,损失会越来越小,最后损失不再下降。当我们走到临界点的时候, 意味着梯度非常小,但损失不再下降的时候,梯度并没有真的变得很小,图1.17给出了示例。 图1.17中横轴是迭代次数,竖轴是梯度的范数 (norm), 即梯度这个向量的长度。
图1.18是误差表面,梯度在山谷的两个谷壁间,不断地来回“震荡”,这个时候损失不会再下降,它不是真的卡到了临界点,卡到了鞍点或局部最小值。但它的梯度仍然很大,只是损失不一定再减小了。所以训练一个网络,训练到后来发现损失不再下降的时候,有时候不是卡
图1. 16训练网络时损失变化
图1. 17 训练网络时梯度范数变化
在局部最小值或鞍点,只是单纯的损失无法再下降。
图3.20 梯度来回“震荡”
我们现在训练一个网络,训练到现在参数在临界点附近,再根据特征值的正负号判断该临界点是鞍点还是局部最小值。用一般的梯度下降训练,往往会在梯度还很大的时候,损失就已经降了下去,这个是需要特别方法训练的。要走到一个临界点其实是比较困难的,多数时候训练在还没有走到临界点的时候就已经停止了。
举个例子,我们有两个参数 w 和 b, 这两个参数值不一样的时候,损失值也不一样,得 到了图1.19所示的误差表面,该误差表面的最低点在叉号处。
图1.19 凸误差表面
学习率的结果如图1.20(a) 所示。参数在峡谷的两端,参数在山壁的两端不断第“震荡”,损失降不下去,但是梯度仍然是很大的。我们可以试着把学习率设小一点,学习率 决定了更新参数的时候的步伐,学习率设太大,步伐太大就无法慢慢地滑到山谷里面。调学习 率从
调到
的结果如图120b) 所示,参数不再“震荡”了。
(a) 学习率为 (b) 学习率为
图1.20 不同的学习率对训练的影响
梯度下降里面,为每一个参数定制化学习率,即引入自适应学习率 (adaptive learning rate) 的方法,给每一个参数不同的学习率。如图1.21所示,如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率调 大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率可以设得小一点。
图1.21 不同参数需要不同的学习率
1.3.1 AdaGrad
AdaGrad(Adaptive Gradient)是典型的自适应学习率方法,根据梯度大小自动调整学习率。AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。梯度下降更新某个参数的过程为
在第t 个迭代的值减掉在第t个迭代参数i算出来的梯度
代表在第t个迭代,即
=
时,参数
对损失L 的微分,学习率是固定的。 现在要有一个随着参数定制化的学习率,即把原来学习率
变成
的上标为i,这代表参数σ与i相关,不同的参数的
不同。
的下标为t,这代表参数
与迭代相关,不同的迭代也会有不同的
。学习率从
改成的时候,学习率就变得参数相关.
参数相关的一个常见的类型是算梯度的均方根(root mean square)。参数的更新过程为
其中是初始化参数。而
的计算过程为
其中 是梯度。
第二次更新参数过程为
其中 是过去所有计算出来的梯度的平方的平均再开根号,即均方根。下面式子表示
同样的操作反复继续下去,如下式所示。
第t+1 次更新参数的时候,即
当作是新的学习率来更新参数。
图1.22中有两个参数:和
。
坡度小,
坡度大。因为
坡度小,根据上面推导的结论,
这个参数上面算出来的梯度值都比较小,因为梯度算出来的值比较小,所以算出来的
就 小,
小学习率就大。
图1.22 自动调整学习率示例
1.3.2 RMSProp
同一个参数需要的学习率,也会随着时间而改变。在图1.23中的误差表面中,如果考虑 横轴方向,绿色箭头处坡度比较陡峭,需要较小的学习率,但是走到红色箭头处,坡度变得平坦了起来,需要较大的学习率。因此同一个参数的同个方向,学习率也是需要动态调整的,于是就有了一个新的方法———RMSprop
图1.23 AdaGrad 的问题
RMSprop 第一步跟Adagrad 的方法是相同的,即
第二步更新过程为
其中0<α<1,其是一个可以调整的超参数。计算
的方法跟AdaGrad算均方根不一样, 在算均方根的时候,每一个梯度都有同等的重要性,但在RMSprop 里面,可以自己调整现在 的这个梯度的重要性。如果
设很小趋近于0,代表
相较于之前算出来的梯度而言,比较 重要;如果
设很大趋近于1,代表
比较不重要,之前算出来的梯度比较重要。
同样的过程就反复继续下去,如x下式所示。
RMSProp通过可以决定。如果使用RMSprop, 就可以动态调整 σi这一项。图1.24中黑线是误差表面,球 就从 A 走 到B,AB 段的路很平坦,g 很小,更新参数的时候,我们会走比较大的步伐。走动 BC 段后梯度变大了,AdaGrad 反应比较慢,而RMSprop 会把α设小一点,让新的、刚看 到的梯度的影响比较大,很快地让 σi 的值变大,很快地让步伐变小,RMSprop 可以很快地 “踩刹车”。。
图1.24 RMSprop 示例
1.3.3 Adam
最常用的优化的策略或者优化器 (optimizer) 是Adam 。Adam 可以看作RMSprop加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需 要人为决定,但是往往用PyTorch 预设的参数就足够好了。
1.4 学习率调度
简单的误差表面,加上自适应学习率以后,使用AdaGrad 方法优化的结果如图1.25所示。一开始优化的时候很顺利,在左转的时候,有AdaGrad 以后,可以再继续走下去,走到非常接近终点的位置。走到BC 段时,因为横轴方向的梯 度很小,所以学习率会自动变大,步伐就可以变大,从而不断前进。接下来的问题走到图1.25中红圈的地方,快走到终点的时候突然“爆炸”了。
图1.25 AdaGrad 优化的问题
通过学习率调度可以解决这个问题。之前的学习率调整方法中是一个固定的值,而在学习率调度中η跟时间有关,如下式所示。
学习率调度中最常见的策略是学习率衰减 ,也称为学习率退火。随着参数的不断更新,让越来越小。如图1.27所示。在图3.22b 红圈的地方,虽然步 伐很大,但η变得非常小,步伐乘上η就变小了,就可以慢慢地走到终点。
图1.26 学习率衰减的优化效果
除了学习率下降以外,还有另外一个经典的学习率调度的方式————预热。预热的方法 是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数。残差网络,BERT 和 Transformer的训练也都使用了预热。
1.5 优化总结
所以我们从最原始的梯度下降,进化到这一个版本,如式子所示。
其中m 是动量。
这个是目前优化的完整的版本,这种优化器除了Adam 以外,还有各种变形。
1.6 分类
分类与回归是深度学习最常见的两种问题
1.6.1 分类与回归的关系
回归是输入一个向量 x, 输出ỳ,我们希望跟某一个标签 y 越接近越好,y 是要学习 的目标。而分类可当作回归来看,输入x 后,输出仍然是一个标量y, 要让它跟正确答案的,那个类越接近越好。。如图1.27所示,类1是编号 1,类2是编号2,类3是编号3,
跟类的编号越接近越好。假设三个类本身没有特定的关系, 类1是1,类2是2类3是3。这种情况,需要引入独热向量来表示类。实际上,在做分类 的问题的时候,比较常见的做法也是用独热向量表示类。
图1.27 用数字表示类的问题
如果有三个类,如果每个类都用一个独热向量来表示,就没有类1跟类2比较接近,类1跟 类3比较远的问题。如果用独热向量计算距离的话,类两两之间的距离都是一样的。
如果目标y 是一个向量,比如y 是有三个元素的向量,网络也要输出三个数字才行。如图1.28所示,输出三个数值就是把本来输出一个数值的方法,重复三次。把 、
和
乘上三个不同的权重,加上偏置,得到
;再把
、
和
乘上另外三个权重,再加上另外一个偏置得到
;把
、
和
再乘上另外一组权重,再加上另外一个偏置得到
。输入一个特征向量,产生
、
、
,希望
、
、
跟目标越接近越好。
图 1.28 网络多个输出示例
1.6.2 带有 softmax 的分类
按照上述的设定,分类实际过程是:输入 x,乘上 W,加上 b,通过激活函数,乘上W′,再加上 b′ 得到向量
。但实际做分类的时候,往往会把
通过 softmax 函数得到 y′,才去计算 y′ 跟
之间的距离。
图 1.29 带有 softmax 的分类
图 1.30 考虑了三个类的状况,两个类也可以直接套 softmax 函数。但一般有两个类的时候,我们不套 softmax,而是直接取 sigmoid。当只有两个类的时候,sigmoid 和 softmax 是等价的。
图 1.30 softmax 示例
实验截图
1.导入所需要的库和包
2.图像预处理
3.写数据集函数
4.写模型函数
5.写配置函数&&加载数据
6.训练模型
7.
7.加载数据,测试并生成预测csv
8.数据增强
9.可视化表示
9.
10.尝试使用resnet模型
11.修改后训练结果