實質上鼓勵一下吧

這次來寫點不一樣的東西,保證很多人看不懂甚至看不下去,因為要弄懂這個東西需要有很好的電腦觀念和數學觀念。但是為什麼要寫這個東西呢,因為微軟的資料庫(Microsoft SQL Server 2005)裡面的資料挖掘就是利用這樣的機制所設計出來的,能夠了解這個原理會讓資料庫管理人員能夠正確的應用這項技術。

漠哥研究這個東西實際上已經有十幾年了,但是數學本身并不是很好,而且所能夠找到的參考書籍和論文大多是胡說八道,或者是只寫了結果要用某某微積分方法,卻沒有說明為什麼,對於我這種只能記原理的人來說非常的痛苦,因此進度緩慢,也不敢說有什麽心得。也順便抱怨一下,以前學校也學過微積分,但是卻沒有人告訴我那些東西可以用在什麼地方,讓我從三角函數小老師一下子變成了數學白癡,幸好生活中用到微積分的地方不多,不然真的活不下去了。

什麼是類神經網路

類神經網路是一種使用數學方法,透過電腦的快速計算能力,而使得電腦能夠具有推論結果能力的人工智慧機器。它必須經過學習的過程才能夠擁有推論能力,也就是說要有人告訴它什麼樣的情況會得到什麼樣的結果,你告訴它越多正確的範例(狀況+結果)它就能夠正確的回答你,甚至於沒有學過的範例,它也能告訴你可能的結果。

它還有一個好處,就是類神經網路并不會因為資料的大量成長而快速長大,而是一個固定的大小,也就是說除非你給的狀況或者結果的數量改變,否則并不需要變動網路架構,這使得對於記憶體上的需求變得可以預測,例如類神經網路最好的應用--手寫辨識,它可以讓手寫辨識裝置的記憶體空間是可以預測的,因為字就那麼多,而手寫板的感應點也是固定的,所以在設計硬體的時候就能夠把記憶體空間固定下來。

對於這樣的作用能力,如果使用資料庫來做,那就只能夠建立一個龐大的資料庫,讓使用者自己去查,而由於資料庫過於龐大,使用者要從裡面找到正確的答案將是非常的困難,例如客戶關係管理(CRM)裡面的許多環節就是極度需要能夠從龐大的資料庫中快速的找到少量而正確的一個例子。

簡單的類神經網路架構

因為人工智慧在國外的研究其實蠻多的,經過了這麼久的時間自然演化出許許多多的網路架構去解決不同的問題以及速度上的改進。但是我們只看最簡單的一種,了解原理比什麼都重要。

 Neture

這個架構裡面包含了三層,S輸入層,H隱藏層,Y輸出層,每一層的圓點代表一個神經元,輸入層就是讓你把狀況告訴它,換句話說就是把手寫版的每一個點對應到每一個輸入層。隱藏層這裡只有一層,對於複雜的網路建議使用多個隱藏層,這樣網路才能記憶更多的狀況。而輸出層就是結果,如果以手寫系統來看就是中文內碼的每一個位元。

而每一層之間的連線叫做神經鏈,是主要記憶與推論的地方,每一個神經鏈都是一個浮點數,經過層層的計算就可以得到最後的輸出結果。舉例而言

H1=S1*SW11+S2*SW21+S3*SW31

也就是說H1就是把所有上一層的神經元的值乘以神經鏈加總起來的結果,輸出層也是相同的原理。用手寫辨識為例子,請配合著圖看S1這個神經元比較容易了解,就是每一個手寫板的感應點都會透過神經鏈影響每一個隱藏層,進而影響每一個中文內碼的每一個位元。

神經網路的修正

一開始的神經網路的神經鏈通常都是用亂數去產生的,所以輸出的結果肯定會和標準值(V)是有誤差的,所以就需要對網路做修正。我這裡不談很深的數學,只用原理來解釋。因為有誤差所以就必須要根據誤差值來修正,可以知道

輸出層的誤差值(YD)=標準值(V)-輸出值(Y)

