0%

从Logistic回归到神经网络

By Z.H. Fu
https://fuzihaofzh.github.io/blog/

sigmoid函数

sigmoid函数定义为

g(z)=11+ezg(z)=\frac{1}{1+e^{-z}}

对于一般的模型,通常有z=θTxz=\theta^{\mathrm{T}}x,可以看做是样本各属性的加权。sigmoid函数求导有g(z)=g(z)(1g(z))g'(z)=g(z)(1-g(z)),这个在神经网络推导的时候会用到。

Logistic回归

Logistic回归是针对二分类问题常用的一种回归,其回归模型为:

hθ(x)=11+eθTxh_\theta(x)=\frac{1}{1+e^{-\theta^{\mathrm{T}}x}}

其中xx是某个样本的属性向量,θ\theta是参数向量。在用Logistic回归时,需要找到合适的参数θ\theta,使得能量函数(误差)J(θ)J(\theta)最小,在使用梯度下降法更新参数θ\theta的更新过程中需要使用到梯度,然后在每一步执行θ:=θαθJ(θ)\theta:=\theta-\alpha\nabla_\theta J(\theta),其中α\alpha是学习速度,能量函数被定义为:

J(θ)=1mi=1m[y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]J(\theta)=-\frac{1}{m}\sum_{i=1}^m\left[y^{(i)}\log h_{\theta}(x^{(i)})+(1-y^{(i)})\log (1-h_{\theta}(x^{(i)}))\right]

其中

hθ(x(i))=11+eθTx(i)h_{\theta}(x^{(i)})=\frac{1}{1+e^{-\theta^{\mathrm{T}}x^{(i)}}}

下面来给出其梯度的推导

θj=θj1mi=1m[y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]=1mi=1m[y(i)θjloghθ(x(i))+(1y(i))θjlog(1hθ(x(i)))]=1mi=1m[y(i)1hθ(x(i))θjhθ(x(i))+(1y(i))11hθ(x(i))θj(1hθ(x(i)))]=1mi=1m[y(i)1hθ(x(i))eθTxxj(i)(1+eθTx)2+(1y(i))11hθ(x(i))eθTxxj(i)(1+eθTx)2]=1mi=1m[y(i)eθTxxj(i)1+eθTx(1y(i))xj(i)1+eθTx]\begin{aligned}\frac{\partial}{\partial \theta_j} &= -\frac{\partial}{\partial \theta_j}\frac{1}{m}\sum_{i=1}^m\left[y^{(i)}\log h_{\theta}(x^{(i)})+(1-y^{(i)})\log (1-h_{\theta}(x^{(i)}))\right] \\ &= -\frac{1}{m}\sum_{i=1}^m\left[y^{(i)}\frac{\partial}{\partial \theta_j}\log h_{\theta}(x^{(i)})+(1-y^{(i)})\frac{\partial}{\partial \theta_j}\log (1-h_{\theta}(x^{(i)}))\right] \\ &= -\frac{1}{m}\sum_{i=1}^m\left[y^{(i)}\frac{1}{h_{\theta}(x^{(i)})}\frac{\partial}{\partial \theta_j} h_{\theta}(x^{(i)})+(1-y^{(i)})\frac{1}{1-h_{\theta}(x^{(i)})}\frac{\partial}{\partial \theta_j} (1-h_{\theta}(x^{(i)}))\right] \\ &= -\frac{1}{m}\sum_{i=1}^m\left[y^{(i)}\frac{1}{h_{\theta}(x^{(i)})}\frac{e^{-\theta^{\mathrm{T}}x}x^{(i)}_j}{(1+e^{-\theta^{\mathrm{T}}x})^2} +(1-y^{(i)})\frac{1}{1-h_{\theta}(x^{(i)})}\frac{e^{-\theta^{\mathrm{T}}x}x^{(i)}_j}{(1+e^{-\theta^{\mathrm{T}}x})^2}\right] \\ &= -\frac{1}{m}\sum_{i=1}^m\left[y^{(i)}\frac{e^{-\theta^{\mathrm{T}}x}x^{(i)}_j}{1+e^{-\theta^{\mathrm{T}}x}} -(1-y^{(i)})\frac{x^{(i)}_j}{1+e^{-\theta^{\mathrm{T}}x}}\right] \\ \end{aligned}

由上式可知

