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