一種識別性神經(jīng)網(wǎng)絡(luò)的設(shè)計思路
當我們要設(shè)計一個用于識別不同事物的神經(jīng)網(wǎng)絡(luò)時,首先我們要明確的兩個問題是,這個神經(jīng)網(wǎng)絡(luò)在識別過程中具有什么樣的作用,以及它應(yīng)當具備什么樣的結(jié)構(gòu)。雖然我們都明白它的作用是識別,但是在具體的場景中,它在識別過程中需要完成的事情確實有所區(qū)別的。
不過整體而言,我們要構(gòu)建的是至少應(yīng)當是這樣一個的系統(tǒng):它已經(jīng)得知了某些事物的存在,并且知道了這些事物各自的特征,而當我們向它輸入一些關(guān)于某個事物的特征的信息時,它應(yīng)當在它所知道的信息范圍內(nèi)匹配出一個最佳結(jié)果,識別出是哪一個具體的事物。如果我們成功構(gòu)造出了這樣的一個系統(tǒng),那么放在人臉識別的具體場景中,就是它已經(jīng)認識了一些人的臉,得知了這些人的臉各自有哪些特征,并且當我們輸入一張人臉的照片時,它可以通過圖像來完成在認識的人臉之集合中的匹配,從而告訴我們此為何人,或者,告訴我們這張照片不是已知的任何一個人的臉。
之后,我們便以人臉識別為例,探討一種識別性的神經(jīng)網(wǎng)絡(luò)的設(shè)計思路,其它場景下則與之類似。
現(xiàn)在擺在我們面前的有這樣的三個問題:①我們要讓機器去認識人臉,但是機器是怎么認識這些人的臉的呢?②我們知道不同的臉有不同的特征,但是我們怎么知道要比較的是哪些特征呢?③就算我們知道了要比較的是哪些特征,我們又如何量化這些特征,如何知道一個人的臉在這些特征的種類上的取值是多少呢?
這些,實際上就是一個高維向量空間中的比較問題。不同的特征的種類,例如瞳孔間距、鼻梁高度、嘴唇高度與寬度之比等,這些特征完全可以看作一個個特征的維度,是一個高維的向量空間中的維度。而每某個人在某個特征維度上的情況,就是在該維度下的坐標取值,一張人臉的照片,經(jīng)過一番特征提取后就變成了在這個空間中的一個點。
所以當我們對一張以前沒見過的照片進行識別是,提取其特征得到了一個點的坐標后,只要和已知的點比較一下,選最近的那個,我們就能以此為理由說,這個人就是他。距離的計算和一般的直角坐標系一致,因為我們構(gòu)造的高維空間中每一根坐標軸上一定有一個基向量,而這些基向量一定是線性無關(guān)的。于是,距離的計算變成了同種坐標差的平方和再開方,但為了節(jié)省時間,反正距離是大于等于0的,不妨把最后一步直接省略,比較平方和的大小,挑最小的那一個。
現(xiàn)在,我們來看上面三個問題怎么解答。
第一個問題,機器是怎么認識人的臉的?我們只需要提前對要識別的人拍照,經(jīng)過預(yù)處理之后輸入到這個神經(jīng)網(wǎng)絡(luò)內(nèi),這個神經(jīng)網(wǎng)絡(luò)再一張張地提取其中的特征便是。而這些照片合照片中人的名字,就是我們訓練它用到的數(shù)據(jù)集。
我們知道平時的照片都是點陣的照片,畢竟以人臉識別為例的話,我們對人臉進行拍照,一般來說拍出來的照片都是純粹的點陣圖,或者壓縮過的點陣圖,而不是矢量圖。而像素的組成其實就是顏色空間的坐標組成。如果是彩色的RGB圖像,那么一方面這張照片本質(zhì)是個像素的矩陣,另一方面這個像素的矩陣本質(zhì)上是三個像素值的矩陣之和,而且還是三個同類型的矩陣。只不過加起來時不是簡單的代數(shù)相加,而是三個相互正交的分量上的相加。
為了簡化計算和避免干擾,有時候我們也可以把這些照片變成灰度圖像,那么它本質(zhì)上就是一個像素值的矩陣了,像素值即灰度。
我們拍到的照片很多時候是不能直接輸入到神經(jīng)網(wǎng)絡(luò)內(nèi)部的,因為照片不符合神經(jīng)網(wǎng)絡(luò)的要求,這就需要一些預(yù)處理。比如,我們的神經(jīng)網(wǎng)絡(luò)整體上保持著一個結(jié)構(gòu),它的結(jié)構(gòu)決定了絕大多數(shù)情況下我們得把圖片的尺寸調(diào)整到某一固定大小。這就是仿射變換。此外還可能有腐蝕和膨脹、降噪、像素值歸一化等操作,為接下來的訓練和識別做準備。
第二個問題,機器是怎么知道要比較的是哪些種類的特征的?換句話說,在線性代數(shù)上這個問題就是:我們需要構(gòu)造一個什么樣的高維空間
這個問題分為兩部分:維度有多高我們怎么知道?坐標軸具體是哪幾根?第一個子問題的答案決定了特征的種類數(shù)目,第二個子問題決定了其中的基向量是哪幾個。不同的人臉對應(yīng)于不同的坐標的點,我們也清楚這其中每一個坐標都對應(yīng)于一個從原點出發(fā)的向量。但是我們采用的坐標系一定是單位直角坐標系I嗎?設(shè)這個空間是n維的,我們采用的基向量一定是最基本的(1,0,0,……0,0), (0,1,0,……0,0),……,(0,0,0,……0,1)嗎?絕大多數(shù)情況下不是。
我們已經(jīng)獲取了大量的預(yù)處理后的圖像,現(xiàn)在要做的就是構(gòu)造映射關(guān)系,進行從矩陣到向量的變換。此時,我們已經(jīng)構(gòu)造了從人到人臉,再到拍攝的照片,再到預(yù)處理后的圖像,再到具體的矩陣的復合映射關(guān)系,而且從人到矩陣的映射還是一個雙射?,F(xiàn)在我們要做的就是將這個復合映射延伸到向量,進一步延伸到具體的點上。
向量和點的映射是天然就有的,從原點出發(fā)就能看出這么一個雙射?,F(xiàn)在要面對的就是矩陣到向量,還能從向量到矩陣的雙射關(guān)系了。
怎么構(gòu)造呢?一種最簡單的方式是這樣的:比如一個m×n的矩陣轉(zhuǎn)化為一個mn維的列向量,就是將最左邊一列不動,第二列原模原樣寫在第一列下面,第三列原模原樣寫在第二列下面……第n列原模原樣寫在第(n-1)列下面,自上而下讀起來,就是一個mn維的列向量。如此,矩陣內(nèi)的每一個數(shù)都能保留,只要記住了m和n的取值,就能保證從矩陣到列向量之間不存在任何的信息損失。
如此,完成了從人,到人臉,再到矩陣和向量的多重映射關(guān)系。
現(xiàn)在尋找合適的基向量來畫對應(yīng)的坐標軸,以及求維度就有方法了。我們可以將數(shù)據(jù)集中的每一個矩陣全部轉(zhuǎn)化為這樣的向量,從左往右連起來就是一個矩陣。要找基向量,只需要對數(shù)據(jù)集中的向量求極大無關(guān)組,而維度便是這個矩陣的秩。
第三個問題,提取的特征然后轉(zhuǎn)化為坐標?
要算照片在高維向量空間內(nèi)的坐標,其實就是,要對照片所對應(yīng)的向量在這樣的極大無關(guān)組中,用基向量進行線性表示至于如何進行線性表示,假設(shè)我們要研究的是向量,現(xiàn)在將那些基向量從左往右連起來構(gòu)成矩陣A,設(shè)在A中向量用向量表示,那么有Ax=r,為了方便我們還可以求出A的特征值m,利用Ax=mx探討。
如果我們輸入一張新的照片,那么只需要將其轉(zhuǎn)化為對應(yīng)的矩陣和列向量,解方程便得到了坐標,這樣就完成了識別過程。
理解了這個神經(jīng)網(wǎng)絡(luò)要做什么,才能理解神經(jīng)網(wǎng)絡(luò)該具有什么樣的結(jié)構(gòu)。神經(jīng)網(wǎng)絡(luò)是由大量的神經(jīng)元構(gòu)成的。一個神經(jīng)元在本質(zhì)上就是一個乘加模塊,它可以以軟件的形式,程序中的對象存在,也可以以硬件的形式,一段乘加電路而存在。
比如現(xiàn)在我們設(shè)置這樣一種神經(jīng)元,它有d對數(shù)據(jù)輸入端,也就是2d個數(shù)據(jù)輸入端,還有一個輸出結(jié)果的數(shù)據(jù)輸出端。
然后我們設(shè)有一個行向量和一個列向量,其維度都是d的整數(shù)倍,不妨設(shè)有kd的維度?,F(xiàn)在我們向神經(jīng)元輸入一個行向量的其中d個數(shù)值,再輸入另一個列向量對應(yīng)的d個數(shù)值,神經(jīng)元會對其分別相乘再相加,只要我們準備好k個神經(jīng)元,再準備一個具有k個數(shù)據(jù)輸入和一個數(shù)據(jù)輸出端的加法模塊,就能完成內(nèi)積的計算,當然,這個還可以用于卷積的計算,也可以擴展為矩陣乘法的運算。
由于神經(jīng)網(wǎng)絡(luò)的工作中主要是各種乘加運算,或矩陣乘法,或卷積,所以大量的神經(jīng)元可以勝任這些工作。
