2017-02-27 5 views
0

CNTKで加重シーケンスでLSTMをトレーニングしています。私は言語理解の以下の例から始めた:私は重量は、各シーケンスに関連していCNTKでニューラルネットワークをトレーニングするための加重サンプリングシーケンス

19 |S0 178:1 |# BOS  |S1 14:1 |# flight |S2 128:1 |# O 
19 |S0 770:1 |# show       |S2 128:1 |# O 
19 |S0 429:1 |# flights      |S2 128:1 |# O 
19 |S0 444:1 |# from       |S2 128:1 |# O 

https://github.com/Microsoft/CNTK/blob/master/Tutorials/CNTK_202_Language_Understanding.ipynb

がネットワークを訓練するために、彼らは次のようCNTKテキスト形式(CTF)がファイルを生成します。私はネットワークを訓練するとき考慮にweightを取りたい

19 |weight 10 |S0 178:1 |# BOS  |S1 14:1 |# flight |S2 128:1 |# O 
19 |weight 10 |S0 770:1 |# show       |S2 128:1 |# O 
19 |weight 10 |S0 429:1 |# flights      |S2 128:1 |# O 
19 |weight 10 |S0 444:1 |# from       |S2 128:1 |# O 

:したがって、私は次の出力を生成しました。これを考慮に入れる1つの方法は、次のように損失関数を修正することです。クロスエントロピーにインスタンスの重みを掛けます。私は多くのシーケンスを持っているとき

def create_criterion_function(model): 
    labels = Placeholder(name='labels') 
    weight = Placeholder(name='weight') 
    ce = weight * cross_entropy_with_softmax(model, labels) 
    errs = classification_error  (model, labels) 
    return combine ([ce, errs]) # (features, labels) -> (loss, metric) 

はしかし、ネットワークが学習していないように見えます。私は、これはcatastrophic forgettingの場合であると言われています

致命的では(も:壊滅的な干渉を)忘れて、多くの場合、多くの伝統的な人工ニューラルネットワークモデルに共通の問題を記述するために、コネ文献で使用される用語です。これは、新しい(追加の)1つの応答でネットワークを訓練する試みが行われたときに、以前に学習された応答の致命的な損失を指します。

もう1つの解決策は、体重に応じてミニバッチのインスタンスをサンプリングできるということです。高体重のシーケンスは、ミニバッチでより頻繁に表示する必要があります。 CNTKでやる方法はありますか?

+1

シーケンスインテントのS1フィールドと同じように、シーケンス内の各要素に同じ重みが適用されるため、各シーケンスの最初の行に1回だけ置く必要があります。 –

+0

これは単なる表現オプションです。それは重量を繰り返すことと等価でしょうか?つまり、各文字に対して重量が掛け算されますか?私はこれが実際にはより長いシーケンスに対して平均的により多くの重みを与えることもできると考えています – Simone

答えて

1

あなたのアプローチは正しいと思います。ただし、これらのサンプルでは、​​目的のスケールを10倍にすると、グラデーションが10倍に拡大されます。壊滅的な忘却を調べる前に、私はまず学習率を10倍に下げて、勾配のステップを以前と同じ範囲に戻すようにします。

+0

したがって、一定の要因で学習率を下げるのでしょうか?すべての体重が各シーケンスで異なる場合、どのようにしてこの因子を見つけることができますか? – Simone

+0

残念ながら、これは引き続き試行錯誤の問題です。学習率を平均的な体重の範囲内の係数でスケールし、その値* 2と/ 2を試して、3つの構成のどれが最も効果的かを見てみましょう。 –

関連する問題