這個(gè)問(wèn)題很多人在訓(xùn)練自己或者遷移別的網(wǎng)絡(luò)的時(shí)候都會(huì)遇到尽纽,特別是二分類這樣的簡(jiǎn)單網(wǎng)絡(luò)夏志,感覺無(wú)處著手乃坤,都他媽的是對(duì)的,就是Loss不動(dòng)。到底什么原因了湿诊?吐槽的網(wǎng)址很多狱杰。比如這里,或者這里。若想知道解決辦法厅须,請(qǐng)直接跳到文章最后浦旱。
-
0.69是個(gè)什么數(shù)?
一般采用的都是cross entropy loss value,定義如下:
發(fā)現(xiàn)就是網(wǎng)絡(luò)預(yù)測(cè)給出的二類概率向量為[0.5,0.5],也就是a和1-a都是0.5九杂,不管y取值0/1,整個(gè)的平均loss就是-ln(0.5)=0.69.
-
為啥a老是為0.5呢宣蠕?
a的值是softmax的輸出例隆,在二分類的情況下為0.5,表明輸入softmax的值x是(近似)相等的抢蚀。
進(jìn)一步觀察發(fā)現(xiàn)镀层,x幾乎都很小,隨著訓(xùn)練的進(jìn)行皿曲,還有進(jìn)一步變小的趨勢(shì)唱逢,可怕!
為啥Conv和Pooling網(wǎng)絡(luò)的輸出一直往0走
這個(gè)我是不清楚的屋休,可能是初始化參數(shù)太小坞古,可能是Relu形成的Dead node。于是我調(diào)整initializer劫樟,調(diào)整Relu為leaky-Relu痪枫。經(jīng)過(guò)這些處理,網(wǎng)絡(luò)能夠保證在前兩次Loss不為0.69叠艳,后面又回到了這個(gè)可怕的0.69奶陈。想到的方案統(tǒng)統(tǒng)不起作用,我甚至懷疑我是不是maximize loss 而不是 minimize loss附较。最終辦法
顯然不是我的loss寫錯(cuò)了吃粒,而是數(shù)據(jù)分布的問(wèn)題。調(diào)整初始化和激活函數(shù)無(wú)法間接保證與調(diào)節(jié)數(shù)據(jù)分布拒课,那我就強(qiáng)上了BN層徐勃,即,在網(wǎng)絡(luò)的最后某個(gè)位置加上Batch Normalization層操作捕发,歸一化強(qiáng)力保證其分布疏旨,果然徹底解決了0.69問(wèn)題。在此扎酷,不得不佩服前人在網(wǎng)絡(luò)發(fā)展過(guò)程中的巨大貢獻(xiàn)檐涝。
我想這才是解決0.69問(wèn)題的最終辦法。選擇不同的optimizer或者網(wǎng)絡(luò)組成,都極有可能失敗谁榜。