【神經網絡】 之 神經網絡基礎(一)

1.人與機器,各有所長

有些任務,對傳統的計算機而言很容易,對人類而言卻很難。例如,對數百萬個數字進行乘法運算。
另一方面,有些任務對傳統的計算機而言很難,對人類而言卻很容易。例如,從一羣人的照片中識別出面孔。

2.一個簡單的預測機

人的思考過程:

我們忽略機器處理的細節,可將神經網絡的處理過程簡化爲下圖(處理機)。

讓我們稍微增加一點難度,舉一個進度轉換的例子。

現在想象一下,假設我們不知道千米和英里之間的轉換公式,但知道它們直接是線性關係:“英里=千米×C”,其中C爲常數。

現在,我們有一個真實的例子

【100千米 = 62.137英里】

我們試着設C=0.5,看看會發生什麼情況。

這樣,我們按C=0.5計算,得結果ans = 50,這與真實示例是有差距的,我們稱之爲【誤差值】,

誤差值=真實值-計算值 = 62.137-50 = 12.137。

我們知道錯了,那應該做些什麼呢?——上調C的值:我們將C稍微增加到0.6,得出ans=60,現在誤差變小了,爲2.137。如果對這個誤差滿意,計算就到此結束了。但如果還想繼續縮小誤差,那麼我們再繼續增大C的值,這次我們設C=0.7,得出ans=70。糟糕!過猶不及,誤差值變成了-7.863。

改怎麼解決這個問題呢?

我們嘗試適度的調整C值,由0.6上調至0.61,得ans=61,誤差值爲1.137,誤差更小了,說明這個方法奏效了。

我們來總結一下:

  • 所有有用的計算機系統都有一個輸入和一個輸出,並在輸入和輸出之間進行某種類型的計算。神經網絡也是如此。
  • 當我們不能精確知道一些事情如何運作時,我們可以嘗試使用模型來估計其運作方式,在模型中,包括了我們可以調整的參數。如果我們不知道如何將千米轉換爲英里,那麼我們可以使用線性函數作爲模型,並使用可調節的梯度值作爲參數。
  • 改進這些模型的一種好方法是,基於模型和已知真實示例之間的比較,得到模型偏移的誤差值,調整參數。

3.分類器與預測器並無太大差別

因爲上述的簡單機器接受了一個輸入,並做出應有的預測,輸出結果,所以我們將其稱爲預測器。我們根據結果與已知真實示例進行比較所得到的誤差,調整內部參數,使預測更加精確。

現在,我們來看看測量得到的花園中小蟲子的寬度和長度。

 在上圖中,你可以清楚地看到兩羣小蟲。毛蟲細而長,瓢蟲寬而短。

你還記得給定千米數,預測器試圖找出正確的英里數這個示例嗎?這臺預測器的核心有一個可調節的線性函數。當你繪製輸入輸出的關係圖時,線性函數輸出的是直線。可調參數C改變了直線的斜率。

如果我們在這幅圖上畫上一條直線,會發生什麼情況呢?

雖然我們不能使用先前將千米數轉換成英里數時的同樣方式,但是我們也許可以使用直線將不同性質的事物分開。

   

我們通過調整斜率,找到了一條合適的直線來將小蟲分開。

