back to index
【機器學習2021】類神經網路訓練不起來怎麼辦 (四):損失函數 (Loss) 也可能有影響

link |
好,那接下來呢,我們要講有關分類怎麼做這件事情。
link |
這邊講的是一個短的版本,因為時間有限的關係,
link |
所以我們就講一個可以在20分鐘內講完的短的版本。
link |
如果你想要看長的版本的話,可以看一下過去上課的錄影,
link |
可能是花兩個小時到三個小時的時間才講完分類這件事情。
link |
我們這邊用一個最快的方法,直接跟你講分類是怎麼做的。
link |
分類是怎麼做的呢?我們已經講了regression,
link |
就是輸入一個項量,然後輸出一個數值,
link |
我們希望輸出的數值跟某一個label,
link |
也就是我們要學習的目標,越接近越好。
link |
有同學會問說,為什麼目標label有加head,
link |
你可能在別的地方有看過輸出有加head。
link |
那這邊的notation,它的使用並沒有一定的規定,
link |
你就會去問別的老師說,為什麼model的輸出有加head,
link |
所以我們這門課呢,如果是正確的答案就有加head,
link |
那有一個可能,假設你會用regression的話,
link |
我們其實可以把classification當作是regression來看。
link |
怎麼說呢?那這個方法不一定是一個好方法,
link |
我們的輸出仍然是一個scalar,它叫做y。
link |
然後這個y,我們要讓它跟正確答案的class越接近越好。
link |
但是y是一個數字啊,我們怎麼讓它跟class越接近越好呢?
link |
舉例來說,class1就是編號1,class2就是編號2,class3就是編號3。
link |
然後接下來呢,我們要做的事情就是希望y可以跟class的編號越接近越好。
link |
如果你仔細想想的話,這個方法也許在某些狀況下是會有瑕疵的。
link |
因為如果你假設說class1就是編號1,class2就是編號2,class3就是編號3,
link |
意味著說你覺得class1跟class2它是比較像的。
link |
然後class1跟class3它是比較不像的。
link |
那像這樣子的表示class的方式,有時候可行,有時候不可行。
link |
假設你的class1,2,3真的有某種關係,
link |
舉例來說,你想要根據一個人的身高跟體重,
link |
然後預測他是幾年級的小學生,一年級、二年級還是三年級。
link |
那可能一年級真的跟二年級比較接近,一年級真的跟三年級比較沒有關係。
link |
但是假設你的三個class本身並沒有什麼特定的關係的話,
link |
你說class1是1,class2是2,class3是3,那就很奇怪了,
link |
因為你這樣預設說1,2有比較近的關係,1,3有比較遠的關係。
link |
所以怎麼辦呢?當你在做分類的問題的時候,
link |
比較常見的做法是把你的class用one-half vector來表示。
link |
那one-half vector我們在作業1的時候有看過,對不對?
link |
我們在作業1的時候說,我們把美國的州用one-half vector來表示。
link |
那同樣的道理,我們也可以把每一個class用一個one-half vector來表示。
link |
如果有三個class,我們的label這個whitehead就是一個三維的向量。
link |
然後呢,如果是class1就是100,如果是class2就是010,如果是class3就是001。
link |
所以每一個class你都用一個one-half vector來表示,
link |
而且如果你用one-half vector來表示的話,就沒有說class1跟class2比較接近,
link |
class1跟class3比較遠這樣子的問題。
link |
如果你把one-half vector拿來算距離的話,class之間兩兩他們的距離都是一樣的。
link |
好,那接下來呢,如果我們今天的目標whitehead是一個向量,
link |
比如說這邊whitehead是有三個element的向量,三個數值的向量,
link |
那我們的network也應該要output三個數值才行。
link |
那到目前為止我們講的network其實都只output一個數值,
link |
因為我們過去做的都是regression的問題,所以只output一個數值。
link |
那怎麼把它改成output三個數值呢?
link |
其實從一個數值到三個數值它是沒有什麼不同的啦。
link |
怎麼說呢?你可以output一個數值,你就可以output三個數值。
link |
所以把本來output一個數值的方法重複三次,你把a1、a2、a3乘上三個不同的位加上bias得到y1,
link |
再把a1、a2、a3乘上另外三個位再加上另外一個bias得到y2,
link |
把a1、a2、a3再乘上另外一組位再加上另外一個bias得到y3,
link |
所以你就可以input一個feature的vector,然後產生y1、y2、y3,
link |
然後期待y1、y2、y3跟我們的目標越接近越好。
link |
所以我們現在知道了regression是怎麼做的。
link |
input x, output y, yout跟label y hat越接近越好。
link |
如果是classification呢?我們剛才說input x可能乘上一個w再加上b,
link |
再通過activation function再乘上w'再加上b'得到y。
link |
我們現在的y它不是一個數值,它是一個向量。
link |
但是在做classification的時候,
link |
我們往往會把y再通過一個叫做softmax的function得到y'.
link |
然後我們才去計算y'跟y hat之間的距離,
link |
才去說我們要讓y'跟y hat越接近越好。
link |
我們會先從generative的model開始講起,
link |
然後一路講到logistic regression,
link |
你就會知道為什麼這邊放個softmax,它有什麼樣的歷史淵源。
link |
所以就有點不知道要怎麼解釋說為什麼要放softmax。
link |
這個y hat它裡面的值都是0跟1,對不對?
link |
它是one-hot vector,所以裡面的值只有0跟1。
link |
先把它normalize,移到0到1之間,
link |
如果你真的想要知道說為什麼要用softmax的話,
link |
那softmax它裡面是怎麼運作的呢?
link |
這是這個softmax的block,
link |
我們會先把所有的y取一個exponential,
link |
反正取完exponential以後,
link |
取exponential以後,也變成正的。
link |
除掉所有y的exponential值的和,
link |
y1取exponential、y2取exponential、y3取exponential,
link |
把它全部加起來,得到一個summation,
link |
得到一個summation,放在分母地方的summation。
link |
接下來再把exponential y1除掉summation,
link |
exponential y2除掉summation,
link |
exponential y3除掉summation,
link |
你就會發現說這個y1'、y2'、y3'
link |
本來y1等於3、y2等於1、y3等於負3。
link |
就變成exponential3就是20,
link |
exponential1就是2.7,
link |
exponential負3就是0.05。
link |
做完normalization以後,
link |
那這邊是考慮了三個class的狀況。
link |
你當然可以直接套summax這個function,
link |
那summax當然做在兩個class上
link |
兩個class的時候就用sigmoid,
link |
我要讓這個距離是mean squared error
link |
就是把y'裡面的每一個element拿出來,
link |
把y'裡面的每一個element拿出來,
link |
當minimize mean squared error的時候,
link |
我們先來看看這個cross entropy的式子
link |
它是summation over所有的i,
link |
乘上y'的第i位取natural log,
link |
你也可以minimize cross entropy的值。
link |
cross entropy也會是最小的。
link |
但是為什麼會有cross entropy
link |
minimize cross entropy
link |
其實就是maximize likelihood這個東西,
link |
我們even把likelihood拿掉了,
link |
我們就不能說minimize cross entropy
link |
為什麼是maximize likelihood,
link |
因為其實不知道likelihood是什麼。
link |
maximize likelihood跟minimize cross entropy
link |
我們在訓練一個classifier的時候
link |
應該要maximize likelihood,
link |
我們應該要minimize cross entropy。
link |
我們應該要用cross entropy呢?
link |
cross entropy比mean squared error
link |
相較於mean squared error
link |
是更常用在classification上面的。
link |
cross entropy跟softmax
link |
你只要call cross entropy
link |
你應該也定義了softmax這個function
link |
為什麼?它放在cross entropy裡面
link |
這個loss function的時候
link |
PyTorch自動幫你把softmax
link |
你自己在network加softmax的時候
link |
softmax跟cross entropy
link |
為什麼cross entropy比較好
link |
1可以是mean square error
link |
設定為mean square error
link |
而且在我們1是mean square error
link |
所以不管是對mean square error
link |
如果我們選擇cross entropy
link |
但如果你選mean square error的話
link |
自己在做classification
link |
你選mean square error的時候
link |
在你沒有好的optimization
link |
它learning rate會自動幫你調大
link |
就算是loss function的定義
link |
直接把error surface炸平
link |
居然可以改變optimization的難度