ヌルヌルコンピューター

機械学習、ニューラルネットワーク、その他色々と書くつもりですが三日坊主なので続かないかもしれません。あとまだ学士も取ってないへなちょこなので書いてある情報は正確性に欠いているかもしれません。てか多分間違いがいっぱいあります。何かありましたらご指摘お願いいたします。https://github.com/hirokik0811

Deep Gradient Compression (2)

前回の続き。

 

さて、Deep Gradient Compression を用いたDistributed Trainingの正確性を上げるために、論文中ではmomentum correction, local gradient clipping, momentum factor masking, そしてwarmup training という四つのテクニックを用いている。

 

まずmomentum correctionは、

http://ufldl.stanford.edu/tutorial/supervised/OptimizationStochasticGradientDescent/

によると、SGDによって最適化する関数(つまりloss function) が狭い谷のような形状をしているとき、通常のSGDだとgradientが最小値ではなく谷の傾斜の最も大きい点を向いてしまい、収束が極めて遅くなってしまう。

f:id:May-kwi:20171124152351p:plain

from http://www.stokastik.in/optimization-methods-for-deep-learning/

そこでweightの更新を、momentum  u_{t+1} = mu_t+\nabla_tを用いて、

 

 w_{t+1} = w_t-\eta u_{t+1}

 

とするのがmomentum SGDだ。

(ここで

 w_{t+1} = w_t-\eta (u_{t+1}

とするとNestrov SGDとなる。)

 

論文中ではvにさらにmomentumを加算していき、

 u_{t+1}^k = mu_t^k + \nabla_t^k

 v_{t+1}^k = v_t^k+u_{t+1}^k

 w_{t+1} = w_t - \eta \sum_{k=1}^N sparse(v_{t+1}^k)

 としている。

 

次にLocal Gradient Clippingを用いてGradient explosion を防いでいる。これはGradient のL2ノルムが閾値を超えた際にリスケールというものだ。通常LGCはepochごとに各ノードのgradientを全て加算してから適用されるが、DGCでは各ノードに局所的にgradientが蓄積されていくため、加算はせず個々にLGCを適用する。

 

さてあと二つのMomentum Factor Masking と Warm-up Trainingだが、これはどちらも錆び付いたgradientを排除するという目的で用いられている。DGCではgradientを一定期間Tの間ローカル側で加算し、まとめてサーバー側に送ってそれに基づいてweightを更新するため、古いgradientが学習に悪影響を及ぼす可能性がある。

そこでまずMFM

 U_t \leftarrow U_t \odot \neg Mask

 によって値の大きいgradientに対応するmomentumを排除して、学習に大きな影響を及ぼさないようにする。

さらに、Warm-up Training によって、学習初期に発生するトンデモgradient(すいません語彙力不足でなんて訳せばいいかわかりません。。。原文ではaggressive gradients と言ってます) の影響を抑える。これはただ単にlearning rateを動的にするというだけで、論文中では線形的にではなく指数関数的に増加させることで、より疎なgradients に対応できるとしている。

 

さて、論文中ではこの四つのテクニックを用いて、正確性において通常の学習を上回っており、さらに最大1/600にまで、伝達されるgradientの容量を減らすことができたとしている。

f:id:May-kwi:20171201142354p:plain

論文より

どうやってこれらの手法を思いついたのか論文中に全く書かれていないため、なかなかに魔法のような論文だ。しかも匿名というのがまたカッコいいよなあ。