\parinterval{\small\sffamily\bfseries{标量}}\index{标量}(Scalar)\index{Scalar}:标量亦称``无向量'',是一种只具有数值大小而没有方向的量,通俗地说,一个标量就是一个单独的数,这里特指实数\footnote{严格意义上,标量可以是复数等其他形式。这里为了方便讨论,仅以实数为对象。}。一般用小写斜体表示标量。比如,对于$ a=5$,$ a $就是一个标量。
\parinterval{\small\sffamily\bfseries{标量}}\index{标量}(Scalar)\index{Scalar}:标量亦称``无向量'',是一种只具有数值大小而没有方向的量,通俗地说,一个标量就是一个单独的数,这里特指实数\footnote{严格意义上,标量可以是复数等其他形式。这里为了方便讨论,仅以实数为对象。}。一般用小写斜体表示标量。比如,对于$ a=5$,$ a $就是一个标量。
\parinterval{\small\sffamily\bfseries{向量}}\index{向量}(Vector)\index{Vector}:向量是由一组实数组成的有序数组。与标量不同,向量既有大小也有方向。可以把向量看作空间中的点,每个元素是不同坐标轴上的坐标。公式\ref{eq:5-1}和公式\ref{eq:5-2}展示了一个行向量和一个列向量。本章默认使用行向量,如$\mathbf a=(a_1, a_2, a_3)$,$\mathbf a $对应的列向量记为$\mathbf a^{\rm T}$。
\parinterval{\small\sffamily\bfseries{向量}}\index{向量}(Vector)\index{Vector}:向量是由一组实数组成的有序数组。与标量不同,向量既有大小也有方向。可以把向量看作空间中的点,每个元素是不同坐标轴上的坐标。公式\ref{eq:5-1}和公式\ref{eq:5-2}展示了一个行向量和一个列向量。本章默认使用行向量,如$\mathbf a=(a_1, a_2, a_3)$,$\mathbf a $对应的列向量记为$\mathbf a^{\rm T}$。
\begin{eqnarray}
\begin{eqnarray}
\mathbf a &=&\begin{pmatrix}
\mathbf a &=&\begin{pmatrix}
1 & 2 & 5 & 7
1 & 2 & 5 & 7
\end{pmatrix}\label{eq:5-1}\\
\end{pmatrix}\label{eq:5-1}\\\nonumber\\
\mathbf{a^{\textrm{T}}}&=&\begin{pmatrix}
\mathbf{a^{\textrm{T}}}&=&\begin{pmatrix}
&1&\\
&1&\\
&2&\\
&2&\\
...
@@ -225,7 +226,7 @@
...
@@ -225,7 +226,7 @@
\label{eq:5-2}
\label{eq:5-2}
\end{eqnarray}
\end{eqnarray}
\parinterval{\small\sffamily\bfseries{矩阵}}\index{矩阵}(Matrix)\index{Matrix}:矩阵是一个按照长方阵列排列的实数集合,最早来自于方程组的系数及常数所构成的方阵。在计算机领域,通常将矩阵看作二维数组。我们用粗体的符号$\mathbf a $表示一个矩阵,如果该矩阵有$ m $行$ n $列,那么有$\mathbf a\in R^{m\times n}$。这里,用不加粗的符号来表示矩阵中的元素,其中每个元素都被一个行索引和一个列索引所确定。例如,$ a_{ij}$表示第$ i $行、第$ j $列的矩阵元素。如下,$\mathbf a $就定义了一个2行2列的矩阵。
\parinterval{\small\sffamily\bfseries{矩阵}}\index{矩阵}(Matrix)\index{Matrix}:矩阵是一个按照长方阵列排列的实数集合,最早来自于方程组的系数及常数所构成的方阵。在计算机领域,通常将矩阵看作二维数组。我们用粗体的符号$\mathbf a $表示一个矩阵,如果该矩阵有$ m $行$ n $列,那么有$\mathbf a\in R^{m\times n}$。这里,用不加粗的符号来表示矩阵中的元素,其中每个元素都被一个行索引和一个列索引所确定。例如,$ a_{ij}$表示第$ i $行、第$ j $列的矩阵元素。如下,公式\ref{eq:5-3}中$\mathbf a $定义了一个2行2列的矩阵。
\begin{eqnarray}
\begin{eqnarray}
\mathbf a & = &\begin{pmatrix}
\mathbf a & = &\begin{pmatrix}
a_{11}& a_{12}\\
a_{11}& a_{12}\\
...
@@ -246,7 +247,7 @@
...
@@ -246,7 +247,7 @@
\parinterval{\small\sffamily\bfseries{转置}}\index{转置}(Transpose)\index{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{\small\sffamily\bfseries{转置}}\index{转置}(Transpose)\index{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 a $为$ m\times p $的矩阵,$\mathbf b $为$ p\times n $的矩阵,对$\mathbf a $和$\mathbf b $作矩阵乘法的结果是一个$ m\times n $的矩阵$\mathbf c $,其中矩阵$\mathbf c $中第$ i $行、第$ j $列的元素可以表示为:
\parinterval 利用矩阵$\mathbf a\in R^{m\times n}$,可以实现两个有限维欧氏空间的映射函数$f:R^n\rightarrow R^m$。例如$ n $维列向量$\mathbf x ^{\rm T}$与$ m\times n $的矩阵$\mathbf a $,向量$\mathbf x ^{\rm T}$左乘矩阵$\mathbf a $,可将向量$\mathbf x ^{\rm T}$映射为$ m $列向量,对于:
\parinterval 利用矩阵$\mathbf a\in R^{m\times n}$,可以实现两个有限维欧氏空间的映射函数$f:R^n\rightarrow R^m$。例如$ n $维列向量$\mathbf x ^{\rm T}$与$ m\times n $的矩阵$\mathbf a $,向量$\mathbf x ^{\rm T}$左乘矩阵$\mathbf a $,可将向量$\mathbf x ^{\rm T}$映射为$ m $列向量,对于
\parinterval 公式$\mathbf x\cdot\mathbf w+\mathbf b $中的公式中的$\mathbf b $相当于对其进行平移变换。其过程如图\ref{fig:5-13}所示,偏置矩阵$\mathbf b=\begin{pmatrix}0.5&0&0\\0&0&0\\0&0&0\end{pmatrix}$将矩形区域沿x轴向右平移了一段距离。
\parinterval 公式$\mathbf x\cdot\mathbf w+\mathbf b $中的公式中的$\mathbf b $相当于对其进行平移变换。其过程如图\ref{fig:5-13}所示,偏置矩阵$\mathbf b=\begin{pmatrix}0.5&0&0\\0&0&0\\0&0&0\end{pmatrix}$将矩形区域沿x轴向右平移了一段距离。
\parinterval 那激活函数又是什么?神经元在接收到经过线性变换的结果后,通过激活函数的处理,得到最终的输出$\mathbf y $。激活函数的目的是解决实际问题中的非线性变换,线性变换只能拟合直线,而激活函数的加入,使神经网络具有了拟合曲线的能力。 特别是在实际问题中,很多现象都无法用简单的线性关系描述,这时激活函数的非线性就为描述更加复杂的问题提供了工具。常见的非线性函数有Sigmoid、ReLU、Tanh等。如图\ref{fig:5-15}列举了几种激活函数的形式。
\vspace{-0.5em}
\parinterval 那激活函数又是什么?神经元在接收到经过线性变换的结果后,通过激活函数的处理,得到最终的输出$\mathbf y $。激活函数的目的是解决实际问题中的非线性变换,线性变换只能拟合直线,而激活函数的加入,使神经网络具有了拟合曲线的能力。 特别是在实际问题中,很多现象都无法用简单的线性关系描述,这时激活函数的非线性就为描述更加复杂的问题提供了工具。常见的非线性函数有Sigmoid、ReLU、Tanh等。如图\ref{fig:5-15}列举了几种激活函数的形式。\\
\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 $,可以不是简单的向量或是矩阵形式,而是深度学习中更加通用的数学量\ \dash\ {\small\bfnew{张量}}\index{张量}(Tensor)\index{Tensor},比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
\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 $,可以不是简单的向量或是矩阵形式,而是深度学习中更加通用的数学量\ \dash\ {\small\bfnew{张量}}\index{张量}(Tensor)\index{Tensor},比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
\noindent 其中,$ u $为$ v_i $的同型向量,$ c $为任意实数。这个性质非常重要,根据这个性质可以推导出张量的其他定义。
\noindent 其中,$ u $为与$ v_i $形状相同的向量,$ c $为任意实数。这个性质非常重要,根据这个性质可以推导出张量的其他定义。
\parinterval 从我们的物理世界看,如果一个物理量在物体的某个位置上只是一个单值,那么它是一个标量,例如密度;如果一个物理量在同一个位置、从多个方向上看,有不同的值,那么这个物理量就是一个张量,比如物理学中常用的应力的描述就是一个典型的张量。举一个简单的例子:$\mathbf T(\mathbf v,\mathbf u)$是一个三维空间$(\textrm{x},\textrm{y},\textrm{z})$上的2阶张量,其中$\mathbf v $和$\mathbf u $ 是两个向量,如图\ref{fig:5-26}所示,向量$\mathbf v $在某个两两垂直的三维坐标系中可以表示为${(\begin{array}{ccc} a & b & c\end{array})}^{\rm T}$,同理向量$\mathbf u $在某个两两垂直的三维坐标系中可以表示为${(\begin{array}{ccc} a' & b' & c' \end{array})}^{\rm T}$。但在三维空间$(\textrm{x},\textrm{y},\textrm{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 T(\mathbf v,\mathbf u)$是一个三维空间$(\textrm{x},\textrm{y},\textrm{z})$上的2阶张量,其中$\mathbf v $和$\mathbf u $ 是两个向量,如图\ref{fig:5-26}所示,向量$\mathbf v $在某个两两垂直的三维坐标系中可以表示为${(\begin{array}{ccc} a & b & c\end{array})}^{\rm T}$,同理向量$\mathbf u $在某个两两垂直的三维坐标系中可以表示为${(\begin{array}{ccc} a' & b' & c' \end{array})}^{\rm T}$。但在三维空间$(\textrm{x},\textrm{y},\textrm{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 下面用几个实例来说明搭建神经网络的过程。注意,搭建神经网络的过程本质上就是定义前向计算的过程。首先构造一个单层神经网络。如图\ref{fig:5-39}所示,简单的定义输入、权重和偏置后,定义激活函数为Sigmoid函数,输入$\mathbf x $经过线性变换和激活函数,得到输出$\mathbf y $。
\parinterval 下面用几个实例来说明搭建神经网络的过程。搭建神经网络的过程本质上就是定义前向计算的过程。首先构造一个单层神经网络。如图\ref{fig:5-39}(a)所示,简单的定义输入、权重和偏置后,定义激活函数为Sigmoid函数,输入$\mathbf x $经过线性变换和激活函数,得到输出$\mathbf y $。
\parinterval 图\ref{fig:5-39}(b)是一个构造三层神经网络的程序示例。在第一层中,$\mathbf x $作为输入,$\mathbf h1$作为输出,其中$\mathbf h1={\rm{Sigmoid}}(\mathbf x\cdot\mathbf w1+\mathbf b1)$。在第二层中,$\mathbf h1$作为输入,$\mathbf h2$作为输出,其中$\mathbf h2={\rm{Tanh}}(\mathbf h1\cdot\mathbf w2)$。在第三层中,$\mathbf h2$作为输入,$\mathbf y $作为输出,其中$\mathbf y={\rm{ReLU}}(\mathbf h2\cdot\mathbf w3)$。$\mathbf y $也会作为整个神经网络的输出。
%----------------------------------------------
%----------------------------------------------
\begin{figure}[htp]
\begin{figure}[htp]
\centering
\centering
\input{./Chapter5/Figures/fig-code-niutensor-one}
\input{./Chapter5/Figures/fig-code-niutensor-one}
\caption{构建单层神经网络的示例}
\caption{构建神经网络的程序示例}
\label{fig:5-39}
\label{fig:5-39}
\end{figure}
\end{figure}
%-------------------------------------------
%-------------------------------------------
\parinterval 图\ref{fig:5-40}是一个构造三层神经网络的程序示例。在第一层中,$\mathbf x $作为输入,$\mathbf h1$作为输出,其中$\mathbf h1={\rm{Sigmoid}}(\mathbf x\cdot\mathbf w1+\mathbf b1)$。在第二层中,$\mathbf h1$作为输入,$\mathbf h2$作为输出,其中$\mathbf h2={\rm{Tanh}}(\mathbf h1\cdot\mathbf w2)$。在第三层中,$\mathbf h2$作为输入,$\mathbf y $作为输出,其中$\mathbf y={\rm{ReLU}}(\mathbf h2\cdot\mathbf w3)$。$\mathbf y $也会作为整个神经网络的输出。