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

深度学习基础(一)

我们要了解深度学习首先得先理清楚深度学习、机器学习和人工智能之间的关系,从而知道深度学习要做什么。三者的关系:深度学习⊆机器学习⊆人工智能。因此,深度学习要做的事情也就是机器学习要做的事情,那么我们先来看机器学习要做的事情是什么。

1. 机器学习要做什么?

机器学习顾名思义,是要让机器具备学习的能力,具体而言是让机器具备寻找一个函数的能力。这里所涉及的函数在一般情况下,并不是数学上常规的一次、二次等函数,而是复杂的多项式函数。

机器学习寻找函数的过程可分为3个步骤:写出一个带有未知参数的函数 f f f,定义一个损失函数和解一个最优化问题

1.1 带有未知参数的函数

我们先以房价预测为例进行分析,假设我们知道房屋的面积,要确定合适的房价,那么我们就需要找一个函数,其输入的是房屋面积,输出的是房价。比如将函数写作:

y = b + w x 1 (1.1) y=b+wx_1 \tag{1.1} y=b+wx1(1.1)

其中, y y y是预测的房价, x 1 x_1 x1是该房屋的面积。 y y y x 1 x_1 x1都是数值, b b b w w w都是未知的参数,是要根据现有的数据去找出来的。在初始情况 b b b w w w我们可以根据现有的领域知识对数值进行猜测,它可能并不准确,甚至错的离谱,但后续的操作会不断对其进行修正。

上述,带有未知参数的函数被称为模型(model)特征(feature) x 1 x_1 x1是函数里面已知的信息,而未知参数 w w w被称为权重(weight) b b b被称为偏置(bias)

1.2 损失函数

损失函数的输入是模型里的未知参数。模型如式1.1所示,其中 b b b w w w是未知的,因此损失函数为 L ( b , w ) L(b,w) L(b,w)损失函数的输出用于评价这组未知参数当前数值的好坏

模型通过特征 x 1 x_1 x1与未知参数 b b b w w w当前数值的计算得到的预测值我们称为 y ^ \hat y y^,而实际在特征 x 1 x_1 x1情况下的真实值 y y y我们称为标签(label)。计算预测值 y ^ \hat y y^和真实值 y y y的差距 e e e(计算差距 e e e的方法不止一种,这里采用的是绝对值的计算方法):

e 1 = ∣ y − y ^ ∣ (1.2) e_1=|y-\hat y| \tag{1.2} e1=yy^(1.2)

我们不止能使用 x 1 x_1 x1来计算预测值,还可以使用 x 2 , x 3 , . . . , x n x_2,x_3,...,x_n x2,x3,...,xn。计算 n n n个特征的差距 e e e,将其加和再取平均可得到损失 L L L

L = 1 N ∑ n e n (1.3) L=\frac1N \sum_ne_n \tag{1.3} L=N1nen(1.3)

其中, N N N代表训练数据(特征)的个数, L L L的值越大,代表这当前未知参数的数值越不好,反之越好。

根据差距 e e e的计算方法的不同,可分为平均绝对误差(Mean Absolute Error, MAE)如式1.4所示和均方误差(Mean Squared Error, MSE)如式1.5所示。

e = ∣ y ^ − y ∣ (1.4) e=|\hat y -y| \tag{1.4} e=y^y(1.4)

e = ( y ^ − y ) 2 (1.5) e=(\hat y - y)^2\tag{1.5} e=(y^y)2(1.5)

而在一些任务中(如分类任务) y 和 y和 y\hat y 都是概率分布的,差距$e的计算往往会选择交叉熵(cross entropy)。

未知参数在不同的数值下计算得到了对应损失,进一步绘制出来的等高线图被称为误差表面(error surface)如下图所示。我们需要注意的是误差表面的坐标轴未知参数,图上的代表对应未知参数的损失值

1.3 最优化问题

最优化问题是找一组 b 和 b和 bw的数值,使损失 L 的值最小,而这组让损失最小的 L的值最小,而这组让损失最小的 L的值最小,而这组让损失最小的b 和 和 w 被称 $b^ 和 $w^*。梯度下降(gradient descent)是最基础的优化方法。

