假设我们有一个下图所示的神经网络
对于神经网络,考虑二分类和一对多两种情况:
在二分类的逻辑函数中,我们定义代价函数为:
J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J(\theta) = -\frac{1}{m} \sum_{i=1}^m [y^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1 - h_\theta(x^{(i)}))] + \frac{\lambda}{2m} \sum_{j=1}^n\theta_j^2 J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2
对于一对多问题 h θ ( x ) ∈ R K h_\theta(x) \in \mathcal R^K hθ(x)∈RK,我们定义代价函数为:
J ( θ ) = − 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) l o g ( h θ ( x ( i ) ) ) k + ( 1 − y k ( i ) ) l o g ( 1 − ( h θ ( x ( i ) ) ) ) k ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( θ j i ( i ) ) 2 J(\theta) = -\frac{1}{m}[\sum_{i=1}^m\sum_{k=1}^Ky_k^{(i)}log(h_\theta(x^{(i)}))_k + (1 - y^{(i)}_k)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}^{(i)})^2 J(θ)=−m1[i=1∑mk=1∑Kyk(i)log(hθ(x(i)))k+(1−yk(i))log(1−(hθ(x(i))))k]+2mλl=1∑L−1i=1∑slj=1∑sl+1(θji(i))2
其中 h θ ( x ) i h_\theta(x)_i hθ(x)i 表示第 i 个输出
上式的第二项类似于逻辑回归中的正则化项,由于我们不对偏差项(即 i = 0 的项)进行正则化,故 i 从 1 开始取值。
我们引入一些符号来描述模型:
对于上图所示的模型,激活单元和输出分别表达为:
a 1 ( 2 ) = g ( θ 10 ( 1 ) x 0 + θ 11 ( 1 ) x 1 + θ 12 ( 1 ) x 2 + θ 13 ( 1 ) x 3 ) a_1^{(2)} = g(\theta_{10}^{(1)}x_0 + \theta_{11}^{(1)}x_1 + \theta_{12}^{(1)}x_2 + \theta_{13}^{(1)}x_3) a1(2)=g(θ10(1)x0+θ11(1)x1+θ12(1)x2+θ13(1)x3)
a 2 ( 2 ) = g ( θ 20 ( 1 ) x 0 + θ 21 ( 1 ) x 1 + θ 22 ( 1 ) x 2 + θ 23 ( 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) a2(2)=g(θ20(1)x0+θ21(1)x1+θ22(1)x2+θ23(1)x3)
a 3 ( 2 ) = g ( θ 30 ( 1 ) x 0 + θ 31 ( 1 ) x 1 + θ 32 ( 1 ) x 2 + θ 33 ( 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) a3(2)=g(θ30(1)x0+θ31(1)x1+θ32(1)x2+θ33(1)x3)
h θ ( x ) = g ( θ 10 ( 2 ) a 0 ( 2 ) + θ 11 ( 2 ) a 1 ( 2 ) + θ 12 ( 2 ) a 2 ( 2 ) + θ 13 ( 2 ) a 3 ( 2 ) ) h_\theta(x) =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)}) hθ(x)=g(θ10(2)a0(2)+θ11(2)a1(2)+θ12(2)a2(2)+θ13(2)a3(2))
我们以下图这个神经网络为例:
把任意神经元上的误差定义为 δ j ( l ) = ∂ J ( θ ) ∂ z ( l ) \delta_j^{(l)} = \frac{\partial J(\theta)}{\partial z^{(l)}} δj(l)=∂z(l)∂J(θ)
则 δ j ( 4 ) = a j ( 4 ) − y j = ( h θ ( x ) ) j − y j \delta ^{(4)}_j = a_j^{(4)} - y_j = (h_\theta(x))_j - y_j δj(4)=aj(4)−yj=(hθ(x))j−yj
手打公式太麻烦,直接上图
反向传播算法流程:
参考:
https://blog.csdn.net/xuan_liu123/article/details/83660316
对于输出层,假设代价误差 δ 1 ( 4 ) = y ( i ) − a 1 ( 4 ) \delta_1^{(4)} = y^{(i)} - a_1^{(4)} δ1(4)=y(i)−a1(4)
接下来便可根据 δ 1 ( 4 ) \delta_1^{(4)} δ1(4) 利用方向传播算法计算出其他代价误差值,例如:
δ 2 ( 2 ) = Θ 12 ( 2 ) δ 1 ( 3 ) + Θ 22 ( 2 ) δ 2 ( 3 ) \delta_2^{(2)} = \Theta_{12}^{(2)}\delta_1^{(3)} + \Theta_{22}^{(2)}\delta_2^{(3)} δ2(2)=Θ12(2)δ1(3)+Θ22(2)δ2(3)
δ 2 ( 3 ) = Θ 12 ( 3 ) δ 1 ( 4 ) \delta_2^{(3)} = \Theta_{12}^{(3)}\delta_1^{(4)} δ2(3)=Θ12(3)δ1(4)
注:这些 δ \delta δ 只包含隐藏单元,不包括偏置项,这取决于对反向传播的定义及实现算法的方式,也可以用其他方式来计算包含偏置项的 δ \delta δ 值
由于反向传播算法有很多细节,实现起来比较困难,并且很容易产生一些 bug,当它与梯度下降算法或是其他一些算法一起工作时,看起来能够正常工作且代价函数 J ( θ ) J(\theta) J(θ) 在每次迭代后都下降,但得到的神经网络其误差可能比没有 bug 时高了一个数量级。为了解决这个问题,采用了梯度检验。梯度检验能保证前向传播和反向传播是百分百正确的。
举个关于梯度检验的例子:
假设有一个代价函数 J ( θ ) J(\theta) J(θ),某一点 θ ∈ R \theta \in R θ∈R 在 J ( θ ) J(\theta) J(θ) 的导数为 J ( θ ) J(\theta) J(θ) 在该点的斜率,也可以通过极限逼近法来求:
d J ( θ ) d θ = J ( θ + ε ) − J ( θ − ε ) 2 ε \frac{dJ(\theta)}{d\theta} = \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2\varepsilon} dθdJ(θ)=2εJ(θ+ε)−J(θ−ε)
理论上,当 ε \varepsilon ε 足够小时,上式可以代表该点的导数,但若 ε \varepsilon ε 太小,会引起很多数值上的问题,一般取 ε = 1 0 − 4 \varepsilon = 10^{-4} ε=10−4。
对于任何参数 θ = θ 1 , θ 2 , . . . , θ n \theta = \theta_1,\theta_2, ..., \theta_n θ=θ1,θ2,...,θn,其代价函数的所有偏导数项可以表示为:
∂ J ( θ ) ∂ θ 1 = J ( θ 1 + ε , θ 2 , . . . , θ n ) − J ( θ 1 − ε , θ 2 , . . . , θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_1} = \frac{J(\theta_1+\varepsilon,\theta_2,...,\theta_n) - J(\theta_1-\varepsilon,\theta_2,...,\theta_n)}{2\varepsilon} ∂θ1∂J(θ)=2εJ(θ1+ε,θ2,...,θn)−J(θ1−ε,θ2,...,θn)
∂ J ( θ ) ∂ θ 2 = J ( θ 1 , θ 2 + ε , . . . , θ n ) − J ( θ 1 , θ 2 − ε , . . . , θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_2} = \frac{J(\theta_1,\theta_2+\varepsilon,...,\theta_n) - J(\theta_1,\theta_2-\varepsilon,...,\theta_n)}{2\varepsilon} ∂θ2∂J(θ)=2εJ(θ1,θ2+ε,...,θn)−J(θ1,θ2−ε,...,θn)
⋮ \vdots ⋮
∂ J ( θ ) ∂ θ n = J ( θ 1 , θ 2 , . . . , θ n + ε ) − J ( θ 1 , θ 2 , . . . , θ n − ε ) 2 ε \frac{\partial J(\theta)}{\partial\theta_n} = \frac{J(\theta_1,\theta_2,...,\theta_n+\varepsilon) - J(\theta_1,\theta_2,...,\theta_n-\varepsilon)}{2\varepsilon} ∂θn∂J(θ)=2εJ(θ1,θ2,...,θn+ε)−J(θ1,θ2,...,θn−ε)
将计算出的导数或偏导数与反向传播中得到的梯度进行比较,如果结果非常相近的话(差几个小数点),则说明反向传播的实现是正确的。
如何实现数值上的梯度检验:
对于梯度下降算法或者其他更高级的算法,需要为变量 θ \theta θ 设置一个初始值,这个初始值应该如何设置,能够将 θ \theta θ 全都初始化为0?
以下图的神经网络为例,假设将所有的权重都初始化为 0,则有 a 1 ( 2 ) = a 2 ( 2 ) , δ 1 ( 2 ) = δ 2 ( 2 ) a_1^{(2)} = a_2^{(2)},\delta_1^{(2)} = \delta_2^{(2)} a1(2)=a2(2),δ1(2)=δ2(2)
对于偏导数,有 ∂ J ( θ ) ∂ θ 10 ( 1 ) = ∂ J ( θ ) ∂ θ 20 ( 1 ) \frac{\partial J(\theta)}{\partial \theta_{10}^{(1)}} = \frac{\partial J(\theta)}{\partial \theta_{20}^{(1)}} ∂θ10(1)∂J(θ)=∂θ20(1)∂J(θ),更新权重之后,仍有 θ 10 ( 1 ) = θ 20 ( 1 ) \theta_{10}^{(1)} = \theta_{20}^{(1)} θ10(1)=θ20(1),这意味着在进行梯度迭代之后,仍有 $ a_1^{(2)} = a_2^{(2)}$。
假设我们不止有两个隐藏神经元,而是有很多,也就是说很多的神经元都在计算相同的特征,很多的神经元都以相同的函数作为输入,这是一种高度冗余的方法,意味着最后的逻辑回归单元只能得到一个特征。
因此,在进行初始化,采用随机初始化的方法,将权重随机初始化为接近 0,范围在 ( − ε , ε ) (-\varepsilon,\varepsilon) (−ε,ε) 的数。
在进行神经网络训练时,要先选择一个网络架构,即有多少个输入,多少个输出,确定隐藏层数量和隐藏层单元数数量。
训练神经网络步骤:
原理:从某个随机初始点开始不停的往下降,反向传播算法的目的是算出梯度下降的方向,而梯度下降算法的作用是沿着这个方向一点点往下降,直到我们希望得到的点。