閱讀筆記 - Deep Learning - chap 2 -1
前篇 : Deep Learning chap 1-1
這章開始介紹神經網路, 開頭有段文字
在這篇看到了最後一句話 :
"Java是囉唆的語言著稱(笑),Java本身沒有支援Operation Overloading),這點對於這種一堆數學運算真的很不方便。相對的Python就好很多,其實好像現在要找到不支援Operation Overloading的語言還真的不多(再笑)。如果要在JVM上面開發類似的應用,也許Scala會好一點。"
而這本書第九章的部分, 也有提到 Scala,
PS: 剛查了一下, swift 是有 operator overloading 的,
而目前 swift 已經進入第四版
==
先從 一層的開始看起.
也就是假設神經元基本構造 :
z=w1∗x1+w2∗x2+...+wn∗xn+bias
再透過activation function做非線性轉換輸出得到結果o
這種可以用來做線性 logitic 分類器
(1) MP模型 ( 後面會提到; 是 McCulloch 與 Pitts 所提出的 神經網路 內所用的 )
(2) 符號模型 - Sign
(3) sigmod : 可消除 MP 模型 和 符號 模型中 不可微分 的奇點
==
我們可以對照 程式人雜誌 2014 年的單層感知器實作
1943 年時, McCulloch 與 Pitts 提出 的神經網路模型 ( MP model )
( 時間過好快, 快百年前了... T_T )
仿照這個, 寫了 Java 的 神經網路訓練程式 - github
在神經網路內, 最重要的是 model 的 weight 值 訓練.
model:
Y = sign( w0 * (-1) + w1 * x1 + w2 * x2 )
所以在這個 Slp.java, Y 值計算
這邊因為 RealVector / RealMatrix 的 資料 是 double.
但結果是 1 或 0 的整數, 所以我先把 Y 值 做 round(),
意外發現這方式需要的 loop 收斂, 比原本範例少. ( 17 次, 原本 >30)
這模型另一個重點是, weight 值的調整.
一開始 weight : [ 1 , 0 , 0 ]
每次調整方式 , 看計算結果和正確值的差值 err
delta weight[i] = err * x[i] * rate
rate 這邊設定是 0.01, 設定越小 每次調整幅度越小
這樣多次訓練 ( train_times ), 讓誤差總和 ( 所有 train data 誤差的平方值總和 )
小於所定的 誤差標準時 (errta ), 就表示訓練成功了
這樣訓練過後, 之後不用重新訓練, 可以直接運算結果
JNN.java
AndOP.java
執行結果:
可以發現, 這個一階的神經網路模型, 並無法 訓練 XOR 運算
Finished training susccessfully: loops=17
weight={0.83; 0.17; 0.17}
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Finished training susccessfully: loops=12
weight={0.69; 0.19; 0.19}
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
XorOP is not trained
0 XOR 0 = -1
XorOP is not trained
0 XOR 1 = -1
XorOP is not trained
1 XOR 0 = -1
XorOP is not trained
1 XOR 1 = -1
===
下回繼續看看 multi-layer perception 以及
這章開始介紹神經網路, 開頭有段文字
With your feet in the air and your head on the ground
Try this trick and spin it, yeah
Your head will collapse
But there’s nothing in it
And you’ll ask yourself
Where is my mind
---- The Pixies, “Where is My Mind?”
廣義來說, 神經網路也算是一種仿生設計.
==
有一個用 Java 轉寫 11 行 python 範例
( python 的範例也蠻值得看的, 從 2 layers 開始介紹起 )
( python 的範例也蠻值得看的, 從 2 layers 開始介紹起 )
另外, 很多都推薦林軒田的機器學習,
在他的機器學習技法中, 第十二章開始提到神經網路 - youtube
在這篇看到了最後一句話 :
"Java是囉唆的語言著稱(笑),Java本身沒有支援Operation Overloading),這點對於這種一堆數學運算真的很不方便。相對的Python就好很多,其實好像現在要找到不支援Operation Overloading的語言還真的不多(再笑)。如果要在JVM上面開發類似的應用,也許Scala會好一點。"
而這本書第九章的部分, 也有提到 Scala,
PS: 剛查了一下, swift 是有 operator overloading 的,
而目前 swift 已經進入第四版
==
先從 一層的開始看起.
也就是假設神經元基本構造 :
再透過activation function做非線性轉換輸出得到結果o
這種可以用來做線性 logitic 分類器
==
activation function :(1) MP模型 ( 後面會提到; 是 McCulloch 與 Pitts 所提出的 神經網路 內所用的 )
(2) 符號模型 - Sign
(3) sigmod : 可消除 MP 模型 和 符號 模型中 不可微分 的奇點
==
我們可以對照 程式人雜誌 2014 年的單層感知器實作
1943 年時, McCulloch 與 Pitts 提出 的神經網路模型 ( MP model )
( 時間過好快, 快百年前了... T_T )
仿照這個, 寫了 Java 的 神經網路訓練程式 - github
在神經網路內, 最重要的是 model 的 weight 值 訓練.
model:
Y = sign( w0 * (-1) + w1 * x1 + w2 * x2 )
所以在這個 Slp.java, Y 值計算
這邊因為 RealVector / RealMatrix 的 資料 是 double.
但結果是 1 或 0 的整數, 所以我先把 Y 值 做 round(),
意外發現這方式需要的 loop 收斂, 比原本範例少. ( 17 次, 原本 >30)
這模型另一個重點是, weight 值的調整.
一開始 weight : [ 1 , 0 , 0 ]
每次調整方式 , 看計算結果和正確值的差值 err
delta weight[i] = err * x[i] * rate
rate 這邊設定是 0.01, 設定越小 每次調整幅度越小
這樣多次訓練 ( train_times ), 讓誤差總和 ( 所有 train data 誤差的平方值總和 )
小於所定的 誤差標準時 (errta ), 就表示訓練成功了
這樣訓練過後, 之後不用重新訓練, 可以直接運算結果
JNN.java
AndOP.java
執行結果:
可以發現, 這個一階的神經網路模型, 並無法 訓練 XOR 運算
Finished training susccessfully: loops=17
weight={0.83; 0.17; 0.17}
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Finished training susccessfully: loops=12
weight={0.69; 0.19; 0.19}
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
XorOP is not trained
0 XOR 0 = -1
XorOP is not trained
0 XOR 1 = -1
XorOP is not trained
1 XOR 0 = -1
XorOP is not trained
1 XOR 1 = -1
===
下回繼續看看 multi-layer perception 以及
back propagation - 反向傳播算法
林軒田的機器學習 , 這個我看了三集了喔!
回覆刪除高手推薦另一個 http://speech.ee.ntu.edu.tw/~tlkagk/research.html