NLP中的Mask全解
?PaperWeekly 原創(chuàng) ·?作者|海晨威
學(xué)校|同濟(jì)大學(xué)碩士生
研究方向|自然語(yǔ)言處理
Mask 在 NLP 中是一個(gè)很常規(guī)的操作,也有多種應(yīng)用的場(chǎng)景和形式,下面嘗試從以下幾個(gè)方面去全解(用了夸張的修辭手法)Mask,并盡可能地輔以圖片說明和代碼解釋:?
1. Mask 的作用?
處理非定長(zhǎng)序列
RNN 中的 Mask?
Attention 中 Mask?
2. 防止標(biāo)簽泄露?
Transformer 中的 Mask?
BERT 中的 Mask?
XLNet 中的 Mask
Mask的作用
對(duì)于 NLP 中 mask 的作用,先上結(jié)論:?
1. padding mask:處理非定長(zhǎng)序列,區(qū)分 padding 和非 padding 部分,如在 RNN 等模型和 Attention 機(jī)制中的應(yīng)用等;
2. sequence mask:防止標(biāo)簽泄露,如:Transformer decoder 中的 mask 矩陣,BERT 中的 [Mask] 位,XLNet 中的 mask 矩陣等。
PS:padding mask 和 sequence mask非官方命名。
處理非定長(zhǎng)序列?
在 NLP 中,文本一般是不定長(zhǎng)的,所以在進(jìn)行 batch 訓(xùn)練之前,要先進(jìn)行長(zhǎng)度的統(tǒng)一,過長(zhǎng)的句子可以通過 truncating 截?cái)嗟焦潭ǖ拈L(zhǎng)度,過短的句子可以通過 padding 增加到固定的長(zhǎng)度,但是 padding 對(duì)應(yīng)的字符只是為了統(tǒng)一長(zhǎng)度,并沒有實(shí)際的價(jià)值,因此希望在之后的計(jì)算中屏蔽它們,這時(shí)候就需要 Mask。
上圖(圖片參考?[1])為中文場(chǎng)景下,一個(gè) batch=5 的,以字為單位的輸入矩陣(也可以在分詞后以詞為單位)和 mask 矩陣,左圖已經(jīng)將文本 padding 到統(tǒng)一長(zhǎng)度了,右圖中的 1 表示有效字,0 代表無效字。
RNN中的Mask?
對(duì)于 RNN 等模型,本身是可以直接處理不定長(zhǎng)數(shù)據(jù)的,因此它不需要提前告知? sequence length,如下是 PyTorch 下的 LSTM 定義:
nn.LSTM(input_size,?hidden_size,?*args,?**kwargs)最終,R-MeN 將這 3 個(gè)編碼向量反饋給基于 CNN 的解碼器,返回一個(gè)三元組的得分。
但是在實(shí)踐中,為了 batch 訓(xùn)練,一般會(huì)把不定長(zhǎng)的序列 padding 到相同長(zhǎng)度,再用 mask 去區(qū)分非 padding 部分和 padding 部分。?
區(qū)分的目的是使得 RNN 只作用到它實(shí)際長(zhǎng)度的句子,而不會(huì)處理無用的 padding 部分,這樣 RNN 的輸出和隱狀態(tài)都會(huì)是對(duì)應(yīng)句子實(shí)際的最后一位。另外,對(duì)于 token 級(jí)別的任務(wù),也可以通過 mask 去忽略 padding 部分對(duì)應(yīng)的 loss。?
不過,在 PyTorch 中,對(duì) mask 的具體實(shí)現(xiàn)形式不是 mask 矩陣,而是通過一個(gè)句子長(zhǎng)度列表來實(shí)現(xiàn)的,但本質(zhì)一樣。實(shí)現(xiàn)如下,sentence_lens 表示的是這個(gè) batch 中每一個(gè)句子的實(shí)際長(zhǎng)度(參考 [2])。
embed_input_x_packed?=?pack_padded_sequence(embed_input_x,?sentence_lens,?batch_first=True) encoder_outputs_packed,?(h_last,?c_last)?=?self.lstm(embed_input_x_packed) encoder_outputs,?_?=?pad_packed_sequence(encoder_outputs_packed,?batch_first=True)btw,在 PyTorch 的 Embedding 和 Loss 中也有對(duì) padding 值的設(shè)置:
#?padding_idx?(int,?optional):?If?given,?pads?the?output?with?the?embedding?vector?at? #?`padding_idx`?(initialized?to?zeros)?whenever?it?encounters?the?index. embedding?=?nn.Embedding(vocab_size,?embed_dim,?padding_idx=0)#?ignore_index?(int,?optional):?Specifies?a?target?value?that?is?ignored #?and?does?not?contribute?to?the?input?gradient. criterion?=?nn.CrossEntropyLoss(ignore_index=0)Attention中Mask?
在 Attention 機(jī)制中,同樣需要忽略 padding 部分的影響,這里以 transformer encoder 中的 self-attention 為例:?
self-attention 中,Q 和 K 在點(diǎn)積之后,需要先經(jīng)過 mask 再進(jìn)行 softmax,因此,對(duì)于要屏蔽的部分,mask 之后的輸出需要為負(fù)無窮,這樣 softmax 之后輸出才為 0。
▲ The self-attention calculation in matrix form?(圖片參考 [3])
def?attention(query,?key,?value,?mask=None,?dropout=None):"Compute?'Scaled?Dot?Product?Attention'"d_k?=?query.size(-1)scores?=?torch.matmul(query,?key.transpose(-2,?-1))?\/?math.sqrt(d_k)if?mask?is?not?None:scores?=?scores.masked_fill(mask?==?0,?-1e9)?#?mask步驟,用?-1e9?代表負(fù)無窮p_attn?=?F.softmax(scores,?dim?=?-1)if?dropout?is?not?None:p_attn?=?dropout(p_attn)return?torch.matmul(p_attn,?value),?p_attn▲ 代碼參考 [4]
PS:上述兩個(gè)參考都是非常好的 transformer 介紹文章,參考 1,圖片與文字相得益彰,參考 2,代碼與講解相輔相成。
防止標(biāo)簽泄露
在語(yǔ)言模型中,常常需要從上一個(gè)詞預(yù)測(cè)下一個(gè)詞,但如果要在 LM 中應(yīng)用 self attention 或者是同時(shí)使用上下文的信息,要想不泄露要預(yù)測(cè)的標(biāo)簽信息,就需要 mask 來“遮蓋”它。不同的 mask 方式,也對(duì)應(yīng)了一篇篇的 paper,這里選取典型的幾個(gè)。?
Transformer中的Mask?
Transformer 是包括 Encoder和 Decoder的,Encoder中 self-attention 的 padding mask 如上,而 Decoder 還需要防止標(biāo)簽泄露,即在 t 時(shí)刻不能看到 t 時(shí)刻之后的信息,因此在上述 padding mask 的基礎(chǔ)上,還要加上 sequence mask。?
sequence mask 一般是通過生成一個(gè)上三角矩陣來實(shí)現(xiàn)的,上三角區(qū)域?qū)?yīng)要 mask 的部分。?
在 Transformer 的 Decoder 中,先不考慮 padding mask,一個(gè)包括四個(gè)詞的句子 [A,B,C,D] 在計(jì)算了相似度 scores 之后,得到下面第一幅圖,將 scores 的上三角區(qū)域 mask 掉,即替換為負(fù)無窮,再做 softmax 得到第三幅圖。這樣,比如輸入 B 在 self-attention 之后,也只和 A,B 有關(guān),而與后序信息無關(guān)。?
因?yàn)樵?softmax 之后的加權(quán)平均中: B‘ = 0.48*A+0.52*B,而 C,D 對(duì) B' 不做貢獻(xiàn)。
▲ 圖片參考?[5]
實(shí)際應(yīng)用中,Decoder 需要結(jié)合 padding mask 和 sequence mask,下面在 PyTorch 框架下以一個(gè)很簡(jiǎn)化的例子展示 Transformer 中的兩種 Mask。
import?torchdef?padding_mask(seq,?pad_idx):return?(seq?!=?pad_idx).unsqueeze(-2)???#?[B,?1,?L]def?sequence_mask(seq):batch_size,?seq_len?=?seq.size()mask?=?1-?torch.triu(torch.ones((seq_len,?seq_len),?dtype=torch.uint8),diagonal=1)mask?=?mask.unsqueeze(0).expand(batch_size,?-1,?-1)??#?[B,?L,?L]return?maskdef?test():#?以最簡(jiǎn)化的形式測(cè)試Transformer的兩種maskseq?=?torch.LongTensor([[1,2,0]])?#?batch_size=1,?seq_len=3,padding_idx=0embedding?=?torch.nn.Embedding(num_embeddings=3,?embedding_dim=10,?padding_idx=0)query,?key?=?embedding(seq),?embedding(seq)scores?=?torch.matmul(query,?key.transpose(-2,?-1))mask_p?=?padding_mask(seq,?0)mask_s?=?sequence_mask(seq)mask_decoder?=?mask_p?&?mask_s?#?結(jié)合?padding?mask?和?sequence?maskscores_encoder?=?scores.masked_fill(mask_p==0,?-1e9)?#?對(duì)于scores,在mask==0的位置填充scores_decoder?=?scores.masked_fill(mask_decoder==0,?-1e9)test()對(duì)應(yīng)的各 mask 值為:
#?mask_p [[[1?1?0]]] #?mask_s [[[1?0?0][1?1?0][1?1?1]]] #?mask_decoder [[[1?0?0][1?1?0][1?1?0]]]可以看到 mask_decoder 的第三列為 0 ,對(duì)應(yīng) padding mask,上三角為 0,對(duì)應(yīng) sequence mask。?
BERT中的Mask?
BERT 實(shí)際上是 Transformer 的 Encoder,為了在語(yǔ)言模型的訓(xùn)練中,使用上下文信息又不泄露標(biāo)簽信息,采用了 Masked LM,簡(jiǎn)單來說就是隨機(jī)的選擇序列的部分 token 用 [Mask] 標(biāo)記代替。這波 Mask 操作,思想很直接,實(shí)現(xiàn)很簡(jiǎn)單,效果很驚人。
BERT 之后,也有不少在 Mask 的范圍和形式上做文章的,比如:ERNIE,但大同小異,不多贅述。?
而 XLNet 的 Mask 操作非常的巧(nan)妙(dong),如下。?
XLNet中的Mask?
XLNet 通過 Permutation Language Modeling 實(shí)現(xiàn)了不在輸入中加 [Mask],同樣可以利用上下文信息,關(guān)鍵的操作就是下面所示的 Attention Mask 機(jī)制。
但并不是那么好理解,要理解 XLNet 中的 Mask,一定要先看張俊林老師的:XLNet:運(yùn)行機(jī)制及和 Bert 的異同比較 [6],再來看下面的內(nèi)容。上圖也是引自該文,這里再引用一句我認(rèn)為非常關(guān)鍵的一段話:?
在 Transformer 內(nèi)部,通過 Attention 掩碼,從 X 的輸入單詞里面,也就是 Ti 的上文和下文單詞中,隨機(jī)選擇 i-1 個(gè),放到 Ti 的上文位置中,把其它單詞的輸入通過 Attention 掩碼隱藏掉,于是就能夠達(dá)成我們期望的目標(biāo)(當(dāng)然這個(gè)所謂放到 Ti 的上文位置,只是一種形象的說法,其實(shí)在內(nèi)部,就是通過 Attention Mask,把其它沒有被選到的單詞 Mask 掉,不讓它們?cè)陬A(yù)測(cè)單詞 Ti 的時(shí)候發(fā)生作用,如此而已??粗皖愃朴诎堰@些被選中的單詞放到了上文 Context_before 的位置了)。?
對(duì)于排列序列:3->2->4->1,通過 Attention Mask,在 self-attention 的加權(quán)平均計(jì)算中,以上圖中的??為例:?
self-attention 計(jì)算之后 Content stream 中的?,其中??表示第 2 個(gè)詞對(duì)應(yīng)的向量,其他同理。這樣在??中就看到了它的下文?,就好像是把??放到了它的上文位置一樣,但實(shí)際順序并沒有改變。?
對(duì)序列進(jìn)行排列的目的是為了生成這個(gè) Attention Mask,再加上雙流注意力去解決預(yù)測(cè)歧義的問題,可以說就是 Permutation Language Modeling 的全部了。?
到這里,就是本文全部的 Mask,但這肯定不是 NLP 中 Mask 的全部,但希望能幫助你去更好地理解 Mask。
參考文獻(xiàn)
[1] https://www.cnblogs.com/neopenx/p/4806006.html
[2] https://zhuanlan.zhihu.com/p/34418001
[3] https://jalammar.github.io/illustrated-transformer/
[4]?http://nlp.seas.harvard.edu/2018/04/03/attention.html#attention
[5] https://baijiahao.baidu.com/s?id=1652093322137148754&wfr=spider&for=pc
[6] https://zhuanlan.zhihu.com/p/70257427
點(diǎn)擊以下標(biāo)題查看更多往期內(nèi)容:?
對(duì)比學(xué)習(xí)(Contrastive Learning)相關(guān)進(jìn)展梳理
從ACL和ICLR看知識(shí)圖譜嵌入的近期研究進(jìn)展
BERT在小米NLP業(yè)務(wù)中的實(shí)戰(zhàn)探索
針對(duì)復(fù)雜問題的知識(shí)圖譜問答最新進(jìn)展
復(fù)旦大學(xué)邱錫鵬教授:NLP預(yù)訓(xùn)練模型綜述
淺談嵌套命名實(shí)體識(shí)別(Nested NER)
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識(shí)的人。
總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得或技術(shù)干貨。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來。
?????來稿標(biāo)準(zhǔn):
? 稿件確系個(gè)人原創(chuàng)作品,來稿需注明作者個(gè)人信息(姓名+學(xué)校/工作單位+學(xué)歷/職位+研究方向)?
? 如果文章并非首發(fā),請(qǐng)?jiān)谕陡鍟r(shí)提醒并附上所有已發(fā)布鏈接?
? PaperWeekly 默認(rèn)每篇文章都是首發(fā),均會(huì)添加“原創(chuàng)”標(biāo)志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請(qǐng)單獨(dú)在附件中發(fā)送?
? 請(qǐng)留下即時(shí)聯(lián)系方式(微信或手機(jī)),以便我們?cè)诰庉嫲l(fā)布時(shí)和作者溝通
????
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁(yè)搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結(jié)
以上是生活随笔為你收集整理的NLP中的Mask全解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做过这个NLP项目的面试通过率高达 90
- 下一篇: 军校博士生毕业军医上尉军衔工资待遇?