深度学习之反向传播与梯度下降详解

您所在的位置:网站首页 简述户外运动保护站设置与下降过程 深度学习之反向传播与梯度下降详解

深度学习之反向传播与梯度下降详解

2024-07-16 04:00| 来源: 网络整理| 查看: 265

一,前向传播与反向传播 1.1,神经网络训练过程1.2,前向传播1.3,反向传播1.4,总结 二,梯度下降 2.1,深度学习中的优化2.2,如何理解梯度下降法2.3,梯度下降原理 三,随机梯度下降与小批量随机梯度下降 3.1,随机梯度下降3.2,小批量随机梯度下降 四,总结参考资料 一,前向传播与反向传播 1.1,神经网络训练过程

神经网络训练过程是:

先通过随机参数“猜“一个结果(模型前向传播过程),这里称为预测结果 a a a;然后计算 a a a 与样本标签值 y y y 的差距(即损失函数的计算过程);随后通过反向传播算法更新神经元参数,使用新的参数再试一次,这一次就不是“猜”了,而是有依据地向正确的方向靠近,毕竟参数的调整是有策略的(基于梯度下降策略)。

以上步骤如此反复多次,一直到预测结果和真实结果之间相差无几,亦即 ∣ a − y ∣ → 0 |a-y|\rightarrow 0 ∣a−y∣→0,则训练结束。

总结:所谓模型训练,其实就是通过如 SGD 优化算法指导模型参数更新的过程。

1.2,前向传播

前向传播(forward propagation 或 forward pass)指的是: 按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。

为了更深入理解前向传播的计算过程,我们可以根据网络结构绘制网络的前向传播计算图。下图是简单网络与对应的计算图示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8GitLOJ-1691805706216)(../images/bp/网络结构与前向计算图.png)]

其中正方形表示变量,圆圈表示操作符。数据流的方向是从左到右依次计算。

1.3,反向传播

反向传播(backward propagation,简称 BP)指的是计算神经网络参数梯度的方法。其原理是基于微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络,依次计算每个中间变量和参数的梯度。

梯度的自动计算(自动微分)大大简化了深度学习算法的实现。

注意,反向传播算法会重复利用前向传播中存储的中间值,以避免重复计算,因此,需要保留前向传播的中间结果,这也会导致模型训练比单纯的预测需要更多的内存(显存)。同时这些中间结果占用内存(显存)大小与网络层的数量和批量(batch_size)大小成正比,因此使用大 batch_size 训练更深层次的网络更容易导致内存不足(out of memory)的错误!

1.4,总结 前向传播在神经网络定义的计算图中按顺序计算和存储中间变量,它的顺序是从输入层到输出层。反向传播按相反的顺序(从输出层到输入层)计算和存储神经网络的中间变量和参数的梯度。在训练神经网络时,在初始化模型参数后,我们交替使用前向传播和反向传播,基于反向传播计算得到的梯度,结合随机梯度下降优化算法(或者 Adam 等其他优化算法)来更新模型参数。深度学习模型训练比预测需要更多的内存。 二,梯度下降 2.1,深度学习中的优化

大多数深度学习算法都涉及某种形式的优化。优化器的目的是更新网络权重参数,使得我们平滑地到达损失面中损失值的最小点。

深度学习优化存在许多挑战。其中一些最令人烦恼的是局部最小值、鞍点和梯度消失。

局部最小值(local minimum): 对于任何目标函数 f ( x ) f(x) f(x),如果在 x x x 处对应的 f ( x ) f(x) f(x) 值小于在 x x x 附近任何其他点的 f ( x ) f(x) f(x) 值,那么 f ( x ) f(x) f(x) 可能是局部最小值。如果 f ( x ) f(x) f(x) 在 x x x 处的值是整个域上目标函数的最小值,那么 f ( x ) f(x) f(x) 是全局最小值。鞍点(saddle point): 指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。梯度消失(vanishing gradient): 因为某些原因导致目标函数 f f f 的梯度接近零(即梯度消失问题),是在引入 ReLU 激活函数和 ResNet 之前训练深度学习模型相当棘手的原因之一。

