到目前为止,我们集中讨论了神经网络的设计选择,这对于使用基于梯度的优化方法来训练的大多数参数化机器学习模型都是通用的。现在我们转向一个前馈神经网络独有的问题:该如何选择隐藏单元的类型,这些隐藏单元用在模型的隐藏层中。隐藏单元的设计是一个非常活跃的研究领域,并且还没有许多明确的指导性理论原则。
整流线性单元是隐藏单元极好的默认选择。许多其他类型的隐藏单元也是可用的。决定何时使用哪种类型的隐藏单元是困难的事(尽管整流线性单元通常是一个可接受的选择)。我们这里描述对于每种隐藏单元的一些基本直觉。这些直觉可以用来建议我们何时来尝试一些单元。通常不可能预先预测出哪种隐藏单元工作得最好。设计过程充满了试验和错误,先直觉认为某种隐藏单元可能表现良好,然后用它组成神经网络进行训练,最后用验证集来评估它的性能。
这里列出的一些隐藏单元可能并不是在所有的输入点上都是可微的。例如,整流线性单元 g(z) = max 在 z = 0 处不可微。这似乎使得 g 对于基于梯度的学习算法无效。在实践中,梯度下降对这些机器学习模型仍然表现得足够好。部分原因是神经网络训练算法通常不会达到代价函数的局部最小值,而是仅仅显著地减小它的值。因为我们不再期望训练能够实际到达梯度为 0 的点,所以代价函数的最小值对应于梯度未定义的点是可以接受的。不可微的隐藏单元通常只在少数点上不可微。一般来说,函数 g(z) 具有左导数和右导数,左导数定义为紧邻在 z 左边的函数的斜率,右导数定义为紧邻在 z 右边的函数的斜率。只有当函数在 z 处的左导数和右导数都有定义并且相等时,函数在 z 点处才是可微的。神经网络中用到的函数通常对左导数和右导数都有定义。在g(z) = max 的情况下,在 z = 0 处的左导数是 0,右导数是 1。神经网络训练的软件实现通常返回左导数或右导数的其中一个,而不是报告导数未定义或产生一个错误。这可以通过观察到在数字计算机上基于梯度的优化总是会受到数值误差的影响来启发式地给出理由。当一个函数被要求计算 g(0) 时,底层值真正为 0 是不太可能的。相对的,它可能是被舍入为 0 的一个小量 ϵ。在某些情况下,理论上有更好的理由,但这些通常对神经网络训练并不适用。重要的是,在实践中,我们可以放心地忽略隐藏单元激活函数的不可微性。
除非另有说明,大多数的隐藏单元都可以描述为接受输入向量 x,计算仿射变换 z = W⊤x + b,然后使用一个逐元素的非线性函数 g(z)。大多数隐藏单元的区别仅仅在于激活函数 g(z) 的形式。
领取专属 10元无门槛券
私享最新 技术干货