\parinterval 人工神经网络的第一个发展阶段是在二十世纪40年代到70年代,这个时期的人工神经网络还停留在利用线性模型模拟生物神经元的阶段,比如使用线性加权函数来描述输入$\mathbf x $和输出$ y $之间的联系:$ f(\mathbf x,\mathbf w)=x_1\cdot w_1+\dots+ x_n \cdot w_n $,举一个简单例子,输入$\mathbf x $是这个地区的坐标和时间,输出$ y $是这个地区的温度,尽管真实的问题可能要复杂的多,但是线性模型确实有能力去拟合简单的函数关系。
\parinterval 人工神经网络的第一个发展阶段是在二十世纪40年代到70年代,这个时期的人工神经网络还停留在利用线性模型模拟生物神经元的阶段,比如使用线性加权函数来描述输入$\mathbf x $和输出$ y $之间的联系:$ f(\mathbf x,\mathbf w)=x_1\cdot w_1+\dots+ x_n \cdot w_n $,举一个简单例子,输入$\mathbf x $是这个地区的坐标和时间,输出$ y $是这个地区的温度,尽管真实的问题可能要复杂的多,但是线性模型确实有能力去拟合简单的函数关系。
\parinterval\textbf{矩阵}(Matrix):在数学中,矩阵是一个按照长方阵列排列的实数集合,最早来自于方程组的系数及常数所构成的方阵。在计算机领域,通常将矩阵看作二维数组。我们用粗体的符号$\mathbf a $表示一个矩阵,如果该矩阵有$ m $行$ n $列,那么我们说$\mathbf a\in R^{m\times n}$。我们通常用不加粗的形式来表示矩阵中的元素,其中每个元素都被一个行索引和一个列索引。例如,$ a_{ij}$表示第$ i $行、第$ j $列的矩阵元素。如下,$\mathbf a $就定义了一个2行2列的矩阵。
\parinterval\textbf{转置}(transpose)是矩阵的重要操作之一。矩阵的转置可以看作是将矩阵以对角线为镜像进行翻转:假设$\mathbf a $为$ m $行$ n $列的矩阵,第$ i $行第$ j $列的元素是$ a_{ij}$,即:$\mathbf a={(a_{ij})}_{m\times n}$,把$ m\times n $矩阵$\mathbf a $的行换成同序数的列得到一个$ n\times m $矩阵,则得到$\mathbf a $的转置矩阵,记为$\mathbf a^{\rm T}$,其中$ a_{ji}^{\rm T}=a_{ij}$。例如:
\parinterval 矩阵乘法是矩阵运算中最重要的操作之一,为了与矩阵点乘区分,我们通常也把矩阵乘法叫做矩阵的叉乘。假设$\mathbf a $为$ m\times p $的矩阵,$\mathbf b $为$ p\times n $的矩阵,对$\mathbf a $和$\mathbf b $作矩阵乘积的结果是一个$ m\times n $的矩阵$\mathbf c $,其中矩阵$\mathbf c $中第$ i $行、第$ j $列的元素可以表示为:
\parinterval 对于神经网络中的某层神经元$\mathbf y=f(\mathbf x\cdot\mathbf w+\mathbf b)$,其中$\mathbf w $是权重矩阵,例如$\begin{pmatrix}1&2\\3&4\end{pmatrix}$\\,$\mathbf b $是偏移向量,例如$(1,3)$。在这里,输入$\mathbf x $和输出$\mathbf y $,可以不是简单的向量或是矩阵形式,而是深度学习中更加通用的数学量\raisebox{0.5mm}{------}张量,比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
\parinterval 对于神经网络中的某层神经元$\mathbf y=f(\mathbf x\cdot\mathbf w+\mathbf b)$,其中$\mathbf w $是权重矩阵,例如$\begin{pmatrix}1&2\\3&4\end{pmatrix}$\\,$\mathbf b $是偏移向量,例如$(1,3)$。在这里,输入$\mathbf x $和输出$\mathbf y $,可以不是简单的向量或是矩阵形式,而是深度学习中更加通用的数学量\raisebox{0.5mm}{------}张量,比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
\parinterval 不过,更广泛接受的定义是:张量是多重线性函数,是定义在一些向量空间和笛卡尔积上的多重线性映射。张量的多重线性表现在,对于每一个输入函数都是线性的。比如,张量$\mathbf T(v_0,v_1,\dots,v_r)$,其输入是r个向量$\{v_0,v_1,\dots,v_r\}$,对于张量$\mathbf T $的任意一个$ v_i $,都有$\mathbf T(v_0,\dots,v_i+c\cdot u,\dots,v_r)=\mathbf T(v_0,\dots,v_i,\dots,v_r)+c\cdot{\mathbf T(v_0,\dots,u,\dots,v_r)}$。其中,$ c $为任意实数。这个性质非常重要,根据这个性质可以推导出张量的其他定义。
\parinterval 不过,更广泛接受的定义是:张量是多重线性函数,是定义在一些向量空间和笛卡尔积上的多重线性映射。张量的多重线性表现在,对于每一个输入函数都是线性的。比如,张量$\mathbf T(v_0,v_1,\dots,v_r)$,其输入是$r$个向量$\{v_0,v_1,\dots,v_r\}$,对于张量$\mathbf T $的任意一个$ v_i $,都有$\mathbf T(v_0,\dots,v_i+c\cdot u,\dots,v_r)=\mathbf T(v_0,\dots,v_i,\dots,v_r)+c\cdot{\mathbf T(v_0,\dots,u,\dots,v_r)}$。其中,$ c $为任意实数。这个性质非常重要,根据这个性质可以推导出张量的其他定义。
\parinterval 从我们物理世界看,如果一个物理量在物体的某个位置上只是一个单值,那么它是一个标量,例如密度;如果一个物理量在同一个位置、从多个方向上看,有不同的值,那么这个物理量就是一个的张量。比如物理学中常用的应力的描述就是一个典型的张量。举一个简单的例子:$\mathbf T(\mathbf v,\mathbf u)$是一个三维空间(x,y,z)上的2阶张量,其中$\mathbf v $和$\mathbf u $是两个向量,如图\ref{fig:tensor}所示,向量$\mathbf v $在某个两两垂直的三维坐标系中可以表示为${(\begin{array}{ccc} a & b & c\end{array})}^{\rm T}$,同理向量$\mathbf u $在某个两两垂直的三维坐标系中可以表示为${(\begin{array}{ccc} a' & b' & c' \end{array})}^{\rm T}$。但在三维空间(x,y,z)中,向量$\mathbf v $和向量$\mathbf u $分别被表示为${(\begin{array}{ccc} v_x & v_y & v_z\end{array})}^{\rm T}$和${(\begin{array}{ccc} u_x & u_y & u_z\end{array})}^{\rm T}$。
\parinterval 对于一层神经网络,$\mathbf y=f(\mathbf x\cdot\mathbf w+\mathbf b)$中的$\mathbf x\cdot\mathbf w $表示对输入$\mathbf x $进行线性变换,其中$\mathbf x $是输入张量,$\mathbf w $是权重矩阵。$\mathbf x\cdot\mathbf w $表示的是矩阵乘法,需要注意的是这里是矩阵乘法而不是张量乘法。
\parinterval 张量乘以矩阵是怎样计算呢?我们可以先回忆一下5.2.1节的线性代数的知识。假设$\mathbf a $为$ m\times p $的矩阵,$\mathbf b $为$ p\times n $的矩阵,对$\mathbf a $和$\mathbf b $作矩阵乘积的结果是一个$ m\times n $的矩阵$\mathbf c $,其中矩阵$\mathbf c $中第$ i $行第$ j $列的元素可以表示为:
\parinterval 张量乘以矩阵是怎样计算呢?我们可以先回忆一下5.2.1节的线性代数的知识。假设$\mathbf a $为$ m\times p $的矩阵,$\mathbf b $为$ p\times n $的矩阵,对$\mathbf a $和$\mathbf b $作矩阵乘积的结果是一个$ m\times n $的矩阵$\mathbf c $,其中矩阵$\mathbf c $中第$ i $行第$ j $列的元素可以表示为: