2016-09-02 10 views
8

나는 work using the STS dataset을 기반으로 문장 유사 아키텍처를 구현하려고합니다. 레이블은 정규화 된 유사성 점수가 0에서 1까지이므로 회귀 모델로 가정합니다.케라를 사용하여 문장의 유사성

내 문제는 손실이 직접적으로첫 번째 에포크부터 시작한다는 것입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

나는 이미 최신 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) 

가 나는 또한 대신 Merge 층의 간단한 Lambda를 사용했지만,이 같은 결과가 있습니다

내 모델의 코드입니다.

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

을 발견 나는 당신에 유래에 익숙 참조하십시오. 문제를 파악하고 신속하게 답변해야하는 정보를 얻으려면 도움이 될만한 추가 정보가 있습니까? 오류가 있다면 무엇을보고 있습니까? 대신에 당신은 무엇을 기대 했습니까? –

+0

글쎄, 지금은 왜 내 네트워크가 훈련 중에 ** nan ** 손실이되는지 알아 내려고하고있다. – lila

+0

아마도 학습률이 너무 높을 수 있습니다. 어쩌면 다른 문제가있을 수 있습니다. Theano를 사용하는 경우 스크립트를 시작할 때 [ 'THEANO_FLAGS ='mode = NanGuardMode''] (http://deeplearning.net/software/theano/tutorial/modes.html)를 사용하여 예외를 throw하도록 할 수 있습니다. 'nan' 값이 감지되어 문제의 위치를 ​​추적합니다. – nemo

답변

1

나노는 깊은 학습 회귀에서 공통적 인 문제입니다. 샴 네트워크를 사용하고 있으므로 다음을 시도해보십시오.

  1. 데이터를 확인하십시오. 정규화해야합니까?
  2. 네트워크에 Dense 레이어를 마지막 레이어로 추가하려고 시도하지만 활성화 기능을 선택하는 데주의해야합니다. relu
  3. 또 다른 손실 함수를 사용하려고합니다. contrastive_loss
  4. 학습 속도가 더 작습니다. 주의 깊게 0으로 나누기를 처리하지 않는 0.0001
  5. COS 모드, 완벽하게 깊은 학습 일을하는 것은 쉽지 않다 NaN이

의 원인이 될 수 있습니다.

0

nan 문제가 발생하지 않았지만 손실이 변경되지 않았습니다. 나는 안녕,이 정보를 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))