非线性的例子
在上面的线性例子中,我们可以发现,误差一次性地传递给了初始值w和b,即,只经过一步,直接修改w和b的值,就能做到误差校正。因为从它的计算图看,无论中间计算过程有多么复杂,它都是线性的,所以可以一次传到底。缺点是这种线性的组合最多只能解决线性问题,不能解决更复杂的问题。这个我们在神经网络基本原理中已经阐述过了,需要有**函数连接两个线性单元。

下面我们看一个非线性的例子。

【课堂练习:做游戏】

5个人,分别代表x,a,b,c,y,其中1<x<=100<y<2.151<x<=10,0<y<2.15

深度学习基础之-1.2非线性反向传播

第1个人,输入层
正向:随机输入第一个x值,x取值范围(1,10],假设第一个数是2
反向,第2个人传回Δxxx=xΔx\Delta x,更新x:x = x - \Delta x,再次正向
第2个人,第一层网络计算
正向,第1个人传入x的值,计算:a=x2a=x^2
反向,第3个人传回ΔaΔxΔx=Δa/2x\Delta a,计算\Delta x:\Delta x = \Delta a / 2x
第3个人,第二层网络计算
正向,第2个人传入a的值,计算b:b=ln(a)b=\ln (a)
反向,第4个人传回ΔbΔaΔa=Δba\Delta b,计算\Delta a:\Delta a = \Delta b \cdot a
第4个人,第三层网络计算
正向,第3个人传入b的值,计算c:c=bc=\sqrt{b}
反向,第5个人传回ΔcΔbΔb=Δc2b\Delta c,计算\Delta b:\Delta b = \Delta c \cdot 2\sqrt{b}
第5个人,输出层
正向,第4个人传入c的值
反向,计算y与c的差值:Δc=cy\Delta c = c - y,传回给第4个人
假设我们想最后得到c=2.13的值,问:x应该是多少?(误差小于0.001即可)

数学解析解
c=b=ln(a)=ln(x2)=2ln(x)=2.13c=\sqrt{b}=\sqrt{\ln(a)}=\sqrt{\ln(x^2)}=\sqrt{2\ln(x)}=2.13 2lnx=2.132=4.53692*\ln{x}=2.13^2=4.5369 lnx=4.5369/2=2.26854\ln{x}=4.5369/2=2.26854 eelnx=e2.26854两侧取e的次方:e^{\ln{x}} = e^{2.26854} x=9.6653x = 9.6653

梯度迭代解
(1)dadx=d(x2)dx=2x=ΔaΔx \frac{da}{dx}=\frac{d(x^2)}{dx}=2x=\frac{\Delta a}{\Delta x} \tag{1} (2)dbda=d(lna)da=1a=ΔbΔa \frac{db}{da} =\frac{d(\ln{a})}{da} =\frac{1}{a} = \frac{\Delta b}{\Delta a} \tag{2} (3)dcdb=d(b)db=12b=ΔcΔb \frac{dc}{db}=\frac{d(\sqrt{b})}{db}=\frac{1}{2\sqrt{b}}=\frac{\Delta c}{\Delta b} \tag{3} 因此得到如下一组公式,可以把最后一层Δc\Delta c的误差一直反向传播给最前面的Δx\Delta x,从而更新x值: (4)Δc=cy \Delta c = c - y \tag{4} (根据式3)Δb=Δc2b \Delta b = \Delta c \cdot 2\sqrt{b} \tag{根据式3} (根据式2)Δa=Δba \Delta a = \Delta b \cdot a \tag{根据式2} (根据式1)Δx=Δa/2x \Delta x = \Delta a / 2x \tag{根据式1}

我们给定一个初始值x=2,依次计算结果如下表:

迭代 正向x=xΔxx=x-\Delta x 正向a=x2a=x^2 正向b=ln(a)b=\ln(a) 正向c=bc=\sqrt{b} 标签值y 反向Δc=cy\Delta c = c - y 反向Δb=Δc2b\Delta b = \Delta c \cdot 2\sqrt{b} 反向Δa=Δba\Delta a = \Delta b \cdot a 反向Δx=Δa/2x\Delta x = \Delta 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!

该组合函数图像(蓝色)和导数图像(绿色):
深度学习基础之-1.2非线性反向传播

上图中的几个x坐标点,就是整个计算过程中,x的移动轨迹。

代码位置:ch02, Level1

https://github.com/microsoft/ai-edu/blob/master/B-教学案例与实践/B6-神经网络基本原理简明教程/02.2-非线性反向传播.md

相关文章: