Finetune / Тренировка bert_rus_ner для извлечения именованных сущностей

Добрый день!

Подскажите, правильно ли понял из этого ответа:

Нельзя файнтюнить для своих тегов, которых нет в натренированном bert?

Контекст задачи: нужно извлекать сущности из рекомендаций врачей.
Разметил небольшой кусочек данных сущностями (Врач, Лекарство, Анализы и т.д.)

Пытаюсь на этих данныз тренировать берт в google colab:

import json
from deeppavlov import configs, build_model, train_model

with configs.ner.ner_rus_bert.open(encoding=‘utf8’) as f:
ner_config = json.load(f)

ner_config[‘dataset_reader’][‘data_path’] = ‘/content/drive/MyDrive/Data/Control/’ # directory with train.txt, valid.txt and test.txt files
ner_config[‘metadata’][‘variables’][‘NER_PATH’] = ‘/content/drive/MyDrive/Models/Control’
ner_config[‘metadata’][‘download’] = [ner_config[‘metadata’][‘download’][-1]]
ner_config[“train”][“batch_size”] = 10
ner_config[“train”][“epochs”] = 3
ner_config[“train”][“learning_rate”] = 1e-4

ner_model = train_model(configs.ner.ner_rus_bert, download=True)

Вначале моедель выдавала рандоммные метки, теперь в принципе виснит на тренировки (добавил данных).

Для моей задачи нужно тренировать модель с нуля?
Если да, сколько нужно данных для такой задачи?

Добрый день,
да, верно, если набор меток новый, то модель придется обучать заново.

Обучение модели на своих данных обсуждалось например вот тут:

Обратите внимание на изменение параметра save/load_path и у модели и словарей меток (для нового набора меток нужен свой словарь).

Если да, сколько нужно данных для такой задачи?

общее правило, что чем больше тем лучше. Можно начать с сотни на каждый класс и посмотреть как будет работать модель, если качество не удовлетворит, то размечать данные еще.

Юрий, добрый день!

Спасибо за ответ

“Обратите внимание на изменение параметра save/load_path и у модели и словарей меток (для нового набора меток нужен свой словарь)”

Не понял, что вы имеете в виду. Мне надо создать словарь с метками и поместить его куда-то? Если да, то куда его помещать / есть ли пример?

Читал, что bert с нуля тренируют на большом количестве данных - десятки и сотни гигабайт, и с использованием большого количестве вычислительных ресурсов и времени.
На сколько в принципе жизнеспособная идея: тренировать на сотне примеров на класс в google colab?

Сейчас команды выглядят следующим образом:

import json
from deeppavlov import configs, build_model, train_model

with configs.ner.ner_rus_bert.open(encoding=‘utf8’) as f:
ner_config = json.load(f)

ner_config[‘dataset_reader’][‘data_path’] = ‘/content/drive/MyDrive/Data/Control/’ # directory with train.txt, valid.txt and test.txt files
ner_config[‘metadata’][‘variables’][‘NER_PATH’] = ‘/content/drive/MyDrive/Models/Control’
ner_config[‘metadata’][‘download’] = [ner_config[‘metadata’][‘download’][-1]]
ner_config[“train”][“batch_size”] = 10
ner_config[“train”][“epochs”] = 3
ner_config[“train”][“learning_rate”] = 1e-4

ner_model = train_model(configs.ner.ner_rus_bert, download=True)

Корректный ли данный скрипт, если я тренирую с нуля на своих данных?
Если ставлю dowload=False, выдает ошибку
Или если с нуля тренируешь все равно надо ставить download=True?

Как тренировать в google colab на gpu?

Не нашел в config параметра “device”
А если ставить как у вас написано в документации:
pip install tensorflow-gpu==1.15.2
import os
os.environ[“CUDA_VISIBLE_DEVICES”]=“3”
Не работает

Понимаю, что вопросы базовые, но с текстом работаю в первый раз и в интернете примеры в google colab с deeppavlov для моей задачи с уточнением параметров не нашел

