引言
借用修仙小說體寫的標題,主要目的就是吸引你點進來🤭,客官來都來了,看完再走唄~
其實實作一個智能的聊天機器人🤖還是有一定難度的,博主就和大家一起盡可能實作一個智能的聊天機器人,
計劃一周🧭更新一次,如果覺得更新慢的話,就在留言里催更吧,很有可能會回應你們的催更哦,本系列文章📓會基于自己寫的類Pytorch工具實作一個Seq2Seq 帶Attention機制的聊天機器人,在本系列文章中,大家會了解到實作聊天機器人的所有知識,歡迎關注哦,
本文介紹自動求導的基礎知識——計算圖,并且基于計算圖來開始實作我們自己的自動求導工具:metagrad,分為三部分,這是第一部分,
計算圖
我們知道,反向傳播是模型訓練的途徑,而反向傳播是基于求導的,有沒有想過像Keras和PyTorch這種工具是如何做到自動求導的,答案就是計算圖,只要掌握了計算圖的知識,我們就能自己開發一個自動求導工具,
計算圖是一種描述函式的工具,可以可視化為有向圖結構,其中節點為Tensor(向量/張量),有向邊為操作,
在深度學習中比較常見的例子是類似
y
=
f
(
g
(
h
(
x
)
)
)
u
=
h
(
x
)
v
=
g
(
u
)
y
=
f
(
v
)
y = f (g(h(x))) \\ u = h(x) \quad v= g(u) \quad y=f(v)
y=f(g(h(x)))u=h(x)v=g(u)y=f(v)

x可以看成是輸入,y可以看成是輸出,中間經過了3次變換,
有時我們的函式有多個引數(比如乘法就有兩個引數),假設我們要計算 e = ( a + b ) ? ( b + 1 ) e = (a+b) * (b+1) e=(a+b)?(b+1)??,它的計算圖如下:

這里令 c = a + b ; d = b + 1 c = a+ b; \quad d = b + 1 c=a+b;d=b+1,為了完整性,也畫出了常量 1 1 1,
有了這個計算圖,我們就就可以很容易的計算出 e e e的值,比如令 a = 2 , b = 1 a=2,b=1 a=2,b=1

當然,我們這么辛苦的畫出這個圖,主要不是為了沿著箭頭方向進行計算的,而是為了求導,也就是計算梯度,
計算圖上的梯度
回顧一下鏈式法則


我們重點來看下多路徑的鏈式法則,即上面說的全導數,
我們要計算 e = ( a + b ) ? ( b + 1 ) e = (a+b) * (b+1) e=(a+b)?(b+1)中 ? e / ? b \partial e/ \partial b ?e/?b,
c = a + b ; d = b + 1 c = a+ b; \quad d = b + 1 c=a+b;d=b+1,
類似上圖中的
t
t
t,
b
b
b也影響了兩個因子,因此有
?
e
?
b
=
?
e
?
c
?
?
c
?
b
+
?
e
?
d
?
?
d
?
b
\frac{\partial e}{\partial b} = \frac{\partial e}{\partial c} \cdot \frac{\partial c}{\partial b} + \frac{\partial e}{\partial d} \cdot \frac{\partial d}{\partial b}
?b?e?=?c?e???b?c?+?d?e???b?d?
要計算偏導數,我們先把每個箭頭的偏導數計算出來,

我們先填入計算出來的式子:

根據 e = c ? d c = a + b d = b + 1 e = c * d \quad c = a+ b \quad d = b+ 1 e=c?dc=a+bd=b+1以及求導公式不難得到上面的結果,
此時,要計算 ? e / ? b \partial e/ \partial b ?e/?b,只需要找出所有從 b b b到 e e e?到路徑,然后把相同路徑上的值相乘,不同路徑上的值相加(連線相乘,分線相加),
就可以得到: ? e / ? b = 1 ? ( b + 1 ) + 1 ? ( a + b ) \partial e/ \partial b = 1*(b+1) + 1*(a+b) ?e/?b=1?(b+1)+1?(a+b)
此時,代入 a = 2 , b = 1 a=2,b=1 a=2,b=1,
先計算出 b + 1 = 2 b+1=2 b+1=2,再計算 a + b = 3 a+b=3 a+b=3,所以 ? e / ? b = 1 ? 2 + 1 ? 3 = 5 \partial e/ \partial b = 1*2 + 1 *3=5 ?e/?b=1?2+1?3=5
反向模式
如果要同時計算 e e e對 a a a和 b b b?的偏導數,我們需要反向模式(Reverse mode)來同時計算它們,

反向就是從頂點開始,這里從 e e e開始,也從梯度等于 1 1 1開始,
從頂點到 b b b,通過有兩條路徑,如山古同橙色箭頭所示,達到 c c c時的梯度為 1 ? 2 = 2 1 * 2 =2 1?2=2;到達 d d d時的梯度為 1 ? 3 = 3 1 * 3=3 1?3=3,
c c c和 d d d到 b b b的梯度都是 1 1 1,根據相同路徑相乘,不同路徑相加,到 b b b到梯度為 2 + 3 = 5 2+3=5 2+3=5,

此時,計算 e e e到 a a a的就簡單了,我們已經知道了 e e e到 c c c到梯度為 2 2 2,由于 e e e到 a a a只有一條路徑,因此直接相乘得 ? e / ? a = 2 ? 1 = 2 \partial e / \partial a =2 * 1=2 ?e/?a=2?1=2,
如果你的函式只有一個輸出,由需要同時計算大量的不同值的偏導數時,用反向模式就比較快,
而這恰恰非常適合于我們計算損失函式的梯度,因為損失函式的輸出就是一個標量,
總結
我們已經了解了計算圖到基本知識,下篇文章我們來看一下常見運算的計算圖,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382782.html
標籤:AI
上一篇:期權定價模型之經典--BS模型
