外观
隐藏层和激活函数究竟在做什么
What Hidden Layers and Activation Functions Actually Do
每个人都知道激活函数(activation function)在神经网络(neural network)中的作用。它们让网络能够学习非线性模式。这里没有什么新内容,我相信你也清楚这一点。

然而,我常常意识到的一点是,大多数人很难建立起一种直觉性的理解,弄清楚神经网络在逐层变换的过程中究竟在持续试图达成什么。
在本章中,让我分享一个关于此的独特视角,这将真正帮助你理解神经网络的内部工作机制。我为本章配备了大量图示以便更好地理解。此外,为了简单起见,我们将考虑一个二分类的用例。
数据在每个隐藏层(hidden layer)都会经历一系列变换:

- 对来自上一层数据的线性变换
- ……随后使用激活函数引入非线性——ReLU、Sigmoid、Tanh 等。
上述变换在神经网络的每个隐藏层上都会执行。现在,请注意这里的一点。

假设我们刚刚在神经网络的最后一个隐藏层上应用了上述数据变换。一旦完成,激活值会向网络的输出层推进,进行最后一次变换,而这次变换完全是线性的。
上述变换完全是线性的,因为所有非线性的来源(激活函数)都存在于最后一个隐藏层之上或之前。而在前向传播过程中,一旦数据离开最后一个隐藏层,就再也没有引入非线性的余地了。

因此,为了做出准确的预测,输出层从最后一个隐藏层接收到的数据必须是线性可分的。
总结一下……在通过所有隐藏层对数据进行变换、并且恰好在到达输出层之前,神经网络一直在不断地努力将数据投影到某个空间,使其以某种方式变得线性可分。如果做到了,输出层就类似于一个逻辑回归模型,能够轻松处理这种线性可分的数据。事实上,我们也可以通过实验来验证这一点。为了可视化输入的变换,我们可以在输出层之前添加一个仅含两个神经元的虚拟隐藏层,并重新训练这个神经网络。

为什么要添加一个只有两个神经元的层?这样我们就可以轻松地可视化这个变换。我们期望,如果绘制这个二维虚拟隐藏层的激活值,它们必须是线性可分的。下面的图示恰好描绘了这一点。

正如我们在上图中所注意到的,虽然输入数据是线性不可分的,但输出层接收到的输入确实是线性可分的。这种变换后的数据可以很容易地由输出分类层处理。而这表明,神经网络所要做的全部事情,就是在到达输出层之前把数据变换成线性可分的形式。