Bert為什麼要Mask?

時間 2021-12-23 17:14:21

1樓:月來客棧

BERT需要Mask完全是因為用了Transformer模組的原因,因此想要知道BERT為什麼需要mask其實就是在問Transformer為什麼需要mask。但是兩者有個不同的地方在於,由於BERT只是使用了Transformer中的Encoder部分,沒有Decoder部分,因此相較於Transformer中的兩種mask(key padding mask和attention mask)BERT中只有key padding mask,也就是忽略掉padding部分的資訊,而在Transformer的解碼階段還需要忽略掉當前位置之後的資訊所以還要使用attention mask。

這裡需要注意的是,在不同的地方很多都把BERT中的mask也叫做attention mask,其實質上對應的是Transformer中的key padding mask(PyTorch是這麼起名的)。所以為什麼要mask,最好是理解清楚Transformer中的mask你就會明白了。

空字元:This post is all you need(層層剝開Transformer)

簡單了解的話參考下面內容即可!

如圖3所示,在訓練過程中對於每乙個樣本來說都需要這樣乙個對稱矩陣來掩蓋掉當前時刻之後所有位置的資訊。

圖 3. 注意力掩碼計算過程圖

從圖3可以看出,這個注意力掩碼矩陣的形狀為[tgt_len,tgt_len]。在後續實現過程中,我們將通過generate_square_subsequent_mask方法來生成這樣乙個矩陣。同時,在後續多頭注意力機制實現中,將通過attn_mask這一變數名來指代這個矩陣。

在Transformer中,使用到掩碼的第2個地方便是Padding Mask。由於在網路的訓練過程中同乙個batch會包含有多個文字序列,而不同的序列長度並不一致。因此在資料集的生成過程中,就需要將同乙個batch中的序列Padding到相同的長度。

但是,這樣就會導致在注意力的計算過程中會考慮到Padding位置上的資訊。

圖 4. Padding時注意力計算過程圖

如圖4所示,P表示Padding的位置,右邊的矩陣表示計算得到的注意力權重矩陣。可以看到,此時的注意力權重對於Padding位置山的資訊也會加以考慮。因此在Transformer中,作者通過在生成訓練集的過程中記錄下每個樣本Padding的實際位置;然後再將注意力權重矩陣中對應位置的權重替換成負無窮便達到了忽略Padding位置資訊的目的。

這種做法也是Encoder-Decoder網路結構中通用的一種辦法。

圖 5. Padding掩碼計算過程圖

如圖5所示,對於」我是誰 P P「這個序列來說,前3個字元是正常的,後2個字元是Padding後的結果。因此,其Mask向量便為[True, True, True, False, False]。通過這個Mask向量可知,需要將權重矩陣的最後兩列替換成負無窮,在後續我們會通過torch.

masked_fill這個方法來完成這一步,並且在實現時將使用key_padding_mask來指代這一向量。

為什麼 Bert 的三個 Embedding 可以進行相加?

蓋肉特別慌 可以相加當然可以相加,其他人已經解釋的挺清楚了,但是相加不一定是唯一 最好的方法 DeBERTa 就是分開做的,content 和 position 兩套互通的 attention,效果也不錯,就看你計算開銷有多少了 是否一定成立呢,假設如今有兩個特徵,互為相反數關係,如果相加了那對於任...

BERT中進行NER為什麼沒有使用CRF,我們使用DL進行序列標註問題的時候CRF是必備麼?

不用這麼糾結哈,都試試就行了。我主要說一下我對這個問題的理解 BERT CRF的搭配中,有必要單獨給CRF轉移矩陣引數設定乙個較大的學習率嗎?之所以BERT CRF,CRF需要較大的學習率是因為BERT是預訓練模型,而CRF的轉移矩陣是隨機初始化的,這是預訓練模型和非預訓練模型的不match導致的。...

為什麼要虛擬化,為什麼要容器,為什麼要Docker,為什麼要K8S?

Coincidence 目的是為了用中間層來抽象資源和方便資源隔離和管理,這個概念也可以從virtual memory,virtual file system,lvm等得到驗證,底層邏輯是通的。例如在vfs中,無論是字元裝置還是塊裝置還是網路裝置都是使用fd來讀寫,fd就是一種抽象,而fd到裝置則由...