1 什麼是預訓練模型?為什麼我們需要預訓練模型?
預訓練模型是提升深度學習演算法效能的一種常用手段。所謂預訓練模型,可以概括為是某種深度學習的網路架構,並且包含這個網路架構在海量資料上訓練好的一組權重。有了網路架構和權重後,我們就可以用它作為某一具體視覺任務的主幹網路,並提供初始化引數。這樣一來,具體的下游任務就有了一個較好的訓練起點,在減少探索空間的同時,還能夠實現更好的演算法效能。
那麼我們為什麼需要預訓練模型呢?在這裡做一個比喻,如果把深度學習演算法比作武俠的話,那預訓練模型就是他的內功,有了紮實的內功基礎,就能夠更容易、更快速的掌握各種武功招式,併發揮其最大效用。預訓練模型的過程就是深度學習演算法修煉內功的過程。
2 OPPO自研大規模cv預訓練模型
2.1 概述
之所以要自研預訓練模型主要是兩點原因:首先,當前資料科學家們使用的預訓練模型都是網上開源的,每年都有變化,最新的一些研究往往不開源,無法保證效果最優;其次就是網上開源的預訓練模型,都是基於開源資料集資料集訓練得到的,比如大家熟知的imagenet。沒有充分利用公司自有資料的優勢。因此,自研預訓練模型是十分有意義的。
OPPO自研大規模cv預訓練模型技術方案主要包括以下三大部分:
- 網路架構創新:主要是研究當前cv界主流模型架構如CNN,Transformer和MLP等,對不同結構當前SO他的網路架構進行組合、優化的探索,儘可能的得到效能最優的網路架構作為預訓練模型的主幹網路。
- 自監督學習訓練:主要是希望能夠充分利用oppo自有的海量無標註資料,在海量無標註資料下進行預訓練,從而得到更加通用的特徵表達,讓模型能夠更好地克服OOD(與訓練集分佈不同)情況,得到更加魯棒的預訓練模型。
- 有監督微調訓練:當利用具體的任務資料集(標註樣本)對預訓練模型的網路引數進行微調訓練時,使用合適的訓練方法及正則方法,可以使模型在具體下游任務達到最優效果。
2.2 關鍵技術
2.2.1 網路架構設計
在網路架構方面,我們的目標是設計合適的網路架構,縮小特徵探索空間,提升網路效能。為了能夠更適合接入不同的稠密場景視覺任務,我們的網路架構需要設計成一種多階段的層次結構來提供多尺度的特徵圖,並且我們的網路要易於擴充成不同引數量級的變體模型,以滿足不同業務場景的需求同時要在引數量和浮點數計算量更低的條件下儘可能的提升網路的效能。
當前計算機視覺領域三大主流模型架構包括卷積神經網路CNN,Transfomer以及多層感知機MLP。其中CNN多年來一直是計算機視覺任務中佔據主導地位的網路架構,CNN擅長提取區域性細節特徵,並且具有形變、平移及縮放不變性等優點。Transformer在NLP領域取得了巨大的成功,去年首次在CV界亮相開始引領新的趨勢,Transformer的優點是擅長捕獲全域性資訊, 具有更大的模型容量,且其運作機制更接近人類。在Transformer崛起的同時,一部分研究聚焦於MLP替代Transformer元件構建網路的研究,開闢了另一個研究方向,MLP 在小的模型規模下可以實現接近Transformer的效能,但當規模擴大時,它就會受到嚴重的過擬合影響。
通過對這三種主流模型架構進行研究分析後,我們得到了以下一些結論:對於MLP 來說,它的研究聚焦在替換 Transformer元件來獲得相對有競爭力的結果,但是實際效果並沒有超越基於transformer的方法,這系列工作只是一定程度上開拓了一個新的思路。CNN中的卷積操作擅長提取圖片的區域性資訊,而Transformer通過構造影像tokens提取到圖片的全域性表示,因此CNN和Transformer在一定程度上可以形成良好的互補。還有就是Transformer 在三種架構中具有最大的模型容量,更適合做大規模預訓練模型。因此,Transformer 加 CNN的架構或許是最優的解決方案。
既然我們要聚焦於Transformer方法,我們就先要對Transformer的基本原理有一定的瞭解,以便對其進行改進。所以接下來我先對Transformer進行簡單介紹。Transformer結構是google在17年的Attention Is All You Need論文中提出的,在NLP的多個任務上取得了非常好的效果。它最大特點是整個網路結構完全是由Self-Attention機制組成。如圖一所示,Transformer採用Encoder-Decoder結構,輸入經過 embedding後,要做位置編碼,然後是多頭自注意力機制,再經過Feed Forward,每個子層有殘差連線,最後要經過Linear和softmax輸出概率。
其中:
- 殘差結構是為了解決梯度消失問題,可以增加模型的複雜性。
- 其中的Norm指的是LayerNorm操作,LayerNorm是為了對attention層的輸出進行分佈歸一化。計算機視覺中經常會用的batchNorm是對一個batchsize中的樣本進行一次歸一化,而LayerNorm則是對一層進行一次歸一化,二者的作用是一樣的,只是針對的維度不同。
- Feed Forward是兩層全連線加啟用函式的結構。是為了使用非線性函式來擬合資料。其中第一層全連線用來進行非線性性函式擬合,第二層全連線用於調整輸出維度。
- 加入位置編碼(Positional Encoding)主要是由於self-attention機制沒法捕捉位置資訊,因此需要通過位置編碼來改善。
Transformer結構中我們最需要關注的是self Attention機制的原理,所謂Self Attention就是句子中的某個詞對於句子本身的所有詞做一次Attention。當以一個詞為中心進行Self Attention時,每個詞都要通過三個矩陣Wq, Wk, Wv進行一次線性變換,一分為三,生成每個詞自己的query, key, value三個向量,也就是公式中的大Q,K,V,然後通過如下公式進行計算,作為這個詞的輸出。最終每個Self Attention接受n個詞向量的輸入,輸出n個聚合的向量。這麼做的目的是保留關注詞的value值,削弱非相關詞的value值。
而Multi-Head self- Attention就是將上述的Attention做h遍,然後將h個輸出進行concat得到最終的輸出。Transformer的工程實現中,為了提高Multi-Head的效率,將W擴大了h倍,然後通過reshape和transpose操作將相同詞的不同head的Q、K、V排列在一起進行同時計算,完成計算後再次通過reshape和transpose完成拼接,相當於對於所有的head進行了一個並行處理。到此為止我們對Transformer結構有了初步的瞭解。
在20年,提出的ViT是首個基於純Transformer的結構來做影像分類任務的網路,算是transformer在影像上應用的開山之作,後續所有基於Transformer的網路架構都是基於此模型進行的改造。
ViT的結構如圖二所示,它就是前面講到的一個典型的Transformer結構:
首先將一張的影像,分成互不交疊相等大小影像塊,然後將每個圖塊進行展平並對每一個展平後的圖塊向量做一個線性變換進行降維,作為Transformer的輸入。這裡的每一個圖塊就是一個Token,也就是NLP中句子中的一個詞。
ViT給輸入的Token追加了一個分類向量,用於Transformer訓練過程中的類別資訊學習,與其他圖塊向量一起輸入到Transformer編碼器中,最後取第一個向量作為類別預測結果。
為了保持輸入影像塊之間的空間位置資訊,對影像塊中新增一個位置編碼向量,這種在進行self-attention之前就加入了位置資訊的方式叫做絕對位置編碼,後面還會對位置編碼進行一些介紹,此處不再贅述。
由於ViT是一個非層次結構的網路,不適合用於稠密場景的視覺任務,並且計算複雜度相對較高。在後續的研究中,研究者們用各種辦法去從不同的角度對他進行改進。
那麼我們是如何做的呢?
第一點,我們希望得到一種更通用的主幹網路架構,而不是針對不同的視覺任務設計不同的網路,因此要設計一種層次結構的網路,可以提供多尺度的特徵圖。實現層次結構的方式可以採用pixelShuffle, 卷積降取樣等手段,來調整特徵圖尺度與輸出維度,從而得到多個階段的層次結構網路;
第二點,我們要對對注意力機制進行改造。原始的Transformer在計算注意力機制時需要計算一個Token與其他所有Token之間的關係,計算複雜度為Token數量的二次型。為了能更高效的建模,部分研究對注意力機制的計算進行了改造,主要包括:halo,shifted window,CrossShape等;
第三點就是將Transformer與CNN進行有效的融合。視覺任務中區域性特徵建模是非常有效且至關重要的,而區域性特徵建模是CNN所擅長的。已有研究證實,以適當的方式疊加摺積層和Transformer層,可以有效地提升網路的整體效能。也有研究將卷積融入到Transformer中,用卷積代替線性變換來計算Q,K,V矩陣,可以使Transformer對區域性特徵的建模能力得到提升。最後是對位置編碼的改進。由於自注意力機制具有排列不變性,即不同排列的輸出結果是一樣的。為了彌補這個缺陷。如圖三(a)所示,絕對位置編碼是在進行Self-attention之前就加入了位置資訊。圖三(b)所示為相對位置編碼,是在計算權重矩陣的過程中加入相對位置資訊。圖三(c)所示為位置增強編碼,它直接將位置資訊加入到Value中,具體實現是用一個Depth-wise Conv對value進行卷積,然後將結果加入到了self attention的結果中。
對於我們的網路架構,可以看做是一個四個階段的體系結構:
首先通過一組卷積序列對影像進行分塊操作生成Tokens,為了產生層次表示,相鄰的兩個階段之間我們採用另一組卷積序列是Tokens數量減半,通道維數加倍。這樣就產生了多階段的層次結構,可提供多尺度特徵圖,方便作為主幹網路接入到稠密場景視覺任務中。
從與CNNs結合的角度去看,可以看做是一個多階段Transformer模組與一個EfficientNetV2-like的結構巢狀組合而成,實現了卷積與Transfomer的有效融合,在模型引數量和浮點數計算量更低的情況了大幅提升了網路效能。
在計算多頭自注意力時,我們使用改進的計算機制,shifted-window + conv 和CrossShape兩種方法,提升Trasnformer計算效率的同時,網路效能也得到了進一步提升。
對於位置編碼部分我們使用了相對位置編碼和區域性增強位置編碼兩種方式,經實驗驗證這兩種位置編碼方式在分類任務上基本無差別,但在稠密場景任務(如檢測、分割等)時,區域性增強位置編碼效能更優。
最後我們通過不同的深度或寬度的配置,設計了三組不同量級的模型架構:Tiny模型,Small模型 和 Base模型,以適應不同業務場景的需要。
表1是我們的網路架構在Imagenet資料集上的表現,我們分別與不同引數量級下最新的網路架構進行了對比,可以看到我們設計的網路架構在引數量更低、計算量更小的情況下,三種量級的變體模型都能取得最優的成績。
2.2.2 自監督學習
接下來介紹預訓練模型的另一個關鍵技術自監督學,所謂自監督學習就是無監督學習的一種。在第 43 屆國際資訊檢索年會深度學習之父上Hinton 提出下一代人工智慧屬於無監督對比學習。對於三種學習任務Hinton的得意弟子Yann LeCun將其比作蛋糕,強化學習僅僅是蛋糕上的一顆櫻桃,有監督學習可比作蛋糕上的奶油,而無監督學習是蛋糕胚,以示其基礎性的作用和重要性。
以我們人類為例,當我們看到一個東西的時候,所有的知覺都潛移默化地在給我們灌輸海量的資料,供我們學習,推理和判斷。我們遇到的“題目”很多,無時無刻不在接受資訊,但是我們的“答案”卻很少。我們可能看過,各種各樣的動物,直到某一天才有人用3個字告訴我們,“這是貓”。可能一生中,別人給你指出這是貓的次數,都是屈指可數的。但是,僅僅通過這一兩次提示,你就能在一生中記得這些概念。甚至別人從不告訴這是貓,你也知道這應該不是狗或者其他動物,這種沒有答案的學習就是無監督學習,別人告訴了我們答案的學習就是有監督學習,可見無監督學習的基礎性是多麼重要。由於監督學習嚴重依賴於人工標註資料,而我們希望神經網路能夠在大量無標註資料中學習到更多內容,從而提高資料學習效率以及模型泛化能力,因此將基於自監督學習的預訓練改進作為重點方向之一。
自監督學習可以分為基於Pretext Task的方法、基於Contrastive Learning的方法、基於Clustering的方法和基於Contrastive + Cluster的方法。基於Pretext Task的方法讓神經網路去解決一個pretext task,在這個過程中模型能夠學習到豐富的特徵表示,然後用於下游任務但是隻靠單個前置任務來學習特徵表示將不是最好的選擇並且不同前置任務之間的設計差異非常大,難度也不相同。基於Contrastive Learning的方法通過將資料分別與正例樣本和負例樣本在特徵空間進行對比,來學習樣本的特徵表示,由於需要顯示的去對pair對進行feature級別對比導致計算量非常大。基於Clustering的方法在特徵空間進行聚類,看下哪些圖片在特徵空間上是相像的,特徵聚類 + 預測叢集分配,根據image feature在全部資料集做cluster(codes),在一個訓練step中會對很多image views做cluster,這種方法通常需要掃很多遍資料集。我們主要基於facebook的最新研究SwAV方法對模型進行自監督學習預訓練改進,它是一種基於Contrastive + Cluster的方法。
SwAV方法與之前的一些對比學習方法的不同之處,主要就是在features對比,SwAV使用了一個codes去表達features進而來保持一致性。
通常基於clustering法一般是根據image feature在全部資料集做cluster(codes),在一個訓練step中會對很多image views做cluster。而Swav方法並不考慮用codes作為目標,而是通過一張圖片不同的views的codes需要保持一致來進行學習,可以理解為是一張圖片的多個不同views需要對應相同的code而不是直接用他們feature來做。
訓練主要包括兩部分:
z(features)如何通過c(prototypes)映通過射得到Q(codes);
有了 z 和 q 之後,理論上同一張圖片不同view所產生的 z 和 q 也可以相互預測,於是作者便定義了新的loss如公式所示。
其中z是feature,q是codes,s和t下標表示通過不同的augmentations對image進行轉換的,而分項loss的計算公式為:
我們主要採用SwAV方法對我們的設計的網路架構進行自檢自監督學習預訓練。並嘗試“分階段訓練”的方式,將學習過程分解為逐步完成的相關子任務,逐步將資訊注入網路,以便在訓練的初級階段捕獲資料的“粗尺度”特徵,而在後續階段學習“細尺度”特徵,並且每個階段的訓練結果都可以作為下一階段的先決條件,這樣會產生正則化效果並增強泛化能力。目前這一部分的工作目前還在進行中,效能統計結果即將到來。
2.2.3 有監督微調
視覺模型的效能是網路架構、訓練方法和正則方法的綜合結果,在做具體任務時,有監督微調旨在利用其標註樣本對預訓練網路的引數進行調整。載入網路結構並利用預訓練好的權重去初始化網路後需要設定合理的超參配置、優化方法、資料增強方法、和正則方法等。新的網路架構往往是促成諸多進展的基礎,與新網路架構同時出現的通常還有更加先進的訓練方法、資料增強方法和正則方法等。此處僅對一些過去和近期新出現的方法進行列舉,針對具體的視覺任務,可根據自己經驗或他人已有的經驗進行配置。
3 業務應用
目前我們尋找了兩個內部已有業務,嘗試使用我們的預訓練模型對齊進行優化升級,主要包括主題資源風格全場景打標和PGC小視訊一二級分類。在主題資源風格全場景打標業務中,使用了我們的tiny預訓練模型來做主題風格多標籤分類任務;與原始基於EfficientNet的版本相比,模型的引數量和浮點數運算量僅小幅增加的情況下,打標準確率由87.7%提升到95%,大幅提升了7.3%。另外在PGC小視訊一二級分類業務使用base預訓練模型+BERT來做多模態融合分類;
小視訊一二級分類精度與原方法相比均得到了提升,一級精度由86.5%提升到89.7%,提升了3.2%;二級精度61.6%提升到75.4%,提升了13.8%。充分的驗證了我們預訓練模型的有效性及業務價值。
4 總結
預訓練模型是深度學習網路架構 + 海量資料上訓練好的權重,是提升某一具體任務演算法效能的一種常用手段。預訓練模型的關鍵技術包括:網路架構、自監督預訓練和有監督微調,各部分都有很多值得研究的地方。另外,不同業務場景需要的預訓練模型規模往往不同,需要設計多種變體模型分別進行預訓練,以實現預訓練模型應用到更多的業務當中實現更多的價值。
5 參考文獻
[1] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, and Illia Polosukhin. Attention is all you need. In Advances in neural information processing systems, pages 5998–6008, 2017.
[2] Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, ylvain Gelly, et al. An image is worth 16x16 words: Transformers for image recognition at scale. arXiv preprint arXiv:2010.11929, 2020.
[3] Mathilde Caron, Ishan Misra, Julien Mairal, Priya Goyal, Piotr Bojanowski, and Armand Joulin. Unsupervised learningof visual features by contrasting cluster assignments.arXiv preprint arXiv:2006.09882, 2020.
作者簡介
Darren OPPO高階演算法工程師
深耕計算機視覺演算法領域多年,目前專注於cv模型架構與訓練方法研究。
獲取更多精彩內容,請掃碼關注[OPPO數智技術]公眾號