神經網絡入門3

引用:http://blog.csdn.net/zzwu/article/details/575108


4. 聰明的掃雷機工程(Smart Minesweeper Project)

      我要向你介紹的第一個完整例子,是怎麼使用神經網絡來控制具有人工智能的掃雷機的行爲。掃雷機工作在一個很簡單的環境中,那裏只有掃雷機以及隨機散佈的許多地雷。



圖7 運行中的演示程序。

   儘管書上圖形畫成了黑白色,但當你運行程序時性能最好的掃雷機將顯現爲紅色。地雷,你可能已經猜到,就是那些小方形。工程的目標是創建一個網絡,它不需要從我們這裏得到任何幫助,就能自己進行演化(evolve)去尋找地雷。爲了實現這一功能,網絡的權重將被編碼到基因組中,並用一個遺傳算法來演化它們。
 
        怎麼樣,很酷吧?

提示(重要)
      如果你跳過前面的一些章節來到這裏,而你又不瞭解怎樣使用遺傳算法,則在進一步閱讀下面的內容之前,你應回到前面去補讀一下有關遺傳算法的內容。


 
       首先讓我解釋人工神經網絡(ANN)的體系結構。我們需要決定輸入的數目、輸出的數目、還有隱藏層的數目和每個隱藏層中隱藏單元的數目。


4.1 選擇輸出(Choosing the Outputs)

        那麼,人工神經網絡怎樣控制掃雷機的行動呢?問得很好!我們把掃雷機想象成和坦克車一樣,通過左右2個能轉動的履帶式輪軌(track)來行動的。見圖案9.8。

 圖8  掃雷機的控制

 
   掃雷機向前行進的速度,以及向左、向右轉彎的角度,都是通過改變2個履帶輪的相對速度來實現的。因此,神經網絡需要2個輸出,1個是左側履帶輪的速度,另一個是右側履帶輪的速度。

   啊,但是...,我聽見你在嘀咕了如果網絡只能輸出一個1或一個0,我們怎麼能控制車軌移動的快慢呢? 你是對的;如果利用以前描述的階躍函數來決定輸出,我們就根本無法控制掃雷機實際移動。幸好,我有一套戲法,讓我捲起袖子來,把激勵函數的輸出由階躍式改變成爲在0-1之間連續變化的形式,這樣就可以供掃雷機神經細胞使用了。爲此,有幾種函數都能做到這樣,我們使用的是一個被稱爲邏輯斯蒂S形函數(logistic sigmoid function)[譯註1]。該函數所實現的功能,本質上說,就是把神經細胞原有的階躍式輸出曲線鈍化爲一光滑曲線,後者繞y軸0.5處點對稱[譯註2],如圖9所示。
 
[譯註1] logistic有’計算的’或’符號邏輯的’等意思在內,和’邏輯的(logic)’意義不同。
[譯註2] 點對稱圖形繞對稱點轉180度後能與原圖重合。若f(x)以原點爲點對稱,則有f(-x)=-f(x)


圖9 S形曲線。


   當神經細胞的激勵值趨於正、負無窮時,S形函數分別趨於1或0。負的激勵值對應的函數值都<0.5; 正激勵值對應的函數值都>0.5。S形函數用數學表達式寫出來則爲:               

    這個方程看上去可能會嚇唬一些人,但其實很簡單。e是數學常數,近似等於2.7183,a是神經細胞的激勵值,它是函數的自變量,而p是一個用來控制曲線形狀變化快慢或陡峭性的參數。p通常設定爲1。當p賦以較大值時,曲線就顯得平坦,反之,就會使曲線變爲陡峭。見圖10。很低的p值所生成的函數就和階躍函數近似。P值的大小用來控制何時使神經網絡由低變高開始翻轉有很大作用,但是在本例子中我們將它保持爲1。
 
注:“S型”的英文原名Sigmoid 或Sigmoidal 原來是根據希臘字“Sigma”得來的,但非常巧它也可以說成是曲線的一種形狀。 


 
圖7。10  不同的S形響應曲線。

