Python神经网络编程(一)之神经网络如何工作
? ? ? ?之前說過要轉深度學習這塊的,今天給大家介紹一本Python神經網絡編程,今年4月份出版的:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第一章 ?神經網絡如何工作
? ? ? ?Github源碼地址:https://github.com/hzka/PythonNetworkBook? 《Python神經網絡編程》的PDF鏈接:鏈接: https://pan.baidu.com/s/1k0j-u-W-Y6Sov7ZqCW_CVw? ? 提取碼: jdgf?
1.1尺有所短 寸有所長
? ? ? ?有些任務,對于傳統計算機而言很容易,對人類而言卻很難,例如,對數百萬個數字進行乘法運算。另一方面,有些任務對傳統計算機來說很難,對人類反而很容易,例如,從一堆人中識別出面孔。我們的目的是設計新算法新方法去讓計算機在求解相對困難的問題時讓人覺得是智能在起作用而非人。
1.2一臺簡單的預測機
? ? ? ? 普通機器:輸入->流程(計算)->輸出;eg:輸入是4*3;計算是4+4+4;輸出是12。
? ? ? ? 假設一臺機器要將千米轉換為英里,已知兩者關系是線性的(英里=千米*C,但C未知)和一些正確的千米和公里的樣本示例(100km,62.137英里)。
? ? ? ? 機器假設參數C為0.5,機器得到50英里答案,有誤差值12.137,增加C可以增加輸出。增加到0.6會有明顯進步(使用誤差值來指導如何改變C的值),使用0.7會出現較大誤差,所有0.6更好。嘗試0.61.
需要說明的是,輸出值越接近正確答案,誤差越來越小。而神經網絡學習核心過程就是:訓練機器使其輸出值越發接近正確的值,迭代:持續的一點一點接近答案。
?本節關鍵點:
? ? ? ? 1.所有計算機系統只有一個輸入和輸出。在輸入和輸出之間進行某種類型計算,神經網絡也是如此;
? ? ? ? 2.當我們不能精確知道一些事情如何運作時,我們可以嘗試模型來估計其運作方式,在模型中,包括我們可以調整的參數。如果我們不知道如何將千米轉換為公里,我們可以使用線性函數作為模型,使用可調節的梯度值作為參數;
? ? ? ? 3.改進模型的一種好方法是基于模型和已知真實示例之間進行比較,得到模型偏移的誤差值,調整參數。
1.3分類器與預測器并無太大差別
? ? ? ?假設花園中只有兩種小蟲子,毛蟲細而長,瓢蟲寬而短,構建直角坐標系,橫坐標是寬度,縱坐標是長度。使用同樣的方法對兩者進行分類。如果直線可以將兩者區分,那么兩者就可以根據測量值分類了。調節斜率以達到效果(假設斜率為1)。構建好簡單分類器后,機器手臂抓一只小蟲,測量寬長,使用上述分界線,可以將其正確歸類。(此為使用線性函數對未知數據進行分類)
? ? ? ?而在這一過程中,我們忽略了如何得到正確斜率及能不能改進優化小蟲分界線呢,這是神經網絡的核心地帶,下一節講。
1.4訓練簡單的分類器
? ? ? ? 本節我們講如何調整分界線斜率使其能夠基于小蟲的寬度和長度將兩組點劃分開來。
? ? ? ? 解決方案:
? ? ? ? 兩組數據(瓢蟲,寬度3.0,長度1.0;毛蟲,寬度1.0,長度3.0);在這里我們假設也有一個調整了參數的線性函數。這是一個分界線,一臺分類器而非轉換(假設為y=aX)。
? ? ? ? 假設隨機選擇參數為0.25,寬度為3,長度為0.75,訓練數據告訴我們這至少是1,根據誤差值(誤差值E等于期望目標值1.1減去實際輸出值0.75)調整參數,盡可能使所有瓢蟲的點在下方。我們假設這里有一個微小的增量△A。△A與E的關系是△A=E/X,倘若我們要調整到1.1,1.E=1-0.75=0.35.X=3;則△A為0.1167,則斜率從0.25增加至0.3667.
代入寬度1.0,長度3.0,y=aX=1*0.3667=0.3667,與3差距較大。目標值設為2.9,2.5333/1.0+0.3667=2.9。所以最終調整斜率便為2.9。但這樣效果并不好。
? ? ? ? 我們應該采用適度改進策略。改進不能太過激烈,采用△A的幾分之幾作為一個變化值。小心謹慎的調節參數。可以有效抑制錯誤和噪聲,引入了調節系數L。△A=L(E/X)。調節系數也被稱為學習率。假設L=0.5。初始值A=0.25,y=0.25*3.0=0.75,期望值為1.1,得到誤差0.35,△A=L(E/X)=0.5*0.35/3.0=0.0583,更新后的A值為0.25+0.0583=0.3083。這時使用第二個樣本值將A更新為1.6042。我們可以通過兩個參數加之L計算出最后更新的值為1.6042.結果不錯。我們已經實現了自動化的學習方法。
關鍵點:
? ? ? ?1.我們使用簡單的數學,理解了線性分類器輸出誤差值和可調節斜率參數之間的關系,換句話說,在何種程度上調整斜率,可以消除輸出誤差值;
? ? ? ?2.使用樸素的調整方法會出現一個問題,即改進后的模型只與最后一次訓練樣本最匹配,“有效地”忽略了所有以前訓練的樣本,解決這一問題的一個方法是使用學習率,調整改進學習率,這樣單一的訓練樣本無法主導學習過程;
? ? ? ?3.來自真實世界的訓練樣本充滿噪聲或包含錯誤,適度更新有助于限制這些錯誤樣本的影響。
1.5 有時候一個分類器不足以求解問題
? ? ? ?線性分類器有局限性,這里以布爾邏輯函數為例來說明問題。
? ? ? ?使用線性分類器可以學習到布爾AND運算和布爾OR運算(當AB輸入均為真時,AND函數才為真,當只要有一個為真時,OR才為真。)。但如果出現的是由XOR(兩者同真同假時,其為假)函數支配的訓練數據,那么一個簡單的線性分類器無法學習到布爾XOR函數。(主要限制:若不能用一條直線把根本性問題劃分開來,那么簡單線性分類器就是無用的)
? ? ? ?因此我們需要神經網絡去解決。神經網絡的核心思想是使用多分類器一起工作。這樣才可以解決XOR分類問題。
關鍵點:
? ? ? ?1.如果數據本身不是單一線性過程支配,那么一個簡單的線性分類器不能對數據進行劃分,例如邏輯XOR運算符支配的數據說明了這一點;
? ? ? ?2.解決方案很容易,使用多個線性分類器來劃分由單一直線無法分離的數據。
1.6神經元—大自然的計算器
? ? ? ?計算機處理速度快但能力不如大腦。這是因為架構不同:傳統計算機串行,不存在不確定性;動物大腦并行,模糊性式計算的特征。
? ? ? ?讓我們觀察大腦中的神經元,神經元分為樹突、軸突和終端,電信號沿著軸突從樹突傳到樹突。人腦有1000億神經元,連線蟲都有302神經元。觀察表明:神經元不會立即反應,而是會抑制輸入,直至輸入增強,強大到可以觸發輸出。只有輸入超過了閾值,足夠接通電路,才會產生輸出信號。神經元并不希望傳遞微小的噪聲信號。數學上提供了許多激活階躍函數可以實現簡單的階躍。換句話說:輸入達到閾值,神經元就被激發了。
? ? ? ?S函數相對于階躍函數相對平滑、更接近自然、現實。S函數又被稱為邏輯函數y=1/(1+e^-x),e=2.71828。
? ? ? ?那么如何建模人工神經?
? ? ? ?多個輸入a,b,c,采用最終輸入的總和和適用閾值的思路。將三者之后(x=a+b+c)作為S閾值函數(s=f(x))的輸入。最終S函數輸出y。若一個足夠大,其他較小,也可以激發神經元。單個一般大,但之和大于閾值也可以激發神經元。類比到神經元,樹突收集電信號,若足夠大超過閾值,神經元發射信號,沿著軸突。傳到終端,將信號傳遞給下一個神經元。每個神經元接受多個神經元的輸入。
? ? ? ?構建多層神經元,每一層中的神經元都與在其前后層的神經元互相連接。文章給了一個三層神經元示例(主要是神經元和神經元之間的連接)。針對訓練樣本,哪一部分執行學習功能呢?針對訓練樣本,我們應該如何調整作出反應呢?
? ? ? ?1.調整節點之間的連接強度(即調整輸入總和和S閾值函數的形狀)2.給每個連接賦上權重(較小權重弱化信號,較大權重放大信號)。
? ? ? ?隨著神經網絡學習過程的進行,神經網絡通過調整優化網絡內部的鏈接權重改進輸出,一些權重可能變為零或接近零,為零意思就是斷開了。
關鍵點:
? ? ? ?1.雖然比起現代計算機,生物大腦看起來存儲空間少,運行速度慢,但卻可以執行復雜任務。譬如飛行、尋食、學習語言等。
? ? ? ?2.相比于傳統的計算機系統,生物大腦對損壞和不完善信號具有難以置信的彈性;
? ? ? ?3.由相互連接的神經元組成的生物大腦是人工神經網絡的靈感來源。
1.7 在神經網絡中追蹤信號
? ? ? ?我們嘗試使用兩層神經元、每層有兩個較小的神經元(共四個鏈接)來說明神經網絡是如何運行的?
? ? ? ?兩個輸入分別是1.0和0.5,S激活函數:y=1/(1+e^-x)將輸入變為輸出。神經元總輸入信號為x,輸出為y。權重隨機分別為W1,1 = 0.9;W1,2=0.2;W2,1=0.3;W2,2=0.8;通過學習樣本對隨機數值進行改進。
? ? ? ?開始計算:第一層是輸入層,輸入節點不對輸入值應用激活函數;第二層開始計算,組合輸入,此處組合所連接的前一層的原始輸出,但這些輸出得到了鏈接權重的調節。對于第二層的節點一而言:x=(第一個點的輸出*鏈接權重)+(第二個點的輸出*鏈接權重);x=1.0*0.9+0.5*0.3=1.05.權重是神經網絡學習的內容,對這些權重持續優化,得到越來越好的結果。使用激活函數得到y=1/(1+e^-1.05)=0.7408.得到該神經網絡的一個實際輸出。面對多層、多個節點的神經網絡,我們可以使用矩陣的方法來計算出所有的輸出值。
1.8 憑心而論,矩陣乘法大有用途
? ? ? ?矩陣壓縮計算,能夠允許壓縮運算,進行縮寫;而且計算機可以高效高速完成矩陣計算。矩陣僅僅簡單是數字表格、矩形網絡而已。矩陣可以是數字,也可以是表示數值的變量。
? ? ? ?簡單的矩陣相乘(大家應該都會,就不介紹了,自行百度)。需要注意的是:第一個矩陣的列數等于第二個矩陣的行數目。那么這有什么用呢?
? ? ?
? ? ? ? 見證奇跡的時刻。第一個矩陣是包含兩層節點之間的權重,第二個矩陣是包含第一層輸入層的信號。第一個2*2矩陣是(W1,1 ?W2,1 ?W1,2 ?W2,2);第二個是(input_1,input_2),兩者相乘我們驚奇的發現可以得到與剛才計算相同的結果。X=W*I,W為權重矩陣,I為輸入矩陣。X為調節后的信號。激活函數較為簡單,無需矩陣乘法。對矩陣X的每個單獨元素應用S函數。激活函數只是簡單應用閾值,是反應變得更像是在生物神經元中觀察到的行為。第二層的最終輸出為O=sigmoid(X),O代表神經網絡中最后一層的所有輸出。X=W.I適用于前后層之間的運算。
關鍵點:
? ? ? ?1.通過神經網絡向前饋送信號所需的大量運算可以表示為矩陣乘法;
? ? ? ?2.不管神經網絡的規模如何,將輸入輸出表達為矩陣乘法,使得我們可以更為簡潔的書寫。
? ? ? ?3.更重要的是,計算機編程語言理解矩陣運算,致使其可以高效的執行。
1.9使用矩陣乘法的三層神經網絡示例
? ? ? ?作者建立了3層,每層有3個節點的神經網絡示例。3層中第一層為輸入層,最后一層為輸出層,中間層稱為隱藏層(只是因為沒有明顯輸出)。Winput_hidden是輸入層和隱藏層之間的權重矩陣,Whidden_output指的是隱藏層和輸出層之間的權重矩陣。那么中間層的輸入是Xhidden=Winput_hidden*I;中間層的輸出是Ohideen=sigmoid(Xhidden),因為S的值域在0和1之間,所以所有的值都在這個區間內。第三層與第二層原理一樣,將Ohidden作為第三層的輸入。需要注意的是,不管多少層神經網絡,我們都一視同仁,即組合輸入信號,應用權重對其調節,應用激活函數,最終生成這些層的輸出信號。
? ? ? ? 下一步我們需要將神經網絡的輸出值與訓練樣本的輸入值進行比較,計算誤差,我們需要使用這個誤差值來調整神經網絡本身,進而改進神經網絡的輸出值。
1.10學習來自多個節點的權重
? ? ? ? 因為輸出和誤差是多個節點共同作用的結果,如何更新權重?
? ? ? ?(1)在所有造成誤差的節點中平分誤差。將輸出誤差平分至上兩個節點。
? ? ? ?(2)不等分誤差,給較大鏈接權重分配更多誤差,根據比例進行誤差的分配。
? ? ? ? ?權重的使用:
? ? ? ? ?第一件事情,在神經網絡中,我們使用權重將信號從輸入向前傳播到輸出層;第二件事情,使用權重,將誤差從輸出向后傳播至網絡中,這種方法稱為反向傳播。
1.11多個輸出節點反向傳播誤差
? ? ? ?我們將第一個輸出節點的誤差標記為e1,e1等于訓練數據t1所提供的期望值與實際輸出值O1之間的差,按照權重比例w1,1和w2,1分割誤差e1。w1,1和w2,1分別為6和3,用于更新w1,1的e1部分是2/3。
? ? ? ?使用誤差指導在網絡內部如何調整一些參數,在這里也就是鏈接權重。那么若是神經網絡大于二層,會如何更新權重呢?
1.12反向傳播誤差到更多層
? ? ? ? 三層神經網絡。假設輸出的誤差標記為eoutput,將在輸出層和隱藏層之間的鏈接權重標記為who,通過誤差按照權重比例分割,我們計算每條鏈接相關的特定誤差值。核心在于我們只知道最終輸出的節點是多少,而不知道中間其它層的節點輸出應該是多少?
? ? ? ? 可以使用看到的誤差反向傳播,為鏈接重組分割的誤差。因此第一個隱藏層節點的誤差是與這個節點前向連接中分割誤差的和。
ehidden,1=鏈接W1,1和鏈接W1,2的分割誤差之和
? ? ? ? ? ? ? ? =eoutput,1 * w1,1 /(w1,1+w2,1)+=eoutput,2 * w1,2 /(w1,2+w2,2)
? ? ? ? ? ? ? ? =0.8*2/(2+3)+0.5*1/(1+4)
? ? ? ? ? ? ? ? =0.42
關鍵點:
? ? ? 1.神經網絡通過調整鏈接權重進行學習,這種方法由誤差引導,誤差就是訓練數據所給出正確答案和實際輸出之間的差值。
? ? ? 2.輸出節點處的誤差等于所需值與實際值之間的差值
? ? ? 3.內部節點相關聯的誤差并不是顯而易見的,按照鏈路權重的比例來分割來分割輸出層的誤差,再在每個內部節點處重組這些誤差。
1.13使用矩陣乘法來進行反向傳播誤差
? ? ? 將過程矢量化。計算起點是輸出層所出現的誤差。由上面的分析可知:
? ? ? ? 更新矩陣乘法以代替。第一個矩陣其實是一個轉置后的矩陣。
? ? ? ? ? 所以最終的結果為:
? ? ? ?切除歸一化因子相對于之前復雜的方法依然有效。反饋過大過小依然可以自行糾正。鏈接權重的強度給出了共享誤差最好的提示。
關鍵點:
? ? ? ?1.反向傳播誤差可以表示為矩陣乘法
? ? ? ?2.無論網絡規模大小,這是我們能夠簡潔表達反向傳播誤差,同時計算機處理矩陣運算會比較快。
? ? ? ?3.前向饋送信號和反向傳播誤差都可以使用矩陣計算而變得高效。
? ? ? ?有時候一篇文章太長也不是好事,容易讓人覺得看的很累,那么下一章再講如何更新權重、更新權重的示例以及神經網絡的準備布局。
? ? ?安卓開發交流群:651325026,歡迎大家入群交流。??
總結
以上是生活随笔為你收集整理的Python神经网络编程(一)之神经网络如何工作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keep It for Mac 1.3.
- 下一篇: K和KB的区别