Параметр Kera-contrib CRF layer "режим обучения"
Я только начал использовать слой CRF, предоставляемый в библиотеке keras-contrib для задачи NER (распознавание именованных сущностей). Проблема, с которой я столкнулся, заключалась в том, что при обучении модели с параметрами по умолчанию потеря становится nan
значение в конце 1-й эпохи и никогда не меняется.
То, что помогло мне, менялось learn_mode
параметр слоя CRF до 'marginal'
,
Может ли кто-нибудь объяснить, пожалуйста, разницу между 'join'
а также 'marginal'
learn_mode? Почему в моем случае (проблема NER) 'join'
режим приводит к значению нан? Зачем '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)