没有合适的资源?快使用搜索试试~ 我知道了~
類神經網路基礎篇
需积分: 0 1 下载量 194 浏览量
2015-02-28
00:14:52
上传
评论
收藏 92KB DOCX 举报
温馨提示
试读
35页
類神經網路基礎篇,說明類神經網路的基礎概念,
资源详情
资源评论
资源推荐
類神經網路基礎篇
這次來寫點不一樣的東西,保證很多人看不懂甚至看不下去,因為要弄懂這個東西需要有很好的電
腦觀念和數學觀念。但是為什麼要寫這個東西呢,因為微軟的資料庫(Microsoft SQL Server
2005)裡面的資料挖掘就是利用這樣的機制所設計出來的,能夠了解這個原理會讓資料庫管理人員
能夠正確的應用這項技術。
漠哥研究這個東西實際上已經有十幾年了,但是數學本身并不是很好,而且所能夠找到的參考書籍
和論文大多是胡說八道,或者是只寫了結果要用某某微積分方法,卻沒有說明為什麼,對於我這種
只能記原理的人來說非常的痛苦,因此進度緩慢,也不敢說有什麽心得。也順便抱怨一下,以前學
校也學過微積分,但是卻沒有人告訴我那些東西可以用在什麼地方,讓我從三角函數小老師一下子
變成了數學白癡,幸好生活中用到微積分的地方不多,不然真的活不下去了。
什麼是類神經網路
類神經網路是一種使用數學方法,透過電腦的快速計算能力,而使得電腦能夠具有推論結果能力的
人工智慧機器。它必須經過學習的過程才能夠擁有推論能力,也就是說要有人告訴它什麼樣的情況
會得到什麼樣的結果,你告訴它越多正確的範例(狀況+結果)它就能夠正確的回答你,甚至於沒
有學過的範例,它也能告訴你可能的結果。
它還有一個好處,就是類神經網路并不會因為資料的大量成長而快速長大,而是一個固定的大小,
也就是說除非你給的狀況或者結果的數量改變,否則并不需要變動網路架構,這使得對於記憶體上
的需求變得可以預測,例如類神經網路最好的應用--手寫辨識,它可以讓手寫辨識裝置的記憶體
空間是可以預測的,因為字就那麼多,而手寫板的感應點也是固定的,所以在設計硬體的時候就能
夠把記憶體空間固定下來。
對於這樣的作用能力,如果使用資料庫來做,那就只能夠建立一個龐大的資料庫,讓使用者自己去
查,而由於資料庫過於龐大,使用者要從裡面找到正確的答案將是非常的困難,例如客戶關係管理
(CRM)裡面的許多環節就是極度需要能夠從龐大的資料庫中快速的找到少量而正確的一個例子。
簡單的類神經網路架構
因為人工智慧在國外的研究其實蠻多的,經過了這麼久的時間自然演化出許許多多的網路架構去解
決不同的問題以及速度上的改進。但是我們只看最簡單的一種,了解原理比什麼都重要。
這個架構裡面包含了三層,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 後面,如果
說它的隱藏層夠多,能夠容納更多更複雜的狀況我還能夠接受。但是如果用多個輸出值來代表,那
就可以看成是每一種結果值的幾率。
這篇文章只是談它的原理,運算公式并不是這麼單純,如果照著做會出現許多問題,例如運算過程
產生溢位或者是收斂速度太慢,不過精神都已經提到了。
上一篇類神經網路基礎篇得到了相當多的搜尋引擎查詢和點閱(不過卻沒有人回應,玩技術的人實
在是不善於跟人溝通呀,隨便回個兩句也好呀,這叫我怎麼把二十幾年的經驗丟出來呢),這一篇
接著來說怎麼設計一個類神經網路程式。
同樣是這張圖,單看這張圖片想像成是一個由三個一維陣列,S,H,Y 三層各是一個一維陣列,以及
兩個二維陣列,SW=S * H,HW=H * Y,用這樣的方法開好五個陣列就可以了,然後按照類神經
網路的運算規則來計算就行了。
但是這樣的演算法架構雖然簡單,很適合使用在記憶體固定的硬體設備上,例如手寫輸入辨識。但
是它並不是萬能的,如果要做的案例比較複雜,那麼就需要兩層以上的隱藏層,變成需要動態的建
立起新的陣列。當然明確的知道你要分析的資料,那麼就可以在一開始的時候把陣列都開好,但是
做好的東西就只能夠用在一個地方。
另一個缺點就是運算速度的問題,因為這樣的架構只能夠一個一個神經節使用廻圈進行運算,在現
在 CPU 可以分工的環境下是很沒有效率的。
要解決這樣的問題最好就是利用物件導向的方法,以神經節 Y1 來看它和 HW11、HW21 可以看成
是一個獨立的物件,由於 HW11 這種神經鏈裡面只會儲存一個浮點數,因此每一個神經節裡面只要
根據上一層有多少個神經節來擴大神經鏈的陣列大小就可以了。隱藏層也是同樣的道理。
而最上面的輸入層雖然沒有往上的神經鏈,但是也可以用同樣的物件來表達,這樣所有的神經節都
是同樣物件了,只是輸入層的神經節他的神經鏈陣列是 null。
這樣全部的神經節都一樣了後來就簡單了,每一層裡面包含多個神經節,整個網路就是多個神經層,
這樣在宣告上面就不會有問題了。
這樣做有一個好處,就是所有的神經節的運算可以放到一個執行緒裡面去,可以大大的提高整個網
路的運算速度。當然是指輸入輸出都不少的情況下,如果少少的不要使用多執行緒還比較快,畢竟
建立一個執行緒也需要不少的手續和記憶體搬移的動作。
這一篇老早寫好,雖然這兩篇的點閱率極高,但是卻完全沒有回應,資訊人真的是……。
延伸閱讀:
類神經網路基礎篇
類神經網路設計篇
實用類神經網路架構最簡單,用途最廣的就是倒傳遞網路,它增加了以往所沒有的隱藏層觀念,使
得網路可以表現出輸入單元間的交互影響,並且使用平滑可微分的轉換函數,使得網路可以應用最
陡坡降法導出修正網路加權值的公式。
它的應用包括:
1.電子電路診斷
2.化工制程控制
3.自來水廠水質處理操作
4.股票市場預測(日本某大證券公司實際應用)
5.期貨交易
6.信用卡盜用判斷
7.債券分級
8.倒閉破產預測
9.閃電預測
10.心電圖分類
11.急性冠狀動脈栓塞診斷
12.皮膚病診斷系統
13.頭痛疾病診斷
先做神經元架構,請參考前面兩篇的說明,其中 W()就是神經鍵的值,設計的時候就必須把序列化
的問題考慮進去,因為數據量大,使用序列化的方式最容易將物件整個保存下來,
Public Class PElement
Private mNetwork As PNetwork
Private mLayerNo As Integer
Private mUpperSize As Integer
Private mOutValue As Double
Private mDifValue As Double
Private mInnerValue As Double = 1
Public W() As Double
#Region "Init"
'爲了能夠序列化必須要有的宣告
Public Sub New()
End Sub
Public Sub New(ByVal Network As PNetwork, ByVal LayerNo As Integer, ByVal UpperSize As Integer)
Init(Network, LayerNo, UpperSize)
End Sub
Public Sub Init(ByVal Network As PNetwork, ByVal LayerNo As Integer, ByVal UpperSize As Integer)
mNetwork = Network
mLayerNo = LayerNo
mUpperSize = UpperSize
'為了簡化程式,讓輸入層也使用標準神經元
If mLayerNo > 0 Then
ReDim W(mUpperSize - 1)
For I As Integer = 0 To mUpperSize - 1
W(I) = Rnd() - 0.5
Next
End If
End Sub
#End Region
#Region "Property"
剩余34页未读,继续阅读
Hala007
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0