62 序列到序列學(xué)習(xí)(seq2seq)【動(dòng)手學(xué)深度學(xué)習(xí)v2】

序列到序列學(xué)習(xí)(seq2seq)

- 上圖展示的是 DNA 轉(zhuǎn)錄,它也是一種序列到序列的學(xué)習(xí)
機(jī)器翻譯
- seq2seq 最早是用來做機(jī)器翻譯的,給定一個(gè)源句子,自動(dòng)翻譯成目標(biāo)語言

- 給定一個(gè)源語言的句子,自動(dòng)翻譯成目標(biāo)語言
- 機(jī)器翻譯中的輸入序列和輸出序列都是長度可變的
seq2seq
編碼器-解碼器(encoder-decoder)架構(gòu)

- seq2seq 指的是一個(gè)特定的模型,它的編碼器是一個(gè) RNN(循環(huán)神經(jīng)網(wǎng)絡(luò)),使用長度可變的序列作為輸入,將其轉(zhuǎn)換為固定形狀的隱狀態(tài);然后將最終的隱藏狀態(tài)傳給解碼器,隱藏狀態(tài)包括了整個(gè)源句子(輸入序列)的信息;解碼器使用另外一個(gè) RNN ,基于輸入序列的編碼信息和輸出序列已經(jīng)看見的或者生成的詞元來預(yù)測下一個(gè)詞元,從而連續(xù)生成輸出序列的詞元
- 編碼器將長度可變的輸入序列轉(zhuǎn)換成形狀固定的上下文變量,并且將輸入序列的信息在該上下文變量中進(jìn)行編碼
- 編碼器可以是單向的循環(huán)神經(jīng)網(wǎng)絡(luò),其中的隱藏狀態(tài)只依賴于輸入子序列,這個(gè)子序列是由輸入序列的開始位置到隱藏狀態(tài)所在的時(shí)間步的位置(包括隱藏狀態(tài)所在的時(shí)間步)組成
- 編碼器也可以是雙向的循環(huán)神經(jīng)網(wǎng)絡(luò),其中隱藏狀態(tài)依賴于兩個(gè)輸入子序列,兩個(gè)子序列是由隱藏狀態(tài)所在的時(shí)間步的位置之前的序列和之后的序列(包含隱藏狀態(tài)所在的時(shí)間步),因此隱藏狀態(tài)對(duì)整個(gè)序列的信息都進(jìn)行了編碼。雙向不能做語言模型,但是雙向可以做翻譯;雙向可以做編碼器,但不能做解碼器,解碼器需要做預(yù)測,編碼器不需要
- <bos> 表示序列開始詞元,代表一個(gè)句子的開始,它是解碼器的輸入序列的第一個(gè)詞元
- <eos> 表示序列結(jié)束詞元,代表一個(gè)句子的結(jié)束(解碼器輸出的句子長度是可以變化的,一旦輸出序列生成此詞元,模型就會(huì)停止預(yù)測)
- RNN 做編碼器可以輸入任意長度的序列,最后返回最后時(shí)刻的隱藏狀態(tài),使用 RNN 編碼器最終的隱狀態(tài)來初始化解碼器的隱狀態(tài),解碼器一直輸出,直到看到句子的結(jié)束標(biāo)志為止
- seq2seq 也可以做可變長度到可變長度的句子之間的翻譯

隱藏狀態(tài)是怎么傳遞的?
- 編碼器是沒有輸出的 RNN
- 編碼器最后時(shí)間步的隱藏狀態(tài)作為解碼器的初始隱藏狀態(tài)
訓(xùn)練

- 訓(xùn)練時(shí)將特定的開始詞元(“<bos>”)和原始的輸出序列(不包括序列結(jié)束詞元“<eos>”)拼接在一起作為解碼器的輸入,這也稱為強(qiáng)制教學(xué)(teacher forcing,因?yàn)樵嫉妮敵鲂蛄校ㄔ~元的標(biāo)簽)被送入了解碼器)
- 也可以將來自上一個(gè)時(shí)間步的預(yù)測得到的詞元作為解碼器的當(dāng)前輸入
- 訓(xùn)練和推理是不同的:編碼器是相同的,但是在訓(xùn)練的時(shí)候,解碼器是知道目標(biāo)句子的,它知道真正的翻譯是什么樣子的,所以解碼器的輸入(每個(gè) RNN 時(shí)刻的輸出)所使用的實(shí)際上是真正的目標(biāo)句子的輸入,所以就算是在訓(xùn)練的時(shí)候翻譯錯(cuò)了,下一個(gè)時(shí)刻的輸入還是正確的輸入,也就是說,在訓(xùn)練的時(shí)候所使用的是真正的目標(biāo)句子來幫助訓(xùn)練,這樣就降低了預(yù)測長句子的難度
推理