Не понял, что вы имеете в виду. Мне надо создать словарь с метками и поместить его куда-то? Если да, то куда его помещать / есть ли пример?

Нет, новый словарь сам создастся во время запуска команды на обучение. Нужно только поменять пути, чтобы не подгружать словарь меток от стандартного датасета.

Читал, что bert с нуля тренируют на большом количестве данных - десятки и сотни гигабайт, и с использованием большого количестве вычислительных ресурсов и времени.
На сколько в принципе жизнеспособная идея: тренировать на сотне примеров на класс в google colab?

Идея жизнеспособная. Вы не будете обучать Bert совсем с нуля, он уже предобучен, но только не на задаче извлечения сущностей.

В коде вы меняете переменную ner_config, а используете configs.ner.ner_rus_bert в команде train_model. Попробуйте подставить ner_config в вызов train_model c download=False.

Юрий, спасибо за ответ.

Как поменять пути / что нужно указывать?

Подставил:
with configs.ner.ner_rus_bert.open(encoding=‘utf8’) as f:
ner_config = json.load(f)
ner_config[‘dataset_reader’][‘data_path’] = ‘/content/drive/MyDrive/Data/Test/’ # directory with train.txt, valid.txt and test.txt files
ner_config[‘metadata’][‘variables’][‘NER_PATH’] = ‘/content/drive/MyDrive/Models/Test/’
ner_config[‘metadata’][‘download’] = [ner_config[‘metadata’][‘download’][-1]]
ner_config[“train”][“batch_size”] = 12
ner_config[“train”][“epochs”] = 5
ner_config[“train”][“learning_rate”] = 1e-4
ner_config[“train”][“device”] = ‘GPU’

ner_model = train_model(ner_config, download=False)

Ошибка:
NotFoundError: /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/vocab.txt; No such file or directory

Если ставлю True или делаю !python -m deeppavlov download paraphraser_rubert
Модель запускается на обучение
но по факту не учится, по-моему:
{“valid”: {“eval_examples_count”: 2, “metrics”: {“ner_f1”: 0, “ner_token_f1”: 0}, “time_spent”: “0:00:03”, “epochs_done”: 0, “batches_seen”: 0, “train_examples_seen”: 0, “impatience”: 0, “patience_limit”: 100}}

2021-06-28 13:48:50.296 INFO in ‘deeppavlov.core.data.simple_vocab’[‘simple_vocab’] at line 115: [loading vocabulary from /content/drive/MyDrive/Models/Test/tag.dict] 2021-06-28 13:49:16.685 INFO in ‘deeppavlov.models.bert.bert_sequence_tagger’[‘bert_sequence_tagger’] at line 251: [initializing model with Bert from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt]

INFO:tensorflow:Restoring parameters from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt {“valid”: {“eval_examples_count”: 2, “metrics”: {“ner_f1”: 0, “ner_token_f1”: 0}, “time_spent”: “0:00:02”}} {“test”: {“eval_examples_count”: 2, “metrics”: {“ner_f1”: 0, “ner_token_f1”: 0}, “time_spent”: “0:00:01”}}

2021-06-28 13:49:38.444 INFO in ‘deeppavlov.core.data.simple_vocab’[‘simple_vocab’] at line 115: [loading vocabulary from /content/drive/MyDrive/Models/Test/tag.dict] 2021-06-28 13:50:05.308 INFO in ‘deeppavlov.models.bert.bert_sequence_tagger’[‘bert_sequence_tagger’] at line 251: [initializing model with Bert from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt]

INFO:tensorflow:Restoring parameters from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt

Обучение все-таки запустилось, это хорошо.

Как поменять пути / что нужно указывать?

Этой строчки достаточно ner_config[‘metadata’][‘variables’][‘NER_PATH’], если вы не качаете туда предобученную модель configs.ner.ner_rus_bert.

{“valid”: {“eval_examples_count”: 2, “metrics”: {“ner_f1”: 0, “ner_token_f1”: 0}, “time_spent”: “0:00:03”, “epochs_done”: 0, “batches_seen”: 0, “train_examples_seen”: 0, “impatience”: 0, “patience_limit”: 100}}

