Сходство предложений с использованием керас
Я пытаюсь реализовать архитектуру подобия предложений на основе этой работы с использованием набора данных 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])
2 ответа
Нан является распространенной проблемой в глубокой регрессии обучения. Поскольку вы используете сиамскую сеть, вы можете попробовать следующее:
- проверь свои данные: нужно ли их нормализовать?
- попробуйте добавить плотный слой в вашу сеть в качестве последнего слоя, но будьте осторожны при выборе функции активации, например, relu
- попробуйте использовать другую функцию потерь, например, contrastive_loss
- меньше скорость обучения, например, 0,0001
- режим cos не имеет дело с делением на ноль, может быть причиной NaN
Нелегко заставить работать глубокое обучение идеально.
Я не столкнулся с 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))