Хорошее описание – всё, что вам нужно

Совершенное описание – всё, что вам необходимо

Как использовать обучение на небольшом количестве примеров для улучшения производительности классификации текста

Фото от Patrick Tomasso на Unsplash

Я уже довольно долгое время использую большие языковые модели (LLM) как в личных проектах, так и в рамках моей повседневной работы. Как и многие люди, меня впечатляют мощные возможности этих моделей. Тем не менее, важно знать, что, хотя эти модели и очень мощные, их всегда можно улучшить для различных задач.

Но НЕТ, я не собираюсь писать о файнтюнинге LLM, который может быть дорогостоящим и часто требует мощного устройства с GPU. Фактически, я собираюсь показать вам очень простой метод улучшения вашей модели с использованием обучения на небольшом количестве примеров.

Обучение на небольшом количестве примеров – это техника машинного обучения, при которой модели обучаются решать новые задачи, используя всего несколько примеров, часто только 1-5 примеров на каждый класс. В обучении на небольшом количестве примеров есть несколько ключевых моментов:

  • Обучение обобщать на основе небольшого объема данных: методы обучения на небольшом количестве примеров стремятся обучать модели, которые могут хорошо обобщать на основе небольшого числа примеров, в отличие от традиционных методов глубокого обучения, требующих тысяч или миллионов примеров.
  • Перенос обучения: методы обучения на небольшом количестве примеров используют знания, полученные при решении предыдущих задач, и переносят эти знания для помощи в быстром обучении новых задач на меньшем количестве данных. Перенос обучения является ключевой возможностью.
  • Обучение метрикам сходства: некоторые методы обучения на небольшом количестве примеров фокусируются на обучении метрики сходства между примерами. Это позволяет сравнивать новые примеры с уже размеченными примерами для прогнозирования.

Но как можно использовать обучение на небольшом количестве примеров в задаче классификации для улучшения производительности модели? Рассмотри пример.

Данные и подготовка

Я начал анализ с получения данных от HuggingFace. Набор данных называется financial-reports-sec (Этот набор данных имеет лицензию Apache License 2.0 и разрешение на коммерческое использование), и, согласно авторам набора данных, он содержит годовые отчеты американских публичных компаний, подающих заявку в систему SEC EDGAR с 1993 по 2020 год. Каждый годовой отчет (10-K-отчет) разделен на 20 секций.

Для текущей задачи полезны два атрибута этого набора данных:

  • Предложение: Выдержки из 10-K-отчетов
  • Секция: Метки, обозначающие секцию 10-K-отчета, к которой относится предложение

Я сосредоточился на трех секциях:

  • Бизнес (Пункт 1): Описывает деятельность компании, включая филиалы, рынки, последние события, конкуренцию, регулирование и трудовые вопросы. Обозначается цифрой 0 в данных.
  • Факторы риска (Пункт 1A): Обсуждаются риски, которые могут повлиять на компанию, такие как внешние факторы, потенциальные сбои и другие раскрытия для предупреждения инвесторов. Обозначается цифрой 1.
  • Активы (Пункт 2): Подробности значительных физических активов вне интеллектуальной или имматериальной собственности. Обозначается цифрой 3.

Для каждой метки я выбрал 10 примеров без повторений. Данные имеют следующую структуру:

Предсказания “из коробки”

После подготовки данных мне нужно только создать функцию классификатора, которая берет предложение из базы данных и предсказывает метку.

Role = '''Вы являетесь экспертом в формах SEC 10-K. Вам будет представлен текст, и вам нужно классифицировать текст как 'Пункт 1', 'Пункт 1А' или 'Пункт 2'. Текст относится только к одной из упомянутых категорий, поэтому верните только одну категорию.'''def sec_classifier(text):         response = openai.ChatCompletion.create(        model='gpt-4',        messages=[            {                "role": "system",                "content": Роль},            {                "role": "user",                "content": text}],        temperature=0,        max_tokens=256,        top_p=1,        frequency_penalty=0,        presence_penalty=0)    return response['choices'][0]['message']['content']

Здесь я использую GPT-4, поскольку это самая продвинутая модель OpenAI до сих пор. Я также установил температуру на 0, чтобы убедиться, что модель не отклонится от заданного пути. Очень интересная часть – это определение Роли — это то, где я могу направить модель на то, что я от нее хочу. Роль указывает модели оставаться сосредоточенной и предоставлять именно тот вывод, которого я ожидаю. Определение четкой роли для модели помогает ей генерировать соответствующие, высококачественные ответы. Запрос в этой функции следующий:

Вы являетесь экспертом в формах SEC 10-K. Вам будет представлен текст, и вам нужно классифицировать текст как ‘Пункт 1’, ‘Пункт 1А’ или ‘Пункт 2’. Текст относится только к одной из упомянутых категорий, поэтому верните только одну категорию.

После применения функции классификации ко всем строкам данных я сгенерировал отчет о классификации, чтобы оценить производительность модели. Макро-среднее значение F1-меры составило 0.62, что указывает на довольно сильные предиктивные возможности для этой мультиклассовой задачи. Поскольку количество примеров было сбалансировано во всех 3 классах, макро- и взвешенные средние значения совпали. Этот базовый показатель отражает точность использования предварительно обученной модели “из коробки” до дополнительной настройки.

               precision    recall  f1-score   support      Item 1       0.47      0.80      0.59        10     Item 1A       0.80      0.80      0.80        10      Item 2       1.00      0.30      0.46        10    accuracy                           0.63        30   macro avg       0.76      0.63      0.62        30weighted avg       0.76      0.63      0.62        30

