2017-11-16 10 views
4

私はケラスでカスタム損失機能を実装しています。モデルはautoencoderです。第1層は埋め込み層であり、(batch_size, sentence_length)の入力を(batch_size, sentence_length, embedding_dimension)に埋め込みます。次に、モデルは埋め込みを特定の次元のベクトルに圧縮し、最終的に埋め込みを再構築する必要があります。(batch_size, sentence_lenght, embedding_dimension)ケラス:損失関数のレイヤーのウェイトを使用する方法は?

しかし、埋め込みレイヤは訓練可能であり、損失は埋め込みレイヤの重みを使用する必要があります(私は自分の語彙のすべての単語埋め込みを合計しなければなりません)。

たとえば、私がおもちゃのexemple: "猫"を訓練したい場合、 sentence_length is 2とし、embedding_dimension is 10vocabulary size is 50とすると、埋め込み行列の形状は(50,10)となります。埋め込みレイヤの出力Xの形状は(1,2,10)です。次に、それはモデルに入り、出力はX_hatであり、形状は(1,2,10)です。モデルは、ベクトル「X_hat[0]」がベクトル「X[0]」に最もよく似ている確率を最大にするように訓練されていなければならず、「cat」の場合と同じものです。しかし、XX_hatの間のコサイン類似度を計算しなければならず、コサイン類似度の合計はX_hatであり、埋め込み行列内のすべての埋め込み(50、ボキャブラリサイズは50なので)は、埋め込み層の重み。

しかし、トレーニングプロセスの繰り返しごとに埋め込みレイヤの重みにアクセスするにはどうすればよいですか?

ありがとうございました!

+0

である第一の出力を使用します埋め込みの出力を損失関数にするモデルをハックしますが、レイヤーの重みを取ると、より複雑な作業が追加されているようです.... –

+0

このようにしたいですか?正規化の合計が爆発する可能性があります。あなたの方法が記述されている論文はありますか?多分あなたはそこにsoftmax出力を持っています。 –

+0

私はこの文書をNIPS 2017. https://arxiv.org/pdf/1708.04729.pdfで受け入れようとしています。たぶん私は論文をよく理解していないかもしれませんが、方程式1を見てください。分母は、埋め込み行列であるWeに埋め込まれた語彙のすべての単語に対して余弦の類似性を取ります。 – mat112

答えて

0

これはちょっと狂っているようですが、動作しているようです:model.compileで渡すカスタム損失関数を作成するのではなく、ネットワークは、私が呼び出す関数の損失(式1:arxiv.org/pdf/1708.04729.pdf)を計算しますラムダ:

loss = Lambda(lambda x: similarity(x[0], x[1], x[2]))([X_hat, X, embedding_matrix])  

とネットワーク、2つの出力がありますX_hatlossを、私はすべて重量持つように0重量、損失を持っているX_hatを重量:

model = Model(input_sequence, [X_hat, loss]) 
model.compile(loss=mean_squared_error, 
       optimizer=optimizer, 
       loss_weights=[0., 1.]) 

私はTRAモデルで:

for i in range(epochs): 
    for j in range(num_data): 
     input_embedding = model.layers[1].get_weights()[0][[data[j:j+1]]] 
     y = [input_embedding, 0] #The embedding of the input 
     model.fit(data[j:j+1], y, batch_size=1, ...) 

こうすることで、モデルが0に向けてlossを傾向があるように訓練された、と私は訓練されたモデルの予測を使用したいとき、私はそれが可能だ復興X_hat

+0

これはうまくいくと思いますか?なぜなら、計算グラフでは、auto-differentiationを取っている間、 'model.layer [1]'の重みは発生しないからです。私が間違っていれば私を修正してください。 –

関連する問題