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

Сериал разбит на две части:

ЧАСТЬ 1. Тонкая настройка google/t5-small-ssm, небольшого экземпляра T5 LLM с 77M параметрами,доступного на HuggingFace, подходит для генеративных, закрытых вопросов и ответов. Обучение проводится с использованием 90 тыс. загадочных кроссвордов для 50 эпох в Google Colab с использованием одного графического процессора T4, что занимает прибл. 6ч 40мин. Оценка выполняется на тестовом наборе из 10 000 примеров.

ЧАСТЬ 2 (СКОРО!): мы расширили это исследование, чтобы обучить гораздо более крупную модель, используя передовое квантованное представление, которое позволяет нам по-прежнему тренироваться, используя только один графический процессор.

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

Давайте углубимся в это!

Пример загадочного кроссворда (для менее знакомых)

Загадочные кроссворды выглядят так же, как обычные кроссворды, но ведут себя иначе.

Вот пример из The Telegraph «Большая книга загадочных кроссвордов 8, № 34»:

12. Тот, кого критикуют ни за что, становится обрезанным (8)

Ответ ИЗОЛИРОВАН. Обоснование этому изложено:

  • Определение обычно присутствует в начале или в конце подсказки в загадочных кроссвордах, в данном случае оно «отрезано».
  • Один пишется римскими цифрами как «Я».
  • Другое слово для слова «критикуется» — «ЗАПЛАНИРОВАНО».
  • Ничто не эквивалентно нулю, 0 или, возможно, «О».
  • Следовательно, у нас есть «Я» + «СПЛЕТЕННЫЙ» о «О», о также может означать «вокруг», и, следовательно, мы получаем ИЗОЛИРОВАННЫЙ, что означает «отрезанный».

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

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

Использование интеллектуального решения

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

Это была быстрая игра и, конечно, не научная. Я мог бы, если бы захотел, разработать интенсивный быстрый инженерный процесс, предположительно с использованием OpenAI API и покупкой некоторых токенов, который мог бы дать реальные результаты.

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

Это не первый пример применения глубокого обучения для решения кроссвордов. Ученый-компьютерщик объединился с профессором Беркли-колледжа Калифорнийского университета, чтобы разгадывать (незагадочные) кроссворды в качестве времяпрепровождения во время изоляции — их программа называется Dr. Наполнять". Существует приложение для iOS под названием «Crossword Genius, разработанное Unlikely AI, где можно сканировать кроссворды с помощью камеры телефона, а их собака-талисман Росс помогает решать и объяснять подсказки. Я попробовал, и хотя камера телефона не зафиксировала все подсказки на странице правильно (вы можете редактировать вручную), разгадывание подсказок очень впечатляет.

Обратите внимание, что эти примеры не просто решали подсказки, но фактически учитывали форму сетки кроссворда. Для простоты это было опущено здесь. Существует библиотека Python, которая может генерировать пользовательский интерфейс кроссворда из текстового файла, содержащего подсказки — что может быть интересно изучить в будущей работе.

Набор данных

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

Как объясняется в техническом описании веб-сайта, бывают случаи пустых значений и ошибок, поэтому репозиторий включает в себя простую предварительную обработку для удаления строк с поврежденными данными. Исходный GitHub, используемый этим набором данных, также содержит некоторые ограниченные случаи аннотаций, которые фактически объясняют ответ (аналогично моему объяснению подсказки выше), но для получения доступа требуется разрешение.

Методология

Ранее я уже упоминал, что это упражнение с вопросами и ответами для закрытой книги. Это означает, что нам нужна модель, которая может давать порождающие, а не дискриминационные ответы. У HuggingFace есть хороший учебник для дискриминативных вопросов и ответов в открытой книге  — это похоже на упражнение на понимание прочитанного, где модель учится находить ответ, присутствующий в блоке текста, называемом контекстом.

Учитывая, что у нас нет (и мы не хотим) кормить модели объяснениями кроссворда, это делает нашу задачу закрытой. Тем не менее, нам по-прежнему разрешено предоставлять столбец определения набора данных в качестве формы контекста на этапе обучения.