在深度学习中,大多数目标函数都很复杂,没有解析解,因此,我们需使用数值优化算法,本文中的优化算法: SGD 和 Adam 都属于此类别。

2.2,如何理解梯度下降法

梯度下降(gradient descent, GD)算法是神经网络模型训练中最为常见的优化器。尽管梯度下降(gradient descent)很少直接用于深度学习,但理解它是理解随机梯度下降和小批量随机梯度下降算法的基础。

大多数文章都是以“一个人被困在山上,需要迅速下到谷底”来举例理解梯度下降法,但这并不完全准确。在自然界中,梯度下降的最好例子,就是泉水下山的过程:

水受重力影响,会在当前位置,沿着最陡峭的方向流动,有时会形成瀑布(梯度的反方向为函数值下降最快的方向);水流下山的路径不是唯一的,在同一个地点,有可能有多个位置具有同样的陡峭程度,而造成了分流(可以得到多个解);遇到坑洼地区,有可能形成湖泊,而终止下山过程(不能得到全局最优解,而是局部最优解)。

示例参考 AI-EDU: 梯度下降。

2.3,梯度下降原理

梯度下降的数学公式:

θ n + 1 = θ n − η ⋅ ∇ J ( θ ) (1) \theta_{n+1} = \theta_{n} - \eta \cdot \nabla J(\theta) \tag{1} θn+1​=θn​−η⋅∇J(θ)(1)

其中:

θ n + 1 \theta_{n+1} θn+1​:下一个值(神经网络中参数更新后的值); θ n \theta_n θn​:当前值(当前网络参数值); − - −:减号,梯度的反向(梯度的反方向为函数值下降最快的方向); η \eta η:学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长(需要手动调整的超参数); ∇ \nabla ∇:梯度,,表示函数当前位置的最快上升点(梯度向量指向上坡,负梯度向量指向下坡); J ( θ ) J(\theta) J(θ):函数(等待优化的目标函数)。

下图展示了梯度下降法的步骤。梯度下降的目的就是使得 x x x 值向极值点逼近。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYJB65oW-1691805706216)(../images/bp/gd_concept.png)]

下面我通过一个简单的双变量凸函数 J ( x , y ) = x 2 + 2 y 2 J(x, y) = x^2 + 2y^2 J(x,y)=x2+2y2 为例,来描述梯度下降的优化过程。

通过梯度下降法寻找函数的最小值,首先得计算其函数梯度:

∂ J ( x , y ) ∂ x = 2 x ∂ J ( x , y ) ∂ y = 4 y {\partial{J(x,y)} \over \partial{x}} = 2x \\ {\partial{J(x,y)} \over \partial{y}} = 4y ∂x∂J(x,y)​=2x∂y∂J(x,y)​=4y

设初始点为 ( x 0 , y 0 ) = ( − 3 , − 3 ) (x_0, y_0) = (-3, -3) (x0​,y0​)=(−3,−3),学习率 η = 0.1 \eta = 0.1 η=0.1,根据梯度下降公式(1),可得参数迭代过程的计算公式:

( x n + 1 , y n + 1 ) = ( x n , y n ) − η ⋅ ∇ J ( x , y ) = ( x n , y n ) − η ⋅ ( 2 x , 4 y ) \begin{align} (x_{n+1}, y_{n+1}) &= (x_n, y_n) - \eta \cdot \nabla J(x, y) \nonumber \\ &= (x_n, y_n) - \eta \cdot (2x, 4y) \tag{2} \end{align} (xn+1​,yn+1​)​=(xn​,yn​)−η⋅∇J(x,y)=(xn​,yn​)−η⋅(2x,4y)​(2)​

