李宏毅机器学习(五)Transformer
學(xué)習(xí)內(nèi)容
前情提要
Sequence-to-sequence(Seq2Seq)
輸入是一個(gè)句子,輸出長(zhǎng)度不定; 下面的第一個(gè)是語(yǔ)音辨識(shí),第二個(gè)是機(jī)器翻譯,第三個(gè)是語(yǔ)音翻譯。這三個(gè)都是獨(dú)立的任務(wù)。
第三個(gè)是語(yǔ)音翻譯,就是語(yǔ)音輸入一個(gè)國(guó)家的語(yǔ)音,最后輸出另一個(gè)國(guó)家的文字; 為什么需要第三個(gè),因?yàn)榈谌齻€(gè)貌似可以根據(jù)前兩個(gè)表示出來,這是因?yàn)橛行﹪?guó)家的語(yǔ)音是沒有文字的,那么這時(shí)候就需要語(yǔ)音翻譯。
硬train
我們以Hokkien(臺(tái)語(yǔ)、閩南語(yǔ))為例訓(xùn)練網(wǎng)絡(luò):
注意語(yǔ)音翻譯和語(yǔ)音辨識(shí)是不一樣的!
Text-to-Speech 語(yǔ)音合成
我們通過單詞解析出kk音節(jié),并將音節(jié)送到decoder中解析生成語(yǔ)音。
現(xiàn)在還不是end-to-end的網(wǎng)絡(luò)。
Seq2seq for Chatbot
聊天語(yǔ)音機(jī)器人。
通過訓(xùn)練數(shù)據(jù)來教機(jī)器人學(xué)習(xí)回答!
大多數(shù)NLP都可以是QA問題
比如閱讀理解; 比如摘要; 比如情感分析!而QA問題又可以轉(zhuǎn)為seq2seq問題。
深度學(xué)習(xí)與人類語(yǔ)言處理
但是不是所有的模型都轉(zhuǎn)化為seq2seq,就好像所有都用瑞士軍刀一樣,切菜、砍柴,它需要一個(gè)最合適的模型。
Seq2seq for Syntactic Parsing
文法剖析; 就是將一句話中某些詞鏈接起來就是動(dòng)詞片語(yǔ)、名詞片語(yǔ)等等。 名詞片語(yǔ)加動(dòng)詞片語(yǔ)就是一個(gè)句子等。 模型的輸出本來就是一個(gè)model tree,但是我們可以把它轉(zhuǎn)化為一個(gè)seq2seq。
這篇文章就是這樣做的,當(dāng)時(shí)都是用seq2seq做的翻譯,所以這篇文章題目才叫將語(yǔ)法作為外文語(yǔ)言這一說法!Seq2Seq for Multi-label Classification
注意multi-label不是multi-class,前者是一個(gè)物體可以屬于多個(gè)class,但是后者呢則是一個(gè)物體只能屬于一個(gè)class;
我們?cè)O(shè)置一個(gè)閾值,如果預(yù)測(cè)的結(jié)果大于某個(gè)值,那么它就屬于該類別,但是這樣肯定效果不會(huì)好。
所以我們將該問題定義為一個(gè)seq2seq問題,讓機(jī)器自己決定輸出幾個(gè)class
Seq2Seq for Object Detection
目標(biāo)檢測(cè)同樣可以硬解!!
Seq2seq
Seq2seq用途最廣泛的就是Transformer!
Encoder
利用encoder輸入一個(gè)向量,decoder輸出一個(gè)向量,而Transformer中使用的是self-attention,右側(cè)是原論文中的結(jié)構(gòu),不太好理解,我們換一個(gè)圖;
這里不稱一個(gè)Block是一個(gè)layer,是因?yàn)橐粋€(gè)Block里面是有好幾個(gè)layer在做的事情!
但是在Transformer中使用的是含有殘差結(jié)構(gòu)的輸出! 不明白殘差結(jié)構(gòu)的,建議看看用在圖像處理中的Resnet結(jié)構(gòu),通過加入這個(gè)結(jié)構(gòu)之后拯救了深度學(xué)習(xí),使得層數(shù)再次堆疊! 除此之外,這里的norm并不是batch normalization(BN層),而是layer Normalization(LN層)! 不需要考慮batch的資訊! BN中是不同feature、不同Example、相同dimension來計(jì)算mean、standard deviation LN中是同一feature、同一Example、不同dimension來計(jì)算mean、standard deviation 所以再次經(jīng)過右側(cè)后的輸出才是整個(gè)block的輸出!我們?cè)俅慰催@個(gè)網(wǎng)絡(luò)!
位置信息需要添加; 里面有三個(gè)箭頭指的是多個(gè)單詞! Multi-head Attention指的是self-attention的多頭版; Add&Norm值的是殘差和Layer Norm;最后再次經(jīng)過我們上面的說的FC層+norm+殘差結(jié)構(gòu)!
結(jié)合上圖的解釋,這里就比較好理解了!
To learn more
還是可以創(chuàng)造更多的encoder的! 只需要調(diào)整中間的布局
Decoder
Autoregressive 自回歸的(以語(yǔ)音辨識(shí)作為例子)!
我們通過Encoder之后,將我們的語(yǔ)音轉(zhuǎn)化為vector,并將該vector投入到decoder中產(chǎn)生一段話。
但是怎么產(chǎn)生這一段話呢?
BOS(begin of sentence)
就是在你的lexicon(詞典)里面多加一個(gè)Token,本來Decoder可能產(chǎn)生的文字里面呢,多加一個(gè)特殊的符號(hào),多加一個(gè)特殊的文字,這個(gè)字就代表了開始,代表了Begin。
對(duì)于NLP中的每一個(gè)token,都可以把它用一個(gè)One-Hot的Vector來表示,所以BOS也是用One-hot來表示。
第一次:
我們的Decoder吐出一個(gè)變量,這個(gè)變量的大小和vocabulary的大小是一樣的,vocabulary是根據(jù)你輸出的單位而不同的,你要先定義好自己要輸出什么。比如我們要輸出中文,我們以為它要輸出某些常用的3000字的方塊字,那么就是3000維度; 比如英文中我們可以是字母,但是字母太少了,我們可以用詞匯,詞匯太多了,我們使用subword,將英語(yǔ)的詞根詞尾切出來表示。
所以這里的就是我們要輸出的經(jīng)過softmax后的分布,根據(jù)哪個(gè)分?jǐn)?shù)最高定義我們的輸出得到哪個(gè);
第二次:
這里我們將有兩個(gè)輸入,“begin + 機(jī)”
第三次:
這里我們將有三個(gè)輸入: “begin+機(jī)+器”
第四次:
這里我們將有三個(gè)輸入: “begin+機(jī)+器+學(xué)”
所以Decoder的輸入是上一次的輸出;
所以Decoder還是有錯(cuò)誤的可能的,一步錯(cuò)步步錯(cuò) ,也就是Error Propogation! 但是我們現(xiàn)在先無視這個(gè)問題!
看一下Decoder內(nèi)部的結(jié)構(gòu)
我們可以看到Encoder和Decoder之間的差異基本在于中間紅色框中;
其二呢是Self-attention --》 Masked self-attention
masked self-attention
Self-attention 和 Masked self-attention的差距
只能考慮左邊的資訊,不能考慮右邊的資訊。
這里的自注意力是先有b1b^1b1再有b2b^2b2,是一個(gè)一個(gè)產(chǎn)生的,self-attention是多產(chǎn)生的;
所以我們并不知道輸出的長(zhǎng)度是多少,應(yīng)該是seq2seq。 (語(yǔ)音識(shí)別,你是不知道啥時(shí)候停止)
所以這就像推文接龍了,需要有人冒險(xiǎn)來給出“斷”來終止繼續(xù)往下接!!
所以我們只需要在“習(xí)”后面添加一個(gè)符號(hào), 在我們學(xué)習(xí)到這個(gè)字后自己會(huì)輸出一個(gè)“END”符號(hào)。
Non-autoregressive(NAT)
AT中我們假如要輸出一個(gè)長(zhǎng)度100的,那么AT Decoder需要運(yùn)行100次; 但是NAT中只需要運(yùn)行一次即可。但是也有問題,你怎么知道輸出的長(zhǎng)度呢? 需要自定義一個(gè)預(yù)測(cè)器來預(yù)測(cè)他的長(zhǎng)度。
相比于AT而言優(yōu)點(diǎn)就是速度要快,可以控制輸出長(zhǎng)度。
比如在語(yǔ)音合成中,你如果想讓視頻加速,那么你可以將NAT Decoder中的預(yù)測(cè)器的輸出結(jié)果乘以2,那么就會(huì)使得Decoder輸出更多!使得語(yǔ)音更快。
NAT是一個(gè)熱門主題,因?yàn)镹AT的表現(xiàn)還不如AT的好,因?yàn)橹虚g有Multi-Modality問題
Encoder和Decoder是如何傳遞資訊的
Cross-attention
可以看到Encoder輸入到Decoder中有兩個(gè)!分別是下面的k和v。我們以第二個(gè)字符作為例子來進(jìn)行說明。
Decoder總是拿Encoder的最后一層的結(jié)果嗎? 原始論文是這樣的,但是我們可以不這樣,因?yàn)镋ncoder是有很多層的,Decoder也是很多不同的層,那么你可以任意的鏈接,采用不同層的Encoder的輸出。
Training
以語(yǔ)義識(shí)別為準(zhǔn),首先準(zhǔn)備數(shù)據(jù)集,讓工具人來打標(biāo)簽; 其次我們將做GT標(biāo)記。 把該任務(wù)當(dāng)作分類任務(wù),最小化交叉熵。
①要使得交叉熵的總和最小
②這里我們每次的輸入都是Groundtruth(也就是說不用上一次的輸出,而是GT); 所以存在著MisMatch! 怎么解決后面說!
訓(xùn)練的Tips
Copy Mechanism
復(fù)制! 沒有必要都是產(chǎn)生新的詞!
Chat-bot
Summarization
產(chǎn)生摘要。 但是需要上百萬的文章,需要文章 + 摘要!更需要Copy功能
Guided Attention
當(dāng)我們輸出比較短的詞匯的時(shí)候,結(jié)果就不會(huì)好的
上面中的前幾句話都是抑揚(yáng)頓挫的讀! 最后一個(gè)甚至直接讀了一個(gè)字,而沒有讀“發(fā)”!
所以我們?cè)趺醋尵W(wǎng)絡(luò)讀所有的模型呢? 需要用到引導(dǎo)attention!
對(duì)于語(yǔ)音識(shí)別而言,我們的attention的順序應(yīng)該是確定的,不應(yīng)該是跳躍的獲取的,所以我們要提前定義attention的順序! 這是強(qiáng)制性的! 而不是根據(jù)Attention scores的分?jǐn)?shù)來定義輸入!
Monotonic Attention 和 Location-aware attention是兩個(gè)相關(guān)的論文
Beam Search
紅色的線: 貪婪算法,我們一直選擇最好的
綠色的線: 短期內(nèi)是不好的,但是長(zhǎng)時(shí)間下去是好的!
相當(dāng)于讀博士,短時(shí)間內(nèi)是難的,但是在長(zhǎng)期來說的是好的!
但是我們?cè)趺磿?huì)預(yù)知后面的結(jié)果呢? 這就需要我們先去預(yù)測(cè),使用Beam Search!
Beam Search有時(shí)候有用 ,有時(shí)候沒用!
但是Decoder是需要有隨機(jī)性的! 如果是語(yǔ)音識(shí)別這種一對(duì)一的結(jié)果,那么使用Beam Search是最好的! 但是面對(duì)那種需要機(jī)器發(fā)揮點(diǎn)創(chuàng)造力的情況,我們是需要噪音的!
比如語(yǔ)音合成!
優(yōu)化的參數(shù)
左邊:訓(xùn)練的時(shí)候使用Cross Entropy
右邊: 測(cè)試的時(shí)候使用的BLEU score,計(jì)算兩個(gè)句子之間的距離
但是我們最后在Validation的時(shí)候,并不是選擇的loss最小的model,而是使得BLEU分?jǐn)?shù)最大的model;
所以問題是,我們可以不可以直接使用BLEU分?jǐn)?shù),給它加一個(gè)負(fù)號(hào),使得它最小就可以了啊。
但是現(xiàn)實(shí)是, BLEU分?jǐn)?shù)是不能微分的,你根本沒辦法算兩個(gè)句子之間的! 而使用Cross Entropy可以計(jì)算單個(gè)詞之間的距離!
口訣: 遇到你無法用Optimization解決的問題時(shí),用RL硬Train一發(fā)就對(duì)了;
你無法optimization無法解決的Loss Function時(shí)候,把它當(dāng)作是RL的Reward,把你的Decoder當(dāng)作Agent,當(dāng)作RL問題!
Exposure bias
如果我們只是喂正確的詞,那么模型是沒有處理錯(cuò)誤輸入的能力的!所以我們需要在訓(xùn)練的時(shí)候,給它添加噪音! 這種技術(shù)叫做“Scheduled Sampling”。但是它會(huì)影響模型的平行化的能力
總結(jié)
以上是生活随笔為你收集整理的李宏毅机器学习(五)Transformer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不能用蛮力法解决的问题_溆浦事蒙汉:脱贫
- 下一篇: python安装requests库超时_