web-dev-qa-db-ja.com

ケラスを使用した文の類似性

これに基づいて文の類似性アーキテクチャを実装しようとしています STSデータセットを使用して作業します 。ラベルは0から1までの正規化された類似度スコアであるため、回帰モデルであると見なされます。

私の問題は、最初のエポックから直接NaNに損失が発生することです。私は何が間違っているのですか?

私はすでに最新のkerasとtheanoバージョンにアップデートしようとしました。

私のモデルのコードは次のとおりです。

def create_lstm_nn(input_dim):
    seq = Sequential()`
    # embedd using pretrained 300d embedding
    seq.add(Embedding(vocab_size, emb_dim, mask_zero=True, weights=[embedding_weights]))
    # encode via LSTM
    seq.add(LSTM(128))
    seq.add(Dropout(0.3))
    return seq

lstm_nn = create_lstm_nn(input_dim)

input_a = Input(shape=(input_dim,))
input_b = Input(shape=(input_dim,))

processed_a = lstm_nn(input_a)
processed_b = lstm_nn(input_b)

cos_distance = merge([processed_a, processed_b], mode='cos', dot_axes=1)
cos_distance = Reshape((1,))(cos_distance)
distance = Lambda(lambda x: 1-x)(cos_distance)

model = Model(input=[input_a, input_b], output=distance)

# train
rms = RMSprop()
model.compile(loss='mse', optimizer=rms)
model.fit([X1, X2], y, validation_split=0.3, batch_size=128, nb_Epoch=20)

また、Lambdaレイヤーの代わりに単純なMergeを使用してみましたが、同じ結果になります。

def cosine_distance(vests):
    x, y = vests
    x = K.l2_normalize(x, axis=-1)
    y = K.l2_normalize(y, axis=-1)
    return -K.mean(x * y, axis=-1, keepdims=True)

def cos_dist_output_shape(shapes):
    shape1, shape2 = shapes
    return (shape1[0],1)

distance = Lambda(cosine_distance, output_shape=cos_dist_output_shape)([processed_a, processed_b])
12
lila

Nanは、深層学習回帰の一般的な問題です。シャムネットワークを使用しているため、次のことを試すことができます。

  1. データを確認してください:正規化する必要がありますか?
  2. 最後のレイヤーとして高密度レイヤーをネットワークに追加してみてください。ただし、アクティベーション関数を慎重に選択してください。 relu
  3. 別の損失関数を使用してみてください。対照的な損失
  4. 学習率を小さくします。例: 0.0001
  5. cosモードはゼロによる除算を注意深く処理しません。NaNの原因である可能性があります

ディープラーニングを完璧に機能させることは簡単ではありません。

3
Kun

nanの問題は発生しませんでしたが、損失は変わりませんでした。私はこの情報を見つけました これをチェックしてください

def cosine_distance(shapes):
    y_true, y_pred = shapes
    def l2_normalize(x, axis):
        norm = K.sqrt(K.sum(K.square(x), axis=axis, keepdims=True))
        return K.sign(x) * K.maximum(K.abs(x), K.epsilon()) /     K.maximum(norm, K.epsilon())
    y_true = l2_normalize(y_true, axis=-1)
    y_pred = l2_normalize(y_pred, axis=-1)
    return K.mean(1 - K.sum((y_true * y_pred), axis=-1))
0
JAB