Описание – все, что вам нужно (метод малообученного прогнозирования)

Как уже упоминалось, метод малообученного обучения заключается в обобщении модели на основе нескольких хороших примеров. В этом отношении я изменил свой класс, описав, что такое Пункт 1, Пункт 1А и Пункт 2 (основываясь на Википедии):

Role_fewshot = '''Вы являетесь экспертом в формах SEC 10-K. Вам будет представлен текст, и вам нужно классифицировать текст как 'Пункт 1', 'Пункт 1А' или 'Пункт 2'. Текст относится только к одной из упомянутых категорий, поэтому верните только одну категорию. При классификации учтите следующие определения: Пункт 1 (т.е. Бизнес) описывает деятельность компании: кто и что делает компания, какими дочерними компаниями она владеет и на каких рынках она действует. Он также может включать в себя недавние события, конкуренцию, регулирование и проблемы рынка труда. (Некоторые отрасли имеют высокую степень регулирования, сложные требования к труду, что существенно влияет на бизнес.) Другие темы в этом разделе могут включать особые операционные расходы, сезонные факторы или вопросы страхования.Пункт 1А (т.е. Факторы риска) - это раздел, в котором компания указывает все возможные проблемы, вероятные внешние воздействия, возможные будущие неисполнения обязательств и другие риски, раскрытые для надлежащего предупреждения инвесторам и потенциальным инвесторам. Пункт 2 (т.е. Имущество) - это раздел, в котором указываются значительные имущественные активы компании. Сюда входят только физические виды имущества, а не интеллектуальная или нематериальная собственность.Примечание: Укажите только пункт.'''def sec_classifier_fewshot(text):         response = openai.ChatCompletion.create(        model='gpt-4',        messages=[            {                "role": "system",                "content": Роль_немногообуч},            {                "role": "user",                "content": text}],        temperature=0,        max_tokens=256,        top_p=1,        frequency_penalty=0,        presence_penalty=0)    return response['choices'][0]['message']['content']

Сообщение теперь выглядит так:

Вы являетесь экспертом по формам SEC 10-K. Вам будет представлен текст, и вам нужно классифицировать текст в одну из категорий «Пункт 1», «Пункт 1А» или «Пункт 2». Текст может относиться только к одной из упомянутых категорий, поэтому возвращайте только одну категорию. При классификации учитывайте следующие определения:

Пункт 1 (т.е. Деятельность) описывает деятельность компании: кем и чем занимается компания, какие филиалы она владеет и на каких рынках она работает. Он также может включать недавние события, конкуренцию, регулирование и трудовые вопросы. (Некоторые отрасли имеют сильное регулирование, сложные требования к труду, которые оказывают значительное влияние на бизнес.) Другие темы в этом разделе могут включать особые операционные расходы, сезонные факторы или вопросы страхования.

Пункт 1A (т.е. Факторы риска) – это раздел, в котором компания раскрывает все, что может пойти не так, вероятные внешние воздействия, возможные будущие неисполнения обязательств и другие риски, раскрытые для достаточного предупреждения инвесторов и потенциальных инвесторов.

Пункт 2 (т.е. Собственность) – это раздел, который описывает значимые имущественные активы компании. Здесь указываются только виды физической собственности, а не интеллектуальная или абстрактная собственность.

Если мы применим это к текстам, мы получим следующие результаты:

                precision     recall  f1-score   support     Item 1       0.70      0.70      0.70        10    Item 1A      0.78      0.70      0.74        10     Item 2      0.91      1.00      0.95        10   accuracy                   0.80        30  macro avg      0.80      0.80      0.80        30weighted avg      0.80      0.80      0.80        30

Макро-среднее значение F1 теперь составляет 0,80, то есть улучшение на 29% в нашем прогнозе, просто предоставив хорошее описание каждого класса.

Наконец, вы можете увидеть полный набор данных:

Фактически, предоставленные примеры позволяют модели изучать конкретные случаи. Примеры позволяют модели обращать внимание на общие черты и отличия, которые характеризуют общую концепцию, которую она изучает. Это помогает модели разработать более надежное представление. Кроме того, предоставление примеров фактически действует как слабая форма наблюдения, направляя модель к желаемому поведению вместо больших наборов размеченных данных.

В функции few-shot конкретные примеры помогают указать модели на типы информации и шаблонов, на которые ей следует обратить внимание. В заключение, конкретные примеры важны для обучения при малом количестве данных, поскольку они служат отправными точками для модели для создания начального представления новой концепции, которое затем может быть уточнено на основе нескольких приложенных примеров. Индуктивное обучение на основе конкретных примеров помогает моделям разрабатывать нюансные представления абстрактных концепций.

Если вам понравилась эта запись и вы хотите оставаться на связи, вы можете найти меня на LinkedIn или на моей веб-странице: iliateimouri.com

Примечание: Все изображения, если не указано иное, принадлежат автору.