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

详解,神经网络,反向,传播,梯度,下降 · 浏览次数 : 102

小编点评

##梯度下降《动手学习深度学习11章-优化算法》 **1.简介** 梯度下降法是深度学习中常用的优化算法,用于求模型参数的最佳值。它基于梯度值计算模型参数的更新方向,并通过不断更新参数来逼近最佳值。 **2.基本原理** 梯度下降法的核心原理是梯度值。梯度值是模型参数在某个方向的变化率,它表示对于该方向的更新方向。 **3.梯度值** 梯度值是模型参数在某方向的变化率,它表示对于该方向的更新方向。 **4.更新方向** 根据梯度值,更新模型参数的方向和大小。更新方向用负梯度值表示,更新大小用步长值表示。 **5.优化算法** 梯度下降法常用于深度学习中的优化算法,包括: * **小批量随机梯度下降 (minibatch SGD)**:使用小批量随机梯度下降降低计算成本。 * **全梯度下降 (full gradient)**:使用完整数据集计算梯度,提升效率。 **6.其他方法** 除了小批量随机梯度下降和全梯度下降,还有其他优化方法,如: * **梯度下降法中的无偏估计**:通过样本统计量估计总体参数。 * ****梯度下降法中的动性学习率**:根据训练数据动态调整学习率。 **7.参考资料** * **梯度下降《动手学习深度学习11章-优化算法》** * **AI-EDU: 梯度下降《动手学习深度学习11章-优化算法》** * **归纳总结以上内容,生成内容时需要带简单的排版**

正文

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

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

一,前向传播与反向传播

1.1,神经网络训练过程

神经网络训练过程是:

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

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

1.2,前向传播

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

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

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

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)很少直接用于深度学习,但理解它是理解随机梯度下降和小批量随机梯度下降算法的基础。

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

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

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

2.3,梯度下降原理

梯度下降的数学公式:

其中:

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

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

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

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

双变量凸函数 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 的值有不同的变化:

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

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

3.1,随机梯度下降

在深度学习中,目标函数通常是训练数据集中每个样本的损失函数的平均值。如果使用梯度下降法,则每个自变量迭代的计算代价为 O(n),它随 n(样本数目)线性增⻓。因此,当训练数据集较大时,每次迭代的梯度下降计算代价将较高。

随机梯度下降(SGD)可降低每次迭代时的计算代价。在随机梯度下降的每次迭代中,我们对数据样本随机均匀采样一个索引 i,其中 i∈1,...,n,并计算梯度 ∇J(θ)以更新权重参数 θ:

每次迭代的计算代价从梯度下降的 O(n) 降至常数 O(1)。另外,值得强调的是,随机梯度 ∇Ji(θ) 是对完整梯度 ∇J(θ) 的无偏估计。

无偏估计是用样本统计量来估计总体参数时的一种无偏推断。

在实际应用中,随机梯度下降 SGD 法必须和动态学习率方法结合起来使用,否则使用固定学习率 + SGD的组合会使得模型收敛过程变得更复杂。

3.2,小批量随机梯度下降

前面讲的梯度下降(GD)和随机梯度下降(SGD)方法都过于极端,要么使用完整数据集来计算梯度并更新参数,要么一次只处理一个训练样本来更新参数。在实际项目中,会对两者取折中,即小批量随机梯度下降(minibatch gradient descent),使用小批量随机梯度下降还可以提高计算效率。

小批量的所有样本数据元素都是从训练集中随机抽出的,样本数目个数为 batch_size(缩写 bs)

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

参考资料

  1. 如何理解梯度下降法?
  2. AI-EDU: 梯度下降
  3. 《动手学习深度学习11章-优化算法》

 

 

点击关注,第一时间了解华为云新鲜技术~

与详解神经网络中反向传播和梯度下降相似的内容:

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

摘要:反向传播指的是计算神经网络参数梯度的方法。 本文分享自华为云社区《反向传播与梯度下降详解》,作者:嵌入式视觉 。 一,前向传播与反向传播 1.1,神经网络训练过程 神经网络训练过程是: 先通过随机参数“猜“一个结果(模型前向传播过程),这里称为预测结果 a; 然后计算 a 与样本标签值 y 的

