\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 对于一个单层神经网络,$\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 张量乘以矩阵是怎样计算呢?可以先回忆一下\ref{sec: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 张量乘以矩阵是怎样计算呢?可以先回忆一下\ref{sec: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 将矩阵乘法扩展到高阶张量中:一个张量$\mathbf x $若要与矩阵$\mathbf w $做矩阵乘法,则$\mathbf x $的第一维度需要与$\mathbf w $的行数大小相等,即:若张量$\mathbf x $的形状为$\cdot\times n $,$\mathbf w $须为$ n\times\cdot$的矩阵。如下是一个例子,
\parinterval 一个张量$\mathbf x $若要与矩阵$\mathbf w $做矩阵乘法,则$\mathbf x $的第一维度需要与$\mathbf w $的行数大小相等,即:若张量$\mathbf x $的形状为$\cdot\times n $,$\mathbf w $须为$ n\times\cdot$的矩阵。
\parinterval 公式\ref{eqa1.25}是一个例子,其中,张量$\mathbf x $沿第1阶所在的方向与矩阵$\mathbf w $进行矩阵运算(张量$\mathbf x $第1阶的每个维度都可以看做一个$4\times4$的矩阵)。图\ref{fig:tensor-mul}演示了这个计算过程。张量$\mathbf x $中编号为\ding{172}的子张量(可看作矩阵)与矩阵$\mathbf w $进行矩阵乘法,其结果对应张量$\mathbf s $中编号为\ding{172}的子张量。这个过程会循环四次,因为有四个这样的矩阵(子张量)。最终,图\ref{fig:tensor-mul}给出了结果张量的形式($4\ast4\ast2$)。
\noindent 其中,张量$\mathbf x $沿第1阶所在的方向与矩阵$\mathbf w $进行矩阵运算(张量$\mathbf x $第1阶的每个维度都可以看做一个$4\times4$的矩阵)。图\ref{fig:tensor-mul}演示了这个计算过程。张量$\mathbf x $中编号为\ding{172}的子张量(可看作矩阵)与矩阵$\mathbf w $进行矩阵乘法,其结果对应张量$\mathbf s $中编号为\ding{172}的子张量。这个过程会循环四次,因为有四个这样的矩阵(子张量)。最终,图\ref{fig:tensor-mul}给出了结果张量的形式($4\times4\times2$)。
\item$\mathbf s+\mathbf b $中的单元加就是对张量中的每个位置都进行加法。在本例中$\mathbf s $是形状为$(1:4,1:4,1:2)$的3阶张量,而$\mathbf b $是含有4个元素的向量,在形状不同的情况下是怎样进行单元加的呢?在这里需要引入{\small\sffamily\bfseries{广播机制}}:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失或长度为1的维度上进行,它是深度学习框架中常用的计算方式。来看一个具体的例子,如图\ref{fig:broadcast}所示,$\mathbf s $是一个$2\times4$的矩阵而$\mathbf b $是一个长度为4的向量,这两者进行单元加运算时,广播机制会将$\mathbf b $沿维度0复制后,再与$\mathbf s $做加法运算。
\item$\mathbf s+\mathbf b $中的单元加就是对张量中的每个位置都进行加法。在本例中$\mathbf s $是形状为$(1:4,1:4,1:2)$的3阶张量,而$\mathbf b $是含有4个元素的向量,在形状不同的情况下是怎样进行单元加的呢?在这里需要引入{\small\sffamily\bfseries{广播机制}}:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失或长度为1的维度上进行,它是深度学习框架中常用的计算方式。来看一个具体的例子,如图\ref{fig:broadcast}所示,$\mathbf s $是一个$2\times4$的矩阵而$\mathbf b $是一个长度为4的向量,这两者进行单元加运算时,广播机制会将$\mathbf b $沿第一个维度复制后,再与$\mathbf s $做加法运算。
\parinterval 前向计算实现如图\ref{fig:weather-forward}所示,图中对各张量和其他参数的形状做了详细说明,类似shape(3)这种形式代表维度为3的1阶张量,shape(3,2)代表2阶张量,其中第1阶有3个维度,第2阶有2个维度,也可以将其理解为$3\ast2$的矩阵。输入$\mathbf x $是一个1阶张量,该阶有3个维度,分别对应天空状况、低空气温、水平气压三个方面。输入数据经过隐藏层的线性变换$\mathbf x\cdot\mathbf w^1+\mathbf b^1$和Tanh激活函数后,得到新的张量$\mathbf a $,张量$\mathbf a $也是一个1阶张量,该阶有2个维度,分别对应着从输入数据中提取出的温度和风速两方面特征;神经网络在获取到天气情况的特征$\mathbf a $后,继续对其进行线性变换$\mathbf a\cdot\mathbf w^2+ b^2$($ b^2$是标量)和Sigmoid激活函数后,得到神经网络的最终输出$ y $,即神经网络此时预测的穿衣指数。
\parinterval 前向计算实现如图\ref{fig:weather-forward}所示,图中对各张量和其他参数的形状做了详细说明,类似shape(3)这种形式代表维度为3的1阶张量,shape(3, 2)代表2阶张量,其中第1阶有3个维度,第2阶有2个维度,也可以将其理解为$3\times2$的矩阵。输入$\mathbf x $是一个1阶张量,该阶有3个维度,分别对应天空状况、低空气温、水平气压三个方面。输入数据经过隐藏层的线性变换$\mathbf x\cdot\mathbf w^1+\mathbf b^1$和Tanh激活函数后,得到新的张量$\mathbf a $,张量$\mathbf a $也是一个1阶张量,该阶有2个维度,分别对应着从输入数据中提取出的温度和风速两方面特征;神经网络在获取到天气情况的特征$\mathbf a $后,继续对其进行线性变换$\mathbf a\cdot\mathbf w^2+ b^2$($ b^2$是标量)和Sigmoid激活函数后,得到神经网络的最终输出$ y $,即神经网络此时预测的穿衣指数。