Python:神经网络-神经网络中的线性代数 (五十四)

神经网络中的线性代数。

简介

你可能会疑问,为何要花时间学习线性代数。我们在简介部分强调了线性代数是一个重要的数学分支,可以帮助我们运用和理解很多学科,例如统计学、计算科学、经济学,但是在这节课我们将重点讲解其在神经网络中的运用!

在这节课,我们将简单介绍什么是神经网络,从而帮助你理解线性代数可以如何完美地运用到神经网络中。简而言之,请重点学习数学知识及其应用方式。如果某些与神经网络直接相关的知识点不太明白,也没关系,因为马上就会学习整个神经网络课程。

什么是神经网络?

神经网络是神经科学的一个重要研究领域。对于计算机科学家、工程师或纯粹神经科学领域之外的其他专业人士来说,神经网络实际上是指人工神经网络

人工神经网络的设计灵感来自生物大脑结构。下面的人工网络中使用的神经元本质上是数学函数。

每个网络都具有:

  • 输入神经元 - 称之为神经元的输入层
  • 输出神经元 - 称之为神经元的输出层

以及

  • 内部神经元 - 称之为神经元的隐藏层。每个神经网络可以有很多个隐藏层
    下图是一个简单的神经网络,其中只有一个隐藏层。
    file

这个简化的人工神经网络由以下部分组成:

file

向量中的每个元素都是一个数学参数,稍后我们会详细讲解。

注意,输入数量和隐藏层中的隐藏神经元数量或输出数量没有联系。

(此处用到的记法是行向量,这些向量也可以表示为列向量)

神经元如何相连?

再回到我们刚刚看到的图片:
file

注意到连接不同神经元的“线条”了吗?

  • 在实际操作中,这些线条表示以数学方式将一个神经元与另一个神经元相连的系数(标量)。这些系数称之为权重。
  • 这些“线条”将特定层中的每个神经元与下个层中的所有神经元相连。例如,在我们的示例中,可以看出隐藏层中的每个神经元都与输出层中的神经元相连。

因为有太多的权重将一个层与另一个层相连,因此我们以数学方式将这些系数整理为一个矩阵,称之为权重矩阵

file

知识提醒:

稍后你将学习:当我们训练人工神经网络时,实际上是寻找带来期望结果的一组最佳权重。在线性代数课程中,我们不会重点讲解这方面的知识

那么所有这些与线性代数有何关系?我们来一探究竟!

前馈流程-计算h

在此部分,我们将深入学习前馈流程的数学原理。借助线性代数工具,这些计算变得非常简单!

假设有一个隐藏层,我们将需要完成两个计算步骤。第一步是计算隐藏状态的值,第二步是计算输出的值。

file

注意,隐藏层和输出层都显示为向量,因为它们都由多个神经元表示。

计算隐藏状态的值

我们先来看前馈的部分,为了简化计算,我们取 n 个输入,一个包含三个神经元的隐藏层,以及两个输出层,顺便提一句,在现实中,一个隐藏层可以有数千个神经元,我们用 W1 来表示 x 与 h 之间的权重集合,用W2 来表示 h与y之间的权重集合,因为我们只有一个隐藏层,所以,每个前馈循环只有两步。第一步,借助权重集合 W1 来求与给定输入对应的h,第二步,借助权重集合 W2 求得与上一步得到的 h 对应的输出 y。

file

你会发现,除了用非线性激活函数外,所有计算都涉及输入与权重的线性组合,换句话说都会用到矩阵乘法

第一步,求h

file

注意,如果隐藏层神经元不止一个,其实神经元数目通常都不止一个,那 h 就是一个向量。

所以,每个向量 h 都等于向量x乘以权重矩阵 W1 的值,如果让输入向量乘以权重矩阵,隐藏层的各神经元就会得到一个简单的线性组合,由此可以求得向量h。

file

举个例子 h1 就会等于 x1 W11 + x2W21 + ... xn*Wn1。
但至此,隐藏层的计算尚未结束,注意到这里的“'”符号了吗?指的就是我们还没求得h,就快了,但还差一点,为了防止 h 的值爆炸或涨幅过多,我们需要使用激活函数(Activation function)

file

激活函数

算出 \(\vec{h'} \) 后,我们需要激活函数。激活函数的符号是希腊字母 Φ:\( \PhiΦ\)。此激活函数会确定隐藏层值的计算结果。我们可以使用以下两个方程表示最后的隐藏向量 \(\vec{h'} \):

file

因为 \(W_{ij}\) 表示权重矩阵的权重部分,将输入中的神经元 i 与隐藏层中的神经元 j 相连,我们还可以使用线性组合表示这些计算过程(注意,在此示例中,我们有 n 个输入,只有 3 个隐藏神经元)

file

你可以在下节课(神经网络入门)中详细了解激活函数及如何使用这些激活函数。

前馈流程-计算y

我们已经完成第一步:计算 \(\vec{h}\) ,现在我们需要计算输出 \(\vec{y}\)。
file

有时候,我们需要很多个隐藏层才能逼近 \(\vec{y}\),这里我用 p 泛指 p 层,每一层都可以有不同数量的神经元,正如之前提到的,每一层都可以有数千个神经元,基本上,你可以把这些神经元看成可以堆砌的砖块或乐高积木,那这个过程要怎么转换成数学运算呢?就跟之前一样,只需将向量和矩阵相乘,然后将结果代入激活函数。其中,向量为输入,矩阵为连接相邻两层的权重。

file

模型归纳

我们来进行模型归纳,来看一个随机 K 层模型,其中连接 K 和 K+1 层的权重 Wij ,位于第 i 个输入与第 j 个输出之间,
file

我们把K层作为输入 x,把 K + 1 层作为隐藏层 h 的输出,因此,我们会有 n 个 x 输入和 m 个 h 输出,如果我们处理的不是输入,而是上一个隐藏层的输出,那唯一要改的只有这些字母标示,计算过程是一样的,所以,我们用简单的表示符号就好,就还是 x 把 h1 是一个激活函数的输出,该函数以每个输入 xi 与相应权重 wi1 乘积的和为参数,以此类推, hm 也是一个激活函数的输出,该函数以每个输入 xi 与相应权重 wim 乘积的和为参数,

file

举个例子,如果我们有三个输入,想要计算 h1 的话,只需将下列线性组合代入激活函数,求得输出结果即可。
file

计算输出向量的流程在数学上和计算隐藏层向量相似。我们同样会使用矩阵乘法。向量是新计算的隐藏层,矩阵是将隐藏层与输出相连的矩阵。

本质上,神经网络中的每个新层都通过向量与矩阵相乘计算得出,其中向量表示新层的输入,矩阵表示将这些新输入与下个层相连的矩阵

file

为者常成,行者常至