Параметр Kera-contrib CRF layer "режим обучения" - PullRequest
0 голосов
/ 19 февраля 2019

Я только начал использовать слой CRF, предоставленный в библиотеке keras-contrib для задачи NER (распознавание именованных объектов).Проблема, с которой я столкнулся, заключалась в том, что при обучении модели с параметрами по умолчанию потери становятся значением nan в конце 1-й эпохи и никогда не меняются.

Мне помогло изменение параметра learn_modeслоя CRF до 'marginal'.

Может кто-нибудь объяснить, пожалуйста, разницу между 'join' и 'marginal' learn_mode?Почему в моем случае (проблема NER) режим 'join' приводит к значению nan?Почему 'marginal' работает?

# input and embedding for words
word_in = Input(shape=(max_len_doc,))
emb_word = Embedding(input_dim=n_words + 2, output_dim=50, 
input_length=max_len_doc, mask_zero=True)(word_in)

# input and embeddings for characters
char_in = Input(shape=(max_len_doc, max_len_word,))
emb_char = TimeDistributed(Embedding(input_dim=n_chars + 2, output_dim=10, 
input_length=max_len_word, mask_zero=True))(char_in)

# character LSTM to get word encodings by characters
char_enc = TimeDistributed(LSTM(units=50, return_sequences=False,
recurrent_dropout=0.5))(emb_char)

# main LSTM
model_crf = concatenate([emb_word, char_enc])
model_crf = SpatialDropout1D(0.3)(model_crf)
model_crf = Bidirectional(LSTM(units=128, return_sequences=True, recurrent_dropout=0.6))(model_crf)
model_crf = Bidirectional(LSTM(units=128, return_sequences=True, recurrent_dropout=0.3))(model_crf)
model_crf = TimeDistributed(Dense(n_tags, activation="relu"))(model_crf)
crf = CRF(n_tags) # crf = CRF(n_tags, learn_mode='marginal')
out = crf(model_crf)
...