他有點發(fā)愁,這該怎么設(shè)置Epoch數(shù)呢?
在糾結(jié)的過程中,他突然想到:干嘛非得定一個Epoch數(shù)?只要對每個Batch進行獨立同分布抽樣 (IID Sampling)不就得了。
為了驗證這個想法,調(diào)參俠去看了很多論文。發(fā)現(xiàn)越來越多的人介紹他們的訓(xùn)練方法時,只說進行了多少個Iteration,而拋棄了Epoch。
他想到,Epoch暗示并強調(diào)了數(shù)據(jù)集是有限的,這不僅麻煩,還有潛在的“危害”。把Epoch去掉,讓循環(huán)嵌套的層數(shù)少一層總是好的。
于是他在Reddit發(fā)起了討論:Epoch是不是過時了,甚至還有危害?
有人對這個觀點表示贊同:
挺有道理,當(dāng)數(shù)據(jù)集大小有很大差距,Batch大小相同時,設(shè)置一樣的Epoch數(shù),豈不是大數(shù)據(jù)集參數(shù)更新的次數(shù)多,小數(shù)據(jù)集參數(shù)更新次數(shù)少了,這似乎不對勁。
Epoch最大的好處是確保每個樣本被定期使用。當(dāng)使用IID抽樣時,你只要能想辦法確保所有樣本被同樣頻繁的使用就好了。
但調(diào)參俠覺得讓每個樣本被定期使用就是他懷疑的點,IID抽樣已經(jīng)確保分布相同了,再讓他們同頻率被使用就是一種誤導(dǎo)。
反對者認為:
不能因為你覺得車沒開在路的正中間就放開方向盤不管了,雖然大撒把不會改變你正好在路中間的概率,但它增加了方差。
調(diào)參俠最后總結(jié)道,這個爭議有點像統(tǒng)計學(xué)里的“頻率派 VS 貝葉斯派”,即認為數(shù)據(jù)集到底應(yīng)該是確定的還是不確定的。
調(diào)參俠還注意到,有人用Batch Loss做損失曲線。他認為這比Epoch Loss更有參考價值。
反對者覺得,你這個方式是挺好的,但Epoch依然有用。
因為即使在相同的硬件上,不同模型的算法效率不同也會帶來巨大差異。
像各種Transformer和CNN這種底層代碼實現(xiàn)都差不多,但是別的模型就可能有很不一樣。比如我們自己的CUDA LSTM實現(xiàn),至少和CudnnLSTM一樣快,比原版TensorFlow實現(xiàn)快4倍左右。
最后,有個網(wǎng)友以CV模型為例對這個話題做出精彩總結(jié),列了4種損失可視化方式,并介紹了什么情況該用哪個。
Loss/Epoch告訴你一個模型要觀察同一個圖像多少次才能理解它。
Loss/Iteration告訴你需要多少次參數(shù)更新。當(dāng)比較優(yōu)化器時這很有用,可以幫助你加快訓(xùn)練速度或達到更高的精度。
Loss/Total Image Seen告訴你算法看到了多少圖像時的損失。適合比較兩種算法使用數(shù)據(jù)的效率。
如果你的算法在50萬張時達到70%、100萬張時達到75%,這可能比50萬張時達到50%,100萬張時達到80%的還要好。
另外,它還消除了Batch Size的影響。這允許在不同GPU上訓(xùn)練的具有不同Batch Size的模型之間進行公平地比較。
Loss/Time也很重要,因為如果一個新模型減少了100個Epoch,但每個Iteration都慢100倍,我就不會選擇這個模型。
雖然Loss/Time關(guān)系到硬件的具體表現(xiàn),不夠精準,我不會把這個寫到論文里。但在自己的機器上這是很好的評估模型的參數(shù)。
有網(wǎng)友提出,數(shù)據(jù)增強 (Data Augmentation)時Epoch也有點多余。因為數(shù)據(jù)集太小,人為給每個樣本添加很多只有微小差距的版本,沒必要讓他們被同頻率使用。
反對者認為,數(shù)據(jù)增強作為正則化的一種形式減少了過擬合,但你引入的實際信息在訓(xùn)練模型時仍然局限于原始數(shù)據(jù)集。如果你的原始數(shù)據(jù)集足夠小,Epoch表示你向模型展示了整個訓(xùn)練集,仍然是有意義的。
有人問道:
你是想表達“紀元(Epoch)”的紀元結(jié)束了嗎?
調(diào)參俠:
對,現(xiàn)在是“時代(Era)”的時代。