合成グラデーション-実用的なメリットは何ですか?


8

RNNで合成グラデーションを使用する2つの動機を見ることができます。

  1. 予測された勾配で各レイヤーを即座に修正することにより、トレーニングをスピードアップします
  2. より長いシーケンスを学習できるようにするため

どちらにも問題があります。注意してください、私は合成グラデーションが本当に好きで、それらを実装したいと思います。しかし、私の考えの軌跡がどこで間違っているかを理解する必要があります。

ここで、ポイント1とポイント2が効果がないように見える理由を示します。実際に効果がある場合は、修正する必要があります。


ポイント1:

Synthetic Gradientsは、fwdプロップの間でも、別の「ミニヘルパーネットワーク」(DNIと呼ばれる)を使用して、現在のレイヤーに上からどの勾配が到達するかを通知できることを示しています。

ただし、このような勾配は、後でいくつかの操作を実行するだけです。DNIをトレーニングする必要があることを除いて、DNIを使用しない場合と同じ量のBackpropを実行する必要があります。

この非同期性を追加しても、デバイスで同じ数の計算を実行する必要があるため、従来の「ロックされた」フルfwdprop->フルバックプロップシーケンスよりもレイヤーのトレーニングが速くならないはずです。計算が時間内にスライドするだけです

これにより、1)は機能しないと思います。各レイヤーの間にSGを追加するだけでは、トレーニング速度は向上しません。

ポイント2:

では、最後のレイヤーにのみSGを追加して、「将来からの勾配」を予測し、それがforward propの最後のタイムステップである場合に限ってみましょう

このようにして、LSTMは予測を停止し、バックプロパゲートする必要がありますが、受信した将来の勾配を予測できます(最後のタイムステップにあるDNIの助けを借りて)。


いくつかのトレーニングセッション(セッションA、セッションB)を検討してください。

fwdprop timestep_1A ---> fwdprop timestep_2A ---> fwdprop timestep_3A ---->停止してbkprop!

fwdprop timestep_1B ---> fwdprop timestep_2B ---> fwdprop timestep_3B ---->停止してbkprop!

ネットワークに2つの半分の6つのタイムステップを「解析」するように強制しました。3つのタイムステップ、残りの3つのタイムステップです。

「セッションA」の最後にDNIがあり、セッションBの最初から(将来から)どのような勾配になるかを予測していることに注意してください。そのため、timestep_3Aには「timestep_1Bから得られたであろう」勾配が備わっているため、A中に行われた修正の信頼性が高くなります。

しかし、ちょっと!これらの予測された「合成勾配」はとにかく非常に小さい(無視できる)-結局、それが新しいbackprop セッションBを開始する理由です。それらが小さすぎないのではなく、6つのタイムステップすべてを単一の長いbkprop "セッションA"で解析するだけです。

したがって、ポイント2)もメリットをもたらすべきではないと思います。fwdpropの最後のタイムステップにSGを追加すると、長いシーケンスを効果的にトレーニングできますが、勾配の消失はどこにも行きませんでした。


OK。たぶん、別々のマシンで"セッションA""セッションB" などをトレーニングすることの利点を得ることができますか?しかし、これは通常のミニバッチを並行して単にトレーニングすることとどのように異なるのでしょうか?覚えておいてください、ポイント2で言及されました:物事はとにかく消えているsessionA予測勾配によって悪化します

質問:上記の2つの点は有益ではないようですので、合成グラデーションの利点を理解してください。


なぜこれはトレーニングをスピードアップしないと思いますか?私が見た唯一の正当化は、これが「トレーニング速度を改善するべきではない」という裸の主張ですが、あなたはあなたの推論を提供していません。また、質問にステップを記述していないため、「ステップ1)」の意味が明確ではありません。いずれにせよ、紙はそれがスピードアップを提供することを示しています。データはいつでも理論を上回っています。新聞を読みましたか?
2018年

データはいつでも理論を上回っていますが、私は同意しますが、私が作成できる最も良い反例は、GPU対CPUです。どこにいても、GPUはCPUよりも桁違いに高速で実行され、比較が行われると人々は言い続けています。ただし、適切にコード化されたマルチスレッドCPUは、同じカテゴリのGPUよりも2〜3倍遅く、GPUよりも安価です。larsjuhljensen.wordpress.com/2011/01/28/…もう一度、私は合成グラデーションに反対するつもりはありません-彼らは素晴らしいようです、それは私が私の投稿への回答を得ることができるまで、私は休むことができません:D
カリ

BLASTに関する7年前のブログ投稿がここでひどく関連しているとは思えません。
DW

私が言おうとしているのは、どのようなシナリオでも「並列処理を実際よりも優れた方法にする方法がある」ということです
カリ

回答:


2

しかし、ちょっと!これらの予測された「合成勾配」はとにかく非常に小さい(無視できる)-結局、それが新しいバックプロップセッションBを開始する理由です。それらが小さすぎないのであれば、1つの長いbkprop「セッションAで6つのタイムステップすべてを解析するだけです。 」

-それは必ずしも正しいとは限りません。メモリや計算速度などのハードウェアの制約のため、通常は切り捨てて新しいバックプロップを開始します。消失勾配は、勾配正規化-勾配ベクトルが特定のレイヤーを超えて小さすぎる場合は拡大、爆発しそうな場合は縮小など、他の方法で改善できます。または、バッチ正規化を使用する


DNIモジュールを更新する方法を理解することが重要です。わかりやすくするために、いくつかのレイヤーと3つのDNIモジュールを備えたネットワークの例を考えてみます。

 input
   |
   V
