*"П. Г. Вудхаус»

Долгое время я не мог начать с НЛП, потому что не знал «всех» основ, и это казалось слишком утомительной работой. Я потерял интерес к онлайн-лекциям, потому что они обычно односторонние, не адаптированы к потребностям студента, а очень общие и иногда слишком простые. Просто нужно приложить немало усилий, чтобы продолжать. Но написание кода, наблюдение за результатами, чтение для их улучшения вознаграждаются. Вот чем я сейчас занимаюсь.

Вещи, которые я начал и не завершил на сто процентов:

  • Абсолютная необходимость: обработка естественного языка CS224n с глубоким обучением, которую преподает Крис Мэннинг в Стэнфорде. Это мой фаворит до сих пор, и я надеюсь, что я закончу его.
  • Учебник: обработка речи и языка Джурафски и Мартина. (Первые 3 главы): отличный ресурс для подробного понимания области НЛП: проблема, оценка решения. Будет продолжать читать.
  • Специализация по НЛП на Coursera (прошла 4 из 5 курсов): Хотя лекции хорошие, я думал, что задания не очень интересны. Были некоторые, где я просто должен был запустить все ячейки ноутбука Jupyter. Хотя это был отличный код, написанный там, изучение всего этого не будет таким хорошим опытом обучения, как реализация чего-то самостоятельно.
  • Обучающая серия Deepmind на YouTube. Прекрасные лекции, но нет практики.

Что я выучил:

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

Так много разговоров. Вот я опускаю ноготь мизинца в воду: https://github.com/shikha-aggarwal/wodehouse-generator/blob/main/gpt2_huggingface_GPU.ipynb

Я взял GPT и настроил его на рассказах П. Г. Вудхауза (взято с сайта Project Gutenberg). [Почему Вудхаус? Потому что… мля. Просто идите и сначала прочитайте Любовь среди цыплят, а затем возвращайтесь.]

Вот автоматически сгенерированный контент:

Подсказка: «Это было на Оксфорд-стрит, в час, когда женщины приезжали из пригорода за покупками; и он стоял среди собак и комиссионеров возле Селфриджа».

Сгенерированный текст 1: Он чувствовал то странное воодушевление, трепет, который приходит к тем, кто хорошо учился в школе, триумфальное сияние, которое ведет к алтарю в "Савойе" и достигает даже детской секции универмаги.

Все, что ему нужно было сделать, это торчать и ждать, и вскоре другой парень возьмется за дело и сделает это с ним, и это будет его триумфом. Что касается меня, я бы просто сидел там. До сих пор он не показывал мне ничего, кроме мрачного будущего. На самом деле, в настоящий момент мне кажется, что мое существование по соседству будет несколько скучным.

Сгенерированный текст 2:"Дай мне это, Лиз!" Он махнул рукой пораженной даме. — Пара, — пояснил он. Он не вдавался в подробности, но, по его мнению, дело требовало объяснения. Салли была в приподнятом настроении. Она могла бы бороться с тягой, но казалось, что она должна прийти к какому-то заключению. — Что ты имеешь в виду? «Ну, чего ты хочешь? Почему я должен скрывать свою любовь к тебе?» Он достал из кармана еще одну сигару и снова зажег ее.

Текст кажется мне невероятно вудхаузовским! Несмотря на то, что история здесь идет немного наперекосяк и многое другое вскоре, языковые навыки (грамматика, выбор слов, стиль диалога, пунктуация) выглядят довольно солидно.

Что это за GPT, который хорошо работает?

Я попытался прочитать статью и документ OpenAI. Во второй строке говорится: Наш подход представляет собой комбинацию двух существующих идей: трансформаторов и неконтролируемого предварительного обучения. А — трансформеры? Отступив на шаг, я прочитал это: Иллюстрированный трансформер.

Я узнал, что Transformer — это модель, состоящая из кодировщика и декодера: проще всего представить это на примере модели перевода — с английского предложения на хинди. Представьте себе, что часть Encoder изучает детали английского языка и преобразует их в независимое от стиля представление, которое используется Decoder для добавления украшений на хинди и получения (надеюсь) правильного вывода.

Всегда полезно что-то прочитать и резюмировать, чтобы запомнить (и забыть на 2 дня позже, чем в противном случае). Вот мое резюме после прочтения сообщения в блоге:

  • Несколько энкодеров, установленных друг на друга;
  • Встраивание слов + позиционное кодирование, переданное в самый нижний кодировщик.
  • длина предложения — это параметр, и все слова предложения подаются в заголовок первого внимания — каждое слово проходит свой собственный путь в кодировщике. Между этими путями на уровне внимания к себе существуют зависимости. Однако уровень прямой связи не имеет таких зависимостей, и поэтому различные пути могут выполняться параллельно при прохождении через уровень прямой связи.
  • Каждый кодировщик имеет уровень самоконтроля, а затем NN с прямой связью.
  • Собственное внимание:Q, K, V — векторы запросов, ключей и значений обучены. Они используются для вычисления отношения слова к другим словам в предложении. Q * K дает отношение и передается через softmax, который при умножении на вектор значений V сохраняет только те значения, на которых мы хотим сосредоточиться (удаляет ненужные слова).
  • softmax(Q*KT/sqrt(dk)) * V = z. z передается в FFNN.
  • Многоголовое внимание: параллельные Q, K, V обучаются путем их случайной инициализации — идея состоит в том, чтобы фиксировать различные виды зависимостей внутри слов.
  • z от каждой головки внимания объединяются, а затем умножаются на другую матрицу W (для каждого кодировщика), чтобы получить один z и передается в FFNN.
  • Выход из конечного кодировщика преобразуется в матрицы K, V для всех декодеров (один и тот же вход) в стеке декодера. Q вычисляется из декодера ниже.
  • само-внимание в декодере просматривает только более ранние позиции (реализуется установкой будущих позиций в -inf на шаге softmax при расчете собственного внимания),
  • Декодер начинает с начального маркера и принимает в качестве входных данных список предыдущих выходных данных, а также выходные данные кодировщика, которые содержат информацию о внимании из входных данных. Декодер останавливает декодирование, когда генерирует токен в качестве вывода.
  • Поиск луча. Один из вариантов вывода декодера — применить softmax к окончательному выводу и выбрать слово с наибольшей вероятностью. Но если beam_size = 2, тогда оставьте два верхних варианта и запустите декодер с обоими вариантами, а затем выберите тот, который дает меньшую ошибку в следующем раунде! top_beams = 2 означает, что вы хотите вернуть столько лучших конечных результатов для каждого предложения.
  • Функция потерь: сравните ожидаемое и полученное распределения вероятностей. :D

У Google Tensorflow есть отличная документация по его реализации: https://www.tensorflow.org/tutorials/text/transformer

[Далее: Как работает GPT?]