【花師小哲】面向一般大眾的神經(jīng)網(wǎng)絡(luò)科普(2)-NLP領(lǐng)域
這篇主要講神經(jīng)網(wǎng)絡(luò)在NLP(自然語言處理)領(lǐng)域的應(yīng)用,主要原因是在NLP領(lǐng)域有一些非常重要的模型突破,這些突破實(shí)質(zhì)上也促進(jìn)了整體上神經(jīng)網(wǎng)絡(luò)的發(fā)展。
?

2.神經(jīng)網(wǎng)絡(luò)在NLP領(lǐng)域的應(yīng)用
2.0 embedding
講之前,先講一下上篇預(yù)留的小問題,即詞語、文字是怎樣輸入到神經(jīng)網(wǎng)絡(luò)中的。對(duì)于英文字母還好說,有些人可能熟悉ASCII碼,或者說,在計(jì)算機(jī)中,很多字符底層存儲(chǔ)仍然是數(shù)字。
但是這種方法并不能解決我們的所有問題,很多時(shí)候我們是要將一個(gè)英文單詞或中文詞語作為整體進(jìn)行輸入的,這時(shí)候,就有了一種比較笨的編碼方式,也是分類問題中常用的編碼:one-hot。
one-hot的想法很簡(jiǎn)單,我們給定一個(gè)句子“Wangcai is a dog.”我們可以這樣編碼:
Wangcai? ? ?:[1,0,0,0]
is????????????????:[0,1,0,0]
a????????????????:[0,0,1,0]
dog????????????:[0,0,0,1]
但這樣有個(gè)問題,就是每個(gè)詞語變成一個(gè)一維數(shù)組或者向量后都是相互獨(dú)立的,而實(shí)際上Wangcai和dog是有相關(guān)性的,如果是下面這種編碼可能更好:
Wangcai????:[0.6,0,0,0.4]
is????????????????:[0,1,0,0]
a????????????????:[0,0,1,0]
dog???????????? :[0.4,0,0,0.6]
于是乎,經(jīng)典的Word2Vec就被提出了,Word2Vec想做的就是把一個(gè)詞語映射到一個(gè)歐式空間中,在這個(gè)空間中,相似的詞語挨得比較近,甚至想要達(dá)到Word2Vec(母親)-Word2Vec(女性)+Word2Vec(男性)=Word2Vec(父親)的效果。有了Word2Vec,我們似乎就可以把自然語言處理文字變成一個(gè)計(jì)算問題。
?
好,講了這么多,這些和embedding有什么關(guān)系呢?簡(jiǎn)單來說,embedding就是用一個(gè)向量來表示另一個(gè)事物,這個(gè)事物可以是上面提到的詞語,可以是一個(gè)物體,甚至可以是另一個(gè)向量。
構(gòu)造embedding的方法也是多種多樣,可以用一些數(shù)學(xué)或者統(tǒng)計(jì)的方法構(gòu)造embedding,例如我們用一個(gè)長(zhǎng)數(shù)組的k階矩來表示這個(gè)數(shù)組;也可以用神經(jīng)網(wǎng)絡(luò)的方法,從上面所說的ont-hot編碼訓(xùn)練出Word2Vec向量。如果是從向量到向量的embedding,即可以變小,也可以變大,一切都取決于解決問題的需要。
?
2.1循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
傳統(tǒng)的MLP存在一個(gè)問題,即它的輸入和輸出數(shù)目是固定的,而自然語言處理中,輸入和輸出不一樣的情況很正常,于是就有了RNN:

