寫給程式設計師的機器學習入門 (五) - 遞迴模型 RNN,LSTM 與 GRU
阿新 • • 發佈:2020-05-28
## 遞迴模型的應用場景
在前面的文章中我們看到的多層線性模型能處理的輸入數量是固定的,如果一個模型能接收兩個輸入那麼你就不能給它傳一個或者三個。而有時候我們需要根據數量不一定的輸入來預測輸出,例如文字就是數量不一定的輸入,“這部片非常好看” 有 7 個字,“這部片很無聊” 有 6 個字,如果我們想根據文字判斷是正面評價還是負面評價,那麼就需要使用支援不定長度 (即可以接收 6 個又可以接收 7 個) 輸入的模型。時序性的資料數量也是不一定的,例如一個運動中的球,從某個時間點開始的第 0 秒在位置 1,第 1 秒在位置 3,第 2 秒在位置 5,那麼正確的模型應該可以預測出第 3 秒在位置 7,如下圖所示。當然,時序性的資料可以固定一個視窗(例如最近的 5 條資料)來處理,這樣輸入數量就是一定的,但靈活性就降低了,視窗設定過小可能會導致沒有足夠的資訊用於預測輸出,過大則會影響效能。
![](https://img2020.cnblogs.com/blog/881857/202005/881857-20200528171205011-1601889977.png)
遞迴模型 (Recursive Model) 可以用於處理不定長度的輸入,用法是一次只傳固定數量的輸入給模型,可以分多次傳,傳的次數根據資料而定。以上述例子來說,“這部片非常好看” 每次傳一個字需要傳 7 次,“這部片很無聊” 每次傳一個字需要傳 6 次。而遞迴模型每收到一次輸入都會返回一次輸出,有的場景只會使用最後一次輸出的結果 (例如這個例子),而有的場景則會使用每一次輸出的結果。
![](https://img2020.cnblogs.com/blog/881857/202005/881857-20200528171214260-2012988429.png)
換成程式碼可以這樣理解:
``` text
model = MyRecursiveModel()
model('這')
model('部')
model('片')
model('非')
model('常')
model('好')
last_output = model('看')
print(last_output)
```
接下來我們看看幾個經典的遞迴模型是怎麼實現的。
## 最簡單的遞迴模型 - RNN (tanh)
RNN tanh (Recurrent Neural Network - tanh) 是最簡單的遞迴模型,計算公式如下,數學不好的第一印象可能會覺得媽呀一看數學公式就頭昏腦脹了