θj={1mi=1m[xj(i)1+eθTx]y(i)=01mi=1m[(111+eθTx)xj(i)]y(i)=1\frac{\partial}{\partial \theta_j}=\begin{cases} \frac{1}{m}\sum_{i=1}^m\left[ \frac{x^{(i)}_j}{1+e^{-\theta^{\mathrm{T}}x}}\right]\quad y^{(i)}=0\\ -\frac{1}{m}\sum_{i=1}^m\left[(1-\frac{1}{1+e^{-\theta^{\mathrm{T}}x}})x^{(i)}_j \right]\quad y^{(i)}=1 \end{cases}

θj={1mi=1m[(hθ(x(i))0)xj(i)]y(i)=01mi=1m[(hθ(x(i))1)xj(i)]y(i)=1\frac{\partial}{\partial \theta_j}=\begin{cases} \frac{1}{m}\sum_{i=1}^m\left[ (h_{\theta}(x^{(i)})-0)x^{(i)}_j\right]\quad y^{(i)}=0\\ \frac{1}{m}\sum_{i=1}^m\left[(h_{\theta}(x^{(i)})-1)x^{(i)}_j \right]\quad y^{(i)}=1 \end{cases}

综上

θj=1mi=1m[(hθ(x(i))y(i))xj(i)]\frac{\partial}{\partial \theta_j}=\frac{1}{m}\sum_{i=1}^m\left[(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j\right]

我们来给出这个式子的直观的理解。对于每个样本,每个θj\theta_j的梯度等于误差乘上该样本的第jj个属性,最后再把每个样本得到的东西平均一下。我们有了这个直观的理解,就可以直接来理解神经网络的Back Propogation了。

神经网络

神经网络其实就相当于很多个Logistic回归器并在了一起,然后加了很多层。下面来理解神经网络的Back Propogation。我们按照这个理解,我们首先来规定符号,记第ll层网络的第jj个节点的计算值为aj(l)a^{(l)}_j,而Θij(l)\Theta^{(l)}_{ij}表示的是第ll层神经网络的第jj个元素传递到下一层的第ii个元素的影响系数我们有:

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))\begin{aligned}&a^{(1)}=x\\ &z^{(2)}=\Theta^{(1)}a^{(1)}\\ &a^{(2)}=g(z^{(2)})\\ &z^{(3)}=\Theta^{(2)}a^{(2)}\\ &a^{(3)}=g(z^{(3)})\\ &z^{(4)}=\Theta^{(3)}a^{(3)}\\ &a^{(4)}=g(z^{(4)})\\ \end{aligned}

通过Logistic的例子我们发现,要计算参数Θ\Theta的梯度,关键是要计算出误差值,下面,我们来讨论误差值的计算。最后一层的误差是已知的,我们用一种Back Propogation的方法从后往前倒推每一层的误差。令δj(l)\delta^{(l)}_j表示第ll层第jj个元素的误差,假设最后一层是第四层,那么有δj(4)=aj(4)yj\delta^{(4)}_j=a^{(4)}_j-y_j。那么我们已知第l+1l+1层的误差,如何找到第ll层的误差?这就要通过一个误差传递的方法。一个基本的想法是,如果一个输入对误差造成的影响很大,那么这个输入所在的线路的权值就应该很大,这个权值则可以通过对该点的值求偏导得到。我们有

δ(3)=(Θ(3))Tδ(4).g(z(3))δ(2)=(Θ(2))Tδ(3).g(z(2))\delta^{(3)}=(\Theta^{(3)})^{\mathrm{T}}\delta^{(4)}.*g'(z^{(3)})\\ \delta^{(2)}=(\Theta^{(2)})^{\mathrm{T}}\delta^{(3)}.*g'(z^{(2)})

回忆sigmoid函数的导数可知

g(z(3))=a(3).(1a(3))g(z(2))=a(2).(1a(2))g'(z^{(3)})=a^{(3)}.*(1-a^{(3)})\\ g'(z^{(2)})=a^{(2)}.*(1-a^{(2)})

我们在得到误差后,则可以得到Θ\Theta的梯度。有

Θij(l)=1mk=1majklδik(l+1)\frac{\partial}{\partial \Theta^{(l)}_{ij}}=\frac{1}{m}\sum_{k=1}^m a^{l}_{jk}\delta^{(l+1)}_{ik}

其中求和表示对每一个样本进行,kk即表示样本编号。有了这个偏导之后便可对参数Θ\Theta进行梯度下降。
在实际使用中,需要在能量函数中加入偏置和一些参数的限制,可参考相关书籍介绍。