TextCNN可以和對(duì)比學(xué)習(xí)融合嗎-SimCSE論文讀后感
最近抽時(shí)間把SIMCSE用Pytorch復(fù)現(xiàn)了一下,中途涉及到的幾個(gè)思考點(diǎn),和大家分享一下:
注:原作者有開(kāi)源論文代碼,不過(guò)有些復(fù)雜,大家可以看一下自己魔改一下;
全文思路如下:
SIMCSE理論介紹以及代碼實(shí)現(xiàn)的部分細(xì)節(jié)點(diǎn) TextCNN是否可以借鑒SIMCSE的思路,來(lái)訓(xùn)練模型從而獲取比較好的Sentence embedding 是否可以借鑒Dropout數(shù)據(jù)增強(qiáng),使用amsoftmax,減少同類距離,增大不同類距離
1. SIMCSE論文理論介紹
當(dāng)時(shí)讀完SIMCSE論文之后,沒(méi)時(shí)間寫文章,趕緊發(fā)了個(gè)朋友圈把思路簡(jiǎn)單的記錄了一下;

感興趣的朋友加我微信【dasounlp】,互看朋友圈啊,笑;
論文分為四個(gè)部分來(lái)講,對(duì)比學(xué)習(xí),無(wú)監(jiān)督SIMCSE,有監(jiān)督SIMCSE,評(píng)價(jià)指標(biāo);
1.1 對(duì)比學(xué)習(xí)
對(duì)比學(xué)習(xí)的目的是,是減少同類距離,增大不同類之間的距離,借此獲得一個(gè)文本或者圖片更好的表示向量;
定義句子對(duì):;其中N是一個(gè)Batch中句子對(duì)樣本數(shù)量,是語(yǔ)義相似的樣本,分別是經(jīng)過(guò)編碼器Encoder之后得到的表示向量;
那么對(duì)比學(xué)習(xí)的訓(xùn)練目標(biāo)就是:

這個(gè)公式看著比較唬人,其實(shí)本質(zhì)就是一個(gè)多分類softamx的交叉熵?fù)p失函數(shù);
需要注意的是參數(shù) 是個(gè)超參數(shù),是一個(gè)相似性度量函數(shù),原論文使用的cosine,其實(shí)使用一些其他的相似性函數(shù)應(yīng)該也沒(méi)問(wèn)題;
注意一下分母這里:其實(shí)一個(gè)batch,比如有N個(gè)句子對(duì),那么就有2N個(gè)句子,其中正例是1個(gè),負(fù)樣本應(yīng)該是總樣本數(shù)目2N減去樣本本身加上樣本的正例,也就是2N-2;
不過(guò),看公式,作者這里用到的是一個(gè)batch中的N個(gè)樣本,也就是使用的是每個(gè)句子對(duì)中的其中一個(gè);
關(guān)于這個(gè)問(wèn)題,是否使用更多的負(fù)樣本是不是會(huì)獲得更好的效果,作者回復(fù)說(shuō)并沒(méi)有。
我自己在復(fù)現(xiàn)的時(shí)候,使用的是2N-1個(gè)樣本【正例+負(fù)例總和】;
那么在落地到代碼的時(shí)候,怎么實(shí)現(xiàn)這個(gè)交叉熵呢?我畫了一個(gè)簡(jiǎn)單的圖,比如batch是2:

