返回介绍

1.8 凭心而论,矩阵乘法大有用途

发布于 2024-01-27 20:58:55 字数 5155 浏览 0 评论 0 收藏 0

矩阵有着让人闻风丧胆的声誉。它们唤起了我们的记忆,让我们记起在学校进行矩阵乘法时,那种让人咬牙切齿、枯燥费力的工作,以及那毫无意义的时间一小时一小时地流逝。

先前,我们手工对两层、每一层只有两节点的神经网络进行计算。对人类而言,这样的工作量也是足够大了,但是,请你想象一下,我们要对五层、每层100个节点的网络进行相同的计算,这是一种什么感受?单单是写下所有必要的计算,也是一个艰巨的任务……对每一层每一个节点,计算所有这些组合信号的组合,乘以正确的权重,应用S激活函数……

那么,矩阵如何帮助我们简化计算呢?其实,矩阵在两个方面帮助了我们。首先,矩阵允许我们压缩所有这些计算,把它们变成一种非常简单的缩写形式。由于人类不擅长于做大量枯燥的工作,而且也很容易出错,因此矩阵对人类帮助很大。第二个好处是,许多计算机编程语言理解如何与矩阵一起工作,计算机编程语言能够认识到实际的工作是重复性的,因此能够高效高速地进行计算。

总之,矩阵允许我们简洁、方便地表示我们所需的工作,同时计算机可以快速高效地完成计算。

尽管我们在学校学习矩阵时有一段痛苦的经历,但是现在大家知道我们为什么要使用矩阵了吧。让我们开始使用矩阵,揭开矩阵的神秘面纱。

矩阵仅仅是一个数字表格、矩形网格而已。对于矩阵而言,没有更多复杂的内容了。

如果你使用过电子表格,那么你已经习惯了与排列成网格的数字打交道了。下图显示了带有数字的电子表格。

这就是一个矩阵,它就是一张表格或一个数字网格,与下面大小为“2乘以3”的示例矩阵一样。

第一个数字代表行,第二个数字代表列,这是约定,因此,我们不说这是“3乘以2”的矩阵,而是说这是“2乘以3”的矩阵。

此外,一些人使用方括号表示矩阵,另一些人与我们一样,使用圆括号表示矩阵。

其实,矩阵的元素也不必是数字,它们也可以是我们命名的、但还未赋予实际的数值的一个量。因此,以下是这样一个矩阵:每个元素都是一个变量,具有一定的意义。虽然每个元素也可以具有一个数字数值,但是我们只是还未说明这些数值为多少。

矩阵对我们很有用处,让我们看看它们是如何相乘的。你可能还记得我们在学校时是如何进行矩阵计算的;如果你还没有这种经历,让我们再演示一遍。

下面是两个简单矩阵相乘的一个示例。

你可以观察到,我们并不是简单地将对应的元素进行相乘。左上角的答案不是1 × 5,右下角的答案也不是4×8。

相反,矩阵使用不同的规则进行乘法运算。通过观察上面的示例,你可以得出这些规则。如果你不能总结出这些规则,那么请仔细观察下图,下图中突出显示了答案中左上角的元素是如何计算得出的。

你可以看到,左上角的元素是通过第一个矩阵的顶行和第二个矩阵的左列计算得出的。顺着这些行和列,将你遇到的元素进行相乘,并将所得到的值加起来。因此,为了计算左上角元素的答案,我们开始沿着第一个矩阵的第一行移动,我们找到数字1,当我们开始沿着第二个矩阵的左列移动,我们找到数字5,我们将1和5相乘,得到5。我们继续沿着行和列移动,找到数字2和7,将2和7相乘,我们得到14,保留这个数字。

我们已经到达了行和列的末尾,因此我们将所有得到的数字相加,即5 + 14,得到19。这就是结果矩阵中左上角的元素。

虽然这描述起来非常啰嗦,但是,在操作时,这很容易观察得到。你自己可以试一试。下面,我们介绍右下角元素是如何计算得出的。

同样,在下图中,你可以观察到我们尝试计算的所对应的行和列(在这个示例中,是第二行和第二列),我们得到(3×6)和(4×8),最后得到18 + 32 = 50。

左下角的元素计算公式为(3 * 5)+(4 * 7)= 15 + 28 = 43。同样地,右上角元素的计算公式为(1 * 6)+(2 * 8)= 6 + 16 = 22。

