RNN
RNN 按照時間步展開
Bi-RNN
向前和向后的隱含層之間沒有信息流。
LSTM
長短期記憶(Long short-term memory, LSTM)是一種特殊的RNN,主要是為了解決長序列訓練過程中的梯度消失問題。
LSTM 對內部結構進行精心的設計,加入了輸入門,遺忘門,輸出門,和一個內部記憶單元\(c_t\)。輸入門控制當前計算新狀態以多大程度更新到記憶單元;遺忘門控制前一步記憶單元中的信息有多大程度被遺忘;輸出門控制當前輸出有多大程度上取決於當前的記憶單元。
和普通RNN相比,主要的輸入輸出區別如下
相比RNN只有一個傳遞狀態\(h^t\),LSTM有兩個傳輸狀態,\(c^t\) (cell state)和 \(h^t\)(hidden state)。
計算公式
參數量計算
\((hidden size * (hidden size + x_dim ) + hidden size) *4\)
self-attention
核心思想:用文本中的其他詞來增強目標詞的語義表示,從而更好地利用上下文信息。
計算步驟:
- 相似度計算
- softmax
- 加權平均
問題:常規的attention中,一般k=v, 那么self-attention中可以這樣嗎。
bert
推薦看原文哦: 超細節的BERT/Transformer知識點
史上最細節的自然語言處理NLP/Transformer/BERT/Attention面試問題與答案
上一個鏈接里問題的答案
論文
- Transformer: Attention Is All You Need
- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
源碼
問題
問題:為什么選擇使用[cls]的輸出代表整句話的語義表示?
或者說為什么不選擇token1的輸出
BERT在第一句前會加一個[CLS]標志,最后一層該位對應向量可以作為整句話的語義表示,從而用於下游的分類任務等。
為什么選它呢,
- 因為與文本中已有的其它詞相比,這個無明顯語義信息的符號會更“公平”地融合文本中各個詞的語義信息,從而更好的表示整句話的語義。
- 從上面self-attention圖片中可以看出把cls位置當做q,類似於站在全局的角度去觀察整個句子文本。
問題:為什么是雙線性點積模型(經過線性變換Q != K)?
- 雙線性點積模型,引入非對稱性,更具健壯性(Attention mask對角元素值不一定是最大的,也就是說當前位置對自身的注意力得分不一定最高)
展開解釋:
- self-attention中,sequence中的每個詞都會和sequence中的每個詞做點積去計算相似度,也包括這個詞本身。
- 對於 self-attention,一般會說它的 q=k=v,這里的相等實際上是指它們來自同一個基礎向量,而在實際計算時,它們是不一樣的,因為這三者都是乘了QKV參數矩陣的。那如果不乘,每個詞對應的q,k,v就是完全一樣的。
- 在相同量級的情況下,\(q_i\) 與 \(k_i\) 點積的值會是最大的(可以從“兩數和相同的情況下,兩數相等對應的積最大”類比過來)。
- 那在softmax后的加權平均中,該詞本身所占的比重將會是最大的,使得其他詞的比重很少,無法有效利用上下文信息來增強當前詞的語義表示。
- 而乘以QKV參數矩陣,會使得每個詞的q,k,v都不一樣,能很大程度上減輕上述的影響。
問題:self-attention的時間復雜度
- 時間復雜復雜度為:\(O(n^2d)\)
- 相似度計算可以看成矩陣(n×d)×(d×n),這一步的時間復雜度為O(n×d×n)
- softmax的時間復雜度O(n^2)
- 加權平均可以看成矩陣(n×n)×(n×d), 時間復雜度為O(n×n×d)
多頭注意力機制的時間復雜度:
hidden_size (d) = num_attention_heads (m) * attention_head_size (a),也即 d=m*a
- 並將 num_attention_heads 維度transpose到前面,使得Q和K的維度都是(m,n,a),這里不考慮batch維度。
- 這樣點積可以看作大小為(m,n,a)和(m,a,n)的兩個張量相乘,得到一個(m,n,n)的矩陣,其實就相當於(n,a)和(a,n)的兩個矩陣相乘,做了m次,時間復雜度是\(O(n^2×a×m) = O(n^2d)\)
問題:BERT 怎么處理長文本?
問題:BERT 比ELMO 效果好的原因
從網絡結構以及最后的實驗效果來看,BERT 比 ELMo 效果好主要集中在以下幾點原因:
- LSTM 抽取特征的能力遠弱於 Transformer
- 拼接方式雙向融合的特征融合能力偏弱(沒有具體實驗驗證,只是推測)
- 其實還有一點,BERT 的訓練數據以及模型參數均多余 ELMo,這也是比較重要的一點
知乎:transformer中multi-head attention中每個head為什么要進行降維?
link
簡潔的說:在不增加時間復雜度的情況下,同時,借鑒CNN多核的思想,在更低的維度,在多個獨立的特征空間,更容易學習到更豐富的特征信息。
問題:BERT中的mask
- 預訓練的時候在句子編碼的時候將部分詞mask,這個主要作用是用被mask詞前后的詞來去猜測mask掉的詞是什么,因為是人為mask掉的,所以計算機是知道mask詞的正確值,所以也可以判斷模型猜的詞是否准確。
- Transformer模型的decoder層存在mask,這個mask的作用是在翻譯預測的時候,如“我愛你”,翻譯成“I love you”,模型在預測love的時候是不知道you的信息,所以需r要把后面“you”的信息mask掉。但是bert只有encoder層,所以這個算是transformer模型的特征。
- 每個attention模塊都有一個可選擇的mask操作,這個主要是輸入的句子可能存在填0的操作,attention模塊不需要把填0的無意義的信息算進來,所以使用mask操作。
問題:bert中進行ner為什么沒有使用crf;使用DL進行序列標注問題的時候CRF是必備嘛(todo: in action)
-
進行序列標注時CRF是必須的嗎?
如果你已經將問題本身確定為序列標注了,並且正確的標注結果是唯一的,那么用CRF理論上是有正的收益的,但如果主體是BERT等預訓練模型,那么可能要調一下CRF層的學習率,參考CRF層的學習率可能不夠大 -
進行NER時必須轉為序列標注嗎?
就原始問題而言,不論是NER、詞性標注還是閱讀理解等,都不一定要轉化為序列標注問題,既然不轉化為序列標注問題,自然也就用不着CRF了。不轉化為序列標注的做法也有很多,比如筆者提的GlobalPointer
問題:BERT的初始標准差為什么是0.02?
Retrieved from https://kexue.fm/archives/8747
cnn vs rnn vs self-attention
語義特征提取能力
- 目前實驗支持如下結論:Transformer在這方便的能力非常顯著超過RNN和CNN,RNN和CNN兩者能力差不多。
長距離特征捕捉能力
實驗支持如下結論:- 原生CNN特征抽取器在這方面顯著弱於RNN和Transformer
- Transformer微弱優於RNN模型(距離小於13的時)
- 在比較遠的距離上RNN微弱優於Transformer
任務綜合特征抽取能力(機器翻譯)
Transformer > 原生CNN == 原生RNN
並行計算能力及運行效率
Transformer和CNN差不多,都強於RNN