版本:0.1
現代的大部分機器學習的算法將神經元分出了清晰的層次。所謂分層,即將神經元分為幾層(也可認為是幾組)。每層內的神經元沒有聯系,相鄰的層與層之間的神經元會有兩兩的聯系,從而形成一個關系矩陣。非相鄰層的神經元之間沒有聯系。這里的相鄰指的是神經元層次之間的關系,每層神經元有一層或者前后兩層相鄰。
一般神經網絡的算法的神經元層數是有限的,一般是兩三層。在理論上,三層神經元(包括輸入、輸出和隱含層,除去輸入輸出,也可算做只有一層)就足以解決所有問題了,因為中間的隱含層能夠表達所有函數。但這只是數學上的可能性,實際中如果只用一個隱含層來實現人類智能,需要的節點數量估計近似於無窮。
增加神經網絡的層數,如同從加法到乘法、指數一樣,抽象出類似的層次,進行歸納,從而減小問題的計算復雜性。人的大腦對信息的加工其實也是分層次的。比如對語言的聽覺處理,先有有種頻率,振幅的層次,然后是頻率的變化,不同頻率的組合的層次,再往后是音節層次,隨后到了詞匯層次。最后產生到我們能感覺到的信息層次和粒度,包括誰在說話,說的什么意思,心情如何等。底層的過濾甚至會讓我們忽視對方用的是什么方言和語言。到了深度學習,神經網絡的層次才到了真正的多層結構。其實大家一直就知道多層好,但苦於不知道怎么訓練多層的模型,從而無法應用。深度學習給出了一個切實可行的多層訓練方案,所以多層模型也開始廣泛的應用了。
解決具體問題時,並不是層數越多越好,對於不同問題,需要的層數是不一樣的。為了能夠實際的解決問題,需要的也不一定是更多的層數,有時候需要某一層有更多的神經元來解決復雜的問題。比如,一萬個神經元的系統,如果效率不高,只能表達一個簡單的數學函數。提高效率后,也許能達到一個昆蟲的智商。人類如果能夠理解智能產生的結構,一定能夠創造出比自然界生成的神經網絡更高效的智能網絡。
到這里,答案似乎已經明顯了。要產生智能,神經網絡似乎必然是分層的。那么大腦中是不是也有層次呢?答案並非簡單的是或否。從比較宏觀的角度來看,大腦是分層的,比如感覺神經、小腦、大腦都是比較清晰的層次。特別是在小腦中,神經元排布非常規律。具體到大腦,也是一般說的產生智能的新腦中,也發現了宏觀上的層次,比如視覺的處理,大概有平方厘米級的分層。所以宏觀上的分層是大腦處理信息的方式。在神經網絡微觀的神經元層次,並沒有清晰的分層的效果。大腦中的神經網絡就像是一團亂麻。神經網絡就像是電路一樣,用很多電線將元件聯系起來。神經網絡走線的方式從不好的方面來說,走線是非常亂的,就像一個電路設計的初學者,實現了功能,但電路毫無規律和可讀性。從好的方面來看,神經網絡是三維的走線方式,對空間的利用率非常高。在電路設計中,即使是三維的走線方式,電路也是分層的,各層之間有連接點,這樣的電路設計才是可復制的。
所以,大腦宏觀上是有層次的,但在微觀上是沒有清晰的層次的。現代的神經網絡算法中的層次都是為了簡化模型的復雜度而存在的。但在簡化復雜度的同時,失去了靈活性。
不分層並不表示只有一層,而是構建一個自由連通的神經網絡,不用層次來約束它。這里說的自由連通,不等於全連通。全連通的意思表示所有節點之間都有兩兩間的聯系。一方面這個規模太大,近似於無窮。另一方面從信息的處理角度來說,也沒有必要全連通。現代的神經網絡算法有很多將神經元之間的連接作為稀疏矩陣來處理,也是類似的道理。不分層的系統在宏觀上仍然有可能表達出清晰的層次。在微觀上,直接連到輸入輸出上的神經元可稱為第一層,這一層的神經元有可能連接到別的神經元,也有可能連接到本層,甚至有些神經元連接到自己上。
通過分層來理解世界是一個很有效的模型。世界是由一樣的自然規律構成的,一方面很多相同的規律作用在了不同的物體上,另一方面,自然規律在不同層次上也有不同的表現。比如原子、納米、更大尺度的物理,經典力學和量子力學都說明了不同層次上的規律的不同。
那么不分層到底有什么好處呢?有時候我們的知識雖然能解決問題了,但並沒有掌握正確的層次關系,這時候就需要模糊的處理。另外,有些模式可以跨越層次共享,這樣除了可以進一步節省空間,也能進一步發現規律。另外,對於同一個輸入來說,一般不是所有的信息都能分出同樣多的層數。比如視覺中處理輪廓、顏色、對比度的模式就很難用同樣多的層數來處理。這時候,在初期分化出不同的處理模式后,它們各自的分層路徑就有區別了。
很明顯,一個不用分層的系統當然可以解決更復雜的問題,但不分層的系統還有很多問題需要研究,比如:
- 信號收斂
投入應用的神經網絡都是能解決實際問題的,好的機器學習算法應該是能有效收斂的。這里的收斂有兩方面,一方面,在可接受的訓練時間內神經網絡內的變化應該接近於穩定,另一方面,神經網絡內的值不應都成為極值(無窮大、無窮小、或者全0,全1)。對於分層的算法,在建模的過程中有可能不收斂。由於層次的限制,如果某一層在訓練中產生了振盪或者無法收斂,就說明這一層要么輸入輸出有問題,要么算法、參數有問題。換句話說,問題在這一層,別的層不需要改動。在定位了這一層之后,就可以試驗各種變化來穩定輸出。在不分層的結構中,如果產生了振盪,或者不收斂的情況,很難看出是哪里出了問題,應該如何修復。
人腦由於能量供給總量有限,很難產生大規模的振盪。人腦內進行的可以說都是化學反應,需要物質的轉化,雖然有些過程是可逆的,反應過程是需要能量的,所以如果神經元響應太頻繁,其能量消耗過多,就會減小其反應頻率。這是生物學上的特點,這對神經網絡的智能是促進還是削弱還很難知道。但從現在的神經網絡研究來看,這些特性正好能解決信號振盪的問題。
這方面的研究有一個已有的方案:在小范圍內選舉出最活躍的神經元成為激活的神經元,從而在大規模上產生簡化的特征值。這樣,一方面能防止局部影響全局,另一方面,每次激活的神經元總數有限,就不容易產生振盪。
另外,還有兩個方向,一種是確定總的能激活的神經元數量,比如10%。上面的小范圍內選出活躍神經元是限制激活總數的一種方法。這個方案的挑戰是如何確定這10%是有效的。另一種,每個神經元抑制自己的振盪,輸出的不只是當前整合的結果還和歷史輸出值有關系。比如神經元可控制自己一定時間內的響應次數,如果一定時間內響應次數太多,則調整輸出的閾值,以減少單位時間內響應次數。
- 訓練方法
和信號收斂是類似的。在分層的系統中,要么是BP的誤差往回一層層傳播,要么是深度學習,一層一層的疊加訓練。這兩個方法看起來很不一樣,都能有效的解決如何調整神經網絡權重的問題。這兩個方法的相同之處是其訓練、調整是個往復交替過程,每個訓練、調整的過程是相對獨立的。雖然前面的訓練結果產生的調整會影響后面的訓練,但每次調整都一次到位。
在不分層的系統中,訓練和調整可以是往復交替的,也可以是混合的。假設已經有了一個能夠像人腦一樣完全並行的系統。在第一個信號輸入之后,會到達和其直接相連的一組神經元,這時候是第一級神經元。等第一級神經元完成計算后,有些信號會傳播到下一級神經元,有些會還在第一級傳播,還有些甚至會傳播回自己。到第二個信號輸入之后,有些第一個信號的信息還存在於第一級神經元中,這些第一級神經元會直接完成前后兩個信號的整合。這一點對於時域的信號整合是非常有意義的。(關於時域上信號的整合,會有專門的討論。)
最后討論的問題是神經網絡是如何生成的。在現代的神經網絡算法中,網絡都是開始估計一個初值,在不斷地試驗中,確定一個比較合適的規模。而生物的生長是從一個細胞開始分化的。人腦也並不是一下子產生了一個巨大的網絡,在這個過程中,神經細胞應該也是很早就開始了不停的活動,DNA和人的生長過程共同決定了人腦的結構,而不僅僅是DNA。比如,小腦的形成可能是因為其處於身體和大腦之間,由於生長過程中感覺和運動神經末梢不停的刺激,才形成了其獨特的結構。在大腦中,由於子宮環境比較簡單,大腦能得到的信息單一,但也建立了基本輸入輸出的反射。所以,初生嬰兒就能對聲音和顏色有反應。隨着出生后輸入信息量的增多,嬰兒開始一層層的構建模式,最后一步步產生了智能。由此,神經網絡的層次及模式不是一開始就確定的,是根據輸入、輸出的信息來決定的。是一個一邊訓練,一邊調整網絡結構、層次的過程。當前設計的系統都是有目的性的,所以能夠根據全局的目標函數來調整和訓練模型。人類的智能的目的雖然還沒有共識,但可以先認為人類智能是沒有目的的。人類智能的產生是一個自適應的過程,而不是由全局的目標函數來訓練的。僅依靠全局的信息,無法指導微觀上每個部分的分化,網絡的神經元分化和連接的調整都應該主要依賴於其局部信息。
