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_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倒数证明如下