详解神经网络基础部件BN层

摘要:在深度神经网络训练的过程中,由于网络中参数变化而引起网络中间层数据分布发生变化的这一过程被称为内部协变量偏移(Internal Covariate Shift),而 BN 可以解决这个问题。 本文分享自华为云社区《神经网络基础部件-BN层详解》,作者:嵌入式视觉 。 一,数学基础 1.1,概率

神经网络中神经元的权重更新

前段时间写过一篇介绍神经网络的入门文章:神经网络极简入门。那篇文章介绍了神经网络中的基本概念和原理,并附加了一个示例演示如何实现一个简单的神经网络。 不过,在那篇文章中并没有详细介绍神经网络在训练时,是如何一步步找到每个神经元的最优权重的。本篇介绍神经网络训练时,常用的一种权重更新的方式--梯度下降

循环神经网络RNN完全解析:从基础理论到PyTorch实战

>在本文中,我们深入探讨了循环神经网络(RNN)及其高级变体,包括长短时记忆网络(LSTM)、门控循环单元(GRU)和双向循环神经网络(Bi-RNN)。文章详细介绍了RNN的基本概念、工作原理和应用场景,同时提供了使用PyTorch构建、训练和评估RNN模型的完整代码指南。 > 作者 TechLea

详解ResNet 网络,如何让网络变得更“深”了

摘要:残差网络(ResNet)的提出是为了解决深度神经网络的“退化”(优化)问题。ResNet 通过设计残差块结构,调整模型结构,让更深的模型能够有效训练更训练。 本文分享自华为云社区《Backbone 网络-ResNet 网络详解》,作者: 嵌入式视觉 。 摘要 残差网络(ResNet)的提出是为

何为神经网络卷积层?

摘要:本文深度讲解了卷积计算的原理,并详细介绍了构成所有卷积网络主干的基本元素,包括卷积层本身、填充和步幅的基本细节、用于在相邻区域汇聚信息的汇聚层,最后给出卷积层和汇聚层的代码示例和CNN框架结构图。 本文分享自华为云社区《神经网络基础部件-卷积层详解》,作者: 嵌入式视觉 。 前言 在全连接层构

【带你读论文】向量表征经典之DeepWalk

摘要:详细讲解DeepWalk,通过随机游走的方式对网络化数据做一个表示学习,它是图神经网络的开山之作,借鉴了Word2vec的思想。 本文分享自华为云社区《[论文阅读] (25) 向量表征经典之DeepWalk:从Word2vec到DeepWalk,再到Asm2vec和Log2vec》,作者:ea

Pytorch 最全入门介绍,Pytorch入门看这一篇就够了

> 本文通过详细且实践性的方式介绍了 PyTorch 的使用,包括环境安装、基础知识、张量操作、自动求导机制、神经网络创建、数据处理、模型训练、测试以及模型的保存和加载。 # 1. Pytorch简介 ![file](https://img2023.cnblogs.com/other/488581/

详解C#委托与事件

在C#中,委托是一种引用类型的数据类型,允许我们封装方法的引用。通过使用委托,我们可以将方法作为参数传递给其他方法,或者将多个方法组合在一起,从而实现更灵活的编程模式。委托类似于函数指针,但提供了类型安全和垃圾回收等现代语言特性。 基本概念 定义委托 定义委托需要指定它所代表的方法的原型,包括返回类

详解Web应用安全系列(8)不足的日志记录和监控

在Web安全领域,不足的日志记录和监控是一个重要的安全隐患,它可能导致攻击者能够更隐蔽地进行攻击,同时增加了攻击被检测和响应的难度。以下是对Web攻击中不足的日志记录和监控漏洞的详细介绍。 一、日志记录不足的问题 日志缺失或不完整 关键操作未记录:如用户登录、敏感数据访问、系统管理员操作等关键操作未