MegDet 大mini batch 檢測器

2021-08-20 23:15:55 字數 2119 閱讀 7575

megdet為face++ 提出的通用檢測框架。整體結構為類似於faster rcnn的2層結構,基礎網路類似於resnet50。

獲得了2017 coco檢測第一名,發表於cvpr 2018。

文章主要講解大mini-batch這個訓練技巧,實現了在大mini-batch下的精度提公升1.5個點。

小mini-batch的缺點:

(1)訓練時間太長。

(2)小的batch對於batch normalization 層的引數(mean,var)計算很不利。(mean,var)肯定是batch越大,計算的誤差越小,越接近整體資料的(mean,var)。group norm那篇文章中實驗的batch norm的最小值是16比較ok,小於16的batchsize會使得(mean,var)不準確。

(3)對於檢測框架中,小的batch中會存在正負樣本嚴重不平衡的現象。從下圖中可以看出,256-batch會比16-batch具備更大的正負樣本比例。

下圖(a)(b)為正負樣本比例較少的情形,(c)(d)為正負樣本比例較大的情況。可以看出,當正負樣本比例較大時,正樣本周圍的綠色框會更多更集中,更有利於對目標位置的回歸。

大mini-batch需要大的學習速率:

文章基於2方面做了解釋。

(1)基於linear scaling rule 原則,對於進行多機器訓練的大的mini-batch,假設batch size增加了k倍,準確的說應該是每個機器吃的batch size不變,增加了k倍的顯示卡,那麼學習速率也應該增加為原來的k倍,即learning_rate_hat=k*learning_rate。

(2)基於方差等價的原則。

原始batch size的方差計算如下:

當batch size 擴大為k 倍時,方差如下:

可以看出,當batch size 擴大為k 倍時,方差減少為原來的1/k。這時為了想要得到和原來一樣的方差,就得將現在的方差乘以k倍,但是現在的方差已經是確定的了。怎麼辦呢?

這時可以將學習率和現有的反差一起計算方差。

如上面式子,要想上下相等,只能是r_hat=k*r。即將學習率提高為原來的k倍,即learning_rate_hat=k*learning_rate。

寫到這裡還有乙個問題,為什麼可以將learning_rate*方差一起計算他們的方差。

不帶正則化的梯度跟新的公式是weight_decay=weight_decay-learning*step_weight

熱啟動策略(warmup strategy ):

不是簡單的直接將學習速率提高k倍,而是基於線性增長的原則(linear scaling

rule ),將學習速率一點一點的增大。直到達到k倍學習速率。

跨gpu的batchnorm:

從上圖可以看出,batch norm梯度跟新的策略為主從式的跟新。就是說,每個worker將計算mean,var的引數都傳遞到一台主機,主機計算完mean,var再分發給每個worker。感覺不像horovod這種 ring-all-reduce的環狀跟新策略好。

references:

megdet: a large mini-batch object detector

聯強EMBA 大者恆大!?

聯強emba 大者恆大!大者恆大 強者愈強 是我們看待乙個產業時經常採取的分析角度,從科技產業過去的發展軌跡來看,也的確存有這樣的情形。但是,大者恆大 是否真為市場競爭的鐵律?恐怕並不盡然如此!過去,規模越大的公司往往越具有競爭優勢,除了因為大公司較具知名度 累積較多的經營經驗與人才之外,其最大的優...

水大了,還是面大了?

早年間北方人過年的時候,有很多忌語的,凡是不好的字眼一律不許多。比如包餃子的時候,水少了不能說水少了,要說 面大了 麵少了呢,要說 水大了 總之不允許說 少 小 一類的字眼。我們固然宣稱自己是無神論者,也不信仰什麼宗教,但也沒必要對此上綱上線,因為這也是人之常情,古今中外皆是如此,外國人過聖誕節時也...

C 大整數除法 大整數乘法

l1 046.整除光棍 這裡所謂的 光棍 並不是指單身汪啦 說的是全部由1組成的數字,比如1 11 111 1111等。傳說任何乙個光棍都能被乙個不以5結尾的奇數整除。比如,111111就可以被13整除。現在,你的程式要讀入乙個整數x,這個整數一定是奇數並且不以5結尾。然後,經過計算,輸出兩個數字 ...