心情抒發
了解基礎numpy、pandas、matplotlib後我們就要進入深度學習了,我在進行深度學習的訓練的時候有時是使用linux作業系統,因為我的mac
M1在下載tensorflow的時候遇到很多問題,因為mac
M1和之前intel版本的mac不太一樣,之前的intel版本是x86架構的,但是mac
M1是arm架構的,我花了三天還是沒辦法在我的mac上下載tensorflow,因此我在做機器學習時有兩種做法,第一種是使用google的Colaboratory,另一種是使用linux,所以我幫我的ASUS灌雙系統,為何不直接用windows10呢?因為我比較喜歡mac,所以我有時會在mac上寫程式,再透過ssh的方式在linux上進行,在這裡不得不讚嘆mac的界面設計,光看到就很舒服,而linux的界面有點太舊了,看了有點不習慣,那廢話不多說就進入我們的Machine
Learning。 ## Linear Regression(線性回歸)design
所謂的線性回歸就是在觀察和歸納樣本的過程中向量和函數值呈現線性的關係,那這種關係可以用一個關係式來表達:
Formula: Y = X1*W1 + X2*W2 + B
其中W和X都是矩陣,代表我們的參數可以不只一個,W代表Weights(權重),B代表Bias(偏移量)。
而運用這個公式有一個缺點,就是它的數值會介於正無限大到負無限大,所以這時候會加入活化函數,這個我稍後再提。
然而我們在進行機器學習有一個很重要的目標,就是讓Loss變小,什麼是Loss呢?我來粗略的介紹一下,在解釋前先看看這兩個關係式:
1. MSE(Mean-Square Error) 2. MAE(Mean-Absolute Error)
我們在做機器學習的時候希望計算機幫我們做預測的時候誤差值越低越好,總不能我們叫它預測一個一次函數,結果它算出來的答案是三次函數吧,所以Loss是在計算電腦在進行運算時的誤差值,我們稱之為loss
function,loss function有很多種,而我目前只略懂這兩種。
首先來說MSE(Mean-Square
Error),MSE顧名思義,均方誤差(MSE)計算的是預測值和實際觀測值間差的平方的均值。它只考慮誤差的平均大小,不考慮其向量,前面有提到y
= f(x) =
wx+b,這個y是我們預測的值,而我們要減去真實數據,即可得到差值,但為何要平方?因為我們的差值有可能是負的,怕會到時相消,所以這裡將它平方,可以保證為正值,但MSE方法仍然有個小問題,在「單位的解釋」上我們有點難以解釋數據,例如身高的平方的意義是?此時我們會使用RMSE(Root
Mean Squared Error)將它開根號。
接著來說MAE(Mean-Absolute
Error),其實MAE和MSE觀念很像,那觀念一樣的地方我就不多做贅述,MAE和MSE的關係上只差在一個是平方,另一個則是取絕對值,既然如此為何要分這兩種呢?老實說我也不太能理解,我在網路上看資料的時候他是這樣說的,「會有「在等於0時」不可微分的問題,不可微分會有什麼問題?
簡單來說,我們會沒辦法透過微分決定ML模型的修正方向。」對於微分我不是很理解,因為正在寫此篇的我還是小高一,但也無妨,實際上在做微分這運算的不是我,而是計算機,所以我也不用太著急,但MAE完全不能使用嗎?
倒也不完全是不能用,它也是有他的優勢的,那優勢在哪,有機會再來說吧!
處理機器學習的三大步驟
在進行ML的時候常常會因為其中的一個步驟做的不好而導致訓練失敗,所以每個環節都是非常重要的。
首先第一個步驟是設定一個未知的函式,就如同Linear
regression那邊一樣,設定一個函式,再把參數加進去,算出y。
第二步,定義loss function,就如同前面所說的,後續會深入介紹。
第三步,optimization,這個步驟是很容易被遺忘的,而這個會在後面的例子中說到。
## nonlinear regression(非線性函數)
前面有提到活化函式,這個活化函式是用在線性回歸之後,這邊我使用sigmoid()函式做介紹,故公式會變成下面那個:
Formula: Y = Sigmoid(X1*W1 + X2*W2 + B)
sigmoid()是一個非線性函數,它的作用是在於使整個輸出保持在0~1之間。 ##
函數數值訓練 ### 首先先看個code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import tensorflow.compat.v1 as tfimport numpy as npimport matplotlib.pyplot as plttf.disable_v2_behavior() x = np.random.rand(200 ).astype(np.float32) y = x*0.5 +0.8 plt.plot(x,y,color = 'red' ) weights = tf.Variable(tf.random.uniform([1 ],-1.0 ,1.0 )) biases = tf.Variable(tf.zeros([1 ])) func = weights*x + biases loss = tf.reduce_mean(tf.square(func - y)) optimization = tf.train.GradientDescentOptimizer(0.5 ) train = optimization.minimize(loss) init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) for i in range (201 ): sess.run(train) if i % 10 == 0 : plt.scatter(x,x*sess.run(weights)+sess.run(biases)) print (i,sess.run(weights),sess.run(biases)) plt.show()
### output : 0
[0.96190155] [0.7515451] 10 [0.69052416] [0.6988468] 20 [0.5954242]
[0.7493372] 30 [0.5477933] [0.7746255] 40 [0.5239374] [0.7872911] 50
[0.5119891] [0.7936347] 60 [0.50600475] [0.79681194] 70 [0.50300753]
[0.79840326] 80 [0.50150627] [0.7992003] 90 [0.5007544] [0.79959947] 100
[0.5003779] [0.7997994] 110 [0.50018924] [0.7998995] 120 [0.5000948]
[0.7999497] 130 [0.50004745] [0.7999748] 140 [0.5000238] [0.7999874] 150
[0.50001186] [0.7999937] 160 [0.50000596] [0.79999685] 170 [0.50000304]
[0.7999984] 180 [0.50000155] [0.7999992] 190 [0.5000008] [0.7999996] 200
[0.5000004] [0.7999998]
注意:此輸出不是固定的!由於我們是設計這個程式讓計算機去學習,所以它每次的學習效果都不一樣,因此它每次的輸出會不一樣。