非线性的例子
在上面的线性例子中,我们可以发现,误差一次性地传递给了初始值w和b,即,只经过一步,直接修改w和b的值,就能做到误差校正。因为从它的计算图看,无论中间计算过程有多么复杂,它都是线性的,所以可以一次传到底。缺点是这种线性的组合最多只能解决线性问题,不能解决更复杂的问题。这个我们在神经网络基本原理中已经阐述过了,需要有激活函数连接两个线性单元。
下面我们看一个非线性的例子。
【课堂练习:做游戏】
5个人,分别代表x,a,b,c,y,其中 1 < x < = 10 , 0 < y < 2.15 1<x<=10,0<y<2.15 1<x<=10,0<y<2.15
第1个人,输入层
正向:随机输入第一个x值,x取值范围(1,10],假设第一个数是2
反向,第2个人传回
Δ
x
,
更
新
x
:
x
=
x
−
Δ
x
\Delta x,更新x:x = x - \Delta x
Δx,更新x:x=x−Δx,再次正向
第2个人,第一层网络计算
正向,第1个人传入x的值,计算:
a
=
x
2
a=x^2
a=x2
反向,第3个人传回
Δ
a
,
计
算
Δ
x
:
Δ
x
=
Δ
a
/
2
x
\Delta a,计算\Delta x:\Delta x = \Delta a / 2x
Δa,计算Δx:Δx=Δa/2x
第3个人,第二层网络计算
正向,第2个人传入a的值,计算b:
b
=
ln
(
a
)
b=\ln (a)
b=ln(a)
反向,第4个人传回
Δ
b
,
计
算
Δ
a
:
Δ
a
=
Δ
b
⋅
a
\Delta b,计算\Delta a:\Delta a = \Delta b \cdot a
Δb,计算Δa:Δa=Δb⋅a
第4个人,第三层网络计算
正向,第3个人传入b的值,计算c:
c
=
b
c=\sqrt{b}
c=b
反向,第5个人传回
Δ
c
,
计
算
Δ
b
:
Δ
b
=
Δ
c
⋅
2
b
\Delta c,计算\Delta b:\Delta b = \Delta c \cdot 2\sqrt{b}
Δc,计算Δb:Δb=Δc⋅2b
第5个人,输出层
正向,第4个人传入c的值
反向,计算y与c的差值:
Δ
c
=
c
−
y
\Delta c = c - y
Δc=c−y,传回给第4个人
假设我们想最后得到c=2.13的值,问:x应该是多少?(误差小于0.001即可)
数学解析解
c
=
b
=
ln
(
a
)
=
ln
(
x
2
)
=
2
ln
(
x
)
=
2.13
c=\sqrt{b}=\sqrt{\ln(a)}=\sqrt{\ln(x^2)}=\sqrt{2\ln(x)}=2.13
c=b=ln(a)=ln(x2)=2ln(x)=2.13
2
∗
ln
x
=
2.1
3
2
=
4.5369
2*\ln{x}=2.13^2=4.5369
2∗lnx=2.132=4.5369
ln
x
=
4.5369
/
2
=
2.26854
\ln{x}=4.5369/2=2.26854
lnx=4.5369/2=2.26854
两
侧
取
e
的
次
方
:
e
ln
x
=
e
2.26854
两侧取e的次方:e^{\ln{x}} = e^{2.26854}
两侧取e的次方:elnx=e2.26854
x
=
9.6653
x = 9.6653
x=9.6653
梯度迭代解
(1)
d
a
d
x
=
d
(
x
2
)
d
x
=
2
x
=
Δ
a
Δ
x
\frac{da}{dx}=\frac{d(x^2)}{dx}=2x=\frac{\Delta a}{\Delta x} \tag{1}
dxda=dxd(x2)=2x=ΔxΔa(1)
(2)
d
b
d
a
=
d
(
ln
a
)
d
a
=
1
a
=
Δ
b
Δ
a
\frac{db}{da} =\frac{d(\ln{a})}{da} =\frac{1}{a} = \frac{\Delta b}{\Delta a} \tag{2}
dadb=dad(lna)=a1=ΔaΔb(2)
(3)
d
c
d
b
=
d
(
b
)
d
b
=
1
2
b
=
Δ
c
Δ
b
\frac{dc}{db}=\frac{d(\sqrt{b})}{db}=\frac{1}{2\sqrt{b}}=\frac{\Delta c}{\Delta b} \tag{3}
dbdc=dbd(b)=2b1=ΔbΔc(3) 因此得到如下一组公式,可以把最后一层
Δ
c
\Delta c
Δc的误差一直反向传播给最前面的
Δ
x
\Delta x
Δx,从而更新x值:
(4)
Δ
c
=
c
−
y
\Delta c = c - y \tag{4}
Δc=c−y(4)
(根据式3)
Δ
b
=
Δ
c
⋅
2
b
\Delta b = \Delta c \cdot 2\sqrt{b} \tag{根据式3}
Δb=Δc⋅2b(根据式3)
(根据式2)
Δ
a
=
Δ
b
⋅
a
\Delta a = \Delta b \cdot a \tag{根据式2}
Δa=Δb⋅a(根据式2)
(根据式1)
Δ
x
=
Δ
a
/
2
x
\Delta x = \Delta a / 2x \tag{根据式1}
Δx=Δa/2x(根据式1)
我们给定一个初始值x=2,依次计算结果如下表:
迭代 | 正向 x = x − Δ x x=x-\Delta x x=x−Δx | 正向 a = x 2 a=x^2 a=x2 | 正向 b = ln ( a ) b=\ln(a) b=ln(a) | 正向 c = b c=\sqrt{b} c=b | 标签值y | 反向 Δ c = c − y \Delta c = c - y Δc=c−y | 反向 Δ b = Δ c ⋅ 2 b \Delta b = \Delta c \cdot 2\sqrt{b} Δb=Δc⋅2b | 反向 Δ a = Δ b ⋅ a \Delta a = \Delta b \cdot a Δa=Δb⋅a | 反向 Δ x = Δ a / 2 x \Delta x = \Delta a / 2x Δx=Δa/2x |
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 4 | 1.386 | 1.177 | 2.13 | -0.953 | -2.243 | -8.973 | -2.243 |
2 | 4.243 | 18.005 | 2.891 | 1.700 | 2.13 | -0.430 | -1.462 | -26.314 | -3.101 |
3 | 7.344 | 53.934 | 3.988 | 1.997 | 2.13 | -0.133 | -0.531 | -28.662 | -1.951 |
4 | 9.295 | 86.404 | 4.459 | 2.112 | 2.13 | -0.018 | -0.078 | -6.698 | -0.360 |
5 | 9.655 | 93.233 | 4.535 | 2.129 | 2.13 |
下面是运行结果:
how to play: 1) input x, 2) calculate c, 3) input target number but not faraway from c
input x as initial number(1.2,10), you can try 1.3:
2
c=1.177410
input y as target number(0.5,2), you can try 1.8:
2.13
forward...
x=2.000000,a=4.000000,b=1.386294,c=1.177410
backward...
delta_c=-0.952590, delta_b=-2.243178, delta_a=-8.972712, delta_x=-2.243178
forward...
x=4.243178,a=18.004559,b=2.890625,c=1.700184
backward...
delta_c=-0.429816, delta_b=-1.461533, delta_a=-26.314258, delta_x=-3.100772
forward...
x=7.343950,a=53.933607,b=3.987754,c=1.996936
backward...
delta_c=-0.133064, delta_b=-0.531440, delta_a=-28.662487, delta_x=-1.951435
forward...
x=9.295386,a=86.404194,b=4.459036,c=2.111643
backward...
delta_c=-0.018357, delta_b=-0.077527, delta_a=-6.698641, delta_x=-0.360321
forward...
x=9.655706,a=93.232666,b=4.535098,c=2.129577
backward...
done!
该组合函数图像(蓝色)和导数图像(绿色):
上图中的几个x坐标点,就是整个计算过程中,x的移动轨迹。
代码位置:ch02, Level1
https://github.com/microsoft/ai-edu/blob/master/B-教学案例与实践/B6-神经网络基本原理简明教程/02.2-非线性反向传播.md