1. 程式人生 > >2017CS231n李飛飛深度視覺識別筆記(十)——迴圈神經網路

2017CS231n李飛飛深度視覺識別筆記(十)——迴圈神經網路

第十講 迴圈神經網路

課時1 RNN,LSTM,GRU

    上一章中討論了CNN的架構有關內容,這一節中將討論有關RNN的內容。

    在之前的學習中,提到了一種稱為vanilla的前饋網路,所有網路架構都有這種基礎架構,會接收一些輸入,輸入是固定尺寸的物件,比如一幅圖片或一片向量,它在通過一些隱藏層後給出單一的輸出結果,比如一個分類;但是在機器學習中,有時候希望有更加靈活的機器能夠處理的資料型別,所以這時候RNN就有了很大的發揮空間,用RNN來處理各種型別的輸入和輸出資料,一旦使用RNN,就可以實現1對多模型、多對1,模型以及多對多模型。

    因此,RNN非常重要,即使對有固定輸入大小和固定輸出大小的問題,RNN也同樣很有用,例如想要對輸入進行序列化處理,收到了一個固定大小的輸入,如一幅影象,要做出分類決策,即影象中的數字是多少,這裡將不是做單一的前向傳播,而是看看圖片,觀察圖片的各種不同部分,然後在完成一組觀察後作出最終決策。

    總體而言,每個RNN網路都有一個小小的迴圈核心單元,它把x作為輸入,將其傳入RNN,RNN有一個內部隱藏態,這一隱藏態會在RNN每次讀取新的輸入時更新,然後當模型下一次讀取輸入時,這一內部隱藏態會將結果反饋至模型。

    這個迴圈過程的計算公式:在RNN模組中對某種迴圈關係用f函式進行了計算,這一f函式依賴權重W,它接收隱藏態和當前態,然後會輸出下一個隱藏態或者更新後的隱藏態,稱為

    當讀取下一個輸入時,這個新的隱藏態將作為輸入傳入同一個函式,同時讀取下一個輸入,如果想要在網路的每一步產生輸出,那麼可以增加全連線層,每一步將作為輸入,根據,每一步的隱藏態來做出決策。

    RNN的計算圖如下:

    在每個計算步長中,重複使用這相同的權重矩陣,所以看到這個塊每次在接收不同的h和不同的x,但都在使用相同的w權重;如果將反向傳播的原理應用到這個模型中,會得到在每一個時步下計算出的梯度,最終的w梯度是所有時步下獨立計算出的梯度之和;同樣可以直接把寫在計算圖上,這樣每個計算步長下輸出的重新作為輸入給之後的神經網路輸出該時步下的,然後可以計算每個時步對應的損失值,得到每個時步的損失值後將它們加起來得到最終損失。

課時2 語言模型

    下面舉一個具體的例子,它會經常被應用到遞迴神經網路的領域,這個問題就是語言模型。

    在語言模型的問題中,我們想要讀取一些語句從而讓神經網路在一定程度上學會生成自然語言,這在字元水平上是可行的,讓模型逐個生成字元,同樣可以在單詞層面上讓模型逐個生成單詞。

    想象一個字元級的語言模型,網路會讀取一串字元序列,然後需要去預測這個文字流的下一個字元是什麼,在這裡有很小的字元表helo以及訓練序列樣例 “hello”,在這個語言模型的訓練階段,將這個字元序列作為輸入項,考慮每個輸入例項是一個字母,所以要想辦法在神經網路中表示這些字母,找出在神經網路中整個單詞的表示方式,這個例子中的表示方式如下:

    然後隨著網路的前向傳播,該輸入進入一個RNN單元內,之後輸出,即網路對組成單詞的每個字母的預測,也就是認為接下來最可能出現的字母。

    不斷重複上述的過程,如果用不同的字母序列去訓練這個模型,最終它會學習如何基於之前出現過的字元來預測接下來出現的字元。

    考慮模型在之後的測試階段會發生什麼,我們可能會用該模型測試一下樣本,並使用這個訓練好的神經網路模型去生成新的文字;採用的方法是通過輸入一些文字的字首來測試這個模型,在這個例項中,這些字首只是一個字母h,在遞迴神經網路的第一步輸入字母h,它會產生一個基於詞庫中所有的字母得分的分佈,在訓練階段,使用這些得分去輸出一個結果,所以使用一個softmax函式,把這些得分轉換為一個概率分佈,然後從這些概率分佈中得到樣本輸出去生成序列中的第二個字母。

    在實際的反向傳播過程中,通常採用一種近似方法,稱之為沿時間截斷反向傳播方法,這個方法的思想是即使輸入序列很長,甚至趨近於無限,採用的方法是在訓練模型時前向計算若干步,也就是會計算機若干子序列的損失值,然後沿著這個子序列反向傳播誤差,並計算梯度更新引數,重複此過程;

    沿時間截斷反向傳播方法是一種近似估計梯度的方法,這種方法不用反向傳播遍歷本來非常長的序列。

課時3 影象標註

    在之前的學習內容中多次提到了影象標註模型,想訓練一個模型用來輸入一個影象,然後輸出自然語言的影象語義資訊。

    這裡的輸出語義資訊可能是可變長度的字元序列,可能不同的標籤有不同的字母數量,所以這很適用於RNN模型,因為模型看上去有一部分卷積網路用來處理輸入的影象資訊,還有很多這個位置工作的卷積神經網路,它們將產生影象的特徵向量,然後輸入到接下來的迴圈神經網路語言模型的第一個時序。

    這是之前看到過的字元級語言模型,把影象輸入通過卷積神經網路,用末尾的4096維的向量作為第一個初始化輸入,得到詞彙表中的所有分數的分佈,從分佈中取樣並在下一次時間步時當作輸入傳回,最後就能生成完整的句子。

    經過這些訓練之後,可以得到很好的結果,如下:

    接下來將討論一個稍微高階的模型:注意力模型。

    通常的方式是相比於產生一個單獨的向量來整合整個影象,卷及網路傾向於產生由向量構成的網路,即可能從每個圖片中特殊的地方都用一個向量表示,當把這個模型向前執行時,除了在每一步中取樣,也會產生一個分佈,即在影象中它想要看的位置,影象位置的分佈可以看成是一種模型在訓練過程中應該關注哪裡的張量;第一個隱藏狀態計算在圖片位置上的分佈,它將會回到向量集合,給出一個概要向量,這可能會把注意力集中在影象的一部分上;現在這個概要向量得到了反饋作為神經網路下一時間步的額外輸入,將會產生兩個輸出:一個是詞彙表上的分佈;一個是影象位置的分佈;整個過程重複繼續下去:

    當訓練完模型後,可以看到它會在影象中轉移注意力,在生成每個圖片標題的單詞時,可以看到它生成標題:A bird flying over a body of water.但是可以看到它的注意力在圖片中的不同地方變換。

課時4 視覺問答

    模型準備將兩個東西輸入:影象和輸入自然語言描述的問題;如下圖:

    可以將這個認為是CNN和RNN連線起來得到的模型,模型需要將自然語言序列作為輸入;可以設想針對輸入問題的每個元素建立遞迴神經網路,從而將輸入的問題概括為一個向量,然後可以用CNN將影象也概括(為一個向量),現在CNN把得出的向量和輸入問題的向量結合,通過RNN程式設計預測答案的概率分佈,有時候會把soft attention也結合到視覺問答之中。

    目前為止,討論的單層遞迴神經網路只有一種隱藏狀態,另一種經常會見到的是多層遞迴神經網路,如下圖中的3層迴圈神經網路結構:

    下面給出了Vanilla的基本函式形式:

    當嘗試計算梯度時,反向傳播在這個結構中如何進行,在反向傳播過程中,會得到的導數以及關於的損失函式的導數,在反向傳播通過這個單元時,需要計算關於的損失函式導數:

    意味著經過其中一個Vanilla遞迴神經網路單元時,實際是和部分權重矩陣相乘,可以設想把許多遞迴神經網路單元連線成一個序列。梯度流穿過一系列這樣的層會發生什麼呢?

    當要計算關於的損失函式的梯度時,反向傳播需要經過遞迴神經網路的每一個單元,每次反向傳播經過一個單元時都要使用其中某一個W的轉置,這意味著最終的表示式對的梯度的表示式將會包含很多權重矩陣因子。

    這裡有一個常用的方法來解決梯度爆炸的問題,稱為梯度截斷;在計算梯度後,如果梯度L2正規化大於某個閾值,就將它剪斷並做除法,這樣梯度就有最大閾值;

    而對於梯度消失的問題,常用的方法是改變為更加複雜的RNN結構;

    這也就是使用LSTM的原因,即長短期記憶網路;它是遞迴神經網路的一種更高階的遞迴結構,LSTM常被設計用來緩解梯度消失和梯度爆炸的問題。

    LSTM的函式形式如下:

    之前提到的vanilla遞迴神經網路,它具備隱藏狀態,在每個時間步中,利用遞迴關係來更新隱藏狀態;現在考慮LSTM,在每個時間步中都維持兩個隱藏狀態:一個是,另一個是叫做單元狀態,這個叫單元狀態的向量相當於保留在LSTM內部的隱藏狀態並且不會完全暴露到外部去。

    在LSTM中第一件事就是給定前一時刻的隱藏狀態和當前時刻的輸入向量,然後拿上一時間步的隱藏狀態和當前的輸入堆疊在一起,然後乘上一個非常大的權重矩陣W,計算得到4個不同的門向量,可以注意到4個門都用了不同的非線性函式。

    LSTM的示意圖如下:

    使用LSTM進行反向傳播時,通過單元狀態的路徑是一種梯度高速公路,它使梯度相對暢通無阻地從模型的末端的損失函式返回到模型最開始的初始單元狀態。

    因此會發現LSTM實際上跟殘差網路非常相似,在殘差網路中有一條反向穿過網路的身份認證連結路徑,它為梯度反向傳播提供了一條高速公路:

    在自然環境中還會看見許多迴圈神經網路結構的其他型別的變化,比如GRU稱之為門控迴圈單元,MUT等;

    總結:

    迴圈神經網路可以幫助解決大量新的問題,它們有時候容易受到梯度消失或者梯度爆炸的影響,但是可以通過權重裁剪和精妙的網路結構來解決;在神經網路和迴圈神經網路之間有很多重疊的部分,有助於更好的理解。