而每一個神經鏈要修正的誤差值簡單來看就是看有多少的神經鏈連接到這個神經元,以上圖的Y1來看就是有三個神經鏈連過來,所以每一個神經鏈只要修正1/3就夠了。但是單單這樣每一個神經鏈都會修正同樣的值,必須要再乘以上一層的輸出值才是每一個神經鏈要修正的值。這樣來看也才會符合輸入影響輸出的定義。

而隱藏層因為沒有標準值,它的誤差值必須由下一層的誤差值來提供,也就是

隱藏層的誤差值(HD)=下層所有的 (誤差值(YD) * 神經鏈(W))

網路學習循環

通常問題與答案如果以數學圖表來看,它并不會是一個很漂亮的曲綫,也就是說你不可能一次就修正到最接近的輸出值,而是需要多次的修正。而且也沒有辦法以誤差值的收斂來看是不是應該要終止學習,因為輸出值可能現在已經掉到第一個谷底,而標準值卻在另一個谷底,而且爲了避免谷口的寬度過小,太大的修正值可能會直接跳過可能的正確值,所以通常會賦予一個學習速率值,也就是讓每一個修正值去乘以學習速率,讓每一次的修正值變小,以減少誤差。

結論

類神經網路的確可以解決很多一般電腦程式所不能解決的問題,並且能夠更加聰明的提供問題的解答,例如很早以前漠哥做的電路板輔助量測檢修系統、股票指數預測、天氣預測、手寫辨識許許多多的應用,知識管理+客戶關係管理是最新的應用實例。

附注

坊間很多論文或書籍會用一個輸出值去代表許多的輸出結果,例如1=A,2=B,3=C這樣的設計是完全錯誤的,應該要讓每一個輸出值代表一個意義。這樣說吧,你怎麼知道B一定是在A後面,如果說它的隱藏層夠多,能夠容納更多更複雜的狀況我還能夠接受。但是如果用多個輸出值來代表,那就可以看成是每一種結果值的幾率。

這篇文章只是談它的原理,運算公式并不是這麼單純,如果照著做會出現許多問題,例如運算過程產生溢位或者是收斂速度太慢,不過精神都已經提到了。

Posted by 漠哥 at 痞客邦 PIXNET 留言(18) 引用(0) 人氣()


open trackbacks list Trackbacks (0)

留言列表 (18)

