将神经网络可视化是非常有趣的。对于监督学习而言,神经网络的训练过程可以看做是学习如何将一组输入数据点转换为可由线性分类器进行分类的表示。本文我想利用这些(隐藏)表示进行可视化,从而更加直观地了解训练过程。这种可视化可以为神经网络的性能提供有趣的见解。
我联想到很多想法,最终从 Andrej Karpathy 的研究(t-SNE visualization of CNN codes)中获得了理论支持。
这个想法很简单,可以由以下步骤简单说明:
1. 训练一个神经网络。
2. 一旦经过训练,网络可为验证/测试数据中的每个数据点生成最终的隐藏表示 (嵌入)。这个隐藏表示基本上就是神经网络中最后一层的权重。该表示近似于神经网络对数据的分类。
3. 为便于可视化,需要将权重降维到二维或三维。然后,在散点图上可视化这些点以观察它们是如何在空间中分离的。有一些比较流行的降维技术,如 T-SNE 或 UMAP。
尽管上述步骤是对训练完成后的数据点进行可视化,但我认为可以实现一个有趣的拓展,即在训练过程中在多个时间点进行可视化。这样我们就可以单独观察每一个可视化,对事物如何变化产生一些见解。例如,我们可以在每一个 epoch 后进行可视化直到训练完成,然后对它们进行对比。它的进一步扩展是生成可视化动画。这可以通过这些静态可视化图和它们之间的插入控制点来实现——从而实现逐点转换。
这个想法让我很兴奋。为了生成这些可视化,我开发了基于 D3.js 的 Javascript 工具。它能产生静态可视化图和动图。对于动态图,我们需要上传两个我们想要进行对比的 csv 文件,这些文件包含隐藏表示。该工具能使文件中的点动起来。我们也可以控制动画,以便观察一组特定的点在训练过程中的移动轨迹。本文开头有一个例子,读者可以去试一下。
工具(Neural Embedding Animator)地址:https://bl.ocks.org/rakeshchada/raw/43532fc344082fc1c5d4530110817306/
README:https://bl.ocks.org/rakeshchada/43532fc344082fc1c5d4530110817306
这绝对不是个复杂的工具。我只是想把我的设想付诸实践。
但是,该动画方法有一个问题:在 T-SNE/UMAP 完成后,每个 2D/3D 表示存在不一致性。首先,设置超参数和随机种子的时候要格外小心。其次,据我所知,T-SNE 只是尝试以这种方式嵌入:使相似的对象靠近,而不同的对象远离。所以当我们基于两个可视化图制作动画时,比如 epoch1 和 2,我们可能很难区分由纯粹随机性引起的运动和神经网络实际学习过程中的权重变化。也就是说,在我的实验中,我有时能够创作出合理的动画,帮助我得到一些有趣的结论。
动图一览:
这个可视化框架有很多有趣的应用。以下是分类问题的一些例子:
更好地了解关于数据的模型行为
理解神经网络训练过程中数据表示的变化
在给定数据集上对比模型——包括超参数更改,甚至架构更改
了解训练过程中词嵌入的变化(当调整时)
下文将用具体的实际例子对上述情况进行说明。
更好地理解关于数据的模型行为
恶意评论分类任务
我们在这里使用的第一个例子是 Kaggle 的一项有趣的自然语言处理竞赛:恶意评论分类,当时我正在开发这个工具。该竞赛的目标是将文本评论分为不同类别:toxic、obscene、threat、insult 等。这是一个多标签分类问题。
在神经网络模型中,我尝试了几种架构,从最简单的(没有卷积/循环的前馈神经网络)到更复杂的架构。我在神经网络的最后一层使用了二进制交叉熵损失和 sigmoid 激活函数。这样,它只为每个标签输出两个概率,从而实现多标签分类。为得到演示结果,我们使用来自双向 LSTM 的隐藏表示,该 LSTM 使用未调优的预训练词嵌入进行初始化。
所以我采取了上述相同的步骤,从最后一层提取验证集中每个文本评论的隐藏表示,执行 T-SNE/UMAP 操作将它们降维到 2 维,并使用该工一部手机就能住家创业,兼职月入过万,感兴趣者微信一商一耳零漆二零久巴零具进行可视化。在早停之前,训练进行了 5 个 epoch。使用 UMAP 的一个优点是它的速度提高了一个数量级,并且仍能有高质量的表现。谷歌最近发布了实时 TSNE,但我还没去研究。
这是第 5 个 epoch 结束时可视化的放大版本。接受可视化的类别是 insult,所以红点是_insult_s,绿点是_non-insult_s。
网友评论