Re: [問題] batch size過大時,為什麼容易overfittin
想像一個極端的情況,你在做梯度修正時,如果每次都是拿所有數據餵進去,然後再做修正,這意味著你每次送進去的數據都是一樣的,沒有任何隨機性,所以你在N維空間中走向優化解的路徑會是一條確定的路徑,不存在隨機性。
深度學習的優化解本身是個非凸問題,本質上是NP hard,你能做的是盡可能走遍歷個空間來尋找相對最優解,所以如果你使用GD(即,使用全數據做修正),你對空間的探索性就等於0,你的模型會直直的奔向最靠近起始值的local min,所以除非你運氣很好,不然你自然很容易會陷入局域最優出不來。
另一個極端是,你每次只用一個sample來做修正,每次取那個sample做修正是隨機的,這好處是你會引入最多的隨機性,所以你可以想像成系統走向最優解的過程是類似布朗運動,大方向是往local min走,但是整個過程是搖搖晃晃的,如同醉漢走路,所以你比較有機會探索到較大的空間,這就是隨機梯度下降法,SGD。
事實上在沒有GPU的時代,大家都是用SGD的,但是GPU出來以後,為了盡可能利用GPU的優勢,大家才開始引入mini batch GD,犧牲掉一些隨機性換取效率。
至於batch size該用多少?目前的文獻大致的說法是,在訓練初期最好選擇2-32之間,透過較大的隨機性,讓系統盡可能搜索較大的空間,等系統開始傾向收斂,我們就不希望隨機性這麼大,免得模型又跳出去,變得很難收斂,所以會把batch size調大,降低隨機性,從數百到一兩千都是可接受的,看你的數據量而定。
其實透過隨機性來增加模型的泛化能力是深度學習裡常見的做法,例如添加noise layer,例如dropout,甚至引入L1, L2正規化某方面也可視為引入噪音,SGD自然也是在這個體系下的做法之一。
但說歸說,在真的數據量大的時候,為了加速訓練,在訓練初期就把batch size用上好幾千的文獻也不少,只是這樣做通常需要搭配其他精巧的設計來避免上述問題。
-----
Sent from JPTT on my Asus ASUS_Z017DA.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 67.161.8.79
※ 文章網址: https://www.ptt.cc/bbs/DataScience/M.1543717965.A.62A.html
推
12/02 12:29,
6年前
, 1F
12/02 12:29, 1F
推
12/02 13:17,
6年前
, 2F
12/02 13:17, 2F
推
12/02 13:33,
6年前
, 3F
12/02 13:33, 3F
推
12/02 15:26,
6年前
, 4F
12/02 15:26, 4F
→
12/02 15:28,
6年前
, 5F
12/02 15:28, 5F
→
12/02 15:29,
6年前
, 6F
12/02 15:29, 6F
推
12/03 01:58,
6年前
, 7F
12/03 01:58, 7F
推
12/10 02:11,
6年前
, 8F
12/10 02:11, 8F
→
12/10 23:38,
6年前
, 9F
12/10 23:38, 9F
→
12/14 11:15,
6年前
, 10F
12/14 11:15, 10F
→
12/14 11:16,
6年前
, 11F
12/14 11:16, 11F
→
12/15 16:59,
6年前
, 12F
12/15 16:59, 12F
→
12/15 17:00,
6年前
, 13F
12/15 17:00, 13F
→
12/15 17:06,
6年前
, 14F
12/15 17:06, 14F
→
12/15 17:07,
6年前
, 15F
12/15 17:07, 15F
推
08/22 18:51,
6年前
, 16F
08/22 18:51, 16F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 2 之 3 篇):
DataScience 近期熱門文章
PTT數位生活區 即時熱門文章