Post Comment
  • dustin
  • 請教

    大哥你好~類神經網路基礎篇寫的不錯~但是後面的學習原理我看不懂~不知道可不可舉個簡單的計算範例呢~
  • 目前我正在測試一些別的計算模型,可能還要一段時間才會再寫新的東西哦!

    漠哥 replied in 2009/11/04 10:29

  • wangbiny
  • 關於上圖

    請教圖形中分別是SW11, SW12及SW13
    下頭方程式卻是SW11,SW21及SW31,
    是一樣的嗎?還是....?
  • wangbiny
  • 弄懂了!

    不好意思!
  • 很想學
  • 看你大大妳的文章以後我感到很大的興趣!!
    事實上我就是想找這種類似可學習的AI智能
    我想把這種東西套用在象棋遊戲上
    我自己在網路上找很多關於AI方面的問題 可以都找不到可用的資料作為參考 也是望大大能多發表這種文章讓我做參考 感謝了
  • 我也在找可以套用在棋類遊戲的類神經模型呢,如果找到請告訴我哦!

    漠哥 replied in 2010/01/13 09:00

  • 很想學
  • 其實這只是我的一個構想而已@@"
    剛踏路此領域 很新很新的新手= ="
    我讀電子= =" 但對程式來講還很生疏
    用過的軟體也只有java vb c/c++ ˊˋ
  • 如雲
  • 謝謝您的教學^^
  • NEPT
  • 也順便抱怨一下,以前學校也學過微積分,但是卻沒有人告訴我那些東西可以用在什麼地方,

    這句話真是說得太好了,小弟我最近也學習相關的知識,赫然發現以前學的三角函數的一些功用,深深覺得我們的教育實在有必要好好檢討,不該把人當機器訓練(怎麼練電腦都比你快)
  • Private Comment
  • 麻雀
  • 大大你好
    小弟資工系學生,目前才剛接觸到資訊工程導論
    這次作業是有關於類神經的報告

    我想轉貼部分大大的內容,如果不方便的話我會刪除
  • 勸你不要抄太多,因為我這個文蠻熱門的,可能指導教授都看過了!

    漠哥 replied in 2010/12/27 09:03

  • 訪客
  • 所以隱藏層(H)是相對於輸入層(S)的數量(單一層的各數)嗎?還是類似神經線,經誤差修正後會刪減。

    增加隱藏層的層數意即可以增加考慮的條健,那再增加層數方面大概要怎麼設計??我的意思是如果以手寫板為例子的話,什麼情況下需要增加隱藏層的層數以及決定他的個數呢?

    感謝分享。
  • 倒傳遞類神經網路的神經元、神經線的數量都是固定的,只有神經線、神經元的值會有所改變,數量是不變的。
    有其他的網路模型是可變的,這些比較特殊的模型,可能需要參考國外的論文,中文的資料都是比較淺顯的。
    如果類神經網路應用在硬體上,那麼應該儘量使用固定的神經元數量,也就是說隱藏層層數和個數都應該以固定為目標,這樣才能夠儘量的利用硬體進行運算。
    通常隱藏層個數=(輸入層個數+輸出層個數)/2,而隱藏層的層數以1-2層為原則,因為層數太多只會讓收斂速度變慢,對於精密度的貢獻並不大。
    通常對於手寫板或音波應用在類神經網路時,會先用特殊的演算法將輸入層的個數縮減,否則如果是直接用像素運算,會有數萬甚至百萬之多,假設可以壓縮到10萬,
    而輸出則對應到內碼,以常用中文字約一萬來算,那麼隱藏層個數=(10w+1w)/2=5.5w。

    漠哥 replied in 2011/02/17 22:25

  • 訪客
  • 回復的很詳細,瞭解了,感謝板大回復!!
  • 訪客
  • 抱歉想在問一下,那以一般來說,神經線固定,不會刪減,但設置的數量都是相對的嗎?像範例那樣,3對3的話會有3*3=9條神經線,還是說設計上會因些因樹在設置時就不會設為"全滿"的狀態比如說少個其中1~2條,還是這也包含於"比較特殊的模型"?

    謝謝
  • 一般而言,神經元與神經線都是對應的,這樣程式會比較好寫,而且在反饋的過程中,如果真的遇到沒有用的神經線,理論上網路會自動將這個神經線的值趨近於零,也就等於無效了,所以一般而言並不會刻意去消減神經線。不過有增加神經線的模型,這是針對有時間順序的資料所設計的模型,像股票指數預測就是有時間關係的,你可以用“類神經 RNN”搜尋一下可以找到相應的資訊。我也曾經試著做過這樣的網路模型,但是因為回饋的關係,要一個範例學習完,再學下一個範例,在多工上並不好處理。

    漠哥 replied in 2011/02/21 05:26

  • Private Comment
  • Private Comment
  • Private Comment
  • 喵
  • 神經網路修正的問題
    要修正Y1的值是以下公式??請問我有理解錯嗎?
    Y1 = 輸出值(Y) + (輸出層的誤差值(YD)/3 * H1)
    麻煩板主解惑~~~新手

  • 林進木
  • 終於對老師講得類神經有點了解了= =|||雖然不是很懂
  • 莊小閔
  • 大大你好~我想請問一些關於建置輻狀基底函數(RBF)的問題

    我現在創建了一個網路
    for i=1:1000;
    Var=[0.09884,i*0.01];
    load SampleData_TEST_0309 %CGMR_20C3M_淡水測站
    net = newrb(Ipt',RelOpt',Var(1,1),Var(1,2),size(Ipt,1),size(Ipt,1));%第一個參數為goal
    end
    我想要知道如果把goal的值固定,用回圈去跳spread參數
    那每一個spread所對應的神經元個數是多少咧??
    還有,要如何知道設置好的網路,隱藏層的層數咧??

You haven’t logged in yet, please use guest status to leave message. You can also log in with above service account and leave message

other options