У вас в валидации всего два примера, этого недостаточно чтобы судить о качестве модели. Чтобы проверить, что модель учится в принципе посмотрите на метрики на train подвыборке во время обучения, получаются ли там значения f1 больше 0.

оно запускается только, если я ставлю download=True или устанавливаю
!python -m deeppavlov download paraphraser_rubert

Если ставить в команде train параметр download=False, ошибка:
NotFoundError: /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/vocab.txt; No such file or directory

Так у меня это с самого начала стояло:
ner_config[‘metadata’][‘variables’][‘NER_PATH’] = ‘/content/drive/MyDrive/Models/Test/’

Это логи с
ner_model = train_model(ner_config, download=True):

2021-06-28 16:09:52.198 INFO in ‘deeppavlov.download’[‘download’] at line 138: Skipped http://files.deeppavlov.ai/deeppavlov_data/bert/rubert_cased_L-12_H-768_A-12_v1.tar.gz download because of matching hashes 2021-06-28 16:09:52.206 INFO in ‘deeppavlov.core.trainers.fit_trainer’[‘fit_trainer’] at line 68: NNTrainer got additional init parameters [‘pytest_max_batches’, ‘pytest_batch_size’, ‘learning_rate’, ‘device’] that will be ignored: 2021-06-28 16:09:52.666 INFO in ‘deeppavlov.core.data.simple_vocab’[‘simple_vocab’] at line 115: [loading vocabulary from /content/drive/MyDrive/Models/Test/tag.dict] 2021-06-28 16:09:52.669 INFO in ‘deeppavlov.core.data.simple_vocab’[‘simple_vocab’] at line 101: [saving vocabulary to /content/drive/MyDrive/Models/Test/tag.dict] 2021-06-28 16:10:21.307 INFO in ‘deeppavlov.models.bert.bert_sequence_tagger’[‘bert_sequence_tagger’] at line 251: [initializing model with Bert from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt]

INFO:tensorflow:Restoring parameters from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt

2021-06-28 16:10:26.152 INFO in ‘deeppavlov.core.trainers.nn_trainer’[‘nn_trainer’] at line 199: Initial best ner_f1 of 0

{“valid”: {“eval_examples_count”: 2, “metrics”: {“ner_f1”: 0, “ner_token_f1”: 0}, “time_spent”: “0:00:02”, “epochs_done”: 0, “batches_seen”: 0, “train_examples_seen”: 0, “impatience”: 0, “patience_limit”: 100}}

2021-06-28 16:11:18.89 INFO in ‘deeppavlov.core.data.simple_vocab’[‘simple_vocab’] at line 115: [loading vocabulary from /content/drive/MyDrive/Models/Test/tag.dict] 2021-06-28 16:11:44.267 INFO in ‘deeppavlov.models.bert.bert_sequence_tagger’[‘bert_sequence_tagger’] at line 251: [initializing model with Bert from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt]

INFO:tensorflow:Restoring parameters from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt {“valid”: {“eval_examples_count”: 2, “metrics”: {“ner_f1”: 0, “ner_token_f1”: 0}, “time_spent”: “0:00:03”}} {“test”: {“eval_examples_count”: 2, “metrics”: {“ner_f1”: 0, “ner_token_f1”: 0}, “time_spent”: “0:00:01”}}

2021-06-28 16:11:50.974 INFO in ‘deeppavlov.core.data.simple_vocab’[‘simple_vocab’] at line 115: [loading vocabulary from /content/drive/MyDrive/Models/Test/tag.dict] 2021-06-28 16:12:16.722 INFO in ‘deeppavlov.models.bert.bert_sequence_tagger’[‘bert_sequence_tagger’] at line 251: [initializing model with Bert from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt]

INFO:tensorflow:Restoring parameters from /root/.deeppavlov/downloads/bert_models/rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt

Здесь нет f1 больше 0

Вот такой рандом получается:

ner_model([‘я запишусь к стоматологу’])

