Datawhale-零基础入门NLP-新闻文本分类Task06
之前已經用RNN和CNN進行文本分類,隨著NLP的熱門,又出現了大熱的Attention,Bert,GPT等模型,接下來,就從理論進行相關學習吧。接下來,我們會經常聽到“下游任務”等名詞,下游任務就是NLP領域稱之為利用預先訓練的模型或組件的監督學習任務。
目錄
1?學習路徑
2 Seq2Seq
3 Attention
4 Transformer
1?學習路徑
2 Seq2Seq
Seq2Seq全稱是Sequence to Sequence,稱之為序列到序列模型,是RNN的一個變體,常用于機器翻譯、語音識別、自動對話等任務。其核心思想是通過深度神經網絡將一個作為輸入的序列映射為一個作為輸出的序列,這一過程由編碼輸入到解碼輸出兩個環節構成。編碼器Encoder和解碼器Decoder各由一個循環神經網絡構成,兩個網絡是共同訓練的。
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Encoder-Decoder模型能有效地解決建模時輸入序列和輸出不等長的問題。Seq2Seq的編碼器就是循環神經網絡(RNN,LSTM,GRU),將句子輸入至encoder中,生成一個Context vector,Context vector是Encoder的最后一個hidden state,即將輸入句壓縮成固定長度的context vector,再通過Decoder將context vector內的信息產生輸出句。相關函數為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其中,C為編碼器函數,Y為解碼器函數。
解碼時采用集束搜索策略,會保存b個當前的較佳選擇,然后解碼時每一步根據保存的選擇進行下一步擴展和排序,接著選擇前b個進行保存,循環迭代直到找到最佳結果。
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
除此之外,堆疊RNN、增加Dropout機制、與編碼器之間建立殘差連接等均是常用的改進措施。但是在實際應用中,會發現隨著輸入序列的增長,模型的性能發生了顯著的下降。因為編碼時輸入序列的全部信息壓縮到了一個向量表示,隨著序列增長,句子越前面的詞的信息丟失就越嚴重。同時,Seq2Seq模型的輸出序列中,會損失部分輸入序列的信息,在解碼時,當前詞及對應的源語言詞的上下文信息和位置信息丟失了。
3 Attention
為解決上述存在的問題(句子過長,效果不佳),引入了注意力機制(Attention Mechanism),改進點為:Seq2Seq編碼之后有一個固定長度的context vector,Attention模型是生成N個(N個輸入文字)固定長度的context vector,結構如圖所示:
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
context vector是輸入序列全部隱藏狀態的一個加權和,即attention score乘以一個輸入的隱狀態,其計算為:
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
神經網絡a將上一個輸出序列隱狀態和輸入序列隱狀態作為數據,計算得到,然后歸一化,得到(此時存在一個softmax操作),用來衡量輸入句中的每個文字對目標句中的每個文字所帶來重要性的程度。其score計算為
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Attention模型的編碼器是雙向RNN(Bi-directional RNN),每一個訓練序列向前和向后分別是兩個循環神經網絡(RNN),而且這兩個都連接著一個輸出層。這個結構提供給輸出層輸入序列中每一個點的完整的過去和未來的上下文信息。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Attention model雖然解決了輸入句僅有一個contect vector的缺點,依然存在很多問題:
- context vector計算的是輸入句、目標句間的關聯,卻忽略了輸入句中文字間的關聯,和目標句中文字間的關聯性
- RNN的自身缺點就是無法平行化處理,導致模型訓練的時間很長
4 Transformer
RNN是2017年,發表了“The transformer”模型,解決了傳統的Attention model 無法平行化的缺點,主要概念有(1)self attention (2)Multi-head。The Transformer和Seq2Seq有一樣的結構,Encoder和Decoder,Transformer的結構是有6個Encoder和6個Decoder,結構如下:
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
細節結構展示:
?? ? ? ? ? ? ??
(1)位置編碼(Positional Encoding)
encoder的輸入層和decoder的輸入層是一樣的結構,都是token embedding(詞向量)+ positional embedding(位置向量),得到最終的輸入向量。之所以引入positional embedding主要是解決單單使用token embedding(類似于詞袋子),并沒有詞序的概念的問題。因為該模型并不包括任何的循環或卷積神經網絡,所以模型添加了位置編碼,為模型提供了關于單詞再句子中相對位置的信息。這個向量能決定當前詞的位置,或者說在一個句子中不同的詞之間的距離。計算方法如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
pos表示單詞的位置,i是指單詞的維度,偶數位置用正弦,奇數位置用余弦。
(2)編碼器(Encoder)
Encoder的編碼結構是一層self Attention,一層Feed Forward,self Attention是得到一個矩陣來最終Feed Forward的輸入,在進行Feed Forward之前,還進行了殘差連接和歸一化操作。Feed Forward是前饋神經網絡,常用的有DNN、CNN等。
a.自身注意力(self Attention)
self Attention結構里是分為Scaled-Dot-Product Attention 和Multi head Attention。
(一)Scaled-Dot-Product Attention
Scaled-Dot-Product Attention首先要計算Q(Query),K(Key),V(Value)矩陣,輸入句中的每個文字是由一系列成對的<key,value>組成,而目標中的每個文件是Query,則如何用Q,K,V來重新表示context vector呢?
首先計算Query和各個key的相似性,得到每個key對應value的權重系數,即為attention score,value是對應的訊息,再對value進行加權求和得到最終的Attention。計算過程如下:
?? ? ? ? ? ? ? ? ? ? ?
Attention到self Attention的變化為:
? ? ? ? ? ? ? ? ? ? ——>? ? ? ? ??
? ? ? ? ? ?? ——>? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ——> ? ? ? ? ?
為避免內積過大,使得softmax之后的結果非1即0,在計算相似性的時候增加一個,即變為
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Transformer是進行并行計算的,計算過程(忽略了的計算)如圖所示:
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
(二)Multi-head Attention
只計算單個Attention很難捕捉輸入句中所有空間的訊息,為了優化模型,論文提出了一個multi head的概念,把key,value,query線性映射到不同空間h次,但是在傳入Scaled-Dot-Product Attention中時,需要固定的長度,因此再對head進行concat,結構如下:
? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Multi-head attention由四部分組成:
-
用linear并分拆成Multi head(作者就將512維向量拆成8份,每64維得到一個向量);
-
經過Scaled-Dot-Product Attention生成n(8)個B矩陣;
-
concat,新增一個權重系數,將b1,...,bn,合并成B傳入下一層;
-
再增加一層Linear Layer。
Multi Head Attention的過程如下(以兩個head為例):
? ? ? ? ? ? ? ? ??
按照論文,將有8個b向量,在通過權重矩陣計算,得到最終的B向量。
b.殘差連接(Residual Connections)
在進行self attention和feed forward兩個模塊連接時,增加一個sub layer,主要進行residual connection和layer normalization。
深度學習常見的歸一化有BN(Batch Normalization)、LN(Layer Normalization),Batch Normalization 的處理對象是對一批樣本進行縱向處理, Layer Normalization 的處理對象是單個樣本,禁止橫向處理。Batch Normalization 是對這批樣本的同一維度特征做歸一化, Layer Normalization 是對這單個樣本的所有維度特征做歸一化。
為什么Transformer用LN,而不用BN?
1)layer normalization 有助于得到一個球體空間中符合0均值1方差高斯分布的 embedding, batch normalization不具備這個功能。
2) layer normalization可以對transformer學習過程中由于多詞條embedding累加可能帶來的“尺度”問題施加約束,相當于對表達每個詞一詞多義的空間施加了約束,有效降低模型方差。batch normalization也不具備這個功能。
LN用于RNN進行Normalization時,取得了比BN更好的效果。但用于CNN時,效果并不如BN。
只有一個編碼器(Encoder)時的結構:
有多個編碼器和解碼器的結構:
c.前饋神經網絡(Feed Forward)
模型里邊是增加了兩個dense層,就是普通的全連接層。
(3)解碼器(Decoder)
解碼器和編碼器相比略有不同,在解碼器中,只允許self Attention的輸出序列中較早的位置,通過在self Attention計算的softmax步驟之前屏蔽未來位置(將它們設置為-inf)來完成的。
每個解碼器層包括以下子層:
- 遮擋的多頭注意力(padding mask和sequence mask)
- 多頭注意力(用填充遮擋)。V(數值)和 K(主鍵)接收編碼器輸出作為輸入。Q(請求)接收遮擋的多頭注意力子層的輸出。
- 點式前饋網絡
- ?每個子層在其周圍有一個殘差連接,然后進行層歸一化。
a、masked mutil-head attetion
?mask 表示掩碼,它對某些值進行掩蓋,使其在參數更新時不產生效果。Transformer 模型里面涉及兩種 mask,分別是 padding mask 和 sequence mask。其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 decoder 的 self-attention 里面用到。
Masked是相當于蓋住你當前關注的詞的后面所有詞,我只關心前面出現的詞,而后面的詞我不關注,因為我要生成后面的詞(圖是self Attention和Masked self Attention的區別)。
(4)線性層和softmax層(?Linear and Softmax Layer)
在解碼器(Decoder)之后有增加了一層Linear和Softmax,結構如下:
?
(5)常見面試題
a、多頭機制為什么有效?
類似于CNN中通過多通道機制進行特征選擇,Transformer中先通過切頭(spilt)再分別進行Scaled Dot-Product Attention,可以使進行點積計算的維度d不大(防止梯度消失),同時縮小attention mask矩陣。
b、self-attention為什么要縮放,并選用?
縮放是為了防止梯度消失。
softmax把一些輸入映射為0-1之間的實數,并且歸一化保證和為1,公式為:
基于Transformer的模型另開一篇博客,細節太多了。
參考:
https://jalammar.github.io/illustrated-transformer/
https://www.sohu.com/a/258474757_505915
https://tensorflow.google.cn/tutorials/text/transformer#創建_transformer
https://www.aboutyun.com/thread-27818-1-1.html
https://www.jianshu.com/p/367c456cc4cf
Transformer——李宏毅視頻
https://www.zhihu.com/question/395811291/answer/1260290120
總結
以上是生活随笔為你收集整理的Datawhale-零基础入门NLP-新闻文本分类Task06的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python os renames_Py
- 下一篇: android 4.4 下拉菜单 透明,