excel手撕BP神经网络(只需高中数学基础)

神经网络最基础部分是由神经元组成,一个神经元相当于是一个一次函数,y=ax+b
即在已知x,和y情况下,怎么使用神经网络求解a和b

如下是使用excel求解的神经网络,可以方便理解神经网络运行原理
excel BP神经网络下载地址

0 excel数据及任务

  • 构造了如下数据,x0,x1,x2和y_true。其中x0,x1,x2对应真实wTrue(w0,w1,w2)如表格所示(表格数据都可以修改,公式已经编辑好),
    即 y=x0 * wt0 + x1 * wt1 + x2 * wt2
  • 任务;需要使用神经网络计算出真实的w

1 神经网络求解步骤:

已知 x 和y

  • 1 随机初始化wi
    初始化w全为0, w00=0,w01=0,w02=0 (为了简化,只考虑w,不考虑b)
  • 2 将x带入 a和b参数函数,得到y的预测值y_pred
    y_pred=x0w00+x1w01+x2*w02
  • 3 将预测y_pred与真实值y进行对比,构建损失函数(刚开始,随机的w误差肯定很大)
    loss= ( y _ p r e d − y _ t r u e ) 2 (y\_pred-y\_true)^2 (y_predy_true)2
  • 4 对损失函数求导,使用梯度下降更新参数w.
    导数
    w00导数:dy_dw00: 2*(y_pred-y_true)x0
    w01导数:dy_dw01: 2
    (y_pred-y_true)x1
    w02导数:dy_dw02: 2
    (y_pred-y_true)*x2
    步长:lr=0.001
    新的 w00= w00-lr * dy_dw00
    新的 w01= w01-lr * dy_dw01
    新的 w02= w02-lr * dy_dw01
  • 5 循环上面2~4步,直到收敛

2 反向传播公式推导

上面第3步,损失函数为loss= ( y _ p r e d − y _ t r u e ) 2 (y\_pred-y\_true)^2 (y_predy_true)2
其中w00,w01,w02倒数如下。导数公式证明见2.1或者2.2小节,其中用到了 x 2 x^2 x2 的导数为2x, x 2 x^2 x2的倒数证明见第4小节。
在这里插入图片描述

2.1 根据链式法则求导

若链式法则求导无法理解见 2.2节直接求导
loss= ( y _ p r e d − y _ t r u e ) 2 (y\_pred-y\_true)^2 (y_predy_true)2 对w的导数为
∂ ( y _ p r e d − y _ t r u e ) 2 ∂ w 0 = 2 ( y _ p r e d − y _ t r u e ) ∗ x 0 \frac{\partial(y\_pred-y\_true)^2}{\partial w0}=2(y\_pred-y\_true)*x0 w0(y_predy_true)2=2(y_predy_true)x0
∂ ( y _ p r e d − y _ t r u e ) 2 ∂ w 1 = 2 ( y _ p r e d − y _ t r u e ) ∗ x 1 \frac{\partial(y\_pred-y\_true)^2}{\partial w1}=2(y\_pred-y\_true)*x1 w1(y_predy_true)2=2(y_predy_true)x1
∂ ( y _ p r e d − y _ t r u e ) 2 ∂ w 2 = 2 ( y _ p r e d − y _ t r u e ) ∗ x 2 \frac{\partial(y\_pred-y\_true)^2}{\partial w2}=2(y\_pred-y\_true)*x2 w2(y_predy_true)2=2(y_predy_true)x2

2.2 直接求导

若不知道x^2的倒数,见第4小节

  • loss展开
    y_pred=x0w00+x1w01+x2*w02
    ( y _ p r e d − y _ t r u e ) 2 = ( x 0 ∗ w 00 + x 1 ∗ w 01 + x 2 ∗ w 02 − y _ t r u e ) 2 (y\_pred-y\_true)^2=(x0*w00+x1*w01+x2*w02-y\_true)^2 (y_predy_true)2=(x0w00+x1w01+x2w02y_true)2
  • 如上,如果对w00求导,则其他项可以看成常数
    ( y _ p r e d − y _ t r u e ) 2 = ( x 0 ∗ w 00 ) 2 + 2 ( x 0 ∗ w 00 ) ∗ ( x 1 ∗ w 01 + x 2 ∗ w 02 − y _ t r u e ) + ( x 1 ∗ w 01 + x 2 ∗ w 02 − y _ t r u e ) 2 (y\_pred-y\_true)^2=(x0*w00)^2+2(x0*w00)*(x1*w01+x2*w02-y\_true)+(x1*w01+x2*w02-y\_true)^2 (y_predy_true)2=(x0w00)2+2(x0w00)(x1w01+x2w02y_true)+(x1w01+x2w02y_true)2
  • 则对w00的倒数为
    2 ∗ x 0 2 ∗ w 00 + 2 x 0 ∗ ( x 1 ∗ w 01 + x 2 ∗ w 02 − y _ t r u e ) 2*x0^2*w00+2x0*(x1*w01+x2*w02-y\_true) 2x02w00+2x0(x1w01+x2w02y_true)
    = 2 ∗ x 0 ∗ ( x 0 ∗ w 00 + x 1 ∗ w 01 + x 2 ∗ w 02 − y _ t r u e ) 2*x0*(x0*w00+x1*w01+x2*w02-y\_true) 2x0(x0w00+x1w01+x2w02y_true)
    = 2 ∗ x 0 ∗ ( y _ p r e d − y _ t r u e ) 2*x0*(y\_pred-y\_true) 2x0(y_predy_true)
  • 同理w01,w02的倒数都可以求出
    分别为
    2 ∗ x 1 ∗ ( y _ p r e d − y _ t r u e ) 2*x1*(y\_pred-y\_true) 2x1(y_predy_true)
    2 ∗ x 2 ∗ ( y _ p r e d − y _ t r u e ) 2*x2*(y\_pred-y\_true) 2x2(y_predy_true)

直接求导与链式求导结果一样

3 结果展示

如下所示,数据在进行了两轮更新(共计20步)后,已从初始值0,0,0逐步收敛到真实值wTrue.
excel下载地址

在这里插入图片描述

4 x^2导数公式推导

  • x^2倒数证明如下
    在这里插入图片描述