%%%------------------------------------------------------------------------------------------------------------ \begin{tcolorbox} [bicolor,sidebyside,width=13cm,righthand width=4cm,size=title,frame engine=empty, colback=blue!10!white,colbacklower=black!5!white] {\scriptsize \begin{tabbing} \texttt{XTensor x, y, gold, h[5], w[5], s[5];} \\ \texttt{XTensor dh[5], dw[5], ds[5];} \\ \texttt{...} // 前向过程 \\ \texttt{h[0] = x;} \\ \texttt{y = h[4];} \\ \texttt{} \\ \texttt{CrossEntropyBackward(dh[4], y, gold);} \\ \texttt{SoftmaxBackward(y, s[4], dh[4], ds[4]);}\\ \texttt{MMul(h[3], {\scriptsize X\_TRANS}, ds[4], {\scriptsize X\_NOTRANS}, dw[4]);}\\ \texttt{MMul(ds[4], {\scriptsize X\_NOTRANS}, w[4], {\scriptsize X\_RANS}, dh[3]);}\\ \texttt{} \\ \texttt{dh[2] = dh[3];}\\ \texttt{ReluBackward(h[2], s[2], dh[2], ds[2]);}\\ \texttt{MMul(h[1], {\scriptsize X\_TRANS}, ds[2], {\scriptsize X\_NOTRANS}, dw[2]);}\\ \texttt{MMul(ds[2], {\scriptsize X\_NOTRANS}, w[2], {\scriptsize X\_TRANS}, dh[2]);}\\ \texttt{} \\ \texttt{dh[1] = dh[1] + dh[3];}\\ \texttt{...} // 继续反向传播 \\ \texttt{} \\ \texttt{for(unsigned i = 0; i < 5; i++)\{} \\ \texttt{} \ \ \ \ ... // 通过{\texttt{dw[i]}}访问参数的梯度\\ \texttt{\}} \end{tabbing} } \tcblower \begin{center} \begin{tikzpicture} \node [anchor=south,draw,rounded corners,inner sep=2pt,minimum width=8em,minimum height=1.2em,fill=red!30!white,blur shadow={shadow xshift=1pt,shadow yshift=-1pt}] (h1) at (0,0) {\scriptsize{x (input)}}; \node [anchor=south,draw,rounded corners,inner sep=2pt,minimum width=8em,minimum height=1.2em,fill=green!30!white,blur shadow={shadow xshift=1pt,shadow yshift=-1pt}] (h2) at ([yshift=1.5em]h1.north) {\scriptsize{h1 = Relu(x * w1)}}; \node [anchor=south,draw,rounded corners,inner sep=2pt,minimum width=8em,minimum height=1.2em,fill=green!30!white,blur shadow={shadow xshift=1pt,shadow yshift=-1pt}] (h3) at ([yshift=1.5em]h2.north) {\scriptsize{h2 = Relu(h1 * w2)}}; \node [anchor=south,draw,rounded corners,inner sep=2pt,minimum width=8em,minimum height=1.2em,fill=green!30!white,blur shadow={shadow xshift=1pt,shadow yshift=-1pt}] (h4) at ([yshift=1.5em]h3.north) {\scriptsize{h3 = h2 + h1}}; {\draw [->,very thick] (h1.north) -- (h2.south);} {\draw [->,very thick] (h2.north) -- (h3.south);} {\draw [->,very thick] (h3.north) -- (h4.south);} {\draw [->,very thick,rounded corners] (h2.east) -- ([xshift=0.5em]h2.east) -- ([xshift=0.5em,yshift=0.5em]h3.north east) -- ([xshift=-2em,yshift=0.5em]h3.north east) -- ([xshift=-2em,yshift=1.5em]h3.north east);} \node [anchor=south,draw,rounded corners,inner sep=2pt,minimum width=8.0em,minimum height=1.2em,fill=red!30!white,blur shadow={shadow xshift=1pt,shadow yshift=-1pt}] (slayer) at ([yshift=1.5em]h4.north) {\tiny{h4 = Softmax(h3 * w4) (output)}}; \node [anchor=south] (losslabel) at (slayer.north) {\scriptsize{\textbf{Cross Entropy Loss}}}; {\draw [->,very thick] (h4.north) -- (slayer.south);} \end{tikzpicture} \end{center} \end{tcolorbox} %%%------------------------------------------------------------------------------------------------------------