Layer_0 & DNI_0
Layer_1
Layer_2
Layer_3 & DNI_3
Layer_4
Layer_5 & DNI_5
Layer_6
Layer_7
   | 
   V
output

DNI_0は、常にで訓練された合成から到来勾配DNI_3さらにいくつかの層を立地、(Layer_2、そしてもちろんLayer_1流れます)。

同様に、DNI_3は常にDNI_5から到着する合成勾配でトレーニングされます

true gradはDNI_5にのみ配信され、それ以前には配信されないため、DNI_0またはDNI_3が実際のグラデーションを確認することはありません。

まだ理解に苦労している人は、この素晴らしいブログ記事、パート3を読んでください。

以前のレイヤーは、合成グラデーションのコンテンツである必要があります。これは、レイヤーまたはそのDNIが「真のグラデーション」を目にすることがないためです。


Synthetic Gradsによる並列化ではなく、ミニバッチとの並列トレーニングについて:

シーケンスが長い方がミニバッチよりも正確ですが、ミニバッチは調整効果を追加します。しかし、勾配の爆発や消失を防ぐためのいくつかの手法を考えると、より長いシーケンスをトレーニングすると、問題のコンテキストをより深く洞察することができます。これは、ネットワークがより長い入力シーケンスを考慮した後で出力を推測するため、結果がより合理的になるためです。

SGによって付与された利点の比較については、ペーパーの6ページの図を参照してください。主に、より長いシーケンスを解くことができます。これは、最も有益だと思います(とにかくミニバッチを介して並列化できるため、SGは速度を上げるべきではありません。同じマシンで実行した場合のプロセス-実際に次のDNIまでしか伝播しない場合でも)。


ただし、DNIモジュールが多いほど、信号のノイズが大きくなります。そのため、レガシーバックプロップによってすべてのレイヤーとDNIをトレーニングすることは価値があるかもしれません。そして、いくつかのエポックが経過した後でのみ、上記のDNIブートストラップの使用を開始します。

このようにして、最も初期のDNIは、トレーニングの開始時に何を期待するかについて、少なくともある程度の感覚を獲得します。これは、次のDNI自体が、トレーニング開始時に実際のグラデーションが実際にどのように見えるかわからないためです。そのため、最初は、それよりも前に座っている人には「ガベージ」グラデーションをアドバイスします。

著者はすべてのレイヤーの実際の入力を予測する実験も行ったことを忘れないでください。


レイヤーに高価なバックプロップがある場合(おそらく、バッチ正規化またはいくつかの派手なアクティブ化機能がある場合)、十分にトレーニングされていれば、DNIでの修正ははるかに安価になる可能性があります。DNIは無料ではないことを覚えておいてください。DNIは行列の乗算を必要とし、おそらく単純な密な層ではそれほど高速化されません。


ミニバッチは(並列化により)高速化し、正則化も行います。合成勾配を使用すると、長いシーケンスと(潜在的に)費用のかからない勾配で作業することで、より適切に推論できます。まとめると、これは非常に強力なシステムです。


0

合成勾配を使用すると、必要なエポックの数を減らしたり、勾配降下の収束を高速化したりするのではなく、各エポックの計算を高速化することで、トレーニングを高速化します。合成勾配は、実際の勾配よりも計算が高速です(合成勾配の計算は逆伝播よりも高速です)。そのため、勾配降下の各反復をより迅速に計算できます。


私の理解から、時間的に勾配はDNIに速く到達するべきではありません。それは、勾配が時間内にスライドされ、フォワードプロップの発生中に非同期で計算されるだけです。DNIは、それ自体をトレーニングするために真の勾配を取得する必要があります。したがって、合成勾配では、標準のBPTTの場合と同じ数の計算を並行して実行する必要があります。これは正しいです?
カリ

したがって、レイヤー間にSGを導入するだけではスピードアップはありません。はい、私たちはDNIからの即時予測勾配を得るかが、それぞれ、そのような予測のために、我々は最終的により代金を支払わなければならない非同期少し後、そのDNIの方にフルバックの伝播
カリ

@カリ、いや、それは私には正しく聞こえません。同じ数の反復が必要であるが、各反復がGPUで同じ50%少ない時間を費やす場合、結果の計算はより早く行われます。10%以上の反復/エポックが必要な場合でも(勾配が遅延するか、合成勾配が実際の勾配と完全に一致しないため)、それでもメリットがあります。実際の勾配よりも高速に合成勾配を計算できることによるスピードアップ他の効果を上回ります。これは役に立たないと確信しているように見えますが、紙のデータはそれが役立つことを示しています。
DWは

ええと、たとえば、DNIの後に4つの層があります。通常のバックプロップでは、レイヤー間に4つの「フォワード」交換があり、次に4つの「バックワード交換」があり、これが発生している間、システムはロックされます。DNIを使用すると、重みをすぐに修正できますが、後で真の勾配を取得する必要がありますが、システムはロックされていないため、当面の間は、より多くの前方パスをスライドできます。しかし、私たちは以前からの真の勾配をDNIに負っています...この勾配を取得してDNIに戻すには、100%の時間がかかります(前と同じ4ステップ、後と同じ4ステップ)。
カリ

私たちのDNIが「できれば、可能であれば後で与える」と言っているだけですが、それでも全額を支払う必要があるため、パフォーマンスの向上は見られません。私は同意します、論文は素晴らしい結果を示していますが、どうしてですか?とにかくすでにミニバッチを並行してトレーニングできます:/
Kari
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.