AI算法10-反向传播算法Back Propagation | BP

什么是反向传播算法

简介

BP算法是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。

反向传播要求有对每个输入值期望得到的已知输出,来计算损失函数的梯度。因此,它通常被认为是一种监督式学习方法,虽然它也用在一些无监督网络(如自动编码器)中。它是多层前馈网络的Delta规则的推广,可以用链式法则对每层迭代计算梯度。反向传播要求人工神经元(或“节点”)的激励函数可微。

发展历史

根据各种资料,反向传播是由1960年代Henry J. Kelley提出的控制理论control theory和 1961年Arthur E. Bryson 提出的理论衍生而来的。他们的使用的思想是动态规划。在1962年, Stuart Dreyfus 出版了一个更加简单的衍生版本链式规则chain rule。Bryson 和 Ho 在1969年形容这个为multi-stage的动态系统优化方法。1969年,作为人工神经网络创始人的明斯基(Marrin M insky)和佩珀特(Seymour Papert)合作出版了《感知器》一书,论证了简单的线性感知器功能有限,不能解决如“异或”(XOR )这样的基本问题,而且对多层网络也持悲观态度。这些论点给神经网络研究以沉重的打击,很多科学家纷纷离开这一领域,神经网络的研究走向长达10年的低潮时期。

在1970, Linnainmaa 出版了一个为了解决discrete connected networks的自动分化问题更加通用的方法。这就是所对应的backpropagation,它即使实在稀疏网络也非常有效率。

1974年哈佛大学的Paul Werbos发明BP算法时,正值神经外网络低潮期,并未受到应有的重视。1 Werbos提到了将此应用于ANN的可能性,Harvard博士生Paul Werbos首次提出了backprop. 并且在1982年,他将Linnainmaa's AD方法应用于神经网络中,这就是现在的适用方式。但是当时并没有收到太多的关注。

1983年,加州理工学院的物理学家John Hopfield利用神经网络,在旅行商这个NP完全问题的求解上获得当时最好成绩,引起了轰动。然而,Hopfield的研究成果仍未能指出明斯基等人论点的错误所在,要推动神经网络研究的全面开展必须直接解除对感知器——多层网络算法的疑虑。

在1986年,Rumelhart, Hinton 和 Williams展示了这个方法可以根据输入数据适用隐含层来表示内在的联系。在1993年,Wan第一次适用反向传播赢得了国际模式识别竞赛。

在2000s,神经网络并没有太过火热,反而到了2010s,BP神经网络风靡了很多研究领域,这也是得益于基于便宜,强大的GPU的运算系统。

主要事件

年份

事件

相关论文/Reference

1974

Werbos, P.发明BP算法

Werbos, P. (1974). Beyond regression: new fools for prediction and analysis in the behavioral sciences. PhD thesis, Harvard University .

1986

Rumelhart, Hinton Williams展示了这个方法可以根据输入数据适用隐含层来表示内在的联系。

Rumelhart, D. E., Hinton, G. E., & Williams, R. J. (1986). Learning representations by back-propagating errors. nature, 323(6088), 533.

1995

Cortes, C.,提出SVM

Cortes, C., & Vapnik, V. (1995). Support-vector networks. Machine learning, 20(3), 273-297.

1998

LeCun等人提出LeNet

LeCun, Y., Bottou, L., Bengio, Y., & Haffner, P. (1998). Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11), 2278-2324.

2012

ALEX等人提出ALEXNET

Krizhevsky, A., Sutskever, I., & Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. In Advances in neural information processing systems (pp. 1097-1105).

反向传播算法

算法概要

BP网络的结构降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个 输入m输出的BP神经网络所完成的功能是从 一维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。这是BP算法得以应用的基础。

反向传播算法主要由两个环节(激励传播、权重更新)反复循环迭代,直到网络的对输入的响应达到预定的目标范围为止。

BP算法的学习过程由正向传播过程和反向传播过程组成。在正向传播过程中,输入信息通过输入层经隐含层,逐层处理并传向输出层。如果在输出层得不到期望的输出值,则取输出与期望的误差的平方和作为目标函数,转入反向传播,逐层求出目标函数对各神经元权值的偏导数,构成目标函数对权值向量的梯量,作为修改权值的依据,网络的学习在权值修改过程中完成。误差达到所期望值时,网络学习结束。

激励传播

每次迭代中的传播环节包含两步:

  1. (前向传播阶段)将训练输入送入网络以获得激励响应;
  2. (反向传播阶段)将激励响应同训练输入对应的目标输出求差,从而获得隐层和输出层的响应误差。

权重更新

对于每个突触上的权重,按照以下步骤进行更新:

  1. 将输入激励和响应误差相乘,从而获得权重的梯度;
  2. 将这个梯度乘上一个比例并取反后加到权重上。
  3. 这个比例将会影响到训练过程的速度和效果,因此称为“学习率”或“步长”。梯度的方向指明了误差扩大的方向,因此在更新权重的时候需要对其取反,从而减小权重引起的误差。

项目描述多层神经网络采用反向传播算法。为了说明这一过程,这里有三层神经网络,有两个输入和一个输出,如下图中所示,

每个神经元是由两个单元组成的。第一个方块包含权重系数和输入信号。第二个方块实现非线性函数,称为神经元激活函数。

