Back propagation

Neural network with back propagation equation

Author

Emre Anakok

Published

October 24, 2024

\documentclass[border=3pt,tikz]{standalone}
\usepackage{amsmath} % for aligned
\usepackage{listofitems} % for \readlist to create arrays
\usetikzlibrary{arrows.meta} % for arrow size
\usepackage[outline]{contour} % glow around text
\contourlength{1.4pt}

% COLORS

\usepackage{contour} % glow around text
\contourlength{1.4pt}

\usepackage[dvipsnames]{xcolor}
\usepackage{pgfplots}
\definecolor{taupegray}{rgb}{0.55, 0.52, 0.54}
\usepackage{neuralnetwork}

\usepackage{tikz-network}
\usepackage{xcolor}
\colorlet{myred}{red!80!black}
\colorlet{myblue}{blue!80!black}
\colorlet{mygreen}{green!60!black}
\colorlet{myyellow}{yellow!60!white}
\colorlet{myorange}{orange!70!red!60!black}
\colorlet{mydarkred}{red!30!black}
\colorlet{mydarkblue}{blue!40!black}
\colorlet{mydarkgreen}{green!30!black}
\colorlet{mydarkyellow}{yellow!30!black}

\tikzset{
  >=latex, % for default LaTeX arrow head
  node/.style={thick,circle,draw=myblue,minimum size=22,inner sep=0.5,outer sep=0.6},
  node in/.style={node,green!20!black,draw=mygreen!30!black,fill=mygreen!25},
  node hidden/.style={node,blue!20!black,draw=myblue!30!black,fill=myblue!20},
  node convol/.style={node,orange!20!black,draw=myorange!30!black,fill=myorange!20},
  node out/.style={node,red!20!black,draw=myred!30!black,fill=myred!20},
  connect/.style={thick,mydarkblue}, %,line cap=round
  connect arrow/.style={-{Latex[length=4,width=3.5]},thick,mydarkblue,shorten <=0.5,shorten >=1},
  node 1/.style={node in}, % node styles, numbered for easy mapping with \nstyle
  node 2/.style={node hidden},
  node 3/.style={node out}
}
\def\nstyle{int(\lay<\Nnodlen?min(2,\lay):3)} % map layer number onto 1, 2, or 3

\begin{document}


\contourlength{2pt}
\begin{tikzpicture}[x=2.2cm,y=1.4cm]
  \message{^^JNeural network, shifted}
  \readlist\Nnod{4,5,5,5,3} % array of number of nodes per layer
  \readlist\Nstr{n,m_1,m_2,m_3,m} % array of string number of nodes per layer
  \readlist\Cstr{\strut x^{(0)},x^{(\prev)},x^{(\prev)},x^{(\prev)},y} % array of coefficient symbol per layer
  \def\yshift{0.5} % shift last node for dots
  
  \message{^^J  Layer}
  \foreachitem \N \in \Nnod{ % loop over layers
    \def\lay{\Ncnt} % alias of index of current layer
    \pgfmathsetmacro\prev{int(\Ncnt-1)} % number of previous layer
    \message{\lay,}
    \foreach \i [evaluate={\c=int(\i==\N); \y=\N/2-\i-\c*\yshift;
                 \index=(\i<\N?int(\i):"\Nstr[\lay]");
                 \x=1\lay; \n=\nstyle;}] in {1,...,\N}{ % loop over nodes
      % NODES
      %\ifnum \lay>1
      \node[node \n] (N\lay-\i) at (1.2*\x,\y) {$\frac{\partial \varepsilon}{\partial \Cstr[\lay]_{\index}}$};
      %\else
       % \node[node \n] (N\lay-\i) at (1.2*\x,\y) {$\Cstr[\lay]_{\index}$};
    %\fi
      
      % CONNECTIONS
      \ifnum\lay>1 % connect to previous layer
        \foreach \j in {1,...,\Nnod[\prev]}{ % loop over nodes in previous layer
          \draw[connect arrow,white,line width=1.2] (N\prev-\j) -- (N\lay-\i);
          \draw[connect arrow,myblue!20] (N\lay-\i)--(N\prev-\j);
          %\draw[connect] (N\prev-\j.0) -- (N\lay-\i.180); % connect to left
        }
      \fi % else: nothing to connect first layer
      
    }
    \path (N\lay-\N) --++ (0,1+\yshift) node[midway,scale=1.5] {$\vdots$};
  }

  \node[thick,circle,draw=mydarkyellow,fill=myyellow,minimum size=22,inner sep=0.5,outer sep=0.6](epsilon) at ($(N5-2) + (1,0)$) {$\varepsilon$};
    \foreach \j in {1,2,3}{ % loop over nodes in previous layer
          %\draw[connect arrow,white,line width=1.2] (N5-\j) -- (epsilon);
          
          }
    
    \foreach \j [evaluate={\index=(\j<3?int(\j):"k");}] in {1,...,3}{ % loop over nodes in previous layer
         %\draw[connect arrow,white,line width=1.2] (NI-\j) -- (NO);
         \draw[connect arrow]   (epsilon)-- (N5-\j)
           node[pos=0.50] {};
           %node[pos=0.50] {\colorbox{white}{\makebox[2em]{{$\frac{\partial\varepsilon}{\partial y_\index}$}}};
      }

    \draw[connect arrow] (N5-1) --(N4-3)
     node[pos=0.50] {\contour[60]{white}{$\frac{\partial \varepsilon}{\partial w^{(3)}_{1,3}}$}};
    \draw[connect arrow] (N5-2) --(N4-3)
    node[pos=0.50] {\contour[60]{white}{$\frac{\partial  \varepsilon}{\partial w^{(3)}_{2,3}}$}};
    \draw[connect arrow] (N5-3) --(N4-3)
    node[pos=0.50] {\contour[60]{white}{$\frac{\partial  \varepsilon}{\partial w^{(3)}_{3,3}}$}};
    \draw[connect arrow] (N4-3) --(N3-3)
    node[pos=0.50] {\contour[60]{white}{$\frac{\partial\varepsilon}{\partial w^{(2)}_{3,3}}$}};
    
      
  % LABELS
  \node[above=0,align=center,mygreen!60!black] at (N1-1.90) {Couche\\[-0.2em]d'entrée};
  \node[above=0,align=center,myblue!60!black] at (N3-1.90) {Couche(s) cachée(s)};
  \node[above=0,align=center,myred!60!black] at (N\Nnodlen-1.90) {Couche\\[-0.2em]de sortie};
   \node[above=0,align=center,mydarkyellow!60!black] at (epsilon) {Fonction\\[-0.2em]de coût\\[-0.2em]};

   \node[below=1,align=center ] at ($(N3-5) + (0,0.5)$) {$\begin{aligned}
     & \color{myblue} \frac{\partial \varepsilon }{\partial x_j^{(l)}} \color{black} = 
  \sum_{i=1} ^{m_{l+1}} w_{i,j}^{(l)} \sigma ' (z_i^{(l)})  \color{myblue} \frac{\partial \varepsilon }{\partial x_i^{(l+1)}}\\
  & \frac{\partial \varepsilon}{\partial w_{j,k}^{(l)}} = x_k^{(l)} \sigma '(z_j^{(l)}) \color{myblue} \frac{\partial \varepsilon }{\partial x_j^{(l+1)}} 
  \end{aligned}$};
  
\end{tikzpicture}

\end{document}