0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解神经网络中反向传播和梯度下降

OSC开源社区 来源:OSCHINA 社区 2023-03-14 11:07 次阅读

来源| OSCHINA 社区

作者 | 华为云开发者联盟-嵌入式视觉

摘要:反向传播指的是计算神经网络参数梯度的方法。

本文分享自华为云社区《反向传播与梯度下降详解》,作者:嵌入式视觉 。

一,前向传播与反向传播

1.1,神经网络训练过程

神经网络训练过程是:

先通过随机参数 “猜 “一个结果(模型前向传播过程),这里称为预测结果a;

然后计算a与样本标签值 y 的差距(即损失函数的计算过程);

随后通过反向传播算法更新神经元参数,使用新的参数再试一次,这一次就不是 “猜” 了,而是有依据地向正确的方向靠近,毕竟参数的调整是有策略的(基于梯度下降策略)。

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

1.2,前向传播

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

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

3d7a6052-bfa5-11ed-bfe3-dac502259ad0.jpg

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

1.3,反向传播

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

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

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

1.4,总结

前向传播在神经网络定义的计算图中按顺序计算和存储中间变量,它的顺序是从输入层到输出层。

反向传播按相反的顺序 (从输出层到输入层) 计算和存储神经网络的中间变量和参数的梯度。

在训练神经网络时,在初始化模型参数后,我们交替使用前向传播和反向传播,基于反向传播计算得到的梯度,结合随机梯度下降优化算法(或者 Adam 等其他优化算法)来更新模型参数。

深度学习模型训练比预测需要更多的内存。

二,梯度下降

2.1,深度学习中的优化

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

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

局部最小值(local minimum): 对于任何目标函数 f (x),如果在 x 处对应的 f (x) 值小于在x附近任何其他点的 f (x) 值,那么 f (x) 可能是局部最小值。如果 f (x) 在x处的值是整个域上目标函数的最小值,那么f(x) 是全局最小值。

鞍点(saddle point): 指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。

梯度消失(vanishing gradient): 因为某些原因导致目标函数f的梯度接近零(即梯度消失问题),是在引入 ReLU 激活函数和 ResNet 之前训练深度学习模型相当棘手的原因之一。

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

2.2,如何理解梯度下降法

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

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

水受重力影响,会在当前位置,沿着最陡峭的方向流动,有时会形成瀑布(梯度的反方向为函数值下降最快的方向);

水流下山的路径不是唯一的,在同一个地点,有可能有多个位置具有同样的陡峭程度,而造成了分流(可以得到多个解);

遇到坑洼地区,有可能形成湖泊,而终止下山过程(不能得到全局最优解,而是局部最优解)。

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

2.3,梯度下降原理

梯度下降的数学公式:

3d918868-bfa5-11ed-bfe3-dac502259ad0.png

其中:

θn+1:下一个值(神经网络中参数更新后的值);

θn:当前值(当前参数值);

−:减号,梯度的反向(梯度的反方向为函数值下降最快的方向);

η:学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长(需要手动调整的超参数);

∇:梯度,函数当前位置的最快上升点(梯度向量指向上坡,负梯度向量指向下坡);

J (θ):函数(等待优化的目标函数)。

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

3dadba10-bfa5-11ed-bfe3-dac502259ad0.png

3dcbba7e-bfa5-11ed-bfe3-dac502259ad0.jpg

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

3de33a64-bfa5-11ed-bfe3-dac502259ad0.jpg

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

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

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 < error:
 break
    show_3d_surface(X,Y,Z)
注意!总结下,不同的步长 η ,随着迭代次数的增加,会导致被优化函数 J 的值有不同的变化:

3df814de-bfa5-11ed-bfe3-dac502259ad0.png

图片来源如何理解梯度下降法?。

三,随机梯度下降与小批量随机梯度下降

3.1,随机梯度下降

在深度学习中,目标函数通常是训练数据集中每个样本的损失函数的平均值。如果使用梯度下降法,则每个自变量迭代的计算代价为 O (n),它随 n(样本数目)线性增⻓。因此,当训练数据集较大时,每次迭代的梯度下降计算代价将较高。 随机梯度下降 (SGD) 可降低每次迭代时的计算代价。在随机梯度下降的每次迭代中,我们对数据样本随机均匀采样一个索引 i,其中 i∈1,...,n,并计算梯度 ∇J (θ) 以更新权重参数 θ: 3e1448de-bfa5-11ed-bfe3-dac502259ad0.png

每次迭代的计算代价从梯度下降的 O (n) 降至常数 O (1)。另外,值得强调的是,随机梯度 ∇Ji (θ) 是对完整梯度 ∇J (θ) 的无偏估计。 无偏估计是用样本统计量来估计总体参数时的一种无偏推断。 在实际应用中,随机梯度下降 SGD 法必须和动态学习率方法结合起来使用,否则使用固定学习率 + SGD 的组合会使得模型收敛过程变得更复杂。

3.2,小批量随机梯度下降

前面讲的梯度下降(GD)和随机梯度下降(SGD)方法都过于极端,要么使用完整数据集来计算梯度并更新参数,要么一次只处理一个训练样本来更新参数。在实际项目中,会对两者取折中,即小批量随机梯度下降 (minibatch gradient descent),使用小批量随机梯度下降还可以提高计算效率。 小批量的所有样本数据元素都是从训练集中随机抽出的,样本数目个数为 batch_size(缩写 bs) 3e2a2384-bfa5-11ed-bfe3-dac502259ad0.png