- 推理的時(shí)候沒有真正的目標(biāo)句子作為參考,每一個(gè)時(shí)刻只能將上一個(gè)時(shí)刻的輸出作為這一時(shí)刻的輸入,以此來不斷地進(jìn)行預(yù)測,即每個(gè)解碼器當(dāng)前時(shí)間步的輸入都來自前一個(gè)時(shí)間步的預(yù)測詞元,因此能夠一個(gè)詞元接一個(gè)詞元地預(yù)測輸出序列
- 和訓(xùn)練類似,序列開始詞元(“<bos>”)在初始時(shí)間步就被輸入到了解碼器中
- 當(dāng)輸出序列的預(yù)測遇到序列結(jié)束詞元(“<eos>”)時(shí),預(yù)測就結(jié)束了
BLEU(bilingual evaluation understudy)
- 可以通過與真實(shí)標(biāo)簽序列進(jìn)行比較來評(píng)估預(yù)測序列
- BLEU 最先是用于評(píng)估機(jī)器翻譯的結(jié)果,但是它已經(jīng)被廣泛用于測量許多應(yīng)用的輸出序列的質(zhì)量
- 原則上說,對(duì)于預(yù)測序列中的任意 n 元語法(n-grams),BLEU 的評(píng)估都是這個(gè) n 元語法是否出現(xiàn)在標(biāo)簽序列中
- BLEU 的值越大越好,最大值為 1 ,越小的話效果越差
BLEU的定義

1、pn 表示 n-grams 的精度,它是兩個(gè)數(shù)量的比值:第一個(gè)是預(yù)測序列與標(biāo)簽序列中匹配的 n 元語法的數(shù)量,第二個(gè)是預(yù)測序列中 n 元語法的數(shù)量的比率

