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

来源 | oschina 社区
作者 | 华为云开发者联盟-嵌入式视觉
摘要:反向传播指的是计算神经网络参数梯度的方法。
本文分享自华为云社区《反向传播与梯度下降详解》,作者:嵌入式视觉 。
一,前向传播与反向传播
1.1,神经网络训练过程
神经网络训练过程是:
先通过随机参数 “猜 “一个结果(模型前向传播过程),这里称为预测结果 a;
然后计算 a 与样本标签值 y 的差距(即损失函数的计算过程);
随后通过反向传播算法更新神经元参数,使用新的参数再试一次,这一次就不是 “猜” 了,而是有依据地向正确的方向靠近,毕竟参数的调整是有策略的(基于梯度下降策略)。
以上步骤如此反复多次,一直到预测结果和真实结果之间相差无几,亦即 ∣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) 很少直接用于深度学习,但理解它是理解随机梯度下降和小批量随机梯度下降算法的基础。
大多数文章都是以 “一个人被困在山上,需要迅速下到谷底” 来举例理解梯度下降法,但这并不完全准确。在自然界中,梯度下降的最好例子,就是泉水下山的过程:
水受重力影响,会在当前位置,沿着最陡峭的方向流动,有时会形成瀑布(梯度的反方向为函数值下降最快的方向);
水流下山的路径不是唯一的,在同一个地点,有可能有多个位置具有同样的陡峭程度,而造成了分流(可以得到多个解);
遇到坑洼地区,有可能形成湖泊,而终止下山过程(不能得到全局最优解,而是局部最优解)。
示例参考 ai-edu: 梯度下降。
2.3,梯度下降原理
梯度下降的数学公式:
其中:
θn+1:下一个值(神经网络中参数更新后的值);
θn:当前值(当前参数值);
−:减号,梯度的反向(梯度的反方向为函数值下降最快的方向);
η:学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长(需要手动调整的超参数);
∇:梯度,函数当前位置的最快上升点(梯度向量指向上坡,负梯度向量指向下坡);
j (θ):函数(等待优化的目标函数)。
下图展示了梯度下降法的步骤。梯度下降的目的就是使得 x 值向极值点逼近。
由于是双变量,所以梯度下降的迭代过程需要用三维图来解释。表 2 可视化了三维空间内的梯度下降过程。
图中间那条隐隐的黑色线,表示梯度下降的过程,从红色的高地一直沿着坡度向下走,直到蓝色的洼地。
双变量凸函数 j (x,y)=x2+2y2 的梯度下降优化过程以及可视化代码如下所示:
import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import axes3ddef target_function(x,y): j = pow(x, 2) + 2*pow(y, 2) return jdef 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。


DTU新功能-通过HTTP协议访问Web端直接控制管理设备
分析rc低通滤波器的工作原理以及特性
led显示屏控制软件有哪些_九个led显示屏控制软件介绍
比克电池与十余家新能源供应商签订战略合作框架协议 将推进新能源行业蓬勃发展
华为与思科的战争:谁是国内ICT市场第一?
详解神经网络中反向传播和梯度下降
MB86R02“ Jade-D”的扩频时钟生成单元应用
c++之STL算法(三)
齐纳二极管的串联排列如何影响电气行为?
联通努比亚官宣 全球首款柔性屏“腕机”努比亚α,惊艳亮相MWC2019
“像素”听得多,“亚像素”又是什么东西?
百度无人车确定明年量产,自动驾驶量产提前到来
2018年12月上海国际大数据产业展
RIM将收购Harman旗下的QNX Software
小米Max2约大咖搞大事!更持久的续航、更迷人的外观、更强大的配置、更出色的拍照
震动触觉电子设备能够改善风湿性关节炎症状
人工智能技术能够预测骨质疏松的疾病发生
三星计划2021年量产DDR5内存,最高频率可以达到6400 MT/s
锂离子电容电解液到底是用来做什么的
电液伺服系统校正禁忌