神经网络
Posted 小舔哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络相关的知识,希望对你有一定的参考价值。
首先推荐一篇文章:神经网络浅讲:从神经元到深度学习,介绍的一些神经网络的发展过程等等,能够在一定程度上面帮助我们理解神经网络。
M-P神经元
计算机当中的神经网络是模仿生物神经网络。单个的神经元是由树突,轴突,还有细胞核组成,刺激由树突传递到细胞核,当这些阈值超过一定的值以后,这个神经元激活,然后再由轴突将刺激传递出去。典型的神经元结构如下所示(图片来自维基百科):
所以根据神经元的这种构造,McCulloch和Pitts抽象出来一种神经元模型“M-P神经元模型”,这是根据两个作者的名字起得。如下所示:
我们以$x_i$表示来自第i个神经元的输入,$w_i$表示第i个神经元的链接权重 $\\theta$表示阈值 f表示激活函数,输出为$y$,$y = f( \\sum \\limits_{i=1}^{n} w_i x_i – \\theta)$ 表示在各种输入下,超过一定阈值以后由激活函数激活的输出。理想的激活函数是阶跃函数,也叫符号函数sign(x),但是该函数不连续,所以可以使用Sigmod(x)函数。
当然还有别的神经元模型,如考虑了电位脉冲发放时间而不是累积电位的脉冲神经元(spiking neuron)模型。但是,M-P神经元模型是目前用的最多的和最广的,可谓是现在神经网络的基石。
感知机(Perceptron)
感知机是由两层神经元组成,输入层接受外界输入信号以后传递给输出层,输出层是M-P神经元,如下图所示:
感知机是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别,取+1和-1二值。线性分类模型表现在:感知机需要学习出一个在正类和负类之间的超平面$\\mathbf{w} \\mathbf{x} + b$,使得正类和负类能够正确的划分。下面将会看到感知机是如何进行建模以及如何求解参数的。
感知机学习的损失函数
假设数据集$T= \\{(\\mathbf{x}_1,y_1),(\\mathbf{x}_2,y_2),...,(\\mathbf{x}_N,y_N)\\}$,该数据集必须是线性可分数据集,感知机要求得的超平面是能够正确划分出该数据集的超平面。使用阶跃函数作为激活函数的感知机损失函数如下:
$L(\\mathbf{w},b) = – \\sum \\limits_{\\mathbf{x}_i \\in M} y_i (\\mathbf{w}_i \\mathbf{x}_i+b)$ 其中$M$是误分类点的集合。
感知机学习的求解方法
这里只说原始形式,我们要求得参数$\\mathbf{w},b$使上面的损失函数 $L(\\mathbf{w},b) $最小:
$\\min \\limits_{\\mathbf{w},b}L(\\mathbf{w},b) = – \\sum \\limits_{\\mathbf{x}_i \\in M} y_i (\\mathbf{w}_i \\mathbf{x}_i+b)$
采用随机梯度下降法来进行优化。刚开始随机选择一个参数$\\mathbf{w}_0, b_o$,然后每次随机从误分类点中选取一个点,让其梯度下降。
误分类点集合M是固定的情况下,损失函数 $L(\\mathbf{w},b)$的梯度如下:
$\\nabla_{\\mathbf{w}} L(\\mathbf{w},b) = – \\sum \\limits_{\\mathbf{x}_i \\in M} y_i \\mathbf{x}_i$
$\\nabla_{b} L(\\mathbf{w},b) = – \\sum \\limits_{\\mathbf{x}_i \\in M} y_i $
随机选取一个误分类点$(\\mathbf{x_i},y_i )$,也就是上面的M取1这种情况,对w和b,采用步长$\\eta$进行更新的公式如下:
$\\mathbf{w} \\gets \\mathbf{w} + \\eta y_i \\mathbf{x}_i$
$b \\gets b+ \\eta y_i$
感知机算法完整描述
一个完整的感知机的算法如下所示:
输入:训练数据集$T= \\{(\\mathbf{x}_1,y_1),(\\mathbf{x}_2,y_2),...,(\\mathbf{x}_N,y_N)\\}$,其中$\\mathbf{x}_i \\in \\mathbb{R}^n$, $y_i=\\{-1,+1\\}$,i=1,2,...,N; 学习率$\\eta(0 < \\eta \\leq1)$;
输出: $\\mathbf{w},b$;感知机模型$f(x) = sign(\\mathbf{w} \\mathbf{x}+b)$
(1) 选取初值 $\\mathbf{w}_0, b_0$
(2) 在训练集中选取数据$(\\mathbf{x}_i, y_i)$
(3) 如果$y_i (\\mathbf{w} \\mathbf{x}_i + b) \\leq 0$
$\\mathbf{w} \\gets \\mathbf{w} + \\eta y_i \\mathbf{x}_i$
$b \\gets b+ \\eta y_i$
(4) 转至(2),直到训练集中没有误分类点
从上面当中的算法可以看出来,感知机算法是利用那些分类错误的实例点不断的调整其中的参数,最后达到没有错误分类的效果既可以了。 实际上感知机算法是后面多层神经网络和支持向量的基础。 多层神经网络在结构上是有多层的感知机,并且参数更新过程也和感知机类似。支持向量则是使得正负样本到直线的距离最大,而不仅仅满足正确分类这一条件。
多层前馈神经网络
多层前馈神经网络的结构
从上面的感知机算法当中我们可以发现,它有一个致命的缺点,那就是只能对线性的样本进行分类,所以对于异或这样的简单非线性问题,感知机是解决不了的。而对于两层的感知机来说,计算量太大,当时没有好的计算方法,所以导致神经网络的研究陷入一段低谷时期。
在感知机中间增加一层节点,这层节点叫做隐层,隐层和输出层一样,都是含有激活函数的功能神经单元,单隐层神经网络也可以叫做两层神经网络,(当我们说几层神经网络的时候,这里面的“层”是带有运算单元还有激活函数的层数,所以不把输入层算作内)。单隐层神经网络和双隐层神经网络的图形如下所示,这样的神经网络也叫做“多层前馈神经网络”,所谓的前馈指的是,数据从输入节点到输出节点向前传递,没有输出的信息传递到输入层,即没有反馈,表现在图形上是有向图没有回路。当然还有反馈网络,比如Hopfield网络,还有布尔兹曼机(但是受限布尔兹曼机是一种前馈网络)等。
误差逆传播算法
当网络增加到多层的时候,我们需要寻求一种更好的算法来对我们的模型进行运算来求解。误差逆传播(error BackPropagation 简称BP)算法就是一种很好的算法。
给定训练集$D= \\{(\\mathbf{x}_1,\\mathbf{y}_1),(\\mathbf{x}_2,\\mathbf{y}_2),...,(\\mathbf{x}_m,\\mathbf{y}_m)\\} ,x \\in \\mathbb{R}^d ,y \\in \\mathbb{R}^l$,这里的d代表输入有$d$维的特征向量,$l$代表输出l维向量。这里的激活函数选择Sigmoid函数 $f(x) = \\frac{1}{1+e^{-x}}$下图给出一个单隐层的神经网络(双层神经网络):
输入层为$d$维度的特征,输出层为$l$维的向量,输入节点的个数和输出节点的个数是根据特征数和输出向量的维数来确定的,所以输入节点为d个,输出节点为l个。中间节点为q个,节点的个数是可以自己选择的。
输入层第i个节点到隐层第h个节点的权重为$v_{ih}$,隐层第h个节点到输出层第j个节点的权重为$w_{hj}$。隐层第h个神经元的阈值为$\\gamma_h$,输出层第j个神经元的阈值为$\\theta_j$。
对于输入层第i个神经元,它的输入为$x_i$。
对于隐层第h个神经元:
输入 $\\alpha_h = \\sum \\limits_{i=1}^{d} v_{ih} x_i$ (1)
输出 $b_h = f(\\alpha_h – b_h)$ (2)
对于输出层第j个神经元
输入为$\\beta_j = \\sum \\limits_{h=1}^{q} w_{hj} b_h$ (3)
输出为$y_j = f(\\beta_j – \\theta_j)$
损失函数的构建:
对于第k条训练集$(\\mathbf{x}_k, \\mathbf{y}_k)$,假设神经元的输出为$\\hat{\\mathbf{y}_k} = \\{ \\hat{y}_1^k, \\hat{y}_2^k,...,\\hat{y}_l^k \\}$。输出计算公式为:
$\\hat{y}_j^k = f(\\beta_j – \\theta_j)$ (4)
那么损失函数为二分之一的均方误差:
$E_k = \\frac{1}{2} \\sum \\limits_{j=1}^{l}(\\hat{y}_j^k – y_j^k)^2$ (5)
BP算法优化过程:
在优化的时候,采用和上面感知机一样的优化方法:使用梯度下降的方法,迭代更新每个参数,对于参数$v$:
$v \\gets v + \\Delta v$。
对于参数$w_{hj}$来说,在给定学习率$\\eta$的情况下,
$\\Delta w_{hj} = – \\eta \\frac{\\partial E_k}{\\partial w_{hj}}$
结合上面的公式3,4,5,可以得知各个变量的依赖关系:$w_{hj} \\to \\beta_j \\to \\hat{y}_j^k \\to E_k$ ($\\to$可以理解为影响),所以上述的求导变为了:
$\\frac{\\partial E_k }{\\partial w_{hj} } = \\frac{\\partial E_k }{\\partial \\hat{y}_j^k } \\cdot \\frac{\\partial \\hat{y}_j^k}{\\partial \\beta_j } \\cdot \\frac{\\partial \\beta_j }{\\partial w_{hj} }$
根据公式3 很容易求得:$\\frac{\\partial \\beta_j }{\\partial w_{hj} } = b_h$
Sigmoid函数f(x)有这样的性质:$f’(x) = f(x)(1-f(x))$,定义一个中间项$g_i $ :
$g_i= - \\frac{\\partial E_k }{\\partial \\hat{y}_j^k } \\cdot \\frac{\\partial \\hat{y}_j^k}{\\partial \\beta_j }= \\hat{y}_j^k (1-\\hat{y}_j^k)(y_j^k - \\hat{y}_j^k) $ (6)
这样 $\\Delta w_{hj} = \\eta g_j b_h$ (7)
同样可以求出 $\\Delta \\theta_j = – \\eta g_j$ (8)
对于$\\Delta v_{ih}$,我们要求$\\frac{\\partial E_k}{\\partial v_{ih}}$,结合上面的公式1,2,3,4,5,我们可以找到这样的影响链 $v_{ih} \\to \\alpha_h \\to b_h \\to \\beta_j \\to \\hat{y}_j^k \\to E_k$ 可以求得
$\\Delta v_{ih} = \\eta e_h x_i $ (9)
$\\Delta \\gamma_h = –\\eta e_h$ (10)
其中$e_h = b_h (1-b_h) \\sum \\limits_{j=1}^l w_{hj} g_j$ (11)
误差逆传播算法的完整描述
下面是误差逆传播算法的完整描述
输入:训练集$D = \\{ (\\mathbf{x}_k ,\\mathbf{y}_k ) \\}_{k=1} ^m $ 学习率$\\eta$
输出:连接权与阈值确定的多层前馈神经网络
(1) 在(0,1)范围内随机初始化网络中所有连接权和阈值
(2) repeat
for all $(\\mathbf{x}_k ,\\mathbf{y}_k ) \\in D$ do
根据当前参数和式子(4)计算当前样本的输出$\\hat{\\mathbf{y}}_k$
根据式子(6)计算输出层神经元的梯度项目$g_j$
根据式子(11)计算隐层神经元的梯度项$e_h$
根据式(7,8,9,10)更新连接权$w_{hj}, v_{ih}$与阈值$\\theta_j , \\gamma_h$
end for
(3) until 达到停止条件
参考:
李航 《统计学习方法》 感知机的内容参考自本书,更详细的推导可以参考这本书。
周志华 《机器学习》 本文中的很多图片来自这一本书
感知机(python实现) 这个博客也是参考《统计学习方法》,并给出了感知机的代码
以上是关于神经网络的主要内容,如果未能解决你的问题,请参考以下文章