神经网络原理2 - 反向传播

反向传播

公式和图表

$y=x_1w_1 + x_2w_2 + b$,以下的图表表示着正向传播的流程

输入

$x_1=2, \ x_2=0$

初始权重

$w_1=-3, \ w_2=1, \ b=6.8814$

            graph LR
            
    w2["w2 | data 1.0000 | grad 0.0000"]
    x2["x2 | data 0.0000 | grad 0.0000"]
    w1["w1 | data -3.0000 | grad 0.0000"]
    x1["x1 | data 2.0000 | grad 0.0000"]
    b["b | data 6.8814 | grad 0.0000"]



    mul1((*))
    xw2["x2 * w2 | data 0.0000 | grad 0.0000"]


    mul2((*))
    xw1["x1 * w1 | data -6.0000 | grad 0.0000"]



    add1((+))
    sum_xw["x1*w1 + x2*w2 | data -6.0000 | grad 0.0000"]


    add2((+))
    y["y | data 0.8814 | grad 1.0000"]


w2 --> mul1
x2 --> mul1
mul1 --> xw2

w1 --> mul2
x1 --> mul2
mul2 --> xw1

xw2 --> add1
xw1 --> add1
add1 --> sum_xw

sum_xw --> add2
b --> add2
add2 --> y
          

正向传播后,我们就要开始反向传播了

计算全部的导数

第一层

b的导数

\begin{eqnarray*}
y &=& -6+b \\
\frac{dy}{db} &=& 1 \\
\end{eqnarray*}


$(x_1w_1 + x_2w_2)$的导数

\begin{eqnarray*}
y &=& (x_1w_1 + x_2w_2)+6.8814 \\
\frac{dy}{d(x_1w_1 + x_2w_2)} &=& 1 \\
\end{eqnarray*}


第二层

$x_1w_1$的导数

\begin{eqnarray*}
(x_1w_1 + x_2w_2) &=& x_1w_1+0 \\
\frac{d(x_1w_1 + x_2w_2)}{d(x_1w_1)} &=& 1 \\
\end{eqnarray*}


通过链式法则
\begin{eqnarray*}
\frac{dy}{d(x_1w_1)} &=& \frac{dy}{d(x_1w_1 + x_2w_2)} \cdot \frac{d(x_1w_1 + x_2w_2)}{d(x_1w_1)} \\
&=& 1 \cdot 1 \\
&=& 1
\end{eqnarray*}


$x_2w_2$的导数

\begin{eqnarray*}
(x_1w_1 + x_2w_2) &=& -6 + x_2w_2 \\
\frac{d(x_1w_1 + x_2w_2)}{d(x_2w_2)} &=& 1 \\
\end{eqnarray*}

通过链式法则
\begin{eqnarray*}
\frac{dy}{d(x_2w_2)} &=& \frac{dy}{d(x_1w_1 + x_2w_2)} \cdot \frac{d(x_1w_1 + x_2w_2)}{d(x_2w_2)} \\
&=& 1 \cdot 1 \\
&=& 1
\end{eqnarray*}


第三层

$x_1$的导数

\begin{eqnarray*}
x_1w_1 &=& x_1 \cdot w_1 \\
&=& -3x_1 \\
\frac{dx_1w_1}{dx_1} &=& -3 \\
\end{eqnarray*}

通过链式法则
\begin{eqnarray*}
\frac{dy}{d(x_1)} &=& \frac{dy}{d(x_1w_1)} \cdot \frac{d(dx_1w_1)}{d(dx_1)} \\
&=& 1 \cdot -3 \\
&=& -3
\end{eqnarray*}


$w_1$的导数

\begin{eqnarray*}
x_1w_1 &=& x_1 \cdot w_1 \\
&=& 2w_1 \\
\frac{dx_1w_1}{dw_1} &=& 2 \\
\end{eqnarray*}


通过链式法则
\begin{eqnarray*}
\frac{dy}{d(w_1)} &=& \frac{dy}{d(x_1w_1)} \cdot \frac{d(x_1w_1)}{d(dw_1)} \\
&=& 1 \cdot 2 \\
&=& 2
\end{eqnarray*}


$x_2$的导数

\begin{eqnarray*}
x_2w_2 &=& x_2 \cdot w_2 \\
&=& 1x_2 \\
\frac{dx_2w_2}{dx_2} &=& 1 \\
\end{eqnarray*}


通过链式法则
\begin{eqnarray*}
\frac{dy}{d(dx_2)} &=& \frac{dy}{d(x_2w_2)} \cdot \frac{d(dx_2w_2)}{d(dx_2)} \\
&=& 1 \cdot 1 \\
&=& 1
\end{eqnarray*}


$w_2$的导数

\begin{eqnarray*}
x_2w_2 &=& x_2 \cdot w_2 \\
&=& 0(w_2) \\
\frac{dx_2w_2}{dw_2} &=& 0 \\
\end{eqnarray*}


通过链式法则
\begin{eqnarray*}
\frac{dy}{d(dw_2)} &=& \frac{dy}{d(x_2w_2)} \cdot \frac{d(dx_2w_2)}{d(dw_2)} \\
&=& 1 \cdot 0 \\
&=& 0
\end{eqnarray*}


最终图表

graph LR

        w2["w2 | data 1.0000 | grad 0.0000"]
        x2["x2 | data 0.0000 | grad 1.0000"]
        w1["w1 | data -3.0000 | grad 2.0000"]
        x1["x1 | data 2.0000 | grad -3.0000"]
        b["b | data 6.8814 | grad 1.0000"]



        mul1((*))
        xw2["x2 * w2 | data 0.0000 | grad 1.0000"]


        mul2((*))
        xw1["x1 * w1 | data -6.0000 | grad 1.0000"]



        add1((+))
        sum_xw["x1*w1 + x2*w2 | data -6.0000 | grad 1.0000"]


        add2((+))
        y["y | data 0.8814 | grad 1.0000"]


    w2 --> mul1
    x2 --> mul1
    mul1 --> xw2

    w1 --> mul2
    x1 --> mul2
    mul2 --> xw1

    xw2 --> add1
    xw1 --> add1
    add1 --> sum_xw

    sum_xw --> add2
    b --> add2
    add2 --> y

结论

反向传播其实是寻找每个权重$(w,b)$的y导数$\frac{dy}{d<权重>}$。 这样我们就能知道每个权重如果增加/减少会对y(输出)产生什么作用,以便我们知道该如何调整权重。通常来说,我们会算的都不会是y(输出),而是loss(损失)。以下是使用MSE公式来计算loss。
$$MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$

所以其实我们会算的其实是loss导数$\frac{dLoss}{d<权重>}$,来寻找每个权重的变化会对loss造成的影响从而调整权重来减少loss。