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%左右),那麼全連接層對模型影響參數就是三個:

  1. 全連接層的總層數長度
  2. 單個全連接層的神經元數寬度
  3. 激活函數
    其中,激活函數暫時先明白他的作用是
    在這裏插入圖片描述
        以上,從全連接層的好處(減少特徵位置對分類帶來的影響)+全連接層的作用(分類)+全連接層對模型影響的主要參數進行了十分淺顯且不知道恰不恰當的舉例,對Fully connected layer有了粗淺的瞭解。

1.2關於全連接層的淺顯理解

    第ll層有N個Nodes,均對用一個output:aila^l_i,其中ii代表第ll層的第ii個神經元的輸出
    把一層layer中的所有output集合起來——就組成了一個vector向量,用ala^l代表第ll層的輸出向量。
在這裏插入圖片描述

    FCL中的每個layer都是兩兩相接的,那neurons和neurons之間的connection有一個weight——wijlw^l_{ij}
其中,上標表示這個連接了第l-1個layer和第l個Layer;下標是指這個weight連接了第l1l-1個layer的第jj個neuronaja_j連接到(箭頭指向)第ll個layer的第ii個neuron.(jj在左邊,ii在右邊)
在這裏插入圖片描述

    依次類推,兩兩neurons之間就有一個weight,由此排成一個矩陣WlW^l.第一個index(即ii)指的是row,第二個index(即jj)指的是column.從而WlW^l的row行的個數就是NlN_l(節點數),WlW^l的column列的個數就是Nl1N_{l-1}(節點數)
(注:第一個index指的是上圖的input layer,第二個index指的是上圖的output layer)
在這裏插入圖片描述
    那麼,現在就構造了一個matrix將所有的weight全都表示。上標ll表示第l1l-1和第ll層的weight_matrix.
    除了weight以外,每個neuron還有一個bias.(我們可以把bias想象成weight的一部分,只是需要在input的地方多加一個1(如下圖所示的1,並將1視爲是weight的一部分),所以有些書就沒有給出bias圖線的部分)將這些bias全部穿起來成一個vector,用blb^l表示第ll個layer組成的bias的vector.
在這裏插入圖片描述
接下來我們要算aila^l_i,即第ll個layer的第ii個neuron的outputaila^l_i,和前一層l1l-1對應的outputajl1a^{l-1}_j有什麼樣的關係。
在計算上面這個關係之前,我們必須先計算zilz^l_i(input of the activation function for neuron i at layer l),同樣,我們用zlz^l表示layer l1l-1到layer ll的所有zilz^l_i構成的vector.
zilz^l_i與他前面層所有的output的關係式
zil=wi1la1l1+wi2la2l1+...+bilz^l_i=w^l_{i1}a^{l-1}_1+w^l_{i2}a^{l-1}_2+...+b^l_i
(即前一層各個neuron的output乘上對應的weight後再加上最後1發出的bias,wi1lw^l_{i1}表示前層的第1個neuron到後層第i個neuron對用的權重)
在這裏插入圖片描述
    現在考慮ll一整個layer的output,那就要考慮al1a^{l-1}ala^l之間的關係,但是計算他們關係這之前,要先計算一下zlz^lal1a^{l-1}的關係。
在這裏插入圖片描述
    如果ij相反的話,即index反過來,那就要將WlW^l加轉置transport。
以上計算了ZlZ^lal1a^{l-1}的關係,那接下來要計算ZlZ^lala^l的關係,從而得到al1a^{l-1}ala^l的關係。
    我們假設ZlZ^lala^l有映射函數σ\sigma滿足:
ail=σ(zil)a^l_i=\sigma(z^l_i)
從而建立一豎排z和一豎排a的關係:
在這裏插入圖片描述
    那麼整理上面三個式子,可以得到layer與layer的輸出關係:
在這裏插入圖片描述

2. Recurrent Structure(RS)

    把同一個structure反覆使用就叫RS…
    因爲我們需要的不同種類的段並不會因爲input的長度而改變,我們需要的參數量永遠都是一樣的。
在這裏插入圖片描述

1.1 RNN

有一個fcn,輸入是兩個vector:input:(h,x)(h,x),輸出也是兩個vector:KaTeX parse error: Expected group after '^' at position 3: (h^̲',y)
(圖中上標表示one、two),要特別注意設計時hhhh'(即圖中的h0h^0h1h^1)它們兩個的dimension是一樣的,你才能夠把他們堆LEGO一樣堆到一起。像這樣依次類推,新的ff吃前面一個ff的output,再產生一個新的yy.所以只要保證dimension一致,針對MIMO我們只需要同一個ff就可以產生無限的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:
b,c=f2(b,y)b',c=f_2(b,y)
注意f2的輸入輸出向量的維度與
h,y=f1(h,x)h',y=f_1(h,x)
向量維度上滿足:
dimension(h)=dimension(h)dimension(h')=dimension(h)
dimension(b)=dimension(b)dimension(b')=dimension(b)
且這裏兩個函數的yy是同一個東西
在這裏插入圖片描述

1.3 Bidirectional RNN (雙向RNN)

    引入第三個function,a,ca,cf3f3的input vector,f3f3存在的目的就是使得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.5ff長什麼樣子?(以最Naive的RNN爲例)

    將輸入的hh'xx分別乘上對應的weight matrix並相加, 代入sigmoid function中便得到輸出hh'.;。如果要得到yy,同樣如圖所示。
    r如果yy是最後的layer,同時希望output是激勵的話,可以加一個softmax function.
在這裏插入圖片描述
注:上面的naive就表示一個最簡單的RNN。

1.6 LSTM (Long Short Term Memory長短時記憶網絡)

    如果從block的角度看,LSTM長的和naive的RNN一樣,有一個input xx,然後naive RNN 有一個inputhh,有一個outputhh,這個outputhh就是要去連接其他的RNN的。那麼在LSTM裏面,它的input有兩個要卡死的vector——ct1c^{t-1}ht1h^{t-1},然後outputctc^{t}hth^{t}去接其他的LSTM.
    總而言之,LSTM比naive RNN多了一個輸入向量,從SISO變成了MIMO。
    但區別就在LSTM的c和h扮演了不同的角色。c的變化很慢,ct1c^{t-1}加了一些什麼(激活函數)才變成ctc^{t};從而不同於h vector,這使得c可以記得比較過去的一些info**(慢的c是劇情主線,快的h是每集劇情)**。
在這裏插入圖片描述

1.6.1 LSTM 架構

    把x和h並在一起變成一個比較長的vector,再乘上一個weight matrix,再取一個activation function激活函數(如這裏的tanh),得到zz。這裏其實可以把WW拆成W1W2W1,W2
W1xt+W2ht1=W(xt+ht1)W_1x^t+W_2h^{t-1}=W(x^t+h^{t-1})
    同樣地取不同weight matrix和不同的激活函數,可以得到不同的zi,zf,zoz^i,z^f,z^o…從而對同一個vector乘上不同的weight matrix可以得到四個不同的z vector.(四個輸入門)
    所以如果能夠把四個weight matrix合併成一個打矩陣,就可以四個部分並行計算了。

在這裏插入圖片描述
接下來c有什麼作用呢?把c也加入到x和h組成的vector中,這個過程稱爲peephole
將W分成三部分對應乘x,h,c如下圖所示,分別乘對應的weight matrixW1W_1 W2W_2 W3W_3
通常強制乘c的矩陣爲diagonal對角矩陣
在這裏插入圖片描述
那麼有了這四個vector,接下來我們要做的就是將z與ziz^i相乘,把ct1c^{t-1}zfz^f相乘(向量乘法——對應元素element逐個相乘)
將兩部分相乘的結果相加,(這裏ziz^i就是input gate,決定z的information能不能留進去,zfz^f就是forget gate,決定cc的memory能不能夠被傳到下一個時間點),相加之後就得到下一個時間點的outputctc^t
這裏c是細胞狀態cell的縮寫,f是forget門的縮寫
ctc^t取雙曲hyperbolic函數並與zoz^o相乘,得到outputhth^t
最後將hth^t乘一個matrix再取sigmode function得到yty^t

接下來將LSTM和RNN一樣作爲一個block使用,將c,h作爲block之間的input/output,element size規則不變…從而得到ct+1yt+1,ht+1c^{t+1},y^{t+1},h^{t+1}
在這裏插入圖片描述

1.7 GRU (Gated Recurrent Unit)

與naive RNN相比GRU的input和output在外觀上一樣,但是內部與LSTM一樣。
把h與x並在一起,再通過weight matrix送入sigmode function得到r(reset gate)
r=σ(W(ht1xt))r=\sigma(W(h^{t-1}x^{t}))
同樣更換不同的weight matrix得到zz

rrht1h^{t-1}並在一起得到的某個vector再與xtx^t這個vector乘第三個matrix得到東西並在一起得到hth^t
在這裏插入圖片描述
再將兩向量zzht1h^{t-1}做element wise 相乘得到A
再將1z1-zhth^{t}做element wise 相乘得到B
在這裏插入圖片描述
再A+B,得到hth^t,再將hth^t乘上一個matrix(灰色大箭頭,這裏不同顏色的大箭頭表示不同的matrix)得到yty^t
在這裏插入圖片描述

1.8 GRU與LSTM

LSTM有四個Matrix,GRU有三個Matrix(這塊暫時沒算上灰色大箭頭代表的matrix),所以GRU用的參數比LSTM少,從而不容易overfitted.
在這裏插入圖片描述
LSTM是先f(忘記),然後再i和z(進行更新cell),然後output進行輸出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章