1. 程式人生 > >寫給程式設計師的機器學習入門 (七) - 雙向遞迴模型 (BRNN) - 根據上下文補全單詞

寫給程式設計師的機器學習入門 (七) - 雙向遞迴模型 (BRNN) - 根據上下文補全單詞

這一篇將會介紹什麼是雙向遞迴模型和如何使用雙向遞迴模型實現根據上下文補全句子中的單詞。 ## 雙向遞迴模型 到這裡為止我們看到的例子都是按原有順序把輸入傳給遞迴模型的,例如傳遞第一天股價會返回根據第一天股價預測的漲跌,再傳遞第二天股價會返回根據第一天股價和第二天股價預測的漲跌,以此類推,這樣的模型也稱單向遞迴模型。如果我們要根據句子的一部分預測下一個單詞,可以像下圖這樣做,這時 `天氣` 會根據 `今天` 計算, `很好` 會根據 `今天` 和 `天氣` 計算: ![](https://img2020.cnblogs.com/blog/881857/202006/881857-20200629163315652-350048626.png) 那麼如果想要預測在句子中間的單詞呢?例如給出 `今天` 和 `很好` 預測 `天氣`,因為只能根據前面的單詞預測,單向遞迴模型的效果會打折,這時候雙向遞迴模型就派上用場了。雙向遞迴模型 (BRNN, Bidirectional Recurrent Neural Network) 會先按原有順序把輸入傳給遞迴模型,然後再按反向順序把輸入傳給遞迴模型,然後合併正向輸出和反向輸出。如下圖所示,`hf` 代表正向輸出,`hb` 代表反向輸出,把它們合併到一塊就可以實現根據上下文預測中間的內容,`今天` 會根據反向的 `天氣` 和 `很好` 計算,`天氣` 會根據正向的 `今天` 和反向的 `很好` 計算,`很好` 會根據正向的 `今天` 和 `天氣` 計算。 ![](https://img2020.cnblogs.com/blog/881857/202006/881857-20200629163326808-1078970008.png) 在 pytorch 中使用雙向遞迴模型非常簡單,只要在建立的時候傳入引數 `bidirectional = True` 即可: ``` python self.rnn = nn.GRU( input_size = 20, hidden_size = 50, num_layers = 1, batch_first = True, bidirectional = True ) ``` 單向遞迴模型會返回維度為 `批次大小,輸入次數,隱藏值數量` 的 tensor,而雙向遞迴模型會返回維度為 `批次大小,輸入次數,隱藏值數量*2` 的 tensor。 你可能還會有疑問,雙向遞迴模型會怎樣處理批次呢?如果批次中每組資料的輸入次數都不一樣,那麼反向計算的時候會不會從那些填充的 0 開始計算呢?以下是一個小實驗,我們可以看到反向計算的時候 pytorch 會跳過結尾的填充值,不需要做特殊的處理