2017-11-16 5 views
4

나는 keras에 커스텀 손실 기능을 구현 중이다. 모델은 autoencoder입니다. 첫 번째 레이어는 (batch_size, sentence_length) 크기의 입력을 (batch_size, sentence_length, embedding_dimension)에 포함시키는 포함 레이어입니다. 그런 다음 모델은 임베딩을 특정 차원의 벡터로 압축하고 마지막으로 임베디드를 (batch_size, sentence_lenght, embedding_dimension)으로 재구성해야합니다.Keras : 손실 함수에서 레이어의 가중치를 사용하는 방법은 무엇입니까?

하지만 임베디드 레이어는 훈련 가능하며 손실은 임베디드 레이어의 가중치를 사용해야합니다 (필자의 어휘의 모든 단어 임베딩을 합하여 계산해야 함).

예를 들어 장난감을 훈련 시키려면 "고양이"를 원합니다. sentence_length is 2embedding_dimension is 10vocabulary size is 50을 가정하므로 포함 행렬의 모양은 (50,10)입니다. 임베디드 레이어의 출력 X은 모양이 (1,2,10)입니다. 그런 다음 모델을 통과하고 출력 X_hat은 모양이 (1,2,10)입니다. 이 모델은 벡터 '012'를 나타내는 벡터 X_hat[0]이 벡터 'X[0]'과 가장 유사하고 'cat'의 경우 'embedding'에서 'the'를 나타내는 확률이 최대가되도록 훈련되어야합니다. 그러나 코사인 유사도를 XX_hat 사이의 코사인 유사도를 계산해야하며 코사인 유사도 합이 X_hat이고 정규화 된 임베딩 매트릭스의 모든 임베딩 (50은 어휘 크기가 50이므로 50 임)은 손실입니다. 임베디드 레이어의 가중치

하지만 교육 과정을 반복 할 때마다 퍼가기 레이어의 가중치에 어떻게 액세스 할 수 있습니까?

감사합니다.

+0

첫 번째 출력을 사용 모델을 해킹하여 포함 함수의 출력을 손실 함수로 이동 시키지만 레이어의 가중치를 취하는 것은 더 복잡한 작업을 추가하는 것 같습니다. –

+0

이 방법을 원하십니까? 표준화 합계가 폭발 할 수 있습니다. 당신의 방법이 묘사 된 종이가 있습니까? 어쩌면 당신은 거기 softmax 출력을했습니다. –

+0

NIPS 2017에서 허용되는이 문서를 구현하려고합니다. https://arxiv.org/pdf/1708.04729.pdf. 어쩌면이 논문을 잘 이해하지 못하더라도 방정식 1을 볼 수있을 것입니다. 분모는 We에 포함 된 어휘의 모든 단어에 대해 코사인 유사성을 취합니다. 이는 삽입 행렬입니다. – mat112

답변

0

약간 미친 것처럼 보이지만 작동하는 것처럼 보입니다. model.compile에서 전달할 사용자 지정 손실 함수를 만드는 대신 네트워크에서 호출하는 함수에서 손실 (수식 1 : arxiv.org/pdf/1708.04729.pdf)을 계산합니다 람다 :

loss = Lambda(lambda x: similarity(x[0], x[1], x[2]))([X_hat, X, embedding_matrix])  

네트워크는 두 개의 출력을 가지고 X_hatloss을하지만 모든 중량이 0 중량 손실을 가지고 X_hat 체중 :

model = Model(input_sequence, [X_hat, loss]) 
model.compile(loss=mean_squared_error, 
       optimizer=optimizer, 
       loss_weights=[0., 1.]) 

I가 TRA 모델에 :

for i in range(epochs): 
    for j in range(num_data): 
     input_embedding = model.layers[1].get_weights()[0][[data[j:j+1]]] 
     y = [input_embedding, 0] #The embedding of the input 
     model.fit(data[j:j+1], y, batch_size=1, ...) 

그런 식으로, 모델은 0을 향해 loss 경향 훈련을하고, 나는 훈련 모델의 예측을 사용할 때 그것은가 가능 재건 X_hat

+0

이것이 효과가 있다고 생각하십니까? 왜냐하면 계산 그래프에서 자동 차별화를 취하는 동안'model.layer [1]'의 가중치가 발생하지 않기 때문입니다. 내가 틀렸다면 나를 바로 잡아주세요. –

관련 문제