- p1:考慮預(yù)測序列中所有的 1-gram,有 5 個(gè) 1-gram,即 A、B、B、C、D,所以分母為 5 ;再考慮這 5 個(gè) 1-gram ,是不是每一個(gè) 1-gram 都在標(biāo)簽序列中出現(xiàn)過(預(yù)測序列中除了第二個(gè) B 并沒有出現(xiàn),因?yàn)樵跇?biāo)簽序列中 B 只出現(xiàn)了一次,其它都出現(xiàn)了,所以 p1 = 4/5)
- p2:考慮預(yù)測序列中所有的 2-gram,有 4 個(gè) 2-gram,即AB、BB、BC、CD,所以分母為 4 ;再考慮這 4 個(gè) 2-gram ,是不是每一個(gè) 2-gram 都在標(biāo)簽序列中出現(xiàn)過(預(yù)測序列中除了第二個(gè) BB 并沒有出現(xiàn),因?yàn)樵跇?biāo)簽序列中 B 只出現(xiàn)了一次,其它都出現(xiàn)了,所以 p2 = 3/4)
- p3:考慮預(yù)測序列中所有的 3-gram,有 3 個(gè) 3-gram,即ABB、BBC、BCD,所以分母為 3 ;再考慮這 3 個(gè) 3-gram ,是不是每一個(gè) 3-gram 都在標(biāo)簽序列中出現(xiàn)過(預(yù)測序列中只有 BCD 在標(biāo)簽序列中出現(xiàn)了一次,其它都沒有出現(xiàn)了,所以 p3 = 1/3)
- p4:考慮預(yù)測序列中所有的 4-gram,有 2 個(gè) 4-gram,即ABBC、BBCD,所以分母為 2 ;再考慮這 2 個(gè) 4-gram ,是不是每一個(gè) 4-gram 都在標(biāo)簽序列中出現(xiàn)過(預(yù)測序列中所有的 4-gram 都沒有在標(biāo)簽序列中出現(xiàn)過,所以 p4 = 0/2)
2、len(label)、len(pred) 分別表示標(biāo)簽序列中的詞元數(shù)和預(yù)測序列中的詞元數(shù),兩個(gè)序列的詞元數(shù)可以是不一樣的
- 如果預(yù)測的長度比標(biāo)簽(真實(shí))的長度少很多的話,len(label)/len(pred) 就會(huì)大于 1 ,整個(gè)指數(shù)項(xiàng)就會(huì)變成一個(gè)很小的數(shù)
- 所以說真實(shí)的標(biāo)簽很長,預(yù)測的長度很短的話,會(huì)導(dǎo)致前面的指數(shù)項(xiàng)比較小,因?yàn)轭A(yù)測的長度很短的話,就會(huì)越容易命中真實(shí)的標(biāo)簽,所以前半部分的指數(shù)項(xiàng)是為了懲罰較短的預(yù)測序列,防止預(yù)測的長度過短
3、pn 都是一個(gè)小于等于 1 的數(shù),當(dāng)預(yù)測序列和標(biāo)簽序列完全相同時(shí),BLEU 為 1
- 由于 n 元語法越長則匹配難度越大,所以 BLEU 為更長的 n 元語法的精確度分配了更大的權(quán)重
總結(jié)
1、Seq2Seq 從一個(gè)句子生成另一個(gè)句子,機(jī)器翻譯算是其中的一個(gè)應(yīng)用場景
2、Seq2Seq 使用的是編碼器-解碼器的架構(gòu),編碼器和解碼器都是 RNN
3、將編碼器最后時(shí)間隱藏狀態(tài)來初始解碼器隱狀態(tài)來完成信息傳遞
4、在“編碼器-解碼器”訓(xùn)練中,強(qiáng)制教學(xué)方法將原始輸出序列(而非預(yù)測結(jié)果)輸入到解碼器中
5、BLEU 是一種常用的評(píng)估方法,它通過測量預(yù)測序列和標(biāo)簽序列之間的 n 元語法的匹配度來衡量生成預(yù)測序列的好壞
Q&A
- 1、請(qǐng)問老師 PPT 里面的圖是怎么制作的,直接在 PPT 里面畫的,還是有其它一些工具,可以介紹一下嗎,比如之前的 GRU 里面的各種門的解釋圖咋畫的?
- ?QA P3 - 00:00?
- 2、請(qǐng)問老師,encoder 輸出和 decoder 的輸入,拼接和按位相加起來有什么區(qū)別嗎?
- ?QA P3 - 00:46?
- 3、embedding 層是做 word2vec 嗎?
- ?QA P3 - 01:12?
- 4、encoder 的 output 和 decoder 的 output 是不是都是預(yù)測的詞?encoder 的 output 是預(yù)測的英語沒有使用,decoder 的 ouput 是預(yù)測的法語?
- ?QA P3 - 01:39?
- 5、請(qǐng)問 valid length 是怎么選擇的?Y_valid_len 是什么?
- ?QA P3 - 02:23?
- 6、num_hiddens=32 為什么這么定義呢?
- ?QA P3 - 02:59?
- 7、老師,現(xiàn)在 seq2seq 好像都用 transformer 實(shí)現(xiàn)了。RNN/LSTM 還有什么使用場景嗎?
- ?QA P3 - 03:11?
- 8、老師,我 bert、xlnet 這些模型都學(xué)過了,但是完全不知道 kaggle 該如何做,例如 ber 任務(wù)、信息抽取任務(wù)或者聊天機(jī)器人任務(wù)等,請(qǐng)問這是為什么,該如何入門呢?
- ?QA P3 - 04:55?
- 9、實(shí)際句子的長度超過了設(shè)定的句子長度,是直接截掉不用了還是放到下一個(gè)句子?
- ?QA P3 - 06:05?
- 10、請(qǐng)問老師,decoder 的輸入和最終預(yù)測的輸出一定是同一個(gè)東西嗎?還是說二者可以不同呢?如果不同,怎么理解 decoder 學(xué)習(xí)到的是什么內(nèi)容呢?此時(shí)該怎樣理解 encoder 和 decoder 之間的關(guān)系?
- ?QA P3 - 06:48?
----end----
其他參考
1、《動(dòng)手學(xué)深度學(xué)習(xí)》,課程 PPT,https://courses.d2l.ai/zh-v2/assets/pdfs/part-3_9.pdf
2、《動(dòng)手學(xué)深度學(xué)習(xí)》,教程,https://zh-v2.d2l.ai/chapter_recurrent-modern/seq2seq.html