Datawhale X 李宏毅苹果书 AI夏令营——深度学习(进阶)

Datawhale X 李宏毅苹果书 AI夏令营——深度学习(进阶)

深度学习苹果书链接
Task-2

3.1 AdaGrad

AdaGrad(Adaptive Gradient)是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。
在这里插入图片描述
梯度下降更新某个参数 θit 的过程为:
在这里插入图片描述
θit 在第 t 个迭代的值减掉在第 t 个迭代参数 i 算出来的梯度:
在这里插入图片描述
git 代表在第 t 个迭代,即 θ = θt 时, 参数 θi 对损失 L 的微分,学习率是固定的。
现在要有一个随着参数定制化的学习率,即把原来学习率 η 变成 η / σit
在这里插入图片描述
σit 的上标为 i,这代表参数 σ 与 i 相关,不同的参数的 σ 不同。σit 的下标为 t,这代表参数 σ 与迭代相关,不同的迭代也会有不同的 σ。学习率从 η 改成 η / σit 的时候,学习率就变得参数相关(parameter dependent)。
参数相关的一个常见的类型是算梯度的均方根(root mean square)。参数的更新过程为:
在这里插入图片描述
其中 θi0 是初始化参数。而 σi0 的计算过程为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中 σi1 是过去所有计算出来的梯度的平方的平均再开根号,即均方根,如下式所示:
在这里插入图片描述
同样的操作反复继续下去,如下式所示:
在这里插入图片描述

第 t + 1 次更新参数的时候,即:
在这里插入图片描述

η / σit 当作是新的学习率来更新参数。
下图中有两个参数:θ1 和 θ2。θ1 坡度小,θ2 坡度大。因为 θ1 坡度小,根据上式 ,θi1 这个参数上面算出来的梯度值都比较小,因为梯度算出来的值比较小,所以算出来的 σit 就小,σit 小学习率就大。反过来,θ1 坡度大,所以计算出的梯度都比较大,σit 就比较大,在更新的时候,步伐(参数更新的量)就比较小。因此有了 σit 这一项以后,就可以随着梯度的不同,每一个参数的梯度的不同,来自动调整学习率的大小。
在这里插入图片描述

3.2 RMSProp

同一个参数需要的学习率,也会随着时间而改变。在下图中的误差表面中,如果考虑横轴方向,绿色箭头处坡度比较陡峭,需要较小的学习率,但是走到红色箭头处,坡度变得平坦了起来,需要较大的学习率。因此同一个参数的同个方向,学习率也是需要动态调整的,于是就有了一个新的方法———RMSprop(Root Mean Squared propagation)。
在这里插入图片描述

RMSprop 没有论文,Geoffrey Hinton 在 Coursera 上开过深度学习的课程,他在他的课程里面讲了 RMSprop,如果要引用,需要引用对应视频的链接。
RMSprop 第一步跟 Adagrad 的方法是相同的,即:
在这里插入图片描述

第二步更新过程为:
在这里插入图片描述
其中 0 < α < 1,其是一个可以调整的超参数。计算 σit 的方法跟 AdaGrad 算均方根不一样,AdaGrad 在算均方根的时候,每一个梯度都有同等的重要性,但在 RMSprop 里面,可以自己调整现在的这个梯度的重要性。如果 α 设很小趋近于 0,代表 gi1 相较于之前算出来的梯度而言,比较重要;如果 α 设很大趋近于 1,代表 gi1 比较不重要,之前算出来的梯度比较重要。
同样的过程就反复继续下去,如下式所示:
在这里插入图片描述

RMSprop 通过 α 可以决定,git 相较于之前存在 σit-1 里面的 gi1, gi2, · · · · · · , git-1 的重要性有多大。如果使用 RMSprop,就可以动态调整 σit 这一项。下图中黑线是误差表面,球就从 A 走到 B,AB 段的路很平坦,g 很小,更新参数的时候,我们会走比较大的步伐。走到 BC 段后梯度变大了,AdaGrad 反应比较慢,而 RMSprop 会把 α 设小一点,让新的、刚看到的梯度的影响比较大,很快地让 σit 的值变大,很快地让步伐变小,RMSprop 可以很快地“踩刹车”。如果走到 CD 段,CD 段是平坦的地方,可以调整 α,让其比较看重最近算出来的梯度,梯度一变小,σit 的值就变小了,走的步伐就变大了。
在这里插入图片描述

3.3 Adam

最常用的优化的策略或者优化器(optimizer)是Adam(Adaptive moment estimation)。Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需要人为决定,但是往往用 PyTorch 预设的参数就足够好了。

4.学习率调度