另外,一般项目中使用 SGD 优化算法都默认会使用小批量随机梯度下降,即 batch_size > 1,除非显卡显存不够了,才会设置 batch_size = 1。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4576

    浏览量

    98802
  • 参数
    +关注

    关注

    11

    文章

    1398

    浏览量

    31482
  • 函数
    +关注

    关注

    3

    文章

    3911

    浏览量

    61317
  • 模型
    +关注

    关注

    1

    文章

    2709

    浏览量

    47716
  • 深度学习
    +关注

    关注

    73

    文章

    5240

    浏览量

    119936

原文标题:详解神经网络中反向传播和梯度下降

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    从零开始学习用Python构建神经网络

    内容涵盖神经网络定义、损失函数、前向传播反向传播梯度下降算法,对于想要了解深度学习运作原理的
    的头像 发表于 05-30 08:54 1w次阅读
    从零开始学习用Python构建<b class='flag-5'>神经网络</b>

    神经网络教程(李亚非)

    神经元  第3章 EBP网络(反向传播算法)  3.1 含隐层的前馈网络的学习规则  3.2 Sigmoid激发函数下的BP算法  3.3
    发表于 03-20 11:32

    AI知识科普 | 从无人相信到万人追捧的神经网络

    误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成,是一种应用最为广泛的神经网络
    发表于 06-05 10:11

    【案例分享】基于BP算法的前馈神经网络

    传播的,不会回流),区别于循环神经网络RNN。BP算法(Back Propagation):误差反向传播算法,用于更新网络
    发表于 07-21 04:00

    神经网络反向传播算法

    03_深度学习入门_神经网络反向传播算法
    发表于 09-12 07:08

    【AI学习】第3篇--人工神经网络

    `本篇主要介绍:人工神经网络的起源、简单神经网络模型、更多神经网络模型、机器学习的步骤:训练与预测、训练的两阶段:正向推演与反向传播、以Te
    发表于 11-05 17:48

    如何构建神经网络

    原文链接:http://tecdat.cn/?p=5725 神经网络是一种基于现有数据创建预测的计算系统。如何构建神经网络神经网络包括:输入层:根据现有数据获取输入的层隐藏层:使用反向
    发表于 07-12 08:02

    卷积神经网络模型发展及应用

    陷入了近二十年的停滞。1986 年到 1988 年是神经网络模型发展的第二阶段,称为第二 代神经网络模型。1986 年 Rumelhart 等人提出了误 差反向传播算法(back
    发表于 08-02 10:39

    解读多层神经网络反向传播原理

    要训练神经网络,我们需要“训练数据集”。训练数据集是由对应目标z(期望输出)的输入信号(x_1和 x_2)组成。神经网络的训练是一个迭代过程。在每个迭代中,使用来自训练数据集的新数据修改网络节点的加权系数。整个迭代由前向计算和
    发表于 10-18 18:20 8288次阅读
    解读多层<b class='flag-5'>神经网络</b><b class='flag-5'>反向</b><b class='flag-5'>传播</b>原理

    基于BP神经网络的辨识

    基于BP神经网络的辨识,1986年,Rumelhart等提出了误差反向传播神经网络,简称BP网络(Back Propagation),该
    发表于 12-06 15:11 0次下载

    基于Numpy实现神经网络反向传播

    和DeepMind数据科学家、Udacity深度学习导师Andrew Trask一起,基于Numpy手写神经网络,更深刻地理解反向传播这一概念。
    的头像 发表于 04-01 09:29 4821次阅读
    基于Numpy实现<b class='flag-5'>神经网络</b>:<b class='flag-5'>反向</b><b class='flag-5'>传播</b>

    手动设计一个卷积神经网络(前向传播反向传播

    本文主要写卷积神经网络如何进行一次完整的训练,包括前向传播反向传播,并自己手写一个卷积神经网络
    的头像 发表于 05-28 10:35 1.8w次阅读
    手动设计一个卷积<b class='flag-5'>神经网络</b>(前向<b class='flag-5'>传播</b>和<b class='flag-5'>反向</b><b class='flag-5'>传播</b>)

    卷积神经网络的权值反向传播机制和MATLAB的实现方法

    降低了网络需要训练的数量级。本文以MINST手写体数据库为训练样本,讨论卷积神经网络的权值反向传播机制和MATLAB的实现方法;对激活函数tanh和relu
    发表于 12-06 15:29 14次下载

    浅析深度神经网络(DNN)反向传播算法(BP)

    在 深度神经网络(DNN)模型与前向传播算法 中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Bac
    的头像 发表于 03-22 16:28 3223次阅读
    浅析深度<b class='flag-5'>神经网络</b>(DNN)<b class='flag-5'>反向</b><b class='flag-5'>传播</b>算法(BP)

    BP(BackPropagation)反向传播神经网络介绍及公式推导

    BP(BackPropagation)反向传播神经网络介绍及公式推导(电源和地电气安全间距)-该文档为BP(BackPropagation)反向传播
    发表于 07-26 10:31 48次下载
    BP(BackPropagation)<b class='flag-5'>反向</b><b class='flag-5'>传播</b><b class='flag-5'>神经网络</b>介绍及公式推导