神经网络:学习

成本函数

首先,让我们来定义一些需要使用的变量:

  • L =网络中的层数
  • $s_l$ =第l层中的单元数量(不包括偏差单元)
  • K =输出单元/类的数量

回顾上一篇文章,我们知道神经网络中可能有很多的输出节点。
我们用$ h_\Theta(x)_k$来表示假设函数输出第k个结果。

神经网络的成本函数将会是逻辑回归中成本函数的一个推广。

回想一下正则化逻辑回归的成本函数是:
$J(θ)=−\frac{1}{m}\sum_{i=1}^m[y^{(i)}log(h_θ(x^{(i)}))+(1−y^{(i)})log(1−h_θ(x^{(i)}))]+ \frac{λ}{2m}\sum_{j=1}^nθ_j^2$

对于神经网络来说,它会稍微复杂一些:
$J(θ)=−\frac{1}{m}\sum_{i=1}^m\sum_{k=1}^K[y^{(i)}_klog((h_θ(x^{(i)}))_k)+(1−y^{(i)}_k)log(1−(h_θ(x^{(i)}))_k)]$
$+\frac{λ}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(θ_{j,i}^{(l)})^2$

我们添加了几个嵌套总和来表示我们的多个输出节点

  • 在方程的第一部分,我们有一个额外的嵌套总和,它根据节点的数量循环输出。
  • 在正则化部分,我们必须考虑多个$θ$矩阵(与之前的逻辑回归一样,我们对$θ$矩阵的每一项进行平方处理)。当前层的$θ$矩阵中的列数等于当前层中的节点数(包括偏差单元)。而行数则等于下一层中的节点数(不包括偏差单元)。

注意:

  • 双重嵌套总和只是将输出层中每个单元计算的逻辑回归成本加起来;
  • 和是将整个网络中所有$Θ$的平方相加。
  • 三重嵌套总和中的i并不是指提到第i个训练例子

反向传播算法

“反向传播”是神经网络中的术语,用于最小化我们的成本函数,就像我们在逻辑回归和线性回归中使用梯度下降的目的是一样的。

显然,我们的目标是:$\min_Θ J(Θ)$
也就是说,我们希望使用最优的一组参数$\theta$,以此来最小化我们的成本函数。

让我们来看看用来计算$J(\theta)$的偏导数方程:
$\frac{∂}{∂Θ^{(l)}_{i,j}}J(Θ)$

在反向传播中,我们将计算每一个节点:
$\delta^{(l)}_j$=l层第j个节点的“误差”

回顾,$\alpha^{(l)}_j$表示l层第j个激活节点。

对于最后一层,我们可以计算出误差向量:
$\delta^{(L)}=a^{(L)}-y$
其中,L是总共的层数,$a^{(L)}$是最后一层的激活单元的输出向量。
所以,最后一层的“误差值”仅仅是我们在最后一层的实际结果和y的正确输出的差异。

要得到最后一层之前的层的$\delta$值,我们可以使用一个方程式,让我们从右到左移进:

$\delta^{(l)} = ((\Theta^{(l)})^T \delta^{(l+1)})\ .*\ g’(z^{(l)})$

其中, $\delta^{(l)}$推导过程如下

$\delta^{(l)}=\frac{∂J(\theta)}{∂(z^{(l)})}=\frac{∂J(\theta)}{∂(z^{(l+1)})}.\frac{∂(z^{(l+1)})}{∂(a^{(l)})}.\frac{∂(a^{(l)})}{∂(z^{(l)})}$
$=\delta^{(l+1)}.\frac{∂(Θ^{(l)}a^{(l)})}{∂(a^{(l)})}.\ g’(z^{(l)})$
$=\delta^{(l+1)}.\Theta^{(l)}.\ g’(z^{(l)})$

故:$\delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)}) .* g’(z^{(l)})$

其中,$g’(u)=g(u).*(1-g(u))$

总的来说,中间节点上的反向传播可以这样表示:
$\delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)}) .* a^{(l)}.*(1-a^{(l)})$

接下来,让我们来计算权重的梯度,即求$\frac{∂}{∂Θ^{(l)}_{i,j}}J(Θ)$

推导过程
$\frac{∂}{∂Θ^{(l)}_{i,j}}J(Θ)=\frac{∂J(Θ)}{∂z^{(l+1)}_{i}}.\frac{∂∂z^{(l+1)}_{i}}{∂Θ^{(l)}_{i,j}}=\delta^{(l+1)}_i.\frac{∂(Θ^{(l)}a^{(l)})}{∂(Θ^{(l)})}=\delta^{(l+1)}_i.a^{(l)}$

$=\frac{1}{m}\sum_{t=1}^ma^{(t)(l)}.\delta^{(l+1)}_i$

显然,这里我们忽略了正则化,等下我们再来处理这个问题。

现在,让我们把所有公式整合在一起:

给出训练集${(x^{(1)},y^{(1)})⋯(x^{(m)} ,y^{(m)})}$

  • 初始化设置$Δ_{i,j}^{(l)}:= 0 对于所有的(l,i,j)$
    for t=1到m 的训练样本:
    • 设置$a^{(1)}:=x^{(t)}$
    • 使用正向传播算法计算每一层的$a^{(l)}$for l=2,3,…,L
    • 利用$y^{(t)}$,计算$δ^{(L)}=a^{(L)}−y^{(t)}$
    • 利用公式$\delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)}) .* a^{(l)}.*(1-a^{(l)})$计算$δ^{(L−1)},δ^{(L−2)},…,δ^{(2)}$
    • $Δ_{i,j}^{(l)}:=Δ_{i,j}^{(l)}+a_j^{(l)}δ_i^{(l+1)}$,或者向量化形式$Δ^{(l)}:=Δ^{(l)}+δ^{(l+1)}(a^{(l)})^T$
  • $D_{i,j}^{(l)}:=\frac{1}{m}(Δ_{i,j}^{(l)} +λΘ_{i,j}^{(l)})$,如果 j≠0
  • $D_{i,j}^{(l)}:=\frac{1}{m}Δ_{i,j}^{(l)}$,如果 j=0

总体整理一下神经网络模型

首先,选择一个网络架构,选择神经网络的布局,包括每层中单元数以及总的层数。

  • 输入单元的数量 = $x^{(i)}$维数
  • 输出单元的数量 = 输出的类别数
  • 每一层中隐式单元的个数 = 通常情况下越多越好(当然也需要平衡随着单元数增加而产生的计算量)
  • 默认:一个隐层。如果多于一个隐层,那么内一个隐层的单元数是相同的。

神经网络训练流程

  1. 随机初始化权重(切不可全都为0)
  2. 实现前向传播得到$h_\theta(x^{(i)})$
  3. 实现成本函数
  4. 实现反向传播计算偏导数$\frac{∂J(Θ)}{∂Θ^{(l)}_{i,j}}$
  5. 使用梯度检测确认4中的反向传播算法是否有效,若有效则禁用此检测。(梯度检测十分耗时)
  6. 使用梯度下降或者内置优化函数来调整$\theta$的权重,以最小化成本函数。
分享到