此次寫文原本想把從Transformer-XL到XLNet講一下,可是本身還沒看,先寫一下XLNet的部分,Transformer-XL明天補上~網絡
2018年10月的時候,谷歌放出了稱霸GLUE榜單的BERT模型,當時BERT最大的創新就是提出了Masked Language Model做爲預訓練任務,解決了GPT不能雙向編碼、ELMo不能深度雙向編碼的問題。以後從那天起,不少任務都再也不須要複雜的網絡結構,也不須要大量的標註數據,業界學術界都基於BERT作了不少事情。函數
昨天,也就是2019年6月19日,谷歌又放出了一個模型XLNet,找到並解決了BERT的缺點,刷爆了BERT以前的成績(固然數據、算力相比去年都增長了不少)。驚醒你們不要總被牽着走,創新總會從某個縫裏鑽出來。學習
首先介紹兩種無監督目標函數:優化
AR是之前經常使用的方法,但缺點是不能進行雙向的編碼。所以BERT採用了AE,獲取到序列全局的信息。但本文做者指出了BERT採用AE方法帶來的兩個問題:編碼
以上就是BERT採用AE方法存在的痛點,接下來請看XLNet如何解決這些問題。spa
與其說XLNet解決了BERT的問題,不如說它基於AR採用了一種新的方法實現雙向編碼,由於AR方法不存在上述兩個痛點。3d
XLNet的創新點是Permutation Language Modeling,以下圖:orm
對於長度爲T的序列x,存在T!種排列方法,若是把 從新排列成 ,再採用AR爲目標函數,則優化的似然爲 cdn
由於對於不一樣的排列方式,模型參數是共享的,因此模型最終能夠學習到如何彙集全部位置的信息。blog
因爲計算複雜度的限制,不可能計算全部的序列排列,所以對於每一個序列輸入只採樣一個排列方式。並且在實際訓練時,不會打亂序列,而是經過mask矩陣實現permutation。做者特地強調,這樣能夠保持與finetune輸入順序的一致,不會存在pretrain-finetune差別。
解決了核心問題,接下來就是實現的細節問題了。其實上面打亂順序後有一個很大的問題,就是在預測第三個x的時候模型預測的是 ,若是把排列方式換成 ,則應該預測 ,但模型是不知道當前要預測的是哪個,所以輸出的值是同樣的,即 ,這就不對了。因此說要加入位置信息,即 和 ,讓模型知道目前是預測哪一個位置的token。
那下一個問題又來了,傳統的attention只帶有token編碼,位置信息都在編碼裏了,而AR目標是不容許模型看到當前token編碼的,所以要把position embedding拆出來。怎麼拆呢?做者就提出了Two-Stream Self-Attention。
Query stream:只能看到當前的位置信息,不能看到當前token的編碼
Content stream:傳統self-attention,像GPT同樣對當前token進行編碼
預訓練階段最終預測只使用query stream,由於content stream已經見過當前token了。在精調階段使用content stream,又回到了傳統的self-attention結構。
下面的圖起碼看3遍~看懂爲止,圖比我講的明白。。
另外,由於不像MLM只用預測部分token,還須要計算permutation,XLNet的計算量更大了,所以做者提出了partial prediction進行簡化,即只預測後面1/K個token。
爲了學習到更長距離的信息,做者沿用了本身的Transformer-XL。
(太困了。。明天繼續好很差)