[[[‘я’, ‘запишусь’, ‘к’, ‘стоматологу’]],
[[‘I-АНАЛИЗЫ’, ‘B-ВРАЧ’, ‘B-ВРАЧ’, ‘B-ВРАЧ’]]]

Это точно все логи?
Должны быть быть логи с метриками на train подвыборке, типа вот таких:

{"train": {"eval_examples_count": 16, "metrics": {"ner_f1": 0, "ner_token_f1": 0}, "time_spent": "0:00:30", "epochs_done": 0, "batches
_seen": 20, "train_examples_seen": 320, "head_learning_rate": 0.0010000000474974513, "bert_learning_rate": 2.0000000949949027e-05, "lo
ss": 31.20499219894409}}
2021-07-07 13:07:42.173 INFO in 'deeppavlov.core.trainers.nn_trainer'['nn_trainer'] at line 212: Did not improve on the ner_f1 of 3.27
37
{"valid": {"eval_examples_count": 2153, "metrics": {"ner_f1": 0, "ner_token_f1": 0}, "time_spent": "0:00:40", "epochs_done": 0, "batches_seen": 20, "train_examples_seen": 320, "impatience": 1, "patience_limit": 100}}
{"train": {"eval_examples_count": 16, "metrics": {"ner_f1": 0, "ner_token_f1": 0}, "time_spent": "0:00:54", "epochs_done": 0, "batches
_seen": 40, "train_examples_seen": 640, "head_learning_rate": 0.0010000000474974513, "bert_learning_rate": 2.0000000949949027e-05, "loss": 19.26974368095398}}
2021-07-07 13:08:06.547 INFO in 'deeppavlov.core.trainers.nn_trainer'['nn_trainer'] at line 212: Did not improve on the ner_f1 of 3.27
37                                                                                                                                    {"valid": {"eval_examples_count": 2153, "metrics": {"ner_f1": 0, "ner_token_f1": 0.0823}, "time_spent": "0:01:04", "epochs_done": 0, "
batches_seen": 40, "train_examples_seen": 640, "impatience": 2, "patience_limit": 100}}
{"train": {"eval_examples_count": 16, "metrics": {"ner_f1": 24.0, "ner_token_f1": 44.4444}, "time_spent": "0:01:18", "epochs_done": 0, "batches_seen": 60, "train_examples_seen": 960, "head_learning_rate": 0.0010000000474974513, "bert_learning_rate": 2.0000000949949027
e-05, "loss": 13.49337329864502}}
2021-07-07 13:08:30.635 INFO in 'deeppavlov.core.trainers.nn_trainer'['nn_trainer'] at line 207: Improved best ner_f1 of 9.3835       2021-07-07 13:08:30.635 INFO in 'deeppavlov.core.trainers.nn_trainer'['nn_trainer'] at line 209: Saving model
2021-07-07 13:08:30.694 INFO in 'deeppavlov.core.models.tf_model'['tf_model'] at line 75: [saving model to /home/yurakuratov/data/deep
pavlov_download/models/ner_rus_bert/model_1]                                                                                          {"valid": {"eval_examples_count": 2153, "metrics": {"ner_f1": 9.3835, "ner_token_f1": 19.7751}, "time_spent": "0:01:28", "epochs_done"
: 0, "batches_seen": 60, "train_examples_seen": 960, "impatience": 0, "patience_limit": 100}}
{"train": {"eval_examples_count": 16, "metrics": {"ner_f1": 45.614, "ner_token_f1": 45.3608}, "time_spent": "0:01:44", "epochs_done": 0, "batches_seen": 80, "train_examples_seen": 1280, "head_learning_rate": 0.0010000000474974513, "bert_learning_rate": 2.0000000949949
027e-05, "loss": 9.65506112575531}}

В вашем случае модель не смогла на валидационных данных получить скор больше 0.0 и загрузила лучший свой чекпойнт с самого начала обучения (случайный).
Если метрики на train растут, то это будет признаком того, что модель обучается. Если нет, то надо разбираться дальше.

Юрий, спасибо за ответ.

Натренировал модель
Думаю, проблема была из-за того, что слишком мало данных