2016-09-02 2 views
8

J'essaie d'implémenter une architecture de similarité de phrases basée sur ce work using the STS dataset. Les labels sont des scores de similarité normalisés de 0 à 1, on suppose donc qu'il s'agit d'un modèle de régression.Similitude des phrases utilisant keras

Mon problème est que la perte va directement à NaN à partir de la première époque. Qu'est-ce que je fais mal?

J'ai déjà essayé de mettre à jour les dernières versions de keras et theano.

Le code pour mon modèle est:

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) 

J'ai aussi essayé d'utiliser un Lambda simple, au lieu de la couche Merge, mais il a le même résultat.

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]) 
+0

Salut, je vois que vous êtes nouveau à StackOverflow. Pour nous aider à identifier le problème et pour obtenir la réponse dont vous avez besoin plus rapidement, y a-t-il des informations supplémentaires que vous pourriez fournir? Quelles erreurs voyez-vous, le cas échéant? Qu'attendiez-vous à la place? –

+0

bien, maintenant j'essaie de comprendre pourquoi mon réseau devient ** nan ** perte lors de la formation. – lila

+0

Peut-être que votre taux d'apprentissage est trop élevé. Peut-être qu'il y a un autre problème. Si vous utilisez Theano, vous pouvez utiliser ['THEANO_FLAGS = 'mode = NanGuardMode''] (http://deeplearning.net/software/theano/tutorial/modes.html) lorsque vous lancez votre script pour qu'il lance une exception où un La valeur 'nan' est détectée, ce qui vous permet de remonter à l'emplacement du problème. – nemo

Répondre

1

Le nan est un problème commun dans la régression de l'apprentissage en profondeur. Parce que vous utilisez le réseau siamois, vous pouvez essayer les suivants:

  1. vérifiez vos données: doivent-ils être normalisés?
  2. Essayez d'ajouter une couche dense dans votre réseau en tant que dernière couche, mais soyez prudent en choisissant une fonction d'activation, par ex. relu
  3. essayez d'utiliser une autre fonction de perte, par ex. contrastive_loss
  4. réduisez votre taux d'apprentissage, par ex. 0,0001
  5. mode cos ne sont pas soigneusement face à la division par zéro, pourrait être la cause de NaN

Il est difficile de faire le travail d'apprentissage en profondeur parfaitement.

0

Je n'ai pas rencontré le problème nan, mais ma perte ne changerait pas. J'ai trouvé cette info check this out

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))