簡(jiǎn)單來說,最基礎(chǔ)的RNN可以接受任意數(shù)量的輸入,但是是一個(gè)接一個(gè)地輸入到網(wǎng)絡(luò)之中的,每一次輸入不只和權(quán)值W有關(guān),也和上一輪的輸入有關(guān)。這樣,神經(jīng)網(wǎng)絡(luò)就能接受任意的輸入,可以進(jìn)行任意的輸出了。
而且我們知道,當(dāng)我們說話的時(shí)候,我們說出的詞語都不是獨(dú)立存在的,都是和前后文有關(guān)系的,RNN保留了上一輪運(yùn)行的結(jié)果,這也會(huì)影響到后面的結(jié)果。
同樣也是一個(gè)非常簡(jiǎn)單的模型,但是實(shí)際應(yīng)用中確實(shí)是有用武之地的,例如如果我們用RNN來做下一個(gè)字符的預(yù)測(cè),我們是能夠得到一些表面上看上去很好的輸出的,例如如果我們輸入很多代碼進(jìn)行訓(xùn)練,RNN是會(huì)吐出很多結(jié)構(gòu)上像代碼的東西的,當(dāng)然,其中很少能運(yùn)行;如果我們輸入很多數(shù)學(xué)證明論文進(jìn)行訓(xùn)練,RNN是會(huì)吐出看上去像模像樣的論文的,它甚至?xí)媹D、寫公式,當(dāng)然這也只是看上去像,實(shí)質(zhì)上還是符號(hào)的堆積。
?
2.2長(zhǎng)短期記憶LSTM
RNN是存在很多問題的,一個(gè)問題就是長(zhǎng)程依賴(這個(gè)術(shù)語不一定準(zhǔn)確,主要是我對(duì)這方面也不是很熟悉)。例如我們給一個(gè)長(zhǎng)句子:“旺財(cái)是一只擁有白色毛發(fā)、喜歡在院子里打滾的小狗?!焙苊黠@,“旺財(cái)”和“小狗”是有聯(lián)系的,但是RNN很難建立起這個(gè)聯(lián)系的,舉個(gè)粗略的例子:
假設(shè)有一排人,第一個(gè)人有一塊餅干,每個(gè)人都會(huì)接收上個(gè)人的餅干,掰一半傳遞給下一個(gè)人??梢钥吹?,這塊餅干傳遞幾個(gè)人就變得很小了。
RNN也面臨這個(gè)問題,“旺財(cái)”的影響是很難傳遞到“小狗”的,于是就有了長(zhǎng)短期記憶——LSTM:

LSTM看上去就頭大,并且我們不展開講,因?yàn)?,LSTM只能緩解這個(gè)問題,并沒有消除這個(gè)問題,我們還有更好的方案。
?
2.3Transformer
谷歌在2017年發(fā)表了一篇名字非常豪邁的論文,名叫Attention Is All You Need。這個(gè)標(biāo)題經(jīng)常被拿去玩梗,例如“xgboost is all you need”,如果去arxiv上搜這個(gè)題目,你還能看到一大堆論文題目在討論Attention是不是all you need。
敢用這種名字并不是無知者無畏,而是論文中提到的Transformer模型真的是太強(qiáng)了。Transformer的結(jié)構(gòu)如下所示:

看上去是不是很唬人,但實(shí)際上,整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)就兩部分:
輸入->encoder(編碼)->decoder(解碼)
沒錯(cuò),就是我們對(duì)輸入做一次編碼,然后再解碼得到結(jié)果。就是這樣一個(gè)模型,他有兩大突破點(diǎn):
?
(1)完全舍棄RNN架構(gòu),只使用attention機(jī)制,或者說,self-attention(自注意機(jī)制)
簡(jiǎn)單介紹一下attention,之前RNN不是存在長(zhǎng)程依賴問題嘛,LSTM使用的目的也是為了給兩個(gè)相距較遠(yuǎn)的詞語建立一定的聯(lián)系,當(dāng)然,這種聯(lián)系是隱式的,那么,我們?yōu)槭裁床?span id="s0sssss00s" class="color-blue-01 font-size-16">顯式地把這種聯(lián)系建立起來呢?
于是,就有了attention這種其實(shí)很暴力的機(jī)制,即每?jī)蓚€(gè)詞之間都建立起聯(lián)系,這種聯(lián)系的強(qiáng)弱是可以訓(xùn)練的,這樣,就徹底解決了“旺財(cái)是一只擁有白色毛發(fā)、喜歡在院子里打滾的小狗?!敝小巴?cái)”和“小狗”距離太遠(yuǎn)的問題。
attention具體怎么做講起來挺復(fù)雜的,但使用起來就簡(jiǎn)單很多了。

