BP算法是从天上掉下来的吗?

前馈神经网络

 在文章逻辑回归到神经网络(以下简写《LR到NN》)中,小夕为大家描述了一个从逻辑回归延伸到神经网络的过程。在《一般化机器学习神经网络中,小夕阐述了神经网络的一般性。这一篇会完全进入神经网络的状态,阐述神经网络的特殊性。

其实在《LR到NN》中的这张简单的图,就是本文要讲的前馈神经网络(feed-forward neural network)。

可以看到,这种简单粗暴的连法,恰恰就是神经网络最经典的模型。即隐含层的每个单元(神经元)均只接受前一层(对于只有一个隐含层的前馈网络,前一层即输入层)的输出作为输入,并输出结果到后一层(对于只有一个隐含层的前馈网络,后一层即输出层)。将这种神经网络看成数据结构中的“图”的话,那就是一个“有向无环图”(即前馈网络中是不存在反馈的)。 

这里的边,即单元与单元之间连接的强度,也即权重。设想一下,当两个单元之间的权重为0时,一个单元的输出就无法再通过这条边传递给另一个单元了,即这两个单元之间断开连接了(不存在这条边了),因此神经网络模型中的模型参数不仅仅是个数字了,由于这张基于生物学中的神经系统的模型可视化图的存在,神经网络模型中的参数还代表着两个神经元之间的连接强度。

 在《一般化机器学习神经网络中,小夕讲过了,所谓的前向算法,就是计算了一下模型的假设函数而已,只不过计算的过程可视化出来后就是一个沿着神经网络“向前推进”的样子,因此起了个名字而已。这里就不再赘述这个俗俗的假算法啦。

根据机器学习框架,假设函数有了,我们还需要考虑什么呢?当然是如何得到这个假设函数啦~也就是如何训练神经网络这个一般而特殊的机器学习模型(即学习模型参数)。

石器时代

 假设你是一个完全不懂数学的生物学家(虽然学生物的数学也很厉害的,吧),你觉得从生物学的角度来看(将模型参数看作神经元之间的连接强度),这个神经网络训练好之后应该是什么样子的呢? 

回想一下高中生物,如果两个神经元紧紧相连,那么一个神经元的兴奋必然导致与之相连的神经元的兴奋。如果经过无数次实验,我们发现对于神经元A和神经元B,只要A兴奋,那么B一定兴奋,那么就说明A与B之间肯定连接非常紧密(就像一条绳子的蚂蚱,一个跳起来肯定把另一个带起来),也就是说A到B的连接强度非常大!也就是说,A到B这个模型参数的值肯定很大。

将这个生物学思想往数学上靠一下,那就是“如果神经元A的激活带来B的激活,就代表A与B具有相关性,因此A与B之间的连接权重应该被加强,即应增大模型参数w_{AB}(下标BA代表从A出发,到达B的有向边)”。 

这个思想叫什么呢?叫“Hebb规则”,这个思想是神经网络的学习算法的最本质,也是最原始的思想。

那么如何去实现这个思想呢?

青铜时代

 设想一下,我们的网络到达了这么一种状态:

显然,模型犯错了!输出单元(输出层在这里只有一个单元)应该是1,结果预测的是0!也就是应该兴奋,实际在睡觉!而根据Hebb规则,我们应该让输出单元加强与那些兴奋的神经元的连接,也就是增大与“隐含层输出为1(专业说法叫被激活)的神经元”的连接!减弱与“隐含层输出为0(未激活)的神经元”的连接! 

再想一下,“隐单元未激活/输出为0”代表着什么?

还记得《逻辑回归到神经网络》中放大的这个隐单元的图吗?

隐单元的核心就是激活函数,比如sigmoid、tanh等。如下sigmoid:

因此隐单元输出为0时,也就是未激活时,就意味着隐单元的输入为负值!

 所以,为了迎合Hebb规则,应该让未激活的神经元减小权重,激活的神经元增加权重,那么我们可以直接让权重加上隐单元的输入啊:

