RNN:いつBPTTを適用するか、重みを更新するか?


15

音素分類に関するGravesの2005年の論文(とりわけ)を使用して、シーケンスラベリングへのRNNの高レベルの適用を理解しようとしています

問題を要約すると、個々の音素(無音、各オーディオファイルの各サンプルに音素記号が付けられるようにします。)

この論文の主旨は、隠れ層にLSTMメモリセルを持つRNNをこの問題に適用することです。(彼はいくつかのバリアントと他のいくつかの手法を比較として適用しています。私は今のところ、物事を単純に保つために、単方向LSTMにのみ関心があります。)

私はネットワークのアーキテクチャを理解していると思います。オーディオ作業の標準的な方法で前処理された、オーディオファイルの10 msウィンドウに対応する入力レイヤー。LSTMセルの非表示層、およびすべての可能な61個の電話記号のワンホットコーディングを備えた出力層。

LSTMユニットを通過するフォワードパスとバックワードパスの(複雑ですが簡単な)方程式は理解できたと思います。それらは単なる微積分と連鎖規則です。

この論文といくつかの類似の論文を数回読んだ後、私が理解していないのは、バックプロパゲーションアルゴリズムを正確に適用するタイミングと、ニューロンのさまざまな重みを正確に更新するタイミングです。

2つのもっともらしい方法が存在します。

1)フレーム単位のバックプロップと更新

Load a sentence.  
Divide into frames/timesteps.  
For each frame:
- Apply forward step
- Determine error function
- Apply backpropagation to this frame's error
- Update weights accordingly
At end of sentence, reset memory
load another sentence and continue.

または、

2)文ごとのバックプロップと更新:

Load a sentence.  
Divide into frames/timesteps.  
For each frame:
- Apply forward step
- Determine error function
At end of sentence:
- Apply backprop to average of sentence error function
- Update weights accordingly
- Reset memory
Load another sentence and continue.

これは、先のとがった(そして個人的に関連のある)例としてGravesペーパーを使用したRNNトレーニングに関する一般的な質問であることに注意してください。シーケンスでRNNをトレーニングする場合、バックプロップはすべてのタイムステップに適用されますか?ウェイトはタイムステップごとに調整されますか?または、厳密にフィードフォワードアーキテクチャでのバッチトレーニングの大まかな例えで、バックプロップと重みの更新が適用される前に、特定のシーケンスでエラーが累積および平均化されていますか?

それとも私は思っているよりももっと混乱していますか?

回答:


25

タイムステップごとに出力を生成するリカレントニューラルネット(RNN)について話していると想定します(出力がシーケンスの最後でのみ利用可能な場合、最後にbackpropを実行するだけで意味があります)。この設定のRNNは、シーケンスの「チャンク」を順番に操作して、時間を介したトランケーテッドバックプロパゲーション(BPTT)を使用してトレーニングされることがよくあります。手順は次のようになります。

  1. フォワードパス:次のタイムステップをステップ実行し、入力、非表示、および出力の状態を計算します。k1
  2. 前のタイムステップで合計した損失を計算します(以下を参照)。
  3. 逆方向パス:すべてのパラメーターに対する損失の勾配を計算し、前の時間ステップにわたって累積します(これには、これらの時間ステップのすべてのアクティブ化を保存して必要があります)。爆発するグラデーションの問題を回避するためにグラデーションをクリップします(まれに発生します)。k2
  4. パラメータを更新します(これはチャンクごとに1回発生し、タイムステップごとに段階的に発生しません)。
  5. より長いシーケンスの複数のチャンクを処理する場合は、最後のタイムステップで非表示状態を保存します(次のチャンクの開始時に非表示状態を初期化するために使用されます)。シーケンスの最後に達した場合は、メモリ/非表示の状態をリセットして、次のシーケンスの先頭(または、1つしかない場合は同じシーケンスの先頭)に移動します。
  6. 手順1から繰り返します。

損失の合計方法は、とによって異なり。たとえば、場合、損失は過去のタイムステップで合計されますが、場合、手順は異なります(Williams and Peng 1990を参照)。k 2 k 1 = k 2 k 1 = k 2 k 2 > k 1k1k2k1=k2k1=k2k2>k1

勾配計算と更新は、タイムステップごとに実行されます。これは、各タイムステップで更新するよりも計算コストが安いためです。シーケンスごとに複数回更新する(つまり、シーケンスの長さよりも短く設定する)と、重みの更新がより頻繁になるため、トレーニングを加速できます。k 1k1k1

バックプロパゲーションは、シーケンスの最初にプロパゲーションするよりも計算コストが低いため(すべてのタイムステップを格納して繰り返し処理する必要があるため)、タイムステップに対してのみ実行されます。この方法で計算された勾配は、すべてのタイムステップで計算された「真の」勾配の近似です。しかし、消失する勾配の問題のために、勾配はいくつかのタイムステップの後でゼロに近づく傾向があります。この制限を超えて伝播しても、何のメリットもありません。設定が短すぎると、ネットワークが学習できる時間スケールが制限される可能性があります。ただし、ネットワークのメモリはタイムステップに限定されません。これは、非表示のユニットがこの期間を超えて情報を保存できるためです(たとえば、k 2 k 2k2k2k2)。

k1k2

k11k2k1k2k1k2可能です; 以下にいくつかの例を挙げます。

切り捨てられたBPTT(手順、動機、実際的な問題)を説明する参照:

  • サツケバー(2013)。リカレントニューラルネットワークのトレーニング。
  • ミコロフ(2012)。ニューラルネットワークに基づく統計的言語モデル。
    • k1k2
    • k1
    • チャンクごとに1回更新を実行することは、増分的に実行するよりも優れています(不安定になる可能性があります)。
  • ウィリアムズとペン(1990)。反復的なネットワーク軌道のオンライントレーニングのための効率的な勾配ベースのアルゴリズム。
    • アルゴリズムのオリジナル(?)提案
    • k1k2hhk2k1
    • k1=1

切り捨てられたBPTTを使用する他の例:

  • (カルパシー2015)。char-rnn。
  • 墓(2014)。リカレントニューラルネットワークを使用したシーケンスの生成。
    • k1=k2=10010,000
  • サック等。(2014)。大語彙音声認識のための長期短期記憶ベースのリカレントニューラルネットワークアーキテクチャ。
    • k1=k2=20
  • Ollivier et al。(2015)。バックトラックなしでオンラインの定期的なネットワークをトレーニングします。
    • k1=k2=15
  • Hochreiter and Schmidhuber(1997)。長期短期記憶。
    • LSTMの変更された手順を説明します

これは素晴らしい答えです。このフォーラムで相当な賞金を獲得できる立場にあったことを願っています。特に有用なのは、k1とk2の具体的な説明で、より一般的な使用法に対する私の2つのケースをコンテキスト化し、数値の例を示しています。
Novak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.