B站學習法之深度學習筆記一
Three Steps for Deep Learning
Step 1. A neural network is a function compose of simple functions (neurons)
神經元=simple fcn
神經網絡=fcn
通常需要自己決定網絡的structure,and let machine find parameters from data.
所以我們要focused 就是有哪些常見的structure.
Step 2. 定好structure和para後就要定cost function——什麼樣的network參數是好的?什麼樣的network的參數又是不好的?那麼如何定cost fcn呢?
那當然是case by case,取決於你要處理的問題和你手上的data(訓練數據)
Step 3. 有了上面兩個步驟之後,我們就用gradient descent(梯度下降)找到一個最好的fcn
接下來開頭課程的outline
1.Fully connected layer(全連接層)
1.1關於全連接層的淺顯理解
對全連接層的理解參考了這篇原創文章[link]https://blog.csdn.net/m0_37407756/article/details/80904580
理解:例如經過卷積,relu後得到3x3x5的輸出。
那它是怎麼樣把3x3x5的輸出,轉換成1x4096的形式?
很簡單,可以理解爲在中間做了一個卷積。
從上圖我們可以看出,我們用一個3x3x5的filter 去卷積激活函數的輸出,得到的結果就是一個fully connected layer 的一個神經元的輸出,這個輸出就是一個值。因爲我們有4096個神經元。我們實際就是用一個3x3x5x4096的卷積層去卷積激活函數的輸出。
以VGG-16再舉個例子吧,
對224x224x3的輸入,最後一層卷積可得輸出爲7x7x512,如後層是一層含4096個神經元的FC,則可用卷積核爲7x7x512x4096的全局卷積來實現這一全連接運算過程。
它把特徵representation整合到一起,輸出爲一個值。
那麼全連接層這樣做,有什麼好處?
好處就是大大減少特徵位置對分類帶來的影響,不能理解?沒關係,繼續舉例理解:
舉個簡單的例子:
從上圖我們可以看出,貓在不同的位置,輸出的feature值相同,但是位置不同。
對於電腦來說,特徵值相同,但是特徵值位置不同,那分類結果也可能不一樣。所以爲了避免上圖中Feature Map的位置不同引起電腦分類不一樣的後果,全連接層filter的作用就相當於告訴電腦——
喵在哪我不管,我只要喵,於是我讓filter去把這個喵找到,實際就是把Feature map 整合成一個值,這個值大,有喵,這個值小,那就可能沒喵,和這個喵在哪關係不大了,魯棒性有大大增強。
在實際使用當中,全連接層中一層的一個神經元可以看成一個多項式,我們用許多神經元去擬合數據分佈。但是隻用一層fully connected layer 有時候沒法解決非線性問題,那麼如果有兩層或以上fully connected layer就可以很好地解決非線性問題了
再舉一個例子說明很好地解決非線性問題:
我們都知道,全連接層之前的作用是提取特徵
全連接層的作用是分類
我們現在的任務是去區別一圖片是不是貓
假設現在神經網絡模型已經訓練完了,全連接層已經知道了,並表示:當我們檢測到以下特徵時,我就可以判斷這個東東是貓了。
因爲全連接層的作用主要就是實現分類(Classification)
從下圖,我們可以看出
紅色的神經元表示這個特徵被找到了(激活了)
同一層的其他神經元,要麼貓的特徵不明顯,要麼沒找到
當我們把這些找到的特徵組合在一起後發現最符合要求的是貓——ok,我認爲這是貓了。
再比如說區別貓頭:
道理和區別貓一樣
當我們找到這些特徵,神經元就被激活了(上圖紅色圓圈)
注:這些細節特徵又是怎麼來的?——是從前面的卷積層,下采樣層來的
全連接層參數特多(可佔整個網絡參數80%左右),那麼全連接層對模型影響參數就是三個:
- 全連接層的總層數(長度)
- 單個全連接層的神經元數(寬度)
- 激活函數
其中,激活函數暫時先明白他的作用是
以上,從全連接層的好處(減少特徵位置對分類帶來的影響)+全連接層的作用(分類)+全連接層對模型影響的主要參數進行了十分淺顯且不知道恰不恰當的舉例,對Fully connected layer有了粗淺的瞭解。
1.2關於全連接層的淺顯理解
第層有N個Nodes,均對用一個output:,其中代表第層的第個神經元的輸出
把一層layer中的所有output集合起來——就組成了一個vector向量,用代表第層的輸出向量。
FCL中的每個layer都是兩兩相接的,那neurons和neurons之間的connection有一個weight——
其中,上標表示這個連接了第l-1個layer和第l個Layer;下標是指這個weight連接了第個layer的第個neuron連接到(箭頭指向)第個layer的第個neuron.(在左邊,在右邊)
依次類推,兩兩neurons之間就有一個weight,由此排成一個矩陣.第一個index(即)指的是row,第二個index(即)指的是column.從而的row行的個數就是(節點數),的column列的個數就是(節點數)
(注:第一個index指的是上圖的input layer,第二個index指的是上圖的output layer)
那麼,現在就構造了一個matrix將所有的weight全都表示。上標表示第和第層的weight_matrix.
除了weight以外,每個neuron還有一個bias.(我們可以把bias想象成weight的一部分,只是需要在input的地方多加一個1(如下圖所示的1,並將1視爲是weight的一部分),所以有些書就沒有給出bias圖線的部分)將這些bias全部穿起來成一個vector,用表示第個layer組成的bias的vector.
接下來我們要算,即第個layer的第個neuron的output,和前一層對應的output有什麼樣的關係。
在計算上面這個關係之前,我們必須先計算(input of the activation function for neuron i at layer l),同樣,我們用表示layer 到layer 的所有構成的vector.
與他前面層所有的output的關係式
(即前一層各個neuron的output乘上對應的weight後再加上最後1發出的bias,表示前層的第1個neuron到後層第i個neuron對用的權重)
現在考慮一整個layer的output,那就要考慮和之間的關係,但是計算他們關係這之前,要先計算一下與的關係。
如果ij相反的話,即index反過來,那就要將加轉置transport。
以上計算了與的關係,那接下來要計算與的關係,從而得到與的關係。
我們假設到有映射函數滿足:
從而建立一豎排z和一豎排a的關係:
那麼整理上面三個式子,可以得到layer與layer的輸出關係:
2. Recurrent Structure(RS)
把同一個structure反覆使用就叫RS…
因爲我們需要的不同種類的段並不會因爲input的長度而改變,我們需要的參數量永遠都是一樣的。
1.1 RNN
有一個fcn,輸入是兩個vector:input:,輸出也是兩個vector:KaTeX parse error: Expected group after '^' at position 3: (h^̲',y)。
(圖中上標表示one、two),要特別注意設計時和(即圖中的和)它們兩個的dimension是一樣的,你才能夠把他們堆LEGO一樣堆到一起。像這樣依次類推,新的吃前面一個的output,再產生一個新的.所以只要保證dimension一致,針對MIMO我們只需要同一個就可以產生無限的input/output。
注:如果我們用feedforward network解這個問題,input x1,x2,x3;output y1,y2,y3.那麼當然可以做得到——把x1,x2,x3接起來拼成一個比較長的sequence,再丟到feedforwardnetwork裏面,讓它吐一個比較長的y1y2y3,但是如果sequence非常長,這時候將x1~x100都拼起來,那這個前饋神經網絡它至少在input_layer的地方要很大才能吃的下——參數一多就會導致overfitted(過擬合)
所以RNN的好處就是便於處理序列,因爲它需要很少的參數就能處理這樣的問題。
1.2 Deep RNN
在RNN的基礎上,引入一個新的fcn:
注意f2的輸入輸出向量的維度與
向量維度上滿足:
且這裏兩個函數的是同一個東西
1.3 Bidirectional RNN (雙向RNN)
引入第三個function,爲的input vector,存在的目的就是使得f1與f2的output合在一起.
1.4 Pyramidal RNN (金字塔RNN)
首先每層塔的白框均代表一個function所形成的MIMO系統,且可以觀察到同層的白框兩兩之間的雙向箭頭就表示兩者相互構成Bidirectional RNN.這是W.Chan用Sequence2Sequence硬做一個語音辨識的網絡。因爲語音辨識一般是input:Sequence,然後output 一個 character sequence.所以這裏就硬train下去,並在paper說這樣做真的可以語音辨識。在Paper中提到了一個很重要的trick:讓Seq2Seq能做出來的原因
第二層的每個block吃前面一個層的幾個layer的好幾個output,隨着Deep的RNN越來越深,那麼迭代得到的Sequence就越來越短。
但是每一個block運算量變多了,運算量會不會變複雜?其實從平行運算的角度看,一個Seq是沒有辦法平行運算的,但是一個block卻可以實現平行運算。
1.5長什麼樣子?(以最Naive的RNN爲例)
將輸入的和分別乘上對應的weight matrix並相加, 代入sigmoid function中便得到輸出.;。如果要得到,同樣如圖所示。
r如果是最後的layer,同時希望output是激勵的話,可以加一個softmax function.
注:上面的naive就表示一個最簡單的RNN。
1.6 LSTM (Long Short Term Memory長短時記憶網絡)
如果從block的角度看,LSTM長的和naive的RNN一樣,有一個input ,然後naive RNN 有一個input,有一個output,這個output就是要去連接其他的RNN的。那麼在LSTM裏面,它的input有兩個要卡死的vector——和,然後output和去接其他的LSTM.
總而言之,LSTM比naive RNN多了一個輸入向量,從SISO變成了MIMO。
但區別就在LSTM的c和h扮演了不同的角色。c的變化很慢,加了一些什麼(激活函數)才變成;從而不同於h vector,這使得c可以記得比較過去的一些info**(慢的c是劇情主線,快的h是每集劇情)**。
1.6.1 LSTM 架構
把x和h並在一起變成一個比較長的vector,再乘上一個weight matrix,再取一個activation function激活函數(如這裏的tanh),得到。這裏其實可以把拆成
同樣地取不同weight matrix和不同的激活函數,可以得到不同的…從而對同一個vector乘上不同的weight matrix可以得到四個不同的z vector.(四個輸入門)
所以如果能夠把四個weight matrix合併成一個打矩陣,就可以四個部分並行計算了。
接下來c有什麼作用呢?把c也加入到x和h組成的vector中,這個過程稱爲peephole
將W分成三部分對應乘x,h,c如下圖所示,分別乘對應的weight matrix
通常強制乘c的矩陣爲diagonal對角矩陣
那麼有了這四個vector,接下來我們要做的就是將z與相乘,把與相乘(向量乘法——對應元素element逐個相乘)
將兩部分相乘的結果相加,(這裏就是input gate,決定z的information能不能留進去,就是forget gate,決定的memory能不能夠被傳到下一個時間點),相加之後就得到下一個時間點的output
這裏c是細胞狀態cell的縮寫,f是forget門的縮寫
將取雙曲hyperbolic函數並與相乘,得到output
最後將乘一個matrix再取sigmode function得到
接下來將LSTM和RNN一樣作爲一個block使用,將c,h作爲block之間的input/output,element size規則不變…從而得到
1.7 GRU (Gated Recurrent Unit)
與naive RNN相比GRU的input和output在外觀上一樣,但是內部與LSTM一樣。
把h與x並在一起,再通過weight matrix送入sigmode function得到r(reset gate)
同樣更換不同的weight matrix得到
將與並在一起得到的某個vector再與這個vector乘第三個matrix得到東西並在一起得到
再將兩向量與做element wise 相乘得到A
再將與做element wise 相乘得到B
再A+B,得到,再將乘上一個matrix(灰色大箭頭,這裏不同顏色的大箭頭表示不同的matrix)得到
1.8 GRU與LSTM
LSTM有四個Matrix,GRU有三個Matrix(這塊暫時沒算上灰色大箭頭代表的matrix),所以GRU用的參數比LSTM少,從而不容易overfitted.
LSTM是先f(忘記),然後再i和z(進行更新cell),然後output進行輸出。