神经网络:激活函数

之前的练习中,你已经看到,仅仅在网络中添加隐藏层不足以表示非线性。对线性运算进行线性运算仍然是线性运算。

如何配置神经网络来学习数值之间的非线性关系?我们需要某种方法将非线性数学运算融入模型中。

如果这看起来有点眼熟,那是因为我们在课程前面部分已经对线性模型的输出应用了非线性数学运算。在逻辑回归模块中,我们通过将模型的输出通过sigmoid 函数,使线性回归模型输出 0 到 1 之间的连续值(表示概率)。

我们可以将同样的原理应用到神经网络中。让我们回顾一下之前练习 2中的模型,但这一次,在输出每个节点的值之前,我们将首先应用 sigmoid 函数:

点击“>| ”按钮(位于播放按钮右侧),逐步查看每个节点的计算过程。在图表下方的“计算”面板中,查看用于计算每个节点值的数学运算。请注意,每个节点的输出现在是上一层节点线性组合的 sigmoid 变换,并且所有输出值都被压缩到 0 到 1 之间。

在这里,sigmoid 函数用作神经网络的激活函数,它是神经元输出值在作为神经网络下一层计算的输入之前进行非线性变换的结果。

现在我们添加了激活函数,增加层数的影响就更大了。通过叠加非线性函数,我们可以对输入和预测输出之间非常复杂的关系进行建模。简而言之,每一层实际上都在学习一个基于原始输入的更复杂、更高层次的函数。如果您想更深入地了解其工作原理,请参阅Chris Olah 的精彩博文

常见激活函数

常用的三种激活函数是 sigmoid、tanh 和 ReLU。

上文讨论过的 sigmoid 函数对输入 $x$ 执行以下变换,产生介于 0 和 1 之间的输出值:

\[F(x)=\frac{1} {1+e^{-x}}\]

这是该函数的图像:

图 4. Sigmoid 函数图:一条 S 形曲线,  当 x 趋近于负无穷时渐近趋近于 x 轴,  当 x 趋近于无穷时渐近趋近于 1。
图 4. sigmoid 函数图。

tanh(“双曲正切”的缩写)函数将输入 $x$ 变换为介于 -1 和 1 之间的输出值:

\[F(x)=tanh(x)\]

这是该函数的图像:

图 5. tanh 函数的图像:一条略  比 sigmoid 函数更陡峭的 S 形曲线,渐近线  当 x 趋近于负无穷时趋近于 -1,当 x 趋近于 正无穷时趋近于 1。
图 5. tanh 函数的图像。

修正线性单元激活函数(简称ReLU )使用以下算法转换输出:

  • 如果输入值 $x$ 小于 0,则返回 0。
  • 如果输入值 $x$ 大于或等于 0,则返回输入值。

ReLU 可以用 max() 函数进行数学表示:

$$F(x)=max(0,x)$$

这是该函数的图像:

图 6. ReLU 函数图:一条水平线  沿 x 轴从负无穷大到 0,变成一条对角线  从 0 到无穷大向上向右,斜率为 1 (y=x)。
图 6. ReLU 函数图。

ReLU 作为激活函数通常比 sigmoid 或 tanh 等平滑函数效果更好,因为它在神经网络训练过程中不易受到梯度消失问题的影响。此外,ReLU 的计算也比这些函数容易得多。

其他激活函数

实际上,任何数学函数都可以作为激活函数。假设 \(\sigma\) 代表我们的激活函数。网络中节点的值由以下公式给出:

$$\sigma(\boldsymbol w \cdot \boldsymbol x+b)$$

Keras为许多激活函数提供了开箱即用的支持。尽管如此,我们仍然建议从 ReLU 开始。

概括

以下视频总结了您目前为止所学的关于神经网络构建方式的所有内容:

现在,我们的模型具备了人们通常所说的神经网络的所有标准组成部分:

  • 一组类似于神经元的节点,按层排列。
  • 一组学习得到的权重和偏置,表示神经网络中每一层与其下一层之间的连接。下一层可以是另一个神经网络层,也可以是其他类型的层。
  • 激活函数用于转换层中每个节点的输出。不同的层可以具有不同的激活函数。

需要注意的是:神经网络不一定总是比特征交叉更好,但神经网络确实提供了一种灵活的替代方案,在很多情况下都能很好地发挥作用。