當(dāng)然,估計(jì)很多人都看到了attention的問題了,假設(shè)有N個(gè)詞語,我們就要建立N^2這個(gè)數(shù)量級(jí)的聯(lián)系,網(wǎng)絡(luò)必然變得更龐大了。
?
(2)預(yù)訓(xùn)練-微調(diào)范式。
這樣龐大的網(wǎng)絡(luò)讓個(gè)人筆記本這樣的小電腦從頭開始跑那真的是為難用戶了,而且一般用戶也沒有那么多訓(xùn)練數(shù)據(jù)喂給網(wǎng)絡(luò)。
(上篇忘了說了,神經(jīng)網(wǎng)絡(luò)的另一個(gè)問題是訓(xùn)練很慢,即使是小型網(wǎng)絡(luò)也比機(jī)器學(xué)習(xí)的其他很多方法要慢多了)
那么,是誰有充足的數(shù)據(jù)又有大量的運(yùn)算資源呢?互聯(lián)網(wǎng)大公司唄。于是,這樣龐大的網(wǎng)絡(luò)就由大公司進(jìn)行預(yù)訓(xùn)練,然后再發(fā)給用戶,根據(jù)需要喂給個(gè)性化的數(shù)據(jù)進(jìn)行微微的、快速的調(diào)整,就可以直接使用了。
當(dāng)然,Transformer用了自監(jiān)督方法,但自監(jiān)督任務(wù)的設(shè)置還是BERT經(jīng)典,我們BERT再講。
?
2.4BERT
BERT是2018年10月由Google AI研究院提出的一種預(yù)訓(xùn)練模型。BERT的全稱是Bidirectional Encoder Representation from Transformers。BERT表現(xiàn)得非常亮眼,算是NLP領(lǐng)域里程碑式的成就。
BERT也是一個(gè)預(yù)訓(xùn)練模型,其思路也是很簡(jiǎn)單,就是單純把Transformer的encoder部分提取了出來,這樣做的好處是BERT就獲得了強(qiáng)大的特征提取能力。
也就說,BERT相當(dāng)于Transformer砍了一半,只有:
輸入->encoder(編碼)
我們輸入的數(shù)據(jù)經(jīng)過BERT,就可以變成富含語義信息的編碼信息。
BERT的輸入也是使用了embedding:

它同時(shí)把詞語本身、詞語的位置信息做了embedding??梢钥闯觯琫mbedding的另一個(gè)重要作用是把不同的東西整合成一樣的東西。
?
我們上篇提到一般神經(jīng)網(wǎng)絡(luò)是監(jiān)督學(xué)習(xí),監(jiān)督學(xué)習(xí)意味著需要對(duì)數(shù)據(jù)進(jìn)行標(biāo)注,而標(biāo)注費(fèi)時(shí)費(fèi)力,有沒有更好的方法呢?有的,那就是自監(jiān)督學(xué)習(xí)。
自監(jiān)督學(xué)習(xí)是說,我們可以對(duì)原始數(shù)據(jù)做一些處理,給神經(jīng)網(wǎng)絡(luò)安排一些相關(guān)任務(wù),迫使神經(jīng)網(wǎng)絡(luò)去學(xué)到一些知識(shí)。
?
BERT的一大亮點(diǎn)就是它的預(yù)訓(xùn)練任務(wù)的設(shè)置。
BERT設(shè)置了兩個(gè)預(yù)訓(xùn)練任務(wù):Masked LM和Next Sentence Prediction。
(1)Masked LM
Masked LM類似于完形填空,BERT會(huì)對(duì)輸入做些處理,主要是會(huì)隨機(jī)對(duì)一些詞語做MASK,具體來說是有可能直接替換為[MASK]標(biāo)簽、隨機(jī)替換為別的詞語或是不變,然后去訓(xùn)練BERT,讓它去學(xué)習(xí)自然語言的語義。
(2)Next Sentence Prediction
Next Sentence Prediction(下句話預(yù)測(cè))試圖讓BERT學(xué)會(huì)句子與句子之間的關(guān)系。對(duì)于A的下一句話,可能是原下一句話(正樣本),也可以是隨機(jī)另一句話(負(fù)樣本),我們就這樣讓BERT去訓(xùn)練。
通過這兩項(xiàng)訓(xùn)練,BERT就可以輸出富含語義信息的encoder結(jié)果,用戶就可以用這個(gè)結(jié)果進(jìn)行微調(diào)。
MASK和下句話預(yù)測(cè)的想法也在其他很多領(lǐng)域得到了應(yīng)用。
?

當(dāng)然,BERT后還有很多新的研究,這里不展開,下一篇主要講講神經(jīng)網(wǎng)絡(luò)在機(jī)器視覺領(lǐng)域的應(yīng)用,也會(huì)涉及到圖像生成。也會(huì)談一下神經(jīng)網(wǎng)絡(luò)在其他一些網(wǎng)絡(luò)中的運(yùn)用。