最近上課老師讓我們用Scratch實作感知器,其實本身不太喜歡用這種,但其實跟寫程式的邏輯是差不多的,Scratch的繪製本身就是坐標系,可以省下換算位置的公式,很直觀的將程式實作並繪製。
在神經網路其實已經介紹過了,這次就讓我們使用它來做簡單分類並且了解原理和實作感知器。
首先先回憶一下之前介紹的神經網路(NN)流程,這裡只多了前置步驟讓資料可視化。
這裡我選擇用神經網路提到的二元一次方程式來解說會比較明暸,在神經網路其實已經講過,這裡在更加詳細講解一次。
使用二元一次方程式ax + by + c = 0思考輸入乘上權重。
由上述特性可知a和b控制角度,c控制偏移量。
二元一次方程式轉神經網路,將a和b與x和y轉為向量矩陣做內積w * x + b = 0。
正向傳播
反向傳播(假設上層傳遞dout = [1, 1, 1] )
從正向步驟2反推回去計算變化(偏微分))。
帶入原公式:
db = 1。
dw = x。
最後使用梯度下降法(SGD)來去更新w -= lr * dw,b -= lr * db。
這邊再複習一次sigmoid推導公式。
sigmoid公式:f(x)=1/(1 + e^(-x))。
正向傳播
反向傳播(假設上層傳遞dout = [1])
方法一:從正向步驟4反推回去計算變化(偏微分))。
帶入原公式:
方法二:偏微分除法公式,帶入。
均方誤差函數:,0.5是為了偏微分所使用。
正向傳播
反向傳播(上層傳遞dout = 1)
方法一:從正向步驟3反推回去計算變化(偏微分))。
帶入原公式:dx = x – t。
方法二:偏微分公式
建立畫線方塊
建立畫點方塊
建立計算和畫出二元一次方塊
建立初始化資料方塊
建立初始化隨機點方塊
主要分兩類資料隨機取值,範圍如下x1∈[-180 ~ 180] ,
y1∈[10 ~ 170] ,x2∈[-180 ~ 180],y2 = [-10~-170],並且設定標籤1和-1
建立訓練方塊
前向傳播這邊使用sigmod因為數據為[-1, 1]因此要走訪每個數據(無法先針對單一更新到loss = 0,階梯函數則可以),loss大於0則計算反向傳播並且更新。
建立正向傳播方塊
帶入正向傳播公式輸入 * 權重->活化函數(因這裡沒使用輸出函數所以這邊直接加總再用活化函數)->損失函數。
建立反向傳播方塊
帶入反向傳播公式求”全部權重”的變化影響(偏微分)損失函數->活化函數。
建立更新增料方塊
使用"全部權重"計算每個權重反向傳播並且更新。
用起來其實算方便,但拉方塊的感覺還是不太喜歡,下次大概會教多層感知器或其他機器學習,有機會再跟大家分享。
[1]MNDTGhost.(2018) Perceptron感知器 from: https://scratch.mit.edu/projects/246182109/. (2018.10.04)
[2]MNGhost.(2018). [筆記]深度學習(Deep Learning)-神經網路學習 from: https://ithelp.ithome.com.tw/articles/10198796. (2018.10.04)