神经网络是常见的机器学习模型。通过模拟人类神经网络的运行方式,来达到学习的目的。
基本原理
假设如下的图为一个神经元的工作原理:
输入N维的X,每个Xi经过权重wi处理后,相加得到能量值,作为神经元的输入。如果这个能量值超过一个阈值,则神经元被激发,输出正信号。
现在我们把神经元增加为M个,则有如下的模型:
第一层为输入层,N个输入单元。通常一个N维的特征向量,每个元素对应一个输入;
第二层为隐含层,M个输入单元。
每个输入i,隐含层j对应一个转移权重Wij。那么整个模型对应一个权重矩阵W(N*M)。
每个隐含层还对应一个非线性的激励函数F,一个偏移量b。t=F(Wij*Xi+b)作为这个隐含层的输出。
最终可以表示成:
也就是一个线性变换,非线性阈值输出的模式。
F函数
F函数通常为一个非线性函数,当输入小于阈值时,输出0,大于则输出1。常见的函数如下:
斜面函数:
图像如下:
这个函数主要模拟人的神经突触细胞的工作原理。突触处于两种状态,兴奋或抑制,当刺激达到一定水平时,激发兴奋状态。
当然,如果需要输出为连续值,我们可以使用logistic函数;
logistic函数:
图形如下:
双S函数:
Logistic与双S图形如下:
偏移量b
能量值大于一定的值时,才会激发神经元。除了定义F函数外,还可以加上一个偏移量b来更好地控制输出结果。
直观理解
神经网络的输出可以看做如下的公式:
也就是一个线性变换W,加一个非线性函数f,最终得到一个非线性的变换模型。
而f通常为一个阈值函数,WA+B大于某个值时,输出1,否则输出0。
那么我们可以把W看做一个线性变换,WX+B=0看做变换后空间中的超平面,那么输出的结果就是A处于超平面的哪一侧。
从几何角度来看,就是在线性变换后的空间中寻找一个超平面来划分样本。
如果是多层的话,就是不同空间中的多个超平面分隔的一个空间来划分样本。
反馈规则
上面是一般神经网络的正向传导过程,那么如何通过输出来反馈训练模型?
Belta rule
Belta规则是神经网络的反馈规则。是一种有监督的方式。
我们知道训练就是我们用已有正确的结果去反向引导学习。那么神经网络中,我们希望通过正确的输出引导神经网络得到正确的模型。
神经网络中的两个变量分别是权重矩阵W与激励函数F。其中常见的做法是通过训练权重矩阵W来训练模型。
设tj为节点j的期望输出值,yj为当前输出值,那么反馈可以用如下的最小二乘误差来定义:
我们可以采用常见的梯度下降法来求解。求负梯度方向,得到:
根据微分的链式规则,不断变换,如下为wiki的推导过程:
根据链式规则:
其中hj表示其输出,即
上式变为:
因为
最终得到:
hebbian theory
Hebbian认为,前后两个神经元同时发生兴奋或抑制时,增强这种联系。根据这个理论,权重更新时,根据前后两个神经元的输出,更新其权重。同时兴奋或抑制,权值增加;否则,权值减少。
公式如下:
表示j->i的更新值。
其中yita是学习率。A表示i输出,o表示j输出,也就是i的输入。
通常来说hebb是很不稳定的反馈方法,不常用作反馈规则。
matlab的编程可参考blog:
http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html
推荐阅读:
http://blog.youkuaiyun.com/zzwu/article/details/574931
http://en.wikipedia.org/wiki/Hebbian_theory
http://en.wikipedia.org/wiki/Delta_rule