寫在前面:
這是一篇CNN(卷積神經(jīng)網(wǎng)絡(luò))的學(xué)習(xí)筆記,不同之處在于隨處可見的數(shù)學(xué)公式不見了,真的!它的目的不在于把CNN講清楚,講清楚CNN不是一篇文章能做到的,更不是碎片時間瀏覽下就能做到的。目的在于提供一個勾子,一個抹去細(xì)節(jié)留下方法論的勾子,一個能和現(xiàn)有知識框架搭上的勾子。有了這個勾子,粗,可以窺探時髦的“深度學(xué)習(xí)”,細(xì),可以為深挖細(xì)節(jié)做鋪墊。
第一式里,卷積核可以理解為濾鏡,濾掉無用信息,留下有效特征。但是,構(gòu)造卷積核卻不是一件容易的事。
“這有何難,打開Photoshop,選擇‘濾鏡-其它-自定義’。”
亂涂亂畫,當(dāng)然不難,做個實用的濾鏡看看,做一個不難,做一百個一千個不同類型的濾鏡呢?
臟活累活,又極其消耗腦細(xì)胞,祖師爺怎么甘心自己動手,于是,毅然踏上了另外一條……更加消耗腦細(xì)胞的路,尋找批量新建“濾鏡”的方法,便悟出吸星大法般的bug功夫——神經(jīng)網(wǎng)絡(luò)。奏是這么牛!
牛在結(jié)果,更牛在背后的想法。一般我們都把機器當(dāng)成提升效率的方式,人工走通流程,然后交給機器大規(guī)模地運行這個流程,機器運行的每一步人都了如執(zhí)掌。而這次不同,老師教會了學(xué)生做一件自己都沒弄明白的事,學(xué)生不僅做到了,而且做得很高效。所以,直播人狗大戰(zhàn)時,會聽到解說員說:
太聰明了!人是絕對想不到這步的。對,人想不到!!即使想到,需要的時間也遠(yuǎn)遠(yuǎn)超過阿法狗。
“吹吧就,BB了這么多,神經(jīng)網(wǎng)絡(luò)到底長什么樣?”
雖然不是長這樣,但它真的是在生物神經(jīng)元的啟發(fā)下提出的,所以才叫人工神經(jīng)網(wǎng)絡(luò)。
我們試著以識別人臉為例,說明人工神經(jīng)網(wǎng)絡(luò)的工作機制。拿出張三、李四、王五三人的頭像各若干張,讓機器去學(xué)習(xí),然后再取幾張沒見過的照片,讓機器判斷是誰。
假定每張照片的大小都是100*100像素,把照片直接輸入到系統(tǒng),一個像素都不能少,讓神經(jīng)網(wǎng)絡(luò)自己抽取特征。這樣便有了10k個輸入點,分別代表照片上的各個像素,3個輸出點,分別代表屬于各個人的可能性。
維基百科上解釋說,當(dāng)神經(jīng)元接收到相連神經(jīng)元的電信號時,會變得興奮。神經(jīng)元之間的連接強度不同,一些足以激活其它神經(jīng)元,而另一些則會抑制激活。大腦中數(shù)千億神經(jīng)元及其連接一起構(gòu)成了人類智能。
相應(yīng)地,各個像素對于判斷人臉的重要性不盡相同,輸入層各節(jié)點的取值也各不相同,范圍在0到1之間,這體現(xiàn)了神經(jīng)元之間連接的強度。此外,在輸入、輸出中間有個隱含層,這是體現(xiàn)神經(jīng)元互連的層級,也是見證神奇的地方。任意輸入節(jié)點i和任意隱含節(jié)點j建立連接,連接的系數(shù)為Wij,任意隱含節(jié)點j和任意輸出節(jié)點k也建立連接,連接的系數(shù)為Wjk。
“長得可真不咋滴,又是如何工作的呢?”
很簡單,不停地調(diào)整連接系數(shù),讓結(jié)果盡量逼近正確答案,這叫訓(xùn)練。
過程是這樣的,把輸入層設(shè)置為照片的像素,然后以Wij的連接系數(shù)傳導(dǎo)到隱含層,再以Wjk的連接系數(shù)匯總到輸出層,輸出層中值最大的節(jié)點即為這個網(wǎng)絡(luò)判斷的結(jié)果。一開始的時候,網(wǎng)絡(luò)的連接系數(shù)是人工設(shè)置的,輸出的結(jié)果肯定不盡如人意,很可能出現(xiàn),明明給的是張三的照片,在輸出層中卻是李四對應(yīng)的節(jié)點得分最高。
訓(xùn)練有一個目標(biāo)函數(shù),可以看成是由所有待求系數(shù)Wij為自變量的復(fù)合函數(shù),這個目標(biāo)函數(shù)定義了什么樣的系數(shù)才算一組“好系數(shù)”。
“相鄰層的任意節(jié)點之間都有系數(shù),這么多系數(shù),牽一發(fā)而動全身,如何調(diào)整才能獲得‘好系數(shù)’?”
是時候讓反向傳播出場了。
為了講反向傳播,先繞道說一說負(fù)反饋的概念。負(fù)反饋,是系統(tǒng)在條件發(fā)生變化時作出抵抗該變化的行為。作為自控理論的核心概念,負(fù)反饋隨處可見。此刻刷著微信的你,一定也吹著空調(diào),空調(diào)就是個很好的例子,不停檢測實際溫度和目標(biāo)溫度的差異,高了就降一降,低了就升一升。
反向傳播在想法上與負(fù)反饋類似,但具體算法不同,復(fù)雜度也不同。輸出節(jié)點給出的計算值和期望值對比,得出錯誤,把這個錯誤,沿網(wǎng)絡(luò)的相反方向傳播,進(jìn)而校正各個節(jié)點的系數(shù),使得全局錯誤最低。
“這個描述也太模糊了,能否再細(xì)化下?”
逼我寫公式,就不!反向傳播算法的核心是,“梯度下降”和“鏈?zhǔn)椒▌t求偏導(dǎo)”,要通俗地講可不簡單,先挖個坑,哪天悟出了群眾喜聞樂見的解釋方法,再填上不遲。
總之,如此這般,冬練三九,夏練三伏,錯誤降為零時,則神功初成。
“聽說,有人反復(fù)練習(xí)了幾百萬次,錯誤依然無法降到零……”
這倒有可能,不僅可能,而且是很可能,錯誤收斂到一個很小的值,也算成功。練得差不多,便可以牛刀小試一番了,拿一張沒見過的照片,看它能否辨認(rèn)出。
“且慢,是不是少了點什么,前面說了神經(jīng)網(wǎng)絡(luò)能自動生成卷積核,體現(xiàn)在哪里?”
嘿嘿,隱層那些訓(xùn)練得到的系數(shù),就構(gòu)成了這個層級定義的過濾函數(shù),也就是卷積核。實際的卷積神經(jīng)網(wǎng)絡(luò)有很多個隱層!圖片經(jīng)過一個隱層上的若干過濾器后,就得到了對應(yīng)數(shù)量的特征圖譜(feature map),圖譜自身其實也是圖片,代表了原始圖片的某些特征,如輪廓、顏色、亮度,質(zhì)地等。通常,卷積神經(jīng)網(wǎng)絡(luò)的隱層越深,包含的特征圖譜就越多,表達(dá)能力也就越強。
“原來如此,難怪叫深度學(xué)習(xí)。”
沒錯。高深莫測,以至于數(shù)十載內(nèi),少有人能將其運用自如。
一來對計算能力的要求極高,不是一般的硬件能駕馭,特別是訓(xùn)練一個大型的、高容量的神經(jīng)網(wǎng)絡(luò),CPU也無能為力。近年GPU大行其道后,深度學(xué)習(xí)才得以流行開來,執(zhí)其牛耳者,如谷歌,更是在打造機器學(xué)習(xí)專用的TPU。
二來可解釋性不強,像個“黑箱子”一樣不知為什么能取得好的效果,不知其所以然,就很難針對性地改進(jìn),更別提再上一層樓了。
“哦。阿法狗逼格太高,我還是繼續(xù)當(dāng)程序猿吧……”
不,你應(yīng)該復(fù)習(xí)下第一式。