深度學習第46講:seq2seq模型

2021-03-02 機器學習實驗室

     在前幾講中筆者和大家講到了詞向量的一些內容,關於 word2vec 詞向量的主要類型和訓練方式,以及如何基於訓練好的詞向量做一些簡單的分析。本節開始我們繼續回到之前的 RNN 模型,學習一些經典的深度學習自然語言模型,以及一些常見的 NLP 應用。

     本講筆者要說的是著名的 seq2seq 模型,翻譯過來也就是序列對序列的模型,在前面 RNN 的幾種類型內容中我們已經了解到了 seq2seq 本質上是一種多對多(N vs M)RNN 模型,也就是輸入序列和輸出序列不等長的 RNN 模型。也正是因為 seq2seq 的這個特性,使得其有著廣泛的應用場景,比如神經機器翻譯、文本摘要、語音識別、文本生成、AI寫詩等等。

seq2seq

     先簡單來圖解一下 seq2seq 模型,剛剛說了 seq2seq 針對的是輸入輸出序列不等長的情況,對於這種情況,seq2seq 的做法是先將輸入序列編碼成一個上下文向量 c,如下圖所示:


N VS M 編碼 (圖片選自何之源知乎專欄)
https://zhuanlan.zhihu.com/p/28054589

     如上圖所示,我們可以通過對最後一個隱變量以 c 進行賦值,然後展開來寫。編碼完成後我們再用一個 RNN 對 c 的結果進行解碼,簡而言之就是將 c 作為初始狀態的隱變量輸入到解碼網絡,如下圖所示:


N VS M 解碼 (圖片選自何之源知乎專欄)
https://zhuanlan.zhihu.com/p/28054589

     seq2seq 模型最早是在 2013 年由 cho 等人提出一種 RNN 模型,主要的應用目的就是機器翻譯。

     最早的編碼解碼結構:

         除了上面這篇文章之外,奠定 seq2seq 理論的還有一幹谷歌大佬們的這篇論文:

    關於 seq2seq 的數學細節這裡不做更多講述,感興趣的朋友可以認真研讀上述兩篇論文。

seq2seq 的keras實現

     下面我們來嘗試使用 keras 實現一個簡單的 seq2seq 模型。實現代碼如下:
導入相關 package:

from recurrentshop import LSTMCell, RecurrentSequential
from .cells import LSTMDecoderCell, AttentionDecoderCell
from keras.models import Sequential, Model
from keras.layers import Dense, Dropout, TimeDistributed, Bidirectional, Input

定義一個簡單的 seq2seq 模型:

def SimpleSeq2Seq(output_dim, output_length, hidden_dim=None, input_shape=None,                  batch_size=None, batch_input_shape=None, input_dim=None,                  input_length=None, depth=1, dropout=0.0, unroll=False,                  stateful=False):    
   '''    Simple model for sequence to sequence learning.    The encoder encodes the input sequence to vector (called context vector)    The decoder decodes the context vector in to a sequence of vectors.    There is no one on one relation between the input and output sequence    elements. The input sequence and output sequence may differ in length.    Arguments:    output_dim : Required output dimension.    hidden_dim : The dimension of the internal representations of the model.    output_length : Length of the required output sequence.    depth : Used to create a deep Seq2seq model. For example, if depth = 3,            there will be 3 LSTMs on the enoding side and 3 LSTMs on the            decoding side. You can also specify depth as a tuple. For example,            if depth = (4, 5), 4 LSTMs will be added to the encoding side and            5 LSTMs will be added to the decoding side.    dropout : Dropout probability in between layers.    '''    if isinstance(depth, int):        depth = (depth, depth)    
       if batch_input_shape:        shape = batch_input_shape    
       elif input_shape:        shape = (batch_size,) + input_shape    
       elif input_dim:        
           if input_length:            shape = (batch_size,) + (input_length,) + (input_dim,)        
           else:            shape = (batch_size,) + (None,) + (input_dim,)    
       else:        
                       raise TypeError    
       if hidden_dim is None:            hidden_dim = output_dim
       
       # 編碼過程        encoder = RecurrentSequential(unroll=unroll, stateful=stateful)        encoder.add(LSTMCell(hidden_dim, batch_input_shape=(shape[0], shape[-1])))    
       
       for _ in range(1, depth[0]):        encoder.add(Dropout(dropout))        encoder.add(LSTMCell(hidden_dim))    
   # 解碼過程    decoder = RecurrentSequential(unroll=unroll, stateful=stateful,                                  decode=True, output_length=output_length)    decoder.add(Dropout(dropout, batch_input_shape=(shape[0], hidden_dim)))    
   
   if depth[1] == 1:        decoder.add(LSTMCell(output_dim))    
   else:        decoder.add(LSTMCell(hidden_dim))        
       for _ in range(depth[1] - 2):            decoder.add(Dropout(dropout))            decoder.add(LSTMCell(hidden_dim))    decoder.add(Dropout(dropout))    decoder.add(LSTMCell(output_dim))    _input = Input(batch_shape=shape)    x = encoder(_input)    output = decoder(x)    
   return Model(_input, output)

