李理 自動梯度求解 反向傳播演算法的另外一種視角

2021-08-19 12:47:58 字數 2416 閱讀 8857

本系列文章面向深度學習研發者,希望通過image caption generation,乙個有意思的具體任務,深入淺出地介紹深度學習的知識。本系列文章涉及到很多深度學習流行的模型,如cnn,rnn/lstm,attention等。本文為第四篇。

目前就職於環信,即時通訊雲平台和全**智慧型客服平台,在環信從事智慧型客服和智慧型機械人相關工作,致力於用深度學習來提高智慧型機械人的效能。

李理:從image caption generation理解深度學習(part ii)

李理:從image caption generation理解深度學習(part iii)

前面我們講過了反向傳播演算法的詳細推導過程,大家可能會覺得有些複雜。事實上其實就是鏈式求導法則的應用。今天我們將會繼續討論這個問題,不過是從computational graphs的角度,也就是我們之前說過的自動求導(automatic differentiation or reverse-mode differentiation)。並且通過cs231n的assignment2來學習使用這種方法,通過這種方法來實現乙個多層的神經網路。

首先我們介紹一篇部落格文章: 基本是翻譯過來,不過部分地方是我自己的理解,建議讀者結合這篇文章一起閱讀。

反向傳播演算法是神經網路的核心演算法,不過這個演算法在不同的領域被多次」發現「過,因此有不同的名稱。

考慮乙個簡單的函式 e=(a+b)∗(b+1)e=(a+b)∗(b+1) 。這個函式有兩個操作(函式),加法和乘法。為了指代方便,我們引入兩個中間變數,c和d。

下面我們把它畫成乙個計算圖,每乙個操作是圖中乙個節點,最基本的變數a和b也是乙個節點。每個節點和它的輸入變數直接有一條邊。比如d的輸入變數是b,那麼d和b直接就有一條邊。

任何乙個顯示定義的函式(隱函式不行,不過我們定義的神經網路肯定不會通過隱函式來定義)都可以分解為乙個有向無環圖(樹),其中葉子節點是最基本的無依賴的自變數,而中間節點是我們引入的中間變數,而樹根就是我們的函式。比如上面的例子,計算圖如下所示:

給定每乙個自變數的值,我們可以計算最終的函式值,對應與神經網路就是feedforward計算。具體用」演算法「怎麼計算呢?首先因為計算圖是乙個有向無環圖,因此我們可以拓撲排序,先是葉子節點a和b,他們的值已經給定,然後刪除a和b出發的邊,然後c和d沒有任何未知依賴,可以計算,最後計算e。計算過程如下圖:

首先我們可以計算每條邊上的導數,也就是邊的終點對起點的導數,而且導數是在起點的取前向計算值時的導數,具體過程如圖所示:

有些邊的導數不依賴於輸入的值,比如:

但是還有很多邊的導數是依賴於輸入值的,比如:

因為在「前向」計算的過程中,每個節點的值都計算出來了,所以邊的計算很簡單,也不需要按照什麼的順序。

不過我們一般比較感興趣的是最終函式對某個自變數的導數,比如

根據鏈式法則,只要找到這兩個節點的所有路徑,然後把路徑的邊乘起來就得到這條邊的值,然後把所有邊加起來就可以了。

比如上面的例子b到e有兩條路徑:b->c->e和b->d->e,所以

如果用「鏈式」法則來寫就是

路徑反過來而已。

使用上面的方法,我們可以計算任何乙個點(上面的變數)對另外乙個點(上面的變數)的導數。不過我們一般的情況是計算樹根對所有葉子的導數,當然我們可以使用上面的演算法乙個乙個計算,但是這樣會有很多重複的計算。

比如a->e的路徑是 a->c->e,b->e有一條邊是b->c->e,其中c->e是重複的【這個例子不太好,我們可以想像c->e是一條很長的路徑】,每次都重複計算c->e這個「子」路徑是多餘的。我們可以從後往前計算,也就是每個節點都是存放樹根變數(這個例子是e)對當前節點的導數(其實也就是樹根到當前節點的所有路徑的和)。

計算流程文字描述如下:

首先還是對這個圖進行拓撲排序,不過是反過來。

首先是這個沒什麼好說的。

然後計算

然後計算

然後計算

計算如果我們需要計算每乙個變數對某乙個變數的導數,就可以使用前向計算的方法。不過我們的神經網路都是相反——計算某個乙個變數(一般是損失函式)對所有變數的導數,所以這裡就不詳細介紹了。

至此,本系列文章的第四部分告一段落。在接下來的文章中,作者將為大家詳細講述關於optimization、常見的深度學習框架/工具的使用方法、使用自動求導來實現多層神經網路等內容,敬請期待。

Tensorflow 卷積的梯度反向傳播

我們分兩種不同的情況討論valid卷積的梯度 第一種情況,在已知卷積核的情況下,對未知張量求導 即對張量中每乙個變數求導 第二種情況,在已知張量的情況下,對未知卷積核求導 即對卷積核中每乙個變數求導 1.已知卷積核,對未知張量求導 我們用乙個簡單的例子理解valid卷積的梯度反向傳播。假設有乙個3x...

Tensorflow 卷積的梯度反向傳播

我們分兩種不同的情況討論valid卷積的梯度 第一種情況,在已知卷積核的情況下,對未知張量求導 即對張量中每乙個變數求導 第二種情況,在已知張量的情況下,對未知卷積核求導 即對卷積核中每乙個變數求導 1.已知卷積核,對未知張量求導 我們用乙個簡單的例子理解valid卷積的梯度反向傳播。假設有乙個3x...

反向傳播演算法 反向傳播演算法的工作原理(2)

推薦圖書 資料準備和特徵工程 在第一部分 反向傳播演算法的工作原理 1 已經得到了如下結論,本文將在前述基礎上,做進一步的證明和解釋。其中 是乙個方陣,其對角線是 非對角線項為零。請注意,此矩陣通過矩陣乘法作用於 有上面糧食,可得 對於熟悉矩陣乘法的讀者來說,這個方程可能比 bp1 和 bp2 更容...