什麼是XLNet中的雙流自注意力

點擊上方「AI公園」,關注公衆號,選擇加「星標「或「置頂」web


做者:Xu LIANG微信

編譯:ronghuaiyang
架構

導讀

理解XLNet中的雙流自注意力機制。編輯器

在我以前的文章什麼是XLNet,它爲何比BERT效果好?中,我主要討論了XLNet (AR語言模型)和BERT (AE語言模型)之間的區別以及重排列語言建模
函數

我相信對XLNet有一個直觀的理解遠比實現細節重要,因此我只解釋了重排列語言建模,而沒有提到另外一個重要的部分,雙流自注意力架構。但正如陳家明在評論中提到的,雙流自注意力是XLNet論文的另外一個亮點,因此我寫這篇文章是爲了儘量清楚地解釋雙流自注意力。性能

內容結構以下。學習

  • 重排列語言建模的快速回顧
  • 重排列帶來了什麼問題?
  • BERT有這樣的問題嗎?
  • XLNet如何解決這個問題?
  • 注意力mask: XLNet如何實現重排列?

重排列建模的快速回顧

特殊的術語:編碼

  • AR語言模型: 自迴歸語言建模
  • AE語言模型: 自動編碼器語言建模

爲了使這篇文章更加獨立,我在這裏作一個簡短的總結:什麼是XLNet,爲何它的性能優於BERTurl

XLNet提出使用重排列語言建模,使AR語言模型學習雙向上下文。這樣能夠避免AE語言模型中MASK方法帶來的弊端。spa

重排列方法是獲取一個序列的重排列,並使用以前的t-1個tokens做爲上下文來預測第t個位置的token。例如,咱們有一個句子[x1, x2, x3, x4],而x3是咱們要預測的第t個位置的token。首先,咱們獲得句子的排列。

[('x1', 'x2', 'x3', 'x4'),
('x1', 'x2', 'x4', 'x3'),
('x1', 'x3', 'x2', 'x4'),
('x1', 'x3', 'x4', 'x2'),
('x1', 'x4', 'x2', 'x3'),
('x1', 'x4', 'x3', 'x2'),
('x2', 'x1', 'x3', 'x4'),
('x2', 'x1', 'x4', 'x3'),
('x2', 'x3', 'x1', 'x4'),
('x2', 'x3', 'x4', 'x1'),
('x2', 'x4', 'x1', 'x3'),
('x2', 'x4', 'x3', 'x1'),
('x3', 'x1', 'x2', 'x4'),
('x3', 'x1', 'x4', 'x2'),
('x3', 'x2', 'x1', 'x4'),
('x3', 'x2', 'x4', 'x1'),
('x3', 'x4', 'x1', 'x2'),
('x3', 'x4', 'x2', 'x1'),
('x4', 'x1', 'x2', 'x3'),
('x4', 'x1', 'x3', 'x2'),
('x4', 'x2', 'x1', 'x3'),
('x4', 'x2', 'x3', 'x1'),
('x4', 'x3', 'x1', 'x2'),
('x4', 'x3', 'x2', 'x1')]

而後選取一些樣本做爲訓練數據。(本文從排列中隨機抽取樣本)

('x1', 'x2', 'x4', 'x3'),
('x1', 'x4', 'x3', 'x2'),
('x2', 'x3', 'x4', 'x1'),
('x4', 'x2', 'x3', 'x1'),
('x3', 'x2', 'x4', 'x1'),

咱們能夠看到每一個token都有機會出如今x3以前。所以,AR模型能夠從這些上下文tokens中學習雙向信息。若是你仍然不清楚重排列,你能夠閱讀前面的文章。

重排列帶來了什麼問題?

這種重排列可使AR模型從兩個方向看到上下文,但也帶來了原transformer 沒法解決的問題.

重排列語言建模目標:

  • Z 一種分解順序
  • p_θ: 似然函數
  • x_zt: 分解順序中的第t個token
  • x_z<t: 第t個token以前的全部tokens

這是重排列語言建模的目標函數,即以t-1個tokens爲上下文,預測第t個token。

有兩個標準Transformer不能知足的要求:

  1. 爲了預測token x_t,模型應該只看到x_t的位置,而不是x_t的content(我將在下一節解釋什麼是content)
  2. 爲了預測token x_t,模型應該將x_t以前的全部token編碼爲content

特別是第一個要求,transformer將位置編碼合併到token嵌入中。所以,它不能將位置信息與token嵌入分離開來。

BERT有這樣的問題嗎?

BERT是一個AE語言模型,它不像AR語言模型那樣須要單獨的位置信息。與XLNet須要位置信息來預測第t個token不一樣,BERT使用[MASK]來表示要預測哪一個token(咱們能夠認爲[MASK]只是一個佔位符)。例如,若是BERT使用x2, x1, x4來預測x3,那麼x2, x1, x4的嵌入包含了位置信息和其餘與[MASK]相關的信息。所以,該模型頗有可能預測[MASK]是x3。

在這裏我將對信息作更詳細的說明。BERT embedded (BERT所學的信息)包含兩種信息:位置信息和內容信息(爲簡單起見,我將其分爲兩部分)。

