Ограничение количества итераций в Стэнфордском NER
Я тренирую модель Stanford NER CRF по настроенному набору данных, но число итераций, используемых для обучения модели, теперь достигло 333 итераций, т. Е. Этот процесс обучения шел часами. Ниже сообщение напечатано в терминале -
Iter 335 evals 400 <D> [M 1.000E0] 2.880E3 38054.87s |5.680E1| {6.652E-6} 4.488E-4 -
Iter 336 evals 401 <D> [M 1.000E0] 2.880E3 38153.66s |1.243E2| {1.456E-5} 4.415E-4 -
-
Используемый файл свойств приведен ниже - есть ли способ, которым я могу ограничить число итераций, скажем, до 20.
location of the training file
trainFile = TRAIN5000.tsv
#location where you would like to save (serialize to) your
#classifier; adding .gz at the end automatically gzips the file,
#making it faster and smaller
serializeTo = ner-model_TRAIN5000.ser.gz
#structure of your training file; this tells the classifier
#that the word is in column 0 and the correct answer is in
#column 1
map = word=0,answer=1
#these are the features we'd like to train with
#some are discussed below, the rest can be
#understood by looking at NERFeatureFactory
useClassFeature=true
useWord=true
useNGrams=true
#no ngrams will be included that do not contain either the
#beginning or end of the word
noMidNGrams=true
useDisjunctive=true
maxNGramLeng=6
usePrev=true
useNext=true
useSequences=true
usePrevSequences=true
maxLeft=1
#the next 4 deal with word shape features
useTypeSeqs=true
useTypeSeqs2=true
useTypeySequences=true
wordShape=chris2useLC
saveFeatureIndexToDisk = true
printFeatures=true
flag useObservedSequencesOnly=true
featureDiffThresh=0.05
3 ответа
Краткий ответ: используйте tolerance
(по умолчанию 1e-4). Есть еще один параметр maxIterations
который игнорируется.
Я экспериментировал с обучением биомедицинской (BioNER) модели через Stanford CoreNLP CRF classifier
на IOB-тэгированном, токенизированном тексте, как описано на https://nlp.stanford.edu/software/crf-faq.html.
Мой корпус - из загруженных источников - был очень большим (~1,5 миллиона строк; 6 функций: GENE; ...). Поскольку обучение, казалось, продолжалось бесконечно, я составил соотношение ценностей, чтобы получить представление о прогрессе:
Grepping исходный код Java, я обнаружил, что по умолчанию TOL
(tolerance
; используется, чтобы решить, когда прекратить тренировку) значение было 1E-6 (0,000001), указанное в .../CoreNLP/src/edu/stanford/nlp/optimization/QNMinimizer.java
,
Глядя на этот сюжет, моя первоначальная тренировка никогда бы не закончилась [Этот сюжет также показывает, что установка большего TOL
значение, например tolerance=0.05
, приведет к преждевременному прекращению обучения, так как TOL
значение срабатывает от "шума", который возникает в начале тренировки. Я подтвердил это tolerance=0.05
запись в моем .prop
файл; тем не мение, TOL
значения 0.01
, 0.005
и т. д. были "ОК".]
Добавление "maxIterations=20
"к файлу свойств, как описано @StanfordNLPHelp (в другом месте в этой теме), казалось, игнорируется, если я также не добавил и не изменил tolerance=
значение, по моему bioner.prop
файл свойств; например
tolerance=0.005
maxIterations=20 ## optional
в этом случае классификатор быстро обучил модель (bioner.ser.gz
). [Когда я добавил maxIterations
линия к моему .prop
файл, без добавления tolerance
линия, модель продолжала работать "вечно", как и раньше.]
Список параметров, которые могут быть включены в .prop
файл можно найти здесь:
https://nlp.stanford.edu/nlp/javadoc/javanlp-3.5.0/edu/stanford/nlp/ie/NERFeatureFactory.html
Использование maxQNItr=21
в вашем файле проп. Это будет работать до 20 итераций. Получил помощь от ответа Дэвида