引言
本著“凡我不能創造的,我就不能理解”的思想,本系列文章會基于純Python以及NumPy從零創建自己的深度學習框架,該框架類似PyTorch能實作自動求導,
要深入理解深度學習,從零開始創建的經驗非常重要,從自己可以理解的角度出發,盡量不適用外部完備的框架前提下,實作我們想要的模型,本系列文章的宗旨就是通過這樣的程序,讓大家切實掌握深度學習底層實作,而不是僅做一個調包俠,
本系列文章首發于微信公眾號:Hello丶Java

本文介紹常見運算的計算圖,
計算圖直觀地表示了計算程序,通過觀察反向傳播的梯度流動,可以幫助我們理解反向傳播的推導程序,
我們會利用計算圖來實作自動求導工具,首先我們看一下常見運算操作的計算圖,
加法

z = x + y z = x + y z=x+y求這個運算的梯度比較簡單,易得 ? z ? x = 1 , ? z ? y = 1 \frac{\partial z}{\partial x}=1,\frac{\partial z}{\partial y}=1 ?x?z?=1,?y?z?=1
? L ? z \frac{\partial L}{\partial z} ?z?L?為經過反向傳播傳遞到 z z z節點上的梯度,
減法

由 z = x ? y z = x - y z=x?y 可得 ? z ? x = 1 , ? z ? y = ? 1 \frac{\partial z}{\partial x}=1,\frac{\partial z}{\partial y}=-1 ?x?z?=1,?y?z?=?1
乘法

z = x × y z = x \times y z=x×y 的梯度也比較簡單,易得 ? z ? x = y , ? z ? y = x \frac{\partial z}{\partial x}=y,\frac{\partial z}{\partial y}=x ?x?z?=y,?y?z?=x,
此時,反向傳播時會將上游傳來的梯度乘以當前路徑上計算出來的梯度,
除法

z = x y z=\frac{x}{y} z=yx?的梯度稍微有點復雜,$\frac{\partial z}{\partial x} = \frac{1}{y}, \frac{\partial z}{\partial y} =-\frac{x}{y^2} $,
我們現在看到的都是單變數,其實也可以是多變數(向量、張量或矩陣),在多變數時,只需要獨立計算向量中各個元素,即,向量的各個元素獨立于其他元素進行對應元素的計算,在下文的矩陣乘法時會詳細介紹,
分支
嚴格來說,分支并不是我們常見運算的一種,但是有些情況下很有用,比如進行廣播操作時,

分支是最簡單的復制形式,它的反向傳播是上游傳來的梯度之和,
Repeat
上面的分支操作有兩個副本(或者分支),也可以擴展為 N N N個副本,此時稱為復制(Repeat),

如上圖,將長度為 D D D的陣列復制了 N N N份,這個復制操作可以看成是 N N N個分支操作,所以它的反向傳播可以通過 N N N個梯度的總和,

如果通過Numpy實作的化:
import numpy as np
D, N = 8, 7
x = np.random.randn(1,D)
y = np.repeat(x, N, axis=0) # axis=0 沿著行的方向復制N份,變成了(N,D)
# 上面是正向傳播
# 下面是梯度
dy = np.random.randn(N,D) # y的梯度一定和y的維度保持一致
dx = np.sum(dy, axis=0, keepdims=True) # 同理,x的梯度也和x保持一致,這里變成了(1,D)

上圖是簡單介紹一下Numpy中axis的概念,當陣列是1D的時候,只有一個軸,所以0軸的方向和2D的不同,要注意一下,
Numpy中的廣播會復制陣列的元素,可以通過這里的復制操作來表示,
Sum
Sum(求和)也是我們在深度學習中常用的運算,加法操作可以看成是求和的特殊形式,
考慮對一個 N × D N \times D N×D對陣列沿著第行的方向求和,此時正向傳播和反向傳播如下所示,

