【花師小哲】面向一般大眾的神經(jīng)網(wǎng)絡(luò)科普(1)-基礎(chǔ)知識(shí)
最近AI作畫很火,但很多朋友并不是很懂AI,對(duì)AI作畫的一些批評(píng)意見(jiàn)主要停留在“新時(shí)代煉金術(shù)”“只是拼湊素材”這樣比較感性的認(rèn)識(shí)之上,我覺(jué)得畫師們稍微懂一些AI,特別是懂一些神經(jīng)網(wǎng)絡(luò),可能能更好的幫助他們。(當(dāng)然,大畫師估計(jì)是看不到這篇專欄)
這篇專欄主要介紹神經(jīng)網(wǎng)絡(luò)的一些基本知識(shí)和介紹一些著名的網(wǎng)絡(luò),講講它們是干什么的,為什么發(fā)明出來(lái)。當(dāng)然,肯定有很多不全面的內(nèi)容。
注意,這篇專欄的主要目的是面向一些并不從事AI研究,主要是不熟悉神經(jīng)網(wǎng)絡(luò)的朋友的(當(dāng)然,AI領(lǐng)域的朋友也可以當(dāng)小說(shuō)來(lái)看),所以很多說(shuō)法會(huì)不太嚴(yán)謹(jǐn),主要目的是讓大家對(duì)神經(jīng)網(wǎng)絡(luò)有一個(gè)粗略的了解。
如果你是想入門AI的話不建議看這篇專欄,這篇專欄基本上不涉及數(shù)學(xué)公式推導(dǎo)和概念的深入和專業(yè)解釋的。
再加上AI領(lǐng)域的相關(guān)研究真的太多了,我個(gè)人能力也有限,難免會(huì)出現(xiàn)錯(cuò)誤,望大家見(jiàn)諒。
好,套完了盾,我們正式開(kāi)始。
這篇主要講神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)知識(shí)。

1.最基本的神經(jīng)網(wǎng)絡(luò)相關(guān)知識(shí)
1.0神經(jīng)網(wǎng)絡(luò)名稱來(lái)源
神經(jīng)網(wǎng)絡(luò)之所以叫神經(jīng)網(wǎng)絡(luò)(或者稱為人工神經(jīng)網(wǎng)絡(luò)),其實(shí)就是模仿我們的大腦設(shè)計(jì)的一個(gè)模型,雖然整個(gè)模型其實(shí)和我們的大腦差別還是蠻大的。
至于為什么要模仿大腦,很簡(jiǎn)單,一般我們認(rèn)為人類的智能和我們的大腦結(jié)構(gòu)有很大的關(guān)系。

1.1神經(jīng)元
如果是正經(jīng)從頭開(kāi)始學(xué)神經(jīng)網(wǎng)絡(luò)的(而不是直接掉包來(lái)用),最開(kāi)始肯定會(huì)講神經(jīng)元。
先放一張生理上的神經(jīng)元模型。

人工神經(jīng)網(wǎng)絡(luò)的神經(jīng)元是下面這樣的模型:

兩者還是挺像的。
中間那個(gè)圓圈就可以看做是生理學(xué)上神經(jīng)元的胞體,左邊的x1、x2等就可以看做是這個(gè)神經(jīng)元的輸入(生理學(xué)上神經(jīng)元的樹(shù)突),右邊的a就是這個(gè)神經(jīng)元的輸出(生理學(xué)上神經(jīng)元的軸突)
整個(gè)神經(jīng)元模型的任務(wù)就是接受輸入并進(jìn)行整合,通過(guò)一個(gè)激活函數(shù)(圖中的方塊,就是一個(gè)特殊的函數(shù))得到一個(gè)輸出,是一個(gè)多輸入單輸出的模型。
我們先不要管圖中的b,這個(gè)不講,我們主要關(guān)注w,w是說(shuō)神經(jīng)元并不是將所有輸入同等看待的,w值越大說(shuō)明此神經(jīng)元認(rèn)為所對(duì)應(yīng)的輸入越重要,或者說(shuō),這個(gè)輸入和自己的聯(lián)系更密切。
1.2多層感知機(jī)MLP
19世紀(jì)50年代末,MLP就被提出了。多層感知機(jī)模型如下:

其中每一個(gè)圓圈都可以看做是一個(gè)神經(jīng)元,每一條線都可以看做是一個(gè)w,即一個(gè)權(quán)值。我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)就是訓(xùn)練這些權(quán)值。
(這里插一句,這張圖可能有些誤導(dǎo),每一層的神經(jīng)元個(gè)數(shù)不一定一樣,都是根據(jù)需要來(lái)的,特別是輸入和輸出都是服務(wù)于我們的使用目的的)
沒(méi)錯(cuò),聽(tīng)上去就是這么簡(jiǎn)單,最基礎(chǔ)的神經(jīng)網(wǎng)絡(luò)就長(zhǎng)這樣子,而且多層感知機(jī)的代碼也不復(fù)雜,基本程序員是可以簡(jiǎn)單地手?jǐn)]出來(lái)的。
但這個(gè)模型性能其實(shí)并不差,我第一次學(xué)神經(jīng)網(wǎng)絡(luò)還是很震驚的,這個(gè)模型這么簡(jiǎn)單,為什么可以取得很好的效果?只能說(shuō),玄學(xué)。
當(dāng)然,MLP相比于其他很多網(wǎng)絡(luò)還是差很多。
?
1.3深度神經(jīng)網(wǎng)絡(luò)
所謂深度神經(jīng)網(wǎng)絡(luò)也沒(méi)有什么太復(fù)雜的想法,就是多做很多隱含層,就是這樣一個(gè)改動(dòng)就使得早已被打入冷宮的神經(jīng)網(wǎng)絡(luò)在近些年再次崛起。
當(dāng)然,深度神經(jīng)網(wǎng)絡(luò)一開(kāi)始面臨的問(wèn)題很多,為了把網(wǎng)絡(luò)做深,有很多細(xì)節(jié)的問(wèn)題要解決,這些問(wèn)題太瑣碎了,就不展開(kāi)談。
?
1.4神經(jīng)網(wǎng)絡(luò)基本知識(shí)的解答
對(duì)于很多非AI領(lǐng)域的朋友來(lái)說(shuō),看了上面這些內(nèi)容,估計(jì)還是一頭霧水,所以簡(jiǎn)單講一些相關(guān)基本知識(shí)的解答,有些可能涉及專業(yè)內(nèi)容。
(1)神經(jīng)網(wǎng)絡(luò)的輸入和輸出是什么?
對(duì)于最基本的神經(jīng)網(wǎng)絡(luò),輸入和輸出都是數(shù)據(jù),當(dāng)然,單純說(shuō)數(shù)據(jù)大家肯定不明白,舉個(gè)例子,我們的任務(wù)是這樣的,我們知道小明身高173cm,每天吃3kg飯,年齡23歲,想要預(yù)測(cè)小明的體重,那么輸入就是173、3和23,輸出就是小明的體重。這種問(wèn)題叫做回歸問(wèn)題。
另一個(gè)任務(wù)是預(yù)測(cè)小明是否是胖的,那么輸出可以是一個(gè)數(shù)值,我們可以認(rèn)為這個(gè)值小于一個(gè)值(例如75kg)就是不胖,大于等于這個(gè)值就是胖。我們也可以輸出兩個(gè)數(shù)值,數(shù)值1比數(shù)值2大的話就認(rèn)為是不胖,否則就是胖,這種就是分類問(wèn)題。
可以看到,輸入和輸出都是跟具體任務(wù)有關(guān)的。如果我們要做視覺(jué)識(shí)別,輸入就是圖像的每一個(gè)像素值;如果我們要做自然語(yǔ)言處理,輸入就是一個(gè)個(gè)的詞語(yǔ)(這里大家可能不太理解,即詞語(yǔ)怎么輸入啊,這個(gè)之后再講)。
(2)真的只需要訓(xùn)練權(quán)值就可以了嗎?
對(duì)的,神經(jīng)網(wǎng)絡(luò)所訓(xùn)練的真的只有這個(gè)W,當(dāng)然,不同網(wǎng)絡(luò)對(duì)權(quán)值的叫法是不一樣的,不同權(quán)值所起到的作用也是不一樣的,但我們訓(xùn)練的目的真的就只是調(diào)整這些數(shù)值。
(3)這些權(quán)值有什么意義?
一般認(rèn)為,是沒(méi)有意義的。他們不像是物理模型中的參數(shù)(例如光速)一樣是有明確的物理意義的。
但我們當(dāng)然可以認(rèn)為這個(gè)模型既然能夠做一些預(yù)測(cè)工作,那這些權(quán)值是有一定的意義的,但是具體的意義是什么我們是不知道的
所以為什么我們常說(shuō)神經(jīng)網(wǎng)絡(luò)是黑盒、是煉金術(shù)、是不可解釋的,就是因?yàn)殡m然我們能夠看到每個(gè)權(quán)值都是什么,但我們?nèi)匀徊荒芾斫馍窠?jīng)網(wǎng)絡(luò)到底是怎么工作的,為什么就可以完成我們的任務(wù)。
(4)神經(jīng)網(wǎng)絡(luò)都長(zhǎng)這樣嗎?
不一定,現(xiàn)在的神經(jīng)網(wǎng)絡(luò)各種邪門的結(jié)構(gòu)都有的,簡(jiǎn)單列舉一個(gè):

