终究有一天,还是得接触这个让人捉摸不透的东西。我总感觉他太过神秘,所以对他没有什么好感。无奈,他如此实用,不得不拜访一下。我不管什么CNN和RNN,这些花里胡哨的东西,我感觉就像边角料。
参考《Pattern Recongition》
源
神经网络,就其类别来讲是非线性判别,而非线性判别,主要是因为**函数。输入层得到输入,经过线性函数(超平面)的分隔,输入的特征被映射为其他一些特征,如果**函数是简单的0-1函数(虽然没法反向求导了)。就是那样本映射到超体(是这么形容吗?)的顶点上,再经过一层,网络,对上述点进行分隔,幸许就能把样本成功分类了。当然,这些都是简单的情况,而且,俩层神经网络的能力似乎并不够。

神经网络框架

这是一个三层神经网络。
Backpropagation 反向传播

我不知道有没有别的什么神经网络不用这个算法的,我还没有太深入了解,但我感觉,神经网络最核心的东西就是反向传播,还有框架本身。
下面,过一遍这个梯度的计算。
符号说明
假定有L层神经元,输入层有k0=l个结点(神经元),在第r层有kr个结点,r=1,2,…,L.
有N个训练样本,(x(i),y(i)),i=1,2,…,N


wjr表示第r层第j个结点

权重更新,按照普通的梯度下降为:

f(⋅)为激活函数
损失函数(这里以最小平方误差为例)


梯度计算 Δwjr=−μi=1∑Nδjr(i)yr−1(i)
首先,ykr−1(i),是第r−1层第k个结点的输出(激活后),相应的vkr−1为没有激活的输出。
而wjkr是连接r−1层第k个结点和r层第j个结点的权重。

简便的写法就是vjr(i)=wjtTyr−1(i)
其中y0r−1(i)≡+1
那么损失函数关于wjr的导数(梯度)就是:

又

记

则:

计算 δjr(i)
r=L

所以

r<L
因为vjr−1(i)是第r层所有结点的输入,所以:

也就是

令δr=[δ1r,δ2r,…,δkrr]T,那么
δr−1=Mrδr其中Mjkr=∂vjr−1∂vkr又

所以Mjkr(i)=wkjrf′(vjr−1(i))
所以,总的来说
δr=Mr+1Mr+2…MLδL
这意味着,对于第r层,我们只要记录wr(old)和Mr就足够迭代更新了,而且计算Mr的工作可以在前向传递的时候完成,也可以在反向传播的时候再计算。
我想,这也是Pytorch等框架计算梯度的原理,当然这只是猜测,因为我还没有实际上去看。