Commit 66d0974c by xiaotong

updates

parent 5c98e5ed
......@@ -190,7 +190,7 @@
%--5.2.1.2矩阵的转置---------------------
\subsubsection{(二)矩阵的转置}\index{Chapter5.2.1.2}
\parinterval {\small\sffamily\bfseries{转置}}(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{转置}}(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} $。例如:
\begin{eqnarray}
\mathbf a & = & \begin{pmatrix} 1 & 3 & 2 & 6\\5 & 4 & 8 & 2\end{pmatrix} \\
{\mathbf a}^{\rm T} & = &\begin{pmatrix} 1 & 5\\3 & 4\\2 & 8\\6 & 2\end{pmatrix}
......@@ -620,25 +620,25 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2=0\cdot 1+0\cdot 1+1\cdot 1=1
\parinterval 那激活函数又是什么?神经元在接收到经过线性变换的结果后,通过激活函数的处理,得到最终的输出$ \mathbf y $。激活函数的目的是解决实际问题中的非线性变换,线性变换只能拟合直线,而激活函数的加入,使神经网络具有了拟合曲线的能力。 特别是在实际问题中,很多现象都无法用简单的线性关系描述,这时激活函数的非线性就为我们描述更加复杂的问题提供了工具。
\parinterval 神经网络方法的本质是拟合输入与输出的函数关系,正是激活函数赋予了神经网络拟合任何函数的能力。常见的非线性函数有sigmoid、relu、tanh等。如图\ref{fig:activation}列举了几种激活函数的函数曲线。
\parinterval 神经网络方法的本质是拟合输入与输出的函数关系,正是激活函数赋予了神经网络拟合任何函数的能力。常见的非线性函数有Sigmoid、Relu、Tanh等。如图\ref{fig:activation}列举了几种激活函数的函数曲线。
%----------------------------------------------
% 图
\begin{figure}\centering
\subfigure[softplus]{
\subfigure[Softplus]{
\centering
\begin{minipage}{.23\textwidth}
\input{./Chapter5/Figures/fig-softplus}
\end{minipage}%
}
\qquad
\subfigure[sigmoid]{
\subfigure[Sigmoid]{
\centering
\begin{minipage}{.23\textwidth}
\input{./Chapter5/Figures/fig-sigmoid}
\end{minipage}%
}
\qquad
\subfigure[tanh]{
\subfigure[Tanh]{
\centering
\begin{minipage}{.23\textwidth}
\input{./Chapter5/Figures/fig-tanh}
......@@ -651,14 +651,14 @@ x_0\cdot w_0+x_1\cdot w_1+x_2\cdot w_2=0\cdot 1+0\cdot 1+1\cdot 1=1
\end{minipage}%
}
\qquad
\subfigure[gaussian]{
\subfigure[Gaussian]{
\centering
\begin{minipage}{.23\textwidth}
\input{./Chapter5/Figures/fig-gaussian}
\end{minipage}%
}
\qquad
\subfigure[identity]{
\subfigure[Identity]{
\centering
\begin{minipage}{.23\textwidth}
\input{./Chapter5/Figures/fig-identity}
......@@ -1027,7 +1027,7 @@ f(x)=\begin{cases} 0 & x\leqslant0 \\x & x>0\end{cases}
\end{figure}
%-------------------------------------------
\parinterval NiuTensor支持张量的各种代数运算,各种单元算子,如$ + $$ - $$ \ast $$ / $、Log(取对数)、Exp(指数运算)、Power(幂方运算)、Absolute(绝对值)等,还有sigmoid、softmax等激活函数。如图\ref{fig:code-tensor-operation}是一段对张量进行1阶运算的程序示例。
\parinterval NiuTensor支持张量的各种代数运算,各种单元算子,如$ + $$ - $$ \ast $$ / $、Log(取对数)、Exp(指数运算)、Power(幂方运算)、Absolute(绝对值)等,还有Sigmoid、Softmax等激活函数。如图\ref{fig:code-tensor-operation}是一段对张量进行1阶运算的程序示例。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -1073,8 +1073,8 @@ f(x)=\begin{cases} 0 & x\leqslant0 \\x & x>0\end{cases}
\rule{0pt}{15pt} Concatenate(a,b,d) & 把两个张量$ \mathbf a $$ \mathbf b $沿d方向级联 \\
\rule{0pt}{15pt} Merge(a,d) & 对张量$ \mathbf a $沿d方向合并 \\
\rule{0pt}{15pt} Split(a,d,n) & 对张量$ \mathbf a $沿d方向分裂成n份 \\
\rule{0pt}{15pt} Sigmoid(a) &$ \mathbf a $进行sigmoid变换 \\
\rule{0pt}{15pt} Softmax(a) &$ \mathbf a $进行softmax变换,沿最后一个方向 \\
\rule{0pt}{15pt} Sigmoid(a) &$ \mathbf a $进行Sigmoid变换 \\
\rule{0pt}{15pt} Softmax(a) &$ \mathbf a $进行Softmax变换,沿最后一个方向 \\
\rule{0pt}{15pt} HardTanh(a) &$ \mathbf a $进行hard tanh变换(双曲正切的近似) \\
\rule{0pt}{15pt} Relu(a) &$ \mathbf a $进行relu变换 \\
\end{tabular}
......@@ -1897,11 +1897,11 @@ w_{t+1}&=&w_t-\frac{\eta}{\sqrt{z_t+\epsilon}} v_t
\label{eqa1.60}
\end{eqnarray}
%公式--------------------------------------------------------------------
\noindent 这里的$ \mathbf C $可以被理解为一个查询表,根据$ w_i $中为1的那一维,在$ \mathbf C $中索引到相应的行进行输出(结果是一个行向量)。随后,把得到的$ \mathbf e_0 $$ \mathbf e_1 $$ \mathbf e_2 $三个向量级联在一起,经过两层网络,最后通过softmax函数(橙色方框)得到输出:
\noindent 这里的$ \mathbf C $可以被理解为一个查询表,根据$ w_i $中为1的那一维,在$ \mathbf C $中索引到相应的行进行输出(结果是一个行向量)。随后,把得到的$ \mathbf e_0 $$ \mathbf e_1 $$ \mathbf e_2 $三个向量级联在一起,经过两层网络,最后通过Softmax函数(橙色方框)得到输出:
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf y&=&{\rm{softmax}}(\mathbf h_0\mathbf U)\label{eqa1.61}\\
\mathbf h_0&=&{\rm{tanh}}([\mathbf e_{i-3},\mathbf e_{i-2},\mathbf e_{i-1}]\mathbf H+\mathbf d)
\mathbf y&=&{\rm{Softmax}}(\mathbf h_0\mathbf U)\label{eqa1.61}\\
\mathbf h_0&=&{\rm{Tanh}}([\mathbf e_{i-3},\mathbf e_{i-2},\mathbf e_{i-1}]\mathbf H+\mathbf d)
\label{eqa1.62}
\end{eqnarray}
%公式--------------------------------------------------------------------
......@@ -1964,13 +1964,13 @@ w_{t+1}&=&w_t-\frac{\eta}{\sqrt{z_t+\epsilon}} v_t
\noindent 其中,$ \mathbf h_t $表示$ t $时刻循环单元的输出,$ \mathbf h_{t-1} $表示$ t-1 $时刻循环单元的输出,$ \mathbf U $$ \mathbf W $是模型的参数。可以看出,循环单元的结构其实很简单,只是一个对$ \mathbf h_{t-1} $$ \mathbf x_t $的线性变换再加上一个tanh函数。通过读入上一时刻的输出,当前时刻可以访问以前的历史信息。这个过程可以循环执行,这样就完成了对所有历史信息的建模。$ \mathbf h_t $可以被看作是序列在$ t $时刻的一种表示,也可以被看作是网络的一个隐藏层。进一步,$ \mathbf h_t $可以被送入输出层,得到$ t $时刻的输出:
%公式--------------------------------------------------------------------
\begin{eqnarray}
\mathbf Y_t&=&{\rm{softmax}}(\mathbf h_t\mathbf V)
\mathbf Y_t&=&{\rm{Softmax}}(\mathbf h_t\mathbf V)
\label{eqa1.64}
\end{eqnarray}
%公式--------------------------------------------------------------------
\noindent 其中,$ \mathbf V $是输出层的模型参数。
\parinterval\ref{fig:rnn-LM}展示了一个基于循环神经网络的语言模型结构。首先,所有输入的单词会被转换成分布式表示(红色部分),这个过程和FNNLM是一样的。之后,该模型堆叠了两层循环神经网络(绿色部分)。最后通过softmax层(紫色部分)得到每个时刻的预测结果$ \mathbf y_t={\rm P}(w_t|w_1\dots w_{t-1}) $
\parinterval\ref{fig:rnn-LM}展示了一个基于循环神经网络的语言模型结构。首先,所有输入的单词会被转换成分布式表示(红色部分),这个过程和FNNLM是一样的。之后,该模型堆叠了两层循环神经网络(绿色部分)。最后通过Softmax层(紫色部分)得到每个时刻的预测结果$ \mathbf y_t={\rm P}(w_t|w_1\dots w_{t-1}) $
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -1989,7 +1989,7 @@ w_{t+1}&=&w_t-\frac{\eta}{\sqrt{z_t+\epsilon}} v_t
\parinterval 对于这个问题,研究者又提出了一种新的结构---自注意力机制(Self-Attention Mechanism)。自注意力是一种特殊的神经网络结构,它可以对序列上任意两个词的相互作用直接进行建模,这样也就避免了循环神经网络中随着距离变长信息传递步骤增多的缺陷。在自然语言处理领域,自注意力机制被成功的应用在机器翻译,形成了著名的Transformer模型\cite{vaswani2017attention}。在第六章我们会系统的介绍自注意力机制和Transformer模型。
\parinterval 这里,先简单了解一下基于Transformer的语言模型结构(图\ref{fig:transformer-LM})。与FNNLM\\和RNNLM一样,Transformer首先对输入单词进行分布式表示,同时加上每个位置的编码构成了整个模型的输入(蓝色方框)。之后,利用自注意力机制对输入的向量进行处理(绿色方框)。自注意力的结果会被送入一个前馈神经网络,之后再送给softmax输出层(橙色方框)。
\parinterval 这里,先简单了解一下基于Transformer的语言模型结构(图\ref{fig:transformer-LM})。与FNNLM\\和RNNLM一样,Transformer首先对输入单词进行分布式表示,同时加上每个位置的编码构成了整个模型的输入(蓝色方框)。之后,利用自注意力机制对输入的向量进行处理(绿色方框)。自注意力的结果会被送入一个前馈神经网络,之后再送给Softmax输出层(橙色方框)。
%----------------------------------------------
% 图
\begin{figure}[htp]
......@@ -2142,7 +2142,7 @@ Jobs was the CEO of {\red{\underline{apple}}}.
\parinterval GPT(Generative Pre-Training)也是一种基于语言建模的句子表示模型\cite{radford2018improving}。该工作的贡献在于利用Transformer结构代替了LSTM。而且该模型基于Pre-training + Fine-tuning的框架,预训练的结果做为下游系统的句子表示模块的参数初始值,因此可以更好的适应目标任务。
\parinterval GPT模型仍然使用标准的语言建模的思路,即通过前$ n-1 $个词预测第$ n $个词。但是在网络结构上,GPT模型使用了Transformer(图\ref{fig:gpt}),而且模型参数会在目标任务上进行有监督的微调。与ELMO模型的做法不同,GPT不需要对目标任务构建新的模型结构,而是直接在Transformer语言表示模型的最后一层加上softmax层作为任务的输出层。实验结果证明,GPT模型的性能较ELMO模型更为优越,在12个NLP任务中取得了9个任务当时最好的结果。
\parinterval GPT模型仍然使用标准的语言建模的思路,即通过前$ n-1 $个词预测第$ n $个词。但是在网络结构上,GPT模型使用了Transformer(图\ref{fig:gpt}),而且模型参数会在目标任务上进行有监督的微调。与ELMO模型的做法不同,GPT不需要对目标任务构建新的模型结构,而是直接在Transformer语言表示模型的最后一层加上Softmax层作为任务的输出层。实验结果证明,GPT模型的性能较ELMO模型更为优越,在12个NLP任务中取得了9个任务当时最好的结果。
%----------------------------------------------
% 图
\begin{figure}[htp]
......
......@@ -571,7 +571,7 @@ $\textrm{P}({y_j | \mathbf{s}_{j-1} ,y_{j-1},\mathbf{C}})$由Softmax实现,Sof
\parinterval RNN结构使得当前时刻循环单元的状态包含了之前时间步的状态信息。但是这种对历史信息的记忆并不是无损的,随着序列变长,RNN的记忆信息的损失越来越严重。在很多长序列处理任务中(如长文本生成)都观测到了类似现象。对于这个问题,Hochreiter S和Schmidhuber J提出了长短时记忆模型(long short-term memory),也就是常说的LSTM模型\cite{HochreiterLong}
%Jürgen Schmidhuber
\parinterval LSTM模型是RNN模型的一种改进。相比RNN仅传递前一时刻的状态$\mathbf{h}_{t-1}$,LST\\M会同时传递两部分信息:状态信息$\mathbf{h}_{t-1}$和记忆信息$\mathbf{c}_{t-1}$。这里,$\mathbf{c}_{t-1}$是新引入的变量,它也是循环单元的一部分,用于显性的记录需要记录的历史内容,$\mathbf{h}_{t-1}$$\mathbf{c}_{t-1}$在循环单元中会相互作用。LSTM通过``门''单元来动态地选择遗忘多少以前的信息和记忆多少当前的信息。LSTM中所使用的门结构如图\ref{fig:6-14}所示,包括遗忘门,输入门和输出门。图中$\sigma$代表sigmoid函数,它将函数输入映射为0-1范围内的实数,用来充当门控信号。
\parinterval LSTM模型是RNN模型的一种改进。相比RNN仅传递前一时刻的状态$\mathbf{h}_{t-1}$,LST\\M会同时传递两部分信息:状态信息$\mathbf{h}_{t-1}$和记忆信息$\mathbf{c}_{t-1}$。这里,$\mathbf{c}_{t-1}$是新引入的变量,它也是循环单元的一部分,用于显性的记录需要记录的历史内容,$\mathbf{h}_{t-1}$$\mathbf{c}_{t-1}$在循环单元中会相互作用。LSTM通过``门''单元来动态地选择遗忘多少以前的信息和记忆多少当前的信息。LSTM中所使用的门结构如图\ref{fig:6-14}所示,包括遗忘门,输入门和输出门。图中$\sigma$代表Sigmoid函数,它将函数输入映射为0-1范围内的实数,用来充当门控信号。
%----------------------------------------------
% 图3.10
......@@ -597,14 +597,14 @@ $\textrm{P}({y_j | \mathbf{s}_{j-1} ,y_{j-1},\mathbf{C}})$由Softmax实现,Sof
这里,$\mathbf{W}_f$是权值,$\mathbf{b}_f$是偏置,$[\mathbf{h}_{t-1},\mathbf{x}_{t}]$表示两个向量的拼接。该公式可以解释为,对$[\mathbf{h}_{t-1},\mathbf{x}_{t}]$进行变换,并得到一个 的实数向量$\mathbf{f}_t$$\mathbf{f}_t$的每一维都可以被理解为一个``门'',它决定可以有多少信息被留下(或遗忘)。
\item \textbf{记忆更新}。首先,要生成当前时刻需要新增加的信息,该部分由输入门完成,其结构如图\ref{fig:6-14}(b)红色线部分,图中``$\bigotimes$''表示进行点乘操作。输入门的计算分为两部分,首先利用$\sigma$决定门控参数$\mathbf{i}_t$,然后通过tanh函数得到新的信息$\hat{\mathbf{c}}_t$,具体公式如下:
\item \textbf{记忆更新}。首先,要生成当前时刻需要新增加的信息,该部分由输入门完成,其结构如图\ref{fig:6-14}(b)红色线部分,图中``$\bigotimes$''表示进行点乘操作。输入门的计算分为两部分,首先利用$\sigma$决定门控参数$\mathbf{i}_t$,然后通过Tanh函数得到新的信息$\hat{\mathbf{c}}_t$,具体公式如下:
\begin{eqnarray}
\mathbf{i}_t = \sigma (\mathbf{W}_i [\mathbf{h}_{t-1},\mathbf{x}_{t}] + \mathbf{b}_i )
\label{eqC6.13}
\end{eqnarray}
%------------------------------------------
\begin{eqnarray}
\hat{\mathbf{c}}_t = \textrm{tanh} (\mathbf{W}_c [\mathbf{h}_{t-1},\mathbf{x}_{t}] + \mathbf{b}_c )
\hat{\mathbf{c}}_t = \textrm{Tanh} (\mathbf{W}_c [\mathbf{h}_{t-1},\mathbf{x}_{t}] + \mathbf{b}_c )
\label{eqC6.14}
\end{eqnarray}
......@@ -614,14 +614,14 @@ $\textrm{P}({y_j | \mathbf{s}_{j-1} ,y_{j-1},\mathbf{C}})$由Softmax实现,Sof
\label{eqC6.15}
\end{eqnarray}
\item \textbf{输出}。该部分使用输出门计算最终的输出信息$\mathbf{h}_t$,其结构如图\ref{fig:6-14}(d)红色线部分所示。在输出门中,首先将$\mathbf{x}_t$$\mathbf{h}_{t-1}$通过$\sigma$函数变换得到$\mathbf{o}_t$。其次,将上一步得到的新记忆信息$\mathbf{c}_t$通过tanh函数进行变换,得到值范围在[-1,1]的向量。最后将这两部分进行点乘,具体公式如下:
\item \textbf{输出}。该部分使用输出门计算最终的输出信息$\mathbf{h}_t$,其结构如图\ref{fig:6-14}(d)红色线部分所示。在输出门中,首先将$\mathbf{x}_t$$\mathbf{h}_{t-1}$通过$\sigma$函数变换得到$\mathbf{o}_t$。其次,将上一步得到的新记忆信息$\mathbf{c}_t$通过Tanh函数进行变换,得到值范围在[-1,1]的向量。最后将这两部分进行点乘,具体公式如下:
\begin{eqnarray}
\mathbf{o}_t = \sigma (\mathbf{W}_o [\mathbf{h}_{t-1},\mathbf{x}_{t}] + \mathbf{b}_o )
\label{eqC6.16}
\end{eqnarray}
%----------------------------------------------------
\begin{eqnarray}
\mathbf{h}_t = \mathbf{o}_t \cdot \textrm{tanh} (\mathbf{c}_t)
\mathbf{h}_t = \mathbf{o}_t \cdot \textrm{Tanh} (\mathbf{c}_t)
\label{eqC6.17}
\end{eqnarray}
......@@ -652,9 +652,9 @@ $\textrm{P}({y_j | \mathbf{s}_{j-1} ,y_{j-1},\mathbf{C}})$由Softmax实现,Sof
\label{eqC6.19}
\end{eqnarray}
\parinterval 当完成了重置门和更新门计算后,就需要更新当前隐藏状态,如图\ref{fig:6-16}(c)所示。在计算得到了重置门的权重$\mathbf{r}_t$后,使用其对前一时刻的状态$\mathbf{h}_{t-1}$进行重置($\mathbf{r}_t \cdot \mathbf{h}_{t-1}$),将重置后的结果与$\mathbf{x}_t$拼接,通过tanh激活函数将数据变换到[-1,1]范围内:
\parinterval 当完成了重置门和更新门计算后,就需要更新当前隐藏状态,如图\ref{fig:6-16}(c)所示。在计算得到了重置门的权重$\mathbf{r}_t$后,使用其对前一时刻的状态$\mathbf{h}_{t-1}$进行重置($\mathbf{r}_t \cdot \mathbf{h}_{t-1}$),将重置后的结果与$\mathbf{x}_t$拼接,通过Tanh激活函数将数据变换到[-1,1]范围内:
\begin{eqnarray}
\hat{\mathbf{h}}_t = \textrm{tanh} (\mathbf{W}_h [\mathbf{r}_t \cdot \mathbf{h}_{t-1},\mathbf{x}_{t}])
\hat{\mathbf{h}}_t = \textrm{Tanh} (\mathbf{W}_h [\mathbf{r}_t \cdot \mathbf{h}_{t-1},\mathbf{x}_{t}])
\label{eqC6.20}
\end{eqnarray}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论