e是上一层summing junction的输出信号,y = f(e)是非线性元件的输出信号。信号y也是神经元的输出信号。

我们需要的神经网络训练数据集。训练数据集由输入信号(x_1和x_2)分配相应的目标(预期的输出)为z。网络训练是一个迭代的过程。在每个迭代中权重系数的节点会用新的训练数据集的数据进行修改。修改计算使用下面描述的算法:每个步骤都是从训练集中的两个输入信号开始,在这个阶段我们可以确定每个网络层中的每个神经元的输出信号值。图片下面的说明信号是通过网络传播,符号w(x_m)_n代表网络输入x_m和神经元n层之间的连接权重,符号y_n代表神经元n的输出信号。

传播的信号需要通过隐藏层。符号w_mn代表m和输入和输出神经元n之间的连接权重。

传播信号通过输出层。

以上都是正向传播。算法的下一步,计算得出的输出y和训练集和的真实结果z有一定的误差,这个误差就叫做误差信号。用误差信号反向传递给前面的各层,来调整网络参数。

之前的算法是不可能直接为内部神经元计算误差信号,因为这些神经元的输出值是未知的。因此反向传播算法对此问题进行了解决。这个算法的创新点就是传播误差信号δ=z-y,返回到所有神经元,输出信号会根据输入神经元进行更改。

权重系数的W_mn用来传播误差信号δ,它是等于通过计算得出输出值,便会得到新的误差δ_m。只有数据流的方向是改变(信号传播从输出到输入一个接一个的进行权值更新)。这一技术是用于所有网络层。如果当传播错误来自一些神经元。将误差δ根据之前的权重会获得每个神经元的各自误差δ_5,δ_4,...δ_1.

当每个神经元的误差都计算完后,每个神经元的权重系数也会更新。下面的公式就是神经元的激活函数(更新权重),利用误差δ_1和之前的权重以及之前e函数的倒数来获得新的权重w'.这里η是系数,它影响着权重改变大小的范围。它的选择也是有很多方法的。

反向传播的案例:简单神经网络

网络结构

  1. 假设我们有一个简单的两层神经网络,结构如下:

输入层:2个神经元(输入特征 x1 和 x2)

隐藏层:2个神经元(带有激活函数 sigmoid)

输出层:1个神经元(带有激活函数 sigmoid)

  1. 网络的权重和偏置如下(这些值是随机初始化的,实际情况中会使用随机初始化):

    输入层到隐藏层的权重矩阵 W1:[0.5, 0.3], [0.2, 0.4]

    隐藏层到输出层的权重向量 W2:[0.6, 0.7]

    隐藏层的偏置向量 b1:[0.1, 0.2]

    输出层的偏置 b2:0.3

前向传播

  1. 给定输入 [0.5, 0.3],进行前向传播:

    隐藏层输入:[0.5*0.5 + 0.3*0.2 + 0.1, 0.5*0.3 + 0.3*0.4 + 0.2] = [0.31, 0.29]

    隐藏层输出(经过 sigmoid 激活函数):[sigmoid(0.31), sigmoid(0.29)]≈ [0.57, 0.57]

    输出层输入:0.6*0.57 + 0.7*0.57 + 0.3 = 0.71

    输出层输出(预测值,经过sigmoid激活函数):sigmoid(0.71) ≈ 0.67

损失计算

假设真实标签是 0.8,使用均方误差(MSE)计算损失:

损失 =(0.8-0.67) ²≈0.017

反向传播

计算损失函数相对于网络参数的偏导数,并从输出层开始反向传播误差。

输出层偏导数

损失函数对输出层输入的偏导数(δ2)2 * (0.67 - 0.8) * sigmoid_derivative(0.71) ≈ -0.05

Sigmoid函数的导数:sigmoid(x) * (1 - sigmoid(x))

隐藏层偏导数

损失函数对隐藏层每个神经元输出的偏导数

(δ2):[δ2 * 0.6 * sigmoid_derivative(0.31), δ2 * 0.7 * sigmoid_derivative(0.29)]

计算后得到 δ1 ≈ [-0.01, -0.01](这里简化了计算,实际值可能有所不同)

参数偏导数

对于权重 W2:[δ2 * 隐藏层输出1,δ2 * 隐藏层输出2] = [-0.03, -0.04]

对于偏置 b2:δ2 = -0.05

对于权重 W1 和 偏置 b1,需要更复杂的计算,因为它们影响到隐藏层的输出,进而影响到输出层的输入和最终的损失。这些偏导数依赖于 δ1 和输入层的值。

参数更新

使用梯度下降更新参数(学习率设为 0.1):

更新 W2:w2 - 学习率 * 参数偏导数

更新 b2:b2 - 学习率 * 参数偏导数

同样地更新 W1 和 b1

迭代

重复步骤 2-5,直到网络收敛或达到预设的迭代次数。

未来发展方向

BP网络主要用于以下四个方面。

  1. 函数逼近:用输入向量和相应的输出向量训练一个网络逼近一个函数。
  2. 模式识别:用一个待定的输出向量将它与输入向量联系起来。
  3. 分类:把输入向量所定义的合适方式进行分类。
  4. 数据压缩:减少输出向量维数以便于传输或存储。

除此之外,在神经网络的可解释性研究方面,向低功耗硬件迁移,以及在认知计算,规划推理等方面和其他传统技术进行结合探索

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值