【预训练模型】一文串起从NLP到CV 预训练技术和范式演进
主題是深度學習中的預訓練技術發展,基本思路是順著CV和NLP雙線的預訓練技術發展演進。看他們怎么影響和交織。
序言
會大致的看一下,在2013年,在CNN時代的word2vec,在2020年,Bert的時代的MAE,他們各自的預訓練技術是在8年之間,從CNN發展到MAE,以及怎么從word2vec發展到Bert,各自的思路是怎樣形成以及相互影響的。預訓練技術的歷史背景是什么,演進路線是什么,各個創新點是什么。為什么transformer作為集大成者,在CV和NLP上最后形成了交織和影響。
開頭和結尾放同一張圖,分別奠定本文的主線,所有細節將在后面逐漸展開。
從NLP說起
從預訓練技術說起,按照時間線,還是講NLP里的word2vec吧,NLP里的有監督任務的范式,可以歸納成如下的樣子。
輸入是字詞序列,中間一步關鍵的是語義表征,有了語義表征之后,然后交給下游的模型學習。預訓練技術的發展,都是在圍繞怎么得到一個好的語義表征(representation)的這一層次,逐漸改進的。
下面我們圍繞表征(representation)這一塊展開講解。
語義表征演進
我們可以把語義表征(representation)的計算,大致將演進路線歸納成如下的樣子。
有兩條路線,分別從網絡深度和語義理解兩個角度出發,網絡越走越深,語義理解越來越深刻,越來越有代表性。
我們粗略的可以把語義表征的計算分為三個階段,分別是:
一、特征工程階段,以詞袋模型為典型代表。
二、淺層表證階段,以word2vec為典型代表。
三、深層表征階段,以基于transformer的Bert為典型代表。
后面我們講仔細講解,演進中解決的關鍵問題和基本思路。
刀耕火種
首先是詞袋模型,顧名思義,就是一個袋子打包詞,表征計算如下文右邊的籃筐,每個維度統計了文檔中詞的數量。
這種簡單粗暴的表征有一個問題,就是語義局限與字面相同與否。
人工智能和AI兩個詞,在語義上是有強關聯的,但是這個詞袋模型就抓瞎了。
為了解決這個問題,word2vec在2013年被搞出來了。
詞向量
word2vec就是典型學術的分布式語義表征(distribution representation)的代表,你肯定聽過另外一個名字,詞向量。
嗯詞袋模型的時候,人還真沒把叫做詞向量。頂多算特征工程的一種。在word2vec時候,這種語義表征有了專門的名字。
他的特別是詞的特征表達具有了聚類性質和線性性質,在一篇文章中,football和baseketball天然聚集。
并且有 國王-女王=男人-女人的奇妙性質。(不過這個性質后來沒有什么研究了,也沒什么太多的應用)
word2vec解決了一個關鍵的問題,就是語義表征,真的有語義。不局限在字面意思。
但是不要太開心,他還沒有解決一個關鍵的問題,上下文語義。比如play music和play football,同一個play沒辦法區分開是打球還是彈琴,他就是玩哎。
語言模型
看了剛才word2vec解決的問題和存在什么問題,你一定想知道,他是怎么做的吧。這里其實說來話長,說word2vec的話,要從語言模型說起。
語言模型就是給你一串文本,讓你猜猜后面的詞是什么,以下面的圖為例。不知道是啥的搜索引擎,在我敲出【語言模型是】的時候,給出了【什么】的預測,這里面就有一定程度語言模型的功勞。
形式化地表達就是算這個東西 P(wi|w1,w2,...wi?1),其中w是一個詞,根據輸入的前i-1個詞,預測第i個詞。
NNLM
語言模型除了類似貝葉斯那種統計的方法,有一個路子在這條線里非常重要,就是神經語言模型。
下面那個圖,估計你看得云里霧里。不過你可以發揮一下聰明才智,要是讓你穿越回20年前,讓你做一個輸入法預測的工具,你會怎么做?
跨時代的發明來了,這個東西是Bengio大神發明的,真的跨時代,現代NLP,都是這個簡單模型的痕跡。
解釋一下,這是一個基本的MLP網絡,其中,最下面藍色框是詞的id,然后C是共享的矩陣參數,查表能到一個詞的
嵌入參數,你這里可以理解為,輸入為詞的onehot表達的MLP網絡。結果是一樣的。
在中間經過concat后,走一層tanh激活的MLP。softmax激活,得到最大可能性詞的輸出概率。
其中輸出的softmax維度。和詞表V的大小是一樣的,就是在詞匯空間挑一個最大的詞。
嗯,就是一個很簡單的MLP。
其中關鍵的一步是,Table look up in C,這一步奠定了word2vec的基礎。
這個東西,每個詞對應的參數,掏出來就是詞向量。
只不過在2013年的時候,最后那個詞表對應的MLP網絡實在是太奢侈了,畢竟一個詞表動輒幾十萬,前文就算10個300維的詞向量拼接,
那也是3k*30萬的參數規模,實在是太奢侈了。
Word2Vec
word2vec解決了這個關鍵的問題,并且設計了兩種語言模型的任務。
直接大放異彩。
word2vec有兩種任務,
分別是CBOW和SkipGram,分別對應著上下文預測中心詞,和中心詞預測上下文。
如下圖所示。
還有兩種加速技巧,分別是負采樣和哈夫曼樹,這里篇幅有限,實在是沒辦法展開了。
但是我們要注意這里的重點是,word2vec通過,大規模無標注語料上的自監督訓練語言神經網絡模型。
把網絡中的lookup table參數掏出來,當成詞向量的。
這里有兩個不平凡的地方,一個是神經語言模型,一個是從網絡中提出出來的參數。
NLP的初級預訓練+下游任務
好了。現在詞向量有了。
等等,似乎還沒有講word2vec怎么用在NLP任務里。
這里以文本分類為例,穿插一點。以CNN做文本分類為例。
輸入是詞的token id,經過詞向量層,映射到預訓練好的詞向量,然后下游通過卷積層提取特征。
基本的范式是 詞向量+DNN,詞向量負責提升特征表達能力,DNN負責特征提取和預測。
而在最最初期的時候,基本就是Bow(wordcount vector) + LR這樣的方案。
DNN改進了LR,詞向量改進了BoW,還沒有從根本上改進NLP的范式。
預訓練語言模型
下面是激動人心的時刻,我們先回顧下詞向量的問題。
他還沒有解決一個關鍵的問題,上下文語義。比如play music和play football,同一個play沒辦法區分開是打球還是彈琴,他就是玩哎。
于是預訓練語言模型出來了。
預訓練語言模型,與word2vec不同的是。
1.同樣在語料上進行自監督訓練,我把任務改造成難度更大的形式,比如完形填空,句子順序對預測等。
2.表征參數和特征提取組件的一體化。不需要像word2vec那樣掏出一層固定網絡參數,我預訓練語言模型本身可以實時推斷一個語義表征。
從ELMO說起
預訓練語言模型的開篇之作是ELMO,
源于 Deep contextualized word representation,這是NAACL在2019年的best paper。ELMO的全程是Embedding from Language Models。
ELMO是深層LSTM的堆疊,他最大的改進有兩點
1、表征參數和特征提取組件的一體化,拋棄了靜態詞向量的方案。
2、提出了兩階段上游預訓練+下游任務微調的范式
ELMO不再拆分詞向量和語言模型,用語言模型本身學好一個單詞的Word Embedding,一步到位。
這樣很巧妙的解決了靜態詞向量沒有語義的問題。
不足之處就是,ELMO還是以LSTM堆疊為基礎的。
而LSTM有一個致命的缺點,無法做到真正的并行,網絡復雜度高,在堆疊深的時候,難以快速訓練。
這就限制了這個框架的潛力,而Transformer正好解決了這個問題。
Transformer引入
tansformer有個非常好的優點,就是可以跑得很快,并且做的很深。
至于是怎么實現的,還要從self-attention說起。self-attention改進了CNN那種粗暴的建模局部關鍵信息的思路,側重建模元素之間的關系,
能夠自動捕捉信息的關鍵和信息的交互,所以被稱為注意力機制。
并且他有個非常好的好處,
1.就是實現以無時序的矩陣乘法為核心,矩陣乘法是GPU最擅長地方,那么我就可以做的很快。
2.可以做的比較深,我沒有LSTM那種超級的復雜的非線性。我就是簡單的MHA+殘差。
我可以通過每一層,微弱的非線性表達做深,來提升網絡容量,又不至于過擬合和難以訓練。
這兩個天賦決定了,transformer的潛力無窮,只要你善于挖掘他。而Bert就是充分挖掘了transformer的潛力。
Bert千呼萬喚
重頭戲Bert來了,其實在他之前有個GPT,這個東西,實在是尷尬,理論上GPT才是把transformer和預訓練語言模型結合起來的最早的方法。
但是Bert通過改進預訓練和模型細節,實在是效果太好了搶了風頭,這兩者區別不太大,不單獨寫GPT了。特別沒有面子。
Bert比GPT的改進有兩點:
第一、預訓練任務的改進,MaskLM(完形填空)的成功應用,要比普通的根據前文預測下文效果好很多,構成了語義上的雙向性。
第二、NSP任務的引進(后來很多模型把他干掉了)
還是沿用了EMLo那種兩階段的微調范式。
除了預訓練任務的改進,Bert里面有兩個關鍵的地方
1. position embedding引入解決了上下文不敏感的問題
2.word level降級到BPE level(單詞拆分)一定程度解決了OOV的問題。
(2這個思路,在bert沒有出現的時候,我們在Kaggle上2017年 jigsaw第一屆的比賽用過,把word拆成bpe來訓練,提分很多)
從NLP到CV的預訓練
好了說了這么多,我們總結下NLP預訓練技術的演進特點吧。
一、模型從淺變深,從簡單NNLM變化到深層的transformer。
二、預訓練任務逐漸復雜,從上下文預測演進成完形填空。
三、任務從拆分靜態詞向量向 深度語義向量一體化演進。
四、語義從表面向深層,語義從孤立到上下文情景敏感。
好了NLP到這里,我們繼續翻到CV上。
CV從imagenet說起吧,imagenet是深度學習興起的見證者,見證了alexnet,vgg,resenet,densenet一直到現在的基于automl的efficient。
我們對比一下,CV和NLP在初期的預訓練上有什么特點。
CV上,預訓練來的還是比較簡單粗暴的,大家發現,在大的分類數據集上訓練好的參數,當其他的初始化,效果特別好。
這么簡單的思想一直在各種backbone上沿用。
但是這里面有個問題:
1.NLP里的預訓練都是自監督的,憑啥你CV可以找人標注數據。
2.NLP里的預訓練都是側重輸入本身的表征學習的,憑啥你CV拿個CNN分類backbone到處忽悠人?
這兩點,成為了最近CV預訓練任務改進的重大范式。
CNN初步演進主要還是集中在網絡結構上,對于預訓練任務,大家約定俗成的似乎不太重視。
自監督的水花:對比學習
當然,在這里面也有一些水花,比如對比學習。他是圖像領域為了解決
“在沒有更大標注數據集的情況下,如何采用自監督預訓練模式,來從中吸取圖像本身的先驗知識分布,得到一個預訓練的模型”。
這一點很關鍵,在NLP里很自然的。大家使用無標注的語料,學習詞向量的表達,但是在CV里,就很怪。
有沒有辦法不依賴標注數據,要從無標注圖像中自己學習知識。
基本套路歸結成三步走:
1.構造輸入的變化:對同一個樣本進行增強變換
2.使用backbone提取表征
3.loss:同一個樣本(原始和增強),表征距離相似,不同的樣本,表征的距離拉遠。
具體的細節暫且不展開。
嗯這樣的操作終于解決了不要標注的問題,你是一個成熟的CNN了,可以自己學起來了。不過讓人比較喪氣的是,這種方案的上限不太高,在imagenet能刷到70%就不錯了。
但是,這是一個偉大而美好的嘗試,我們先放一放,看看transformer在CV里折騰出什么花樣來了。
Transformer初見威力:iGPT
與NLP不一樣的地方,圖像作為一種高維、噪聲大、冗余度高的形態,被認為是生成建模的難點,這也是為什么過了好幾年,transformer才應用到視覺領域。
其實我們想一下 就很離譜。
1. 圖像是連續的,NLP是離散的,如何解決圖像token輸入的問題?文本是個1D序列,圖像是個2D矩陣,transformer輸入的形式是類序列,因此,如何轉化圖片為transformer的輸入很關鍵。
2.怎么搞定圖像的預訓練呢?還是簡單的在分類上train嗎?似乎沒有夢想。我想像NLP一樣,自監督,學習上下文,效果還特別好。
3.transfomer的self-attention的復雜度是O(n^2 d)的。CIFA圖像展開之后的序列長度是 3072,再長的大分辨率圖完全搞不定了。
關鍵一:為了解決問題1,本文把像素從上到下,從左到右拉平,作為離散的token來輸入transfomer,這里會帶來問題3。
關鍵二:為了解決問題2,這個論文借鑒了GPT2的結構,預訓練任務設計為如下兩個方式
1.自回歸任務,根據前邊的像素,逐個預測后面的像素
2.掩碼語言模型MLM,類似Bert中的完形填空,只不過是像素級別的
關鍵三:為了解決問題3,這個論文對圖像進行了壓縮操作。分為兩步,第一步是尺度的降采樣,第二步是用Kmeans對顏色降采樣為9bit。這樣就非常小了。
文章中有個小trick就是,第三步。作者發現最后一層的表征不一定是最好的,結果最好的可能是中間幾層,所以做了這樣的操作。
這個效果挺好的,在各個數據集上刷到了SOTA,但是,他也有幾個問題。
1.iGPT要想達到同樣的效果,需要的參數是CNN的2倍多,速度也特別慢,iGPTL在V100上要跑2500天。。。
2.iGPT對于圖片降采樣,損失信息很多,CNN對這個問題不是很敏感
后續有繼續的改進工作。下面再說。
這張圖展示了TRM不同層向量對于結果的影響,可以看出來,先上升后下降的,所以中間層效果更好。
ViT:高效的Transformer分類預訓練
我覺得上面那個iGPT的思路是不錯的,不過看起來就不是很完美的文章,為了預訓練的目標,降采樣這種操作都出來了。
后來大家改進了這個問題。我們看一下ViT吧。
ViT很重要的一點是提出了patch embedding的思想 替換了降采樣的方式。
另外,Bert里是通過在輸入開頭加[CLS]來實現文本的語義表達的。如果文本能做到這件事,似乎說明了在我們離圖片語義越來越近了。
ViT具體的做法是:
1.模仿Bert中的position embeding ,標記圖片的位置
2.每一個patch是一個圖形小塊,類比Bert中的 word embedding,稱為patch embeddings
ViT通過這樣的方式把圖片塞進了transformer,并且沒有壓縮。維持了[CLS]作為語義向量用來分類的特色。
但是,唯一美中不足的是,他是分類任務進行預訓練的(開倒車)。作者探討了自監督預訓練的方式,但是并沒有太成功。
別忘了我們最初美好的愿景,我們希望像NLP一樣,能從語料庫里面用自監督的方式,學習到語義信息。
BEiT:Transformer+自監督
于是更接近Bert的圖像Transformer出現了,他是BEIT。BEiT: BERT Pre-Training of Image Transformers
BEiT繼承了ViT中Patch的做法,改進了預訓練任務。
1、預訓練任務變成了圖像復原。
2、Patch token級別的MLM任務,引入到預訓練任務中(區別于Path像素級別)
搞CV的同學可能對這個數字很有疑惑。這個234,456,876是個啥玩意?
他是為了引入圖像復原的Visual Tokens,對應的東西是一個編號,編號里的玩意,是這個位置對應的語義向量,預訓練任務就是學習預測的 visual tokens ,復原網絡,這里是通過encoder-decoder的方式來實現的。
嗯這個工作真是承上啟下已經接近完美了。
但是還有一個問題,
這個模型訓練的時候是分兩步的。
stage1:首先優化 dVAE(圖重構組件),這個我們叫重構損失,通過優化 編碼和解碼 ,好讓dVAE 能夠學習到更好的隱變量又能更好還原原圖。
stage2:然后再優化 Encoder 和 Masked Image Modeling Head(語義編碼組件),為了能更好的預測出對應的 visual tokens
有沒有什么辦法能像NLP那樣自然呢?完形填空,大道至簡。
有的,kaiming大神MAE呼之欲出。
MAE:Transformer+大規模自監督的巔峰之作
MAE秉承了BeiT的patch編碼方式。他有兩個關鍵的創新點。
跑得快:非對稱的自編碼器架構(auto-encoder),其編碼器僅作用在可見的這些patch里面,如果一個 patch 被它丟掉了,那么編碼器就不會對它進行編碼。這樣圖像encoder端的工作量就減少了,好處就是可以跑得很快。進一步地,解碼器是一個比較輕量的解碼器。一層transformer就夠用。
學得難:預訓練任務能夠重構原始的像素級圖片。并且,可以搞定75%的這些塊全部遮住下的圖像復原。這個事情是一個非平凡的,而且有意義的自監督的任務。如果你就簡單遮住幾塊的話,那么就插一下值,你就可以出來了,這樣整個模型可能學不到特別有意思的東西。
結果:用更小的數據來自監督預訓練,超越了更多數據監督訓練的ViT模型。他用來自于VIT這個論文的不加任何技巧的ViT-Huge的模型backbobe結構,加上他的預訓練方法,能夠得到 87.8% 的ACC表現。
看一下圖片恢復的效果,簡直震驚了,這哪里是圖片復原,這是腦洞打開的自動畫面!
CV中的演進總結
類比下NLP中語義編碼路線的發展。
我們把他從CV中扒拉出來。
一條線是從CNN到transformer的探索
另一條線是從分類預訓練發展到大規模的自監督預訓練。
嗯,清晰了。
CV和NLP演進的交匯
前面范范而談了各種預訓練模型,我們想辦法統一把他們一起看一下。
下圖通過三種顏色標識了幾個關鍵的階段,然后箭頭指引了優化借鑒和發展的方向。
要是非要說一條路線的話,那就是為了更好的理解知識表征這一件事。圍繞著這件事,我們在更自動化,設計學習任務,加速模型,提升模型潛力天花板,上做了大量的優化工作。
你都看到了這了,一定要分享給你的同學同事,一起來學習下吧~
?
往期精彩回顧適合初學者入門人工智能的路線及資料下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載本站qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【预训练模型】一文串起从NLP到CV 预训练技术和范式演进的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity环境下RTMP推流+RTMP播
- 下一篇: 【NLP】授人以渔:分享我的文本分类经验