神经网络基础和反向传播推导

本文内容来自:Michael Nielsen的《Neural Networks and Deep Learning》中文翻译

神经网络基础

神经网络基础和反向传播推导_第1张图片
神经元是一个类似感知器的东西,有多个输入。每个输入有权重w,最后有一个总的偏置b。输出不再是感知器那样的0或1,而是经过激活函数计算后的值。常用激活函数比如sigmoid函数,也叫logistic函数,如下所示,其中z=wx+b:
这里写图片描述

关于激活函数:它其实就是一个非线性函数. 比如说relu, sigmoid, tanh.强行把原有的线性结果给扭曲了. 使得输出结果 y 也有了非线性的特征. 你甚至可以创造自己的激励函数来处理自己的问题, 不过要确保的是这些激励函数必须是可以微分的,因为在误差反向传递的时候, 只有这些可微分的激励函数才能把误差传递回去.

使用sigmoid激活函数的神经元和感知器有何相似呢?先看sigmoid函数的样子:
神经网络基础和反向传播推导_第2张图片
假设z=wx+b是一个很大的正数,那么e^-z约等于0,sigmoid函数值约等于1;同样,假设z是很小的负数,函数值约等于0,这时可以说是一个平滑的感知器。sigmoid函数也有别的替代,比如双曲正切函数:
这里写图片描述
它是sigmoid函数的变体,取值范围是[-1,1],而不是[0,1]。
如果激活函数是阶跃函数:
神经网络基础和反向传播推导_第3张图片
这时神经元输出完全等于感知器。

正因为激活函数这种特性,权重和偏置的微小变化(用偏导数表示)都会使神经元产生微小的输出变化:
这里写图片描述
实际上,△output是一个反映权重和偏置变化(对应偏导数)的线性函数,所以很容易计算出如何变化权重和偏置来使输出变化。

神经网络一般由多个神经元组成,如下:
神经网络基础和反向传播推导_第4张图片
虽然不是由感知器构成,但这种多层网络被称为多层感知器MLP。目前我们所说的网络,都是以上一层的输出作为下一层的输入,这称为前馈神经网络,意味着网络中没有回路,信息总是向前传播,如果确实有回路,我们最终会有这样的情况: 激活函数的输入依赖于输出,这将难于理解,所以我们不允许这样的环路。

然而还有一种递归神经网络,其中有反馈环路,这种模型的设计思想,是具有休眠前会在一段有限的时间内保持激活状态的神经元。这种激活状态可以刺激其它神经元,使其随后被激活并同样保持一段有限的时间。这样会导致更多的神经元被激活,随着时间的推移,我们得到一个级联的神经元激活系统。因为一个神经元的输出只在一段时间后而不是即刻影响它的输入,在这个模型中回路并不会引起问题。

反向传播

我们希望有一个算法能找到权重和偏置,使网络的输出y能拟合训练输入x,所以我们定义一个代价函数来量化这个目标:
这里写图片描述
其中w表示所有权重的集合, b 是所有的偏置, n 是训练输入数据的个数, a 是表示当输入为 x 时的输出向量,求和则是在总的输入x上进行的。当然,输出 a 取决于 x, w和 b,但是为了保持符号的简洁性,我没有明确地指出这种依赖关系。符号||v||是指向量 v 的模。我们把 这个函数C 称为二次代价函数,有时也被称为均方误差(MSE)。我们需要用梯度下降算法找到使代价函数最小的权重和偏置的值。

为什么要用二次代价呢?这么做是因为在神经网络中,被正确分类的样本数所关于权重和偏置的函数并不是个平滑的函数。多数情况下,对权重和偏置做出的微小变动完全不会影响被正确分类的样本数,所以通过改变权重和偏置来改进性能会变得很困难。类似这种二次代价的平滑代价函数则能更好地去解决如何用权重和偏置中的微小改变来取得更好的效果。

我们用梯度下降去更新参数w和b,所以需要计算代价函数C 的梯度,反向传播是计算代价函数梯度的快速算法。反向传播的核心是代价函数C关于任何权重w(或者偏置b)的偏导数的表达式,这个表达式告诉我们在改变权重和偏置时,代价函数变化的快慢。实际上它让我们细致领悟如何通过改变权重和偏置来改变整个网络的行为。

反向传播步骤:
(1) 随机初始化权重和偏置为一个接近0的值(一般用正态分布),然后“前向传播”计算每层每个单元的激活值,包括输出层。激活值a=f(z),其中神经元输入z=wx+b。

(2) 计算输出层L每个单元的误差,第L层第j个单元的误差的定义:
这里写图片描述
根据链式求导得:
这里写图片描述
因为在上式右边第二项里,激活值a=f(z),所以误差最终写为:
这里写图片描述
上式右边第一个项代表代价函数C随着第j个单元输出激活值的变化而变化的速度,假如C不太依赖某个输出单元,那么这个单元对应的误差δ就会很小。第二项代表激活函数f在z处的变化速度。如果给定了二次代价函数:
这里写图片描述

我们可以用矩阵方式重写误差方程:
这里写图片描述
中间这个运算符叫做哈达玛(Hadamard)乘积,用于矩阵或向量之间点对点的乘法运算:
这里写图片描述
向量也可以进行函数运算:
这里写图片描述

(3) 算完输出层开始往回算之前层的误差,当前层l的误差用下一层l+1的误差来表示:
这里写图片描述
我们可以用链式法则对误差的定义进行推导,来证明上式:
这里写图片描述
其中j是当前层的某个神经元,它和下一层的若干个神经元(由k表示)相连。注意上式交换右边两项,并用误差δ的定义代入,同时注意到:
这里写图片描述
求微分后得到:
这里写图片描述
所以:
这里写图片描述
这正是原式矩阵表达的分量形式,证明完毕。

(4) 计算代价函数关于权重和偏置的偏导数
偏置:这里写图片描述权重:这里写图片描述
其中偏置等价于误差,权重等价于误差乘以上一层神经元的输出,而上述式子的右边的项我们之前都已经算出来了。至于为什么等价可以用链式法则证明:
这里写图片描述

反向传播小结:
这里写图片描述

反向传播相关资料:
https://zhuanlan.zhihu.com/p/23270674 算法实例推倒
https://www.zhihu.com/question/27239198?rf=24827633 胡逸夫的回答(反向传播其实是动态规划的体现)
http://ufldl.stanford.edu/wiki/index.php/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C UFLDL

你可能感兴趣的:(深度学习)