熱的東西顯然會變涼。房間會會人沮喪地變得凌亂。幾乎一樣,消息會失真。逆轉這些狀況的短時間策略分別是從新加熱、 作衛生和使用 Hopfield 網絡。本文向您介紹了三者中的最後一個,它是一個只須要特定的參數就能夠消除噪聲的算法。net.py 是一個特別簡單的 Python 實現,將向您展現它的基本部分如何結合到一塊兒,以及爲什麼 Hopfield 網絡有時能夠自失真的圖案中 從新獲得原圖案。儘管這個實現有侷限性,不過仍然可讓您得到關於 Hopfield 網絡的不少有益且有啓發做用的經驗。app
您尋求的是什麼?
我假定您是由於遇到了一些計算上的問題而來閱讀本文。有人向您建議,一些神經網絡算法可能會提供解決方案。具體說, 建議是說您可使用一個 Hopfield 網絡。我進一步假設您須要有一個大體的想法,以使得您能夠決定那個建議是否切實 可行並且確保深刻的研究。下面這個 Hopfield 網絡的很是縮略的應用可能會引導您着手解決問題。異步
首先,您的問題有一組基本的用 -1 和 +1 編碼的圖案。若是須要,它們能夠用 0 和 +1 編碼。這些圖案能夠是郵票的規格化的 二進制圖案(參閱 參考資料)。下一個要素是偏離這一基礎的一組圖案。您尋求的是建立代碼,以 使得能夠輸入不正常的圖案而輸出應得的一個基本圖案。於是您尋求的將是一個算法,能夠輸入一個對特定郵票的編碼描述,而後 輸出應得的一個基本郵票圖案。您搜索不肯定會成功。有能夠接受的對您的計劃產生負面影響的失敗率。對您來講,會有一個不 會顯著地影響您的項目的郵票誤識別的比率。
若是這使您想起了您的問題,下面可能會是您的解決方案設計的開始。在結束以前,您最好應該能回答出基本的問題。 這個 Hopfield 是什麼?它如何工做?它的侷限性是什麼?它能夠爲我作什麼?我但願用更多的時間來研究它嗎?
圖案及其失真
讓咱們首先來看將會失真而隨後被從新得到的五個任意圖案。它們能夠可視化地表示爲 10 乘 10 的黑白方塊矩陣。圖 1 展現了第一個圖案,p1。
圖 1. p1 的可視化表示
點擊 net.py 中 p2到 p5 的任意一個,能夠顯示其餘的圖案。爲了編碼,這五個圖案被初始描述爲 Python 列表。 這樣,舉例來講,第一個圖案的描述見清單 1。
清單 1. 圖案 p1
p1 = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1] ]
黑色和白色的方塊分別對應於 -1 和 +1。這個列表隨後被轉化爲一個數組。(請參閱 參考資料 ,得到 我使用的 Python 庫的參考。)對應於這類圖案中的每個元素,-1 或者 +1,在節點數組中都有一個節點對象。
一個節點對象有三個主要屬性:
- 一個節點對象有一個值,它是圖案中的一個元素。
- 一個節點還有一個地址,也就是在數組中它的地址。
- 每一個節點還有一個顏色,以使得它能夠顯示出來。
如前所述,Hopfield 的一個功能是消除噪聲。爲實現這一功能,須要有一種方法來給圖案引入噪聲。點擊 Add Noise 剛好 能夠完成此任務。向 p1 添加噪聲生成了圖 2。
圖 2. 失真的 p1
爲了給一個圖案引入噪聲,Hopfield 要訪問節點數組中的每個地址。而後它會在 [0,1) 中取一個隨機數,也就是 0 到 1 之間 包括 0 但不包括 1。若是數字小於某個固定的標準,網絡就會改變節點的值和顏色,不然就會保持不變。默認狀況下,這個標準設置 爲 0.20,這樣任意給定的節點就有百分之二十的可能會改變其值和顏色。您能夠用調節滑塊來改變這個機率。調爲 0% 時,不會有噪聲, 調爲 100% 時,節點數組會簡單地反轉。取這區間的值,會出現全部其餘一般的可能。每一個值都會給一個圖案引入特定程度的噪聲。因爲 Hopfield 網絡是一個消除噪聲的算法,它能夠輸入一個如圖 2 所示的失真的圖案,而後輸出圖 1 中的原始圖案。
儘管有時會因不合適的解釋而變得晦澀,相關的算法實現起來仍是至關簡單的。接下來,我將向您完整地介紹算法的一個實現, 而後我將簡短解釋爲何這些算法能夠消除噪聲。
權重
如 David Mertz 和我在之前的一篇 developerWorks 文章 An introduction to neural nets 中所述, 人類的大腦由大約 1 千億個神經元構成,平均每一個神經元要鏈接到幾千個其餘神經元。神經元既接收也發送不一樣的能量。 神經元的一個重要特性是,它們接收到能量後不會立刻反應。而是,它們積累所接收到的能量,只有當積累的能量達到必定臨界 極限時,它們纔會向其餘神經元發送本身的能量。
當大腦在學習時,能夠認爲它是在調整這些鏈接的數目和強度。毫無疑問,這是一個極其簡化的生物學事實。 在這個例子中,對於實現控制神經網絡而言,簡化能夠是實用的,尤爲是當它們被做爲模型來使用時。從生物學到算法的轉換是經過 將鏈接轉化爲權重來實現的。(感知器以一種不一樣的並且可能更爲直觀的方式來使用權重。閱讀這裏以前,您可能會但願再讀一遍 An introduction to neural nets。)
權重對象主要封裝一個表示一個節點與另外一個節點之間的權重的數值。權重對象還有一個地址和一個顏色。地址是它在權重數組中的位置。 顏色用於顯示。圖 3 是權重數組的一種可能的表示。Net.py(請參閱 參考資料 中的連接)保持了對最低和最高 權重的追蹤,它將權重顯示中顯示顏色數值的一個鍵。
圖 3. 權重數組的一種可視化表示
在權重數組的每一行上,是一個給定節點與全部其餘節點間權重的一個列表。Hopfield 網絡有兩種形式。一種形式的節點有一個到 自身的權重,另外一種形式則沒有。經過 net.py 得到的經驗代表,當節點不是自權重(self-weighted)時,節點數組不會老是重構到自身。 選擇 No Self Weight 選項,而後嘗試重構 p3 或 p5。有一百個節點,因此有一萬個一般冗餘的權重。默認狀況下,當節點是 自權重時,就會有 5050 個非冗餘權重,不然就只有 4950 個。
圖 4. 權重的起源
清單 2. 權重生成算法
PAT = { x: x is a RxC pattern } WA = { x: x is a (R*C)x(R*C) weight array } For all (i,j) and (a,b) in the range of R and C: SUM = 0 for p in PAT: SUM += p(i,j) * p(a,b) WA( (R*i)+j, (C*a)+b ) = SUM
受生物學啓發的概念是 1949 年 Donald Hebb 研究所得的 Hopfield 網絡的基礎。他假定若是一對節點同時向對方發送它們的能量, 那麼它們之間的權重就要大於只有一個發送本身的能量的狀況。他寫道:「當細胞 A 的一個軸突距離 B 足夠近以致於能刺激它,並且 能反覆持久地參與對它的激發時,一個或者所有兩個細胞中就會發生一些成長過程或新陳代謝的變化,這樣,做爲激發 B 的一個細胞, A 的功效就會增加」(參閱 參考資料 以得到詳細資料)。就 Hopfield 網絡來講,當一對節點有相同的 值時,換句話說是 -1 或 +1,它們之間的權重就更大。全部可能的節點對的值的乘積的和決定的權重數組的內容。當兩個值相同時,它們 的乘積就是正的,和就會增長。在不一樣的值的狀況下,這個和就會減少。
更詳細地講,權重是哪裏來的?首先,Hopfield 網絡必須能夠訪問一個庫或者一組基本圖案。在這裏即 p1 到 p5。權重的生成首先由 Hopfield 網絡在基本圖案矩陣的界限內選擇一對座標。而後它訪問每一個圖案中的對應節點。在每一步,它將節點值的乘積添加到一個 正在使用的和。(見圖 4)。當網絡訪問過每個圖案後,它將一個權重對象的值設置爲這個和。給出一對位於(i,j)和(a,b)的 節點,它會設置在權重數組中位於(i*10+j,a*10+b)的權重對象的值。
這就是權重如何構造的過程,不過,它如何做用於更大的 Hopfield 算法?它如何做用於圖案的重構?
重構
若是在手邊有一個權重數組和一個失真的或有噪聲的圖案,Hopfield 網絡有時能夠輸出原始圖案。沒有保證,可是 網絡正確次數的百分比高得驚人。它既能夠同步完成,也能夠異步完成。
若是是異步完成,網絡會遍歷失真的圖案,在每個節點 N,它會詢問 N 的值應該設置爲 -1 仍是 +1。
要肯定這一設置,網絡會去遍歷權重數組中包含 N 與其餘節點間全部權重的的行。不要忘記,節點多是也可能不是自權重的。
在第二次遍歷的每一步,它會計算出(1)N 與另外一個節點之間的權重與(2)另外一個節點的值的乘積。正如您所預料的,網絡會 保持這些乘積的一個使用中的計數器。
如今,網絡就能夠作出斷定。至少在當前的實現中,若是這個和小於 0,網絡就將節點設置爲 -1,若是它大於或等於 0,則網絡將 節點的值設置爲 +1。
圖 5. 重構:不遺留任何節點
清單 3. 重構
For every node, N, in pattern P. SUM = 0 For every node, A, in P: W = weight between N and A V = value of A SUM += W * V if SUM < 0: set N's value to -1 else: set N's value to +1
默認的更新是異步的,由於網絡只是在肯定的這個值應該是什麼以後纔去設置一個節點的值。若是網絡在作出了全部斷定 後再去設置節點的值,那麼它就能夠是同步的。在這種狀況下,它將存儲它的斷定,而後在最後一個斷定作出後更新數組的節點。 在 net.py(參見 參考資料)中,重構默認狀況下異步進行的,不過要注意 同步重構 的選項。
當您體驗 net.py,當重構成功時,Hopfield 網絡的行爲使人震驚。這種行爲之一是,甚至當權重數組嚴重退化時,它仍能夠 重構圖案。個人簡單實現的退化權重(Degrade Weights)會遍歷權重數組並隨機地將權重設置爲 0。對權重數級的顯示給出了 破壞程度的一個視圖。在這裏,正確的重構說明 Hopfield 網絡的容錯性遠超過大腦。它是如何工做的?數學的描述不會短。取而 代之的,這裏給出了一個結構簡介。
發生了什麼
Hopfield 網絡的算法細節說明了爲何它有時能夠消除噪聲。和一般算法分析同樣,最麻煩的部分是數學細節。在當前的例子中,這些 是難以描繪和想像的。幸運的是,有一些密切相關的現象,可使 Hopfield 網絡的工做原理清楚明白地顯示出來。
當一個彈球掉入一個簡單曲面構成的碗中時,它會滾到最低點。碗的曲率就像是一個規則,輸入彈球的入口點,而後返回最低點, 即碗底。更爲複雜的曲率將相似於一個函數,它輸入一個入口點並返回幾個局部最低點中的其中之一。
能量是這些簡單現象的一個基本部分。無論是在簡單的仍是在複雜的例子中,進入的彈球都具備必定度量的能量。隨時間的過去, 這個能量會減小。它最終會達到一個穩定狀態,不能再變小。在複雜的例子中,可能會有一個更低的能量級別,可是彈球沒法達到。
相似地,無論有沒有失真,一個圖案均可以被認爲具備特定度量的能量。因此,圖案 p1 到 p5 有能量級別。
圖案的能量級別的計算並不複雜。Hopfield 網絡計算每個可能的節點對的值與它們之間權重的乘積。圖案的 能量級別是用負 2 去除這些乘積的和所得的結果。 Net.py 顯示了任意給定圖案或節點 數組的能量級別。當您重構圖案時,我認爲並但願您將可以看到圖案能量級別的降低。
在重構中,網絡基於其餘節點的值及它們之間的權重的乘積的和作出翻轉一個節點的斷定。當和小於 0 時,節點設置爲 -1,不然設置爲 +1。當值與權重的乘積是正的時,它有助於促使和大於 0。不過這樣會將網絡推向將節點值設置爲 +1 的趨勢。當乘積是負的時,和被推動到或者小於 0。因而,網絡被推向到將節點的設置爲 -1 的趨勢。權重的變化 會引發度量的變化以及網絡進行斷定過程當中被推向的趨勢的變化。圖案可能會失真很嚴重,致使網絡不會被推向到作出 正確斷定的趨勢。若是表述沒有問題,網絡在絕大部分時候會被推向正確的趨勢。
若是您重構那五個圖案中的任意一個,您將發現每一個圖案會重構到自身。它應該是這樣,由於每一個圖案已經佔據了一個 局部最低能量的點。沒有重構過程能夠再下降圖案的能量級別。若是您成功地重構了一個失真的圖案,Hopfield 就已經將 圖案的能量級別降到了某個圖案的級別。當失敗時,它是已經將失真圖案的能量級別降到了一個假的局部低點。在兩種狀況下, 能量級別都不能再有任何下降。換句話說,它已經達到了一種穩定狀態。以能量的方式來描述 Hopfield 網絡有着有趣並且 重要的意義。在此基礎之上,它能夠以數學的方式創建起來,以使得重複應用重構算法能夠最終獲得一個穩定的圖案。(參閱 參考資料以得到詳細資料。)
結束語
您應該意識到 Hopfield 網絡的侷限性。一個常常被說起的明顯侷限是,它的圖案必須能夠被編碼爲一個數組,這個數組或者由 -1 和 +1 構成,或者由 0 和 +1 構成。您已經知道,Hopfield 可能會穩定於一個假的局部低點。這個更爲明顯的侷限在於,當圖案 的數目超過節點數組中的節點數目的大約 14% 時,網絡穩定於某個假的局部低點的機率會增長。也就是說,每增長一個基本圖案, 就必須多大約 7 個節點。儘管有這樣的侷限性,可是,這裏所討論的圖案重構仍是有可能成爲解決您特定計算問題的直觀嚮導。 如今您已經大概瞭解了最初說起的 Hopfield 算法。若是它能知足您的須要,如今您已經明白了構建您本身的實現的上部構造。 這包括計算權重數組的算法、重構失真圖案的方式以及計算圖案的能量級別的算法。
參考資料
- 您能夠參閱本文在 developerWorks 全球站點上的 英文原文.
- 從 SourceForge 下載 Net.py 源代碼。
- Andrew 使用 Tkinter 和 Numeric庫在 Python 中 實現了 Hopfield 網絡。使用 Python 不須要關注晦澀複雜的語法,從而讓您能夠集中精力於算法。
- Andrew Blais 和 David Mertz 撰寫了 神經網絡介紹 (developerWorks,2001 年 7 月),這是一篇關注感知器的介紹性文章。 David W. Clark 的同名文章 中引用了一個對比神經網絡與數字計算機的表格。 另外參閱 the Wikipedia Neural network article。
- 參考 Attrasoft 以瞭解 郵票分類 和 郵票識別。 要了解 指紋識別, 請參閱 Nick D'Arcy 的設計研究。要使用 artificial intelligence in business(PDF 格式),請參閱 Tomas Nordlander 的研究。
- Wolfram Research 的 Neural Networks Documentation 給出了關於 Hopfield 和 Hopfield 網絡的背景。點擊直到文檔末尾的 Section 9.2 (而後點擊 Next 按鈕),您將被引導到一個使用 Hopfield 網絡進行字符從新識別的有趣討論。 或者只是參閱 An Idiot's Guide to Neural Networks 中的 the Hopfield Net entry。.
- 以受生物學啓發的概念爲基礎的 Hopfield 網絡由 Donald Hebb 於 1949 年研究得出。另外參閱 The Hebb Legacy ( Canadian Journal of Experimental Psychology)。對 Donald Hebb 的The Organization of Behavior (Wiley,1949)的研究將使所需的繁重勞動獲得回報。
- 您能夠在線閱讀 JJ Hopfield 1982 年的 文章 Neural networks and physical systems with emergent collective computational abilities( Proceedings of the National Academy of Sciences of the United States of America,1982),PDF 格式。 您還能夠參閱 what interests Professor Hopfield today。
- 經過這些參考資料開始進入 Hopfield 網絡的數學之旅:
- Kevin Gurney 的極好的 An Introduction to Neural Networks(Routledge,1997)一文關注的是支撐數學的直覺知識的構建。參閱第 7 章中關於重構算法的反覆應用最終會獲得 一個穩定圖案的證實的討論。另外參閱 Neural Nets以得到一個早期的在線版本。
- R. Beal 和 T. Jackson 的 Neural Computing: An Introduction (Hilger,1990)也很是有助於讓您理解神經網絡中發生了什麼事情。特別參閱第 6 章。
- StatSoft 有一本 在線統計學教科書, 其中包括一個 關於神經網絡的部分。
- 要得到大致上關於神經網絡的範圍普遍的連接收集,請參閱 The Backpropagator's Review。
- 若是一個主題沒有 FAQ 會怎樣?參閱很是實用的 Neural Net FAQ。
- David J.C. MacKay 的 Information Theory, Inference, and Learning Algorithms(2003),有教育意義,會增加知識, 能夠在線以 PDF 格式得到。
- 參閱 Ute Matecki 和 Silke Seehusen 的 use of Hopfield nets to process greyscale images。
- 在 developerWorks Linux 專區 能夠找到 更多爲 Linux™ 開發者準備的參考資料。
- 在 Developer Bookstore Linux 區中定購 打折出售的 Linux 書籍。
- 自 developerWorks 的 Speed-start your Linux app 專區下載能夠運行於 Linux 之上的通過挑選的 developerWorks Subscription 產品免費測試版本,包括 WebSphere® Studio Site Developer、WebSphere SDK for Web services、WebSphere Application Server、DB2® Universal Database Personal Developers Edition、Tivoli® Access Manager 和 Lotus® Domino Server。要更快速地開始上手,請參閱針對各個產品的 how-to 文章和技術支持。