excel手撕BP神经网络(只需高中数学基础)
小白能懂的神经网络,使用excel进行梯度求导计算,进行反向传播,在经过2轮,20次数据迭代后,神经网络收敛。
神经网络最基础部分是由神经元组成,一个神经元相当于是一个一次函数,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_pred−y_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_pred−y_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_pred−y_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_pred−y_true)2=2(y_pred−y_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_pred−y_true)2=2(y_pred−y_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_pred−y_true)2=2(y_pred−y_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_pred−y_true)2=(x0∗w00+x1∗w01+x2∗w02−y_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_pred−y_true)2=(x0∗w00)2+2(x0∗w00)∗(x1∗w01+x2∗w02−y_true)+(x1∗w01+x2∗w02−y_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) 2∗x02∗w00+2x0∗(x1∗w01+x2∗w02−y_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) 2∗x0∗(x0∗w00+x1∗w01+x2∗w02−y_true)
= 2 ∗ x 0 ∗ ( y _ p r e d − y _ t r u e ) 2*x0*(y\_pred-y\_true) 2∗x0∗(y_pred−y_true) - 同理w01,w02的倒数都可以求出
分别为
2 ∗ x 1 ∗ ( y _ p r e d − y _ t r u e ) 2*x1*(y\_pred-y\_true) 2∗x1∗(y_pred−y_true)
2 ∗ x 2 ∗ ( y _ p r e d − y _ t r u e ) 2*x2*(y\_pred-y\_true) 2∗x2∗(y_pred−y_true)
直接求导与链式求导结果一样
3 结果展示
如下所示,数据在进行了两轮更新(共计20步)后,已从初始值0,0,0逐步收敛到真实值wTrue.
excel下载地址
4 x^2导数公式推导
- x^2倒数证明如下
更多推荐
所有评论(0)