seq2seq 模型搭建:

model = SimpleSeq2Seq(input_dim=5, hidden_dim=10, output_length=8, output_dim=8)model.compile(loss='mse', optimizer='rmsprop')

以上便是本節內容。下一講筆者將講解有關注意力機制模型的一些內容。

參考資料:

deeplearningai.com

Sequence to Sequence Learning with Neural Networks 

Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation

https://github.com/farizrahman4u/seq2seq/

https://zhuanlan.zhihu.com/p/28054589

往期精彩:

深度學習第45講:GloVe詞向量與相關應用

深度學習第44講:訓練一個word2vec詞向量

深度學習第43講:自然語言處理之word2vec

深度學習第42講:自然語言處理之詞嵌入和詞向量

深度學習第41講:LSTM的numpy和keras實現

深度學習第40講:RNN之長短期記憶網絡LSTM

深度學習第39講:RNN之門控循環單元GRU

深度學習第38講:RNN的 4 種類型


一個數據科學從業者的學習歷程

長按二維碼.關注機器學習實驗室

相關焦點

  • 深度學習筆記 | 第15講:seq2seq與注意力機制模型
    又到了每周一狗熊會的深度學習時間了。在上一講中,小編給大家演示了如何利用 TensorFlow 根據原始文本訓練一個詞向量模型,以及如何根據給定的詞向量模型做一些簡單的自然語言分析。本節將繼續介紹自然語言處理中其他的一些模型,今天要介紹的模型就是一款經典的 RNN 模型——seq2seq,以及著名的注意力模型,最後小編會在這些理論的基礎上給出一個基於seq2seq和注意力模型的機器翻譯實例。
  • Bart: Seq2Seq預訓練模型
    :OverallTransformer最早出來是為了解決機器翻譯問題,因而Transformer模型分為兩部分,Encoder和Decoder。Bert模型使用了Encoder部分,而GPT模型使用了Decoder部分,分別得到了很好的預訓練模型。
  • RNA seq第十九講 | 可變剪切的RNA-Seq分析
    簡介這篇文章是發表在Nature Methods上的使用深度學習來擴充可變剪切的分析。通訊作者是來自於UCLA的邢毅老師。這篇文章創新點在於將貝葉斯假設檢驗框架和深度學習結合在一起,首先使用貝葉斯假設檢驗來檢驗可變差異剪切,並用來作為訓練模型的標籤,然後根據深度學習預測的結果重新作為貝葉斯假設檢驗的先驗概率從而估計後驗概率;除此之外,作者針對於類別不平衡預測結果還做了rank-transformation。1.
  • keras教程:手把手教你做聊天機器人(下)—— 快速搭建seq2seq模型
    準備對話數據2. 搭建seq2seq模型3. 訓練模型,並預測聊天效果並且,使用「字典」和「語料」,我們已經完成了第1步準備的工作。感興趣的同學,可以戳這裡:《 keras教程:手把手教你做聊天機器人(上) 》這一期,我們來構建機器人最核心的部分:seq2seq模型下面,我們就開始啦~~如果我問你:「今天的心情如何?」你會如何回答我?
  • PyTorch專欄(六): 混合前端的seq2seq模型部署
    scripted_searcher graph: graph(%input_seq : Tensor,      %input_length : Tensor,      %max_length : int,
  • 字節跳動開源序列推理引擎LightSeq
    簡單易用,無縫銜接Tensorflow、PyTorch等深度學習框架LightSeq通過定義模型協議,支持各種深度學習框架訓練好的模型靈活導入。同時包含了開箱即用的端到端模型服務,即在不需要寫一行代碼的情況下部署高速模型推理,同時也靈活支持多層次復用。利用 LightSeq 部署線上服務比較簡便。
  • Nature重磅綜述|關於RNA-seq,你想知道的都在這(續)
    Note:想要打開全部分支、添加備註或修改信息,請先創建副本,在備份文件打開修改,原文件不支持修改原文在深度總結了RNA-seq這些年的同時,還分享了文中一些名詞的解釋,編譯分享如下,希望有助於進一步理解學習。
  • 解密多任務學習框架PALM,讓你的模型開啟「學霸」模式
    隨著預訓練技術的到來,作為深度學習重要應用領域之一,自然語言處理也迎來了新的春天。
  • Science重磅 | 新技術Slide-seq能以高空間解析度測量全基因組的表達情況
    原文作者開發了Slide-seq技術,這是一種將組織切片中的RNA轉移到表面的方法,表面覆蓋有已知位置的DNA條形碼珠,通過測序可以推斷出RNA的位置。使用Slide-seq技術將單細胞轉錄組測序數據鑑定的細胞類型定位在小腦和海馬內,表徵小鼠小腦Purkinje層的基因空間表達模式,並定義創傷性腦損傷小鼠模型中細胞類型特異性反應的時間演變。
  • ChIP-seq數據分析課程學習筆記之合併bam以及使用macs找peaks
    https://sourceforge.net/projects/bowtie-bio/files/bowtie2/2.3.5.1/bowtie2-2.3.5.1-linux-x86_64.zip/download#unzip bowtie2-2.3.5.1-linux-x86_64.zip#下面把bowtie2寫入bashrc,以便以後隨便哪個目錄都可以調用vim ~/.bashrc
  • NLP集大成之預訓練模型綜述
    在CV領域,預訓練模型通常使用監督訓練;但在NLP領域,通常是缺少大量監督數據的,只有在翻譯任務上有足夠大量的數據,所以CoVe預訓練模型就是在翻譯數據上訓練的。NLP中常見的預訓練任務有以下幾種:語言模型類語言模型(LM)LM通常特指自回歸語言模型或單向語言模型,其思想是用前T個詞預測第T+1個詞。
  • 學界 | 百度提出冷聚變方法:使用語言模型訓練Seq2Seq模型
    論文地址:https://arxiv.org/abs/1708.06426摘要:帶有注意力機制的序列到序列(Seq2Seq)模型在多項生成自然語言句子的任務中表現優秀,如機器翻譯、圖像字幕生成和語音識別。在以語言模型的形式利用非標註數據後,其性能進一步提高。
  • 如何為神經機器翻譯任務配置編碼 - 解碼模型
    推薦設置:在模型中使用 LSTM 單元。一般來說,較深的網絡比淺層網絡性能更好。關鍵是要在網絡深度、模型性能和訓練時長之間找到一個平衡點。這是當性能表現的提升成為次要因素時,網絡通常已經達到足夠的深度,而我們通常沒有這樣的資源來訓練非常深的網絡。
  • 飛槳對話模型工具箱(二):對話自動評估模塊ADE
    , logits和label計算sigmoid_cross_entropy_with_logits loss;2)第二階段:利用少量的對話系統的標記數據,對第一階段訓練的匹配模型進行finetuning,可以提高評估效果(包含human,keywords,seq2seq_att,seq2seq_naive,4個finetuning任務);模型結構: finetuning階段學習表示到計算
  • UDSMProt:蛋白質分類通用深度序列模型
    相關研究表明,使用自監督進行預訓練的模型性能有顯著改進,可以有效利用來自預訓練的生物學敏感信息。本文中作者的主要貢獻為三點:(1)提出了用於蛋白質分類的通用深度序列模型(UDSMProt),該模型在Swiss-Prot上進行了預訓練,並針對特定的分類任務進行了微調,而無需進行任何針對特定任務的操作修改。
  • 你做了ChIP-seq,卻挖不出機制?因為沒畫這個圖
    【實驗設計】正常細胞和腫瘤細胞,都做induce和depletion,然後做ChIP-seq和RNA-seq。【發現規律-高級】注意看橫坐標Figure 2. MYC和PolIIFigure 2 | MYC regulates recruitment of Pol II to target promoters.
  • 漂亮,LSTM模型結構的可視化
    1、傳統的BP網絡和CNN網絡2、LSTM網絡3、LSTM的輸入結構4、pytorch中的LSTM4.1 pytorch中定義的LSTM模型4.2 餵給LSTM的數據格式4.3 LSTM的output格式5、LSTM和其他網絡組合BP網絡和CNN網絡沒有時間維,和傳統的機器學習算法理解起來相差無幾,CNN
  • 【Github】BERT-train2deploy:BERT模型從訓練到部署
    包裝也很完美,贈品也是收到貨後馬上就發貨了1 第一次在第三方買的手機 開始很擔心 不過查一下是正品 很滿意1 很不錯 續航好 系統流暢1 不知道真假,相信店家吧1 快遞挺快的,榮耀10手感還是不錯的,玩了會王者還不錯,就是前後玻璃,1 流很快,手機到手感覺很酷,白色適合女士,很驚豔!常好,運行速度快,流暢!
  • 谷歌開源NLP模型可視化工具LIT,模型訓練不再「黑箱」
    深度學習模型的訓練就像是「黑箱操作」,知道輸入是什麼、輸出是什麼,但中間過程就像個黑匣子,這使得研究人員可能花費大量時間找出模型運行不正常的原因。假如有一款可視化的工具,能夠幫助研究人員更好地理解模型行為,這應該是件非常棒的事。