如下图(1 图)所示的简单的误差表面,我们都训练不起来,加上自适应学习率以后,使用AdaGrad 方法优化的结果如下图(2 图)所示。一开始优化的时候很顺利,在左转的时候,有 AdaGrad 以后,可以再继续走下去,走到非常接近终点的位置。走到 BC 段时,因为横轴方向的梯度很小,所以学习率会自动变大,步伐就可以变大,从而不断前进。接下来的问题走到下图(2 图)中红圈的地方,快走到终点的时候突然“爆炸”了。σit 是把过去所有的梯度拿来作平均。在 AB 段梯度很大,但在 BC 段,纵轴的方向梯度很小,因此纵轴方向累积了很小的 σit,累积到一定程度以后,步伐就变很大,但有办法修正回来。因为步伐很大,其会走到梯度比较大的地方。走到梯度比较大的地方后,σit 会慢慢变大,更新的步伐大小会慢慢变小,从而回到原来的路线。
在这里插入图片描述
通过学习率调度(learning rate scheduling)可以解决这个问题。之前的学习率调整方法中 η 是一个固定的值,而在学习率调度中 η 跟时间有关,如下式所示。学习率调度中最常见的策略是学习率衰减(learning rate decay),也称为学习率退火(learning rateannealing)。随着参数的不断更新,让 η 越来越小,如图 (2 图)所示。图(1 图 b)的情况,如果加上学习率下降,可以很平顺地走到终点,如图 (3 图 ) 所示。在图 (1 图 b) 红圈的地方,虽然步伐很大,但 η 变得非常小,步伐乘上 η 就变小了,就可以慢慢地走到终点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

5.优化总结

所以我们从最原始的梯度下降,进化到这一个版本,如下式所示:
在这里插入图片描述
其中 mit 是动量。

这个版本里面有动量,它不是顺着某个时刻算出的梯度方向来更新参数,而是把过去所有算出的梯度的方向做一个加权总和当作更新的方向。接下来的步伐大小为 mit / σit。最后通过 ηt 来实现学习率调度。这个是目前优化的完整的版本,这种优化器除了 Adam 以外,还有各种变形。但其实各种变形是使用不同的方式来计算 mit 或 σit,或者是使用不同的学习率调度的方式。

在这里插入图片描述

6.分类

分类与回归是深度学习最常见的两种问题,一种是回归问题,另一种是分类问题。

6.1 分类与回归的关系

回归是输入一个向量 x,输出 y ^ \hat{y} y^,我们希望 y ^ \hat{y} y^ 跟某一个标签 y 越接近越好,y 是要学习的目标。而分类可当作回归来看,输入 x 后,输出仍然是一个标量 yˆ,要让它跟正确答案的那个类越接近越好。 y ^ \hat{y} y^ 是一个数字,我们可以把类也变成数字。如下图所示,类 1 是编号1,类 2 是编号 2,类 3 是编号 3, y ^ \hat{y} y^ 跟类的编号越接近越好。但该方法在某些状况下会有问题,假设类 1、2、3 有某种关系。比如根据一个人的身高跟体重,预测他的年级,一年级、二年级还是三年级。一年级跟二年级关系比较近,一年级跟三年级关系比较远。用数字来表示类会预设 1 和 2 有比较近的关系,1 和 3 有比较远的关系。但假设三个类本身没有特定的关系,类 1 是 1,类 2 是 2 类 3 是 3。这种情况,需要引入独热向量来表示类。实际上,在做分类的问题的时候,比较常见的做法也是用独热向量表示类。
在这里插入图片描述
如果有三个类,标签 y 就是一个三维的向量,比如类 1 是 [1, 0, 0]T,类 2 是 [0, 1, 0]T,类3 是 [0, 0, 1]T。如果每个类都用一个独热向量来表示,就没有类 1 跟类 2 比较接近,类 1 跟类 3 比较远的问题。如果用独热向量计算距离的话,类两两之间的距离都是一样的。

如果目标 y 是一个向量,比如 y 是有三个元素的向量,网络也要输出三个数字才行。如下图所示,输出三个数值就是把本来输出一个数值的方法,重复三次。把 a1、a2 和 a3 乘上三个不同的权重,加上偏置,得到 y ^ 1 \hat{y}_1 y^1;再把 a1、a2 和 a3 乘上另外三个权重,再加上另外一个偏置得到 y ^ 2 \hat{y}_2 y^2;把 a1、a2 和 a3 再乘上另外一组权重,再加上另外一个偏置得到 y ^ 3 \hat{y}_3 y^3。输入一个特征向量,产生 y ^ 1 \hat{y}_1 y^1 y ^ 2 \hat{y}_2 y^2 y ^ 3 \hat{y}_3 y^3,希望 y ^ 1 \hat{y}_1 y^1 y ^ 2 \hat{y}_2 y^2 y ^ 3 \hat{y}_3 y^3 跟目标越接近越好。
在这里插入图片描述

6.2 带有 softmax 的分类

