Декодирование LLMs Создание кодировщиков трансформеров и многоступенчатых слоев внимания в Python с нуля

Декодирование LLMs Создание кодировщиков трансформеров и многоступенчатых слоев внимания в Python с нуля

Исследование тонкостей работы кодировщика, много-внимания и позиционного кодирования в больших языковых моделях

Этот пост был написан совместно с Рафаэлем Нарди.

Введение

Сегодня Вычислительная естественноязычная обработка (NLP) является быстро развивающимся предприятием, в котором сила вычислений соединяется с лингвистикой. Лингвистическая сторона этого основана в основном на теории Дистрибутивной Семантики Джона Руперта Ферта. Он однажды сказал следующее:

«Вы узнаете слово по его компаньонам»

Таким образом, семантическое представление слова определяется контекстом, в котором оно используется. Именно исходя из этого предположения статья “Вся ваша модель нуждается в внимании” Ашиша Васвани и др. [1] приобретает свою революционную значимость. Она устанавливает трансформирующую архитектуру в качестве ядра многих быстрорастущих инструментов, таких как BERT, GPT4, Лама и др.

В этой статье мы рассматриваем ключевые математические операции, лежащие в основе сегмента кодировщика в архитектуре трансформатора.

Рисунок 1: Самодостаточное внимание сложно (изображение автора)

Как всегда, код доступен на нашем GitHub.

Токенизация, эмбеддинги и векторные пространства

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

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