1. 簡(jiǎn)介
序列到序列模型其實(shí)是使用兩個(gè)RNN昭卓。一個(gè)讀取輸入序列张足,將讀取的序列發(fā)送給另一個(gè)RNN触创,接著輸出序列。如下圖为牍,左側(cè)的RNN叫做編碼器哼绑,右側(cè)的RNN叫做解碼器。
編碼器的主要任務(wù)是讀取序列碉咆,然后將發(fā)現(xiàn)的規(guī)律傳遞給解碼器抖韩。解碼器會(huì)產(chǎn)生輸出序列。傳遞給解碼器的 “規(guī)律” 是固定大小的張量疫铜,稱為狀態(tài)茂浮,有時(shí)候也叫上下文,無(wú)論輸出和輸出的序列長(zhǎng)短是多少壳咕,Context 的大小在構(gòu)建模型的時(shí)候是指定席揽,大小固定。
詳細(xì)了解一下編碼器和解碼器的具體工作原理谓厘。已知編碼器和解碼器都是RNN幌羞,處理序列任務(wù),自然有循環(huán)和時(shí)間步竟稳。
假如現(xiàn)在模型是一個(gè)聊天機(jī)器人属桦,輸入一個(gè) “how are you ?” 的句子。首先需要將句子拆分成單詞住练,將其分成4個(gè)元素地啰,因?yàn)橛?個(gè)元素,所以需要4個(gè)時(shí)間步讲逛,每次讀取一個(gè)元素亏吝,然后在隱藏狀態(tài)上進(jìn)行轉(zhuǎn)換,并將該狀態(tài)傳給下個(gè)時(shí)間步盏混,再結(jié)合下個(gè)元素進(jìn)行轉(zhuǎn)換蔚鸥,以此重復(fù)直到第四個(gè)元素,如此最后輸出 Context 上下文張量许赃。
解碼器也是同樣的流程止喷,根據(jù)編碼器生成的 Context 上下文張量,將Context輸入解碼器混聊,產(chǎn)生解碼器的第一個(gè)輸出和隱藏狀態(tài)弹谁,將解碼器的第一個(gè)輸出和隱藏狀態(tài)作為解碼器的第二個(gè)輸入,產(chǎn)生解碼器的第二個(gè)輸出和隱藏狀態(tài),以此重復(fù)预愤。這就是解碼器主要工作內(nèi)容沟于。
將編碼器和解碼器的工作模式結(jié)合進(jìn)行展開,就是如下圖的形式:
首先單詞不能直接輸入到 RNN 中植康,在進(jìn)行分詞之后旷太,需要通過(guò)Embedding進(jìn)行嵌入,得到每個(gè)單詞的詞向量销睁。其實(shí)這里的詞向量跟word2vec 和 Glove 概念一樣供璧。這里的 U 表示詞嵌入之后的數(shù)據(jù)矩陣,A 表示每個(gè)時(shí)間步產(chǎn)生的狀態(tài)冻记。同樣 B 表示解碼器每個(gè)時(shí)間步的隱藏狀態(tài)睡毒,V 表示解碼器輸出的向量。其實(shí)每個(gè)解碼器RNN的輸出都接一個(gè)全鏈接層檩赢,用于輸出單詞的概率吕嘀。根據(jù)概率最大的值找到對(duì)應(yīng)的單詞违寞。放大V的表示其實(shí)就是這樣如下圖贞瞒,在實(shí)際應(yīng)用中這樣的輸出可能有上百個(gè),這跟詞匯量的大小有關(guān)趁曼。
幸運(yùn)的是 tensorflow 提供的API 已經(jīng)做了很好的封裝军浆。將復(fù)雜的處理轉(zhuǎn)換成一個(gè)API。在實(shí)際使用的時(shí)候調(diào)用API即可實(shí)現(xiàn)挡闰。
2. 應(yīng)用
使用序列到序列模型有著廣泛的應(yīng)用乒融。
示例一: 翻譯。如果用英文的序列作為輸入摄悯,用法語(yǔ)的作為標(biāo)簽赞季,進(jìn)行訓(xùn)練模型。即可得到一個(gè)英語(yǔ)到法語(yǔ)的翻譯器奢驯。
機(jī)器翻譯項(xiàng)目下載申钩,下載的項(xiàng)目使用 jupyter notebook 打開查看。
示例二:文本摘要瘪阁。如果使用一個(gè)新聞文章和對(duì)應(yīng)的摘要數(shù)據(jù)進(jìn)行訓(xùn)練撒遣。可得到一個(gè)文章內(nèi)容摘要器管跺。
示例三:QA問(wèn)答機(jī)器人义黎。使用問(wèn)題和答案數(shù)據(jù)集進(jìn)行訓(xùn)練,可得到一個(gè)問(wèn)答機(jī)器人或聊天機(jī)器人豁跑。
示例四:看圖說(shuō)話廉涕。輸入不一定是文字,還可以是其他,如圖片狐蜕。例如 RNN 通常與 CNN 一起使用壶愤。圖像和字面一起使用×蠛祝可實(shí)現(xiàn)輸入一張圖片征椒,機(jī)器輸出對(duì)應(yīng)的圖片內(nèi)容。