cs231n spring 2017 lecture4 聽課筆記
1. Backpropagation:沿著computational graph利用鏈式法則求導。每個神經元有兩個輸入x、y,一個輸出z,好多層這種神經元連接起來,這時候已知?L/?z,可以求出?L/?x = ?L/?z * ?z/?x,?L/?y = ?L/?z * ?z/?y。靠這種方式可以計算出最終的loss function相對於最開始的輸入的導數。
這種方法的好處是,每個神經元都是很簡單的運算(比如加、減、乘、除、指數、sigmoid等),它們導數的解析式是很容易求解的,用鏈式法則連乘起來就得到了我們需要的導數。如果直接求的話會很復雜很難求。
2. Add(x, y)是gradient distributor,把後面神經元的導數反向傳遞給x和y。
Max(x, y)是gradient router,它只會反向傳遞給x、y中大的那一個。可以這麽直觀的理解,由於只有x、y中大的那個數被傳遞到後面的神經元對最後結果產生影響,所以在反向傳遞的時候,也只會評估x、y中大的那個數。
Mul(x, y)是gradient switcher,它把後面神經元的導數分別傳遞給x和y,傳給x的部分乘以y,傳給y的部分乘以x。
想想求導公式就明白了。
3. 對於一個輸入x,兩個輸出y、z的神經元,反向傳遞求導的時候,是把從y和z兩路反向傳遞過來的導數求和。
4. 如果x、y、z等元素都不是標量,而是向量,則求導全部都變成了雅克比矩陣。對於一個4096維輸入,4096維輸出的系統,雅克比大小為4096*4096,如果minibatch裏100個采樣,則雅克比變成了409600*409600大小,運算很麻煩。但如果知道輸出的某個元素只和輸入的某些元素相關,則求偏導的時候只有相關項有值,其他都是0,這個性質可以被用來加速計算。極端的情況,如果輸入和輸出一一對應,則雅克比是對角矩陣。
5. 深度學習框架(比如Caffe等)的API裏,會定義不同的layer,每種layer就是搭神經網絡的積木(也就是上文說的神經元節點),每種layer會有自己的forward()/backward()函數,分別用來正向的從輸入求出輸出,和反向的求loss funciton對這個節點輸入的導數。
6. 神經網絡,從函數的角度說就是復合函數,把簡單函數一層層堆疊起來。例如線性函數f=Wx,則兩層的神經網絡可能是f=W2max(0,W1x),三層的網絡可能是f=W3max(0, W2max(0,W1x))。直觀地說,比如在物體分類的問題中,第一層網絡訓練出的權重可能是一個紅色的車的template,而第二層網絡的權重可能是不同的顏色,這樣兩層網絡就實現了泛化預測各種顏色的車的目的。
7. 從生物學的角度看,sigmoid函數是非常有道理的,它意味著輸入進來的信號不夠強的時候輸出為0,神經元沒有被激活,足夠強之後,神經元被激活從而產生輸出。ReLU:f(x) = max(0, x)也是同樣的想法。這些都是“激活函數”。所以深度學習中實際構造的神經元,通常是一個線性單元復合一個激活函數sigmoid(Wx+b)。
8. 雖然深度學習從腦科學得到了很多啟發,但是我們要謹慎的把兩者做直接類比,因為生物神經元要復雜的多。
cs231n spring 2017 lecture4 聽課筆記