神经网络设计与实现
上QQ阅读APP看书,第一时间看更新

2.3.3 Keras实现

在Keras中,可以通过激活层或通过封装的网络层中的activation参数来指定激活函数:

也可以换成下列指令:

还可以通过传递一个逐元素运算的TensorFlow/Theano/CNTK函数来作为激活函数:

1.链式法则

计算反向传播的基本原则之一是链式法则,它是我们在感知器上看到的telta规则的一种更通用的形式。

链式法则用导数的属性来计算更多函数的组合的结果。通过将神经元串联,我们可以有效地创建函数的组合。因此,我们可以应用链式法则公式:

这里,我们希望找到使误差函数最小化的权重。为此,我们求误差函数相对于权重的导数,并遵循梯度下降的方向。因此,如果考虑神经元j,我们将看到它的输入来自网络的前一部分,可以用networkj来表示。神经元的输出用oj表示,应用链式法则,将获得以下公式:

我们来看下这个公式的每个元素。第一个因子正是我们之前在感知器中使用的。因此,我们得到以下公式:

这是因为在这种情况下,oj也是用L表示的下一层神经元的输出。如果我们用l表示给定层中神经元的数量,则具有以下公式:

这就是我们以前使用的delta规则的来源。

如果这不是我们要求导的输出神经元,公式会更复杂,因为我们需要考虑每个单神经元,因为它可能与网络的不同部分相连。在这种情况下,有以下公式:

然后,我们需要求所构建的输出表示相对于网络其余部分的导数。这里,激活函数为sigmoid。因此,计算导数就很容易了:

神经元oj(networkj)的输入相对于连接该神经元和神经元j的权重的导数就是激活函数的偏导数。在最后一个元素中,只有一个项取决于wij,因此,其他所有条件都变为0:

现在,我们可以看到delta规则的一般情况:

使用如下公式表示:

现在,梯度下降技术需要将我们的权重朝着梯度的方向移动一步。这一步是我们要定义的步骤,取决于我们期望算法收敛的速度,以及我们想要接近局部最小值的程度。如果步长(或学习率)太大,就不可能找到最小值,如果步长(或学习率)太小,那么将会花费太多时间(见图2-14)。

图 2-14

我们提到过,若使用梯度下降法,不能保证可以找到局部最小值,这是因为神经网络中误差函数的非凸性。我们探索误差空间的程度将不仅取决于诸如步长和学习率之类的参数,还取决于创建的数据集的好坏。

不幸的是,目前没有公式可以提供一个好方法来探索误差函数。这个仍然需要一定技巧,因此一些理论主义者将深度学习视为一种次等技术,而更愿意使用更完善的统计公式。但是,如果我们换个角度,对于研究人员来说,这也可以看作一个很好的推进这一领域的机会。深度学习在实际应用中的增长推动了该领域的成功,表明当前的局限性不是主要的缺点。

2.XOR问题

让我们执行以下步骤来尝试通过一个简单的FFNN解决我们先前提出的XOR问题:

1)首先,导入此任务所需的一切,并为随机函数添加种子:

2)为了使其更类似于真实世界的问题,我们向XOR输入添加一些噪声,然后尝试预测二元分类任务:

这样,我们将得到一个嘈杂的XOR,如图2-15所示。

图 2-15