4.2 選擇輸入(Choosing the Inputs)

  
 上面我們已經把輸出安排好了,現在我們來考慮輸入,確定網絡需要什麼樣的輸入?爲此,我們必須想象一下掃雷機的具體細節:需要什麼樣的信息才能使它朝地雷前進?你可能想到的第一個輸入信息清單是:

  • 掃雷機的位置(x1,y1)
  • 與掃雷機最靠近的地雷的位置(x2,y2)
  • 代表掃雷機前進方向的向量(x3,y3)

   這樣一共得到6個輸入。但是,要網絡使用這些輸入,工作起來就非常困難,因爲,網絡在像我們希望的那樣執行工作之前,必須尋找所有6個輸入之間的數學關係,而這有相當工作量。可以把此作爲一個練習倒是很理想的:去試試如何給出最少數量的輸入而仍能爲網絡傳達解決問題所需要的全部信息。 你的網絡使用的輸入愈少,網絡所要求的神經細胞數目也愈少。而較少的神經細胞就意味更快速的訓練和更少的計算,有利於網絡更高速度的工作。

   只要作少量的額外考慮,就能夠把輸入的個數減少爲4,這就是圖11中所畫出的兩個向量的4個參數。
        把神經網絡的所有輸入進行規範化是一種好想法。這裏的意思並不是說每個輸入都要改變大小使它們都在0~1間,而是說每一個輸入應該受到同等重視。例如,拿我們已經討論過的掃雷機輸入爲例。瞄準向量或視線向量(look-at vector)總是一個規範化向量,即長度等於1,分量x和y都在0~1間。但從掃雷機到達其最近地雷的向量就可能很大,其中的一個分量甚至有可能和窗體的寬度或高度一樣大。如果這個數據以它的原始狀態輸入到網絡,網絡對有較大值的輸入將顯得更靈敏,由此就會使網絡性能變差。因此,在信息輸入到神經網絡中去之前,數據應預先定比(scaled)和標準化(standardized),使它們大小相似(similar)。在本特例中,由掃雷機引到與其最接近地雷的向量需要進行規範化(normalized)。這樣可以使掃雷機的性能得到改良。
 


 
圖11 選擇輸入。

  

 小技巧:
    有時,你把輸入數據重新換算(rescale)一下,使它以0點爲中心,就能從你的神經網絡獲得最好的性能。這一小竅門在你設計網絡時永遠值得一試。但我在掃雷機工程中沒有采用這一方法,這是因爲我想使用一種更直覺的方法。

 

4.3 隱藏的神經細胞要多少?(How many Hidden Neurons?)

   到此我們已把輸入、輸出神經細胞的數目和種類確定下來了,下一步是確定隱藏層的數目,並確定每個隱藏層中神經細胞必須有多少?但遺憾的是,還沒有一種確切的規則可用來計算這些。它們的開發又需要憑個人的“感覺”了。某些書上和文章中確實給過一些提綱性的東西,告訴你如何去決定隱藏神經細胞個數,但業內專家們的一致看法是:你只能把任何建議當作不可全信的東西,主要還要靠自己的不斷嘗試和失敗中獲得經驗。但你通常會發現,你所遇到的大多數問題都只要用一個隱藏層就能解決。所以,本領的高低就在於如何爲這一隱藏層確定最合適的神經細胞數目了。顯然,個數是愈少愈好,因爲我前面已經提及,數目少的神經細胞能夠造就快速的網絡。通常,爲了確定出一個最優總數,我總是在隱藏層中採用不同數目的神經細胞來進行試驗。我在本章所編寫的神經網絡工程的第一版本中一共使用了10個隱藏神經細胞(當然,我的這個數字也不一定是最好的<一笑>)。你應圍繞這個數字的附近來做遊戲,並觀察隱藏層神經細胞的數目對掃雷機的演化會產生什麼樣的影響。不管怎樣,理論已經夠了,讓我們拿一個具體程序來看看吧!你可以在本書所附光盤的Chapter7/Smart Sweepers v1.0文件夾中找到本章下面幾頁即將描述的所有程序的源碼。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章