Вопрос или проблема
Я прочитал, что GPT-2 и другие трансформеры используют нормализацию по слоям перед блоками самовнимания и полносвязными слоями, но я все еще не уверен, как именно работает нормализация.
Предположим, что наш размер контекста составляет 1024 токена, размер вложения — 768 (так что каждый токен и его последующие скрытые состояния представлены векторами размером 768), и мы используем 12 много голов самовнимания. Таким образом, на диаграмме выше есть 1024 r, и каждое r имеет размерность 768.
Для данного слоя в трансформере, сколько статистик нормализации (выборочное среднее и стандартное отклонение) вычисляется? Мы делаем одну нормализацию на токен, то есть 12×1024 нормализаций так, чтобы значения признаков внутри каждого токена имели среднее 0 и стандартное отклонение 1? Или мы нормализуем значения для каждого признака по токенам, то есть 12×768 нормализаций? Или мы нормализуем все значения признаков для всех токенов вместе, то есть 12 нормализаций? Мы вычисляем отдельные нормализации для каждого контекста в мини-выборке?
Мне также интересно интуитивно понять, почему эта нормализация желательна. Предположим, что схема заключается в нормализации значений признаков внутри каждого токена: давайте представим, что один из наших токенов — безликое слово, как “ок”, тогда как другой токен — слово “ненависть”. Я ожидал бы, что представление “ненависти” будет более “колючим”, с более высокой дисперсией среди различных значений признаков. Почему полезно выбросить эту информацию и заставить представление для “ок” быть таким же “колючим”? С другой стороны, если схема нормализации заключается в нормализации значений признаков, так что если вы возьмете признак 1 от всех токенов в нашем контексте, они будут иметь нулевое среднее и стандартное отклонение 1, не выбрасывает ли это информацию, когда все слова в нашем контексте очень негативные, например, в контексте “война насилие ненависть страх”?
Отдельно, с нормализацией по слоям, похоже, что необязательно повторно масштабировать нормализованные значения через обученные параметры смещения и коэффициента. Делает ли это GPT-2 или сохраняет ли значения нормализованными со средним 0 и стандартным отклонением 1?
Наиболее стандартная реализация использует LayerNorm от PyTorch, которая применяет нормализацию по слоям к мини-пакету входных данных. Среднее и стандартное отклонение рассчитываются по отдельности для последнего определенного количества размерностей, которые должны иметь форму, указанную в аргументе normalized_shape
. Чаще всего normalized_shape соответствует размеру вложения токена.
Статья “О нормализации по слоям в архитектуре трансформера” подробно обсуждает эту тему. В статье предлагается, что “нормализация по слоям играет решающую роль в контроле шкалы градиентов.” Лучше ведущие градиенты помогают в обучении.
Согласно справочному материалу, нормализация по слоям применяется 2 раза на блок (или слой). Один раз для скрытых состояний из выхода слоя внимания и один раз для скрытых состояний из выхода слоя прямой пропорции. Однако, это
(Для реализации hugging-face вы можете проверить class Block
здесь)
Для вашего примера нормализация не обязательно изменяет порядок “колючек” различных токенов, но изменяет величину “колючек”. Это показало, что увеличивает время обучения модели и улучшает производительность. (статья)
В последнее время я работаю над FastTransformer от NVIDIA. По крайней мере, в их реализации нормализации по слоям нормализации применяются к каждому входному токену (то есть его последующим скрытым состояниям) отдельно. Для вашего примера это будет означать расчет 12×1024 средних и стандартных отклонений.
Я думаю, они выбрали реализовать нормализацию по слоям таким образом, потому что, если нормализовать все значения признаков для всех токенов вместе, выходные токены для предыдущих входных токенов будут зависеть от последующих токенов, что требует перерасчета на каждой итерации “прямого распространения”. Если мы применяем нормализацию к каждому токену отдельно, этого не произойдет, так что мы можем просто хранить ключи и значения для предыдущих токенов (NVIDIA называет их k/v кэшем) вместо того, чтобы снова и снова выполнять полное внимание с несколькими головами.
Нормализация по слоям (LN) и ее реализация – это один из более запутанных аспектов трансформеров.
Первоначальная цель нормализации – стабилизировать градиентный спуск во время обучения. В частности, нормализация дает модели больший контроль над распределением данных. Эта статья объясняет это в контексте нормализации по батчам (BN), но те же принципы применимы к LN. Обратите внимание, что BN не может быть эффективно применена к тексту, потому что количество токенов варьируется от одного входа к другому в батче, поэтому необходима LN.
В контексте трансформеров LN работает с одним текстом (последовательностью) за раз. Это включает в себя вычисление одного среднего и стандартного отклонения для каждого токена, т.е. в случае OP будет 1024 средних и стандартных отклонений. Затем, как правило, каждое значение признака/размерности каждого токена масштабируется и смещается с использованием среднего токена, стандартного отклонения и 2 обученных параметров, называемых смещением и коэффициентом. Существует одно значение смещения и коэффициента на размерность для всех токенов, т.е. входные токены делят обученные параметры. Смотрите реализации LN в BERT и GPT-2 как примеры. Смотрите также Раздел 5.1 в оригинальной статье LN, где говорится: “Они также изучают адаптивное смещение b и коэффициент g для каждого нейрона после нормализации.” Таким образом, в случае OP будет 768 обученных параметров смещения и коэффициента для каждого слоя LN.
Обратите внимание, что ни одна из схем нормализации в вопросе OP не соответствует тому, как действительно производится нормализация. Статистики нормализации вычисляются для каждого токена, но смещение и коэффициент применяются по всем токенам. Кроме того, нормализация не обязательно делает вложения токенов “колючими” или “гладкими”. Нормализация позволяет модели выбирать распределение данных.
Ответ или решение
Подробное объяснение Layer Normalization в GPT-2
Введение
Layer normalization (LN) является важной частью архитектуры трансформеров, таких как GPT-2. Она помогает улучшить стабильность и скорость обучения, что особенно важно для работы с последовательными данными, такими как текст. В этой статье мы детально рассмотрим, как работает layer normalization в GPT-2, включая статистику нормализации, интуитивные причины ее использования и методы масштабирования нормализованных значений.
Статистика нормализации
В контексте GPT-2, слой нормализации применяется к скрытым состояниям на выходе слоя внимания и на выходе feedforward-слоя. Для заданного слоя с размером контекста в 1024 токена и размером встраивания 768 каждая токен-репрезентация состоит из 768 значений. Нормализация в GPT-2 происходит следующим образом:
-
Нормализация для каждого токена: Для каждого токена в последовательности вычисляется среднее значение и стандартное отклонение по всем 768 признакам. Это означает, что для каждого токена будет вычислено 1 среднее и 1 стандартное отклонение, что в итоге дает 1024 средних и стандартных отклонений для всех токенов в контексте.
-
Итоговая статистика: Таким образом, общее количество статистик нормализации будет 1024, поскольку нормализация происходит по признакам внутри каждого токена. Также, если в модели существует 12 голов самовнимания, то каждое внимание будет нормально распределено, но статистике подвержена каждая голова.
Интуитивные причины использования нормализации
Layer normalization помогает интегрировать и регулировать градиенты во время обучения. Эта нормализация обеспечивает более стабильные и предсказуемые уровни активации, что в свою очередь эффективно помогает модели справляться с изменениями в распределении данных:
-
Если рассмотреть разные токены, такие как "ok" и "hatred", действительно, можно ожидать, что "hatred" будет иметь более выраженные (или "шпилевидные") представления по сравнению с нейтральным словом "ok". Однако normalizaiton позволяет изменить величину этих "шпилевидных" представлений, что может облегчить обучение. Это делает процесс градиентного спуска более управляемым, поскольку нормализованные значения приводят к лучшей сходимости за счет уменьшения влияния нестабильных активаций.
-
Относительно нормы по признакам, действительно существует риск потери информации, если все признаки нормализовать вместе; но в контексте обработки, помимо определения пропорций, важно обеспечить, чтобы каждая токен-репрезентация оставалась в пределах управляемого диапазона.
Масштабирование нормализованных значений
GPT-2 использует перенастраиваемые параметры смещения (bias) и масштаба (gain) после нормализации. После применения layer normalization каждое нормализованное значение масштабируется и сдвигается с использованием этих параметров. Это добавляет необходимую гибкость, позволяя модели больше адаптироваться к различным данным:
-
Для каждого из 768 признаков в модели существуют отдельные значения bias и gain, которые обучаются вместе с остальными параметрами модели. Это дает возможность каждому токену адаптироваться к своей специфике даже после нормализации.
-
В случае реализации "LayerNorm" для каждой исполняемой головы это создает разные подмодели, каждая из которых может учесть уникальные черты конкретного токена, несмотря на коллективную нормализацию.
Заключение
Layer normalization – это критический компонент в архитектуре GPT-2, который помогает стабилизировать процесс обучения и улучшать качество генерируемого текста. Управляя нормализацией как для каждого токена отдельно, так и через перенастраиваемые параметры, модель сохраняет баланс между стабильностью активации и выразительностью представлений слов. Важно понимать, что хотя данный процесс может привести к некоторой потере информации о характеристиках токенов, он направлен на улучшение общей способности модели к обучению и обобщению.