下面为介绍而简化解最优化问题将误差表面从二维转换到一维,假设有未知参数 b b b w w w,其中未知参数 b b b是已知的,要去寻找一个 w w w使损失值最小。
因为只有一个未知参数,所以这个误差表面是一维的如下图所示。

随机选取一个初始点 w 0 w^0 w0,对梯度进行计算 ∂ L ∂ w ∣ w = w 0 \frac{\partial L}{\partial w}|_{w=w^0} wLw=w0得到在 w 0 w^0 w0该点误差表面的切线斜率如下图蓝色虚线所示。如果斜率为正数,代表曲线左低右高,如果斜率为负数,代表曲线左高右低。我们需要更小的损失值,所以要向曲线低的方向移动,但是我们并不知道一次移动的步伐多大才合适,因此可以通过两个因素来决定移动的步伐:斜率和学习率(learning rate)。

  1. 斜率。移动的步伐取决于该点的斜率大小,斜率大步伐大,斜率小步伐小;
  2. 学习率。学习率是自己设定的,而不是机器找出来的,因此被称为超参数。学习率设置大,步伐大,学习率设置小,步伐小。

未知参数的更新公式:

w 1 ← w 0 − η ∂ L ∂ w ∣ w = w 0 (1.6) w^1\leftarrow w^0-\eta\frac{\partial L}{\partial w}|_{w=w^0} \tag{1.6} w1w0ηwLw=w0(1.6)

其中, w 1 w^1 w1是新位置,这一步的步伐是学习率与梯度的乘积。接下来反复进行上述操作,不断移动 w w w的位置,最后会停下来。

上述就是机器学习也是深度学习要去做的事情,概括言之:根据任务设计一个模型,通过优化方法找到一组使损失最小的未知参数,从而使该模型能够较好的解决这一任务。

2. 深度学习优化问题

在优化过程中,我们经常会发现随着训练次数的增加,参数不断更新,损失值却不再下降,但是目前的损失仍不令人满意。甚至深层网络与浅层网络相比也并没有做的更好,这表明深层网络并没有发挥它的优势,说明优化是存在问题的。

但有时候,模型在训练一开始,不论参数如何更新,损失都无法下降。一个普遍的猜想是:参数优化到了某个地方,其梯度计算为零。根据式1.6可知参数不再更新,损失也就不再下降。

2.1 临界点及其种类判断方法

梯度为零的点被统称为临界点(critical point),临界点分为三类:局部极小值、局部极大值和鞍点。

  1. 局部极小值,在某一区域内,函数达到了极小值如下图a所示;
  2. 局部极大值,在某一区域内,函数达到了极大值;
  3. 鞍点,梯度为零且区别于局部极小值和极大值的点如下图b所示;

从上图我们可以知道判断一个临界点是属于局部极小值还是鞍点可以通过损失函数的形状,但是通常情况下由于模型的复杂导致其损失函数也很复杂,我们不可能知道损失函数的形状。虽然无法知道损失函数的完整形状,但是如果给定一组参数 θ ′ \theta ' θ,在 θ ′ \theta ' θ附近的损失函数是可以通过数学方法得到:

L ( θ ) ≈ L ( θ ′ ) + ( θ − θ ′ ) T g + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) (2.1) L(\theta)\approx L(\theta ')+(\theta - \theta ')^Tg+\frac12(\theta - \theta ')^TH(\theta - \theta ')\tag{2.1} L(θ)L(θ)+(θθ)Tg+21(θθ)TH(θθ)(2.1)

