首页 > 人工智能(Artificial Intelligence) > 神经网络模型

神经网络模型训练

在神经网络训练的时候往往要确定目标函数,也就是损失函数。在训练的时候,损失函数的选择有很多种,最常用的则是均方误差(mean-square error, MSE)。

反向传播算法是最常见的一种神经网络训练算法。借助这种算法,梯度下降法在多层神经网络中将成为可行方法。

TensorFlow 可自动处理反向传播算法,因此您不需要对该算法作深入研究。要了解它的工作原理,请参阅下面的反向传播算法的直观说明。滚动浏览开头的说明时,请注意以下几点:

  • 数据如何流经图表。
  • 我们可以如何借助动态规划避免计算图表中数量达指数级别的路径。这里的“动态规划”仅仅是指记录正向传播和反向传播的中间结果。

代价函数(损失函数)

逻辑回归的代价函数为:

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

在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量 $y$

在神经网络中,有很多输出变量,$h_\theta(x)$ 是一个维度为 $K$ 的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:

$J(\Theta) = -\frac{1}{m} \left[ \sum\limits_{i=1}^{m} \sum\limits_{k=1}^{k} {y_k}^{(i)} \log {(h_\Theta(x^{(i)}))_k} + \left( 1 - y_k^{(i)} \right) \log \left( 1- {\left( h_\Theta \left( x^{(i)} \right) \right)_k} \right) \right] + \frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_l+1} \left( \Theta_{ji}^{(l)} \right)^2$

我们通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出 $K$ 个预测,基本上我们可以利用循环,对每一行特征都预测 $K$ 个不同结果,然后利用循环在 $K$ 个预测中选择可能性最高的一个,将其与 $y$ 中的实际数据进行比较。

反向传播算法

对深度神经网络(Deep Neural Networks, 以下简称DNN)的损失函数用梯度下降法进行迭代优化求极小值的过程即为我们的反向传播算法。

反向传播算法中,对于每一个训练样本,其算法先初始化随机的权值和阈值参数,然后将相关的输入示例提供给输入层神经元,并一层一层将信号向前传递(输入层->隐藏层->输出层),直到输出层产生输出值。

再根据输出值计算输出的误差,而后将误差逆向传播到隐藏层的神经元,最终根据隐藏层神经元计算得来的误差来调整连接的权值和神经元的阈值。BP算法不断地迭代循环执行上述步骤,直到达到训练停止的条件。

反向传播算法计算过程

由于梯度下降法有批量(Batch),小批量(mini-Batch),随机三个变种,为了简化描述,这里我们以最基本的批量梯度下降法为例来描述反向传播算法。实际上在业界使用最多的是mini-Batch的梯度下降法。不过区别仅仅在于迭代时训练样本的选择而已。

输入: 总层数 $L$,以及各隐藏层与输出层的神经元个数,激活函数,损失函数,迭代步长 $\alpha$,最大迭代次数MAX与停止迭代阈值 $\epsilon$,输入的 $m$ 个训练样本 $ \{(x_1,y_1), (x_2,y_2), ..., (x_m,y_m)\}$

输出:各隐藏层与输出层的线性关系系数矩阵 $W$ 和偏倚向量 $b$

1)初始化各隐藏层与输出层的线性关系系数矩阵 $W$ 和偏倚向量 $b$ 的值为一个随机值。

2)for iter to 1 to MAX:

     2-1) for $i =1$ to $m$:

                    a) 将DNN输入 $a^1$ 设置为 $x_i$

                    b) for$l=2$ to $L$,进行前向传播算法计算 $ a^{i,l} = \sigma(z^{i,l}) = \sigma(W^la^{i,l-1} + b^l)$

                    c) 通过损失函数计算输出层的 $\delta^{i,L}$(BP1)

                    d) for $l= L-1$ to $2$,进行反向传播算法计算 $\delta^{i,l} = (W^{l+1})^T\delta^{i,l+1}\odot \sigma' (z^{i,l})$(BP2)

     2-2) for $ l = 2$ to $L$,更新第 $l$ 层的 $W^l, b^l$

                    $W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{i, l-1})^T \qquad \text{(BP3)}$

                    $b^l = b^l -\alpha \sum\limits_{i=1}^m \delta^{i,l} \qquad \text{(BP4)}$

     2-3) 如果所有 $W$,$b$ 的变化值都小于停止迭代阈值$ϵ$,则跳出迭代循环到步骤3。

3) 输出各隐藏层与输出层的线性关系系数矩阵 $W$ 和偏倚向量 $b$。

权重参数随机初始化

任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。

我们通常初始参数为正负ε之间的随机值,假设我们要随机初始一个尺寸为10×11的参数矩阵,代码如下:

Theta1 = rand(10, 11) * (2*eps) – eps

使用神经网络的步骤

网络结构:第一是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。

第一层的单元数即我们训练集的特征数量。

最后一层的单元数是我们训练集的结果的类的数量。

如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。

我们真正要决定的是隐藏层的层数和每个中间层的单元数。

训练神经网络:

  1. 参数的随机初始化
  2. 利用正向传播方法计算所有的 $h_{\theta}(x)$
  3. 编写计算代价函数 $J$ 的代码
  4. 利用反向传播算法计算所有偏导数
  5. 利用数值检验方法检验这些偏导数
  6. 使用优化算法来最小化代价函数

 

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。