这里手动计算下下一个迭代点的值:

( x 1 , y 1 ) = ( − 3 , − 3 ) − 0.1 ∗ ( 2 ∗ − 3 , 4 ∗ − 3 ) = ( − 3 + 0.6 , − 3 + 1.2 ) = ( − 2.4 , − 1.8 ) \begin{aligned} (x_1, y_1) &= (-3, -3) - 0.1*(2*-3, 4*-3) \\ &= (-3 + 0.6, -3 + 1.2) \\ &= (-2.4, -1.8) \\ \end{aligned} (x1​,y1​)​=(−3,−3)−0.1∗(2∗−3,4∗−3)=(−3+0.6,−3+1.2)=(−2.4,−1.8)​

根据上述公式 (2),假设终止条件为 J ( x , y ) J(x,y) J(x,y) < 0. 005,迭代过程如下表1所示。

表1 双变量函数梯度下降的迭代过程

迭代次数 x x x y y y J ( x , y ) J(x,y) J(x,y)1-3-3272-2.4y=-1.812.24…………16-0.084442-0.0008460.00713217-0.067554y=-0.0005080.004564

迭代 17 17 17 次后, J ( x , y ) J(x,y) J(x,y) 的值为 0.004564 0.004564 0.004564,满足小于 0.005 0.005 0.005 的条件,停止迭代。

由于是双变量,所以梯度下降的迭代过程需要用三维图来解释。表2可视化了三维空间内的梯度下降过程。

| 观察角度1                    | 观察角度2                    |
| ------------------------------------------------ | ------------------------------------------------ |
| | |

图中间那条隐隐的黑色线,表示梯度下降的过程,从红色的高地一直沿着坡度向下走,直到蓝色的洼地。

双变量凸函数 J ( x , y ) = x 2 + 2 y 2 J(x, y) = x^2 + 2y^2 J(x,y)=x2+2y2 的梯度下降优化过程以及可视化代码如下所示:

# Copyright (c) Microsoft. All rights reserved. # Licensed under the MIT license. See LICENSE file in the project root for full license information. import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def target_function(x,y): J = pow(x, 2) + 2*pow(y, 2) return J def derivative_function(theta): x = theta[0] y = theta[1] return np.array([2*x, 4*y]) def show_3d_surface(x, y, z): fig = plt.figure() ax = Axes3D(fig) u = np.linspace(-3, 3, 100) v = np.linspace(-3, 3, 100) X, Y = np.meshgrid(u, v) R = np.zeros((len(u), len(v))) for i in range(len(u)): for j in range(len(v)): R[i, j] = pow(X[i, j], 2)+ 4*pow(Y[i, j], 2) ax.plot_surface(X, Y, R, cmap='rainbow') plt.plot(x, y, z, c='black', linewidth=1.5, marker='o', linestyle='solid') plt.show() if __name__ == '__main__': theta = np.array([-3, -3]) # 输入为双变量 eta = 0.1 # 学习率 error = 5e-3 # 迭代终止条件,目标函数值 < error X = [] Y = [] Z = [] for i in range(50): print(theta) x = theta[0] y = theta[1] z = target_function(x,y) X.append(x) Y.append(y) Z.append(z) print("%d: x=%f, y=%f, z=%f" % (i,x,y,z)) d_theta = derivative_function(theta) print(" ", d_theta) theta = theta - eta * d_theta if z 1,除非显卡显存不够了,才会设置 batch_size = 1。

四,总结

虽然随机梯度下降法(SGD)简单有效,但它需要仔细调整模型超参数,特别是优化中使用的学习率,以及模型参数的初始值。 由于每一层的输入都受到前面所有层的参数的影响,因此训练变得很复杂。(因为随着网络变得更深,网络参数的微小变化会被累积和放大)

参考资料 如何理解梯度下降法?AI-EDU: 梯度下降《动手学习深度学习11章-优化算法》


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3