神经网络的学习
1 代价函数
假设神经网络的训练样本有mmm个,每个包含一组输入 xxx 和一组输出信号 yyy,LLL 表示神经网络层数,SIS_ISI? 表示每层的neuron个数( SlS_lSl? 表示输出层神经元个数),SLS_LSL? 代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二分类和多分类。
二类分类:SL=0,y=0or1S_L = 0,y=0 or 1SL?=0,y=0or1 表示哪一类;
KKK类分类:SL=k,yi=1S_L = k,y_i=1SL?=k,yi?=1 表示分到第 iii 类(k>2k>2k>2);
我们使用交叉熵损失
代价函数为:
J(θ)=?1m[∑i=1my(i)log?hθ(x(i))+(1?y(i))log?(1?hθ(x(i)))]+λ2m∑j=1nθj2J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right]+\frac{\lambda}{2 m} \sum_{j=1}^{n} \theta_{j}{ }^{2} J(θ)=?m1?[i=1∑m?y(i)loghθ?(x(i))+(1?y(i))log(1?hθ?(x(i)))]+2mλ?j=1∑n?θj?2
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量 yyy,但是在神经网络中,我们可以有很多输出变量,我们的 hθ(x)h_\theta(x)hθ?(x) 是一个维度为 KKK 的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:
J(Θ)=?1m[∑i=1m∑k=1kyk(i)log?(hΘ(x(i)))k+(1?yk(i))log?(1?(hΘ(x(i)))k)]+λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θji(l))2J(\Theta)=-\frac{1}{m}\left[\sum_{i=1}^{m} \sum_{k=1}^{k} y_{k}{ }^{(i)} \log \left(h_{\Theta}\left(x^{(i)}\right)\right)_{k}+\left(1-y_{k}^{(i)}\right) \log \left(1-\left(h_{\Theta}\left(x^{(i)}\right)\right)_{k}\right)\right]+\frac{\lambda}{2 m} \sum_{l=1}^{L-1} \sum_{i=1}^{s_{l}} \sum_{j=1}^{s_{l}+1}\left(\Theta_{j i}^{(l)}\right)^{2} J(Θ)=?m1?[i=1∑m?k=1∑k?yk?(i)log(hΘ?(x(i)))k?+(1?yk(i)?)log(1?(hΘ?(x(i)))k?)]+2mλ?l=1∑L?1?i=1∑sl??j=1∑sl?+1?(Θji(l)?)2
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出 KKK 个预测,基本上我们可以利用循环,对每一行特征都预测 KKK 个不同结果,然后在利用循环在 KKK 个预测中选择可能性最高的一个,将其与 yyy 中的实际数据进行比较。
正则化的那一项只是排除了每一层 θ0\theta_0θ0? 后,每一层的 θ\thetaθ 矩阵的和。最里层的循环 jjj 循环所有的行(由 sl+1s_l+1sl?+1 层的激活单元数决定),循环 iii 则循环所有的列,由该层( sls_lsl? 层)的激活单元数所决定。即:hθ(x)h_\theta(x)hθ?(x) 与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。
2 反向传播
之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的 hθ(x)h_\theta(x)hθ?(x)。
现在,为了计算代价函数的偏导数??Θij(l)J(Θ)\frac{\partial}{\partial \Theta_{i j}^{(l)}} J(\Theta)?Θij(l)???J(Θ),我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法。
假设我们的训练集只有一个样本 (x(1),y(1))(x^{(1)} ,y^{(1)})(x(1),y(1)) ,我们的神经网络是一个四层的神经网络,其中 K=4,SL=4,L=4K=4,S_L=4,L=4K=4,SL?=4,L=4:
前向传播算法:
我们从最后一层的误差开始计算,误差是激活单元的预测(a(4)a^{(4)}a(4))与实际值(yky^kyk)之间的误差。 我们用 δ\deltaδ 来表示误差,则:δ(4)=a(4)?y\delta^{(4)}=a^{(4)}-yδ(4)=a(4)?y 我们利用这个误差值来计算前一层的误差:
δ(3)=(Θ(3))Tδ(4)?g′(z(3))\delta^{(3)}=\left(\Theta^{(3)}\right)^{T} \delta^{(4)} * g^{\prime}\left(z^{(3)}\right)δ(3)=(Θ(3))Tδ(4)?g′(z(3))(其中g′(z(3)g^{\prime}(z^{(3)}g′(z(3)是 SSS 形函数的导数,g′(z(3)=a(3)?(1?a(3))g^{\prime}(z^{(3)}=a^{(3)}*(1-a^{(3)})g′(z(3)=a(3)?(1?a(3)))。而 (Θ(3))Tδ(4)(\Theta^{(3)})^T\delta^{(4)}(Θ(3))Tδ(4)则是权重导致的误差的和。下一步是继续计算第二层的误差:δ(2)=(Θ(2))Tδ(3)?g′(z(2))\delta^{(2)}=\left(\Theta^{(2)}\right)^{T} \delta^{(3)} * g^{\prime}\left(z^{(2)}\right)δ(2)=(Θ(2))Tδ(3)?g′(z(2)),因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设 λ=0\lambda=0λ=0,即我们不做任何正则化处理时有: ??Θij(l)J(Θ)=aj(l)δil+1\frac{\partial}{\partial \Theta_{i j}^{(l)}} J(\Theta)=a_{j}^{(l)} \delta_{i}^{l+1}?Θij(l)???J(Θ)=aj(l)?δil+1?。
为了方便理解反向传播,作出了如下事例:
输入值x1=0.35,x2=0.9x_1=0.35,x_2=0.9x1?=0.35,x2?=0.9
假设我们想要的输出值为 yout=0.5y_{out}=0.5yout?=0.5
f(x)f(x)f(x)取11+e?x\frac{1}{1+e^{-x}}1+e?x1?,损失函数为C=12(yout?y5)2C=\frac{1}{2}(y_{out}-y_5)^2C=21?(yout??y5?)2.
正向传播过程:(为了方便计算 y=wx+by=wx+by=wx+b,取b为0 )
w0=[w13w23w14w24]=[0.10.80.40.6]w_0 = \begin{bmatrix}w_{13}& w_{23}\\w_{14}&w_{24}\end{bmatrix}=\begin{bmatrix}0.1&0.8\\0.4&0.6\end{bmatrix}w0?=[w13?w14??w23?w24??]=[0.10.4?0.80.6?],w1=[w35w45]=[0.30.9]w_1=\begin{bmatrix}w_{35}&w_{45}\end{bmatrix}=\begin{bmatrix}0.3&0.9\end{bmatrix}w1?=[w35??w45??]=[0.3?0.9?]
[y3y4]=f(w0?[0.350.9])=[0.6800.663]\begin{bmatrix}y_3\\y_4\end{bmatrix} =f(w_0*\begin{bmatrix}0.35\\0.9\end{bmatrix})=\begin{bmatrix}0.680\\0.663\end{bmatrix}[y3?y4??]=f(w0??[0.350.9?])=[0.6800.663?]
y5=f(w1?[y3y4]=0.690)y_5 =f(w_1*\begin{bmatrix}y_3\\y_4\end{bmatrix}=0.690)y5?=f(w1??[y3?y4??]=0.690)
损失值 C=12(yout?y5)2=12(0.5?0.690)2=0.01805C=\frac{1}{2}(y_{out}-y_5)^2=\frac{1}{2}(0.5-0.690)^2=0.01805C=21?(yout??y5?)2=21?(0.5?0.690)2=0.01805.
反向传播 --> 减小误差 --> 调节 www 参数 --> 梯度下降法
反向传播过程:
?C?w35=>{C=12(yout?y5)2y5=f(z5)z5=(w53?y3+w54?y4)\frac{\partial C}{\partial w_{35}}=>\left\{\begin{matrix}C=\frac{1}{2}(y_{out}-y_5)^2\\y_5=f(z_5)\\z_5=(w_{53}*y_3+w_{54}*y_4)\end{matrix}\right.?w35??C?=>????C=21?(yout??y5?)2y5?=f(z5?)z5?=(w53??y3?+w54??y4?)?
链式法则:?C?w35=?C?y5??y5?z5??z5?w35=0.02763\frac{\partial C}{\partial w_{35}}=\frac{\partial C}{\partial y_5}*\frac{\partial y_5}{\partial z_5}*\frac{\partial z_5}{\partial w_{35}} = 0.02763?w35??C?=?y5??C???z5??y5????w35??z5??=0.02763
?C?w13=>{......y3=f(z3)z3=(w13?x1+w23?x2)\frac{\partial C}{\partial w_{13}}=>\left\{\begin{matrix}......\\y_3=f(z_3)\\z_3=(w_{13}*x_1+w_{23}*x_2)\end{matrix}\right.?w13??C?=>????......y3?=f(z3?)z3?=(w13??x1?+w23??x2?)?
?C?w13=?C?y5??y5?z5??z5?y3??y3?z3??z3?w13\quad\quad\quad\quad\frac{\partial C}{\partial w_{13}}=\frac{\partial C}{\partial y_5}*\frac{\partial y_5}{\partial z_5}*\frac{\partial z_5}{\partial y_3}*\frac{\partial y_3}{\partial z_3}*\frac{\partial z_3}{\partial w_{13}}?w13??C?=?y5??C???z5??y5????y3??z5????z3??y3????w13??z3??
然后更新w13w_{13}w13?的值,w13=w13??C?w13w_{13}=w_{13}-\frac{\partial C}{\partial w_{13}}w13?=w13???w13??C?
… … … …
… … … …