本週的最後,介紹多元分類所需要使用的演算法。
先前介紹的都是二元分類,因此數字只會有0或1兩種可能性,使用 cross entropy 等演算法,
但是如果要區分的類別並不是只有2類,而是更多,就比較複雜了。
這裡要引入的新概念叫做 softmax,如下面投影片的右邊,
softmax regression 和 logistic regression 在本質上是類似的,都是要讓輸出值的加總 = 1,
如果只有二元分類時,在算出其中一個輸出值為1的機率是多少之後,
該輸出值為0的機率就是1扣掉它是1的機率,即投影片中的0.71 和 1-0.71 =0.29。
Softmax 的運算形式則是如下 (投影片左下角也有):
通常會把 softmax function 放在輸出層,目的是要把hidden layer 處理完的數值給重新處理,
分母是所有值經過指數函數運算後的加總,分子則是每一個類別各自經過指數函數運算後的數值,
因此可以看到投影片中每一個類別的分母都是一樣的,但是分子就是各自類別的數值。
在做 softmax regression 時,w1~w4 以及 b1~b4 就是演算法會不斷更新的部分,
只要這8個參數能夠學正確,理論上就能把四個類別各自的百分比給學正確。
接下來探討模型的評價機制: cost function。
在二元分類時,loss function 就是 cross entropy equation,
寫成 loss = -y loga1 - (1-y)log(1-a1),
其含義在於當y=1時,loss 會只剩下 -log a1,在y=0時,loss 則是剩下 -log(1-a1)。
在多元分類時這樣的手法依舊被沿用,寫為 loss = -log aj,
假設 aj 是1而model 也認為它是1的機率很高,則loss 會很低,反之則loss會不斷升高。
接下來,假定我們有10個分類,則在建構類神經網路時,需要把最後的輸出層設定為10個神經元,
10個類別各自代表的機率會因此而被輸出來,成為下面的形式。
在tensorflow 上的寫法和之前基本一致,
只不過要在輸出層的部分使用softmax function,
另外loss function 要使用 SparseCategoricalCrossentropy,Sparce 指的是每個物件只會屬於一個類別。
但是這樣的寫法可能在運算精度上會發生一些問題,稱之為numerical round-off error。
例如下面所示的 2/10000 的算法,如果使用更複雜的 1+(1/10000) - (1-10000),
明明對我們的腦袋而言會很直覺地視為2/10000,但是電腦卻會算成一個很逼近的0.0019999999...的數字。
會發生這個現象是因為在計算機中使用的浮點數 (floating point numbers) 在一些數字上只能以近似的方法來表示,
在儲存時,會用一定的位數來限制精度,如果計算式中的數值太大、大小、接近0等狀況,
計算過程中小數點後面的位數會被截掉,就形成所謂的 round-off error,
如果想要降低 round-off error 的發生,最簡單的做法就是減少運算的複雜度/次數,讓這種捨入的誤差能降低。
在softmax function 與 tensorflow 中的運用方法則如下所示:
透過在 loss function 公式後面加一個 from_logits=True,同時把輸出層的activation function 改成 linear,
原本的作法是先把輸出值丟進 sigmoid function 做完轉換得到機率值之後,再拿去計算 loss (誤差),
新的作法則先不經過這個轉換,直接告訴tensorflow 要使用 logits (logits 就是指未經轉換的輸出層的數值,即 z),
這樣會讓 tensorflow 更有彈性去決定他要怎麼去運算 loss 會得到更準的結果。
留言列表