按照上述的设定,分类实际过程是:输入 x,乘上 W,加上 b,通过激活函数 σ,乘上W′,再加上 b′ 得到向量 y ^ \hat{y} y^。但实际做分类的时候,往往会把 y ^ \hat{y} y^ 通过 softmax 函数得到 y′,才去计算 y′ 跟 y ^ \hat{y} y^ 之间的距离。
在这里插入图片描述在这里插入图片描述
softmax 的计算如下式所示,先把所有的 y 取一个指数(负数取指数后也会变成正的),再对其做归一化(除掉所有 y 的指数值的和)得到 y′。下图是 softmax 的块(block),输入 y1、y2 和 y3,产生 y′1、y′2 和 y′3。比如 y1 = 3,y2 = 1,y3 = −3,取完指数的时候,exp(3) = 20、exp(1) = 2.7 和 exp(−3) = 0.05,做完归一化后,就变成 0.88、0.12 跟 0。−3 取完指数,再做归一化以后,会变成趋近于 0 的值。所以 softmax 除了归一化,让 y′1、y′2 和y′3,变成 0 到 1 之间,和为 1 以外,它还会让大的值跟小的值的差距更大。

在这里插入图片描述
在这里插入图片描述

上图考虑了三个类的状况,两个类也可以直接套 softmax 函数。但一般有两个类的时候,我们不套 softmax,而是直接取 sigmoid。当只有两个类的时候,sigmoid 和 softmax 是等价的。

6.3 分类损失

当我们把 x 输入到一个网络里面产生 yˆ 后,通过 softmax 得到 y′,再去计算 y′ 跟 y 之间的距离 e,下如图所示。
在这里插入图片描述
计算 y′ 跟 y 之间的距离不只一种做法,可以是如下式所示的均方误差,即把 y 里面每一个元素拿出来,计算它们的平方和当作误差。
在这里插入图片描述
但如下式所示的交叉熵更常用,当 y ^ \hat{y} y^ 跟 y′ 相同时,可以最小化交叉熵的值,此时均方误差也是最小的。最小化交叉熵其实就是最大化似然(maximize likelihood)。
在这里插入图片描述
接下来从优化的角度来说明相较于均方误差,交叉熵是被更常用在分类上。如下图所示,有一个三类的分类,网络先输出 y1、y2 和 y3,在通过 softmax 以后,产生 y′1、y′2 和 y′3。假设正确答案是 [1, 0, 0]T,要计算 [1, 0, 0]T 跟 y′1、y′2 和 y′3 之间的距离 e,e 可以是均方误差或交叉熵。假设 y1 的变化是从-10 到 10,y2 的变化也是从-10 到 10,y3 就固定设成-1000。因为 y3 的值很小,通过 softmax 以后,y′3 非常趋近于 0,它跟正确答案非常接近,且它对结果影响很少。总之,我们假设 y3 设一个定值,只看 y1 跟 y2 有变化的时候,对损失 e 的影响。
在这里插入图片描述
下图是分别在 e 为均方误差和交叉熵时,y1、y2 的变化对损失的影响,对误差表面的影响,红色代表损失大,蓝色代表损失小。如果 y1 很大,y2 很小,代表 y′1 会很接近 1,y′2 会很接近 0。所以不管 e 取均方误差或交叉熵,如果 y1 大、y2 小,损失都是小的;如果 y1 小,y2 大,y′1 是 0,y′2 是 1,这个时候损失会比较大。
在这里插入图片描述
上图中左上角损失大,右下角损失小,所以期待最后在训练的时候,参数可以“走”到右下角的地方。假设参数优化开始的时候,对应的损失都是左上角。如果选择交叉熵,如上图 (a) 所示,左上角圆圈所在的点有斜率的,所以可以通过梯度,一路往右下的地方“走”;如果选均方误差,如上图 (b) 所示,左上角圆圈就卡住了,均方误差在这种损失很大的地方,它是非常平坦的,其梯度是非常小趋近于 0 的。如果初始时在圆圈的位置,离目标非常远,其梯度又很小,无法用梯度下降顺利地“走”到右下角。
。所以不管 e 取均方误差或交叉熵,如果 y1 大、y2 小,损失都是小的;如果 y1 小,y2 大,y′1 是 0,y′2 是 1,这个时候损失会比较大。
上图中左上角损失大,右下角损失小,所以期待最后在训练的时候,参数可以“走”到右下角的地方。假设参数优化开始的时候,对应的损失都是左上角。如果选择交叉熵,如上图 (a) 所示,左上角圆圈所在的点有斜率的,所以可以通过梯度,一路往右下的地方“走”;如果选均方误差,如上图 (b) 所示,左上角圆圈就卡住了,均方误差在这种损失很大的地方,它是非常平坦的,其梯度是非常小趋近于 0 的。如果初始时在圆圈的位置,离目标非常远,其梯度又很小,无法用梯度下降顺利地“走”到右下角。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值