By Z.H. Fu
https://fuzihaofzh.github.io/blog/
sigmoid函数
sigmoid函数定义为
g(z)=1+e−z1
对于一般的模型,通常有z=θTx,可以看做是样本各属性的加权。sigmoid函数求导有g′(z)=g(z)(1−g(z)),这个在神经网络推导的时候会用到。
Logistic回归
Logistic回归是针对二分类问题常用的一种回归,其回归模型为:
hθ(x)=1+e−θTx1
其中x是某个样本的属性向量,θ是参数向量。在用Logistic回归时,需要找到合适的参数θ,使得能量函数(误差)J(θ)最小,在使用梯度下降法更新参数θ的更新过程中需要使用到梯度,然后在每一步执行θ:=θ−α∇θJ(θ),其中α是学习速度,能量函数被定义为:
J(θ)=−m1i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]
其中
hθ(x(i))=1+e−θTx(i)1
下面来给出其梯度的推导
∂θj∂=−∂θj∂m1i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]=−m1i=1∑m[y(i)∂θj∂loghθ(x(i))+(1−y(i))∂θj∂log(1−hθ(x(i)))]=−m1i=1∑m[y(i)hθ(x(i))1∂θj∂hθ(x(i))+(1−y(i))1−hθ(x(i))1∂θj∂(1−hθ(x(i)))]=−m1i=1∑m[y(i)hθ(x(i))1(1+e−θTx)2e−θTxxj(i)+(1−y(i))1−hθ(x(i))1(1+e−θTx)2e−θTxxj(i)]=−m1i=1∑m[y(i)1+e−θTxe−θTxxj(i)−(1−y(i))1+e−θTxxj(i)]
由上式可知
∂θj∂=⎩⎪⎪⎨⎪⎪⎧m1∑i=1m[1+e−θTxxj(i)]y(i)=0−m1∑i=1m[(1−1+e−θTx1)xj(i)]y(i)=1
∂θj∂=⎩⎪⎨⎪⎧m1∑i=1m[(hθ(x(i))−0)xj(i)]y(i)=0m1∑i=1m[(hθ(x(i))−1)xj(i)]y(i)=1
综上
∂θj∂=m1i=1∑m[(hθ(x(i))−y(i))xj(i)]
我们来给出这个式子的直观的理解。对于每个样本,每个θj的梯度等于误差乘上该样本的第j个属性,最后再把每个样本得到的东西平均一下。我们有了这个直观的理解,就可以直接来理解神经网络的Back Propogation了。
神经网络
神经网络其实就相当于很多个Logistic回归器并在了一起,然后加了很多层。下面来理解神经网络的Back Propogation。我们按照这个理解,我们首先来规定符号,记第l层网络的第j个节点的计算值为aj(l),而Θij(l)表示的是第l层神经网络的第j个元素传递到下一层的第i个元素的影响系数我们有:
a(1)=xz(2)=Θ(1)a(1)a(2)=g(z(2))z(3)=Θ(2)a(2)a(3)=g(z(3))z(4)=Θ(3)a(3)a(4)=g(z(4))
通过Logistic的例子我们发现,要计算参数Θ的梯度,关键是要计算出误差值,下面,我们来讨论误差值的计算。最后一层的误差是已知的,我们用一种Back Propogation的方法从后往前倒推每一层的误差。令δj(l)表示第l层第j个元素的误差,假设最后一层是第四层,那么有δj(4)=aj(4)−yj。那么我们已知第l+1层的误差,如何找到第l层的误差?这就要通过一个误差传递的方法。一个基本的想法是,如果一个输入对误差造成的影响很大,那么这个输入所在的线路的权值就应该很大,这个权值则可以通过对该点的值求偏导得到。我们有
δ(3)=(Θ(3))Tδ(4).∗g′(z(3))δ(2)=(Θ(2))Tδ(3).∗g′(z(2))
回忆sigmoid函数的导数可知
g′(z(3))=a(3).∗(1−a(3))g′(z(2))=a(2).∗(1−a(2))
我们在得到误差后,则可以得到Θ的梯度。有
∂Θij(l)∂=m1k=1∑majklδik(l+1)
其中求和表示对每一个样本进行,k即表示样本编号。有了这个偏导之后便可对参数Θ进行梯度下降。
在实际使用中,需要在能量函数中加入偏置和一些参数的限制,可参考相关书籍介绍。