最近真的被mask搞得暈暈的,還是需要好好的看下哦
1、padding mask:處理非定長序列,區分padding和非padding部分,如在RNN等模型和Attention機制中的應用等
2、sequence mask:防止標簽泄露,如:Transformer decoder中的mask矩陣,BERT中的[Mask]位,XLNet中的mask矩陣等
PS:padding mask 和 sequence mask非官方命名
嗯,上面的解釋還是很暈的,還是要具體解讀一下的
本文參考知乎:https://zhuanlan.zhihu.com/p/139595546
后面讀了具體論文之后如有錯誤再修改
RNN中的Mask
對於RNN等模型,本身是可以直接處理不定長數據的,因此它不需要提前告知 sequence length,如下是pytorch下的LSTM定義:
nn.LSTM(input_size, hidden_size, *args, **kwargs)
但是在實踐中,為了 batch 訓練,一般會把不定長的序列 padding 到相同長度,再用 mask 去區分非 padding 部分和 padding 部分。
區分的目的是使得RNN只作用到它實際長度的句子,而不會處理無用的 padding 部分,這樣RNN的輸出和隱狀態都會是對應句子實際的最后一位。另外,對於token級別的任務,也可以通過mask去忽略 padding 部分對應的loss。
不過,在 pytorch 中,對 mask 的具體實現形式不是mask矩陣,而是通過一個句子長度列表來實現的,但本質一樣。實現如下,sentence_lens 表示的是這個batch中每一個句子的實際長度。
Attention中Mask
在 Attention 機制中,同樣需要忽略 padding 部分的影響,這里以transformer encoder中的self-attention為例:
防止標簽泄露
在語言模型中,常常需要從上一個詞預測下一個詞,但如果要在LM中應用 self attention 或者是同時使用上下文的信息,要想不泄露要預測的標簽信息,就需要 mask 來“遮蓋”它。不同的mask方式,也對應了一篇篇的paper,這里選取典型的幾個。
Transformer中的Mask
Transformer 是包括 Encoder和 Decoder的,Encoder中 self-attention 的 padding mask 如上,而 Decoder 還需要防止標簽泄露,即在 t 時刻不能看到 t 時刻之后的信息,因此在上述 padding mask的基礎上,還要加上 sequence mask。
sequence mask 一般是通過生成一個上三角矩陣來實現的,上三角區域對應要mask的部分。
在Transformer 的 Decoder中,先不考慮 padding mask,一個包括四個詞的句子[A,B,C,D]在計算了相似度scores之后,得到下面第一幅圖,將scores的上三角區域mask掉,即替換為負無窮,再做softmax得到第三幅圖。這樣,比如輸入 B 在self-attention之后,也只和A,B有關,而與后序信息無關。
self-attention中,Q和K在點積之后,需要先經過mask再進行softmax,因此,對於要屏蔽的部分,mask之后的輸出需要為負無窮,這樣softmax之后輸出才為0。
BERT中的Mask
BERT實際上是Transformer的Encoder,為了在語言模型的訓練中,使用上下文信息又不泄露標簽信息,采用了Masked LM,簡單來說就是隨機的選擇序列的部分token用 [Mask] 標記代替。
這波Mask操作,思想很直接,實現很簡單,效果很驚人。