По этим причинам модель кодера-декодера Google T5 является подходящим кандидатом для наших целей. Полная модель, доступная на HuggingFace для вопросов и ответов, имеет 11 миллиардов параметров и колоссальный размер 45,2 ГБ, что означает, что размещение и обучение на одном графическом процессоре в экземпляре Colab невозможно. К счастью, существует меньшая модель с более разумными параметрами 300 МБ и 77 МБ.

Обучение

Модуль HuggingFace transformer предоставляет несколько примеров тонкой настройки и оценки набора данных понимания SQUAD. Мы используем эти примеры и немного адаптируем их для нашего закрытого варианта использования (различия подробно описаны в репозитории GitHub), включая сохранение выходных данных на этапе прогнозирования.

Мы провели обучение на наборе данных из 100 000 предварительно обработанных подсказок кроссворда, разделили 81 000 обучающих наборов, 9 000 проверочных и 10 000 заблокированных наборов данных. Вот некоторые из гиперпараметров модели факела, которые мы использовали ниже:

 python run_seq2seq_qa.py \
  --model_name_or_path 'google/t5-small-ssm'\
  ...
  --learning_rate 2e-3 \
  --num_train_epochs 25 \
  --per_device_train_batch_size 192 \
  --max_seq_length 64 \
  --versionevaluatewith_negative \
  ...
  • (Исходная) Скорость обучения: 2e-3. Тренер снижает рейт за эпоху
  • # эпох = 25. Это было настроено для запуска процесса в разумные сроки.
  • Размер партии = 192. Это было настроено для использования большого объема доступной памяти графического процессора (в среднем 13,6/15 ГБ доступно для графического процессора T4 в Colab), что еще больше сокращает время обучения.
  • Максимальная длина последовательности = 64 (часто больше для вопросов и ответов, но разгадки кроссворда короткие)
  • версияevaluateс_отрицательной. Это возвращает процесс оценки SQUAD v2 из модуля evaluate python. Выходные данные включают количество правильных ответов и оценку F1, выраженные в процентах.

Выполнение этого заняло 3 часа 20 минут (я использовал небольшой хак, который я нашел, чтобы остановить Colab от тайм-аута, проверьте README репозитория). Как видно на графике ниже, потери при обучении продолжали снижаться с приличной скоростью, что указывает на то, что использование большего количества эпох, хотя и занимает больше времени, может дать лучший результат.

Поэтому я решил провести второй раунд обучения еще на 25 эпох, используя предыдущую модель в качестве контрольной точки. Запуск занял столько же времени, а потери уменьшились в 10 раз.

Полученные результаты

Результаты прогноза выглядели так:

{
    ...
        "predict_samples": 10000,
        "test_exact": 32.24,
        "test_f1": 33.73559473859474,
    ...
}

Модель смогла правильно ответить на 3224 (32,24%) из 10 000 подсказок в тестовом наборе с оценкой F1 33,7%. Учитывая сложный характер загадочных подсказок, правильное получение более 3/10 подсказок действительно кажется мне обнадеживающим. Второе поощрение заключается в том, что длина строки прогноза верна в 85% случаев, а это означает, что модель учится использовать числа в скобках, присутствующие в подсказке.

Оценка F1 в задачах НЛП является мерой сходства между токенами предсказания и ответа — низкий балл здесь означает, что, когда предсказание не равно ответу, вероятно, это угадывание совсем другого слова или фразы.

Качественные проверки показывают разные результаты для неправильных ответов. Некоторые из них можно легко связать с подсказкой - в приведенных ниже примерах строка 2 неверна, но я вижу, что БЕГСТВО может быть другим словом для обозначения отпуска: модель неправильно дала определение. Точно так же в строке 3 не повезло дать правильный ответ, но с ошибкой на одну букву. Строки 4 и 5, я не уверен, что знаю, почему он дал предсказания, которые он дал!

Заключение / Часть 2

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

  • Увеличение количества обучающих примеров
  • Увеличение количества эпох
  • Использование большего LLM с большим количеством параметров

Все эти варианты требуют дополнительных затрат времени/вычислительных ресурсов. Однако для пункта 3 мы могли бы избежать этого, используя более мощный LLM, который был адаптирован для обучения на меньшем количестве ресурсов с помощью метода, называемого квантование. Мы рассмотрим это в Части 2, чтобы увидеть, улучшает ли это результаты. Следите за обновлениями!

(Если вы зашли так далеко, поздравляю, вот бонусный обзор того, что будет дальше: 🤫)