Softmax 回歸
Softmax 回歸是邏輯回歸 (Logistic Regression) 的推廣,邏輯回歸適用於二元分類的問題,而 Softmax 回歸適用於多分類的問題。
為什麼會說 Softmax 回歸是邏輯回歸的推廣?這是因為當分類數量等於 2 時,Softmax 回歸與邏輯回歸是一致的,詳細推導可以看 Logistic and Softmax Regression。
Softmax 回歸是使用 Softmax 運算使得最後一層輸出的機率分佈總和為 1,舉一個例子,假設我們要辨識手寫數字 0~9,輸入一張數字的影像後,經由 Softmax 回歸,最後將會輸出該影像屬於 0 ~ 9 個別的機率為何,且其個別的機率總和為 1。
Softmax 函數通常會放在類神經網路的最後一層,將最後一層所有節點的輸出都通過指數函數 (exponential function),並將結果相加作為分母,個別的輸出作為分子。
手寫辨識實作
手寫辨識是一個非常經典的深度學習入門範例,該範例是輸入一張手寫數字 0 ~ 9 的影像,並且通過類神經網路預測該影像為 0 ~ 9 哪一個數字。
在 Softmax 回歸這個例子中,我們使用的是 TensorFlow 官方提供的 MNIST 資料集,MNIST 資料集中的影像是 28 x 28 = 784 的手寫數字影像,如果將其中一張影像的像素 (pixels) 以矩陣的方式呈現,可以看到那些數值所呈現的形狀即是手寫數字的形狀,所以我們將利用這些數值來預測手寫數字。
引入 TensorFlow 與 MNIST 資料集
首先,引入建立類神經網路模型的框架 TensorFlow,以及從 TensorFlow 的範例資料集中引入 MNIST (Modified National Institute of Standards and Technology database),同時對影像的 labels 做 One-hot encoding。
第一次讀取 MNIST 的資料集時,會自動將資料下載至 ./MNIST_data 中,下次讀取時,程式會直接從已經下載的資料中讀取。
什麼是 One-hot encoding?
One-hot encoding 是將類別以 (0, 1) 的方式表示,舉例來說,假設有 cat、dog、bird 三個類別,而三個類別可以用 (1, 0, 0)、(0, 1, 0)、(0, 0, 1) 來表示。
之所以用 One-hot encoding 的原因是,一般來說,我們在做 Classification 時,其資料的 label 是用文字代表一個類別,例如做動物的影像辨識,label 可能會是 cat、dog、bird 等,但是類神經網路皆是輸出數值,所以我們無法判斷 34 與 cat 的差別。因此,One-hot encoding 便是在做 Classification 經常使用的一個技巧。
雖然 One-hot encoding 經常在 Classification 中被使用,但是它不是沒有缺點,假設欲分類的類別過多,可能會造成「維數災難」的問題。
定義類神經網路模型
MNIST 的影像是 28(width)×28(height)=784 (pixels),所以我們定義輸入層 x
為 784 個節點;而 0~9 有 10 個類別,則定義輸出層 y_
為 10 個節點。
因為 Softmax 回歸是一個單層的類神經網路模型,所以我們只要定義一個 W
跟 b
,以及類神經網路運算的流程 y
。
定義超參數
超參數是訓練類神經網路時,需要手動設定的參數。
lr (learning rate):更新參數的步幅。
batch size:每次的迭代,送入類神經網路的資料數量。
epochs:訓練的迭代次數。
但是為了讓模型有更好的泛化能力,所以有時會在訓練時動態更新超參數,尤其是 learning rate,現今經常被使用的優化器 Adam 即是會在訓練時動態更新 learning rate。
損失函數(Loss Function)
在 Softmax 回歸這個例子,所使用的損失函數是交叉熵(Cross Entropy) 。交叉熵是評估兩個機率分配(distribution) 有多接近,如果兩著很接近,則交叉熵的結果趨近於 0;反之,如果兩個機率分配差距較大,則交叉熵的結果趨近於 1。
而訓練模型的目的是讓損失函數 —— cross entropy 的數值最小化,亦即使得輸出預測的機率愈接近真實機率。
不知道你有沒有發現,在先前我們並未定義 Softmax 的運算,這是因為 TensorFlow 提供了結合 Softmax 與 Cross Entropy 的函式,讓我們可以一次做到這兩件事,而且 softmax_cross_entropy_with_logits
提供更穩定的數值。
如果自己定義 Softmax 時要特別注意數值爆炸的問題,例如 e⁵⁰ 在 Python 中能否被儲存的問題?
優化器(Optimizer)
我們選擇的優化器是常見的梯度下降,如果想要使用 Adam、Adagrad 或是其他的優化器也可以,它們都是基於梯度下降改良的版本,一般來說都有助於訓練模型。
切記,沒有最好的優化器,只有適合的優化器。
訓練神經網路
在訓練類神經網路之前,我們先定義計算準確度的運算。首先,判斷預測值與真實值是否一樣,correct_prediction
是一個 [True, False]
的陣列,再經由計算平均 (True
=1,False
=0),就可以得到準確度 accuracy
。
最後,啟動 Session 與計算圖溝通,開始訓練類神經網路的模型。在這個範例中,每次都會將 100 筆的手寫影像送進 placeholder
中,通過 Mini-batch SGD 優化類神經網路的參數。
經過 1000 次的訓練之後,準確率到達了 0.92,你覺得很好嗎?其實不盡然,因為我們使用的是一個非常簡單的模型,只有單層的神經網路。
TensorFlow 的官方證實現今最好的模型準確率高達 0.997,如果想要知道更多的訊息可以觀看這個連結。
結語
Softmax 回歸是一個多分類的類神經網路結構,我們可以使用它快速建立一個手寫辨識的模型,準確率最高可以達到 0.92。如果想要讓準確率更高,也許可以嘗試增加類神經網路的層數,或是調整超參數,甚至可以嘗試其他的網路模型,例如:CNN。
在這個範例中,我們並未談到許多的數學證明與推導,有興趣更加深入的人,可以繼續鑽研在文中提到的數學式,讓你對深度學習有更近一步的認識。
參考閱讀
- MNIST For ML Beginners
- What is Softmax Regression and How is it Related to Logistic Regression?
- Logistic and Softmax Regression