下面我们使用变量,而不是数字,来详细说明规则。

这是我们说明矩阵相乘方法的另一种方式。使用代表任意数字的字母,我们可以更加清晰地理解矩阵相乘的一般规则。这种规则可以应用到各种大小的矩阵上,因此是一种通用规则。

虽然我们说这种方法适用于不同大小的矩阵,但这里有一个重要的限制。你不能对两个任意矩阵进行乘法运算,这两个矩阵需要互相兼容。你可能已经观察到了,第一个矩阵的行和第二个矩阵的列,这两者应该是互相匹配的。如果行元素的数量与列元素的数量不匹配,那么这种方法就行不通了。因此,你不能将“2乘以2”的矩阵与“5乘以5”的矩阵相乘。你可以尝试一下,就明白为什么这行不通了。为了能够进行矩阵相乘,第一个矩阵中的列数目应该等于第二个矩阵中的行数目。

在一些书籍中,你会看到这样的矩阵乘法称为点乘(dot product)或内积(inner product)。实际上,对于矩阵而言,有不同类型的乘法,如叉乘,但是我们此处所指的是点乘。

为什么我们要讨论让人望而生畏的矩阵乘法和令人反感的代数呢?这看起来像是一个“无底洞”。这里有一个非常重要的理由……我们先暂且不提!

请仔细观察,如果我们将字母换成对神经网络更有意义的单词,那么会发生什么情况呢?虽然第二个矩阵是2乘以1的矩阵,但是乘法规则是相同的。

见证奇迹的时刻到来了!

第一个矩阵包含两层节点之间的权重。第二个矩阵包含第一层输入层的信号。通过两个矩阵相乘,我们得到的答案是输入到第二层节点组合调节后的信号。仔细观察,你就会明白这点。由权重w1,1 调节的input_1加上由权重w2,1 调节的input_2,就是第二层第一个节点的输入值。这些值就是在应用S函数之前的x的值。

下图非常清楚地显示了这一点。

这真的非常有用啊!

为什么呢?因为我们可以使用矩阵乘法表示所有计算,计算出组合调节后的信号x ,输入到第二层的节点中。我们可以使用下式,非常简洁地表示:

X = WI

此处,W 是权重矩阵,I 是输入矩阵,X 是组合调节后的信号,即输入到第二层的结果矩阵。矩阵通常使用斜体显示,表示它们是矩阵,而不是单个数字。

现在,我们不需要在乎每一层有多少个节点。如果我们有较多的节点,那么矩阵将会变得较大。但是,我们不需要写出长长的一串数字或大量的文字。我们可以简单地写为WI ,不管I有2个元素还是有200个元素。

现在,如果计算机编程语言可以理解矩阵符号,那么计算机就可以完成所有这些艰辛的计算工作,算出X = WI ,而无需我们对每一层的每个节点给出单独的计算指令。

这真是太棒了!只要努力一点,理解矩阵乘法,就可以找到如此强大的工具,这样我们无需花费太多精力就可以实现神经网络了。

有关激活函数,我们该了解些什么呢?激活函数其实很简单,并不需要矩阵乘法。我们所需做的,是对矩阵X 的每个单独元素应用S函数y = 1 /(1 + e -x )。

此处,我们不需要组合来自不同节点的信号,我们已经完成了这种操作,答案就在X 中。虽然这听起来如此简单,但是这是正确的。正如我们先前看到的,激活函数只是简单地应用阈值,使反应变得更像是在生物神经元中观察到的行为。因此,来自第二层的最终输出是:

O = sigmoid ( X )

斜体的O 代表矩阵,这个矩阵包含了来自神经网络的最后一层中的所有输出。

表达式X = WI 适用于前后层之间的计算。比如说,我们有3层,我们简单地再次进行矩阵乘法,使用第二层的输出作为第三层的输入。当然,这个输出应该使用权重系数进行调节并进行组合。

理论已经足够了,现在,让我们看看这如何在一个真实示例中工作。这一次,我们将使用3层、每一层有3个节点的、稍大一点的神经网络。


关键点

· 通过神经网络向前馈送信号所需的大量运算可以表示为矩阵乘法。

· 不管神经网络的规模如何,将输入输出表达为矩阵乘法,使得我们可以更简洁地进行书写。

· 更重要的是,一些计算机编程语言理解矩阵计算,并认识到潜在的计算方法的相似性。这允许计算机高速高效地进行这些计算。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文