Piotr Migdał作者李诗萌、路雪编译Medium选自

一图抵千言:带你了解最直观的神经网络架构可视化

神经网络是复杂、多维、非线性的数组运算。如何在避免过于复杂或重复的情况下呈现深度学习模型架构的重要特征呢?又该以何种方式清晰直观、启发性地呈现它们呢?(好看也是加分项!)无论研究还是教学项目对此都没有固定标准。本文我们就来了解一下可视化整个神经网络架构和特定模块的工具和技巧。

基线

AlexNet 是突破性的架构,它使卷积网络(CNN)成为处理大型图像分类任务的主要机器学习算法。介绍 AlexNet 的论文呈现了一张很好的图,但是好像还缺点什么……

AlexNet 架构图示。(图源:《ImageNet Classification with Deep Convolutional Neural Networks》http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf)

不需费力也能看出这张图的上半部分被意外裁掉了,而这张图会贯穿后续所有的幻灯片、参考文献等。在我看来,这说明在深度学习的研究中,可视化并不受重视(当然也有一些例外,比如线上期刊 Distill)。

有人会辩解:开发新算法和调参是真正的科学/工程,但视觉呈现则属于艺术领域,且毫无价值。我完全不同意这种观点!

当然,对于运行程序的计算机而言,代码没有缩进或者变量命名比较模糊可能无伤大雅。但对人类则不然。学术论文不是一种发现方式,而是交流方式。

以另一个复杂的理论——量子场论为例。如果你想要呈现电子-正电子的湮没过程,就要创建一个 μ 子-反 μ 子对,下图是费曼图(一阶项):

图源:https://www.hep.phy.cam.ac.uk/~thomson/partIIIparticles/handouts/Handout_4_2011.pdf

这很可爱对吧?但这张图没有什么艺术性可言。它只是散射振幅的图形表示,这张图中的每条线都是一个传播子,每一个顶点都表示点和点的交互。这张图可以直接变成下式:

我可能更偏向于「使事情更简单」,就像我在 JavaScript 中处理复杂张量运算一样,而且提前可视化结果是一件很酷的事情。在量子力学和深度学习中,我们都可以用张量结构做大量线性代数的运算。事实上,甚至有人用 Pytorch 实现爱因斯坦求和约定。

解释神经网络的层

在了解网络架构之前,我们先来关注一下网络的基本构建模块——层。例如,可以用下式描述长短期记忆模型(LSTM)单元:

当然,如果你对矩阵乘法熟悉的话,可以很容易地解出这些等式。但解出这些等式是一回事,理解它们就是另一回事了。我第一次看到 LSTM 的公式时就可以解出来,但我不知道它们是什么意思。

我所说的「理解」不是指精神上的启蒙,而是建立一个我们能够使用的心理模型(用于解释、简化、修改和预测 what-if 情景等)。一般而言,图表会比口头说明更清晰:

图源:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

《理解 LSTM 网络》是一篇关于 LSTM 的好文章,这篇文章一步步解释了 LSTM 的原理。这篇文章使我灵光一现,将一组看似随机的乘法集合转换为写作(阅读)数据的合理方法。

下图是一个更清晰的 LSTM 图:

图源:https://eli.thegreenplace.net/2018/minimal-character-based-lstm-implementation/

我认为:一张好的图抵得上一千个公式。

这几乎适用于任何模块。我们可以将概念可视化,如 dropout:

图源:论文《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》(http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf)

图示可用于解释由更小的模块(例如几个后面的卷积)组成的复合模块。看一下这个 Inception 模块的图:

图源:论文《Rethinking the Inception Architecture for Computer Vision》(https://arxiv.org/abs/1512.00567)

每个可视化的图像都是不同的——不仅是风格不同,它强调的重点和抽象的内容也不同。那么哪些是重要的呢?层数、层与层之间的连接、卷积核大小还是激活函数?这都要视情况而定。抽象意味着「独立思考事物联系和属性的过程」。难点在于确定哪些要重点强调,以及哪些可以简要概括。

例如,在批归一化(Batch Normalization)的图中,重点是逆推过程:

图源:https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html

数据可视化与数据艺术

你可能觉得我是想让深度学习的文章看起来更具吸引力。可是让图表更好看也没什么坏处啊。当我在进行数据探索时,我一般会用好看的配色方案,以使读者获得更好的阅读体验。我的主要观点是将可视化图像转变为更高效的沟通手段。

所以,更好看就意味更好吗?不一定。Lisa Charlotte Rost 的文章《The Line between Data Vis and Data Art》就很有见地地解释了二者之间的区别。

图源:https://lisacharlotterost.github.io/2015/12/19/Meaning-and-Beauty-in-Data-Vis/

以下图为例:

图源:https://www.graphcore.ai/posts/what-does-machine-learning-look-like

很美吧。对我来说,它看起来就像是有生命的——像是一个带有细胞器的细胞。但是我们能从中推断出什么吗?你猜得到它其实就是 AlexNet 吗?

举另一个例子,这是一个更注重美学而非其解释价值的多层感知器动图图示:

图源:http://chumo.github.io/Sinapsis/

要明确的是:只要我们不混淆艺术价值和教育价值,则数据艺术自身就有价值。如果你喜欢我的观点,那么我鼓励你用像火花或五颜六色的大脑这样的 3D 动画可视化真正的卷积网络。

有时候这种取舍也没那么明确。像下面这张图,它体现的是数据的可视化还是数据的艺术?

图源:论文《Going Deeper with Convolutions》(https://arxiv.org/abs/1409.4842Christian)

我猜你肯定会说:「这显然是数据可视化」。就本例而言,我们的意见出现了分歧。虽然这张图的配色方案很好,而且相似结构的重复看起来很愉快,但要根据这张图实现这个网络还是有难度的。当然,你能得到这个网络架构的重点——即层的数量以及模块的结构,但是要想重现该网络只有这些还不够(至少在没有放大镜的情况下是无法实现这个网络的)。

为了让图像变得清楚,出版物一般会为数据艺术留有一定的空间。例如,在一个用于检测皮肤状态的网络中,我们可以看到 Inception v3 特征提取层的图。很明显,作者只是使用该模型并用图表示了出来,而没有解释其内部工作原理:

图源:https://cs.stanford.edu/people/esteva/nature/

为了研究激活所选通道的视觉模式,你要如何对下面的两幅图进行分类?

图源:https://distill.pub/2017/feature-visualization/appendix/

我会把下方的图作为数据可视化的很好示例。迷幻的图像不意味着就是数据艺术。这个例子的重点在于网络架构抽象化以及相关数据的呈现(激活给定通道的输入图像)。

解释性架构图

我们看了一些层图示的例子,以及与神经网络架构相关的数据艺术。

下面就来了解一下神经网络架构的(数据)可视化。下图是 VGG16 的架构,VGG 16 是用于图像分类的标准网络。

图源:https://blog.heuritech.com/2016/02/29/a-brief-report-of-the-heuritech-deep-learning-meetup-5/

我们可以看到每一步的张量大小以及操作(用颜色标记)。它不是抽象的——盒子大小与张量形状相关。但厚度和通道数量并不成比例。

还有类似的方式是显示每个通道的值,如 DeepFace 工作示例图: 

图源:https://research.fb.com/publications/deepface-closing-the-gap-to-human-level-performance-in-face-verification/

这样的图不仅限于计算机视觉。下面是一个将文本转换为颜色的例子:

图源:https://heartbeat.fritz.ai/how-to-train-a-keras-model-to-generate-colors-3bc79e54971b

如果目的是呈现网络架构同时说明内部工作原理的话,这样的图就显得非常有用了。在教程中它们似乎尤其有用,例如 http://karpathy.github.io/2015/05/21/rnn-effectiveness/。

抽象的架构图

但对大型模型而言,解释性的图可能太过复杂或太过具体,以至于它们无法在一个图内呈现所有可能的层。所以就要用抽象图。一般而言,节点表示运算,箭头表示张量流。比较 VGG-19 和 ResNet-34:

图源:论文《Deep Residual Learning for Image Recognition》(https://arxiv.org/abs/1512.03385)

我们可以看出,上图存在一些冗余,因为有一些重复使用的单元。由于图像可能很长,最好是找到其模式并对其进行合并。这样的层级结构使理解概念以及从视觉角度呈现它们变得更加简单(除非我们只想创建 GoogLeNet 的数据艺术图)。

举个例子,我们看一下 Inception-ResNet-v1 的图:

图源:论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》(https://arxiv.org/abs/1602.07261)

我喜欢这个图的构成——我们可以看到发生了什么以及重复使用了哪些模块。

另一个让我对概念更加明晰的图是用于图像分割的 U-Net 的图:

图源:https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/

注意,这里的节点表示张量,箭头表示操作。我发现这张图非常清楚——我们可以看到张量的形状、卷积操作以及池化操作。因为原始的 U-Net 架构不是很复杂,因此我们可以不看它的层级结构。

当我们想用更复杂的构造块创建清晰的图的话会稍微复杂一点。如果要重现网络,我们需要了解网络的细节:

  • 通道的数量;

  • 每个最大池化中的卷积;

  • 最大池化的数量;

  • 批归一化或 dropout;

  • 激活函数(是不是用 ReLu 函数?是在 BN 之前还是之后?)

下面就是一个很好的抽象图示例:

图源:https://deepsense.ai/deep-learning-for-satellite-imagery-via-image-segmentation/)

这张图在配色方面还可以做得更好,不过我喜欢它简洁的形式。图中还清晰地说明了通道数量,将每一个复杂的层清晰地分解为其构造块,保留了所有的细节(注意 3 级层级结构)。

还有一个表示神经网络模块层次的有趣方法:

图源:http://deepscene.cs.uni-freiburg.de/

神经网络架构可视化的自动化工具

你可以手动绘制网络。像 Chris Olah 那样用 Inkscape、如果你喜欢 LaTeX 的话可以用 TikZ,也可以用其他工具。你也可以自动生成图像。

我希望你能意识到你已经在用视觉表示——代码(文本就是一种视觉表示!)——来与计算机进行交互。对某些项目而言,代码就足够了,尤其是如果你用的是简洁的框架(如 Keras 或 PyTorch)。对更复杂的架构来说,图会增加一些解释性的价值。

TensorBoard:图

TensorBoard 可以说是最常用的网络可视化工具。下图所示是一个 TensorFlow 网络图:

这张图是否提供了可读性较高的神经网络的概述?

我认为没有。

虽然这张图呈现了计算结构,但还是有些啰嗦(比如将偏置项作为单独的操作添加进去)。此外,它掩盖了网络最重要的部分:操作中的核心参数(如卷积核的大小)以及张量的大小。尽管有这么多的不足,我还是推荐大家阅读完整的论文:

Visualizing Dataflow Graphs of Deep Learning Models in TensorFlow(http://idl.cs.washington.edu/files/2018-TensorFlowGraph-VAST.pdf)

这篇文章提供了一些有关从下而上创建网络图所遇到的挑战的见解。虽然我们可以使用所有 TensorFlow 的操作,包括辅助操作(例如初始化工具以及日志工具),但做出一张通用的、可读的图依旧是个挑战。如果读者重视的东西我们却不重视,那就没法做出将 TensorFlow 计算图转变为有用的(比如发布就绪)图的通用工具。

Keras

Keras 是一个高级深度学习框架,因此它具有生成美观的可视化图的巨大潜力。(注:如果你想使用用于 Jupyter Notebook 的交互训练图,我写了一个:livelossplot(https://github.com/stared/livelossplot)。)然而在我看来,Keras 的默认可视化选项(使用 GraphViz)并非一流: 

图源:https://keras.io/visualization/

我认为它不仅隐藏了重要的细节,还提供了冗余的数据(重复的张量大小)。从美学上讲,我也不喜欢它。

我试着写了另一个(pip install keras_sequential_ascii)用于训练:

图源:https://github.com/stared/keras-sequential-ascii (2017)

这个结构适用于小型序列网络架构。我发现它对训练和「Starting deep learning hands-on: image classification on CIFAR-10」这样的课程很有用。但对更高级的项目则毫无用武之地(有人建议我用这篇 git 日志中的分支可视化工具(https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs))。显而易见,我不是唯一一个试着用 ASCII 美化神经网络可视化图的人:

图源:https://github.com/brianlow/keras_diagram

我认为最美观的图是我在 Keras.js 中找到的:

图源:https://transcranial.github.io/keras-js/#/squeezenet-v1.1

该项目没有处于积极开发状态,但它支持 TensorFlow.js。由于它是开源且模块化的(用了 Vue.js 框架),它可以作为创建独立的可视化项目的起点。在理想情况下,用 Jupyter Notebook 或单独的浏览器窗口工作,就像用 displaCy 分解句子一样。

总结

我们看了许多神经网络可视化的例子,这些例子都在以下方面做了取舍:

  • 数据可视化 vs 数据艺术(有用性和美观性)

  • 清晰 vs 模糊

  • 浅层 vs 层级

  • 静态(在出版物中效果很好)vs 交互(提供了更多信息)

  • 特定 vs 通用(它是否适用于广泛的神经网络族?)

  • 数据流方向(从上到下、从下到上还是从左到右?)

这些主题中的每一个都可以写一篇硕士论文,而将所有的合并在一起就可以写一篇博士论文(尤其是对人们如何进行可视化以及应该将哪些内容抽象进行细致的研究)。

原文链接:https://medium.com/inbrowserai/simple-diagrams-of-convoluted-neural-networks-39c097d2925b

入门可视化神经网络架构
10
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

Dropout技术

神经网络训练中防止过拟合的一种技术

多层感知机技术

感知机(Perceptron)一般只有一个输入层与一个输出层,导致了学习能力有限而只能解决线性可分问题。多层感知机(Multilayer Perceptron)是一类前馈(人工)神经网络及感知机的延伸,它至少由三层功能神经元(functional neuron)组成(输入层,隐层,输出层),每层神经元与下一层神经元全互连,神经元之间不存在同层连接或跨层连接,其中隐层或隐含层(hidden layer)介于输入层与输出层之间的,主要通过非线性的函数复合对信号进行逐步加工,特征提取以及表示学习。多层感知机的强大学习能力在于,虽然训练数据没有指明每层的功能,但网络的层数、每层的神经元的个数、神经元的激活函数均为可调且由模型选择预先决定,学习算法只需通过模型训练决定网络参数(连接权重与阈值),即可最好地实现对于目标函数的近似,故也被称为函数的泛逼近器(universal function approximator)。

TensorBoard技术

一个信息中心,用于显示在执行一个或多个 TensorFlow 程序期间保存的摘要信息。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

Alex网络技术

AlexNet是一个卷积神经网络的名字,最初是与CUDA一起使用GPU支持运行的,AlexNet是2012年ImageNet竞赛冠军获得者Alex Krizhevsky设计的。该网络达错误率大大减小了15.3%,比亚军高出10.8个百分点。AlexNet是由SuperVision组设计的,由Alex Krizhevsky, Geoffrey Hinton和Ilya Sutskever组成。

分类问题技术

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

批次技术

模型训练的一次迭代(即一次梯度更新)中使用的样本集。

长短期记忆网络技术

长短期记忆(Long Short-Term Memory) 是具有长期记忆能力的一种时间递归神经网络(Recurrent Neural Network)。 其网络结构含有一个或多个具有可遗忘和记忆功能的单元组成。它在1997年被提出用于解决传统RNN(Recurrent Neural Network) 的随时间反向传播中权重消失的问题(vanishing gradient problem over backpropagation-through-time),重要组成部分包括Forget Gate, Input Gate, 和 Output Gate, 分别负责决定当前输入是否被采纳,是否被长期记忆以及决定在记忆中的输入是否在当前被输出。Gated Recurrent Unit 是 LSTM 众多版本中典型的一个。因为它具有记忆性的功能,LSTM经常被用在具有时间序列特性的数据和场景中。

图网技术

ImageNet 是一个计算机视觉系统识别项目, 是目前世界上图像识别最大的数据库。

暂无评论
暂无评论~