Seq2Seq從理論到實戰(zhàn)【理論篇】
來源:投稿 作者:175
編輯:學(xué)姐
引言
本著“凡我不能創(chuàng)造的,我就不能理解”的思想,本系列文章會基于純Python以及NumPy從零創(chuàng)建自己的深度學(xué)習(xí)框架,該框架類似PyTorch能實現(xiàn)自動求導(dǎo)。
要深入理解深度學(xué)習(xí),從零開始創(chuàng)建的經(jīng)驗非常重要,從自己可以理解的角度出發(fā),盡量不使用外部完備的框架前提下,實現(xiàn)我們想要的模型。本系列文章的宗旨就是通過這樣的過程,讓大家切實掌握深度學(xué)習(xí)底層實現(xiàn),而不是僅做一個調(diào)包俠。
本文介紹seq2seq模型,由論文Sequence to Sequence Learning with Neural Networks提出,能解決輸入和輸出序列長度不等的任務(wù)——機器翻譯、自動摘要、自動問答等。
Seq2Seq
Seq2Seq網(wǎng)絡(luò)即sequence to sequence,序列到序列網(wǎng)絡(luò),輸入一個序列,輸出另一個序列。這個架構(gòu)重要之處在于,輸入序列和輸出序列的長度是可變的。
Seq2Seq使用的具體方法基本都屬于編碼器-解碼器模型。
其核心思想是通過編碼器(Encoder)將輸入序列編碼成一個定長的向量表示,也稱為具有上下文信息的表示,簡稱為上下文(context)。然后將上下文向量喂給解碼器(Decoder),來生成任務(wù)相關(guān)的輸出序列。

總結(jié)一下,編碼器-解碼器架構(gòu)包含三個組件:
編碼器接收一個輸入序列,
,然后生成對應(yīng)的上下文表示,
。常用于編碼器的網(wǎng)絡(luò)可以為RNN、CNN或Transformer等。
上下文向量c,由一個函數(shù)基于
生成,傳遞輸入的核心信息到解碼器。
解碼器接收c作為輸入,然后生成一個任意長度的隱藏狀態(tài)序列
,從中可以得到對應(yīng)的輸出
。和編碼器一樣,也有多種實現(xiàn)方案。
基于RNN實現(xiàn)編碼器-解碼器
[翻譯]Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation使用RNN作為編碼器和解碼器實現(xiàn)機器翻譯。
我們本小節(jié)來看如何通過RNN來實現(xiàn)編碼器-解碼器網(wǎng)絡(luò)。

實際上會有兩個不同的RNN網(wǎng)絡(luò),一個作為編碼器,將變長的輸入序列轉(zhuǎn)換為定長的編碼(上下文向量);另一個作為解碼器,通過該上下文向量連續(xù)生成輸出序列,基于輸入序列的編碼信息和輸出序列已經(jīng)生成的單詞來預(yù)測一下單詞。上圖演示了如何在機器翻譯中使用兩個RNN進行序列號序列學(xué)習(xí)。
這里有兩個特殊單詞<eos>
和<bos>
,分別表示序列結(jié)束和開始標志。

還有一種方式,如上圖,我們只需要在輸入末尾添加<EOS>
,比如這里有輸入序列A B C <EOS>
。我們將輸入序列傳入模型后,將其映射為序列W X Y Z <EOS>
作為輸出。
回顧RNN語言模型計算序列y的概率:


編碼器的目標是生成一個輸入的上下文表示,體現(xiàn)在編碼器最后的那個隱藏狀態(tài),,也用c來表示,代表上下文。
在時刻t,將前面的t-1個單詞輸入到語言模型,通過前向推理生成隱藏狀態(tài)序列,并且以最后一個單詞的隱藏狀態(tài)作為起點來生成下一個單詞。



但是,這種方法有一個弱點是,隨著輸出序列的生成,上下文向量c的影響將逐漸減弱。一種常用的解決方法是讓解碼過程的每個時刻都能看到上下文向量c:


參考
Dive Into Deep Learning
Speech and Language Processing
關(guān)注“學(xué)姐帶你玩AI”公眾號
回復(fù)“深度學(xué)習(xí)”免費領(lǐng)取必讀電子書+課件
學(xué)起來學(xué)起來!