代价函数

符号定义

假设我们有一个下图所示的神经网络

  • 该网络有 m 个训练集 {(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\}
  • L 表示该网络的层数,图中 L = 4
  • sls_l 表第 l 层的神经元数目,s1=3,s2=s3=5,s4=sl=4s_1=3, s_2 = s_3 = 5, s_4 = s_l = 4
    神经网络学习

对于神经网络,考虑二分类和一对多两种情况:

  • 对于二分类,y=0 or 1y = 0 ~or~ 1,只需要一个输出单元即可,即 sl=1s_l = 1
  • 对于一对多,yRKy \in \mathcal R^K,例如 [1000]\begin{bmatrix} 1\\ 0\\ 0\\ 0 \end{bmatrix}[0100]\begin{bmatrix} 0\\ 1\\ 0\\ 0 \end{bmatrix}[0010]\begin{bmatrix} 0\\ 0\\ 1\\ 0 \end{bmatrix}[0001]\begin{bmatrix} 0\\ 0\\ 0\\ 1 \end{bmatrix},需要 K 个输出单元,sl=k  (k3,k=1 or 2)s_l = k ~~(k \geq 3,k=1~or~2时只需一个输出单元)

代价函数

在二分类的逻辑函数中,我们定义代价函数为:

J(θ)=1mi=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]+λ2mj=1nθj2J(\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

对于一对多问题hθ(x)RKh_\theta(x) \in \mathcal R^K,我们定义代价函数为:

J(θ)=1m[i=1mk=1Kyk(i)log(hθ(x(i)))k+(1yk(i))log(1(hθ(x(i))))k]+λ2ml=1L1i=1slj=1sl+1(θji(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
其中 hθ(x)ih_\theta(x)_i 表示第 i 个输出
上式的第二项类似于逻辑回归中的正则化项,由于我们不对偏差项(即 i = 0 的项)进行正则化,故 i 从 1 开始取值。

补充:神经网络的模型表示

我们引入一些符号来描述模型:

  • ai(j)a_i^{(j)} 表示第 j 层的第 i 个**单元
  • θ(j)\theta^{(j)} 代表从第 j 层映射到第 j+1 层时的权重的矩阵,例如代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第 j+1 层的**单元数量为行数,以第 j 层的**单元数加一为列数的矩阵。例如:上图所示的神经网络中 θ(1)\theta^{(1)} 的尺寸为 3*4。

对于上图所示的模型,**单元和输出分别表达为:

a1(2)=g(θ10(1)x0+θ11(1)x1+θ12(1)x2+θ13(1)x3)a_1^{(2)} = g(\theta_{10}^{(1)}x_0 + \theta_{11}^{(1)}x_1 + \theta_{12}^{(1)}x_2 + \theta_{13}^{(1)}x_3)

a2(2)=g(θ20(1)x0+θ21(1)x1+θ22(1)x2+θ23(1)x3)a_2^{(2)} = g(\theta_{20}^{(1)}x_0 + \theta_{21}^{(1)}x_1 + \theta_{22}^{(1)}x_2 + \theta_{23}^{(1)}x_3)

a3(2)=g(θ30(1)x0+θ31(1)x1+θ32(1)x2+θ33(1)x3)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θ(x)=g(θ10(2)a0(2)+θ11(2)a1(2)+θ12(2)a2(2)+θ13(2)a3(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)})

神经网络学习


反向传播算法

神经网络学习

我们以下图这个神经网络为例:

神经网络学习

把任意神经元上的误差定义为 δj(l)=J(θ)z(l)\delta_j^{(l)} = \frac{\partial J(\theta)}{\partial z^{(l)}}

δj(4)=aj(4)yj=(hθ(x))jyj\delta ^{(4)}_j = a_j^{(4)} - y_j = (h_\theta(x))_j - y_j

手打公式太麻烦,直接上图

神经网络学习

神经网络学习

反向传播算法流程:

  • 对于训练集 {(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\}
  • 对所有 l, i, j,初始化 Δij(l)=0\Delta_{ij}^{(l)} = 0
  • for i = 1 to m :(即遍历训练集)
    • a(1)=x(i)a^{(1)} = x^{(i)}
    • 利用前向传播算法计算 a(l)a^{(l)},for l = 2 to L
    • 利用 y(i)y^{(i)},计算输出层误差 δ(L)=a(L)y(i)\delta^{(L)} = a^{(L)} - y^{(i)}
    • 计算 δ(L1),δ(L2),...,δ(2)\delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)}
    • 累加 Δij(l),Δij(l):=Δij(l)+aj(l)δi(l+1)\Delta_{ij}^{(l)},\Delta_{ij}^{(l)}:= \Delta_{ij}^{(l)} + a_j^{(l)}\delta_i^{(l+1)}
  • 计算梯度矩阵:Dij(l)={1mΔij(l)+λmθij(l)      if j01mΔij(l)                     if j=0D_{ij}^{(l)} = \begin{cases}\frac{1}{m}\Delta_{ij}^{(l)} + \frac{\lambda}{m}\theta_{ij}^{(l)}~~~~~~if ~j \neq 0\\ \frac{1}{m}\Delta_{ij}^{(l)}~~~~~~~~~~~~~~~~~~~~~if~j = 0\end{cases}
  • 更新权值 θ(l):=θ(l)+αD(l)\theta^{(l)} := \theta^{(l)} + \alpha D^{(l)}

参考:
https://blog.csdn.net/xuan_liu123/article/details/83660316


理解反向传播算法

对于输出层,假设代价误差 δ1(4)=y(i)a1(4)\delta_1^{(4)} = y^{(i)} - a_1^{(4)}
接下来便可根据 δ1(4)\delta_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(3)=Θ12(3)δ1(4)\delta_2^{(3)} = \Theta_{12}^{(3)}\delta_1^{(4)}

神经网络学习

注:这些 δ\delta 只包含隐藏单元,不包括偏置项,这取决于对反向传播的定义及实现算法的方式,也可以用其他方式来计算包含偏置项的 δ\delta


梯度检测

由于反向传播算法有很多细节,实现起来比较困难,并且很容易产生一些 bug,当它与梯度下降算法或是其他一些算法一起工作时,看起来能够正常工作且代价函数 J(θ)J(\theta) 在每次迭代后都下降,但得到的神经网络其误差可能比没有 bug 时高了一个数量级。为了解决这个问题,采用了梯度检验。梯度检验能保证前向传播和反向传播是百分百正确的。

举个关于梯度检验的例子:
假设有一个代价函数 J(θ)J(\theta),某一点 θR\theta \in RJ(θ)J(\theta) 的导数为 J(θ)J(\theta) 在该点的斜率,也可以通过极限逼近法来求:
dJ(θ)dθ=J(θ+ε)J(θε)2ε\frac{dJ(\theta)}{d\theta} = \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2\varepsilon}

理论上,当 ε\varepsilon 足够小时,上式可以代表该点的导数,但若 ε\varepsilon 太小,会引起很多数值上的问题,一般取 ε=104\varepsilon = 10^{-4}

神经网络学习

对于任何参数 θ=θ1,θ2,...,θn\theta = \theta_1,\theta_2, ..., \theta_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}

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}

