最近学习了一下神经网络,主要是学习了BP和RBF,下面时本人的学习笔记(原文我曾经发表在了上,都是本人)
学习尚浅,望指正.....
本篇介绍BP神经网络,下一篇介绍RBF神经网络
BP神经网络就是Back Propagation(反向传播)的神经网络。
线性感知机
首先,向介绍一下非反向传播的神经网络,其实也就是感知机,本质上就是一个线性分类器。
如下:x1*w1+x2*w2+x3*w3..... xn*wn+b= y (1)
(1)式我们也可以表示为 tr(X)*W+b = y(2)(粗体表示向量)
当把x1,x2,x3..xn(一个样例)代入时,得到一个y,也就是分类的结果,其实也就是一个点在直线X*W+b = 0的左边还是右边决定了
y的正负,依据正负已经可以判断分类了,当然y的值还有很多其他作用。
这个函数已经可以用于分割两类,当然是线性的,也就是使用超平面分割了样例,但有时候样例并不总是线性可分(多数情况下都是非线性可分的),不过线性感知机是很多高级模型的基础,我们先讨论线性感知机。
求解感知机
求解感知机的过程就是求解(1)式中 w1,w2,w3...wn,b 的过程,以下表示为[W,b]
一般都是利用样例数据进行训练,再使用测试数据检验正确率
可以使用的方法有很多,最原始的求解感知机的算法(抱歉,名字我忘了)
实际上,我们的求得的[W,b]不仅要对训练数据有用,而且要对测试数据有效(也就是泛化性)
很多时候,我们希望求得[W,b]是测试数据的两个类别的最小代价的平面(简单地说——中间垂直面),
最小代价定义为(实际上是一种经验公式)
J = Σ(Xi*W+b-yi)^2
Xi∈所有样例
yi为目标结果
很容易看出,希望超平面[W,b],能够使得代价J最小,其实这个代价公式很普通,就是求偏差加个平方,我感性得觉得也许还可以用别的公式表示类似的代价。
求解最小代价
自然是对J求导,将J看成J(W),d J(W) / d W = 0 (3)
求解的方法称为最小二乘法,证明比较繁琐,
解:
当(tr(M)*M)^-1存在时 W = (tr(M)*M)^-1*tr(M)*Y(Y为目标值的集合向量)
M = tr[X1,X2...,Xn] (X为一个样本向量)
可见由于逆不一定总是存在,所以此方法未必可行。
还可以采用的方法有:
最速梯度下降法,widrow-hoff算法(也叫LMS算法——最小均方算法)
这些方法的核心思想都是先求了J(W)的梯度,然后使用梯度与样本的乘积进行迭代更新W的权值,但是具体方法不同。
(所谓梯度下降,顾名思义就是指向梯度小的方向前进)
阈值单元
之前使用感知器可以求得y值,但是这种方法,使得感知在层数增加后仍然被证明为是一个线性的感知机,
于是有了阈值单元,用于使得感知机变得不那么线性,比较实用的有sigmoid单元,能够将数据都压缩再(0,1)中,
并且它是可导函数,这在BP神经网络中非常重要。
具体使用阈值单元 y` = sigmoid(y),其实就是代入函数进行计算,将其作为感知机的一部分
单层的神经网络(也称感知机)
其实就是一个线性感知机加一个阈值单元(比如sigmoid)
不过能力是有限的
多层神经网络
也就是前一层感知机的输出作为后一层感知机每个单元的输入之一,每层若干节点。
但是此时存在一个问题,就是如何求得需要的W的值 ,之前由于是单层,所以更新一层的W非常容易,
但此时,W不止一层,内层(隐含层)的W不好计算,所以提出了BP算法(1986年由Rumelhart和McCelland为首的科学家小组提出)。
具体推导以后补上。
给出具体更新公式:
定义每一个单元的误差项为ei ,每个节点的输出为oi,每个边的权重为wij
对于每个输出单元ek (i=k)
ek = ok(1-ok)(yk-ok)
对于每个隐藏层单元eh (i = h)
eh = oh(1-oh)* Σwbh*eb
b为h点的前一层节点编号
更行每个wji
wji = wji + u*ej*oji
此更行针对每个训练样例都执行,所有样例遍历一次称为一遍,往往需要多遍执行,
在测试 异或 逻辑(需要1层隐含节点)时,我大约使用了1000多次遍历,结果才满意。
参考:《机器学习》