【什麼是RNN,為什麼我們需要RNN?】

王柏鈞
6 min readApr 25, 2020

--

「RNN, Transformer 和 NLP 的新進發展」文科版(Part2)

本文來自政大蔡炎龍老師的分享的簡報,稍作改寫與理解的新寫

原文連結:

RNN, Transformer 和 NLP 的新進發展

原文相當鼓勵閱讀,但對零基礎的人還是稍微有一點難度,我用比較文科生的口吻翻譯一下。

從最開始開始,什麼是深度學習?

在人工智慧裡,深度學習這個分支領域可以說是目前最受重視的範疇。深度學習通常指的就是以神經網路(NN, Neural Network)為基礎框架的各種變形。

神經網路是什麼,也許可以參考這篇文章,但我們可以單純的把他想像成一個函數,就像sin或是cos之類的三角函數一樣,擁有把輸入變換成指定輸出的能力。

整個神經網路訓練的過程,就是在調整神經網路這個複雜的函數,讓他能夠準確且穩定的把輸入變成我們預期中的輸出。而訓練完成後,我們就擁有了一個穩定的神經網路,或者可以理解成一個我們自行設計的函數。

摘錄自炎龍老師「RNN, Transformer 和 NLP 的新進發展」

當我們給定一個輸入,經過神經網路我們就能得到確定的輸出。輸入和輸出之間的對應關係能夠被確定。

通常是這樣的。

為什麼說是通常呢?因為不論是非常熱門的CNN(Convolution Neural Network, 卷積神經網路)或是更傳統的DNN(Deep Neural Network, 深度神經網路),他們的神經網路的輸出和輸入都是固定的對應關係。

但RNN不是。

為什麼RNN的輸入和輸出不是固定的對應關係?

RNN(Recurrent Neural Network, 遞迴神經網路)在神經網路家族裡也是相當獨特的存在,他的輸入和輸出不會是固定的關係。為什麼?這要先從RNN要處理的問題開始。

對傳統的NN來說,我們可以解決如下問題:

輸入「我」 >>>> 輸出 「柏鈞」
輸入「昨天」 >>>> 輸出 「過去曾經」
輸入 「肚子很餓」 >>>> 輸出「去吃飯」

輸入和輸出有固定的對應關係,當給定輸入,就會得到特定輸出。

但如果我們想用NN來解決對話的問題,也就是在聽完一句話後,需要得到一個輸出,告訴客戶他應該去做什麼,你會發現結果不如預期。

這時候我們假設我們設計的神經網路只會輸出最後一個單字對應的輸出。也就是當客戶輸入 「我昨天肚子很餓」的時候,他會得到的輸出是「去吃飯」

但你有沒有發現,客戶是昨天肚子很餓,不是現在。這時候如果得到「去吃飯」這個輸出,顯然不對。

那你會想,那我們把所有單字對應的輸出都返回給客戶就好啦?但如果客戶得到「柏鈞過去曾經去吃飯」,錯誤又更多了。

這是因為通常的神經網路沒有考慮的前後文的關係,這與人類對語言的直覺不同。

而RNN與眾不同,因為:

摘錄自炎龍老師「RNN, Transformer 和 NLP 的新進發展」

也就是RNN在神經網路的架構中,加入了一個記憶空間(Hidden State)。這個記憶空間不能容納太多資訊,但他會儲存上一次的輸出。

而RNN每一次輸出的時候,他都會先參考記憶空間裡面的資訊,也就是上一次輸出了什麼。這讓RNN能夠學習到與前文之間的對應關係。但很顯然,如果只有上一次是不夠的,我們需要把一整句話都輸入進去RNN,讓RNN分別理解後,輸出我們想要的輸出,可以當成一種翻譯的過程。

這時候我們會把給RNN輸入接口的句子,一個字一個字的丟進去RNN中,直到把一整個句子全部輸入進去。

在實務上,我們會先預設句子有多長,比如說句子最長可能有20個字,我們就創造一個長度為20的空間來儲存句子。而如果句子小於20個字,我們就把空缺的部分補上停止字元和空白字元。這樣 RNN在讀到停止字元時,就知道需要翻譯的句子已經讀完了。

然後RNN對於每一個字都會產生一個輸出,只是在讀到停止字元前,所有輸出都會被隱藏起來。而當讀到停止字元,RNN會把最後一次的輸出值輸出,讓使用者得到他想要的資訊。

這種只保留最後一個輸出值的方法在RNN的方法中叫做Many-to-one。

而為什麼這會有效呢?

我們來思考一下。當RNN輸出第一個字時,這個字會被放到儲存空間(Hidden state)中,然後輸出第二個字之前,RNN會先參考儲存空間裡的資訊,也就是第一個字的輸出是什麼,然後輸出第二個字。

接著第二個字也會被放到儲存空間裡,就這樣重複。你應該可以發現,因為第二個輸出與第一個輸出有關,第三個輸出又跟第二個輸出有關,第四個輸出也跟第三個輸出有關。所以他們彼此之間都有某種連鎖的關係。

這讓RNN在最後一個字輸出時,實際上會參考的不只有最後一個字,而是前面的每一次輸出值。

但這也帶來缺點。

傳統的RNN很難訓練

因為每一個輸出值都跟前面的每一次輸出有關,而前面每一次的輸出除了跟儲存空間裡的資訊有關,跟當時的輸入也有大大的關係。所以每一次要訓練時都要讓神經網路學習這一連串攜家帶眷的連鎖關係,這讓訓練變得相當困難。

因為神經網路的訓練是透過梯度下降法,也就是跟微分的連鎖有關係,當連續作微分時,很容易讓梯度變成0,讓訓練無法進行。

而他的解決方法,就是使用RNN的變種LSTM或GRU,關於他們兩個如何解決RNN難以訓練的問題,請參考這個連結[RNN(遞迴神經網路)全面認識]。

今天的分享是希望讓讀者可以知道為什麼我們需要RNN,RNN是用來解決什麼問題。你了解了嗎?

--

--

No responses yet