5. LLM Architecture
LLM Architecture
Мета цього п'ятого етапу дуже проста: Розробити архітектуру повного LLM. З'єднайте все разом, застосуйте всі шари та створіть усі функції для генерації тексту або перетворення тексту в ID та назад.
Ця архітектура буде використовуватися як для навчання, так і для прогнозування тексту після його навчання.
LLM architecture example from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb:
A high level representation can be observed in:
Input (Tokenized Text): Процес починається з токенізованого тексту, який перетворюється на числові представлення.
Token Embedding and Positional Embedding Layer: Токенізований текст проходить через шар векторизації токенів та шар позиційної векторизації, який захоплює позицію токенів у послідовності, що є критично важливим для розуміння порядку слів.
Transformer Blocks: Модель містить 12 блоків трансформера, кожен з яких має кілька шарів. Ці блоки повторюють наступну послідовність:
Masked Multi-Head Attention: Дозволяє моделі зосереджуватися на різних частинах вхідного тексту одночасно.
Layer Normalization: Крок нормалізації для стабілізації та покращення навчання.
Feed Forward Layer: Відповідає за обробку інформації з шару уваги та прогнозування наступного токена.
Dropout Layers: Ці шари запобігають перенавчанню, випадковим чином відключаючи одиниці під час навчання.
Final Output Layer: Модель виводить тензор розміром 4x50,257, де 50,257 представляє розмір словника. Кожен рядок у цьому тензорі відповідає вектору, який модель використовує для прогнозування наступного слова в послідовності.
Goal: Мета полягає в тому, щоб взяти ці векторизації та перетворити їх назад у текст. Конкретно, останній рядок виходу використовується для генерації наступного слова, представленого як "вперед" у цій діаграмі.
Code representation
GELU Активуюча Функція
Мета та Функціональність
GELU (Гаусова Помилка Лінійний Одиниця): Активаційна функція, яка вводить нелінійність у модель.
Плавна Активація: На відміну від ReLU, яка обнуляє негативні вхідні дані, GELU плавно відображає вхідні дані на виходи, дозволяючи невеликі, ненульові значення для негативних вхідних даних.
Математичне Визначення:
Мета використання цієї функції після лінійних шарів всередині шару FeedForward полягає в тому, щоб змінити лінійні дані на нелінійні, щоб дозволити моделі вивчати складні, нелінійні зв'язки.
FeedForward Нейронна Мережа
Форми були додані як коментарі для кращого розуміння форм матриць:
Мета та Функціональність
Позиційна FeedForward мережа: Застосовує двошарову повністю з'єднану мережу до кожної позиції окремо та ідентично.
Деталі Шарів:
Перший Лінійний Шар: Розширює розмірність з
emb_dim
до4 * emb_dim
.Активація GELU: Застосовує нелінійність.
Другий Лінійний Шар: Зменшує розмірність назад до
emb_dim
.
Як ви можете бачити, мережа Feed Forward використовує 3 шари. Перший - це лінійний шар, який помножить розміри на 4, використовуючи лінійні ваги (параметри для навчання всередині моделі). Потім функція GELU використовується у всіх цих вимірах, щоб застосувати нелінійні варіації для захоплення багатших представлень, і нарешті, ще один лінійний шар використовується для повернення до початкового розміру вимірів.
Механізм Багатоголової Уваги
Це вже було пояснено в попередньому розділі.
Мета та Функціональність
Багатоголова Самоувага: Дозволяє моделі зосереджуватися на різних позиціях у вхідній послідовності під час кодування токена.
Ключові Компоненти:
Запити, Ключі, Значення: Лінійні проекції вхідних даних, які використовуються для обчислення оцінок уваги.
Голови: Кілька механізмів уваги, що працюють паралельно (
num_heads
), кожен з зменшеною розмірністю (head_dim
).Оцінки Уваги: Обчислюються як скалярний добуток запитів і ключів, масштабовані та замасковані.
Маскування: Застосовується каузальна маска, щоб запобігти моделі звертатися до майбутніх токенів (важливо для авторегресивних моделей, таких як GPT).
Ваги Уваги: Softmax замаскованих і масштабованих оцінок уваги.
Контекстний Вектор: Вагова сума значень відповідно до ваг уваги.
Вихідна Проекція: Лінійний шар для об'єднання виходів усіх голів.
Мета цієї мережі - знайти відносини між токенами в одному контексті. Більше того, токени діляться на різні голови, щоб запобігти перенавчанню, хоча фінальні відносини, знайдені для кожної голови, об'єднуються в кінці цієї мережі.
Крім того, під час навчання застосовується каузальна маска, щоб пізні токени не враховувалися при пошуку специфічних відносин до токена, і також застосовується dropout для запобігання перенавчанню.
Нормалізація Шарів
Мета та Функціональність
Layer Normalization: Техніка, що використовується для нормалізації вхідних даних по ознаках (вимірах вбудовування) для кожного окремого прикладу в партії.
Компоненти:
eps
: Маленька константа (1e-5
), додана до дисперсії, щоб запобігти діленню на нуль під час нормалізації.scale
таshift
: Навчальні параметри (nn.Parameter
), які дозволяють моделі масштабувати та зміщувати нормалізований вихід. Вони ініціалізуються одиницями та нулями відповідно.Процес Нормалізації:
Обчислення Середнього (
mean
): Обчислює середнє значення вхідногоx
по виміру вбудовування (dim=-1
), зберігаючи вимір для трансляції (keepdim=True
).Обчислення Дисперсії (
var
): Обчислює дисперсіюx
по виміру вбудовування, також зберігаючи вимір. Параметрunbiased=False
забезпечує, що дисперсія обчислюється за допомогою упередженого оцінювача (ділення наN
замістьN-1
), що є доречним при нормалізації по ознакам, а не зразкам.Нормалізація (
norm_x
): Віднімає середнє відx
і ділить на квадратний корінь з дисперсії плюсeps
.Масштабування та Зміщення: Застосовує навчальні параметри
scale
таshift
до нормалізованого виходу.
Мета полягає в забезпеченні середнього значення 0 з дисперсією 1 по всіх вимірах одного й того ж токена. Мета цього - стабілізувати навчання глибоких нейронних мереж шляхом зменшення внутрішнього зсуву коваріат, що відноситься до зміни розподілу активацій мережі через оновлення параметрів під час навчання.
Transformer Block
Форми були додані як коментарі для кращого розуміння форм матриць:
Мета та Функціональність
Складення Шарів: Поєднує багатоголову увагу, мережу прямого зв'язку, нормалізацію шару та залишкові з'єднання.
Нормалізація Шару: Застосовується перед шарами уваги та прямого зв'язку для стабільного навчання.
Залишкові З'єднання (Швидкі З'єднання): Додають вхід шару до його виходу для покращення потоку градієнтів та можливості навчання глибоких мереж.
Випадкове Випадання: Застосовується після шарів уваги та прямого зв'язку для регуляризації.
Покрокова Функціональність
Перший Залишковий Шлях (Самоувага):
Вхід (
shortcut
): Зберегти оригінальний вхід для залишкового з'єднання.Нормалізація Шару (
norm1
): Нормалізувати вхід.Багатоголова Увага (
att
): Застосувати самоувагу.Випадкове Випадання (
drop_shortcut
): Застосувати випадкове випадання для регуляризації.Додати Залишковий (
x + shortcut
): Об'єднати з оригінальним входом.
Другий Залишковий Шлях (Прямий Зв'язок):
Вхід (
shortcut
): Зберегти оновлений вхід для наступного залишкового з'єднання.Нормалізація Шару (
norm2
): Нормалізувати вхід.Мережа Прямого Зв'язку (
ff
): Застосувати перетворення прямого зв'язку.Випадкове Випадання (
drop_shortcut
): Застосувати випадкове випадання.Додати Залишковий (
x + shortcut
): Об'єднати з входом з першого залишкового шляху.
Блок трансформера об'єднує всі мережі разом і застосовує деяку нормалізацію та випадкове випадання для покращення стабільності навчання та результатів. Зверніть увагу, що випадкове випадання застосовується після використання кожної мережі, тоді як нормалізація застосовується перед.
Крім того, він також використовує швидкі з'єднання, які полягають у додаванні виходу мережі до її входу. Це допомагає запобігти проблемі зникнення градієнта, забезпечуючи, щоб початкові шари вносили "стільки ж", скільки останні.
GPTModel
Форми були додані як коментарі для кращого розуміння форм матриць:
Мета та Функціональність
Embedding Layers:
Token Embeddings (
tok_emb
): Перетворює індекси токенів на embeddings. Нагадаємо, це ваги, які надаються кожному виміру кожного токена в словнику.Positional Embeddings (
pos_emb
): Додає позиційну інформацію до embeddings, щоб зафіксувати порядок токенів. Нагадаємо, це ваги, які надаються токену відповідно до його позиції в тексті.Dropout (
drop_emb
): Застосовується до embeddings для регуляризації.Transformer Blocks (
trf_blocks
): Стек зn_layers
трансформерних блоків для обробки embeddings.Final Normalization (
final_norm
): Нормалізація шару перед вихідним шаром.Output Layer (
out_head
): Проектує фінальні приховані стани на розмір словника для отримання логітів для прогнозування.
Мета цього класу полягає в тому, щоб використовувати всі інші згадані мережі для прогнозування наступного токена в послідовності, що є основоположним для завдань, таких як генерація тексту.
Зверніть увагу, як він використовуватиме стільки трансформерних блоків, скільки вказано, і що кожен трансформерний блок використовує одну мережу з багатоголовим увагою, одну мережу прямого проходження та кілька нормалізацій. Тож, якщо використовується 12 трансформерних блоків, помножте це на 12.
Крім того, шар нормалізації додається перед виходом, а фінальний лінійний шар застосовується в кінці, щоб отримати результати з правильними розмірами. Зверніть увагу, що кожен фінальний вектор має розмір використаного словника. Це тому, що він намагається отримати ймовірність для кожного можливого токена в словнику.
Кількість параметрів для навчання
Маючи визначену структуру GPT, можна дізнатися кількість параметрів для навчання:
Покроковий Розрахунок
1. Вкладки Векторів: Векторне Вкладення та Позиційне Вкладення
Шар:
nn.Embedding(vocab_size, emb_dim)
Параметри:
vocab_size * emb_dim
Шар:
nn.Embedding(context_length, emb_dim)
Параметри:
context_length * emb_dim
Загальна кількість параметрів вбудовування
2. Transformer Blocks
Є 12 блоків трансформера, тому ми розрахуємо параметри для одного блоку, а потім помножимо на 12.
Параметри на один блок трансформера
a. Багатоголове увага
Компоненти:
Лінійний шар запиту (
W_query
):nn.Linear(emb_dim, emb_dim, bias=False)
Лінійний шар ключа (
W_key
):nn.Linear(emb_dim, emb_dim, bias=False)
Лінійний шар значення (
W_value
):nn.Linear(emb_dim, emb_dim, bias=False)
Вихідна проекція (
out_proj
):nn.Linear(emb_dim, emb_dim)
Розрахунки:
Кожен з
W_query
,W_key
,W_value
:
Оскільки є три такі шари:
Вихідна проекція (
out_proj
):
Загальна кількість параметрів багатоголової уваги:
b. Мережа зворотного зв'язку
Компоненти:
Перший лінійний шар:
nn.Linear(emb_dim, 4 * emb_dim)
Другий лінійний шар:
nn.Linear(4 * emb_dim, emb_dim)
Розрахунки:
Перший лінійний шар:
Другий лінійний шар:
Загальна кількість параметрів зворотного зв'язку:
c. Нормалізації шару
Компоненти:
Два екземпляри
LayerNorm
на блок.Кожен
LayerNorm
має2 * emb_dim
параметрів (масштаб і зсув).Розрахунки:
d. Загальна кількість параметрів на один блок трансформера
Загальна кількість параметрів для всіх блоків трансформера
3. Остаточні шари
a. Нормалізація остаточного шару
Параметри:
2 * emb_dim
(масштаб і зсув)
b. Вихідний проекційний шар (out_head
)
Шар:
nn.Linear(emb_dim, vocab_size, bias=False)
Параметри:
emb_dim * vocab_size
4. Підсумування всіх параметрів
Генерація тексту
Маючи модель, яка передбачає наступний токен, як і попередній, потрібно просто взяти останні значення токенів з виходу (оскільки вони будуть значеннями передбаченого токена), які будуть значенням на запис у словнику, а потім використати функцію softmax
, щоб нормалізувати виміри в ймовірності, що в сумі дорівнюють 1, а потім отримати індекс найбільшого запису, який буде індексом слова в словнику.
Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb:
References
Last updated