序列到序列模型(seq2seq)

1. 簡介

序列到序列模型其實是使用兩個RNN。一個讀取輸入序列,將讀取的序列發(fā)送給另一個RNN,接著輸出序列。如下圖,左側(cè)的RNN叫做編碼器,右側(cè)的RNN叫做解碼器。

編碼器的主要任務是讀取序列,然后將發(fā)現(xiàn)的規(guī)律傳遞給解碼器。解碼器會產(chǎn)生輸出序列。傳遞給解碼器的 “規(guī)律” 是固定大小的張量,稱為狀態(tài),有時候也叫上下文,無論輸出和輸出的序列長短是多少,Context 的大小在構(gòu)建模型的時候是指定,大小固定。

詳細了解一下編碼器和解碼器的具體工作原理。已知編碼器和解碼器都是RNN,處理序列任務,自然有循環(huán)和時間步。

假如現(xiàn)在模型是一個聊天機器人,輸入一個 “how are you ?” 的句子。首先需要將句子拆分成單詞,將其分成4個元素,因為有4個元素,所以需要4個時間步,每次讀取一個元素,然后在隱藏狀態(tài)上進行轉(zhuǎn)換,并將該狀態(tài)傳給下個時間步,再結(jié)合下個元素進行轉(zhuǎn)換,以此重復直到第四個元素,如此最后輸出 Context 上下文張量。

解碼器也是同樣的流程,根據(jù)編碼器生成的 Context 上下文張量,將Context輸入解碼器,產(chǎn)生解碼器的第一個輸出和隱藏狀態(tài),將解碼器的第一個輸出和隱藏狀態(tài)作為解碼器的第二個輸入,產(chǎn)生解碼器的第二個輸出和隱藏狀態(tài),以此重復。這就是解碼器主要工作內(nèi)容。

將編碼器和解碼器的工作模式結(jié)合進行展開,就是如下圖的形式:

首先單詞不能直接輸入到 RNN 中,在進行分詞之后,需要通過Embedding進行嵌入,得到每個單詞的詞向量。其實這里的詞向量跟word2vec 和 Glove 概念一樣。這里的 U 表示詞嵌入之后的數(shù)據(jù)矩陣,A 表示每個時間步產(chǎn)生的狀態(tài)。同樣 B 表示解碼器每個時間步的隱藏狀態(tài),V 表示解碼器輸出的向量。其實每個解碼器RNN的輸出都接一個全鏈接層,用于輸出單詞的概率。根據(jù)概率最大的值找到對應的單詞。放大V的表示其實就是這樣如下圖,在實際應用中這樣的輸出可能有上百個,這跟詞匯量的大小有關(guān)。

幸運的是 tensorflow 提供的API 已經(jīng)做了很好的封裝。將復雜的處理轉(zhuǎn)換成一個API。在實際使用的時候調(diào)用API即可實現(xiàn)。

2. 應用

使用序列到序列模型有著廣泛的應用。

示例一: 翻譯。如果用英文的序列作為輸入,用法語的作為標簽,進行訓練模型。即可得到一個英語到法語的翻譯器。

機器翻譯項目下載,下載的項目使用 jupyter notebook 打開查看。

示例二:文本摘要。如果使用一個新聞文章和對應的摘要數(shù)據(jù)進行訓練??傻玫揭粋€文章內(nèi)容摘要器。

示例三:QA問答機器人。使用問題和答案數(shù)據(jù)集進行訓練,可得到一個問答機器人或聊天機器人。

示例四:看圖說話。輸入不一定是文字,還可以是其他,如圖片。例如 RNN 通常與 CNN 一起使用。圖像和字面一起使用??蓪崿F(xiàn)輸入一張圖片,機器輸出對應的圖片內(nèi)容。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容