乍看上去可能一臉懵,但這些仍然是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)??梢哉f(shuō),神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)真的是多種多樣。
(5)權(quán)值是越多越好嗎?
理論上權(quán)值是越多越好,因?yàn)殡m然我們不清楚每一個(gè)權(quán)值到底有什么意義,但肯定是有意義的嘛,所以權(quán)值越多我們就認(rèn)為這個(gè)網(wǎng)絡(luò)能夠?qū)W習(xí)到更多的東西。
于是就有了一些龐然大物:

當(dāng)然,并不是說(shuō)我們只要堆參數(shù)量就可以解決一切,事實(shí)上,我們看下面這張圖:

這是某個(gè)數(shù)據(jù)集上的比賽,這四種方法都是神經(jīng)網(wǎng)絡(luò),我們看到有四十萬(wàn)個(gè)參數(shù)的TGN-no-mem方法就沒(méi)有打過(guò)不到五千個(gè)參數(shù)的SAGE方法,即使是比賽中取得最好效果的GEARSage*方法,也不過(guò)五萬(wàn)個(gè)參數(shù)。
這就說(shuō)明網(wǎng)絡(luò)結(jié)構(gòu)才是重中之重,選擇適合問(wèn)題的網(wǎng)絡(luò)結(jié)構(gòu)才能取得更好的效果。
(6)我經(jīng)常聽(tīng)到監(jiān)督學(xué)習(xí),這是什么呀?
最傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)修改參數(shù)的方法所使用的的方法是監(jiān)督學(xué)習(xí),監(jiān)督學(xué)習(xí)是說(shuō),我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)所用到的數(shù)據(jù)是有標(biāo)簽的?;蛘哒f(shuō),我們的訓(xùn)練樣本有:
小紅身高150cm、每天吃5kg飯、年齡12歲,胖(胖或不胖這個(gè)屬性就是標(biāo)簽)
小李身高177cm、每天吃2kg飯、年齡20歲,不胖
......
或者說(shuō),我們輸入“150、5、12”得到結(jié)果后就可以立刻知道我們的預(yù)測(cè)是否正確,根據(jù)正確與否我們就可以想辦法去調(diào)整各個(gè)權(quán)值(當(dāng)然,實(shí)質(zhì)上比這個(gè)要復(fù)雜多了)。
(7)這些權(quán)值怎樣訓(xùn)練???
一般我們都是先分訓(xùn)練集和測(cè)試集(有的時(shí)候還有驗(yàn)證集等)。訓(xùn)練集就像(5)中的數(shù)據(jù)那樣,我們讓這些數(shù)據(jù)正向走一遍神經(jīng)網(wǎng)絡(luò)(從輸入層到輸出層)得到預(yù)測(cè)輸出,和訓(xùn)練集的真正輸出進(jìn)行比較,然后反向(從輸出層到輸入層)去修改權(quán)值。
具體的算法這里不展開(kāi)講。但要清楚,反向傳播修改權(quán)值是神經(jīng)網(wǎng)絡(luò)編程中最難的內(nèi)容(MLP還好說(shuō),其他網(wǎng)絡(luò)就復(fù)雜了)。當(dāng)然,現(xiàn)在有很多公開(kāi)框架,例如torch.nn。通過(guò)torch.nn你只需要寫正向傳播,反向傳播由框架幫你完成。
(8)我聽(tīng)說(shuō)神經(jīng)網(wǎng)絡(luò)有過(guò)擬合、梯度爆炸、梯度消失等問(wèn)題,這些是什么???
我們希望我們的模神經(jīng)網(wǎng)絡(luò)通過(guò)訓(xùn)練集(訓(xùn)練集一般都比較大,但仍然只是總體的一些樣本)學(xué)到總體的一些共性,但是神經(jīng)網(wǎng)絡(luò)如果過(guò)度關(guān)注訓(xùn)練集的個(gè)性就會(huì)出現(xiàn)問(wèn)題,就會(huì)導(dǎo)致神經(jīng)網(wǎng)絡(luò)只在訓(xùn)練集上表現(xiàn)好,但測(cè)試集上表現(xiàn)很差。
如下圖所示:

