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