Этот репозиторий содержит код для использования вопросов об уловах для нескольких выстрелов в классификации текста и вывода естественного языка, и это не только размер, который имеет значение: модели мелких языков также являются учащимися с несколькими выстрелами. В документах представлена обучающаяся обучение (PET), полузащиленную процедуру обучения, которая переформулирует входные примеры как фразы в стиле Cloze. В условиях с низким ресурсом ПЭТ и IPET значительно превосходят регулярные контролируемые тренировки, различные полупроницаемые базовые показатели и даже GPT-3, несмотря на то, что требуют на 99,9% меньше параметров. Итеративный вариант PET (IPET) обучает несколько поколений моделей и может даже использоваться без каких -либо учебных данных.
| #Examples | Тренировочный режим | Yelp (полная) | Новости Ag | Yahoo вопросы | Mnli |
|---|---|---|---|---|---|
| 0 | без присмотра | 33,8 | 69,5 | 44,0 | 39.1 |
| ипет | 56.7 | 87.5 | 70.7 | 53,6 | |
| 100 | контролируется | 53,0 | 86.0 | 62,9 | 47.9 |
| ДОМАШНИЙ ПИТОМЕЦ | 61.9 | 88.3 | 69,2 | 74,7 | |
| ипет | 62,9 | 89,6 | 71.2 | 78.4 |
ПРИМЕЧАНИЕ . Чтобы точно воспроизвести вышеуказанные результаты, обязательно используйте V1.1.0 ( --branch v1.1.0 ).
? Настраивать
Использование CLI
Использование API
? Тренируйте свой питомец
Цитирование
Все требования к ПЭТ можно найти в requirements.txt . Вы можете установить все необходимые пакеты с помощью pip install -r requirements.txt .
cli.py командной строки в этом репозитории в настоящее время поддерживает три различных режима обучения (PET, IPET, контролируемое обучение), два дополнительных метода оценки (неконтролируемое и заполнение) и 13 различных задач. Для обзоров Yelp, новости AG, Yahoo Ofters, MNLI и X-Stance, см. Первоначальную статью для получения более подробной информации. Для 8 задач SuperGlue см. В этой статье.
Чтобы тренировать и оценить модель домашних животных для одной из поддерживаемых задач, просто запустите следующую команду:
python3 cli.py
--method pet
--pattern_ids $PATTERN_IDS
--data_dir $DATA_DIR
--model_type $MODEL_TYPE
--model_name_or_path $MODEL_NAME_OR_PATH
--task_name $TASK
--output_dir $OUTPUT_DIR
--do_train
--do_eval
где
$PATTERN_IDS указывает PVP для использования. Например, если вы хотите использовать все шаблоны, укажите PATTERN_IDS 0 1 2 3 4 для новостей AG и вопросов Yahoo или PATTERN_IDS 0 1 2 3 для обзоров Yelp и MNLI.$DATA_DIR - это каталог, содержащий файлы поезда и тестовые файлы (проверьте tasks.py .$MODEL_TYPE - это название используемой модели, например, albert , bert или roberta .$MODEL_NAME -это название предварительно предварительной модели (например, roberta-large или albert-xxlarge-v2 ) или путь к предварительному модели.$TASK_NAME - это имя задачи для обучения и оценки.$OUTPUT_DIR - это имя каталога, в котором сохраняются обученная модель и результаты оценки. Вы можете дополнительно указать различные учебные параметры как для ансамбля моделей PET, соответствующих отдельным PVP (префикс --pet_ ), так и для последней модели классификации последовательностей (Prefix --sc_ ). Например, параметры по умолчанию, используемые для нашей оценки SuperGlue:
--pet_per_gpu_eval_batch_size 8
--pet_per_gpu_train_batch_size 2
--pet_gradient_accumulation_steps 8
--pet_max_steps 250
--pet_max_seq_length 256
--pet_repetitions 3
--sc_per_gpu_train_batch_size 2
--sc_per_gpu_unlabeled_batch_size 2
--sc_gradient_accumulation_steps 8
--sc_max_steps 5000
--sc_max_seq_length 256
--sc_repetitions 1
Для каждого шаблона $P и повторения $I , запуск вышеупомянутой команды создает каталог $OUTPUT_DIR/p$Pi$I , который содержит следующие файлы:
pytorch_model.bin : Menetuned Model, возможно, вместе с некоторыми специфическими файлами модели (например, spiece.model , special_tokens_map.json )wrapper_config.json : конфигурация используемой моделиtrain_config.json : конфигурация, используемая для обученияeval_config.json : конфигурация, используемая для оценкиlogits.txt : прогнозы модели на немеченых данныхeval_logits.txt : прогноз модели в данных оценкиresults.json : файл JSON, содержащий результаты, такие как конечная точность моделиpredictions.jsonl : файл прогнозирования для оценки, установленного в формате SuperGlue Окончательная (дистиллированная) модель для каждого повторения $I можно найти в $OUTPUT_DIR/final/p0-i$I , который содержит те же файлы, что и описано выше.
Если в вашем GPU заканчивается память во время обучения, вы можете попробовать уменьшить как pet_per_gpu_train_batch_size , так и sc_per_gpu_unlabeled_batch_size при увеличении как pet_gradient_accumulation_steps , так и sc_gradient_accumulation_steps .
Чтобы обучить и оценить модель IPET для одной из поддерживаемых задач, просто запустите ту же команду, что и выше, но замените --method pet на --method ipet . Существуют различные дополнительные параметры IPET, которые вы можете изменить; Все они префикс --ipet_ .
Для каждого поколения $G , шаблона $P и итерации $I , это создает каталог $OUTPUT_DIR/g$G/p$Pi$I , который структурирован как обычный PET. Окончательная (дистиллированная) модель снова можно найти в $OUTPUT_DIR/final/p0-i$I .
Если вы используете IPET с нулевыми примерами обучения, вам необходимо указать, сколько примеров для каждой метки следует выбрать в первом поколении, и вам необходимо изменить стратегию сокращения на означать: --ipet_n_most_likely 100 --reduction mean .
Чтобы обучить и оценить обычный классификатор последовательности под контролем, просто запустите ту же команду, что и выше, но замените --method pet на --method sequence_classifier . Существуют различные дополнительные параметры для классификатора последовательностей, который вы можете изменить; Все они префикс -с --sc_ .
Чтобы оценить предварительную языковую модель с помощью узоров и вербализаторов по умолчанию, но без точной настройки, удалите аргумент --do_train и добавьте --no_distillation чтобы окончательная перегонка не выполнялась.
Если вы хотите использовать прайминг, удалите аргумент --do_train и добавьте аргументы --priming --no_distillation , чтобы все обучающие примеры использовались для заполнения, и окончательная дистилляция не выполняется.
Помните, что вам может потребоваться увеличить максимальную длину последовательности до гораздо большего значения, например, --pet_max_seq_length 5000 . Это работает только с языковыми моделями, которые поддерживают такие длинные последовательности, например, xlnet. Для использования xlnet вы можете указать --model_type xlnet --model_name_or_path xlnet-large-cased --wrapper_type plm .
Вместо использования интерфейса командной строки вы также можете напрямую использовать API PET, большинство из которых определены в pet.modeling . Включив import pet , вы можете получить доступ к таким методам, как train_pet , train_ipet и train_classifier . Проверьте их документацию для получения дополнительной информации.
Чтобы использовать PET для пользовательских задач, вам нужно определить две вещи:
examples/custom_task_processor.py для примера.examples/custom_task_pvp.py для примера.После реализации DataProcessor и PVP вы можете обучить модель питомца, используя командную строку, как описано выше. Ниже вы можете найти дополнительную информацию о том, как определить два компонента PVP, вербализаторов и шаблонов .
Вербализаторы используются для картирования меток задач на словах на естественном языке. Например, в задаче классификации бинарных настроений вы можете составить на карту положительную метку ( +1 ) с словом good и отрицательной меткой ( -1 ) с словом bad . Вербализаторы реализуются с помощью метода PVP verbalize() . Самый простой способ определения вербализатора - использовать словарь:
VERBALIZER = { "+1" : [ "good" ], "-1" : [ "bad" ]}
def verbalize ( self , label ) -> List [ str ]:
return self . VERBALIZER [ label ] Важно отметить, что в текущей версии ПЭТ вербализаторы по умолчанию ограничены одиночными токенами в основном словаре LMS (для использования более одного токена, см. Ниже). Учитывая токенизатор языковой модели, вы можете легко проверить, соответствует ли слово один токен, подтвердив, что len(tokenizer.tokenize(word)) == 1 .
Вы также можете определить несколько вербализаций для одной метки. Например, если вы не уверены, какие слова лучше всего представляют этикетки в задаче классификации двоичных настроений, вы можете определить свой вербализатор следующим образом:
VERBALIZER = { "+1" : [ "great" , "good" , "wonderful" , "perfect" ], "-1" : [ "bad" , "terrible" , "horrible" ]} Паттерны используются, чтобы заставить языковую модель понять данную задачу; Они должны содержать ровно один <MASK> токен, который должен быть заполнен с помощью вербализатора. Для классификации двоичных настроений на основе резюме обзора ( <A> ) и тела ( <B> ) может быть подходящая картина <A>. <B>. Overall, it was <MASK>. Паттерны реализуются с помощью метода pvp get_parts() , который возвращает пару текстовых последовательностей (где каждая последовательность представлена списком строк):
def get_parts ( self , example : InputExample ):
return [ example . text_a , '.' , example . text_b , '.' ], [ 'Overall, it was ' , self . mask ]Если вы не хотите использовать пару последовательностей, вы можете просто оставить вторую последовательность пустой:
def get_parts ( self , example : InputExample ):
return [ example . text_a , '.' , example . text_b , '. Overall, it was ' , self . mask ], [] Если вы хотите определить несколько шаблонов, просто используйте атрибут PVP S pattern_id :
def get_parts ( self , example : InputExample ):
if self . pattern_id == 1 :
return [ example . text_a , '.' , example . text_b , '.' ], [ 'Overall, it was ' , self . mask ]
elif self . pattern_id == 2 :
return [ 'It was just ' , self . mask , '!' , example . text_a , '.' , example . text_b , '.' ], [] При обучении модели, используя командную строку, укажите все шаблоны, которые будут использоваться (например, --pattern_ids 1 2 ).
Важно отметить, что если последовательность длиннее указанной максимальной длины последовательности базового LM, ПЭТ должен знать, какие части ввода могут быть сокращены, а какие не могут (например, токен маски всегда должен быть там). Следовательно, PVP обеспечивает shortenable() метод, чтобы указать, что кусок текста может быть сокращен:
def get_parts ( self , example : InputExample ):
text_a = self . shortenable ( example . text_a )
text_b = self . shortenable ( example . text_b )
return [ text_a , '.' , text_b , '. Overall, it was ' , self . mask ], []По умолчанию текущая реализация PET и IPET поддерживает только фиксированный набор меток, который используется по всем примерам и вербализаторам, которые соответствуют одному токену. Однако для некоторых задач может потребоваться использование вербализаторов, которые соответствуют множественным токенам (как описано здесь). Для этого вам просто нужны следующие две модификации:
Добавьте следующие строки в DataProcessor вашей задачи (см. examples/custom_task_processor.py ):
from pet . tasks import TASK_HELPERS
from pet . task_helpers import MultiMaskTaskHelper
TASK_HELPERS [ 'my_task' ] = MultiMaskTaskHelper Где 'my_task' - это имя вашей задачи.
В вашем PVP убедитесь, что метод get_parts() всегда вводит максимальное количество токенов маски, необходимых для любой вербализации. Например, если ваш вербализатор отображает +1 на «действительно удивительный» и -1 к «ужасно» и если они токенизированы как ["really", "awe", "##some"] и ["terrible"] , соответственно, ваш метод get_parts() всегда должен возвращать последовательность, которая содержит ровно 3 маски.
При этой модификации вы теперь можете использовать вербализаторы, состоящие из нескольких токенов:
VERBALIZER = { "+1" : [ "really good" ], "-1" : [ "just bad" ]}Тем не менее, есть несколько ограничений для рассмотрения:
MultiMaskTaskHelper максимальный размер партии для оценки составляет 1.MultiMaskTaskHelper - это экспериментальная особенность, которая не тщательно протестирована. В частности, эта функция была протестирована только для PET, а не для IPET. Если вы соблюдаете что -то странное, пожалуйста, поднимите проблему. Для большей гибкости вы также можете написать пользовательский TaskHelper . В качестве отправной точки вы можете проверить классы CopaTaskHelper , WscTaskHelper и RecordTaskHelper в pet/task_helpers.py .
Если вы используете код в этом репозитории, пожалуйста, укажите следующие документы:
@article{schick2020exploiting,
title={Exploiting Cloze Questions for Few-Shot Text Classification and Natural Language Inference},
author={Timo Schick and Hinrich Schütze},
journal={Computing Research Repository},
volume={arXiv:2001.07676},
url={http://arxiv.org/abs/2001.07676},
year={2020}
}
@article{schick2020small,
title={It's Not Just Size That Matters: Small Language Models Are Also Few-Shot Learners},
author={Timo Schick and Hinrich Schütze},
journal={Computing Research Repository},
volume={arXiv:2009.07118},
url={http://arxiv.org/abs/2009.07118},
year={2020}
}