我們一般認(rèn)為過(guò)擬合的出現(xiàn)是因?yàn)?strong>模型太復(fù)雜了,在神經(jīng)網(wǎng)絡(luò)領(lǐng)域中常用的解決過(guò)擬合的方法(即降低模型復(fù)雜度)是dropout,簡(jiǎn)單來(lái)說(shuō),我們可以隨機(jī)讓一些神經(jīng)元不工作。當(dāng)然,這樣的情況也只能是緩解過(guò)擬合,并不能從根本上解決這個(gè)問(wèn)題。
梯度消失和梯度爆炸是調(diào)整參數(shù)過(guò)程中會(huì)出現(xiàn)的問(wèn)題。我們修改參數(shù)是反向傳播,是從輸出層到輸入層的,修改的依據(jù)主要和激活函數(shù)的導(dǎo)數(shù)有關(guān),導(dǎo)數(shù)和梯度有關(guān),梯度和對(duì)權(quán)值的修改程度有關(guān)。如果導(dǎo)數(shù)小于1的話,那么向前傳播的過(guò)程中,梯度就會(huì)越來(lái)越小,這樣前面的權(quán)值就得不到有效的修改;如果導(dǎo)數(shù)大于1的話,那么向前傳播的過(guò)程中,梯度就會(huì)越來(lái)越大,這樣前面的權(quán)值就會(huì)被過(guò)度修改,甚至成為NAN。
也許大家看到解決方案了,激活函數(shù)的導(dǎo)數(shù)為1不就好了嗎?事實(shí)上也確實(shí)是這樣解決的(當(dāng)然,實(shí)質(zhì)上沒(méi)有那么簡(jiǎn)單,這里不展開(kāi)講)
?

下一篇講一下自然語(yǔ)言處理的神經(jīng)網(wǎng)絡(luò)發(fā)展,有一些很重要的東西,例如attention和BERT。
寫完覺(jué)得講的還是不夠清楚,有問(wèn)題評(píng)論區(qū)提問(wèn)吧(真的有人看嗎)