Commit c4e21b36 by 单韦乔

15章反馈,还需修改

parent bee03ba1
......@@ -4,7 +4,7 @@
%left
\begin{scope}
\foreach \x/\d in {1/2em, 2/8em}
\node[unit,fill=yellow!30] at (0,\d) (ln_\x) {正则};
\node[unit,fill=yellow!30] at (0,\d) (ln_\x) {标准};
\foreach \x/\d in {1/4em}
\node[unit,fill=green!30] at (0,\d) (sa_\x) {8头自注意力:512};
......@@ -35,7 +35,7 @@
\draw[->,thick] ([yshift=-0.8em]ln_1.-90) .. controls ([xshift=5em,yshift=-0.8em]ln_1.-90) and ([xshift=5em]add_1.0) .. (add_1.0);
\draw[->,thick] (add_1.0) .. controls ([xshift=5em]add_1.0) and ([xshift=5em]add_2.0) .. (add_2.0);
\node[font=\scriptsize] at (0em, -1em){(a) Transformer编码器中若干块的结构};
\node[font=\scriptsize] at (0em, -1.1em){(a) Transformer编码器中若干块的结构};
\end{scope}
%right
......@@ -44,7 +44,7 @@
\foreach \x/\d in {1/2em, 2/8em, 3/16em}
\node[unit,fill=yellow!30] at (0,\d) (ln_\x) {正则};
\node[unit,fill=yellow!30] at (0,\d) (ln_\x) {标准};
\foreach \x/\d in {1/6em, 2/14em, 3/20em}
\node[draw,circle,minimum size=1em,inner sep=1pt] at (0,\d) (add_\x) {\scriptsize\bfnew{+}};
......@@ -84,7 +84,7 @@
\node[minimum size=0.8em,inner sep=0pt,rounded corners=1pt,draw,fill=blue!30] (act) at (8em, 20em){};
\node[anchor=west,font=\footnotesize] at ([xshift=0.1em]act.east){激活函数};
\node[anchor=north,minimum size=0.8em,inner sep=0pt,rounded corners=1pt,draw,fill=yellow!30] (nor) at ([yshift=-0.6em]act.south){};
\node[anchor=west,font=\footnotesize] at ([xshift=0.1em]nor.east){正则};
\node[anchor=west,font=\footnotesize] at ([xshift=0.1em]nor.east){标准};
\node[anchor=north,minimum size=0.8em,inner sep=0pt,rounded corners=1pt,draw,fill=cyan!30] (wc) at ([yshift=-0.6em]nor.south){};
\node[anchor=west,font=\footnotesize] at ([xshift=0.1em]wc.east){宽卷积};
\node[anchor=north,minimum size=0.8em,inner sep=0pt,rounded corners=1pt,draw,fill=green!30] (at) at ([yshift=-0.6em]wc.south){};
......
\begin{tikzpicture}
\tikzstyle{opnode}=[rectangle,inner sep=0mm,minimum height=2em,minimum width=4em,rounded corners=5pt,fill=teal!30]
\tikzstyle{opnode}=[rectangle,inner sep=0mm,minimum height=2em,minimum width=4em,rounded corners=5pt,fill=teal!30,draw,thick,drop shadow]
\tikzstyle{cnode}=[circle,draw,minimum size=1.2em]
\tikzstyle{mnode}=[rectangle,inner sep=0mm,minimum height=5em,minimum width=11em,rounded corners=5pt,fill=yellow!30]
\tikzstyle{mnode}=[rectangle,inner sep=0mm,minimum height=5em,minimum width=11em,rounded corners=5pt,fill=yellow!30,draw,thick,drop shadow]
\tikzstyle{wnode}=[inner sep=0mm,minimum height=1.5em]
\begin{pgfonlayer}{background}
......@@ -10,14 +10,14 @@
\node[anchor=west,mnode] (m2) at ([xshift=1em,yshift=0em]m1.east){};
\node[anchor=west,mnode] (m3) at ([xshift=1em,yshift=0em]m2.east){};
\node[anchor=north west,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=3.5em,rounded corners=5pt,fill=blue!30] (ml1) at ([xshift=0em,yshift=-0.5em]m1.south west){};
\node[anchor=west,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=3.5em,rounded corners=5pt,fill=green!30] (ml2) at ([xshift=0.25em,yshift=0em]ml1.east){};
\node[anchor=north east,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=3.5em,rounded corners=5pt,fill=red!30] (ml3) at ([xshift=0em,yshift=-0.5em]m1.south east){};
\node[anchor=north west,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=3.5em,rounded corners=5pt,fill=blue!30,draw,thick,drop shadow] (ml1) at ([xshift=0em,yshift=-0.5em]m1.south west){};
\node[anchor=west,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=3.5em,rounded corners=5pt,fill=green!30,draw,thick,drop shadow] (ml2) at ([xshift=0.25em,yshift=0em]ml1.east){};
\node[anchor=north east,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=3.5em,rounded corners=5pt,fill=red!30,draw,thick,drop shadow] (ml3) at ([xshift=0em,yshift=-0.5em]m1.south east){};
\node[anchor=north west,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=5.25em,rounded corners=5pt,fill=blue!30] (mc1) at ([xshift=0em,yshift=-0.5em]m2.south west){};
\node[anchor=north east,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=5.25em,rounded corners=5pt,fill=red!30] (mc2) at ([xshift=0em,yshift=-0.5em]m2.south east){};
\node[anchor=north west,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=5.25em,rounded corners=5pt,fill=blue!30,draw,thick,drop shadow] (mc1) at ([xshift=0em,yshift=-0.5em]m2.south west){};
\node[anchor=north east,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=5.25em,rounded corners=5pt,fill=red!30,draw,thick,drop shadow] (mc2) at ([xshift=0em,yshift=-0.5em]m2.south east){};
\node[anchor=north,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=11em,rounded corners=5pt,fill=blue!30] (mr1) at ([xshift=0em,yshift=-0.5em]m3.south){};
\node[anchor=north,rectangle,inner sep=0mm,minimum height=2.6em,minimum width=11em,rounded corners=5pt,fill=blue!30,draw,thick,drop shadow] (mr1) at ([xshift=0em,yshift=-0.5em]m3.south){};
\end{pgfonlayer}
......@@ -31,22 +31,22 @@
\node[anchor=north west,wnode,align=left] (w3) at ([xshift=0.3em,yshift=-0.3em]m3.north west){深度学习和网\\络结构搜索};
{%subfigure-left
\node[anchor=north,wnode,font=\footnotesize] (wl1) at ([xshift=0em,yshift=0em]ml1.north){训练数据};
\node[anchor=north,wnode,font=\footnotesize] (wl2) at ([xshift=0em,yshift=0em]ml2.north){特征信息};
\node[anchor=north,wnode,font=\footnotesize] (wl3) at ([xshift=0em,yshift=0em]ml3.north){模型结构};
\node[anchor=south,wnode,font=\tiny] (wl4) at ([xshift=0em,yshift=0em]ml1.south){人工/自动收集};
\node[anchor=south,wnode] (wl5) at ([xshift=0em,yshift=0em]ml2.south){人工设计};
\node[anchor=south,wnode] (wl6) at ([xshift=0em,yshift=0em]ml3.south){人工设计};
\node[anchor=north,wnode,font=\footnotesize] (wl1) at ([xshift=0em,yshift=-0.15em]ml1.north){训练数据};
\node[anchor=north,wnode,font=\footnotesize] (wl2) at ([xshift=0em,yshift=-0.15em]ml2.north){特征信息};
\node[anchor=north,wnode,font=\footnotesize] (wl3) at ([xshift=0em,yshift=-0.15em]ml3.north){模型结构};
\node[anchor=south,wnode,font=\tiny] (wl4) at ([xshift=0em,yshift=0.15em]ml1.south){人工/自动收集};
\node[anchor=south,wnode] (wl5) at ([xshift=0em,yshift=0.15em]ml2.south){人工设计};
\node[anchor=south,wnode] (wl6) at ([xshift=0em,yshift=0.15em]ml3.south){人工设计};
\node[anchor=south,cnode,fill=white] (cl1) at ([xshift=-4em,yshift=1.5em]m1.south){};
\node[anchor=north,cnode,fill=white] (cl2) at ([xshift=0em,yshift=-1em]m1.north){};
\node[anchor=south west,wnode,align=left,font=\tiny] (wl7) at ([xshift=0.5em,yshift=0em]cl1.east){使用{\color{ugreen!60}特征}{\color{blue!60}数据}\\中信息进行提取};
\node[anchor=west,wnode,align=right,font=\tiny] (wl8) at ([xshift=0.5em,yshift=0em]cl2.east){使用提取的信息对\\{\color{red!50}模型}中的参数\\进行训练};
\node[anchor=south west,wnode,align=left,font=\tiny] (wl7) at ([xshift=0.5em,yshift=0em]cl1.east){使用{\color{ugreen}\bfnew{特征}}{\color{blue}\bfnew{数据}}\\中信息进行提取};
\node[anchor=west,wnode,align=right,font=\tiny] (wl8) at ([xshift=0.5em,yshift=0em]cl2.east){使用提取的信息对\\{\color{red!50}\bfnew{模型}}中的参数\\进行训练};
\draw [-,thick,dotted] ([xshift=0em,yshift=0em]ml1.west) -- ([xshift=0em,yshift=0em]ml1.east);
\draw [-,thick,dotted] ([xshift=0em,yshift=0em]ml2.west) -- ([xshift=0em,yshift=0em]ml2.east);
\draw [-,thick,dotted] ([xshift=0em,yshift=0em]ml3.west) -- ([xshift=0em,yshift=0em]ml3.east);
\draw [-,thick,dashed] ([xshift=0em,yshift=0em]ml1.west) -- ([xshift=0em,yshift=0em]ml1.east);
\draw [-,thick,dashed] ([xshift=0em,yshift=0em]ml2.west) -- ([xshift=0em,yshift=0em]ml2.east);
\draw [-,thick,dashed] ([xshift=0em,yshift=0em]ml3.west) -- ([xshift=0em,yshift=0em]ml3.east);
\draw[->,thick] ([xshift=-1.5em,yshift=-0em]ml1.north)..controls +(north:3em) and +(west:0em)..([xshift=-0em,yshift=-0em]cl1.west) ;
\draw[->,thick] ([xshift=0em,yshift=-0em]ml2.north)..controls +(north:3em) and +(west:0em)..([xshift=-0em,yshift=-0em]cl1.east) ;
......@@ -57,19 +57,19 @@
}
{%subfigure-center
\node[anchor=north,wnode,font=\footnotesize] (wc1) at ([xshift=0em,yshift=0em]mc1.north){训练数据};
\node[anchor=north,wnode,font=\footnotesize] (wc2) at ([xshift=0em,yshift=0em]mc2.north){模型结构};
\node[anchor=south,wnode] (wc3) at ([xshift=0em,yshift=0em]mc1.south){人工/自动收集};
\node[anchor=south,wnode] (wc4) at ([xshift=0em,yshift=0em]mc2.south){人工设计};
\node[anchor=north,wnode,font=\footnotesize] (wc1) at ([xshift=0em,yshift=-0.15em]mc1.north){训练数据};
\node[anchor=north,wnode,font=\footnotesize] (wc2) at ([xshift=0em,yshift=-0.15em]mc2.north){模型结构};
\node[anchor=south,wnode] (wc3) at ([xshift=0em,yshift=0.15em]mc1.south){人工/自动收集};
\node[anchor=south,wnode] (wc4) at ([xshift=0em,yshift=0.15em]mc2.south){人工设计};
\node[anchor=south,cnode,fill=white] (cc1) at ([xshift=-4em,yshift=1.5em]m2.south){};
\node[anchor=north,cnode,fill=white] (cc2) at ([xshift=0em,yshift=-1em]m2.north){};
\node[anchor=south west,wnode,align=left,font=\tiny] (wl7) at ([xshift=0.5em,yshift=0em]cc1.east){使用{\color{red!60}模型}{\color{blue!60}数据}\\中信息进行提取};
\node[anchor=west,wnode,align=right,font=\tiny] (wl8) at ([xshift=0.5em,yshift=0em]cc2.east){使用提取的信息对\\{\color{red!60}模型}中的参数\\进行训练};
\node[anchor=south west,wnode,align=left,font=\tiny] (wl7) at ([xshift=0.5em,yshift=0em]cc1.east){使用{\color{red!50} \bfnew{模型}}{\color{blue} \bfnew{数据}}\\中信息进行提取};
\node[anchor=west,wnode,align=right,font=\tiny] (wl8) at ([xshift=0.5em,yshift=0em]cc2.east){使用提取的信息对\\{\color{red!50} \bfnew{模型}}中的参数\\进行训练};
\draw [-,thick,dotted] ([xshift=0em,yshift=0em]mc1.west) -- ([xshift=0em,yshift=0em]mc1.east);
\draw [-,thick,dotted] ([xshift=0em,yshift=0em]mc2.west) -- ([xshift=0em,yshift=0em]mc2.east);
\draw [-,thick,dashed] ([xshift=0em,yshift=0em]mc1.west) -- ([xshift=0em,yshift=0em]mc1.east);
\draw [-,thick,dashed] ([xshift=0em,yshift=0em]mc2.west) -- ([xshift=0em,yshift=0em]mc2.east);
\draw[->,thick] ([xshift=-2em,yshift=-0em]mc1.north)..controls +(north:3em) and +(west:0em)..([xshift=-0em,yshift=-0em]cc1.west) ;
\draw[->,thick] ([xshift=0em,yshift=-0em]mc2.north)..controls +(north:2em) and +(west:0em)..([xshift=-0em,yshift=-0em]cc1.east) ;
......@@ -80,21 +80,21 @@
}
{%subfigure-right
\node[anchor=north,wnode,font=\footnotesize] (wr1) at ([xshift=0em,yshift=0em]mr1.north){训练数据};
\node[anchor=south,wnode] (wr2) at ([xshift=0em,yshift=0em]mr1.south){人工/自动收集};
\node[anchor=north,wnode,font=\footnotesize] (wr1) at ([xshift=0em,yshift=-0.15em]mr1.north){训练数据};
\node[anchor=south,wnode] (wr2) at ([xshift=0em,yshift=0.15em]mr1.south){人工/自动收集};
\node[anchor=south,cnode,fill=white] (cr1) at ([xshift=-2.5em,yshift=2.8em]m3.south){};
\node[anchor=north,cnode,fill=white] (cr2) at ([xshift=0em,yshift=-1em]m3.north){};
\node[anchor=south,cnode,fill=white] (cr3) at ([xshift=-5.8em,yshift=0.7em]m3.south){};
\node[anchor=south,cnode,fill=white] (cr3) at ([xshift=-6.2em,yshift=0.7em]m3.south){};
\node[anchor=north,wnode,align=right,font=\tiny] (wr3) at ([xshift=1em,yshift=-0.5em]cr2.south){使用{\color{red!60}模型}\\{\color{blue!60}数据}\\中的\\信息};
\node[anchor=west,wnode,align=right,font=\tiny] (wr4) at ([xshift=0.5em,yshift=0em]cr2.east){使用提取的信息对\\{\color{red!60}模型}中的参数\\进行训练};
\node[anchor=west,wnode,align=left,font=\tiny] (wr5) at ([xshift=0.2em,yshift=0em]cr3.east){使用{\color{blue!60}数据}{\color{red!60}模型}\\的结构进行搜索};
\node[anchor=north,wnode,align=right,font=\tiny] (wr3) at ([xshift=1em,yshift=-0.5em]cr2.south){使用{\color{red!50} \bfnew{模型}}\\{\color{blue} \bfnew{数据}}\\中的\\信息};
\node[anchor=west,wnode,align=right,font=\tiny] (wr4) at ([xshift=0.5em,yshift=0em]cr2.east){使用提取的信息对\\{\color{red!50} \bfnew{模型}}中的参数\\进行训练};
\node[anchor=west,wnode,align=left,font=\tiny] (wr5) at ([xshift=0.2em,yshift=0em]cr3.east){使用{\color{blue} \bfnew{数据}}{\color{red!50} \bfnew{模型}}\\的结构进行搜索};
\draw [-,thick,dotted] ([xshift=0em,yshift=0em]mr1.west) -- ([xshift=0em,yshift=0em]mr1.east);
\draw [-,thick,dashed] ([xshift=0em,yshift=0em]mr1.west) -- ([xshift=0em,yshift=0em]mr1.east);
\draw[->,thick] ([xshift=-5.8em,yshift=0em]mr1.north) -- ([xshift=0em,yshift=0em]cr3.south);
\draw[->,thick] ([xshift=-6.2em,yshift=0em]mr1.north) -- ([xshift=0em,yshift=0em]cr3.south);
\draw[->,thick] ([xshift=0em,yshift=-0em]cr3.north)..controls +(north:1.3em) and +(west:0em)..([xshift=-0em,yshift=-0em]cr1.west) ;
\draw[->,thick] ([xshift=1em,yshift=-0em]mr1.north)..controls +(north:4em) and +(west:0em)..([xshift=-0em,yshift=-0em]cr1.east) ;
\draw[->,thick] ([xshift=0em,yshift=-0em]cr1.north east)..controls +(north:1em) and +(west:0em)..([xshift=-0em,yshift=-0em]cr2.west) ;
......
......@@ -9,15 +9,15 @@
\node [anchor=north,rectangle,minimum height=1.5em,minimum width=2.5em,rounded corners=5pt] (n2) at ([xshift=0em,yshift=-0.2em]n1.south) {$\mathbi{X}$};
\node [anchor=west,encnode,draw=red!60!black!80,fill=red!20] (n3) at ([xshift=1.5em,yshift=0em]n2.east) {$\mathbi{h}^0$};
\node [anchor=west,encnode,draw=red!60!black!80,fill=red!20] (n3) at ([xshift=1.5em,yshift=0em]n2.east) {$\mathbi{h}^1$};
\node [anchor=west,encnode,draw=red!60!black!80,fill=red!20] (n4) at ([xshift=1.5em,yshift=0em]n3.east) {$\mathbi{h}^1$};
\node [anchor=west,encnode,draw=red!60!black!80,fill=red!20] (n4) at ([xshift=1.5em,yshift=0em]n3.east) {$\mathbi{h}^2$};
\node [anchor=west,encnode,draw=red!60!black!80,fill=red!20] (n5) at ([xshift=1.5em,yshift=0em]n4.east) {$\mathbi{h}^2$};
\node [anchor=west,encnode,draw=red!60!black!80,fill=red!20] (n5) at ([xshift=1.5em,yshift=0em]n4.east) {$\mathbi{h}^3$};
\node [anchor=west,rectangle,minimum height=1.5em,minimum width=2.5em,rounded corners=5pt] (n6) at ([xshift=1em,yshift=0em]n5.east) {$\ldots$};
\node [anchor=west,encnode,draw=red!60!black!80,fill=red!20] (n7) at ([xshift=1em,yshift=0em]n6.east) {$\mathbi{h}^{L-1}$};
\node [anchor=west,encnode,draw=red!60!black!80,fill=red!20] (n7) at ([xshift=1em,yshift=0em]n6.east) {$\mathbi{h}^{L}$};
\node [anchor=north,rectangle,draw=teal!80, inner sep=0mm,minimum height=2em,minimum width=8em,fill=teal!17,rounded corners=5pt,thick] (n8) at ([xshift=3em,yshift=-1.5em]n4.south) {权重聚合$\mathbi{g}$};
......@@ -27,15 +27,15 @@
\node [anchor=north,rectangle,minimum height=1.5em,minimum width=2.5em,rounded corners=5pt] (n10) at ([xshift=0em,yshift=-0.2em]n9.south) {$\mathbi{y}_{<j}$};
\node [anchor=west,decnode,draw=ublue,fill=blue!10] (n11) at ([xshift=1.5em,yshift=0em]n10.east) {$\mathbi{s}^0_{j}$};
\node [anchor=west,decnode,draw=ublue,fill=blue!10] (n11) at ([xshift=1.5em,yshift=0em]n10.east) {$\mathbi{s}^1_{j}$};
\node [anchor=west,decnode,draw=ublue,fill=blue!10] (n12) at ([xshift=1.5em,yshift=0em]n11.east) {$\mathbi{s}^1_{j}$};
\node [anchor=west,decnode,draw=ublue,fill=blue!10] (n12) at ([xshift=1.5em,yshift=0em]n11.east) {$\mathbi{s}^2_{j}$};
\node [anchor=west,decnode,draw=ublue,fill=blue!10] (n13) at ([xshift=1.5em,yshift=0em]n12.east) {$\mathbi{s}^2_{j}$};
\node [anchor=west,decnode,draw=ublue,fill=blue!10] (n13) at ([xshift=1.5em,yshift=0em]n12.east) {$\mathbi{s}^3_{j}$};
\node [anchor=west,rectangle,minimum height=1.5em,minimum width=2.5em,rounded corners=5pt] (n14) at ([xshift=1em,yshift=0em]n13.east) {$\ldots$};
\node [anchor=west,decnode,draw=ublue,fill=blue!10] (n15) at ([xshift=1em,yshift=0em]n14.east) {$\mathbi{s}^{M-1}_{j}$};
\node [anchor=west,decnode,draw=ublue,fill=blue!10] (n15) at ([xshift=1em,yshift=0em]n14.east) {$\mathbi{s}^{M}_{j}$};
\node [anchor=west,rectangle,minimum height=1.5em,minimum width=2.5em,rounded corners=5pt] (n16) at ([xshift=1.5em,yshift=0em]n15.east) {$\mathbi{y}_{j}$};
......
\begin{tikzpicture}
\tikzstyle{node}=[draw,minimum height=1.4em,minimum width=2em,rounded corners=1pt,thick]
%violet
\begin{scope}[scale=0.36]
\tikzstyle{every node}=[scale=0.36]
\node[draw=ublue,very thick,rounded corners=3pt,drop shadow,fill=white,minimum width=40em,minimum height=25em] (rec3) at (2.25,0){};
\node[draw=ublue,very thick,rounded corners=3pt,drop shadow,fill=white,minimum width=22em,minimum height=25em] (rec2) at (-12.4,0){};
\node[draw=ublue,very thick,rounded corners=3pt,drop shadow,fill=white,minimum width=24em,minimum height=25em] (rec1) at (-24,0){};
\node[draw,very thick,rounded corners=3pt,drop shadow,fill=red!30,minimum width=40em,minimum height=25em] (rec3) at (2.25,0){};
\node[draw,very thick,rounded corners=3pt,drop shadow,fill=green!30,minimum width=22em,minimum height=25em] (rec2) at (-12.4,0){};
\node[draw,very thick,rounded corners=3pt,drop shadow,fill=yellow!30,minimum width=24em,minimum height=25em] (rec1) at (-24,0){};
%left
\node[text=ublue] (label1) at (-26.4,4){\Huge\bfnew{结构空间}};
\node[align=left] at (-24,-0.5){\Huge\bfnew{1.前馈神经网络} \\ [4ex] \Huge\bfnew{2.卷积神经网络} \\ [4ex] \Huge\bfnew{3.循环神经网络} \\ [4ex] \Huge\bfnew{4. Transformer网络} \\ [4ex] \Huge\bfnew{...}};
\node[] (label1) at (-26.4,4){\Huge\bfnew{结构空间}};
\node[align=left] at (-24,-0.5){\Huge{1.前馈神经网络} \\ [4ex] \Huge{2.卷积神经网络} \\ [4ex] \Huge{3.循环神经网络} \\ [4ex] \Huge{4. Transformer网络} \\ [4ex] \Huge{...}};
\draw[ublue,very thick,-latex] (rec1.0) -- node[align=center,above,text=violet]{\huge{设计} \\ \huge{搜索} \\ \huge{空间}}(rec2.180);
\draw[very thick,-latex] (rec1.0) -- node[align=center,above,text=ublue]{\huge\bfnew{设计} \\ \huge\bfnew{搜索} \\ \huge\bfnew{空间}}(rec2.180);
%mid
\node[text=ublue] (label2) at (-14.4,4){\Huge\bfnew{搜索空间}};
\node[align=left] at (-12.4,-0.5){\Huge\bfnew{循环神经网络} \\ [4ex] \Huge\bfnew{1.普通RNN网络} \\ [4ex] \Huge\bfnew{2. LSTM网络} \\ [4ex] \Huge\bfnew{3. GRU网络} \\ [4ex] \Huge\bfnew{...}};
\node[] (label2) at (-14.4,4){\Huge\bfnew{搜索空间}};
\node[align=left] at (-12.4,-0.5){\Huge{循环神经网络} \\ [4ex] \Huge{1.普通RNN网络} \\ [4ex] \Huge{2. LSTM网络} \\ [4ex] \Huge{3. GRU网络} \\ [4ex] \Huge{...}};
\draw[ublue,very thick,-latex] (rec2.0) -- node[align=center,above,text=violet]{\huge{选择} \\ \huge{搜索} \\ \huge{策略}}(rec3.180);
\draw[very thick,-latex] (rec2.0) -- node[align=center,above,text=ublue]{\huge\bfnew{选择} \\ \huge\bfnew{搜索} \\ \huge\bfnew{策略}}(rec3.180);
\draw[ublue,very thick,-latex,out=-150,in=-30] (rec3.-90) to node[above,text=violet,yshift=1em]{\huge{迭代结构搜索的过程}}(rec2.-90);
\draw[very thick,-latex,out=-150,in=-30] (rec3.-90) to node[above,text=ublue,yshift=1em]{\huge\bfnew{迭代结构搜索的过程}}(rec2.-90);
\draw[ublue,very thick,-latex,out=60,in=130] ([xshift=-8em]rec3.90) to node[above,text=violet]{\huge{性能评估}}([xshift=8em]rec3.90);
\draw[very thick,-latex,out=60,in=130] ([xshift=-8em]rec3.90) to node[above,text=ublue]{\huge\bfnew{性能评估}}([xshift=8em]rec3.90);
%right
\node[node] (n1) at (0,0){};
\node[node] (n2) at (1.5,0){};
......@@ -52,7 +52,7 @@
\node[font=\Huge] at (9,0){$\cdots$};
\node[font=\Huge] at (-4.5,0){$\cdots$};
\node[text=ublue] (label3) at (-2,4){\Huge\bfnew{找到的模型结构}};
\node[] (label3) at (-2,4){\Huge\bfnew{找到的模型结构}};
\node[draw,rounded corners=6pt,very thick,minimum width=16em,minimum height=15em] (box1) at (2.25,0){};
......
......@@ -27,8 +27,8 @@
{0/0/8, 1/0/9, 2/0/10, 3/0/11, 4/0/12, 5/0/13, 6/0/14}
\node[anchor=north] (n\k) at ([xshift=-0em,yshift=-0.5em]a\i\j.south) {\i};
\node [anchor=east] (l1) at ([xshift=-0.3em,yshift=0em]n8.west) {$i$};
\node [anchor=north] (l2) at ([xshift=0em,yshift=-0em]n7.south) {$j$};
\node [anchor=east] (l1) at ([xshift=-0.3em,yshift=0em]n8.west) {$j$};
\node [anchor=north] (l2) at ([xshift=0em,yshift=-0em]n7.south) {$i$};
%\node [anchor=north] (n1) at ([xshift=0em,yshift=0em]a00.south west) {};
......
......@@ -34,7 +34,7 @@
\sectionnewpage
\section{注意力机制的改进}
\parinterval 注意力机制是神经机器翻译成功的关键。以Transformer模型为例,由于使用了自注意力机制,该模型展现出较高的训练并行性,在机器翻译、语言建模等任务上也取得了很好的表现。但是Transformer模型仍存在许多亟待解决的问题,例如,在处理长文本序列时(假设文本长度为$N$),自注意力机制的时间复杂度为$O(N^2)$,当$N$过大时翻译速度很低。此外,尽管Transformer模型的输入中包含了绝对位置编码表示,但是现有的自注意力机制仍然无法显性捕获局部窗口下不同位置之间的关系。而且注意力机制也需要更多样的手段进行特征提取,例如,采用多头或者多分支结构对不同空间特征进行提取。针对以上问题,本节将介绍注意力机制的优化策略,并重点讨论Transformer模型的若干改进方法。
\parinterval 注意力机制是神经机器翻译成功的关键。以Transformer模型为例,由于使用了自注意力机制,该模型展现出较高的训练并行性,同时在机器翻译、语言建模等任务上,该模型也取得了很好的表现。但是Transformer模型仍存在许多亟待解决的问题,例如,在处理长文本序列时(假设文本长度为$N$),自注意力机制的时间复杂度为$O(N^2)$,当$N$过大时翻译速度很低。此外,尽管Transformer模型的输入中包含了绝对位置编码表示,但是现有的自注意力机制仍然无法显性捕获局部窗口下不同位置之间的关系。而且注意力机制也需要更多样的手段进行特征提取,例如,采用多头或者多分支结构对不同空间特征进行提取。针对以上问题,本节将介绍注意力机制的优化策略,并重点讨论Transformer模型的若干改进方法。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -42,11 +42,11 @@
\subsection{局部信息建模}\label{subsec-15.1.1}
\parinterval 使用循环神经网络进行序列建模时,每一个时刻的计算都依赖于上一时刻循环单元的状态。这种模式天然具有一定的时序性,同时具有{\small\bfnew{归纳偏置}}\index{归纳偏置}(Inductive Bias)\index{Inductive Bias}的特性\upcite{DBLP:journals/corr/abs-1806-01261},即每一时刻的状态仅仅基于当前时刻的输入和前一时刻的状态。这种归纳偏置的好处在于,由于模型并不需要对绝对位置进行建模,因此模型可以很容易处理任意长度的序列,即使测试样本显著长于训练样本。
\parinterval 使用循环神经网络进行序列建模时,每一个时刻的计算都依赖于上一时刻循环单元的状态。这种模式天然具有一定的时序性,同时具有{\small\bfnew{归纳偏置}}\index{归纳偏置}(Inductive Bias)\index{Inductive Bias}的特性\upcite{DBLP:journals/corr/abs-1806-01261},即每一时刻的状态仅仅基于当前时刻的输入和前一时刻的状态。这种归纳偏置的好处在于,模型并不需要对绝对位置进行建模,因此模型可以很容易处理任意长度的序列,即使测试样本显著长于训练样本。
\parinterval 但是,Transformer模型中的自注意力机制本身并不具有这种性质,而且它直接忽略了输入单元之间的位置关系。虽然,Transformer中引入了基于正余弦函数的绝对位置编码(见{\chaptertwelve}),但是该方法仍然无法显性区分局部依赖与长距离依赖\footnote[1]{局部依赖指当前位置与局部的相邻位置之间的联系。}
\parinterval 针对上述问题,研究人员设计了“相对位置”编码,对原有的“绝对位置”编码进行补充,强化了局部依赖\upcite{Dai2019TransformerXLAL,Shaw2018SelfAttentionWR}。此外,由于模型中每一层均存在自注意力机制计算,因此模型捕获位置信息的能力也逐渐减弱,这种现象在深层模型中尤为明显。而利用相对位置编码能够把位置信息显性加入到每一层的注意力机制的计算中,进而强化深层模型中局部位置相对位置编码和绝对位置编码方法的表示能力\upcite{li2020shallow}。图\ref{fig:15-1}对比了Transformer中相对位置编码和绝对位置编码方法。
\parinterval 针对上述问题,研究人员设计了“相对位置”编码,对原有的“绝对位置”编码进行补充{\red (要不要用编码?)},强化了局部依赖\upcite{Dai2019TransformerXLAL,Shaw2018SelfAttentionWR}。此外,由于模型中每一层均存在自注意力机制计算,因此模型捕获位置信息的能力也逐渐减弱,这种现象在深层模型中尤为明显。而利用相对位置编码能够把位置信息显性加入到每一层的注意力机制的计算中,{\red 进而强化深层模型中局部位置相对位置编码和绝对位置编码方法的表示能力(表意不对吧?)}\upcite{li2020shallow}。图\ref{fig:15-1}对比了Transformer中绝对位置编码和相对位置编码方法。
%----------------------------------------------
\begin{figure}[htp]
......@@ -71,7 +71,7 @@
\label{eq:15-3}
\end{eqnarray}
\noindent 其中,$\mathbi{x}$为上一层的输出\footnote[2]{这里,$\mathbi{K}$$\mathbi{Q}$$\mathbi{V}$的定义与{\chaptertwelve}略有不同,因为在这里的$\mathbi{K}$$\mathbi{Q}$$\mathbi{V}$ 是指对注意力模型输入进行线性变换后的结果,而{\chaptertwelve}$\mathbi{K}$$\mathbi{Q}$$\mathbi{V}$直接表示输入。但是,这两种描述方式本质上是一样的,区别仅仅在于对输入的线性变化是放在输入自身中描述,还是作为输入之后的一个额外操作。}$\mathbi{W}_Q$$\mathbi{W}_K$$\mathbi{W}_V$为模型参数,它们可以通过自动学习得到。此时,对于整个模型输入的向量序列$\seq{x}=\{\mathbi{x}_1,\ldots,\mathbi{x}_m\}$,通过点乘计算,可以得到当前位置$i$和序列中所有位置间的关系,记为$\mathbi{z}_{i} $,计算公式如下:
\noindent 其中,$\mathbi{x}$为上一层的输出\footnote[2]{这里,$\mathbi{K}$$\mathbi{Q}$$\mathbi{V}$的定义与{\chaptertwelve}略有不同,因为在这里的$\mathbi{K}$$\mathbi{Q}$$\mathbi{V}$ 是指对注意力模型输入进行线性变换后的结果,而{\chaptertwelve}$\mathbi{K}$$\mathbi{Q}$$\mathbi{V}$直接表示输入。但是,这两种描述方式本质上是一样的,区别仅仅在于对输入的线性变化是放在输入自身中描述,还是作为输入之后的一个额外操作。}$\mathbi{W}_Q$$\mathbi{W}_K$$\mathbi{W}_V$为模型参数,它们可以通过自动学习得到。此时,对于整个模型输入的向量序列$\seq{x}=\{\mathbi{x}_1,\ldots,\mathbi{x}_m\}${\red (序列x和上面的x是一个东西?)},通过点乘计算,可以得到当前位置$i$和序列中所有位置间的关系,记为$\mathbi{z}_{i} $,计算公式如下:
\begin{eqnarray}
\mathbi{z}_{i} &=& \sum_{j=1}^m \alpha_{ij}(\mathbi{x}_j \mathbi{W}_V)
\label{eq:15-4}
......@@ -103,7 +103,7 @@
\label{eq:15-9}
\end{eqnarray}
\noindent 其中,$\mathbi{w}^K \in \mathbb{R}^{d_k}$$\mathbi{w}^V \in \mathbb{R}^{d_k}$是模型中可学习的参数矩阵;$\textrm{clip}(\cdot,\cdot)$表示截断操作,由公式\eqref{eq:15-9}定义。可以看出,$\mathbi{a}^K$$\mathbi{a}^V$ 是根据输入的相对位置信息(由$\textrm{clip}(j-i,k)$确定)对$\mathbi{w}^K$$\mathbi{w}^V$进行查表得到的向量,即相对位置表示,如图\ref{fig:15-2}所示。这里通过预先设定的最大相对位置$k$,强化模型对当前词为中心的左右各$k$ 个词的注意力计算。因此,最终的窗口大小为$2k + 1$。 对于边缘位置窗口大小不足$2k$的单词,采用了裁剪的机制,即只对有效的临近词进行建模。此时,注意力模型的计算可以调整为:
\noindent 其中,$\mathbi{w}^K \in \mathbb{R}^{d_k}$$\mathbi{w}^V \in \mathbb{R}^{d_k}$是模型中可学习的参数矩阵;$\textrm{clip}(\cdot,\cdot)$表示截断操作,由公式\eqref{eq:15-9}定义。可以看出,$\mathbi{a}^K$$\mathbi{a}^V$ 是根据输入的相对位置信息(由$\textrm{clip}(j-i,k)$确定)对$\mathbi{w}^K$$\mathbi{w}^V$进行查表得到的向量,即相对位置表示,如图\ref{fig:15-2}所示。这里通过预先设定的最大相对位置$k$,强化模型对当前词为中心的左右各$k$ 个词的注意力计算。因此,最终的窗口大小为$2k + 1$。 对于边缘位置窗口大小不足$2k$的单词,采用了裁剪的机制,即只对有效的临近词进行建模。此时,注意力模型的计算可以调整为:
\begin{eqnarray}
\mathbi{z}_{i} &=& \sum_{j=1}^m \alpha_{ij}(\mathbi{x}_j \mathbi{W}_V + \mathbi{a}_{ij}^V)
\label{eq:15-10}
......@@ -128,27 +128,27 @@
\noindent 可以注意到,公式\eqref{eq:15-10}和公式\eqref{eq:15-11}将位置编码信息直接暴露给每一层注意力机制的计算,而不是像标准Transformer中只将其作为整个模型的输入。
\vspace{0.5em}
\item Transformer-XL\upcite{Dai2019TransformerXLAL}。在Transformer中,模型的输入由词嵌入表示与绝对位置编码组成,例如,对于输入层有,$x_i = \mathbi{E}_{x_i} + \mathbi{U}_i$$x_j=\mathbi{E}_{x_j} + \mathbi{U}_j$,其中$\mathbi{E}_{x_i} $$\mathbi{E}_{x_j} $表示词嵌入,$\mathbi{U}_i$$\mathbi{U}_j$表示绝对位置编码(正余弦函数)。将其代入公式\eqref{eq:15-6}中可以得到:
\item Transformer-XL\upcite{Dai2019TransformerXLAL}。在Transformer中,模型的输入由词嵌入表示与绝对位置编码组成,例如,对于输入层有,$\mathbi{x}_i = \mathbi{E}_{x_i} + \mathbi{U}_i$$\mathbi{x}_j=\mathbi{E}_{x_j} + \mathbi{U}_j$,其中$\mathbi{E}_{x_i} $$\mathbi{E}_{x_j} $表示词嵌入,$\mathbi{U}_i$$\mathbi{U}_j$表示绝对位置编码(正余弦函数)。将$\mathbi{x}_i$$\mathbi{x}_j$代入公式\eqref{eq:15-6}中可以得到:
\begin{eqnarray}
\mathbi{e}_{ij} &=& \frac{(\mathbi{E}_{x_i} + \mathbi{U}_i)\mathbi{W}_Q{((\mathbi{E}_{x_j} + \mathbi{U}_j)\mathbi{W}_K)}^{T}}{\sqrt{d_k}}
\label{eq:15-12}
\end{eqnarray}
\noindent 通过将$\mathbi{e}_{ij}$展开可以得到公式\eqref{eq:15-12}的分子部分:
\noindent {\red 这里使用$A_{ij}^{\rm abs}$表示公式\eqref{eq:15-12}中等式右侧的分子部分,并对其进行展开:}
\begin{eqnarray}
A_{ij}^{\rm abs} &=& \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{E}_{x_j}^{T}}_{\textrm{(a)}} + \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{U}_{j}^{T}}_{\textrm{(b)}} + \nonumber \\
& & \underbrace{\mathbi{U}_i\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{E}_{x_j}^{T}}_{\textrm{(c)}} + \underbrace{\mathbi{U}_i\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{U}_{j}^{T}}_{\textrm{(d)}}
\label{eq:15-13}
\end{eqnarray}
\noindent 这里$\mathbi{W}_Q$$\mathbi{W}_K$表示线性变换矩阵。为了引入相对位置信息,可以将公式\eqref{eq:15-13}修改为如下形式:
\noindent {\red 其中,${\rm abs}$代表使用绝对位置编码计算得到的$A_{ij}$}$\mathbi{W}_Q$$\mathbi{W}_K$表示线性变换矩阵。为了引入相对位置信息,可以将公式\eqref{eq:15-13}修改为如下形式:
\begin{eqnarray}
A_{ij}^{\rm rel} &=& \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{E}_{x_j}^{T}}_{\textrm{(a)}} + \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{R}_{i-j}^{T}}_{\textrm{(b)}} + \nonumber \\
& & \underbrace{\mathbi{u}\mathbi{W}_{K,E}^{T}\mathbi{E}_{x_j}^{T}}_{\textrm{(c)}} + \underbrace{\mathbi{v}\mathbi{W}_{K,R}^{T}\mathbi{R}_{i-j}^{T}}_{\textrm{(d)}}
\label{eq:15-14}
\end{eqnarray}
\noindent 其中$A_{ij}^{\rm rel}$为使用相对位置编码后位置$i$$j$关系的表示结果。公式中各项的含义为:(a)表示位置$i$与位置$j$之间词嵌入的相关性,可以看作是基于内容的表示,(b)表示基于内容的位置偏置,(c)表示全局内容的偏置,(d) 表示全局位置的偏置。公式\eqref{eq:15-13}中的(a)、(b)两项与前面介绍的相对位置编码一致\upcite{Shaw2018SelfAttentionWR},并针对相对位置编码引入了额外的线性变换矩阵。同时,这种方法兼顾了全局内容偏置和全局位置偏置,可以更好地利用正余弦函数的归纳偏置特性。
\noindent 其中{\red (上式,u,v,R没解释)}$A_{ij}^{\rm rel}$为使用相对位置编码后位置$i$$j$关系的表示结果。公式中各项的含义为:(a)表示位置$i$与位置$j$之间词嵌入的相关性,可以看作是基于内容的表示,(b)表示基于内容的位置偏置,(c)表示全局内容的偏置,(d) 表示全局位置的偏置。公式\eqref{eq:15-13}中的(a)、(b)两项与前面介绍的绝对位置编码一致\upcite{Shaw2018SelfAttentionWR},并针对相对位置编码引入了额外的线性变换矩阵。同时,这种方法兼顾了全局内容偏置和全局位置偏置,可以更好地利用正余弦函数的归纳偏置特性。
\vspace{0.5em}
\item {\small\bfnew{结构化位置编码}}\index{基于结构化位置编码}(Structural Position Representations)\index{Structural Position Representations}\upcite{DBLP:conf/emnlp/WangTWS19a}。 例如,可以通过对输入句子进行依存句法分析得到句法树,根据叶子结点在句法树中的深度来表示其绝对位置,并在此基础上利用相对位置编码的思想计算节点之间的相对位置信息。
......@@ -168,7 +168,7 @@ A_{ij}^{\rm rel} &=& \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\
\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{引入高斯约束}}\upcite{Yang2018ModelingLF}。如图\ref{fig:15-3}所示,这类方法的核心思想是引入可学习的高斯分布$\mathbi{G}$作为局部约束,与注意力权重进行融合。
\item {\small\bfnew{引入高斯约束}}\upcite{Yang2018ModelingLF}。如图\ref{fig:15-3}所示,这类方法的核心思想是引入可学习的高斯分布$\mathbi{G}$作为局部约束,与注意力权重进行融合。{\red (曲线再问问?)}
%----------------------------------------------
\begin{figure}[htp]
......@@ -191,7 +191,7 @@ G_{ij} &=& - \frac{{(j - P_i)}^2}{2\sigma_i^2}
\label{eq:15-16}
\end{eqnarray}
\noindent 其中,$\sigma_i$表示偏差,被定义为局部建模窗口大小$D_i$的一半,即$\sigma_i = \frac{D_i}{2}$。中心位置$P_i$$D_i$的计算方式如下:
\noindent 其中,$\sigma_i$表示偏差,被定义为局部建模窗口大小$D_i$的一半{\red (第i个词?)},即$\sigma_i = \frac{D_i}{2}$。中心位置$P_i$$D_i$的计算方式如下:{\red (局部建模窗口?)}
\begin{eqnarray}
\begin{pmatrix} P_i \\ D_i \end{pmatrix} &=& m \cdot \textrm{Sigmoid}(\begin{pmatrix} p_i \\ v_i \end{pmatrix})
\label{eq:15-17}
......@@ -207,7 +207,7 @@ v_i &=& \mathbi{I}_d^T\textrm{Tanh}(\mathbi{W}_d\mathbi{Q}_i)
\noindent 其中,$\mathbi{W}_p$$\mathbi{W}_d$$\mathbi{I}_p$$\mathbi{I}_d$均为模型中可学习的参数矩阵。
\vspace{0.5em}
\item {\small\bfnew{多尺度局部建模}}\upcite{DBLP:conf/aaai/GuoQLXZ20}。不同于上述方法直接作用于注意力权重,多尺度局部建模通过赋予多头不一样的局部感受野,间接地引入局部约束(图\ref{fig:15-4})。
\item {\small\bfnew{多尺度局部建模}}\upcite{DBLP:conf/aaai/GuoQLXZ20}。不同于上述方法直接作用于注意力权重,多尺度局部建模通过赋予多头不一样的局部感受野{\red(什么是感受野,是否是专有名词)},间接地引入局部约束(图\ref{fig:15-4})。
%----------------------------------------------
\begin{figure}[htp]
......@@ -224,7 +224,7 @@ v_i &=& \mathbi{I}_d^T\textrm{Tanh}(\mathbi{W}_d\mathbi{Q}_i)
\label{eq:15-20}
\end{eqnarray}
\noindent 其中,$C(\mathbi{x}_j \mathbi{W}_K,\omega)$表示根据超参数$\omega$自适应的Key:
\noindent 其中,$C(\mathbi{x}_j \mathbi{W}_K,\omega)$表示根据超参数$\omega$自适应的Key:{\red (这块的反馈是什么意思?)}
\begin{eqnarray}
C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}_{j+\omega})
\label{eq:15-21}
......@@ -239,7 +239,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\vspace{0.5em}
\end{itemize}
\parinterval 值得注意的是上述两种添加局部约束的方法都更适用于Transformer模型的底层网络。这是由于模型离输入更近的层更倾向于捕获局部信息,伴随着神经网络的加深,模型更倾向于逐渐加强全局建模的能力。类似的结论在针对BERT模型的解释性研究工作中也有论述\upcite{Jawahar2019WhatDB,DBLP:conf/emnlp/Ethayarajh19}
\parinterval {\red (这块的反馈是什么意思?)}值得注意的是上述两种添加局部约束的方法都更适用于Transformer模型的底层网络。这是由于模型离输入更近的层更倾向于捕获局部信息{\red (是否需要引用论文,或者使用公式证明)},伴随着神经网络的加深,模型更倾向于逐渐加强全局建模的能力。类似的结论在针对BERT模型的解释性研究工作中也有论述\upcite{Jawahar2019WhatDB,DBLP:conf/emnlp/Ethayarajh19}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
......@@ -247,15 +247,15 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsubsection{3. 卷积 vs 注意力}
\parinterval 第十一章已经提到,卷积神经网络能够很好地捕捉序列中的局部信息。因此,充分地利用卷积神经网络的特性,也是一种进一步优化注意力模型的思路。常见的做法是在注意力模型中引入卷积操作,甚至用卷积操作替换注意力模型。常见的方法有
\parinterval 第十一章已经提到,卷积神经网络能够很好地捕捉序列中的局部信息。因此,充分地利用卷积神经网络的特性,也是一种进一步优化注意力模型的思路。常见的做法是在注意力模型中引入卷积操作,甚至用卷积操作替换注意力模型,如
\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{使用轻量卷积和动态卷积神经网络}}\upcite{Wu2019PayLA,DBLP:conf/interspeech/GulatiQCPZYHWZW20}。比如,分别在编码端和解码端利用轻量卷积或动态卷积神经网络(见{\chapternine})替换Transformer的自注意力机制,同时保留解码端的编码-解码注意力机制,一定程度上加强了模型对局部信息的建模能力,同时提高了计算效率。
\item {\small\bfnew{使用轻量卷积和动态卷积神经网络}}\upcite{Wu2019PayLA,DBLP:conf/interspeech/GulatiQCPZYHWZW20}。比如,分别在编码器和解码器利用轻量卷积或动态卷积神经网络(见{\chapternine})替换Transformer的自注意力机制,同时保留解码器的编码-解码注意力机制,一定程度上加强了模型对局部信息的建模能力,同时提高了计算效率。
\vspace{0.5em}
\item {\small\bfnew{使用1维卷积注意力网络}}(图\ref{fig:15-5}(b))。可以使用一维的卷积自注意力网络(1D-CSAN)将关注的范围限制在相近的元素窗口中。其形式上十分简单,只需预先设定好局部建模的窗口大小$D$,并在进行注意力权重计算和对Value值进行加权求和时,将其限制在设定好的窗口范围内即可
\item {\small\bfnew{使用1维卷积注意力网络}}(图\ref{fig:15-5}(b))。可以使用一维的卷积自注意力网络(1D-CSAN)将关注的范围限制在相近的元素窗口中。其形式上十分简单,只需预先设定好局部建模的窗口大小$D$,并在进行注意力权重计算和对Value值进行加权求和时,将其限制在设定好的窗口范围内。
\vspace{0.5em}
\item {\small\bfnew{使用2维卷积注意力网络}}(图\ref{fig:15-5}(c))。在一维卷积注意力网络的基础上,对多个注意力头之间的信息进行交互建模,打破了注意力头之间的界限。 1D-CDAN的关注区域为$1\times D$,当将其扩展为二维矩形$D \times N$,长和宽分别为局部窗口的大小和参与建模的自注意力头的个数。这样,模型可以计算某个头中的第$i$个元素和另一个头中的第$j$个元素之间的相关性系数。实现了对不同子空间之间关系的建模,所得到的注意力分布表示了头之间的依赖关系。
\item {\small\bfnew{使用2维卷积注意力网络}}(图\ref{fig:15-5}(c))。在一维卷积注意力网络的基础上,对多个注意力头之间的信息进行交互建模,打破了注意力头之间的界限。 1D-CDAN{\red (S?)}的关注区域为$1\times D$,当将其扩展为二维矩形$D \times N$,长和宽分别为局部窗口的大小和参与建模的自注意力头的个数。这样,模型可以计算某个头中的第$i$个元素和另一个头中的第$j$个元素之间的相关性系数,实现了对不同子空间之间关系的建模,所得到的注意力分布{\red (哪里得到了?)}表示了头之间的依赖关系。
%----------------------------------------------
\begin{figure}[htp]
......@@ -275,15 +275,15 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\parinterval 在神经网络模型中,可以使用多个平行的组件从不同角度捕捉输入的特征,这种结构被称为{\small\bfnew{多分支}}\index{多分支}(Multi-branch)\index{Multi-branch}结构。多分支结构在图像处理领域被广泛应用\upcite{DBLP:conf/cvpr/XieGDTH17},在许多人工设计或者自动搜索获得的神经网络结构中也有它的身影\upcite{DBLP:conf/icml/SoLL19,DBLP:conf/emnlp/YanMZ20,DBLP:journals/corr/abs-2006-10270}
\parinterval 在自然语言处理领域,多分支结构同样也有很多应用。比如,{\chapterten}介绍过,为了更好地对源语言进行表示,编码可以采用双向循环神经网络。这种模型就可以被看作一个两分支的结构,分别用来建模正向序列和反向序列的表示,之后将这两种表示进行拼接得到更丰富的序列表示结果。另一个典型的例子是{\chaptertwelve}介绍的多头注意力机制。在Transformer 模型中,多头注意力将输入向量分割成多个子向量,然后分别进行点乘注意力的计算,最后再将多个输出的子向量拼接后通过线性变换进行不同子空间信息的融合。在这个过程中,多个不同的头对应着不同的特征空间,可以捕捉到不同的特征信息。
\parinterval 在自然语言处理领域,多分支结构同样也有很多应用。比如,{\chapterten}介绍过,为了更好地对源语言进行表示,编码可以采用双向循环神经网络。这种模型就可以被看作一个两分支的结构,分别用来建模正向序列和反向序列的表示,之后将这两种表示进行拼接得到更丰富的序列表示结果。另一个典型的例子是{\chaptertwelve}介绍的多头注意力机制。在Transformer 模型中,多头注意力将输入向量分割成多个子向量,然后分别进行点乘注意力的计算,最后再将多个输出的子向量拼接后通过线性变换进行不同子空间信息的融合。在这个过程中,多个不同的头对应着不同的特征空间,可以捕捉到不同的特征信息。
\parinterval 近几年,在Transformer的结构基础上,研究人员探索了更为丰富的多分支结构。下面介绍几种在Transformer模型中引入多分支结构的方法:
\begin{itemize}
\vspace{0.5em}
\item Weighted Transformer\upcite{DBLP:journals/corr/abs-1711-02132}。其主要思想是在多头自注意力机制的基础上保留不同表示空间的特征。传统方法使用级联操作并通过线性映射矩阵来融合不同头之间的信息,而Weighted Transformer直接利用线性映射将维度为$d_k$ 的向量表示映射到$d_{\rm model}$维的向量。之后,将这个$d_{\rm model}$维向量分别送入每个分支中的前馈神经网络,最后对不同分支的输出进行线性加权。但是,这个模型的计算复杂度要大于标准的Transformer模型。
\item {\small\bfnew{Weighted Transformer}}\upcite{DBLP:journals/corr/abs-1711-02132}。其主要思想是在多头自注意力机制的基础上保留不同表示空间的特征。传统方法使用级联操作并通过线性映射矩阵来融合不同头之间的信息,而Weighted Transformer直接利用线性映射将维度为$d_k$ 的向量表示映射到$d_{\rm model}$维的向量。之后,将这个$d_{\rm model}$维向量分别送入每个分支中的前馈神经网络,最后对不同分支的输出进行线性加权。但是,这种模型的计算复杂度要大于标准的Transformer模型。
\vspace{0.5em}
\item 多分支注意力模型\upcite{DBLP:journals/corr/abs-2006-10270}。不同于Weighted Transformer模型,多分支注意力模型直接利用每个分支独立地进行自注意力模型的计算(图\ref{fig:15-6})。同时为了避免结构相同的多个多头注意力机制之间的协同适应,这种模型使用Dropout方法在训练过程中以一定的概率随机地丢弃一些分支。
\item {\small\bfnew{多分支注意力模型}}\upcite{DBLP:journals/corr/abs-2006-10270}。不同于Weighted Transformer模型,多分支注意力模型直接利用每个分支独立地进行自注意力模型的计算(图\ref{fig:15-6})。同时为了避免结构相同的多个多头注意力机制之间的协同适应,这种模型使用Dropout方法在训练过程中以一定的概率随机地丢弃一些分支。
%----------------------------------------------
\begin{figure}[htp]
......@@ -295,11 +295,11 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
%-------------------------------------------
\vspace{0.5em}
\item 多模型集成。例如,为了进一步加强不同分支的作用,基于多单元的Transformer模型进行了序列不同位置表示结果的交换,或使用不同的掩码策略对不同分支的输入进行扰动,保证分支间的多样性与互补性\upcite{DBLP:conf/emnlp/YanMZ20}。本质上,所谓的多单元思想与集成学习十分相似,类似于在训练过程中同时训练多个编码器。此外,通过增大子单元之间的结构差异性也能够进一步增大分支之间的多样性\upcite{李北2019面向神经机器翻译的集成学习方法分析}
\item {\small\bfnew{多模型集成}}{\red(多模型还是多单元?)}。例如,为了进一步加强不同分支的作用,基于多单元的Transformer模型进行了序列不同位置表示结果的交换,或使用不同的掩码策略对不同分支的输入进行扰动,保证分支间的多样性与互补性\upcite{DBLP:conf/emnlp/YanMZ20}。本质上,所谓的多单元思想与集成学习十分相似,类似于在训练过程中同时训练多个编码器。此外,通过增大子单元之间的结构差异性也能够进一步增大分支之间的多样性\upcite{李北2019面向神经机器翻译的集成学习方法分析}
\vspace{0.5em}
\end{itemize}
\parinterval 此外,在\ref{subsec-15.1.1}节中曾提到过,利用卷积神经网络可以与自注意力机制形成互补。类似的想法在多分支结构中也有体现。如图\ref{fig:15-7}所示,可以使用自注意力机制和卷积神经网络分别提取全局和局部两种依赖关系\upcite{DBLP:conf/iclr/WuLLLH20}。具体的做法是将输入的特征向量切分成等同维度的两部分,之后分别送入两个分支进行计算。其中,全局信息使用自注意力机制进行提取,局部信息使用轻量卷积进行提取\upcite{Wu2019PayLA}。此外,由于每个分支的维度只有原始的一半,采用并行计算方式可以显著提升系统的运行速度。
\parinterval 此外,在\ref{subsec-15.1.1}节中曾提到过,利用卷积神经网络可以与自注意力机制形成互补。类似的想法在多分支结构中也有体现。如图\ref{fig:15-7}所示,可以使用自注意力机制和卷积神经网络分别提取全局和局部两种依赖关系\upcite{DBLP:conf/iclr/WuLLLH20}。具体的做法是将输入的特征向量切分成等同维度的两部分,之后分别送入两个分支进行计算。其中,全局信息使用自注意力机制进行提取,局部信息使用轻量卷积网络进行提取\upcite{Wu2019PayLA}。此外,由于每个分支的维度只有原始的一半,采用并行计算方式可以显著提升系统的运行速度。
%----------------------------------------------
\begin{figure}[htp]
......@@ -316,9 +316,9 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsection{引入循环机制}
\parinterval 虽然Transformer模型完全摒弃了循环单元与卷积单元,仅通过位置编码来区分序列中的不同位置。但是,循环神经网络也非常适用于处理序列结构,且其结构成熟、易于优化。因此,有研究人员尝试将其与Transformer模型融合。这种方式一方面能够发挥循环神经网络简单高效的特点,另一方面也能够发挥Transformer模型在特征提取方面的优势,是一种非常值得探索的思路\upcite{Chen2018TheBO}
\parinterval 虽然Transformer模型完全摒弃了循环单元与卷积单元,仅通过位置编码来区分序列中的不同位置。但是,循环神经网络也非常适用于处理序列结构,且其结构成熟、易于优化。因此,有研究人员尝试将其与Transformer模型融合。这种方式一方面能够发挥循环神经网络简单高效的特点,另一方面也能够发挥Transformer模型在特征提取方面的优势,是一种非常值得探索的思路\upcite{Chen2018TheBO}
\parinterval 在Transformer模型中引入循环神经网络的一种方法是,对深层网络的不同层使用循环机制。早在残差网络提出时,研究人员已经开始尝试探讨残差网络成功背后的原因\upcite{DBLP:conf/nips/VeitWB16,DBLP:journals/corr/GreffSS16,DBLP:conf/iclr/ChangMHTB18}。本质上,在卷积神经网络中引入残差连接后,神经网络从深度上隐性地利用循环的特性。也就是,多层Transformer的不同层本身也可以被看作是一个处理序列,只是序列中不同位置(对应不同层)的模型参数独立,而非共享。Transformer编码器与解码器分别由$N$个相同结构但参数独立的块堆叠而成,其中编码块与解码块中分别包含2和3个子层。同时,子层之间引入了残差连接保证了网络信息传递的高效性。因此,一个自然的想法是通过共享不同块之间的参数,引入循环神经网络中的归纳偏置\upcite{DBLP:conf/iclr/DehghaniGVUK19}。其中每层的权重是共享的,并引入了基于时序的编码向量用于显著区分不同深度下的时序信息,如图\ref{fig:15-8}所示。在训练大容量预训练模型时同样也采取了共享层间参数的方式\upcite{Lan2020ALBERTAL}
\parinterval 在Transformer模型中引入循环神经网络的一种方法是,对深层网络的不同层使用循环机制。早在残差网络提出时,研究人员已经开始尝试探讨残差网络成功背后的原因\upcite{DBLP:conf/nips/VeitWB16,DBLP:journals/corr/GreffSS16,DBLP:conf/iclr/ChangMHTB18}。本质上,在卷积神经网络中引入残差连接后,神经网络从深度上隐性地利用了循环的特性。也就是,多层Transformer的不同层本身也可以被看作是一个处理序列,只是序列中不同位置(对应不同层)的模型参数独立,而非共享。Transformer编码器与解码器分别由$N$个结构相同但参数独立的块{\red (块还是层?)}堆叠而成,其中编码块与解码块中分别包含2和3个子层。同时,子层之间引入了残差连接保证了网络信息传递的高效性。因此,一个自然的想法是通过共享不同块{\red (块还是层?)}之间的参数,引入循环神经网络中的归纳偏置\upcite{DBLP:conf/iclr/DehghaniGVUK19}。其中每层的权重是共享的{\red (块还是层?)},并引入了基于时序的编码向量用于显著区分不同深度下的时序信息,如图\ref{fig:15-8}所示。在训练大容量预训练模型时同样也采取了共享层间参数的方式\upcite{Lan2020ALBERTAL}
%----------------------------------------------
\begin{figure}[htp]
......@@ -329,7 +329,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\end{figure}
%-------------------------------------------
\parinterval 另一种方法是,利用循环神经网络对输入序列进行编码,之后通过门控机制将得到的结果与Transformer进行融合\upcite{DBLP:conf/naacl/HaoWYWZT19}。融合机制可以采用串行计算或并行计算。
\parinterval 另一种方法是,利用循环神经网络对输入序列进行编码,之后通过门控机制将得到的结果与Transformer进行融合\upcite{DBLP:conf/naacl/HaoWYWZT19}。融合机制可以采用串行计算或并行计算{\red (有点少?啥意思?)}
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -337,7 +337,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsection{高效的自注意力模型}
\parinterval 除了机器翻译,Transformer模型同样被广泛应用于自然语言理解、图像处理、语音处理等任务。但是,自注意力机制的时间复杂度是序列长度$N$的平方项,同时其对内存(显存)的消耗巨大,尤其当处理较长序列的文本时,问题尤为严重。因此如何提高Transformer模型的效率也是广泛关注的方向之一{\chapterfourteen}已经从模型推断的角度介绍了Transformer系统加速的方法,这里重点讨论一些高效的Transformer变种模型。
\parinterval 除了机器翻译,Transformer模型同样被广泛应用于自然语言理解、图像处理、语音处理等任务。但是,自注意力机制的时间复杂度是序列长度$N$的平方项{\red (这里要不要乘隐藏层维度?)},同时其对内存(显存)的消耗巨大,尤其当处理较长序列的文本时,这种问题尤为严重。因此如何提高Transformer模型的效率也受到了广泛的关注{\chapterfourteen}已经从模型推断的角度介绍了Transformer系统加速的方法,这里重点讨论一些高效的Transformer变种模型。
\parinterval 自注意力机制的时间复杂度较高,正是因为其需要对序列中的每一个位置计算与其他所有位置的相关性。因此一个自然的想法就是限制自注意力机制的作用范围,大体上可以分为如下几种方式:
......@@ -345,7 +345,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\vspace{0.5em}
\item 分块注意力:顾名思义,就是将序列划分为固定大小的片段,注意力模型只在对应的片段内执行。这样,每一个片段内的注意力计算成本是固定的,可以大大降低处理长序列时的总体计算时间\upcite{DBLP:conf/emnlp/QiuMLYW020,DBLP:conf/iclr/LiuSPGSKS18}
\vspace{0.5em}
\item 跨步注意力:该模型是一种稀疏的注意力机制,通常会设置一个固定的间隔,也就是说在计算注意力表示时,每隔固定数量的词后将下一个词纳入所需考虑的范围内,参与注意力的计算\upcite{DBLP:journals/corr/abs-2004-05150}。和分片段进行注意力计算类似,假设最终参与注意力计算的间隔长度为$B$,共需要执行$N/B$次注意力计算,可以将计算复杂度从$O(N^2)$缩减为$O(NB)$
\item 跨步注意力:该模型是一种稀疏的注意力机制,通常会设置一个固定的间隔,也就是说在计算注意力表示时,每隔固定数量的词后将下一个词纳入所需考虑的范围内,参与注意力的计算\upcite{DBLP:journals/corr/abs-2004-05150}。和分片段进行注意力计算类似,假设最终参与注意力计算的间隔长度为$B${\red (单词数还是间隔长度?)},共需要执行$N/B$次注意力计算,可以将计算复杂度从$O(N^2)$缩减为$O(NB)$
\vspace{0.5em}
\item 内存压缩注意力:这种方式的主要的思想是使用一些操作,如卷积、池化等对序列进行下采样,来缩短序列长度。例如,使用{\small\bfnew{跨步卷积}}\index{跨步卷积}(Stride Convolution)\index{Stride Convolution}来减少Key和Value的数量,即减少表示序列长度的维度的大小,Query的数量保持不变,从而减少了注意力权重计算时的复杂度\upcite{DBLP:conf/iclr/LiuSPGSKS18}。其具体的计算复杂度取决于跨步卷积时步幅的大小$K$,形式上可以理解为每$K$个单元做一次特征融合后,将关注的目标缩减为$N/K$,整体的计算复杂度为$N^2/K$。相比于使用前两种方式对局部进行注意力计算,该方式仍是对全局的建模。
\vspace{0.5em}
......@@ -353,11 +353,11 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\parinterval 在不同的任务中,可以根据不同的需求使用不同的注意力模型,甚至可以采用多种注意力模型的结合。比如,对分类任务中的某些特殊标签,如BERT中的<CLS>,需要对全局信息进行整合,因此可以使用全局注意力。而对于其他位置,则可以使用局部注意力提高计算效率。同样的,也可以针对多头机制中的不同注意力头采用不同的计算方式,或者对不同的头设置不同的局部窗口大小,以此来增大感受野,在提高模型计算效率的同时使模型保留全局建模能力。
\parinterval 由于上述方法都是基于预先设定好的超参来限制注意力机制的作用范围,因此可以称这些方法是静态的。除此之外还有以数据驱动的通过模型来学习注意力机制的作用范围。比如,可以将序列分块,并对序列中的不同单元进行排序或者聚类,之后采用稀疏注意力的计算。下面对部分相关的模型进行介绍:
\parinterval 由于上述方法都是基于预先设定好的超参来限制注意力机制的作用范围,因此可以称这些方法是静态的。除此之外还有以数据驱动的方法,这类方法通过模型来学习注意力机制的作用范围。比如,可以将序列分块,并对序列中的不同单元进行排序或者聚类,之后采用稀疏注意力的计算。下面对部分相关的模型进行介绍:
\begin{itemize}
\vspace{0.5em}
\item Reformer模型在计算Key和Value时使用相同的线性映射,共享Key和Value的值\upcite{Kitaev2020ReformerTE},降低了自注意力机制的复杂度。进一步,Reformer引入了一种{\small\bfnew{局部哈希敏感注意力机制}}\index{局部哈希敏感注意力机制}(LSH Attention)\index{LSH Attention},其提高效率的方式和固定模式中的局部建模一致,减少注意力机制的计算范围。对于每一个Query,通过局部哈希敏感机制找出和其较为相关的Key,并进行注意力的计算。其基本思路就是距离相近的向量以较大的概率被哈希分配到一个桶内,距离较远的向量被分配到一个桶内的概率则较低。此外,Reformer中还采用了一种{\small\bfnew{可逆残差网络结构}}\index{可逆残差网络结构}(The Reversible Residual Network)\index{The Reversible Residual Network}和分块计算前馈神经网络层的机制,即将前馈层的隐层维度拆分多个块后独立的进行计算,最后进行拼接操作,得到前馈层的输出。这种方式大幅度减少了内存(显存)占用,但由于在反向过程中需要重复计算某些节点,牺牲了一定的计算时间
\item Reformer模型在计算Key和Value时使用相同的线性映射,共享Key和Value的值\upcite{Kitaev2020ReformerTE},降低了自注意力机制的复杂度。进一步,Reformer引入了一种{\small\bfnew{局部哈希敏感注意力机制}}\index{局部哈希敏感注意力机制}(LSH Attention)\index{LSH Attention},其提高效率的方式和固定模式中的局部建模一致,减少注意力机制的计算范围。对于每一个Query,通过局部哈希敏感机制找出和其较为相关的Key,并进行注意力的计算。其基本思路就是距离相近的向量以较大的概率被哈希分配到一个桶内,距离较远的向量被分配到一个桶内的概率则较低。此外,Reformer中还采用了一种{\small\bfnew{可逆残差网络结构}}\index{可逆残差网络结构}(The Reversible Residual Network)\index{The Reversible Residual Network}和分块计算前馈神经网络层的机制,即将前馈层的隐层维度拆分为多个块并独立的进行计算,最后进行拼接操作,得到前馈层的输出。这种方式大幅度减少了内存(显存)占用,但由于在反向过程中需要重复计算某些节点,牺牲了一定的计算时间{\red (那这个时间到底是少了还是多了?)}
\vspace{0.5em}
\item Routing Transformer通过聚类算法对序列中的不同单元进行分组,分别在组内进行自注意力机制的计算\upcite{DBLP:journals/corr/abs-2003-05997}。首先是将Query和Key映射到聚类矩阵$\mathbi{S}$
......@@ -387,9 +387,9 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\sectionnewpage
\section{神经网络连接优化及深层模型}
\parinterval 除了对Transformer模型中的局部组件进行改进,改进不同层之间的连接方式也十分重要。常见的做法是融合编码/解码的中间层表示得到更丰富的编码/解码输出\upcite{Wang2018MultilayerRF,Wang2019ExploitingSC,Dou2018ExploitingDR,Dou2019DynamicLA}。同时,可以利用稠密连接等更丰富的层间连接方式来强化或替换残差连接。
\parinterval 除了对Transformer模型中的局部组件进行改进,改进不同层之间的连接方式也十分重要。常见的做法是融合编码器/解码器的中间层表示得到信息更丰富的编码/解码输出\upcite{Wang2018MultilayerRF,Wang2019ExploitingSC,Dou2018ExploitingDR,Dou2019DynamicLA}。同时,可以利用稠密连接等更丰富的层间连接方式来强化或替换残差连接。
\parinterval 与此同时,宽网络(如Transformer-Big)在机器翻译、语言模型等任务上表现十分出色,但伴随而来的是快速增长的参数量与更大的训练代价。同时受限于任务的复杂度与计算设备的算力,进一步探索更宽的神经网络显然不是特别高效的手段。因此研究人员普遍选择增加神经网络的深度来对句子进行更充分的表示。但是,简单地堆叠很多层的Transformer模型并不能带来性能上的提升,反而会面临更加严重的梯度消失/梯度爆炸的问题。这是由于伴随神经网络变深,梯度无法有效地从输出层回传到底层神经网络,造成浅层部分的参数无法得到充分训练\upcite{Bapna2018TrainingDN,WangLearning,DBLP:journals/corr/abs-2002-04745,DBLP:conf/emnlp/LiuLGCH20}。针对这些问题,可以设计更有利于深层信息传递的神经网络连接和恰当的参数初始化方法等。
\parinterval 与此同时,虽然宽网络(如Transformer-Big)在机器翻译、语言模型等任务上表现十分出色,但伴随而来的是快速增长的参数量与更大的训练代价。并且受限于任务的复杂度与计算设备的算力,进一步探索更宽的神经网络显然不是特别高效的手段。因此研究人员普遍选择增加神经网络的深度来对句子进行更充分地表示。但是,简单地堆叠很多层的Transformer模型并不能带来性能上的提升,反而会面临更加严重的梯度消失/梯度爆炸的问题。这是由于伴随神经网络变深,梯度无法有效地从输出层回传到底层神经网络,造成浅层部分的参数无法得到充分训练\upcite{Bapna2018TrainingDN,WangLearning,DBLP:journals/corr/abs-2002-04745,DBLP:conf/emnlp/LiuLGCH20}。针对这些问题,可以设计更有利于深层信息传递的神经网络连接和恰当的参数初始化方法等。
\parinterval 但是,如何设计一个足够“深”的机器翻译模型仍然是业界关注的热点问题之一。此外,伴随着神经网络的继续变深,将会面临一些新的问题,例如,如何加速深层神经网络的训练,如何解决深层神经网络的过拟合问题等。下面将会对以上问题展开讨论。首先对Transformer模型的内部信息流进行分析,之后分别从模型结构和参数初始化两个角度求解为什么深层网络难以训练,并介绍相应的解决手段。
......@@ -400,7 +400,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsection{Post-Norm vs Pre-Norm}
\label{sec:post-pre-norm}
\parinterval 为了探究为何深层Transformer模型很难直接训练,首先对Transformer的模型结构进行简单的回顾,详细内容可以参考{\chaptertwelve}。以Transformer的编码为例,在多头自注意力和前馈神经网络中间,Transformer模型利用残差连接\upcite{DBLP:journals/corr/HeZRS15}和层标准化操作\upcite{Ba2016LayerN}来提高信息的传递效率。Transformer模型大致分为图\ref{fig:15-9}中的两种结构\ \dash \ 后作方式的残差单元(Post-Norm)和前作方式的残差单元(Pre-Norm)。
\parinterval 为了探究为何深层Transformer模型很难直接训练,首先对Transformer的模型结构进行简单的回顾,详细内容可以参考{\chaptertwelve}。以Transformer的编码为例,在多头自注意力和前馈神经网络中间,Transformer模型利用残差连接\upcite{DBLP:journals/corr/HeZRS15}和层标准化操作\upcite{Ba2016LayerN}来提高信息的传递效率。Transformer模型大致分为图\ref{fig:15-9}中的两种结构\ \dash \ 后作方式的残差单元(Post-Norm)和前作方式的残差单元(Pre-Norm)。
%----------------------------------------------
\begin{figure}[htp]
......@@ -411,7 +411,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\end{figure}
%-------------------------------------------
\parinterval$\mathbi{x}_l$$\mathbi{x}_{l+1}$表示第$l$个子层的输入和输出\footnote[4]{这里沿用Transformer中的定义,每一层(Layer)包含多个子层(Sub-layer)。比如,对于Transformer编码器,每一层包含一个自注意力子层和一个前馈神经网络子层。所有子层都需要进行层标准化和残差连接。}$\mathbi{y}_l$表示中间的临时输出;$\textrm{LN}(\cdot)$表示层标准化操作,帮助减子层输出的方差,从而让训练变得更稳定;$F(\cdot)$表示子层所对应的函数,比如前馈神经网络、自注意力等。下面分别对Post-Norm和Pre-Norm进行简单的描述。
\parinterval$\mathbi{x}_l$$\mathbi{x}_{l+1}$表示第$l$个子层的输入和输出\footnote[4]{这里沿用Transformer中的定义,每一层(Layer)包含多个子层(Sub-layer)。比如,对于Transformer编码器,每一层包含一个自注意力子层和一个前馈神经网络子层。所有子层都需要进行层标准化和残差连接。}$\mathbi{y}_l$表示中间的临时输出;$\textrm{LN}(\cdot)$表示层标准化操作,帮助减子层输出的方差,从而让训练变得更稳定;$F(\cdot)$表示子层所对应的函数,比如前馈神经网络、自注意力等。下面分别对Post-Norm和Pre-Norm进行简单的描述。
\begin{itemize}
\vspace{0.5em}
\item Post-Norm:早期的Transformer遵循的是Post-Norm结构\upcite{vaswani2017attention}。也就是层标准化作用于每一子层的输入和输出的残差结果上,如图\ref{fig:15-9}(a)所示。可以表示如下:
......@@ -435,7 +435,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\label{eq:15-28}
\end{eqnarray}
\noindent 其中,$\prod_{k=l}^{L-1}\frac{\partial \textrm{LN}(\mathbi{y}_k)}{\partial \mathbi{y}_k}$表示在反向传播过程中经过层标准化得到的复合函数导数,$\prod_{k=l}^{L-1}(1+\frac{\partial F(\mathbi{x}_k;{\bm \theta_k})}{\partial \mathbi{x}_k})$代表每个子层间残差连接的导数。
\noindent 其中,$\prod_{k=l}^{L-1}\frac{\partial \textrm{LN}(\mathbi{y}_k)}{\partial \mathbi{y}_k}$表示在反向传播过程中,经过层标准化得到的复合函数导数。$\prod_{k=l}^{L-1}(1+\frac{\partial F(\mathbi{x}_k;{\bm \theta_k})}{\partial \mathbi{x}_k})$代表每个子层间残差连接的导数。
\parinterval 类似的,也能得到Pre-Norm结构的梯度计算结果,如下:
\begin{eqnarray}
......@@ -443,11 +443,11 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\label{eq:15-29}
\end{eqnarray}
\parinterval 对比公式\eqref{eq:15-28}和公式\eqref{eq:15-29}可以看出,Pre-Norm结构直接把顶层的梯度$\frac{\partial Loss}{\partial \mathbi{x}_L}$传递给下层,并且如果将公式\eqref{eq:15-29}右侧进行展开,可以发现$\frac{\partial Loss}{\partial \mathbi{x}_l}$中直接含有$\frac{\partial Loss}{\partial \mathbi{x}_L}$部分。这个性质弱化了梯度计算对模型深度$L$的依赖;而如公式\eqref{eq:15-28}右侧所示,Post-Norm结构会导致一个与$L$相关的多项导数的积,伴随着$L$的增大更容易发生梯度消失和梯度爆炸问题。因此,Pre-Norm结构更适于堆叠多层神经网络的情况。比如,使用Pre-Norm 结构可以很轻松地训练一个30层(60个子层)编码器的Transformer网络,并带来可观的BLEU提升。这个结果相当于标准Transformer编码器深度的6倍,相对的,用Post-Norm结构训练深层网络的时候,训练结果很不稳定,当编码器深度超过12层后很难完成有效训练\upcite{WangLearning},尤其是在低精度设备环境下损失函数出现发散情况。这里把使用Pre-Norm的深层Transformer模型称为Transformer-Deep。
\parinterval 对比公式\eqref{eq:15-28}和公式\eqref{eq:15-29}可以看出,Pre-Norm结构直接把顶层的梯度$\frac{\partial Loss}{\partial \mathbi{x}_L}$传递给下层,并且如果将公式\eqref{eq:15-29}右侧展开,可以发现$\frac{\partial Loss}{\partial \mathbi{x}_l}$中直接含有$\frac{\partial Loss}{\partial \mathbi{x}_L}$部分。这个性质弱化了梯度计算对模型深度$L$的依赖;而如公式\eqref{eq:15-28}右侧所示,Post-Norm结构则包含一个与$L$相关的多项导数的积,伴随着$L$的增大更容易发生梯度消失和梯度爆炸问题。因此,Pre-Norm结构更适于堆叠多层神经网络的情况。比如,使用Pre-Norm 结构可以很轻松地训练一个30层(60个子层)编码器的Transformer网络,并带来可观的BLEU提升。这个结果相当于标准Transformer编码器深度的6倍,相对的,用Post-Norm结构训练深层网络的时候,训练结果很不稳定,当编码器深度超过12层后很难完成有效训练\upcite{WangLearning},尤其是在低精度设备环境下损失函数出现发散情况{\red(更容易?)}。这里把使用Pre-Norm的深层Transformer模型称为Transformer-Deep。
\parinterval 另一个有趣的发现是,使用深层网络后,网络可以更有效地利用较大的学习率和较大的批量训练,大幅度缩短了模型达到收敛状态的时间。相比于Transformer-Big等宽网络,Transformer-Deep并不需要太大的隐藏层维度就可以取得更优的翻译品质\upcite{WangLearning}。也就是说,Transformer-Deep是一个更“窄”更“深”的神经网络。这种结构的参数量比Transformer-Big少,系统运行效率更高。
\parinterval 此外研究人员发现当编码端使用深层模型之后,解码端使用更浅的模型依然能够维持很好的翻译品质。这是由于解码端也会对源语言信息进行加工和抽象,当编码器变深之后,解码器对源语言的加工就不那么重要了,因此可以减少解码器的深度。这样做的一个直接好处是:可以通过减少解码器的深度提高翻译速度。对于一些翻译延时敏感的场景,这种架构是极具潜力的\upcite{DBLP:journals/corr/abs-2006-10369,DBLP:journals/corr/abs-2012-13866,DBLP:conf/aclnmt/HuLLLLWXZ20}
\parinterval 此外研究人员发现当编码器使用深层模型之后,解码器使用更浅的模型依然能够维持很好的翻译品质。这是由于解码器也会对源语言信息进行加工和抽象,当编码器变深之后,解码器对源语言的加工就不那么重要了,因此可以减少解码器的深度。这样做的一个直接好处是:可以通过减少解码器的深度提高翻译速度。对于一些翻译延时敏感的场景,这种架构是极具潜力的\upcite{DBLP:journals/corr/abs-2006-10369,DBLP:journals/corr/abs-2012-13866,DBLP:conf/aclnmt/HuLLLLWXZ20}
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -465,7 +465,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsubsection{1. 使用更多的跨层连接}
\parinterval\ref{fig:15-10}描述了引入了更多跨层连接的结构。在模型的前向计算过程中,假设编码端总层数为$L$,当完成编码端$L$层的逐层计算后,通过线性平均、加权平均等机制对模型的中间层表示进行融合,得到蕴含所有层信息的表示\mathbi{g},作为编码-解码注意力机制的输入,与总共有$M$层的解码器共同处理解码信息。
\parinterval\ref{fig:15-10}描述了引入更多跨层连接的结构的方法。在模型的前向计算过程中,假设编码器总层数为$L$,当完成编码器$L$层的逐层计算后,通过线性平均、加权平均等机制对模型的中间层表示进行融合,得到蕴含所有层信息的表示\mathbi{g},作为编码-解码注意力机制的输入,与总共有$M$层的解码器共同处理解码信息。
%----------------------------------------------
\begin{figure}[htp]
......@@ -500,7 +500,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\label{eq:15-32}
\end{eqnarray}
\noindent 其中,$[\cdot]$表示级联操作。这种方式比权重平均具有更强的拟合能力。
\noindent 其中,$[\cdot]$表示级联操作。这种方式具有比权重平均更强的拟合能力。
\vspace{0.5em}
\item 基于多跳的自注意力机制。如图\ref{fig:15-11}所示,其做法与前馈神经网络类似,首先将不同层的表示拼接成2维的句子级矩阵表示\upcite{DBLP:journals/corr/LinFSYXZB17}。之后利用类似于前馈神经网络的思想将维度为$\mathbb{R}^{d_{\textrm{model}} \times L}$的矩阵映射到维度为$\mathbb{R}^{d_{\textrm{model}} \times n_{\rm hop}}$的矩阵,如下:
\begin{eqnarray}
......@@ -538,7 +538,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\end{figure}
%-------------------------------------------
\parinterval 上述工作更多应用于浅层的Transformer模型,这种仅在编码端顶部使用融合机制的方法并没有在深层Transformer模型上得到有效地验证。主要原因是融合机制仅作用于编码器或解码器的顶层,对中间层的信息传递效率并没有显著提升。因此当网络深度较深时,信息传递仍然并不高效。但这种“静态”的融合方式也为深层Transformer模型的研究奠定了基础。例如,可以使用透明注意力网络\upcite{Bapna2018TrainingDN},即在权重平均的基础上,引入了一个权重矩阵。其核心思想是,让解码器中每一层的编码-解码注意力模块都接收不同比例的编码信息,而不是使用相同的融合表示。
\parinterval 上述工作更多应用于浅层的Transformer模型,这种仅在编码器顶部使用融合机制的方法并没有在深层Transformer模型上得到有效的验证。主要原因是融合机制仅作用于编码器或解码器的顶层,对中间层的信息传递效率并没有显著提升。因此当网络深度较深时,这种方法的信息传递仍然不够高效。但这种“静态”的融合方式也为深层Transformer模型的研究奠定了基础。例如,可以使用透明注意力网络\upcite{Bapna2018TrainingDN},即在权重平均的基础上,引入了一个权重矩阵。其核心思想是,让解码器中每一层的编码-解码注意力模块都接收不同比例的编码信息,而不是使用相同的融合表示。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
......@@ -556,7 +556,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\label{eq:15-37}
\end{eqnarray}
\noindent 这里,$\mathbi{h}^0$表示词嵌入层的输出,$\mathbi{h}^l$$l>0$))表示Transformer模型第$l$层的表示。
\noindent 这里,$\mathbi{h}^0${\red(h0到底要不要改一下,上下文也是)}表示词嵌入层的输出,$\mathbi{h}^l$$l>0$))代表Transformer模型第$l$层的{\red(隐藏层?)}表示。
\vspace{0.5em}
\item 定义一个维度为$(L+1)\times (L+1)$的权值矩阵$\mathbi{W}$,矩阵中每一行表示之前各层对当前层的贡献度。令$\mathbi{W}_{l,i}$代表权值矩阵$\mathbi{W}$$l$行第$i$列的权重,则第$0 \sim l$ 层的聚合结果为$\mathbi{h}_i$的线性加权和:
......@@ -565,7 +565,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\label{eq:15-38}
\end{eqnarray}
\noindent $\mathbi{g}^l$会作为输入的一部分送入第$l+1$层。其网络的结构如图\ref{fig:15-13}所示
\noindent $\mathbi{g}^l$会作为输入的一部分送入第$l+1$层。其网络的结构如图\ref{fig:15-13}所示
\vspace{0.5em}
\end{itemize}
......@@ -573,16 +573,16 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-dynamic-linear-aggregation-network-structure}
\caption{线性层聚合网络}
\caption{线性层聚合网络{\red (X为词嵌入,没有LN,上面还用的h0)}}
\label{fig:15-13}
\end{figure}
%-------------------------------------------
\parinterval 根据上述描述可以发现,权值矩阵$\mathbi{W}$每个位置的值由先前层对应的位置的值计算得到,因此该矩阵是一个下三角矩阵。开始时,对矩阵参数的每行进行平均初始化,即初始化矩阵$\mathbi{W}_0$的每一行各个位置的值为$\frac{1}{\lambda}$$\lambda \in (1,2,\ldots,l+1)$。伴随着神经网络的训练,不断更新$\mathbi{W}$中每一行不同位置权重的大小。
\parinterval 根据上述描述可以发现,权值矩阵$\mathbi{W}$每个位置的值由先前层对应的位置的值计算得到,因此该矩阵是一个下三角矩阵。开始时,对{\red(权值?)}矩阵的每行进行平均初始化,即初始化矩阵$\mathbi{W}_0$的每一行各个位置的值为$\frac{1}{\lambda}$$\lambda \in (1,2,\ldots,l+1)$。伴随着神经网络的训练,不断更新$\mathbi{W}$中每一行不同位置权重的大小。
\parinterval 动态线性层聚合的一个好处是,系统可以自动学习不同层对当前层的贡献度。在实验中也发现,离当前层更近的部分的贡献度(权重)会更大,如图\ref{fig:15-14}所示,其中在每一行中颜色越深代表对当前层的贡献度越大。
\parinterval 动态线性层聚合的一个好处是,系统可以自动学习不同层对当前层的贡献度。在实验中也发现,离当前层更近的部分的贡献度(权重)会更大,如图\ref{fig:15-14}所示,在每一行中颜色越深代表对当前层的贡献度越大。
\parinterval 除了动态层线性聚合方法,也可以利用更为复杂的胶囊网络\upcite{Dou2019DynamicLA}、树状层次结构\upcite{Dou2018ExploitingDR}、多尺度协同框架\upcite{DBLP:conf/acl/WeiYHZWL20}等作为层间的融合方式。然而,也有研究发现进一步增加模型编码的深度并不能取得更优的翻译性能。因此如何进一步突破神经网络深度的限制是值得关注的研究方向,类似的话题在图像处理领域也引起了广泛的讨论\upcite{DBLP:conf/nips/SrivastavaGS15,DBLP:conf/icml/BalduzziFLLMM17,DBLP:conf/icml/Allen-ZhuLS19,DBLP:conf/icml/DuLL0Z19}
\parinterval 除了动态层线性聚合方法,也可以利用更为复杂的胶囊网络\upcite{Dou2019DynamicLA}、树状层次结构\upcite{Dou2018ExploitingDR}、多尺度协同框架\upcite{DBLP:conf/acl/WeiYHZWL20}等作为层间的融合方式。然而,也有研究发现进一步增加模型编码的深度并不能取得更优的翻译性能。因此如何进一步突破神经网络深度的限制是值得关注的研究方向,类似的话题在图像处理领域也引起了广泛的讨论\upcite{DBLP:conf/nips/SrivastavaGS15,DBLP:conf/icml/BalduzziFLLMM17,DBLP:conf/icml/Allen-ZhuLS19,DBLP:conf/icml/DuLL0Z19}
%---------------------------------------------
\begin{figure}[htp]
......@@ -631,7 +631,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\label{eq:15-42}
\end{eqnarray}
\parinterval 通过观察公式\eqref{eq:15-42}可以发现,在前向传播的过程中,当$\textrm{Var}(\mathbi{W})=\frac{1}{n_i}$时,可以保证每层的输入和输出的方差一致。因此通过相关计算可以得知,为了保证模型中每一层的输入和输出的方差一致,在正向传播时应有$\textrm{Var}(\mathbi{W})=\frac{1}{n_i}$,反向传播时应有$\textrm{Var}(\mathbi{W})=\frac{1}{n_o}$,通过对两种情况取平均值,控制参数$\mathbi{W}$的方差为$\frac{2}{n_i+n_o}$,则可以维持在前向与反向过程中输入与输出方差的一致性。若将参数初始化为一个服从边界为$[-a,b]$的均匀分布,那么其方差为$\frac{{(b+a)}^2}{12}$,为了达到$\mathbi{W}$的取值要求,初始化时应有$a=b=\sqrt{\frac{6}{n_i+n_o}}$
\parinterval 通过观察公式\eqref{eq:15-42}可以发现,在前向传播的过程中,当$\textrm{Var}(\mathbi{W})=\frac{1}{n_i}$时,可以保证每层的输入和输出的方差一致。类似的,通过相关计算可以得知,为了保证模型中每一层的输入和输出的方差一致,反向传播时应有$\textrm{Var}(\mathbi{W})=\frac{1}{n_o}$,通过对两种情况取平均值,控制参数$\mathbi{W}$的方差为$\frac{2}{n_i+n_o}$,则可以维持在前向与反向过程中输入与输出方差的一致性。若将参数初始化为一个服从边界为$[-a,b]$的均匀分布,那么其方差为$\frac{{(b+a)}^2}{12}$,为了达到$\mathbi{W}$的取值要求,初始化时应有$a=b=\sqrt{\frac{6}{n_i+n_o}}$
\parinterval 但是随着神经网络层数的增加,上述初始化方法已经不能很好地约束基于Post-Norm的Transformer模型的输出方差。当神经网络堆叠很多层时,模型顶层输出的方差较大,同时反向传播时顶层的梯度范数也要大于底层。因此,一个自然的想法是根据网络的深度对不同层的参数矩阵采取不同的初始化方式,进而强化对各层输出方差的约束,可以描述为:
\begin{eqnarray}
......@@ -639,7 +639,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\label{eq:15-43}
\end{eqnarray}
\noindent 其中,$l$为对应的神经网络的层数,$\alpha$为预先设定的超参数来控制缩放的比例。这样,可以通过缩减顶层神经网络输出与输入之间的差异,减少顶层神经网络参数的梯度范数,从而缓解由于神经网络过深所带来的梯度消失问题
\noindent 其中,$l$为对应的神经网络的深度,$\alpha$为预先设定的超参数来控制缩放的比例。这样,可以通过缩减顶层神经网络输出与输入之间的差异,{\red 减少顶层神经网络参数的梯度范数,从而缓解由于神经网络过深所带来的梯度消失问题(有问题?)}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
......@@ -682,7 +682,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsubsection{3. T-Fixup初始化策略}
\parinterval 另外一种初始化方法是从神经网络结构与优化器的计算方式入手。Post-Norm结构在Warmup阶段难以精确地估计参数的二阶动量,这导致了训练不稳定问题\upcite{huang2020improving}。也就是,层标准化是导致深层Transformer难以优化的主要原因之一\upcite{WangLearning}。Post-Norm方式下Transformer的底层网络,尤其是编码器的词嵌入层面临严重的梯度消失问题。该问题的原因在于,在不改变层标准化位置的条件下,Adam优化器利用滑动平均的方式来估计参数的二阶矩,其方差是无界的。在训练阶段的前期,由于模型只能看到有限数量样本,因此很难有效的估计参数的二阶矩,导致反向更新参数时参数的梯度方差过大。
\parinterval 另外一种初始化方法是从神经网络结构与优化器的计算方式入手。Post-Norm结构在Warmup阶段难以精确地估计参数的二阶动量,这导致了训练不稳定问题\upcite{huang2020improving}。也就是,层标准化是导致深层Transformer难以优化的主要原因之一\upcite{WangLearning}。Post-Norm方式下Transformer的底层网络,尤其是编码器的词嵌入层面临严重的梯度消失问题。出现该问题的原因在于,在不改变层标准化位置的条件下,Adam优化器利用滑动平均的方式来估计参数的二阶矩,其方差是无界的。在训练阶段的前期,由于模型只能看到有限数量样本,因此很难有效地估计参数的二阶矩,导致反向更新参数时参数的梯度方差过大。
\parinterval 除了用Pre-Norm代替Post-Norm结构来训练深层网络,也可以采用去除Warmup策略并移除层标准化机制的方式,并对神经网络中不同的参数矩阵制定相应的缩放机制来保证训练的稳定性\upcite{huang2020improving}。具体的缩放策略如下:
......@@ -690,9 +690,9 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\vspace{0.5em}
\item 类似于标准的Transformer初始化方式,使用Xavier初始化方式来初始化除了词嵌入以外的所有参数矩阵。词嵌入矩阵服从$\mathbb{N}(0,d^{-\frac{1}{2}})$的高斯分布,其中$d$代表词嵌入的维度。
\vspace{0.5em}
\item 对编码器中自注意力机制的参数矩阵以及前馈神经网络中所有参数矩阵进行缩放因子为$0.67 {L}^{-\frac{1}{4}}$的缩放,$M$ 为编码器层数。
\item 对编码器中自注意力机制的参数矩阵以及前馈神经网络中所有参数矩阵进行缩放因子为$0.67 {L}^{-\frac{1}{4}}$的缩放,$L$为编码器层数。
\vspace{0.5em}
\item 对解码器中全部注意力机制的参数矩阵以及前馈神经网络中所有参数矩阵进行缩放因子为$(9 {M})^{-\frac{1}{4}}$的缩放,其中$L$为解码器层数。
\item 对解码器中全部注意力机制的参数矩阵以及前馈神经网络中所有参数矩阵进行缩放因子为$(9 {M})^{-\frac{1}{4}}$的缩放,其中$M$为解码器层数。
\vspace{0.5em}
\end{itemize}
......@@ -704,7 +704,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsubsection{4. ADMIN初始化策略}
\parinterval 也有研究发现Post-Norm结构在训练过程中过度依赖残差支路,在训练初期很容易发生参数梯度方差过大的现象\upcite{DBLP:conf/emnlp/LiuLGCH20}。经过分析发现,虽然底层神经网络发生梯度消失是导致训练不稳定的重要因素,但并不是唯一因素。例如,标准Transformer模型中梯度消失的原因在于使用Post-Norm 结构的解码器。尽管通过调整模型结构解决了梯度消失问题,但是模型训练不稳定的问题仍然没有被很好地解决。研究人员观测到Post-Norm结构在训练过程中过于依赖残差支路,而Pre-Norm结构在训练过程中逐渐呈现出对残差支路的依赖性,这更易于网络的训练。进一步,从参数更新的角度出发,Pre-Norm由于参数的改变导致网络输出变化的方差经推导后可以表示为$O(\log L)$,而Post-Norm对应的方差为$O(L)$。因此,可以尝试减小Post-Norm中由于参数更新导致的输出的方差值,从而达到稳定训练的目的。针对该问题,可以采用两阶段的初始化方法。这里,可以重新定义子层之间的残差连接如下:
\parinterval 也有研究发现Post-Norm结构在训练过程中过度依赖残差支路,在训练初期很容易发生参数梯度方差过大的现象\upcite{DBLP:conf/emnlp/LiuLGCH20}。经过分析发现,虽然底层神经网络发生梯度消失是导致训练不稳定的重要因素,但并不是唯一因素。例如,标准Transformer模型中梯度消失的原因在于使用Post-Norm 结构的解码器{\red (只与解码器有关?)}。尽管通过调整模型结构解决了梯度消失问题,但是模型训练不稳定的问题仍然没有被很好地解决。研究人员观测到Post-Norm结构在训练过程中过于依赖残差支路,而Pre-Norm结构在训练过程中逐渐呈现出对残差支路的依赖性,这更易于网络的训练。进一步,从参数更新的角度出发,Pre-Norm由于参数的改变导致网络输出变化的方差经推导后可以表示为$O(\log L)$,而Post-Norm对应的方差为$O(L)$。因此,可以尝试减小Post-Norm中由于参数更新导致的输出的方差值,从而达到稳定训练的目的。针对该问题,可以采用两阶段的初始化方法。这里,可以重新定义子层之间的残差连接如下:
\begin{eqnarray}
\mathbi{x}_{l+1} &=& \mathbi{x}_l \cdot {\bm \omega_{l+1}} + F_{l+1}(\mathbi{x}_l)
\label{eq:15-47}
......@@ -723,7 +723,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\end{eqnarray}
\end{itemize}
\parinterval 这种动态的参数初始化方法不受限于具体的模型结构,方法有较好的通用性。
\parinterval 这种动态的参数初始化方法不受限于具体的模型结构,有较好的通用性。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -731,7 +731,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsection{深层模型的训练加速}
\parinterval 尽管窄而深的神经网络比宽网络有更快的收敛速度\upcite{WangLearning},但伴随着训练数据的增加,以及模型进一步的加深,训练代价成为不可忽视的问题。例如,在几千万甚至上亿的双语平行句对上训练一个48层的Transformer模型需要几周的时间才能达到收敛\footnote[5]{训练时间的估算是在单台8卡Titan V GPU服务器上得到的}。因此,在保证模型性能不变的前提下,高效地完成深层模型的训练也是至关重要的。
\parinterval 尽管窄而深的神经网络比宽网络有更快的收敛速度\upcite{WangLearning},但伴随着训练数据的增加,以及模型进一步的加深,训练代价成为不可忽视的问题。例如,在几千万甚至上亿的双语平行句对上训练一个48层的Transformer模型需要几周的时间才能达到收敛\footnote[5]{训练时间的估算是在单台8卡Titan V GPU服务器上得到的}。因此,在保证模型性能不变的前提下,高效地完成深层模型的训练也是至关重要的{\red (概括性不足,三种方法是并列还是依赖?)}
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
......@@ -760,7 +760,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsubsection{2. 分组稠密连接}
\parinterval 很多研究工作已经发现深层模型不同层之间的稠密连接能够很明显地提高信息传递的效率\upcite{WangLearning,DBLP:conf/cvpr/HuangLMW17,Dou2018ExploitingDR,DBLP:conf/acl/WuWXTGQLL19}。与此同时,对之前层信息的不断复用有助于得到更好的表示,但也带来了计算代价过大的问题。在动态线性层聚合方法(DLCL)中,每一次聚合时都需要重新计算之前每一层表示对当前层输入的贡献度,因此伴随着编码器整体深度的增加,这部分的计算代价变得不可忽略。例如,一个基于动态层聚合的48层Transformer模型比不使用动态层聚合进行训练慢近2倍。同时,缓存中间结果也增加了显存的使用量。比如,即使在使用半精度计算的情况下,每张12G显存的GPU上计算的词也不能超过2048个,这导致训练开销急剧增大。
\parinterval 很多研究工作已经发现深层模型不同层之间的稠密连接能够很明显地提高信息传递的效率\upcite{WangLearning,DBLP:conf/cvpr/HuangLMW17,Dou2018ExploitingDR,DBLP:conf/acl/WuWXTGQLL19}。与此同时,对之前层信息的不断复用有助于得到更好的表示,但也带来了计算代价过大的问题。在动态线性层聚合方法(DLCL)中,每一次聚合时都需要重新计算之前每一层表示对当前层输入的贡献度,因此伴随着编码器整体深度的增加,这部分的计算代价变得不可忽略。例如,一个基于动态层聚合的48层Transformer模型比不使用动态层聚合的模型在进行训练时慢近2倍。同时,缓存中间结果也增加了显存的使用量。比如,即使在使用半精度计算的情况下,每张12G显存的GPU上计算的词也不能超过2048个,这导致训练开销急剧增大。
\parinterval 缓解这个问题的一种方法是使用更稀疏的层间连接方式。其核心思想与动态线性层聚合是类似的,不同点在于可以通过调整层之间连接的稠密程度来降低训练代价。比如,可以将每$p$层分为一组,之后动态线性层聚合只在不同组之间进行。这样,通过调节$p$值的大小可以控制神经网络中连接的稠密程度,作为一种训练代价与翻译性能之间的权衡。显然,标准的Transformer模型\upcite{vaswani2017attention} 和DLCL模型\upcite{WangLearning}都可以看作是该方法的一种特例。如图\ref{fig:15-16}所示:当$p=1$时,每一个单独的块被看作一个独立的组,它等价于基于动态层聚合的DLCL模型;当$p=\infty$时,它等价于正常的Transformer模型。值得注意的是,如果配合渐进式训练。在分组稠密连接中可以设置$p$等于模型层数。
......@@ -812,7 +812,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\vspace{0.5em}
\end{itemize}
\parinterval 综合使用渐进式训练、分组稠密连接、学习率重置策略可以在保证在翻译品质不变的前提下,缩减近$40\%$的训练时间\upcite{li2020shallow}。同时,加速比伴随着模型的加深与数据集的增大也会进一步地扩大。
\parinterval 综合使用渐进式训练、分组稠密连接、学习率重置策略可以保证在翻译品质不变的前提下,缩减近$40\%$的训练时间\upcite{li2020shallow}。同时,伴随着模型的加深与数据集的增大加速比也会进一步地增大。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -926,7 +926,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-encoder-tree-structure-modeling}
\caption{编码树结构建模}
\caption{编码树结构建模}
\label{fig:15-20}
\end{figure}
%-------------------------------------------s
......@@ -943,7 +943,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\parinterval 在标准的英语到日语的翻译中,英语短语“a cup of green tea”只会被翻译为“緑茶”一词。在加入句法树后,“a cup of green tea”会作为树中一个节点,这样可以更容易把英语短语作为一个整体进行翻译。
\parinterval 只是,这种自底向上的树结构表示方法也存在问题:每个树节点的状态并不能包含树中其它位置的信息。也就是说,从每个节点上看,其表示结果没有很好地利用句法树中的上下文信息。因此,可以同时使用自下而上和自上而下的信息传递方式进行句法树的表示\upcite{Yang2017TowardsBH,DBLP:conf/acl/ChenHCC17},这样增加了树中每个节点对其覆盖的子树以及周围上下文的建模能力。如图\ref{fig:15-21} 所示,$\mathbi{h}^\textrm{up}$$\mathbi{h}^\textrm{down}$分别代表向上传输节点和向下传输节点的状态,虚线框代表了$\mathbi{h}^\textrm{up}$$\mathbi{h}^\textrm{down}$会拼接到一起,并作为这个节点的整体表示参与注意力模型的计算。显然,自下而上的传递,可以保证句子的浅层信息(如短距离词汇搭配)被传递给上层节点,而自上而下的传递,可以保证句子上层结构的抽象被有效地传递给下层节点。这样,每个节点就同时含有浅层和深层句子表示的信息。
\parinterval 只是,这种自底向上的树结构表示方法也存在问题:每个树节点的状态并不能包含树中其它位置的信息。也就是说,从每个节点上看,其表示结果没有很好地利用句法树中的上下文信息。因此,可以同时使用自下而上和自上而下的信息传递方式进行句法树的表示\upcite{Yang2017TowardsBH,DBLP:conf/acl/ChenHCC17},这样增加了树中每个节点对其覆盖的子树以及周围上下文的建模能力。如图\ref{fig:15-21} 所示,$\mathbi{h}^\textrm{up}$$\mathbi{h}^\textrm{down}$分别代表向上传输节点和向下传输节点的状态{\red (向上传输没看出来)},虚线框代表了$\mathbi{h}^\textrm{up}$$\mathbi{h}^\textrm{down}$会拼接到一起,并作为这个节点的整体表示参与注意力模型的计算。显然,自下而上的传递,可以保证句子的浅层信息(如短距离词汇搭配)被传递给上层节点,而自上而下的传递,可以保证句子上层结构的抽象被有效地传递给下层节点。这样,每个节点就同时含有浅层和深层句子表示的信息。
%----------------------------------------------
\begin{figure}[htp]
......@@ -1009,7 +1009,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\vspace{0.5em}
\end{itemize}
\parinterval 需要注意的是,句法分析的错误会在很大程度上影响源语言句子的表示结果。如果获得的句法分析结果不够准确,可能会对翻译系统带来负面的作用。此外,也有研究发现基于词串的神经机器翻译模型本身就能学习到一些源语言的句法信息\upcite{DBLP:conf/emnlp/ShiPK16},这表明了神经机器翻译模型也有一定的归纳句子结构的能力。除了循环神经网络结构,也有研究人员探索了如何在Transformer中引入树结构信息。比如,可以将词与词之间的依存关系距离作为额外的语法信息融入到注意力模型中\upcite{DBLP:conf/acl/BugliarelloO20}
\parinterval 需要注意的是,句法分析的错误会在很大程度上影响源语言句子的表示结果。如果获得的句法分析结果不够准确,可能会对翻译系统带来负面的影响。此外,也有研究发现基于词串的神经机器翻译模型本身就能学习到一些源语言的句法信息\upcite{DBLP:conf/emnlp/ShiPK16},这表明了神经机器翻译模型也有一定的归纳句子结构的能力。除了循环神经网络结构,也有研究人员探索了如何在Transformer中引入树结构信息。比如,可以将词与词之间的依存关系距离作为额外的语法信息融入到注意力模型中\upcite{DBLP:conf/acl/BugliarelloO20}
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -1032,7 +1032,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\parinterval 另一种方法是直接在目标语言端使用句法树进行建模。与源语言句法树的建模不同,目标语言句法树的生成伴随着译文的生成,因此无法像源语言端一样将整个句法树一起处理。这样译文生成问题本质上就变成了目标语言树结构的生成,从这个角度说,这个过程与统计机器翻译中串到树的模型是类似的(见{\chaptereight})。树结构的生成有很多种策略,但基本的思想类似,可以根据已经生成的局部结构预测新的局部结构,并将这些局部结构拼装成更大的结构,直到得到完整的句法树结构\upcite{DBLP:conf/iclr/Alvarez-MelisJ17}
\parinterval 实现目标语言句法树生成的一种手段是将形式文法扩展,以适应分布式表示学习框架。这样,可以使用形式文法描述句法树的生成过程(见{\chapterthree}),同时利用分布式表示来进行建模和学习。比如,可以使用基于循环神经网络的文法描述方法,把句法分析过程看作是一个循环神经网络的执行过程\upcite{DBLP:conf/naacl/DyerKBS16}。此外,也可以从{\small\sffamily\bfnew{多任务学习}}\index{多任务学习}(Multitask Learning)\index{Multitask Learning}学习出发,用多个解码端共同完成目标语言句子的生成\upcite{DBLP:journals/corr/LuongLSVK15}。图\ref{fig:15-25}展示了由一个编码器(汉语)和多个解码器组成的序列生成模型。其中不同解码器分别负责不同的任务:第一个用于预测翻译结果,即翻译任务;第二个用于句法分析任务;第三个用于语言理解任务,生成汉语上下文。其设计思想是各个任务之间能够相互辅助,使得编码器的表示能包含更多的信息,进而让多个任务都获得性能提升。这种方法也可以使用在多个编码器上,其思想是类似的。
\parinterval 实现目标语言句法树生成的一种手段是将形式文法扩展,以适应分布式表示学习框架。这样,可以使用形式文法描述句法树的生成过程(见{\chapterthree}),同时利用分布式表示来进行建模和学习。比如,可以使用基于循环神经网络的文法描述方法,把句法分析过程看作是一个循环神经网络的执行过程\upcite{DBLP:conf/naacl/DyerKBS16}。此外,也可以从{\small\sffamily\bfnew{多任务学习}}\index{多任务学习}(Multitask Learning)\index{Multitask Learning}出发,用多个解码器共同完成目标语言句子的生成\upcite{DBLP:journals/corr/LuongLSVK15}。图\ref{fig:15-25}展示了由一个编码器(汉语)和多个解码器组成的序列生成模型。其中不同解码器分别负责不同的任务:第一个用于预测翻译结果,即翻译任务;第二个用于句法分析任务;第三个用于语言理解任务,生成汉语上下文。其设计思想是各个任务之间能够相互辅助,使得编码器的表示能包含更多的信息,进而让多个任务都获得性能提升。这种方法也可以使用在多个编码器上,其思想是类似的。
%----------------------------------------------
\begin{figure}[htp]
......@@ -1093,7 +1093,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\end{figure}
%-------------------------------------------
\parinterval 早在上世纪八十年代,研究人员就开始使用进化算法对神经网络结构进行设计\upcite{DBLP:conf/icga/MillerTH89},也引发了之后的很多探索\upcite{koza1991genetic,DBLP:conf/nips/HarpSG89,DBLP:journals/compsys/Kitano90}。近些年,随着深度学习技术的发展,网络结构搜索技术在很多任务中受到关注。例如,网络结构搜索就很好应用在语言建模上,并取得了很好的结果\upcite{DBLP:conf/iclr/LiuSY19,DBLP:conf/acl/LiHZXJXZLL20,DBLP:conf/emnlp/JiangHXZZ19}。下面将对网络结构搜索的基本方法和其在机器翻译中的应用进行介绍。
\parinterval 早在上世纪八十年代,研究人员就开始使用进化算法对神经网络结构进行设计\upcite{DBLP:conf/icga/MillerTH89},也引发了之后的很多探索\upcite{koza1991genetic,DBLP:conf/nips/HarpSG89,DBLP:journals/compsys/Kitano90}。近些年,随着深度学习技术的发展,网络结构搜索技术在很多任务中受到关注。例如,网络结构搜索就很好应用在语言建模上,并取得了很好的结果\upcite{DBLP:conf/iclr/LiuSY19,DBLP:conf/acl/LiHZXJXZLL20,DBLP:conf/emnlp/JiangHXZZ19}。下面将对网络结构搜索的基本方法和其在机器翻译中的应用进行介绍。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
......@@ -1125,7 +1125,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\subsubsection{1. 搜索空间}
\parinterval 对搜索空间建模是结构搜索任务中的基础部分。如图\ref{fig:15-30}所示,结构空间中包含着所有潜在的模型结构。图\ref{fig:15-30}以结构之间的相似性为衡量指标对模型结构在搜索空间中的相对位置进行了刻画,同时颜色的深浅表示了该结构在指定任务下的性能情况。可以看到对于特定任务来说,性能较好的模型结构往往会聚集在一起。因此,在研究人员设计搜索空间的时候,为了增加找到最优结构的可能性,往往会根据经验或者实验将易产出高性能模型结构的区域设定为搜索空间。以自然语言处理任务为例,最初的网络结构搜索工作主要对基于循环神经网络构成的搜索空间进行探索\upcite{DBLP:conf/iclr/ZophL17,DBLP:conf/icml/PhamGZLD18,DBLP:conf/iclr/LiuSY19},而近些年,在Transformer模型的基础上进行结构搜索也引起了研究人员的广泛关注\upcite{DBLP:conf/icml/SoLL19,DBLP:conf/ijcai/ChenLQWLDDHLZ20,DBLP:conf/acl/WangWLCZGH20}
\parinterval 对搜索空间建模是结构搜索任务中的基础部分。如图\ref{fig:15-30}所示,结构空间中包含着所有潜在的模型结构。图\ref{fig:15-30}以结构之间的相似性为衡量指标对模型结构在搜索空间中的相对位置进行了刻画,同时颜色的深浅表示了该结构在指定任务下的性能情况{\red (图中的注释太小了,看不清)}。可以看到对于特定任务来说,性能较好的模型结构往往会聚集在一起。因此,在研究人员设计搜索空间的时候,为了增加找到最优结构的可能性,往往会根据经验或者实验将易产出高性能模型结构的区域设定为搜索空间。以自然语言处理任务为例,最初的网络结构搜索工作主要对基于循环神经网络构成的搜索空间进行探索\upcite{DBLP:conf/iclr/ZophL17,DBLP:conf/icml/PhamGZLD18,DBLP:conf/iclr/LiuSY19},而近些年,在Transformer模型的基础上进行结构搜索也引起了研究人员的广泛关注\upcite{DBLP:conf/icml/SoLL19,DBLP:conf/ijcai/ChenLQWLDDHLZ20,DBLP:conf/acl/WangWLCZGH20}
%----------------------------------------------
\begin{figure}[htp]
......@@ -1164,13 +1164,13 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-structure-search-based-on-reinforcement-learning}
\caption{基于强化学习的结构搜索}
\caption{基于强化学习的结构搜索{\red (图不好懂)}}
\label{fig:15-33}
\end{figure}
%-------------------------------------------
\vspace{0.5em}
\item {\small\bfnew{基于梯度的方法}}。这种方法的思想是在连续空间中对模型结构进行表示\upcite{DBLP:conf/iclr/LiuSY19},通常将模型结构建模为超网络中的权重,使用基于梯度的优化方法对权重进行优化,最终达到归纳结构的目的,如图\ref{fig:15-34}所示。基于梯度的方法十分高效,因此也受到了很多关注\upcite{DBLP:conf/cvpr/WuDZWSWTVJK19,DBLP:conf/iclr/XuX0CQ0X20,DBLP:conf/acl/LiHZXJXZLL20}
\item {\small\bfnew{基于梯度的方法}}。这种方法的思想是在连续空间中对模型结构进行表示\upcite{DBLP:conf/iclr/LiuSY19},通常将模型结构建模为超网络中的权重,使用基于梯度的优化方法对权重进行优化,最终达到归纳结构的目的,如图\ref{fig:15-34}所示{\red (图没描述)}。基于梯度的方法十分高效,因此也受到了很多关注\upcite{DBLP:conf/cvpr/WuDZWSWTVJK19,DBLP:conf/iclr/XuX0CQ0X20,DBLP:conf/acl/LiHZXJXZLL20}
\vspace{0.5em}
%----------------------------------------------
......@@ -1196,7 +1196,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\vspace{0.5em}
\item {\small\bfnew{数据以及超参数的调整}}。具体来说,可以用少量的数据训练模型,以便快速评估其性能\upcite{DBLP:conf/aistats/KleinFBHH17,DBLP:journals/corr/ChrabaszczLH17}。在超参数的调整方面,也可以通过减少模型训练轮数、减少模型的层数等方式来简化模型参数,达到加速训练、评估的目的\upcite{DBLP:conf/cvpr/ZophVSL18,Real2019AgingEF,DBLP:journals/corr/abs-1807-06906}
\vspace{0.5em}
\item {\small\bfnew{现有参数的继承及复用}}。通过在现有的模型参数基础上,继续优化中间过程产生的模型结构,来加快待评价模型的收敛进程\upcite{DBLP:conf/icml/RealMSSSTLK17,DBLP:conf/iclr/ElskenMH19,DBLP:conf/aaai/CaiCZYW18}。这种方式无需从头训练搜索过程中间过程产生的模型结构,通过“热启动”的方式对模型参数进行优化,能够大幅减少性能评估过程的时间消耗。
\item {\small\bfnew{现有参数的继承及复用}}。通过在现有的模型参数基础上,继续优化中间过程产生的模型结构,来加快待评价模型的收敛进程\upcite{DBLP:conf/icml/RealMSSSTLK17,DBLP:conf/iclr/ElskenMH19,DBLP:conf/aaai/CaiCZYW18}。这种方式无需从头训练搜索过程{\red 中间过程}产生的模型结构,通过“热启动”的方式对模型参数进行优化,能够大幅减少性能评估过程的时间消耗。
\vspace{0.5em}
\item {\small\bfnew{模型性能的预测}}。这种方式使用训练过程中的性能变化曲线来预估模型是否具有潜力,从而快速终止低性能模型的训练过程\upcite{DBLP:conf/ijcai/DomhanSH15,DBLP:conf/iclr/KleinFSH17,DBLP:conf/iclr/BakerGRN18}
\vspace{0.5em}
......@@ -1241,7 +1241,7 @@ f(x) &=& x \cdot \delta(\beta x) \\
\subsubsection{2. 模型效率优化}
\parinterval 网络结构搜索除了能够提高机器翻译模型性能之外,也能够优化模型的执行效率。从实用的角度出发,可以在进行结构搜索的同时考虑设备的计算能力,希望找到更适合运行设备的模型结构。同时,网络结构搜索也可以用来对大模型进行压缩,加速其在推断过程中的效率,这方面的工作不仅限于在机器翻译模型上,也有部分工作对基于注意力机制的预训练模型进行压缩。
\parinterval 网络结构搜索除了能够提高机器翻译模型性能之外,也能够优化模型的执行效率。从实用的角度出发,可以在进行结构搜索的同时考虑设备的计算能力,希望找到更适合运行设备的模型结构。同时,网络结构搜索也可以用来对大模型进行压缩,增加其在推断过程中的效率,这方面的工作不仅限于在机器翻译模型上,也有部分工作对基于注意力机制的预训练模型进行压缩。
\begin{itemize}
\vspace{0.5em}
......@@ -1253,7 +1253,7 @@ f(x) &=& x \cdot \delta(\beta x) \\
\parinterval 虽然由于算力等条件的限制,目前很多网络结构搜索方法并没有直接在机器翻译任务中进行实验,但是这些方法并没有被限制在特定任务上。例如,可微分结构搜索方法被成功地用于学习更好的循环单元结构,这类方法完全可以应用在机器翻译任务上。
\parinterval 此外,受到预训练模型的启发,网络结构预搜索可能是一个极具潜力的方向。例如,有研究人员在大规模语言模型上的进行网络结构搜索\upcite{DBLP:conf/acl/LiHZXJXZLL20},然后将搜索到的模型结构应用于更多的自然语言处理任务中,这种方式有效提升了模型结构的可复用性。同时,相较于使用特定任务下受限的数据,从大规模单语数据中可以更充分的学习语言的规律,进而更好地指导模型结构的设计。此外,对于机器翻译任务而言,结构的预搜索同样是一个值得关注的研究方向。
\parinterval 此外,受到预训练模型的启发,网络结构预搜索可能是一个极具潜力的方向。例如,有研究人员在大规模语言模型上进行网络结构搜索\upcite{DBLP:conf/acl/LiHZXJXZLL20},然后将搜索到的模型结构应用于更多的自然语言处理任务中,这种方式有效提升了模型结构的可复用性。同时,相较于使用特定任务下受限的数据,从大规模单语数据中可以更充分地学习语言的规律,进而更好地指导模型结构的设计。此外,对于机器翻译任务而言,结构的预搜索同样是一个值得关注的研究方向。
%----------------------------------------------------------------------------------------
% NEW SECTION
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论