[ch02-02] 非線性反向傳播

系列博客,原文在筆者所維護的github上:https://aka.ms/beginnerAI
點擊star加星不要吝嗇,星越多筆者越努力。git

2.2 非線性反向傳播

2.2.1 提出問題

在上面的線性例子中,咱們能夠發現,偏差一次性地傳遞給了初始值w和b,即,只通過一步,直接修改w和b的值,就能作到偏差校訂。由於從它的計算圖看,不管中間計算過程有多麼複雜,它都是線性的,因此能夠一次傳到底。缺點是這種線性的組合最多隻能解決線性問題,不能解決更復雜的問題。這個咱們在神經網絡基本原理中已經闡述過了,須要有激活函數鏈接兩個線性單元。github

下面咱們看一個非線性的例子,如圖2-8所示。網絡

圖2-8 非線性的反向傳播函數

其中\(1<x<=10,0<y<2.15\)。假設有5我的分別表明x、a、b、c、y:spa

正向過程

  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=\sqrt{b}\)
  5. 第5我的,輸出層,接收第4我的傳入c的值

反向過程

  1. 第5我的,計算y與c的差值:\(\Delta c = c - y\),傳回給第4我的
  2. 第4我的,接收第5我的傳回\(\Delta c,計算\Delta b:\Delta b = \Delta c \cdot 2\sqrt{b}\)
  3. 第3我的,接收第4我的傳回\(\Delta b,計算\Delta a:\Delta a = \Delta b \cdot a\)
  4. 第2我的,接收第3我的傳回\(\Delta a,計算\Delta x:\Delta x = \Delta a / 2x\)
  5. 第1我的,接收第2我的傳回\(\Delta x,更新x:x = x - \Delta x\),回到第1步

提出問題:假設咱們想最後獲得c=2.13的值,x應該是多少?(偏差小於0.001便可)code

2.2.2 數學解析解

\[c=\sqrt{b}=\sqrt{\ln(a)}=\sqrt{\ln(x^2)}=2.13\]
\[x = 9.6653\]blog

2.2.3 梯度迭代解

\[ \frac{da}{dx}=\frac{d(x^2)}{dx}=2x=\frac{\Delta a}{\Delta x} \tag{1} \]
\[ \frac{db}{da} =\frac{d(\ln{a})}{da} =\frac{1}{a} = \frac{\Delta b}{\Delta a} \tag{2} \]
\[ \frac{dc}{db}=\frac{d(\sqrt{b})}{db}=\frac{1}{2\sqrt{b}}=\frac{\Delta c}{\Delta b} \tag{3} \]
所以獲得以下一組公式,能夠把最後一層\(\Delta c\)的偏差一直反向傳播給最前面的\(\Delta x\),從而更新x值:
\[ \Delta c = c - y \tag{4} \]
\[ \Delta b = \Delta c \cdot 2\sqrt{b} \tag{根據式3} \]
\[ \Delta a = \Delta b \cdot a \tag{根據式2} \]
\[ \Delta x = \Delta a / 2x \tag{根據式1} \]get

咱們給定初始值\(x=2,\Delta x=0\),依次計算結果如表2-2。input

表2-2 正向與反向的迭代計算博客

方向 公式 迭代1 迭代2 迭代3 迭代4 迭代5
正向 \(x=x-\Delta 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=\sqrt{b}\) 1.177 1.700 1.997 2.112 2.129
標籤值y 2.13 2.13 2.13 2.13 2.13
反向 \(\Delta c = c - y\) -0.953 -0.430 -0.133 -0.018
反向 \(\Delta b = \Delta c \cdot 2\sqrt{b}\) -2.243 -1.462 -0.531 -0.078
反向 \(\Delta a = \Delta b \cdot a\) -8.973 -26.317 -28.662 -6.698
反向 \(\Delta x = \Delta a / 2x\) -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了,迭代結束。

運行示例代碼的話,能夠獲得以下結果:

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=9.655706,a=93.232666,b=4.535098,c=2.129577
backward...
done!

爲節省篇幅只列出了第一步和最後一步(第5步)的結果,第一步時c=1.177410,最後一步時c=2.129577,中止迭代。

代碼位置

ch02, Level2

相關文章
相關標籤/搜索