自监督学习和对比学习
這篇主要探討SimCLR,不需要用監(jiān)督學(xué)習(xí)(supervision)的方式,采用自監(jiān)督(self-supervised)的方式使得模型學(xué)到很多有用的patterns。眾所周知,使用對(duì)比學(xué)習(xí)(修改樣本,loss等小trick)就可以顯著提高模型的泛化能力,所以我們都需要掌握這項(xiàng)"技藝"。
Self-Supervised Learning(SSL):
自監(jiān)督學(xué)習(xí)是目前機(jī)器學(xué)習(xí)中一個(gè)非常流行的分支,不管監(jiān)督學(xué)習(xí)已經(jīng)多么精準(zhǔn),最終能顯著提升監(jiān)督模型效果的永遠(yuǎn)是更多的有標(biāo)簽的數(shù)據(jù)。但是真實(shí)情況是,很多任務(wù)很難有大量標(biāo)注的數(shù)據(jù)。SSL目標(biāo)就是從無(wú)標(biāo)注數(shù)據(jù)獲取標(biāo)注,并用他們來訓(xùn)練,在NLP中,我們隨機(jī)mask掉部分文本,讓模型去做完型填空。在幾個(gè)G的語(yǔ)料庫(kù)上這樣學(xué)習(xí)后,模型就已經(jīng)學(xué)到了很多語(yǔ)法知識(shí),單詞語(yǔ)意等。
研究證明,將這一思想推廣到計(jì)算機(jī)視覺沒啥用。想象一下,通過前幾幀預(yù)測(cè)視頻中的下一幀。乍一看,這與NLP中的掩蔽非常相似,但問題是,網(wǎng)絡(luò)可以做出無(wú)數(shù)看似合理的預(yù)測(cè),并且無(wú)法計(jì)算每一幀的概率,因?yàn)槲覀兲幱谝粋€(gè)超高維、連續(xù)的空間中。
Contrastive Learning: 當(dāng)研究?jī)蓚€(gè)物體時(shí),我們很容易區(qū)分它們,即使以前從未見過它們。例如,一只狗和一把椅子,盡管它們的顏色可能彼此相似,但會(huì)有非常明顯的特征,而一對(duì)狗,盡管它們的品種差異很小,但屬于同一類別,我們會(huì)認(rèn)識(shí)到這一事實(shí)。換句話說,通過辨別一個(gè)物體的視覺特征,能夠在它和其他事物之間形成對(duì)比。
如下圖所示,可以從一個(gè)物體中提取三個(gè)屬性:I)它的顏色有多暗(0表示白色,1表示黑色),II)它有多可愛(0表示一點(diǎn)也不可愛,1表示非常可愛),以及III)它有多“舒適”(0表示一點(diǎn)也不舒適,1表示非常舒適),因此椅子比椅子和狗有更高的余弦相似性。
對(duì)比學(xué)習(xí)的工作原理類似,目的是從圖像中提取特征,同時(shí)努力將相似的圖片(也稱為正對(duì))放在一起,而將不同的圖片(也稱為負(fù)對(duì))放在很遠(yuǎn)的地方。目前對(duì)比學(xué)習(xí)已經(jīng)做了大量的研究,本文從《A Simple Framework for Contrastive Learning of Visual Representations》一文中的提出的SimCLR入手,SimCLR基本可以認(rèn)為是學(xué)對(duì)比學(xué)習(xí)的基石了。
SimCLR:在圖像分類任務(wù)中,如果每張照片都屬于一個(gè)類,最基本的就要構(gòu)造正負(fù)樣本對(duì),前者是來自一個(gè)類別的實(shí)例,后者是來自兩個(gè)類別的兩個(gè)數(shù)據(jù)點(diǎn)。然而,這將破壞SSL的目的,因此我們必須設(shè)計(jì)一種解決方案,處理成堆的未標(biāo)記數(shù)據(jù)。SimCLR的方法是將每個(gè)圖像視為一個(gè)單獨(dú)的類別,并對(duì)其進(jìn)行擴(kuò)充,以便為每個(gè)所謂的類生成實(shí)例。例如,與配對(duì)(需要監(jiān)督)不同,下圖每行都是正例,隨機(jī)取兩行,取yige:
- 正例對(duì): (藍(lán)色的椅子, 白色的椅子)
- 負(fù)例對(duì): (藍(lán)色的椅子,狗)
有趣的是,數(shù)據(jù)增強(qiáng)在自我監(jiān)督模型的準(zhǔn)確性方面起著決定性的作用,即使它可能會(huì)損害監(jiān)督訓(xùn)練。作者對(duì)各種數(shù)據(jù)增強(qiáng)進(jìn)行了實(shí)驗(yàn),并提出了三種精度最高的增強(qiáng)方法:
代碼也比較簡(jiǎn)單:
from torchvision import transforms # Size used in SimCLR size = 224 crop_resize_flip = transforms.Compose([transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(3/4, 4/3)),transforms.RandomHorizontalFlip(p=0.5)])# Higher means stronger s = 1.0 # 0.8*s and 0.2*s are from the paper colour_jitter = transforms.ColorJitter(brightness=0.8*s, contrast=0.8*s, saturation=0.8*s, hue=0.2*s) colour_jitter = transforms.RandomApply([colour_jitter], p=0.8) colour_distortion = transforms.Compose([colour_jitter,transforms.RandomGrayscale(p=0.2)])kernel_size = int(0.1*size) # The size of the kernel must be odd kernel_size = kernel_size if kernel_size%2 == 1 else kernel_size+1 gaussian_blur = transforms.GaussianBlur(kernel_size, sigma=(0.1, 2.0)) gaussian_blur = transforms.RandomApply([gaussian_blur], p=0.5)augment = transforms.Compose([crop_resize_flip,colour_distortion,gaussian_blur])這幾項(xiàng)簡(jiǎn)單的數(shù)據(jù)增強(qiáng)技術(shù)如何能夠提供截然不同的圖像版本,從而提高SSL的性能。接下來,我們將數(shù)據(jù)輸入模型,并指示它在不同的圖像之間進(jìn)行對(duì)比,以獲得沒有任何標(biāo)簽的有用視覺模式。
有了數(shù)據(jù)增強(qiáng),就可以先隨機(jī)采樣一個(gè)batch,每個(gè)batch兩次增強(qiáng),讓同一張圖的不同view在latent space里靠近,不同圖的view在latent space里遠(yuǎn)離,如下圖所示。SimCLR使用ResNet-50(4x)作為模型,并在無(wú)監(jiān)督學(xué)習(xí)后訓(xùn)練了一個(gè)linear classifier,最后取得了相當(dāng)好的效果。
總結(jié)
以上是生活随笔為你收集整理的自监督学习和对比学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络越深越好?
- 下一篇: LightGBM笔记