即对于全部的隐单元:w=w+a。(注:a为隐单元的输入,未激活的神经元的a为负,激活的为正)

 而对于如下这种情况,也就是应该输出0,实际输出了1的情况:

通过跟前面一样的推理我们发现,只要让w的更新方式与前面相反,即:

对于全部的隐单元:w=w-a。(注:a为隐单元的输入,未激活的神经元的a为负,激活的为正)

那么有没有办法将上面两种情况合起来表示呢?

机智的你应该想到了,那就是:

w=w+(真实值-预测值)*a

 对啊,用这条通用的规则,就可以反复的更新隐藏层到输出层的权重了~这个规则叫什么呢?这就是1986年认知心理学家Rumellhart等人提出的δ学习规则,也叫广义Hebb规则,这是对神经网络学习算法的Hebb思想的直接实现!

 等等,有没有觉得似曾相识呢?赶紧翻开书,看看BP算法的权重更新公式!有没有发现BP中的权重更新公式与这个规则所表达的意思惊人的相似!

相似就对了~

铁器时代

想一想,在广义Hebb规则中,我们做了一些简化:

首先,权重更新的方向很明确,但是更新的步长我们是直接用了隐单元的输入a,而没有证明这个a是最合理的步长。其次,我们这里直接用真实值减去预测值,也是很启发式的做法。

那么显然这个广义Hebb规则在数学上极有可能是非最优的,毕竟这是一个启发式的(即拍脑袋的)算法。那么如何得到最优的做法呢?那就是从这个规则的目的着手去提出更上层的理论!

广义Hebb规则的目的是什么呢? 

这个规则的直接目的是让最终的输出逼近真实输出,也就是减小模型输出与真实输出之间的误差。具体做法是让每个隐单元的权重个性化修改,来向着使误差减小的方向移动。

 等等!再重复一遍,具体做法是让每个隐单元的权重个性化修改,来向着使误差减小的方向移动。

 再再重复一遍!具体做法是让每个隐单元的权重个性化修改,来向着使误差减小的方向移动!

所以我们可以怎样做?如果有一个函数可以直接描述这个误差!(这不就是损失函数做的事儿吗!)那么!以权重为误差的自变量,使误差减小的方向不就是权重的负梯度方向吗。那让权重沿着这个方向移动不久好了吗?(这不就是梯度下降法吗!)

如图,自变量(x轴)是权重,因变量(y轴)是误差!显然使误差减小的方向就是权重的负梯度方向啊~

 所以!求出此时权重的负梯度(即此时每个隐单元的权重的导数!)!然后让权重向这个方向移动一定的步长!反复这个移动的过程!直到误差最小,即训练完成!得到最优的权重

 所以说这是什么?这就是梯度下降法呀~同时,这还是BP算法对隐含层与输出层连接权重的更新方式啊!

 那么如何更新输入层到隐含层的权重呢?

一样的呀,数学思想都这么清晰了~误差依然是误差,只需要将自变量换成输入层到隐含层的权重,不就可以啦~其他的完全照旧啊。

 只不过,损失函数是“间接包含”输入层到隐含层的权重的,因此在求此时的负梯度时,要进行链式求导~也就是下面这个烂大街的推理过程:

这个推理过程摘自http://blog.csdn.net/lu597203933/article/details/46575803,有兴趣的可以去看看,反正哪里都能找到这个推导过程~

数学好的一眼就看懂了,不太好的就随便找个讲BP算法的书或者帖子啦,这是真正的烂大街推理过程。。。因此,各层权重的负梯度利用上面的链式求导法则就很轻松的求出来了,然后w=w-α*负梯度,就可以啦~其中,α是步长~

看,源于训练神经网络的最naïve的Hebb思想,为了实现这个思想而提出了δ算法,用数学去描述δ算法的本质目标,得出通过引入损失函数并(链式求导)求解负梯度来更新权重的过程,即误差反向传播算法(BackPropagation,简称BP算法)。