位置信息很容易理解,由於它告訴模型當前token的位置。內容信息(語義和語法)包含當前標記的「意義」。一個直觀的例子是kind — man + woman = queen

XLNet怎麼解決這個問題?

XLNet提出了雙流自注意力來解決這個問題。

顧名思義,它包含兩種自注意力。一個是content stream attention,它是Transformer中的標準自注意力另外一個是query stream attentionXLNet引入它來替換BERT中的[MASK] token。

例如,若是BERT想用上下文單詞x1和x2的知識來預測x3,它可使用[MASK]來表示x3 token。[MASK]只是一個佔位符。x1和x2的嵌入包含位置信息,幫助模型「知道」[MASK]的是x3。

XLNet的狀況有所不一樣。一個token x3將服務兩種角色。當它被用做內容來預測其餘標記時,咱們可使用內容表示(經過內容流注意力來學習)來表示x3。可是若是咱們想要預測x3,咱們應該只知道它的位置而不是它的內容。這就是爲何XLNet使用查詢表示(經過查詢流注意力來學習)來保留x3以前的上下文信息,只保存x3的位置信息。

爲了直觀地理解雙流自注意力,咱們能夠認爲XLNet用查詢表示代替了BERT中的[MASK]。他們只是選擇不一樣的方法作同一件事。

注意力mask:XLNet如何實現重排列?

當我第一次讀到這篇文章的時候,我不由對訓練中重排列的實現細節產生了疑惑。若是大家感興趣,我就簡單講一下。

在第一部分「重排排列語言建模的快速回顧」中,我給出了一個句子[x1, x2, x3, x4] 的排列示例,以下所示。

[('x1', 'x2', 'x3', 'x4'),
('x1', 'x2', 'x4', 'x3'),
('x1', 'x3', 'x2', 'x4'),
('x1', 'x3', 'x4', 'x2'),
('x1', 'x4', 'x2', 'x3'),
('x1', 'x4', 'x3', 'x2'),
('x2', 'x1', 'x3', 'x4'),
('x2', 'x1', 'x4', 'x3'),
('x2', 'x3', 'x1', 'x4'),
('x2', 'x3', 'x4', 'x1'),
('x2', 'x4', 'x1', 'x3'),
('x2', 'x4', 'x3', 'x1'),
('x3', 'x1', 'x2', 'x4'),
('x3', 'x1', 'x4', 'x2'),
('x3', 'x2', 'x1', 'x4'),
('x3', 'x2', 'x4', 'x1'),
('x3', 'x4', 'x1', 'x2'),
('x3', 'x4', 'x2', 'x1'),
('x4', 'x1', 'x2', 'x3'),
('x4', 'x1', 'x3', 'x2'),
('x4', 'x2', 'x1', 'x3'),
('x4', 'x2', 'x3', 'x1'),
('x4', 'x3', 'x1', 'x2'),
('x4', 'x3', 'x2', 'x1')]

咱們很容易誤解,咱們須要得到一個句子的隨機順序並將其輸入到模型中。但事實並不是如此。輸入語句的順序是[x1, x2, x3, x4]XLNet使用注意力掩碼來重排列分解因子的順序

這個句子的原始順序是[x1, x2, x3, x4]咱們隨機獲得一個分解的順序爲[x3, x2, x4, x1]

左上角是內容表示的計算。若是咱們想要預測x1的內容表示,咱們應該擁有全部4個token內容信息。KV = [h1, h2, h3, h4]Q = h1

左下角是查詢表示的計算。若是咱們想要預測x1的查詢表示,咱們不能看到x1自己的內容表示。KV = [h2, h3, h4]Q = g1

右下角是整個計算過程。我把它從頭至尾解釋了一遍。首先,hg被初始化爲e(xi)w在內容掩碼和查詢掩碼以後,雙流注意力將輸出第一層輸出h^(1)g^(1),而後計算第二層。

注意右邊的內容掩碼和查詢掩碼它們都是矩陣。在內容mask中,第一行有4個紅點。這意味着第一個token (x1)能夠看到(注意到)全部其餘tokens,包括它本身(x3->x2->x4->x1)。第二行有兩個紅點。這意味着第二個token (x2)能夠看到(注意到)兩個token(x3->x2)。等等。

內容掩碼和查詢掩碼之間唯一的區別是,查詢掩碼中的對角元素爲0,這意味着token不能看到它們本身。

讓咱們總結一下。輸入的句子只有一個順序。可是咱們可使用不一樣的注意力mask來實現不一樣的分解順序。

總結

在這篇文章中,我主要解釋了XLNet面臨的問題是什麼,以及如何使用雙流自注意力來解決它。我還提到了有關排列注意裏mask的一些實現細節。對於結果的比較,你能夠從XLNet team中找到最新的發佈,它比論文的比較更加公平。

END

英文原文:https://towardsdatascience.com/what-is-two-stream-self-attention-in-xlnet-ebfe013a0cf3

請長按或掃描二維碼關注本公衆號

喜歡的話,請給我個好看吧


本文分享自微信公衆號 - AI公園(AI_Paradise)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索