\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}

将计算出的导数或偏导数与反向传播中得到的梯度进行比较,如果结果非常相近的话(差几个小数点),则说明反向传播的实现是正确的。

如何实现数值上的梯度检验:

  • 通过反向传播计算梯度矩阵 D(1),D(2),D(3)D^{(1)},D^{(2)},D^{(3)}
  • 使用梯度检验法计算梯度;
  • 比较两者的结果是否相近;
  • 在网络学习中使用反向传播算法,关闭梯度检验,因为梯度检验非常的耗时,相比之下,反向传播要快很多。

随机初始化

对于梯度下降算法或者其他更高级的算法,需要为变量 θ\theta 设置一个初始值,这个初始值应该如何设置,能够将 θ\theta 全都初始化为0?

以下图的神经网络为例,假设将所有的权重都初始化为 0,则有 a1(2)=a2(2)δ1(2)=δ2(2)a_1^{(2)} = a_2^{(2)},\delta_1^{(2)} = \delta_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)=θ20(1)\theta_{10}^{(1)} = \theta_{20}^{(1)},这意味着在进行梯度迭代之后,仍有 $ a_1^{(2)} = a_2^{(2)}$。
假设我们不止有两个隐藏神经元,而是有很多,也就是说很多的神经元都在计算相同的特征,很多的神经元都以相同的函数作为输入,这是一种高度冗余的方法,意味着最后的逻辑回归单元只能得到一个特征。

因此,在进行初始化,采用随机初始化的方法,将权重随机初始化为接近 0,范围在 (ε,ε)(-\varepsilon,\varepsilon) 的数。
神经网络学习


组和到一起

在进行神经网络训练时,要先选择一个网络架构,即有多少个输入,多少个输出,确定隐藏层数量和隐藏层单元数数量。

神经网络学习

  • 输入单元数量:输入特征 x(i)x^{(i)} 的维度
  • 输出单元数量:类别的数量,如判定是行人、摩托还是汽车,则输出单元数量为3(独热编码)
  • 隐藏层:默认只有一个隐藏层,若不止一个隐藏层,默认每个隐藏层的隐藏单元数量相同。隐藏层数量和隐藏层单元数太多会使训练变慢,但总的来说还是越多越好。

训练神经网络步骤:

  • 构建网络架构,随机初始化权重,一般初始化为接近 0 的数;
  • 实施前向传播为每个输入 x(i)x^{(i)} 计算 hθ(x(i))h_\theta(x^{(i)})
  • 计算代价函数 J(θ)J(\theta)
  • 利用反向传播计算偏导数 J(θ)θjk(l)\frac{\partial J(\theta)}{\partial \theta_{jk}^{(l)}},至此我们就可以得到每一层的激励 a(l)a^{(l)} 和 delta值 δ(l)\delta^{(l)}
  • 使用梯度检验计算出偏导数,并与通过反向传播计算出的值进行比较,比较完后,关闭梯度检验;
  • 使用梯度下降算法或其他高级算法求出使得 J(θ)J(\theta) 最小的 θ\theta 的值。

神经网络中的梯度下降算法

原理:从某个随机初始点开始不停的往下降,反向传播算法的目的是算出梯度下降的方向,而梯度下降算法的作用是沿着这个方向一点点往下降,直到我们希望得到的点。神经网络学习

相关文章: