飞道的博客

[ch02-02] 非线性反向传播

385人阅读  评论(0)

系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI
点击star加星不要吝啬,星越多笔者越努力。

2.2 非线性反向传播

2.2.1 提出问题

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

下面我们看一个非线性的例子,如图2-8所示。

图2-8 非线性的反向传播

其中 1 < x <= 10 0 < y < 2.15 。假设有5个人分别代表x、a、b、c、y:

正向过程

  1. 第1个人,输入层,随机输入第一个x值,x取值范围(1,10],假设第一个数是2
  2. 第2个人,第一层网络计算,接收第1个人传入x的值,计算: a = x 2
  3. 第3个人,第二层网络计算,接收第2个人传入a的值,计算b: b = ln ( a )
  4. 第4个人,第三层网络计算,接收第3个人传入b的值,计算c: c = b
  5. 第5个人,输出层,接收第4个人传入c的值

反向过程

  1. 第5个人,计算y与c的差值: Δ c = c y ,传回给第4个人
  2. 第4个人,接收第5个人传回 Δ c Δ b Δ b = Δ c 2 b
  3. 第3个人,接收第4个人传回 Δ b Δ a Δ a = Δ b a
  4. 第2个人,接收第3个人传回 Δ a Δ x Δ x = Δ a / 2 x
  5. 第1个人,接收第2个人传回 Δ x x x = x Δ x ,回到第1步

提出问题:假设我们想最后得到c=2.13的值,x应该是多少?(误差小于0.001即可)

2.2.2 数学解析解

c = b = ln ( a ) = ln ( x 2 ) = 2.13

x = 9.6653

2.2.3 梯度迭代解

(1) d a d x = d ( x 2 ) d x = 2 x = Δ a Δ x

(2) d b d a = d ( ln a ) d a = 1 a = Δ b Δ a

(3) d c d b = d ( b ) d b = 1 2 b = Δ c Δ b

因此得到如下一组公式,可以把最后一层 Δ c 的误差一直反向传播给最前面的 Δ x ,从而更新x值:
(4) Δ c = c y

(根据式3) Δ b = Δ c 2 b

(根据式2) Δ a = Δ b a

(根据式1) Δ x = Δ a / 2 x

我们给定初始值 x = 2 Δ x = 0 ,依次计算结果如表2-2。

表2-2 正向与反向的迭代计算

方向 公式 迭代1 迭代2 迭代3 迭代4 迭代5
正向 x = x Δ x 2 4.243 7.344 9.295 9.665
正向 a = x 2 4 18.005 53.934 86.404 93.233
正向 b = ln ( a ) 1.386 2.891 3.988 4.459 4.535
正向 c = b 1.177 1.700 1.997 2.112 2.129
标签值y 2.13 2.13 2.13 2.13 2.13
反向 Δ c = c y -0.953 -0.430 -0.133 -0.018
反向 Δ b = Δ c 2 b -2.243 -1.462 -0.531 -0.078
反向 Δ a = Δ b a -8.973 -26.317 -28.662 -6.698
反向 Δ x = Δ a / 2 x -2.243 -3.101 -1.951 -0.360

表2-2,先看“迭代-1”列,从上到下是一个完整的正向+反向的过程,最后一行是-2.243,回到“迭代-2”列的第一行,2-(-2.243)=4.243,然后继续向下。到第5轮时,正向计算得到的c=2.129,非常接近2.13了,迭代结束。

运行示例代码的话,可以得到如下结果:


  
  1. how to play: 1) input x, 2) calculate c, 3) input target number but not faraway from c
  2. input x as initial number( 1.2, 10), you can try 1.3:
  3. 2
  4. c= 1.177410
  5. input y as target number( 0.5, 2), you can try 1.8:
  6. 2.13
  7. forward...
  8. x= 2.000000,a= 4.000000,b= 1.386294, c= 1.177410
  9. backward...
  10. delta_c=- 0.952590, delta_b=- 2.243178, delta_a=- 8.972712, delta_x=- 2.243178
  11. ......
  12. forward...
  13. x= 9.655706,a= 93.232666,b= 4.535098, c= 2.129577
  14. backward...
  15. done!

为节省篇幅只列出了第一步和最后一步(第5步)的结果,第一步时c=1.177410,最后一步时c=2.129577,停止迭代。

代码位置

ch02, Level2


转载:https://blog.csdn.net/songfei_dream/article/details/103257394
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场