【NLP】Day 15: 圓圓圈圈圓圓~深度學習:循環神經網路 RNN

對啊,這也是一種世界。也是我心中的可能性。現在的我並不只是我,還可以有很多種自我。
《新世紀福音戰士》碇真嗣

循環神經網路(Recurrent Neural Network),作為神經網路的其中一種變體,是在所有神經網路的模型中,最常被拿來應用在自然語言處理任務的模型之一。原因有二,首先,相對於其他的神經網路模型,循環神經網路模型的輸入資料較為彈性,意即當其他的神經網路只能接受固定的字數時,循環神經網路亦能透過不同長度的文本輸入進行訓練;二,語言中我們常說要了解上下文、語境,才能對語言有更完善的判斷,而循環神經網路的記憶功能就可以做到考慮文本上下文的效果。因為以上兩種原因,循環神經網路才會是所有神經網路中最常應用在自然語言處理上的深度學習模型。讓我們一起來看看為什麼吧!

基本結構

在正式進入架構之前,要先將循環神經網路跟其他神經網路進行區別。跟先前所介紹的神經網路模型相同,一個完整的循環神經網路模型同樣也有輸入層、隱藏層,以及輸出層,但既然基本架構都相同,那最關鍵的差異點在哪裡呢?我們先來觀察以下這兩張圖。上圖是人工神經網路,https://chart.googleapis.com/chart?cht=tx&chl=x是輸入, https://chart.googleapis.com/chart?cht=tx&chl=y 是輸出;下圖則是循環神經網路, https://chart.googleapis.com/chart?cht=tx&chl=x 是輸入,https://chart.googleapis.com/chart?cht=tx&chl=o 則是輸出,其中https://chart.googleapis.com/chart?cht=tx&chl=s是隱藏層。

Credit: Speech and Language Processing

Credit: kdnuggets.com

不知道大家有沒有發現到,這兩張圖之中最大的差異就在於,循環神經網路的隱藏層會自我循環,也就是說,若將隱藏層拆開來看的話,隱藏層中的節點會接收上一個隱藏層節點所傳過來的權重。也就是說,對資料的每一個節點來說,就像是碇真嗣所說:「現在的我並不只是我,同時也包含了過去到現在的很多種自我。」所以我們重新回來看神經網路的圖示架構可以發現,正是因為這樣的特性,循環神經網路才有記憶的功能。

理解循環神經網路最大的特色之後,再讓我們回來看其中的數學運算原理。其實除了隱藏層之間的連接特性之外,循環神經網路的計算也跟一般的神經網路大同小異。首先是輸入資料https://chart.googleapis.com/chart?cht=tx&chl=x_t與權重https://chart.googleapis.com/chart?cht=tx&chl=W相乘,接著再跟上一個隱藏層神經元所學習到的資訊https://chart.googleapis.com/chart?cht=tx&chl=h_%7Bt-1%7D與權重https://chart.googleapis.com/chart?cht=tx&chl=U相乘,再把兩者相加,把相加之後的值加入激勵函數https://chart.googleapis.com/chart?cht=tx&chl=g,稱為當下隱藏層的輸出https://chart.googleapis.com/chart?cht=tx&chl=h_t,接著當下的輸出層即是隱藏層輸出乘上另一個權重https://chart.googleapis.com/chart?cht=tx&chl=V,再經由激勵函數產生輸出https://chart.googleapis.com/chart?cht=tx&chl=y_t

應用

除此之外,循環神經網路彈性的輸入與輸出特性,也讓我們在各種下游任務間來去自如,其輸入與輸出及對應的功能如下:

  1. 一對一(one to one):輸入(input)及輸出(output)皆為固定,例如文本分類時輸出機率等。
  2. 一對多(one to many):單一的輸入,但是可以有複數個輸出,例如文本生成,給予一個主題,使模型透過這個主題生成一串文本。
  3. 多對一(many to one):多個輸入,但只有單一輸出,例如情感分析(Sentiment Analysis),我們可以輸入任一一段文字,並使模型判斷這段文字正面以及負面情緒的程度。
  4. 多對多(many to many):複數個輸入,複數個輸出,例如機器翻譯(Machine Translation),輸入一段外國語言的句子,模型將這段話翻譯成中文。

問題與限制

  • 語意限制
    前面提過,循環神經網路有記憶的特性,因此可以將上下文也考慮進去。但其實嚴格來說,如你們在圖中所見,隱藏層中的節點只能接收上一個隱藏層的節點,沒有辦法同時也接收下一個隱藏層節點的資訊。聽起來很抽象,但這其實就意味著模型雖然可以記住上文,並消化下文,但卻也因為這個特性,使得模型無法理解下文與上文之間的關係。
  • 梯度消失
    當神經網路在反向傳播中,也就是模型向回修正,並透過梯度下降法在找尋最佳解,找Loss的最小值時,可能會發生一個現象,就是梯度會越來越小、越來越小,最後變為零。這就導致模型沒有辦法再繼續找到最小的Loss。
  • 梯度爆炸
    梯度爆炸正好與梯度消失相反,梯度會越來越大、越來越大,導致越接近淺層網路,權重變化就越大,也會造成模型訓練上的反效果。

那該如何解決梯度消失以及梯度爆炸的問題呢?其實一般來說,在自然語言處理的任務中,不會僅僅只用循環神經網路,也會在裡面再加上另外一層深度學習模型:長短期記憶(LSTM)。同時應用循環神經網路以及長短期記憶模型,就可以有效避免梯度消失以及爆炸的問題了。

那我們明天就相約在長短期記憶見囉!

下一篇文章

➡️ 【NLP】Day 16: 跟你我一樣選擇性記憶的神經網路?深度學習:長短期記憶 LSTM

若你有空,也歡迎來看看其他文章

➡️ 【NLP】Day 14: 神經網路也會神機錯亂?不,只會精神錯亂…深度學習:前饋神經網路
➡️ 【NLP】Day 13: 可不可以再深一點點就好?深度學習基礎知識:你需要知道的這些那些
➡️ 【NLP】Day 12: 豬耳朵餅乾跟機器學習也有關係?機器學習:羅吉斯回歸