神經元 (Artificial Neuron)和電腦的關係
電腦中的神經元其實是之前生物學中神經元所延伸出來的產物。
以生物學角度來看:細胞會有細胞體、樹突、軸突
當出現外界刺激 → 細胞體 → 傳到大腦做判斷 → 產生相對應的反應
而在類神經網路中也有相似的概念。
收到大量的資訊 → 用程式做出判斷 → 產生相對應的結果
當出現新事物需要做判斷的時候,人類是靠過往的經驗來做判斷。
電腦則是靠之前做過的大量學習,將他模擬成一項公式,當新的輸入進來時,可以直接藉由模擬出的公式做出判斷。
**電腦的世界中,電腦只看得懂數字,沒有人體中神經細胞的的概念,所以要讓電腦理解神經元的話,勢必要將這些神經細胞轉成數字的形式。**
神經元的符號們
下圖為電腦的神經元,如果還看不懂這張圖很正常,接著會逐一介紹這些符號!
總共需要認識五個符號們: x, w, z, y, ŷ
為了更方便介紹這些符號,先來舉一個二分類問題吧!
問題:輸入為某貓/狗的長度與重量,透過「神經元」,來區分是貓還是狗(只有兩種結果稱為二分類問題)。
資料 (Data):手邊有很多關於貓跟狗的資料,利用長度、體重與標記(Label Class)資料,來區分貓和狗。(如下圖)
如何學習?
過程說明:利用已知長度與重量的特性,搭配 Perceptron Learning Algorithm(可以先想成是某種演算法)方法來訓練神經元。在訓練的過程中,這些神經元將會學習到「貓的長度與重量大概為多少」,同時也會學習「狗的長度與重量大概為多少」,進而分辨不同的類別。
如果還不是很懂的話,請繼續讓我們看下去~~
👈 右圖為訓練資料
解決此問題,流程大致如下:
- 利用已知資料(高度與體重)去訓練神經元,以建立出「預測神經元模型」。
- 目的:當使用者隨意輸入某貓或某狗的長度與體重後。經過剛剛建立好的「預測模型」後,會輸出-1, 1,以表示此神經元的判斷結果。
1 代表貓。 -1代表狗。
有了基本的認知後,現在可以更方便地為後面的符號來做解釋!
讓我們透過幾個問答,來更簡單暸解神經元的概念吧。
機器/深度學習中,神經元是最重要的核心
神經元是由什麼構成?
因為電腦看不懂文字也沒有知覺,只看得懂數字,按照這些概念來說,神經元會是由一連串的「數字」所組成。
數學表示:請看左圖👈
下面會逐一介紹x和w。
數字的來源是什麼呢?
Ans: 資料所提供的「數值」。以範例來說,資料會是高度(cm)與體重(kg)。
在一整堆資料中,一定會有些資料比較重要,有些資料沒那麼重要。好比像是一篇文章,文章中一定會有幾個比較重要的關鍵字,代表整篇文章中的主題,而資料也是同樣的概念。這時知道哪些資料的重要性就會是個關鍵!
數學表示:請看左圖👈
電腦的神經元,要如何知道資料的重要性呢?
Ans: 權重(weight)的概念就產生拉。在訓練過程中,某些資料可能對整個資料佔有較大的影響力。同樣的,該資料在訓練的過程中,也會對神經元也會造成比較大的影響。
簡單來說,權重(weight)就是用來評估每個資料對神經元,產生影響的多寡程度。
數學表示:請看左圖👈
**權重的話,可以想成「學期總成績」的算法,比較重要的科目(數學、國文之類),佔總成績的比重比較大,神經元對於資料也是相同的概念。
神經元建立出來後,如何做判斷(是貓還是狗)?
由於現在處理的問題屬於二分類問題,答案只會有兩種情況。
z是經過公式(已考量資料與權重)後計算出的結果
輸出結果 z ≥θ,輸出 1
輸出結果 z<θ,輸出-1
θ: threshold(門檻值)
超過threshold,就說輸入(input)資料屬於貓,
小於threshold,就說輸入(input)資料屬於狗
為了讓公式更整齊,將整個方程式重新整理
注意:x_0在程式中,永遠=1,因為x_0是為了整個式子方便表示才加入,沒有實質上的意義。
有了上述的理解後,我們將神經元改寫成👇
而這個z在機器學習中,稱為Net input
重新改寫原本的模型
神經元如何學習?
使用某種演算法(Learning Algorithm),這邊使用的演算法為Perceptron Learning Algorithm(簡稱PLA),PLA應該算是機器學習入門基礎,能用簡單的概念了解甚麼是神經元,還請各位可以好好的了解。
Perceptron Learning Algorithm的學習步驟非常簡單,只有兩個步驟。
1. 初始化 weight值
2. 訓練神經元 ,其中需要兩步驟:
— 計算此模型的預測值 ŷ (y hat)
— 更新 weight值
- 初始化weight值:這個步驟很簡單,看 weight值要全部設為0或是一些接近0的random數字。
- 訓練神經元
訓練神經元的重點在於如何更新 weight值
如何更新weight值?
在矩陣w中,我們先任意取其中一個名為w_j
的元素(element)來說明其更新方法。
如果想要更新w_j
的weight值,代表勢必會要多加/減某個值,這邊用Δw_j來表示。
請參考左圖👈
那w_j
值的加/減值要怎麼取?
利用已知資訊(x, y)與神經元學習出來後,算出的結果 ŷ,相互計算後,來進行修正(update)。
請參考左圖👈
上面所說的已知資訊x
可以想成是,最一開始舉已知貓和狗的長度與重量。y
則是我們給他的標籤(label),1(代表貓)或是-1(代表狗)。
有一點比較重要的是,因為weight是一個矩陣,所以實際上在更新的時候,
是整個 w矩陣「同時」做更新
這也是為什麼在進行機器/深度學習時,多半會使用python,因為python有矩陣相乘的函式庫可以直接使用,不需要額外花費時間撰寫。
PLA簡單更新範例
如果看得還不是很懂的話,直接來做簡單的範例,展現出Perceptron Learning Algorithm的奧妙之處。
說明:當原本的資料跟模型預測的結果「相同」時,weight值不會做更新。因為這次神經元預測的結果是正確的,所以我們想要維持這次的weigth值,不做任何更動。
相反的,如果原本的資料跟神經元的預測結果「不同」時,
說明:當原本的資料跟模型預測的結果「不同」時,weight值會做「2倍η值 / -2倍η值」的更新。因為神經元的預測結果不對,代表這次的weight值不夠精確,理當要更改這次weight值。
*η值(Learning Rate)是我們自己設的數值,可以依照問題的需求做調整。看要一次做很多修正,還是要慢慢去做修正。
PLA神經元學習範例
現在再代一個更實際的範例,假設為η值=1:
說明:得到Δw_j = 1後,我們知道weight要調整的幅度為1。因此經過這一回的更新後,會將每個的weight值全部 + 1,使得下一次的x與y相乘時,乘起來的結果會更接近1。換句話說,讓他預測正確答案1的機率更大一點。
說明:因為這次又預測錯誤,所以決定將更新幅度的力道再大一點,將每個的weight值全部+4(因為我們帶入公式得到Δw_j=4),使得下一次的x和w相乘時,預測正確結果1的機率更大一點。
Perceptron Learning Algorithm的訓練過程就是這樣不斷重複,去調整weight值,直到找到一個大家(每個資料)都可以接受的平衡點。
利用Iris Dataset來進行PLA的實作
進行訓練的步驟在第一篇的時候介紹,這邊就不做贅述。
資料來源:請點這邊,看到裡面的iris.data,點一下即可開始下載。
程式說明:「利用花萼長度與花瓣長度,來分辨兩朵花的不同。」並透過Perceptron Learning Algorithm訓練神經元,學習兩朵花,個別的花萼長度與花瓣長度,進而完成辨識。
程式碼實作:(程式碼上有附註解)
輸出結果:
另一種呈現方式:(程式碼上有附註解)
程式碼額外說明:
將資料轉化成圖像的過程,一般來說稱做「資料視覺化」,這也是在處理資料時,一項不可或缺的技能!
想特別解釋這段程式碼:
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
np.arange(x2_min, x2_max, resolution))
一個圖的構成,可以想成是由好多個小方格所組成,而每一個小方格,皆有自己的座標,而np.meshgrid
這個方法,就是構建出x座標與y座標。而resolution則是每個點之間的距離。
以上面的程式碼為例:resolution值設為:0.02,也就是每一個點之間的距離為0.02,請看下方所印出的結果。
請看下面綠色的點,當我滑鼠移到那個位址時,(x, y) = (3.3188, 0.003)這個就跟上面np.meshgrid
x[0][0]=3.3, y[0][0]=0. 所產生出來的座標是相同的。
相同的右上角的點也是如此。
.ravel
可以把原本的向量拉平,再重新塑形。
Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
把Z印出來的話:
將Z和圖做對照,會發現到,-1, -1…的部分都是藍紫色、1, 1…是紅色,代表圖的顏色是由1, -1所構成。
最後將xx, yy, Z代入:
plt.contourf(xx, yy, Z, alpha=0.3, cmap=cmap)
x, y是整個圖的座標
z:繪製輪廓的高度值(類似等高線的概念)
alpha=0.3,顏色的透明程度。
如果有興趣也可以嘗試調整alpha的值,來觀察其中的不同~~
結論:
Perceptron Learning Algorithm的流程如下
Perceptron Learning Algorithm 對於可以「明顯」分開兩個不同類別的資料是很有幫助的。但是當資料之間有模糊地帶的話,或者說兩個類別之間沒有「明顯」的界線(Boundary)的話,又如果沒有規定「最大迭代次數」的話,執行Perceptron Learning Algorithm的程式,會不停地執行,形成無限迴圈。
下一篇,將會介紹其他方法,來避免此方法。
謝謝大家的閱讀,也希望大家能對PLA有更一步的理解。
文章如有任何錯誤,還請各位不吝指教~~
那就下次再見囉!
參考資料:
Python Machine Learning: Machine Learning and Deep Learning(章節2)