SimCLR v2演算法筆記

2021-10-11 01:31:31 字數 2756 閱讀 4319

這篇是發表於nips2020的simclr v2,有非常漂亮的結果。

流程是這樣的(參考figure3):先在乙個無標籤資料集上做自監督訓練,這部分其實和simclr沒有太大區別,就是對網路複雜度和非線性變換層做了調整,但是效果大增;然後在乙個有標籤的小資料集上做fine tune;最後將fine tune的模型作為teacher model做蒸餾,資料集採用的是無標籤資料集。

這篇**在一開始就放出了乙個非常重要的結論,那就是在自監督訓練(包括fine-tune)過程中,網路結構的複雜性對效果影響很大,具體來說網路結構越寬越深,則效果越好,尤其是當有標籤的資料越少時,這種影響越明顯。這部分其實在simclr**中也有體現了,參考simclr**中的figure7,只不過在simclr v2中對這方面做了更多的實驗(比如fine tune),注:simclr中用的網路主要是resnet-50(4✖️),simclr v2中用的主要是resnet-152(3✖️+sk),注意這個sk

simclr v2引入了蒸餾,也就是將fine tune後的複雜模型當做teacher model,蒸餾到簡單的student model上,這部分做法的主要初衷應該是在引入複雜網路後出於對模型效率的考慮(當然**中也做了相同網路的蒸餾,也就是self-distilled,也能進一步提公升效果),而且蒸餾本身就是hinton老爺子的工作,所以結合起來就比較自然。另外蒸餾時候可以僅用無標籤的資料(預設),或者聯合使用有標籤和無標籤的資料,這樣整個訓練過程就結束了,如figure3所示。

table1很重要的乙個資訊就是網路深度和寬度對自監督和fine-tune階段效果的影響還挺大的,尤其當有標籤的資料較少時,這種影響更明顯(參考figure1),但是看最後一列有監督的結果可以發現這些改變對有監督訓練的影響並沒有那麼大,或許是因為模型複雜度和資料複雜度沒有對齊的原因,有監督訓練中資料複雜度已經到達瓶頸了

其次是sk,從**來看,是否用sk對結果的影響也很大,這一點值得**原因,至少說明在網路結構方面還有很多可探索的空間。另外還有乙個點,fine-tuned on 100%這一列的效果是要普遍優於supervised的,也就是相同的資料和網路結構,不同的訓練方式下,最終會相差2個點左右,這個在simclr**附錄的tableb.1中也有類似結果,這或許就是半監督的魅力。最後還有乙個點是在有標籤資料僅有1%的時候,fine tune的網路結構越複雜,卻似乎沒有出現明顯的過擬合現象,指標上公升依舊非常穩健,這一點也比較有意思,這部分如果可以給出訓練階段的指標對比就更好了。

simclr v2和simclr還有乙個不同點是非線性層的數量和fine tune時候的起始層位置,這部分在**中的figure5有非常清晰的對比,分別是a和b。結論就是非線性層數量為3(simclr的非線性層數量是2),fine tune的時候從第一層開始效果最好(simclr在fine tune的時候是完全丟掉非線性層的)。這結果確實有點魔性,因為在有標籤資料佔比較少時對指標的影響還是比較大的,而且其他一些自監督演算法中也能看到類似的影子,比如byol

table2是蒸餾相關的,變數包括損失函式的構成和資料集構成,損失函式部分最後預設使用蒸餾損失,而不考慮有監督的損失;資料集部分有些疑惑,**中有些部分寫的是只有無標籤資料,但是這裡又包含有標籤資料,但其實有標籤資料佔比較小,所以影響應該也不大。

figure6這個蒸餾相關的實驗也很有借鑑意義。從圖例來看,黑色線、藍色線(參考table1)和紅色線(student和teacher一樣)都比較好理解,這部分重點還是紅色線和藍色線的對比,可以看出self-distilled(學生網路和教師網路一樣)可以進一步提公升模型的效果,因此**中在做常規的蒸餾(學生網路比教師網路簡單)之前,會先做一次self-distilled,進一步提公升教師網路的效果。綠色線的含義應該是固定了teacher是resnet-152(2✖️+sk),如果是這樣的話綠色線和紅色線的最後乙個點應該是重合的,從圖中看好像只是差不多重合而已。

最後table3是和現有演算法的對比,最後3行的teacher model都是self-distilled的resnet-152(3✖️+sk),可以看到僅用10%資料訓的resnet-50的效果(77.5%)已經超過了有監督的resnet-50了(76.6%),amazing。同時從這個**的3段式劃分也可以大概窺見目前相關領域演算法的大致情況,純粹task-agnostic的演算法要在指標上超過simclr v2還是有點困難的,所以可以在這一系列演算法中新增fine tune的操作,應該會有不錯的結果。而純task-specific的**主要還是圍繞偽標籤來的,整體上也有不錯的結果,值得跟進。simclr系列演算法在訓練階段都要求大batch size(複雜網路的前提下要千級別),這一點對機器資源要求比較高,應該會成為後續很多演算法突破的方向。

演算法筆記 2

習題1 1.輸入三個整數,輸出他們的平均數,保留3位小數 includeint main 習題1 2 溫度 輸入華氏溫度f,輸出對應的攝氏溫度c,保留3位小數 include int main 習題1 3 連續和 輸入正整數n,輸出1 2 3 n的值.include int main 習題1 4 正...

C 演算法筆記2

1 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點 此題我們可以先定義兩個指標,p和q。讓p和q都指向頭結點。在定義乙個i,i的初始值為0。然後進入乙個for迴圈,直到p走到鍊錶結尾,每次i 當i k 的我們讓p走,q不走。當i k 的時候我們讓p和q同時走一步。當p走到結尾的時候,那麼q走的值就是倒數k...

演算法筆記模板2

排序 include include using namespace std void netherlandsort int arr,int l,int r,int p else if arr l p else printf d d less 1,more 1 二分法 查詢x intbinaryse...