和加法一樣,反向傳播時將梯度(拷貝)分配到所有的箭頭上,Sum操作是上面介紹的復制操作的逆向操作,即Sum的正向傳播相當于復制操作的反向傳播;Sum的反向傳播相當于復制操作的正向傳播,
我們也看一下通過Numpy實作的例子,
D, N = 8, 7
# 正向傳播
x = np.random.randn(N, D)
y = np.sum(x, axis=0, keepdims=True) # 變成了(1,D)
# 反向傳播
dy = np.random.randn(1, D) # 維度和y保持一致
dx = np.repeat(dy, N, axis=0) # 復制成了(N,D)
Matmul
Matmul是矩陣乘法(Matrix Multiply),比如,考慮 y = x W y=xW y=xW這個運算, x , W , y x,W,y x,W,y的形狀分別是 1 × D 1 \times D 1×D、 D × H D \times H D×H和 1 × H 1 \times H 1×H,

它的反向傳播稍微有點復雜,我們先來了解下雅可比矩陣(Jacobian matrix),

用每個 y y y對每個 x x x計算偏微分,計算得到的矩陣高度是 y y y的個數,寬度是 x x x的個數,
把
y
=
x
W
y=xW
y=xW展開得:
[
y
1
,
y
2
,
?
?
,
y
H
]
=
[
x
1
,
x
2
,
?
?
,
x
D
]
[
W
11
W
12
?
W
1
H
W
21
W
22
?
W
2
H
?
?
?
?
W
D
1
W
D
2
?
W
D
H
]
\left [y_1,y_2,\cdots,y_H \right] = \left[x_1,x_2, \cdots,x_D \right] \begin{bmatrix} W_{11} & W_{12}&\cdots &W_{1H} \\ W_{21}&W_{22}&\cdots&W_{2H} \\ \vdots & \vdots&\ddots& \vdots \\ W_{D1}&W_{D2}&\cdots&W_{DH} \end{bmatrix}
[y1?,y2?,?,yH?]=[x1?,x2?,?,xD?]??????W11?W21??WD1??W12?W22??WD2???????W1H?W2H??WDH????????
這里假設我們要計算 L L L對 x x x的導數 ? L ? x \frac{\partial L}{\partial x} ?x?L?,
我們先計算 ? L ? y = [ ? L ? y 1 , ? L ? y 2 , ? ? , ? L ? y H ] \frac{\partial L}{\partial y}=\left[\frac{\partial L}{\partial y_1},\frac{\partial L}{\partial y_2},\cdots,\frac{\partial L}{\partial y_H}\right] ?y?L?=[?y1??L?,?y2??L?,?,?yH??L?]
接著計算
y
y
y對
x
x
x的導數
?
y
?
x
\frac{\partial y}{\partial x}
?x?y?,根據雅克比矩陣,有
?
y
?
x
=
[
?
y
1
?
x
1
?
y
1
?
x
2
?
?
y
1
?
x
D
?
y
2
?
x
1
?
y
2
?
x
2
?
?
y
2
?
x
D
?
?
?
?
?
y
H
?
x
1
?
y
H
?
x
2
?
?
y
H
?
x
D
]
\frac{\partial y}{\partial x}= \begin{bmatrix} \frac{\partial y_1}{\partial x_1 } & \frac{\partial y_1}{\partial x_2} & \cdots & \frac{\partial y_1}{\partial x_D} \\ \frac{\partial y_2}{\partial x_1 } & \frac{\partial y_2}{\partial x_2} & \cdots & \frac{\partial y_2}{\partial x_D} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_H}{\partial x_1 } & \frac{\partial y_H}{\partial x_2} & \cdots & \frac{\partial y_H}{\partial x_D} \end{bmatrix}
?x?y?=????????x1??y1???x1??y2????x1??yH????x2??y1???x2??y2????x2??yH?????????xD??y1???xD??y2????xD??yH??????????
看起來挺復雜,但是如果我們先把
y
y
y中第
j
j
j個元素
y
j
y_j
yj?的等式寫出來,就會很簡單,如:
y
j
=
x
1
?
W
1
j
+
x
2
?
W
2
j
+
?
+
x
i
?
W
i
j
+
?
+
x
D
?
W
D
j
y_j = x_1 \cdot W_{1j} + x_2 \cdot W_{2j} + \cdots +x_i \cdot W_{ij}+ \cdots + x_D \cdot W_{Dj}
yj?=x1??W1j?+x2??W2j?+?+xi??Wij?+?+xD??WDj?
所以
?
y
j
?
x
i
=
W
i
j
\frac{\partial y_j}{\partial x_i} = W_{ij}
?xi??yj??=Wij?,把
?
y
?
x
\frac{\partial y}{\partial x}
?x?y?完整的寫出來,有
?
y
?
x
=
[
W
11
W
21
?
W
D
1
W
12
W
22
?
W
D
2
?
?
?
?
W
1
H
W
2
H
?
W
D
H
]
=
W
T
\frac{\partial y}{\partial x} =\begin{bmatrix} W_{11} & W_{21} & \cdots &W_{D1} \\ W_{12} & W_{22} & \cdots &W_{D2} \\ \vdots & \vdots & \ddots & \vdots \\ W_{1H} & W_{2H} & \cdots & W_{DH} \end{bmatrix} = W^T
?x?y?=??????W11?W12??W1H??W21?W22??W2H???????WD1?WD2??WDH????????=WT
所以
?
y
?
x
=
W
T
\frac{\partial y}{\partial x} = W^T
?x?y?=WT? ,這就解釋了為什么計算矩陣乘法的反向傳播時,有個引數需要轉置的,
有 ? L ? x = ? L ? y ? y ? x = ? L ? y W T \frac{\partial L}{\partial x}= \frac{\partial L}{\partial y} \frac{\partial y}{\partial x} = \frac{\partial L}{\partial y} W^T ?x?L?=?y?L??x?y?=?y?L?WT
x x x的形狀是 1 × D 1 \times D 1×D, ? L ? x \frac{\partial L}{\partial x} ?x?L?的形狀和它保持一致,也是 1 × D 1 \times D 1×D,
? L ? y \frac{\partial L}{\partial y} ?y?L?的形狀和 y y y一樣,是 1 × H 1 \times H 1×H
W T W^T WT的形狀是 H × D H \times D H×D,
在推導上面的公式時,不要被寫法的復雜所迷惑了,只要我們展開把等式寫出來,或者用一個簡單的比如 2 × 3 2 \times 3 2×3的矩陣自己去推,就可以知道規律,
上面把 y j = x 1 ? W 1 j + x 2 ? W 2 j + ? + x i ? W i j + ? + x D ? W D j y_j = x_1 \cdot W_{1j} + x_2 \cdot W_{2j} + \cdots +x_i \cdot W_{ij}+ \cdots + x_D \cdot W_{Dj} yj?=x1??W1j?+x2??W2j?+?+xi??Wij?+?+xD??WDj?寫出來后,計算 ? y j ? x i \frac{\partial y_j}{\partial x_i} ?xi??yj??就很簡單了,因為此時只與 x i x_i xi?有關,對于 x x x剩下的元素的導數都是0,變成了 y j x i = 0 + 0 + ? + W i j + ? + 0 \frac{y_j}{x_i} = 0 + 0 + \cdots + W_{ij} + \cdots + 0 xi?yj??=0+0+?+Wij?+?+0,
下面介紹幾個簡單的一元操作,
Pow
計算 y = x c y= x^c y=xc,我們把 x x x看成是變數, c c c看成是常數,只有一個變數,因此定義為一元操作, ? y ? x = c ? x ( c ? 1 ) \frac{\partial y}{\partial x}=c\cdot x^{(c-1)} ?x?y?=c?x(c?1),一元操作比較簡單,因此正向傳播和反向傳播畫到一張圖里面,

Log
取對數(Log),一般指的是以指數 e e e為底, y = log ? x y = \log x y=logx,那么 ? y ? x = 1 x \frac{\partial y}{\partial x}=\frac{1}{x} ?x?y?=x1?,

Exp
指數函式最簡單了 y = e x y = e^x y=ex, ? y ? x = e x \frac{\partial y}{\partial x} = e^x ?x?y?=ex,原樣回傳,

Neg
Neg是取負數的意思, y = ? x y=-x y=?x, ? y ? x = ? 1 \frac{\partial y}{\partial x} = -1 ?x?y?=?1,可以理解為 y = ? 1 ? x y = -1 \cdot x y=?1?x,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386783.html
標籤:AI
上一篇:什么是深度學習?kears簡介,深度學習常用的三大模型,MLP(多層感知機),CNN(卷積神經網路),RNN(回圈神經網路)