╮(╯▽╰)╭

只不过在神经网络中可视化一下,看起来就像一个人们定义的误差从模型输出层向输入层传播而已啦,然后起了个形象的名字叫所谓的误差反向传播算法

不过,人们抽象出来的这个前向与反向算法的概念还是有更多原因的,一是可以帮助人们理解,使其可以从生物学模型上得到解释,进而以这种思想变形出其他形式的前向与反向传播算法来描述或训练更复杂的神经网络;另一方面也是给我们程序猿(喵)们提供了一种简洁无脑的编程模型,使得哪怕不懂链式求导等BP算法原理的程序猿也能轻松的写出来这个数学上不算太简单的算法。

更多机器学习的精彩文章,欢迎关注微信订阅号【夕小瑶的卖萌屋】

入门BP算法
2
相关数据
激活函数技术
Activation function

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

神经网络技术
Neural Network

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

反向传播算法技术
Back-propagation

反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法计算对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。 在神经网络上执行梯度下降法的主要算法。该算法会先按前向传播方式计算(并缓存)每个节点的输出值,然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。

有向无环图技术
Directed acyclic graph

在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。 因为有向图中一个点经过两种路线到达另一个点未必形成环,因此有向无环图未必能转化成树,但任何有向树均为有向无环图。

前馈神经网络技术
Feed-forward neural network

前馈神经网络(FNN)是人工智能领域中最早发明的简单人工神经网络类型。在它内部,参数从输入层经过隐含层向输出层单向传播。与递归神经网络不同,在它内部不会构成有向环。FNN由一个输入层、一个(浅层网络)或多个(深层网络,因此叫作深度学习)隐藏层,和一个输出层构成。每个层(除输出层以外)与下一层连接。这种连接是 FNN 架构的关键,具有两个主要特征:加权平均值和激活函数。

逻辑技术
Logic

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

梯度下降技术
Gradient Descent

梯度下降是用于查找函数最小值的一阶迭代优化算法。 要使用梯度下降找到函数的局部最小值,可以采用与当前点的函数梯度(或近似梯度)的负值成比例的步骤。 如果采取的步骤与梯度的正值成比例,则接近该函数的局部最大值,被称为梯度上升。

机器学习技术
Machine Learning

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

损失函数技术
Loss function

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

逻辑回归技术
Logistic Regression (function)

逻辑回归(英语:Logistic regression 或logit regression),即逻辑模型(英语:Logit model,也译作“评定模型”、“分类评定模型”)是离散选择法模型之一,属于多重变量分析范畴,是社会学、生物统计学、临床、数量心理学、计量经济学、市场营销等统计实证分析的常用方法。

神经元技术
neurons

(人工)神经元是一个类比于生物神经元的数学计算模型,是神经网络的基本组成单元。 对于生物神经网络,每个神经元与其他神经元相连,当它“兴奋”时会向相连的神经元发送化学物质,从而改变这些神经元的电位;神经元的“兴奋”由其电位决定,当它的电位超过一个“阈值”(threshold)便会被激活,亦即“兴奋”。 目前最常见的神经元模型是基于1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神经元模型”。 在这个模型中,神经元通过带权重的连接接处理来自n个其他神经元的输入信号,其总输入值将与神经元的阈值进行比较,最后通过“激活函数”(activation function)产生神经元的输出。

参数技术
parameter

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

权重技术
Weight

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

夕小瑶
夕小瑶

深邃又好吃的机器学习与自然语言处理干货

夕小瑶的科技屋
夕小瑶的科技屋

深邃又好吃的机器学习与自然语言处理干货

推荐文章
机器学习研究者必知的八个神经网络架构 机器学习研究者必知的八个神经网络架构
机器之心机器之心
12
神经网络的信徒们神经网络的信徒们
PSI内容合伙人PSI内容合伙人
为什么XGBoost在机器学习竞赛中表现如此卓越?为什么XGBoost在机器学习竞赛中表现如此卓越?
机器之心机器之心
3
返回顶部