将AI拉下神坛(五):拎不清反向传播、梯度下降?原来底层数学原理高中就学过!

前些篇章,我们通过实践证明了神经网络训练的可行性(测试集的准确率是不断提高的)。但是,pytorch框架将太多的复杂的细节都隐藏起来了,即便我们已经训练出来一个模型,我们却或许不清楚模型可以可以被训练出来的原理。比如: 模型的参数在训练过程中是怎样被修正的?

答案是借助 「反向传播」「梯度下降」

让我们逐步来理解Ta们是怎样在模型训练过程中修正参数的。

1 损失函数

将训练数据输入到神经网络,得到预测结果,预测结果和真实结果(标注的Label)是有差异的。我们通过一个函数来描述 预测结果真实结果 之间的差异,Ta就是 损失函数。

不难理解,训练的过程就是一个 让损失函数取值越来越小 的过程。

如果我们将损失函数表示为 FLoss,神经网络的输入表示为 X(大写字母表示它为向量),权重参数为W,那么损失:

loss = FLoss(X, W)

从推理角度讲,显然:我们的权重 W 是常量(不变的),而输入 X 是变量(我们会对不同的输入进行推理),那么损失loss是一个关于 X 的函数。

此时,损失即y,输入即x

此时,损失即y,输入即x。

但是,在训练过程中,场景完全翻转!

此时,损失依然是y,但作为训练数据和标注(真实结果)确成为了不变的常量,我们要调整的权重参数W反而成为了变量,此时:

损失loss是一个关于 W 的函数!

我们很多时候对于「反向传播」「梯度下降」在神经网络训练中的应用总是感觉朦胧,就在于常量变量的认知总是停留在推理场景下;而在训练场景下,loss 函数的常量变量与推理时完全相反,关键概念认知的误差就很容易让我们在探究训练原理时懵圈。所以,一定要记住:

- 训练过程中,损失loss是关于权重W的函数 -

认知了这点,我们可以继续理解 「反向传播」

2 反向传播

神经网路是有很多”层“的。

4层神经网络示例,现在的神经网络,百层也不再稀奇

如图:第0层的输出为第1层的输入,第1层的输出为第2层的输入,以此类推,第n-1层的输出为第n层的输入,第n层的输出则为最终预测结果输出 out_predict

神经网络的每层操作也可以表示为一个函数,比如:
O1 = F1(O0, W1)
O2 = F2(O1, W2)
...
out_prefict = On = Fn(On-1, Wn)
loss = Floss(out_prefict, out_real) = Floss(Fn(On-1, Wn), out_real)

每一层网络进行计算都需要大量的权重参数 W(图片中的连线),我们在训练过程中要对每一个参数(连线)的值进行调整。

loss为转变为Wn的函数

因为 loss 首先被转换为的是Wn的函数,所以我们首先修正的也是 Wn。接下来,我们将Fn(On-1, Wn)展开到On-1层:

loss为转变为Wn-1的函数

则可以继续修正Wn-1,依次类推,直到完成W1的修正。

那么,我们发现,权重参数修正的顺序推理的顺序是相反的:

推理:计算第1层输出->计算第2层输出->...-->计算第n层输出
W修正:修正第n层->修正第n-1层->...-->修正第1层

所以,我们将模型权重参数的修正称过程称之为 反向传播。

那么,问题又来了:
每一层的权重参数是如何修正的?

3 梯度下降

答案是通过梯度下降法,梯度下降可以帮我们找到某个函数的最小值(或者讲局部最小值)。
下面,我们通过升维的方法来理解Ta。

3.1 一元函数的梯度下降理解

一元函数

如图,从图上很容易看出来,y的最小值点在xmin处取得。那么,x0, x1点若想向xmin处移动……图上我们可以看出,x0处,我们希望x变大;x1处,我们期望x变小,即 将 x 向梯度下降的方向移动

梯度 的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

我们可以计算出 x0,x1处的斜率:

斜率示例

斜率为正,表示y随着x的增大而增大
斜率为负,表示y随着x的增大而减小

我们用k0,k1表示x0,x1处的斜率值,用 a 表示一个无限小的乘数(比如你可以理解为 0.000001),则:

y0' = f(x0 - a * k0) < f(x0) = y0
y1' = f(x1 - a * k1) < f(x1) = y1

即我们找到了一个统一的公式描述 x 的变化,让 y' < y

yn' = f(xn - a * kn) < f(xn) = yn

3.2 二元函数的梯度下降理解

基于二元函数的梯度下降的解释,网上也是最多的,它通常被类比成一个下山问题。

二元函数,三维空间梯度下降示意

我们用函数z表示曲面:z = f(x,y)
并希望通过 x、y 的变化使 z 取得最小值。
梯度下降的策略即为持续寻找 z',使 z' < z
方法即为将函数 f(x,y) 分别在 x,y 方向上面求偏导,然后组合成二维向量作为梯度方向,再朝着梯度相反(下降)的方向移动 x,y

zn' = f(xn - a * kxn, yn - a * kyn) < f(xn, yn) = zn

3.3 多元函数的梯度下降理解

在神经网络的世界中,「元」往往是成千上万,甚至上亿的,我们无法用图片进行有效的表达(因为我们难以绘制多维空间)。但基于数学公式,我们依然可以计算出某个点(100维空间的点则由100个数字组成)的梯度方向,依然可以再某个具体点上沿着梯度下降的方向移动一小步,让新的「位置」计算出来的函数值比之前的位置的函数值小

4 回顾

回到我们最初的问题,模型的参数在训练过程中是怎样被修正的?你有更深的理解了么?
当我们理解了「反向传播」与「梯度下降」,我们终于发现了神器的神经网络训练与我们学过的额数学知识的强关联:求导,求偏导……

虽然这些任务不需要我们自己处理(框架已经做好),但清楚了原理总让我们感到……

好舒服啊~:)

往期回顾

将AI拉下神坛(一):黑白纸片摆出的神经网络
将AI拉下神坛(二):重复的学习居然真的有效!来来,先将课文抄写100遍!
将AI拉下神坛(三):从OCR的应用过程到模型推理抽象
将AI拉下神坛(四):越挫越勇,在对抗中创造!你可以轻松地认知GAN的存在。

你可能感兴趣的:(将AI拉下神坛(五):拎不清反向传播、梯度下降?原来底层数学原理高中就学过!)