神经元:
在神经网络的模型中,神经元可以表示如下
神经元的左边是其输入,包括变量x1、x2、x3与常数项1,
右边是神经元的输出
神经元的输出函数被称为激活函数(activation function),输出值被称为激活值(activation value)。
激活函数有很多种,其中最简单的莫过于sigmoid函数。
除非特别声明,否则博客里提及的激活函数均为sigmoid
神经网络:
多个神经元首尾相连连接成神经网络(Neural Network),可以表示如下:
尽管生物体中神经云之间的连接会更加复杂,
在常用的模型中,神经元的连接要遵循一定规则,
简单地来说就是要分层:上一层神经元的输出作为下一层的输入,
两层之间单向传递,没有反馈
同层之间的神经元没有交流。
下面我们来描述一下这个模型 :
神经网络 来表示网络的层数,
其中最左边的叫做出入层,最右边的称为输出层,中间的层被称为隐藏层
隐藏层的借点成为隐藏节点。隐藏层的数量为网络的“深度”
我们将第 层记为
,于是
是输入层,输出层是
。
本例神经网络有参数 ,
其中 , (下面的式子中用到)是第
层第
单元与第
层第
单元之间的联接参数(权重,注意标号顺序),
是第
层第
单元的偏置项。
因此在本例中, ,
。
注意,即偏置单元没有输入
表示第
层的节点数,偏置单元不计在内
神经网络的计算:
用 表示第
层第
单元的激活值(输出值),当
时,
表示第
层第
单元输入加权和(包括偏置单元)
于是, 可以按如下方法计算
计算过程可以用向量运算简化
这种由输入求输出,从左向右计算的算法,叫做前向传播算法
于是乎这种神经网络也叫做前馈神经网络
反向传播算法(Back Propagation):
引言:
在逻辑回归中,我们使用梯度下降法求参数方程的最优解。
这种方法在神经网络中并不能直接使用,
因为神经网络有多层参数(最少两层),(?为何不能)
这就要求对梯度下降法做少许改进。
实现过程:
一、正向传播
首先,同逻辑回归,我们求出神经网络输出与实际值的“误差”——COST:
这里先使用欧式距离而不是索夫曼函数作为输出的cost:
展开之后:
(注意右边的权重衰减项,既规则化)
二、反向传播
对于第 层(输出层)的每个输出单元
,我们根据以下公式计算残差:
对 的各个层,第
层的第
个节点的残差计算方法如下
这里:
这里相当于把本层节点的残差按照权重“投影”到上一层残差的节点上(“反向传播”就是这个意思)
在计算出各节点的残差之后,参数的偏导如下计算:
然后就可以梯度下降去了!
梯度下降过程:
1、进行前馈计算,求的所有节点的输出,求得cost;
2、进行反向传播计算,求的所有节点残差(第nl ~ 第2层)
3、利用公式求得cost对参数的偏导
4、更新偏导。
5、重复1~4知道cost差距小于预设值或重复次数大于预设值
(这里以上只讲实现方法,省略所有证明。相关证明贴于最后。)
随机初始化( Random Initialization):
在进行第一次前馈算法之前,神经网络参数的值是多少呢?
全零初始化?这是不可以的!
如果选择相同的参数进行初始化,
隐藏节点的出入必定相同(自己推推,更不用说输出了)。
为了使得对称失效,我们对神经网络的参数进行随机初始化,
既采用接近零的初始值进行初始化。
这个过程可以用matlab产生随机矩阵的功能来实现。
初始化之后,让我们一起下降吧!
用到的证明(残差的计算):
1、
2、