上式是泰勒级数近似。其中,第一项 L ( θ ′ ) L(\theta ') L(θ)意味着当$\theta 与 与 \theta ' 接近时, 接近时, 接近时,L(\theta) 和 和 L(\theta ') 的值也很接近。第二项 的值也很接近。第二项 的值也很接近。第二项(\theta - \theta ')^Tg 的 的 g 代表梯度,可以补偿 代表梯度,可以补偿 代表梯度,可以补偿L(\theta) 与 与 L(\theta ') 之间的差距。第三项 之间的差距。第三项 之间的差距。第三项\frac12(\theta - \theta ')^TH(\theta - \theta ') 同样可补偿差距,其中 同样可补偿差距,其中 同样可补偿差距,其中H$称为海森矩阵(Hessian matrix),是损失函数的二次微分。

在临界点时,梯度 g = 0 g=0 g=0。因此在临界点 θ ′ \theta ' θ附近的损失函数可近似为:

L ( θ ) ≈ L ( θ ′ ) + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) (2.2) L(\theta)\approx L(\theta ')+\frac12(\theta - \theta ')^TH(\theta - \theta ')\tag{2.2} L(θ)L(θ)+21(θθ)TH(θθ)(2.2)

其中$ L(\theta ') 为一常数,因此可根据 为一常数,因此可根据 为一常数,因此可根据\frac12(\theta - \theta ')^TH(\theta - \theta ') 来判断临界点 来判断临界点 来判断临界点\theta '$附近的误差表面,由此可判断该临界点的类型。

为简化公式使用向量 v v v来表示 ( θ − θ ′ ) (\theta - \theta ') (θθ),可改写成 v T H v v^THv vTHv

  1. 如果对所有 v v v都有 v T H v > 0 v^THv>0 vTHv>0,意味着对任意 θ \theta θ都有 L ( θ ) > L ( θ ′ ) L(\theta)>L(\theta ') L(θ)>L(θ),因此临界点 θ ′ \theta ' θ为局部极小值;
  2. 如果对所有 v v v都有 v T H v < 0 v^THv<0 vTHv<0,意味着对任意 θ \theta θ都有 L ( θ ) < L ( θ ′ ) L(\theta)<L(\theta ') L(θ)<L(θ),因此临界点 θ ′ \theta ' θ为局部极大值;
  3. 如果对于 v v v v T H v v^THv vTHv有时大于零,有时小于零,意味着存在 θ \theta θ使 L ( θ ) > L ( θ ′ ) L(\theta)>L(\theta ') L(θ)>L(θ) L ( θ ) < L ( θ ′ ) L(\theta)<L(\theta ') L(θ)<L(θ),因此临界点 θ ′ \theta ' θ为鞍点;

通过上面的方法便可判断临界点的种类,但是我们注意到要使用上述方法判断需要用到所有的 v v v,在实际中是不可能的,所以还可以使用更简单的方法:利用海森矩阵判断临界点的种类

  1. 若H所有特征值都是整的,H为正定矩阵,临界点是局部极小值
  2. 若H所有特征值都是负的,H为负定矩阵,临界点是局部极大值;
  3. 若H特征值有正有负,临界点是鞍点

可能有人会问什么:为什么能根据海森矩阵来判断临界点的种类?这与正定/负定矩阵的定义有关。

如果 n n n对称矩阵 A A A对于任意非零的 n n n维向量 x x x都有 x T A x > 0 x^TAx > 0 xTAx>0,则称矩阵 A A A为正定矩阵。海森矩阵是由二阶微分计算得到的对称矩阵,因此若海森矩阵为正定矩阵,对于任意非零向量 v v v v T H v > 0 v^THv>0 vTHv>0,所以临界点是局部极小值。

2.2 逃离鞍点的方法有哪些?

本文主要介绍两种逃离鞍点的方法:批量和动量。

批量

由于训练的数据量通常很大,梯度的计算往往不是使用所有数据,而是将所有数据随机打乱并分成一个个批量(batch),每次使用一个批量来计算梯度并更新参数,如下图所示。遍历完所有的批量的过程称为一个回合(epoch)。通常情况随机打乱是在每个回合开始前对所有数据重新划分批量,意味着每个回合的批量数据都是不一样的。

使用批量而非全量进行计算,会对梯度下降造成什么样的影响呢?我们取两个极端情况来看:

  1. 在不使用批量或批量大小为训练数据大小的情况,这种使用全批量数据来更新参数的方法称为批量梯度下降法(Batch Gradient Descent, BGD)。

    优点:批量梯度下降每次更新更稳定、更准确。

    缺点:需要把所有数据都计算一遍才能更新一次参数,每个回合的计算量大。

  2. 批量大小等于1,即不使用全批量的方法被称为随机梯度下降法(Stochastic Gradient Descent, SGD)。

    优点:使用批量在非凸优化中梯度方向存在噪声有助于逃离局部最小值。每次使用一个批量计算能减少计算量和内存的消耗。

    缺点:更新方向不稳定,曲曲折折震荡,收敛速度较慢。

实际上,上述两类方法的计算的时间和准确率并没有绝对的好坏之分,要依据具体情况来判断。我们假设训练数据的总数 N = 60000 N=60000 N=60000,使用并行计算得到的批量大小与计算时间的关系如下图所示。可以发现大批量虽然一次更新的时间比小批量长,但是在一个回合所用的时间远比小批量短。

虽然大批量更新稳定,小批量梯度方向存在噪声。但实际上使用小批量计算得到的准确率并不一定比全批量计算的准确率要更差,在合适的小批量下反而会更好,如下图所示。

这是由于小批量梯度下降存在噪声造成的,那么小批量梯度下降为什么会存在噪声?

小批量梯度下降是从全批量 N N N中取出一个批量 B 1 B_1 B1,它的损失函数可称为 L 1 L_1 L1。我们在 L 1 L_1 L1中训练遇到临界点同样会卡住,但是在下一个批量 B 2 B_2 B2中它的损失函数也不一定完全与 L 1 L_1 L1曲线重合,它的损失函数可称为 L 2 L_2 L2。在 L 1 L_1 L1时可能是临界点的位置,在 L 2 L_2 L2中就不一定是临界点,训练也就得以继续进行。如下图所示。

因此批量大小的设置对训练是有很大影响的,批量大小是我们需要去调整的超参数。

动量法

动量法是另一种可以逃离临界点的方法。它是对物理世界中惯性的模拟,把误差表面视作斜坡,参数视为小球,小球从斜坡上滚下遇到最低点会借助惯性冲过平缓地带甚至小坡,从而逃离鞍点或局部最小值。

引入动量后,在每次参数更新时,不只是往梯度的反方向移动参数,还要加上上一歩移动的方向来决定移动方向,如下图所示。

初始状态下,参数的移动量为 m 0 = 0 m_0=0 m0=0,参数为 θ 0 \theta_0 θ0

第1次参数更新,参数的移动量为 m 1 = λ m 0 − η g 0 = − η g 0 m_1=\lambda m_0-\eta g_0=-\eta g_0 m1=λm0ηg0=ηg0,参数为 θ 1 = θ 0 + m 1 \theta_1=\theta_0 +m_1 θ1=θ0+m1

第2次参数更新,参数的移动量为 m 2 = λ m 1 − η g 0 = − λ η g 0 − η g 1 m_2=\lambda m_1-\eta g_0=-\lambda \eta g_0-\eta g_1 m2=λm1ηg0=ληg0ηg1,参数为 θ 2 = θ 1 + m 2 \theta_2=\theta_1 +m_2 θ2=θ1+m2

其中 η \eta η为学习率, λ \lambda λ为前一个方向的权重参数。动量法的移动量公式为: m n = λ m n − 1 − η g n − 1 m_n=\lambda m_{n-1}-\eta g_{n-1} mn=λmn1ηgn1

我们通过上述步骤我们可以从两个角度来理解动量法:

  1. 动量是梯度的反方向加上上一次移动的方向;
  2. 动量法更新的方向不止考虑当前的梯度,而是考虑过去所有梯度的总和。

参考资料

深度学习详解:Releases · datawhalechina/leedl-tutorial (github.com)

Datawhale学习者手册:https://datawhaler.feishu.cn/wiki/FfmVwc5YwiUvp5k3aiRcONlInsh

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值