神经网络

神经网络参数的反向传播算法

2019-02-20  本文已影响3人  此间不留白

神经网络损失函数

假设,用神经网络实现一个分类问题,有一个神经网络如下图所示:


L表示这个网络的层数,
S_l表示这个网络L层的单元。
这个分类问题如果是二元分类,输出层输出的结果是一个实数,可能
是0,也可能是1,输出层的单元数目是1,通常可以用K=1表示。
如果是多元分类,输出层的单元数目则为K,且假设函数的输出是一个K维向量,假设K=4,则输出结果可以用以下方式表示:
\left[\begin{matrix}1\\0\\0\\0\\\end{matrix}\right],\left[\begin{matrix}0\\1\\0\\0\\\end{matrix}\right],\left[\begin{matrix}0\\0\\1\\0\\\end{matrix}\right],\left[\begin{matrix}0\\0\\0\\1\\\end{matrix}\right]
逻辑回归中,带有正则项的损失函数如下所示:

J(\theta)=-\frac{1}{m}[\sum_{i=1}^{m}y^{(i)}logh_{\theta}(x^{(i)})+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]+\frac{\lambda}{2m}\sum_{j=1}^{n}\theta_j^{2}

神经网络的损失函数用如下公式表示:

J(\theta)=-\frac{1}{m}[\sum_{i=1}^{m}{\sum_{k=1}^{K}}y_k^{(i)}logh_{\theta}(x^{(i)})_k+(1-y_k^{(i)})log(1-h_\theta(x^{(i)}))_k]+\\ \ \frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_l+1}(\theta_{ji}^{(l)})^2

其中,h_\theta(x)K维向量,(h_\theta(x))_{i}表示第i个输出。

反向传播算法

根据前向传播算法,可以有以下计算:
\delta^{(3)} = (\theta^{(3)})^T\delta^{(4)}.*g'(z^{(3)})

\delta^{(2)} = (\theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)})

其中,g'(z) = a.*(1-a)
以上,我们介绍了一个训练样本的反向传播算法的计算过程,在一个大小为m训练集中,其计算过程如下所示:
初始化设置\delta_{(ji)}=0,
for \ \ i \ \ to \ \ \ m
\ \ \ \ set \ \ a^{(1)} = x^{(i)}

\ \ \使用前向传播算法计算a^{(l)}

\ \ \根据y^{(i)},计算\delta^{(L)} = a^{(L)}-y^{(i)}

\ \ \根据反向传播算法,计算\delta^{(l)}

\ \ \ \ \delta^{(l)}_{ij}:=\delta_{ij}^{(l)}+a_j^{(l)}\delta^{(l)}_{i}

最后,带有正则项的计算方式如下所示:
D_{ij}^{(l)} = \frac{1}{m}\delta_{ij}^{(l)}+a_j^{(l)}\delta^{(l)}_{i} \ \ \ if \ \ j\ne0

D_{ij}^{(l)} = \frac{1}{m}\delta_{ij}^{(l)} \ \ \ \ if \ \ j = 0

注意:利用反向传播算法计算\delta^{(l)}时,从\delta^{(L-1)}一直计算到\delta^{(2)}\delta^{(1)}不用计算,因为输入项x^{(i)}没有误差。

a_1^{(2)} = g(\theta_{10}^{(1)}x_0+\theta_{11}^{(1)}x_1+\theta_{12}^{(1)}x_2+\theta_{13}^{(1)}x_3)

a_2^{(2)} = g(\theta_{20}^{(1)}x_0+\theta_{21}^{(1)}x_1+\theta_{22}^{(1)}x_2+\theta_{23}^{(1)}x_3)

a_3^{(2)} = g(\theta_{30}^{(1)}x_0+\theta_{31}^{(1)}x_1+\theta_{32}^{(1)}x_2+\theta_{33}^{(1)}x_3)

h_\theta(x) = a_1^{(3)} = g(\theta_{10}^{(2)}a_0^{(2)}+\theta_{(11)}^{(2)}a_1^{(2)}+\theta_{12}^{(2)}a_2^{(2)}+\theta_{13}^{(2)}a_3^{(2)})


有了以上前向传播算法的计算原理,反向传播算法的只是跟前向传播算法的计算方向不一样而已。
不带正则项的损失函数计算方法如下所示:

梯度的值,可以用以下公式表示:

\frac{\partial}{\partial \theta}J(\theta) = \frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}

其中,\epsilon是一个极小值,一般取\epsilon = 10^{-4}
以上,我们只考虑了\theta是实数的情况,神经网络的算法中,\theta是一个n个元素的向量(\theta \in R^n),其梯度计算方式可以如下表示:

通过以上数值估计的方法得到的J(\theta)关于\theta的偏导数,与反向传播算法得到的偏导数相比较,如果两者大小接近,则说明反向传播算法得到的梯度是正确的。

随机初始化

梯度下降算法中,需要对\theta参数初始化,在逻辑回归中,初始化的参数一般全部取0,但是在神经网络中,这一做法是无效的。\theta参数是神经网络中权重参数,当取为0时,会导致输入参数乘0的情况,导致神经网络相邻两层的\delta参数的不会发生变化。也会导致同一个神经单元的权重参数相一致。这样就会导致神经网络的高度冗余,最后导致神经网络的输出只有一个特征。

随机初始化的过程中,\theta取值通常如下所示,随机初始化取得的值一般在0到1之间。
\theta_{ij}^{(l)} \in [-\epsilon, \epsilon]

总结

以上,介绍了神经网络中的反向传播算法,结合之前的内容,训练一个神经网络的步骤如下所示:

上一篇下一篇

猜你喜欢

热点阅读