%-------------------------------------------------------------------------------- \begin{tikzpicture} %\newlength{\base} \setlength{\base}{0.9cm} \tikzstyle{rnnnode} = [rounded corners=1pt,minimum size=0.5\base,draw,inner sep=0pt,outer sep=0pt] \tikzstyle{wordnode} = [font=\tiny] % RNN translation model \begin{scope}[local bounding box=RNNMT] % RNN Encoder \coordinate (eemb0) at (0,0); \foreach \x [count=\y from 0] in {1,2,...,10} \node[rnnnode,minimum height=0.5\base,fill=green!30!white,anchor=west] (eemb\x) at ([xshift=0.4\base]eemb\y.east) {}; \foreach \x in {1,2,...,10} \node[rnnnode,fill=blue!30!white,anchor=south] (backenc\x) at ([yshift=0.5\base]eemb\x.north) {}; \foreach \x in {1,2,...,10} \node[rnnnode,fill=blue!30!white,anchor=south] (enc\x) at ([yshift=0.5\base]backenc\x.north) {}; \node[wordnode,left=0.4\base of enc1] (init) {$0$}; \node[wordnode,right=0.4\base of backenc10] (backinit) {$0$}; \node [rnnnode,fill=purple!30!white] at (enc10) {}; \node [rnnnode,fill=purple!30!white] at (backenc1) {}; \node[wordnode,below=0pt of eemb1] () {你}; \node[wordnode,below=0pt of eemb2] () {知道}; \node[wordnode,below=0pt of eemb3] () {去}; \node[wordnode,below=0pt of eemb4] () {北京站}; \node[wordnode,below=0pt of eemb5] () {的}; \node[wordnode,below=0pt of eemb6] () {路}; \node[wordnode,below=0pt of eemb7] () {怎么}; \node[wordnode,below=0pt of eemb8] () {走}; \node[wordnode,below=0pt of eemb9] () {吗}; \node[wordnode,below=0pt of eemb10] () {$\langle$eos$\rangle$}; % RNN Decoder \foreach \x in {1,2,...,10} \node[rnnnode,minimum height=0.5\base,fill=green!30!white,anchor=south] (demb\x) at ([yshift=1.5\base]enc\x.north) {}; \foreach \x in {1,2,...,10} \node[rnnnode,fill=blue!30!white,anchor=south] (dec\x) at ([yshift=0.5\base]demb\x.north) {}; \foreach \x in {1,2,...,10} \node[rnnnode,minimum height=0.5\base,fill=red!30!white,anchor=south] (softmax\x) at ([yshift=0.5\base]dec\x.north) {}; % Decoder input words \node[wordnode,below=0pt of demb1] (decwordin) {$\langle$eos$\rangle$}; \ExtractX{$(demb2.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {Do}; \ExtractX{$(demb3.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {you}; \ExtractX{$(demb4.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {know}; \ExtractX{$(demb5.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {the}; \ExtractX{$(demb6.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {way}; \ExtractX{$(demb7.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {to}; \ExtractX{$(demb8.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {Beijing}; \ExtractX{$(demb9.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {Railway}; \ExtractX{$(demb10.south)$} \ExtractY{$(decwordin.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {Station}; % Decoder output words \node[wordnode,above=0pt of softmax1] (decwordout) {Do}; \ExtractX{$(softmax2.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {you}; \ExtractX{$(softmax3.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {know}; \ExtractX{$(softmax4.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {the}; \ExtractX{$(softmax5.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {way}; \ExtractX{$(softmax6.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {to}; \ExtractX{$(softmax7.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {Beijing}; \ExtractX{$(softmax8.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {Railway}; \ExtractX{$(softmax9.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {Station}; \ExtractX{$(softmax10.north)$} \ExtractY{$(decwordout.base)$} \node[wordnode,anchor=base] () at (\XCoord,\YCoord) {$\langle$eos$\rangle$}; % Connections \draw[-latex'] (init.east) to (enc1.west); \draw[-latex'] (backinit.west) to (backenc10.east); \foreach \x in {1,2,...,10} \draw[-latex'] (eemb\x) to (backenc\x); \foreach \x in {1,2,...,10} \draw[-latex'] (eemb\x.north) to [out=15,in=-15] (enc\x.south); \foreach \x in {1,2,...,10} \draw[-latex'] (demb\x) to (dec\x); \foreach \x in {1,2,...,10} \draw[-latex'] (dec\x.north) to ([yshift=0.5\base]dec\x.north); \foreach \x [count=\y from 2] in {1,2,...,9} { \draw[-latex'] (enc\x.east) to (enc\y.west); \draw[-latex'] (dec\x.east) to (dec\y.west); } \def\y{0} \foreach \x in {10,9,...,2} { \pgfmathtruncatemacro{\y}{\x - 1} \draw[-latex'] (backenc\x.west) to (backenc\y.east); } \coordinate (bridge) at ([yshift=-1.2\base]demb2); \draw[-latex'] (enc10.north) .. controls +(north:0.7\base) and +(east:1.5\base) .. (bridge) .. controls +(west:2.5\base) and +(west:0.6\base) .. (dec1.west); \draw[-latex'] (backenc1) to [out=180,in=180] (dec1.west); % Backward RNN \begin{pgfonlayer}{background} \node[draw=red,thick,densely dashed,inner sep=5pt] [fit = (backinit) (backenc1) (backenc10)] (backrnn) {}; \end{pgfonlayer} \node[font=\scriptsize,anchor=south] (backrnnlabel) at ([xshift=-0.5\base,yshift=\base]backrnn.north east) {反向RNN}; \draw[->,dashed] (backrnnlabel.south) to ([xshift=-0.5\base]backrnn.north east); \end{scope} \end{tikzpicture}