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でやる方法はありますか?
シーケンスインテントのS1フィールドと同じように、シーケンス内の各要素に同じ重みが適用されるため、各シーケンスの最初の行に1回だけ置く必要があります。 –
これは単なる表現オプションです。それは重量を繰り返すことと等価でしょうか?つまり、各文字に対して重量が掛け算されますか?私はこれが実際にはより長いシーケンスに対して平均的により多くの重みを与えることもできると考えています – Simone