1.2 正例和負(fù)例的構(gòu)建
上面談到的整個(gè)過(guò)程,全程沒(méi)離開(kāi)正例和負(fù)例;
在圖像中,一個(gè)圖像經(jīng)過(guò)平移旋轉(zhuǎn)等數(shù)據(jù)增強(qiáng)的方式,可以看成是生成了圖像的正例;
在文本上,一些常規(guī)的數(shù)據(jù)增強(qiáng)的手段就是刪減單詞,替換同義詞等等;
文本的數(shù)據(jù)增強(qiáng)存在的一個(gè)問(wèn)題就是,一個(gè)簡(jiǎn)單的操作可能就會(huì)導(dǎo)致語(yǔ)義的改變;
在無(wú)監(jiān)督的SIMCSE中,正例的構(gòu)造很有意思,就是通過(guò)添加一個(gè)Dropout的噪聲;
Dropout是在隨機(jī)失活神經(jīng)元,每次句子經(jīng)過(guò)網(wǎng)絡(luò),失活的神經(jīng)元是不一致的,導(dǎo)致生成的embedding是不一致的;
這一點(diǎn)其實(shí)大家應(yīng)該都懂,但是能聯(lián)想到把這個(gè)作為數(shù)據(jù)增強(qiáng)的一個(gè)手段,確實(shí)很強(qiáng)。
在有監(jiān)督的SIMCSE中,其實(shí)是借助了NLI數(shù)據(jù)集中自帶的標(biāo)簽,來(lái)構(gòu)造正例和負(fù)例;
直接來(lái)看作者原文中的圖吧;

1.3 句子向量評(píng)價(jià)指標(biāo)
句子向量的評(píng)價(jià)指標(biāo)這里,用兩個(gè)東西來(lái)量化一下,alignment和Uniformity;
直接來(lái)看圖:

2. TextCNN和Dropout的融合
SIMCSE中,BERT作為Encoder未免太復(fù)雜了,這時(shí)候按照常規(guī)思路,我會(huì)去思考可不可以使用簡(jiǎn)單網(wǎng)絡(luò)比如textcnn代替bert;
那么實(shí)現(xiàn)方式就可以分為兩種:
一種是我使用textcnn直接作為encoder,然后仿照無(wú)監(jiān)督simcse的訓(xùn)練方式進(jìn)行訓(xùn)練就可以了;
第二種方式就是知識(shí)蒸餾,無(wú)監(jiān)督simcse訓(xùn)練一個(gè)bert的encoder出來(lái)之后,使用簡(jiǎn)單網(wǎng)絡(luò)textcnn進(jìn)行學(xué)習(xí)就可以了;
我針對(duì)第一種方式做了個(gè)實(shí)驗(yàn)。
在實(shí)驗(yàn)之前,我就沒(méi)報(bào)什么大的希望,只是想親眼試一下究竟可行不可行;
為什么沒(méi)有報(bào)太大希望呢,很簡(jiǎn)單,我自己認(rèn)為dropout作為一種數(shù)據(jù)增強(qiáng)的形式,太過(guò)簡(jiǎn)單了,textcnn這種簡(jiǎn)單網(wǎng)絡(luò),不足以學(xué)習(xí)到其中的差異;
我在中文的LCQMC和ATEC數(shù)據(jù)集上做了一個(gè)簡(jiǎn)單的測(cè)試,Spearman作為評(píng)價(jià)指標(biāo),結(jié)果如下:

之后,我看情況能不能把這部分代碼開(kāi)源出來(lái)~~,自己實(shí)現(xiàn)也挺簡(jiǎn)單的;
3. Amsoftmax的引入
第三個(gè)小思路是這樣的,dropout可以看做是一個(gè)最小化的文本數(shù)據(jù)增強(qiáng)的形式。同一個(gè)句子,經(jīng)過(guò)encoder,得到的embeding不同,但是語(yǔ)義是相似的,所以可以看做是一個(gè)正例;
進(jìn)一步的,如果我同一個(gè)句子經(jīng)過(guò)多次encoder,比如經(jīng)過(guò)10次,那么我得到的就是10個(gè)embedding;
也就是說(shuō),在同一個(gè)語(yǔ)義下面,我得到的是10個(gè)語(yǔ)義近似但是embedding不同的向量;
如果我有10萬(wàn)個(gè)句子,可以把這個(gè)10萬(wàn)個(gè)句子當(dāng)做是10萬(wàn)個(gè)類別,每個(gè)類別下有10個(gè)樣本;
想一下這個(gè)感覺(jué),不就是人臉識(shí)別的操作嗎?
那么可不可以使用這種方式,得到更好的語(yǔ)義表達(dá)呢?
這個(gè)我沒(méi)做實(shí)驗(yàn),只是一個(gè)思路,之后有時(shí)間再去做實(shí)驗(yàn),有興趣的朋友可以做一下;
