close

image

本週的最後,介紹多元分類所需要使用的演算法。

先前介紹的都是二元分類,因此數字只會有0或1兩種可能性,使用 cross entropy 等演算法,

但是如果要區分的類別並不是只有2類,而是更多,就比較複雜了。

這裡要引入的新概念叫做 softmax,如下面投影片的右邊,

softmax regression 和 logistic regression 在本質上是類似的,都是要讓輸出值的加總 = 1,

如果只有二元分類時,在算出其中一個輸出值為1的機率是多少之後,

該輸出值為0的機率就是1扣掉它是1的機率,即投影片中的0.71 和 1-0.71 =0.29。

Softmax 的運算形式則是如下 (投影片左下角也有): 

image

通常會把 softmax function 放在輸出層,目的是要把hidden layer 處理完的數值給重新處理,

分母是所有值經過指數函數運算後的加總,分子則是每一個類別各自經過指數函數運算後的數值,

因此可以看到投影片中每一個類別的分母都是一樣的,但是分子就是各自類別的數值。

image

在做 softmax regression 時,w1~w4 以及 b1~b4 就是演算法會不斷更新的部分,

只要這8個參數能夠學正確,理論上就能把四個類別各自的百分比給學正確。

 

image

接下來探討模型的評價機制: 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)。

image

在多元分類時這樣的手法依舊被沿用,寫為 loss = -log aj,

假設 aj 是1而model 也認為它是1的機率很高,則loss 會很低,反之則loss會不斷升高。

image

接下來,假定我們有10個分類,則在建構類神經網路時,需要把最後的輸出層設定為10個神經元,

10個類別各自代表的機率會因此而被輸出來,成為下面的形式。

image

在tensorflow 上的寫法和之前基本一致,

只不過要在輸出層的部分使用softmax function,

另外loss function 要使用 SparseCategoricalCrossentropy,Sparce 指的是每個物件只會屬於一個類別。

image

 

但是這樣的寫法可能在運算精度上會發生一些問題,稱之為numerical round-off error。

例如下面所示的 2/10000 的算法,如果使用更複雜的 1+(1/10000) - (1-10000),

明明對我們的腦袋而言會很直覺地視為2/10000,但是電腦卻會算成一個很逼近的0.0019999999...的數字。

image

會發生這個現象是因為在計算機中使用的浮點數 (floating point numbers) 在一些數字上只能以近似的方法來表示,

在儲存時,會用一定的位數來限制精度,如果計算式中的數值太大、大小、接近0等狀況,

計算過程中小數點後面的位數會被截掉,就形成所謂的 round-off error,

如果想要降低 round-off error 的發生,最簡單的做法就是減少運算的複雜度/次數,讓這種捨入的誤差能降低。

在softmax function 與 tensorflow 中的運用方法則如下所示: 

image

image

image

透過在 loss function 公式後面加一個 from_logits=True,同時把輸出層的activation function 改成 linear,

原本的作法是先把輸出值丟進 sigmoid function 做完轉換得到機率值之後,再拿去計算 loss (誤差), 

新的作法則先不經過這個轉換,直接告訴tensorflow 要使用 logits (logits 就是指未經轉換的輸出層的數值,即 z),

這樣會讓 tensorflow 更有彈性去決定他要怎麼去運算 loss 會得到更準的結果。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 William.Echoes 的頭像
    William.Echoes

    Echoes of a Distant Tide

    William.Echoes 發表在 痞客邦 留言(0) 人氣()