Я только начал использовать слой 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)