Similitud de oraciones usando keras

Estoy tratando de implementar una architecture de similitud de oraciones basada en este trabajo usando el conjunto de datos STS . Las tags tienen puntuaciones de similitud normalizadas de 0 a 1, por lo que se supone que es un modelo de regresión.

Mi problema es que la pérdida va directamente a NaN partir de la primera época. ¿Qué estoy haciendo mal?

Ya he intentado actualizar a las últimas versiones de keras y theano.

El código para mi modelo es:

 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) 

También intenté usar un Lambda simple en lugar de la capa Merge , pero tiene el mismo resultado.

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

El nan es un problema común en la regresión profunda de aprendizaje. Debido a que está utilizando la red siamesa, puede probar lo siguiente:

  1. verifique sus datos: ¿necesitan ser normalizados?
  2. intente agregar una capa densa en su red como la última capa, pero tenga cuidado al seleccionar una función de activación, por ejemplo, relu
  3. intenta usar otra función de pérdida, por ejemplo, contrastive_loss
  4. menor es su tasa de aprendizaje, por ejemplo, 0,0001
  5. El modo cos no trata con cuidado la división por cero, podría ser la causa de NaN

No es fácil hacer que el aprendizaje profundo funcione a la perfección.

No me encontré con el problema de nan , pero mi pérdida no cambiaría. He encontrado esta información mira esto

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