設想一下,下一次,計算機使用機器手臂抓起一隻新的小蟲,測量其寬度和長度,然後它可以使用上面的分界線,將小蟲正確歸類爲毛蟲或瓢蟲。(這就是一個預測器

但是,我們忽略了一個至關重要的因素。我們如何得到正確的斜率呢?我們如何改進不能很好劃分這兩種小蟲的分界線呢?(請繼續向下看)

4.訓練簡單的分類器

現在,我們有兩個實例。

我們知道這組實例是正確的。這些實例幫助我們調整分類函數的斜率。用來訓練預測器或分類器的真實實例,我們稱爲訓練數據

讓我們使用一條隨機的分界線開始我們的討論。回顧一下,在千米轉換爲英里預測器的實例中,我們有一個調整了參數的線性函數。此處,由於分界線是一條直線,因此我們也可以進行相同的處理:y =Ax

由於嚴格來說,此處的直線不是一臺預測器,因此我們有意使用名稱y和x ,而不使用名稱長度和寬度。與先前我們將千米轉換爲英里不一樣,這條直線不將寬度轉換爲長度。相反,它是一條分界線,是一臺分類器。

之前,我們看到參數A控制着直線的斜率。較大的A對應着較大的斜率。

讓我們嘗試從A = 0.25開始,分界線爲y = 0.25x 。在與訓練數據的同一張圖中,我們繪製這條直線,觀察一下這是一種什麼情況。

無需任何計算,我們可以觀察到直線y = 0.25x 不是一臺很好的分類器。這條直線未將兩種類型的小蟲區分開來。由於瓢蟲也處在直線之上,因此我們不能說“如果小蟲在直線之上,則這是一條毛蟲”。

直觀上,我們觀察到需要將直線向上移動一點,但是我們要抵制誘惑,不能通過觀察圖就畫出一條合適的直線。我們希望能夠找到一種可重複的方法,也就是用一系列的計算機指令來達到這個目標。計算機科學家稱這一系列指令爲算法(algorithm)。

讓我們觀察第一個訓練樣本數據:寬度爲3.0和長度爲1.0瓢蟲。如果我們使用這個實例測試函數y =Ax ,其中x 爲3.0,我們得到:y =0.25*3.0= 0.75在這個函數中,我們將參數A設置爲初始隨機選擇的值0.25,表明對於寬度爲3.0的小蟲,其長度應爲0.75。但是,由於訓練數據告訴我們這個長度必須爲1.0,因此我們知道這個數字太小了。

現在,我們有了一個誤差值。正如先前將千米轉換爲英里的預測器實例一樣,我們可以利用這個誤差值來搞清楚如何調整參數A。

但是,在我們調整參數A之前,讓我們考慮y 應該是什麼值。如果y 爲1.0,那麼直線就會恰好經過瓢蟲所在的座標點(x ,y )=(3.0,1.0)。這是一個非常微妙的點,但是實際上,我們並不希望出現這種情況。我們希望直線處於這個點上方。爲什麼呢?因爲我們希望所有瓢蟲的點處於直線下方,而不是在直線上。這條直線需要成爲瓢蟲和毛蟲之間的一條分界線,而不是給定小蟲寬度、預測小蟲長度的一個預測器。

因此,當x = 3.0時,我們嘗試使用y =1.1的目標值。這只是比1.0大一點的數。我們也可以選擇1.2甚至1.3,但是我們不希望使用10或100這樣較大的數字,因爲這很可能會使得直線在瓢蟲和毛蟲上方,導致這個分類器沒有一點作用。
因此,期望的目標值是1.1,誤差值E爲,誤差值=(期望目標值 - 實際輸出值),這樣,E = 1.1-0.75 = 0.35。


讓我們暫停下來提醒一下自己,將誤差值、期望的目標值和計算值的意義在圖上表示出來。

現在,我們需要對這個E做些什麼,才能更好地指導我們調整參數A呢?這是一個重要的問題。

在這個任務中,讓我們退一步再想一想。我們希望用y 中稱爲E的誤差值,來搞清楚參數A所需改變的值。要做到這一點,我們需要知道兩者的關係。A與E是如何關聯的呢?如果我們知道了這一點,那麼我們就可以理解更改一個值如何影響另一個值。

我們先從分類器的線性函數開始:y =Ax
我們知道,A的初始猜測值給出了錯誤的y 值,y 值應該等於訓練數據給定的值。我們將正確的期望值t 稱爲目標值。爲了得到t 值,我們需要稍微調整A的值。數學家使用增量符號Δ表示“微小的變化量”。下面我們將這個變化量寫出來:
                                                                 t = (A + ΔA)x
讓我們在圖中將其畫出來,以使其更容易理解。在圖中,你可以看到新的斜率(A+ΔA)。

請記住,誤差值E是期望的正確值與基於A的猜測值計算出來的值之間的差值。也就是說,E等於t -y 。

我們將這個過程寫出來,這樣就清楚了:t -y = (A + ΔA)x - Ax

展開表達式並化簡:
         E =t -y = (A + ΔA)x - Ax
        E = (ΔA)x

這是多麼美妙啊!誤差值E與ΔA存在着一種簡單的關係。這種關係如此簡單,以至於我認爲這是錯的,但實際上這是正確的。無論如何,這種簡單的關係讓我們的工作變得相對容易。

我們很容易沉迷於代數,或由於代數而分心。讓我們提醒自己,我們所希望的是擺脫這些代數,用一些簡明的語言達到我們的目標。根據誤差值E,我們希望知道需要將A調整多少,才能改進直線的斜率,得到一臺更好的分類器。要做到這一點,我們只要重新調整上一個方程,將 ΔA算出:
                                                           ΔA= E / x
這就可以了!這就是我們一直在尋找的神奇表達式。我們可以使用誤差值E,將所得到的ΔA作爲調整分界線斜率A的量。
讓我們開始吧 ——更新最初的斜率。

誤差值爲0.35,x 爲3.0。這使得ΔA = E / x = 0.35 / 3.0 = 0.1167。這意味着當前的A = 0.25需要加上0.1167。這也意味着,修正後的A值爲(A+ΔA),即0.25 + 0.1167 = 0.3667。當A=0.3667時,使用這個A值計算得到的y 值爲1.1,正如你所期望的,這就是我們想要的目標值。

唷!我們做到了!我們找到了基於當前的誤差值調整參數的方法。
讓我們繼續前進吧!

現在,我們已經完成了一個實例訓練,讓我們從下一個實例中學習。此時,我們已知正確值對爲x = 1.0和y = 3.0。當線性函數使用更新後的A = 0.3667,並把x = 1.0代入到線性函數中時,讓我們觀察會發生什麼情況。我們得到y = 0.3667 * 1.0 = 0.3667。這與訓練樣本中y = 3.0相去甚遠。

基於與先前同樣的推理,我們希望直線不要經過訓練數據,而是稍微高於或低於訓練數據,我們將所需的目標值設置爲2.9。這樣,毛蟲的訓練樣本就在直線上方,而不是在直線之上。誤差值E爲2.9-0.3667= 2.5333。

比起先前,這個誤差值更大,但是如果仔細想想,迄今爲止,我們只使用一個單一的訓練樣本對線性函數進行訓練,很明顯,這使得直線偏向於這個單一的樣本。

與我們先前所做的一樣,讓我們再次改進A。ΔA爲E / x ,即2.5333 /1.0 = 2.5333。這意味着較新的A爲0.3667 + 2.5333 = 2.9。這也意味着,對於x = 1.0,函數得出了2.9的答案,這正是所期望的值。

這個訓練量有點大了,因此,讓我們再次暫停,觀察我們已經完成的內容。下圖顯示出了初始直線、向第一個訓練樣本學習後的改進直線和向第二個訓練樣本學習後的最終直線。

等等,這是什麼情況啊!看着這幅圖,我們似乎並沒有做到讓直線以我們所希望的方式傾斜。這條直線沒有整齊地劃分出瓢蟲和毛蟲。
好了,我們理解了先前的訴求。改進直線,以得出各個所需的y 值。這種想法有什麼錯誤呢?如果我們繼續這樣操作,使用各個訓練數據樣本進行改進,那麼我們所得到的是,最終改進的直線與最後一次訓練樣本非常匹配。實際上,最終改進的直線不會顧及所有先前的訓練樣本,而是拋棄了所有先前訓練樣本的學習結果,只是對最近的一個實例進行了學習。
如何解決這個問題呢?
其實很簡單!在機器學習中,這是一個重要的思路。我們應該進行適度改進(moderate)。也就是說,我們不要使改進過於激烈。我們採用ΔA幾分之一的一個變化值,而不是採用整個ΔA,充滿激情地跳躍到每一個新的A值。使用這種方法,我們小心謹慎地向訓練樣本所指示的方向移動,保持先前訓練迭代週期中所得到的值的一部分。在先前相對簡單的千米轉換爲英里的預測器中,我們就已經觀察到這種有節制的調整,我們小心翼翼地調整參數C,使其只是實際誤差值的幾分之幾。

這種自我節制的調整,還帶來了一個非常強大、行之有效的“副作用”。當訓練數據本身不能確信爲完全正確並且包含在現實世界測量中普遍出現的錯誤或噪聲這兩種情況時,有節制的調整可以抑制這些錯誤或噪聲的影響。這種方法使得錯誤或噪聲得到了調解和緩和。

好吧,讓我們重新使用這種方法。但是這一次,在改進公式中,我們將添加一個調節係數:
ΔA= L(E / x )
調節係數通常被稱爲學習率(learning rate),在此,我們稱之爲L。

我們就挑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值計算訓練樣本,在x = 3.0時,得到y = 0.3083 * 3.0 =0.9250。現在,由於這個值小於1.1,因此這條直線落在了訓練樣本錯誤的一邊,但是,如果你將這視爲後續的衆多調整步驟的第一步,則這個結果不算太差。與初始直線相比,這條直線確實向正確方向移動了。

我們繼續使用第二個訓練數據實例,x = 1.0。使用A = 0.3083,我們得到y = 0.3083 * 1.0 = 0.3083。所需值爲2.9,因此誤差值是2.9-0.3083=2.5917。ΔA = L(E / x ) = 0.5 * 2.5917 / 1.0 = 1.2958。當前,第二個更新的值A等於0.3083 + 1.2958 = 1.6042。

讓我們再次觀察初始直線、改進後的直線和最終直線,觀察這種有節制的改進是否在瓢蟲和毛蟲區域之間是否得到了更好的分界線。

 結果真的很不錯!
即使使用這兩個簡單的訓練樣本,利用帶有調節學習速率的一種相對簡單的改進方法,我們也非常迅速地得到了一條很好的分界線y =Ax ,其中A爲1.6042。

讓我們先放下已經取得的成就。我們已經實現了自動化的學習方法,雖然方法非常簡單,但卓有成效地對若干實例進行分類。

這太棒了!

我們再簡單總結一下。

  • 我們使用簡單的數學,理解了線性分類器輸出誤差值和可調節斜率參數之間的關係。也就是說,我們知道了在何種程度上調整斜率,可以消除輸出誤差值。
  • 使用樸素的調整方法會出現一個問題,即改進後的模型只與最後一次訓練樣本最匹配,“有效地”忽略了所有以前的訓練樣本。解決這個問題的一種好方法是使用學習率,調節改進速率,這樣單一的訓練樣本就不能主導整個學習過程。
  • 來自真實世界的訓練樣本可能充滿噪聲或包含錯誤。適度更新有助於限制這些錯誤樣本的影響。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章