图片由作者创建,改编自https://tikz.net/neural_networks/(CC BY-SA 4.0)
由Aaron Master和Doron Bergman撰写
如果你是尝试学习神经网络的数百万人之一,那么你很可能见过类似上面的图片。
这个图有一个问题:它没有任何意义。
也就是说,这个图令人困惑、不完整,而且可能有误。该图受某知名在线深度学习课程中的一张图启发,但排除了所有的偏置系数,并将数据展示为一个函数或节点。它“可能”错误地显示了输入。我们说“可能”,是因为即使在我们中的一个人完成了该课程并获得了证书后,仍然很难确定这张图想要表达的内容。¹
其他的神经网络图以不同的方式存在缺陷。这里有一个由位于山景城的一家广告公司提供的某个TensorFlow课程中的插图启发的示例:
图由作者创建,基于之前的图像改编。
这个图比第一个图更清晰地展示了输入,这是一个改进。但它也做了一些奇怪的事情:它通过名称显示了偏置,却没有在图中直观地表示出来,还把一些量按照它们被使用或创建的顺序之外的方式展示了出来。
为什么?这些图表是如何形成的很难猜测。第一个图表乍一看与图论中使用的流网络图表相似。但它违反了这种流图的核心规则,即流入节点的流量等于流出该节点的流量(这里不适用例外情况)。第二个图表看起来可能是从第一个图表开始的,但最终被编辑成同时显示参数_和_数据,结果顺序却错了。²这两个图表都没有以可视化的方式展示偏置(我们见过的大多数图表也是如此),但这种选择并没有节省多少空间,这一点我们将在下面看到。
我们并没有特意挑选这些图表。在网上搜索“神经网络图”时可以发现,上述图表是常态,而非特例。
糟糕的图表对学生的帮助不大上述图表如果只是在经验丰富的专业人士之间使用的话可能还勉强可以接受。但遗憾的是,它们被用于教授机器学习的无辜学生。
学习者遇到这种奇怪的情况时,必须做书面或心理笔记,例如“这里有偏差,但他们没有显示出来”,或者“他们画在圆圈内的东西实际上是两页幻灯片前显示在同一圆圈内的处理的输出”,或者“输入实际上并不像画的那样工作。”上述著名的(通常非常出色)课程中,讲师耐心地多次重复,某个网络实际上并不像图表所示那样工作。在课程的第三周,他勇敢地试图折中处理,交替使用特别准确的描绘来显示节点内部发生的事情,以及更常见的图表来显示其他内容。(如果你想看到更好的节点描绘,这篇博客文章很好地展示了它们。)
更好的方法学习神经网络不应该成为解读误导性图表的练习。我们提出了一种新的、构造性的方法来教授和学习神经网络:使用好的图表。我们希望这些图表能够简洁而准确地表示出数学内容——就像费曼图、文氏图、数字滤波器图和电路图那样。
让我们制作GOOD图表那么,我们具体要提出什么呢?让我们从基础开始。神经网络涉及许多简单的操作,这些操作已经几十年来被电气工程师用流程图表示出来了。具体来说,我们可以用符号来表示复制数据、乘以数据、加数据以及将数据输入到输出数据的函数中。然后,我们可以将这些符号的简写版本组合成一个完整的准确图示,我们将这种图示称为“一般客观可观测图示”,简称GOOD图。(抱歉,对于那些讨厌缩写词的人。)
让我们来看一下构建模块。首先,这是如何显示从单一数据源总共复制三次数据的方法。非常直观。
这里展示输入放缩的方式。它只是一个三角形。
三角形表示输入值 x ₁ 进入后会被某个数 w ₁ 缩放,从而产生结果 w ₁ 乘以 x ₁。例如,w ₁ 可以是 0.5 或 1.2。稍后,如果我们将这个三角形移到图的右端(与箭头合并),并将其画得很小,会更方便一些,所以我们这样画。
好的,我们承认这一点:这只是一个带有实心三角形箭头。重点在于,这个三角形箭头将箭头上的数据进行了放大。
接下来,这里有一种方法来表示将两件或更多事物相加。让我们将总和称为 z。同样很简单。
现在,我们上面用一些标准符号展示了加法和乘法。但是如果我们有一个更一般的函数,它接受输入并产生输出呢?更具体地说,在构建神经网络时,我们会使用一个称为激活函数的函数,它通常是Sigmoid或ReLU。无论哪种情况,绘制图表都不是问题;我们只需将其表示为一个方框。例如,假设输入到我们函数中的值称为z,函数_g(z)_产生输出a。它看起来像这样:
可选地,我们可以指出 g(z) 具有给定的输入-输出特性,可以将其放在函数框附近。这里有一个包含 ReLU 的 g(z) 图以及函数框的示意图。在实践中,只有少数几种常用的激活函数,因此也可以只在靠近层的位置标注函数名称(例如 ReLU)。
或者,我们还可以进一步简化,因为在典型的神经网络中将存在许多激活函数,且这些函数往往是相同的。我们建议使用单个风格化的字母来表示特定的激活函数,例如使用 R 来表示 ReLU:
同样,Sigmoid 可以用一个艺术化的 S 来表示,其他函数可以用另一个指定的字母来表示。
在继续之前,让我们注意一个简单但关键的事实:我们用 箭头 来表示 数据(及其流动方向),用 形状(三角形、圆形、正方形)来表示 操作(乘法、加法、一般函数)。这是电气工程流程图中的标准做法。 但是出于某种原因,可能是受到了早期计算机科学研究的启发,这些研究将内存和操作物理上集中在一起,这种约定在绘制神经网络时被忽略了甚至被反转了。³ 不过,这种区分很重要,因为我们 确实 训练函数参数,但我们 不 训练数据,每个数据实例都是不可变的。
好的,回到我们的故事。由于我们将很快构建一个神经网络图,它需要描绘很多“求和然后函数”处理。为了使我们的图更加紧凑,我们将使用一个简化的符号来结合这两个功能。首先,让我们将它们画在一起,假设 g(z) 使用 ReLU。
由于我们将要简化一些内容,让我们看看它们在紧密排列时的样子。我们将从图中移除内部变量和函数符号,并添加一些虚线以暗示一个提议的形状:
基于此,让我们介绍一个新的总结符号来表示“求和后函数”:
它特殊的形状提醒着它正在做什么。它与其他符号有意看起来不同,以帮助我们记住它是特殊的。
一件GOOD好事现在,让我们通过一个简单的 逻辑回归 示例,将上述所有图示操作结合起来。我们的示例从一个二维输入开始,将每个输入维度的值乘以一个唯一的常数,将结果相加,再加上一个常数 b(我们称之为 偏置),然后将总和通过一个 Sigmoid 激活函数。出于后面会讲到的原因,我们将偏置表示为 1 乘以 b 的值。为了完整性和预示后续内容,我们给所有这些值命名,以便在图中显示。输入是 x ₁ 和 x ₂,乘法因子包括权重 w ₁ 和 w ₂ 以及偏置 b。加权输入和偏置的总和是 z,函数 g(z) 的输出是 a。
关于图左下角显示的数字“1”。这个数字“1”并不是输入,但通过在输入之外显示这个数字,我们明确了每个值都是通过一个参数乘积来贡献于总和的。这样我们就可以在同一张图中展示 w(输入权重)和 b(偏置)的值。糟糕的图表通常会省略显示偏置,而好的图表不会。在某些情况下,网络可能会故意省略偏置,如果图中不显示偏置,观看者只能猜测偏置是否是网络的一部分。因此,请在你的图表中明确地包含或排除偏置。
现在让我们用上面定义的“求和然后函数”符号来简化一下。我们还在图下方展示了变量名称。请注意,我们在“求和然后函数”符号中用艺术化的字母 S 来表示 Sigmoid 函数。
那看起来很简单。这是一件好事。
现在,让我们构建一些更有趣的东西:一个实际的神经网络(NN),它有一个包含三个单元并使用ReLU激活函数的隐藏层,以及一个使用Sigmoid激活函数的输出层。(如果你不熟悉,隐藏层是指输入层和输出层之外的任何一层。)请注意,这与上文提到的Mountain View网络图中的架构相同。在这种情况下,每个输入维度和输入层的偏置都连接到隐藏层中的每个节点,然后隐藏层的输出(加上偏置值)连接到输出节点。每个函数的输出仍然称为a,但我们使用括号中的上标和下标分别表示我们是从哪个层和哪个节点输出的。同样,我们使用括号中的上标来表示_w_和_b_值指向的层。按照之前的例子的风格,它看起来像这样:
现在我们有点眉目了。此时我们也看到,每一层的_W_和_b_的维度由输入的维度和每一层节点的数量来确定。让我们通过不再单独标记每一个_w_和_b_值来简化上面的图。
本文中所有图片均由作者提供。
ta-da!我们有一个优秀的神经网络图,这个图也很好。可学习的_参数_既在图中显示(以三角形表示),也在图下方进行了总结,而_数据_则直接以标记的箭头形式显示在图中。网络的架构和激活函数,通常称为超参数,可以通过检查图的布局和节点来观察。
它都是GOOD让我们来考虑GOOD图表的好处,独立于那些不好的图表:
- 可以很容易地看到每一层的操作顺序。首先是乘法运算,然后是求和,最后是激活函数。
- 可以很容易地看到(不可变)数据在网络中流动,与属于网络的(可训练)参数区分开来。
- 可以很容易地看到每一层的 w 矩阵和 b 向量的维度。对于一个有 N 个节点的层,很明显 b 的形状应该是 [N,1]。对于一个有 N 个节点的层,它接在一个有 M 个节点(或输入)的层后面,很明显 w 的形状应该是 [N,M]。(但是,仍然需要记住形状是 [outputs, inputs] 而不是 [inputs, outputs]。)
- 相关地,我们可以看到权重和偏差的确切位置,它们位于层之间。按照惯例,它们被命名为属于它们输出到的层,但使用 GOOD 图的学生会被提醒这只是命名约定。
让我们也来回顾一下GOOD图表与差的图表有何不同:
- 它们展示了每一层的偏置。它们没有省略偏置。
- 它们将数据展示为数据,将函数展示为函数。它们不会混淆两者。
- 它们展示了数据被复制并传递给函数的过程。它们不会省略这一步骤。
- 它们展示了所有步骤的正确顺序。它们不会错误地重新排序或省略步骤。
- 它们相对简洁明了。好吧,那些不好的图可能稍微简洁了一些。
这篇文章已经花费了大量篇幅讨论糟糕的图表存在的问题,并论证了良好图表(GOOD diagrams)的优点。但是,如果你是一名机器学习讲师,我们鼓励你直接开始使用良好图表(GOOD diagrams),无需过多的宣传。良好图表比其他选项更具自解释性。你将在课程中讲解神经网络的工作原理,因此在那时引入良好图表是一个好主意。
当然,为了帮助您的学生,展示一些不好的图表也是一个好主意。了解外界是如何绘制这些图表的非常重要,即使这些图表毫无意义。据我们估计,从准确的内容学习,然后再去理解一些令人困惑的内容,要比反过来做要容易得多。
更多精彩内容即将呈现这完成了第一篇文章,如果它受到欢迎,这将是一系列文章中的第一篇。特别是,我们关注的是简化网络图,这些图紧凑地表示了上面所示的全连接网络,并且这些图还有改进的空间。卷积网络图也值得单独讨论。我们还在开发一个软件包,该软件包可以自动绘制GOOD图。
致谢作者感谢Jeremy Schiff和Mikiko Bazeley对此作品提供的帮助。
参考文献和注释1) 根据其他层的情况,可能第一个图是将输入传递给非平凡的激活函数,从而得到与输入 不同 的值。但在相关的课程中没有出现过这种工作方式的例子,所以将这样的图作为作弊表中 唯一 的全连接图是没有意义的。或者第一个层显示的“ a ”值与输入 相同 ,在这种情况下,激活函数是恒等函数,这会导致平凡且不必要的处理。无论如何,这个图是模棱两可的,因此是不好的。
2) 前两个图中的任何一个看起来都像是对更好的、更早的图的不幸简化,例如Duda、Hart和Stork所著的《Pattern Classification》第二版第六章中的那些图(其中一本我们仍然从2002年在斯坦福大学CS229课程中保留了纸质版)。该书展示了在圆形单元中的激活函数(这比在单元内部显示其输出要好),并且正确地展示了输出在流向下一层次之前从单元中离开并被复制和分流。 (它还以一种奇怪的方式展示了输入和偏差。)
3) 如果你的研究进展到包括卷积网络(CN)的话,你会发现卷积网络的图通常会将 数据 表示为方块,而将 过程 表示为带有注释的箭头。不要担心。目前,只需要记住数据和过程之间存在本质区别,并且对于全连接神经网络,一个好的(或称作GOOD的)图会清晰地表明哪些是数据,哪些是过程。
4) 对于喜欢逻辑的朋友们来说,如果你们将“求和然后函数”符号视为反向工作的“与门”,请记住“与门”是不可逆的。因此,这个新符号必须有另一种含义,我们在这里对其进行定义。
共同学习,写下你的评论
评论加载中...
作者其他优质文章