Трансформеры и внимание: мост к LLM

Урок кратко объясняет внимание и трансформеры — архитектуру, на которой стоят современные LLM.

Внимание (attention) — это механизм, позволяющий каждому элементу последовательности «посмотреть» на все остальные и взять важное из них, взвесив по релевантности.

Проблема RNN, которую решили трансформеры

RNN читает последовательность строго по очереди — это медленно (нельзя распараллелить) и всё ещё тяжело даётся для длинных зависимостей. Трансформер (2017, статья «Attention Is All You Need») отказался от рекуррентности: он смотрит на всю последовательность сразу через механизм внимания, что прекрасно параллелится на GPU и улавливает связи между далёкими словами.

Суть внимания

Для каждого слова считается, насколько оно «релевантно» каждому другому слову (через скалярное произведение их векторов). Эти оценки прогоняются через softmax — получаются веса внимания. Затем берётся взвешенная сумма представлений всех слов. Так слово собирает контекст: например, местоимение «он» подтягивает вектор того существительного, к которому относится.

Простое внимание в коде

import math
def softmax(xs):
    m = max(xs)
    e = [math.exp(x - m) for x in xs]
    s = sum(e)
    return [v / s for v in e]

def dot(a, b):
    return sum(x*y for x, y in zip(a, b))

# три слова, у каждого 2-мерный вектор
words = {"кот": [1.0, 0.0], "спит": [0.0, 1.0], "мягко": [0.2, 0.9]}
keys  = list(words.values())
query = words["спит"]                    # смотрим глазами слова «спит»

scores  = [dot(query, k) for k in keys]  # релевантность каждому слову
weights = softmax(scores)                # веса внимания
context = [sum(weights[i]*keys[i][d] for i in range(len(keys))) for d in range(2)]

print("Релевантность 'спит' словам:", [round(s, 2) for s in scores])
print("Веса внимания:", [round(w, 3) for w in weights])
print("Контекстный вектор:", [round(v, 3) for v in context])

Вывод:

Релевантность 'спит' словам: [0.0, 1.0, 0.9]
Веса внимания: [0.162, 0.44, 0.398]
Контекстный вектор: [0.241, 0.798]

Слово «спит» сильнее всего «обратило внимание» на само себя (вес 0.44) и на близкое по смыслу «мягко» (0.398), а на несвязанное «кот» — слабее (0.162). Контекстный вектор — это смесь представлений, в которой преобладают релевантные слова. Настоящий трансформер делает это с обучаемыми проекциями и многими «головами» внимания параллельно, но ядро именно такое.

Из чего собран трансформер

  • Self-attention — каждое слово смотрит на все слова последовательности.
  • Multi-head — несколько механизмов внимания параллельно ловят разные типы связей.
  • Позиционное кодирование — добавляет информацию о порядке слов (внимание само по себе порядка не знает).
  • Полносвязные блоки и residual-связи — обрабатывают и стабилизируют сигнал.

Мост к LLM

Большие языковые модели (GPT, и подобные) — это очень большие трансформеры, обученные предсказывать следующее слово на огромных текстах. Масштаб (миллиарды параметров и терабайты текста) плюс механизм внимания дают способность вести диалог, писать код и рассуждать. Но в основе — ровно те кирпичи, что мы прошли: нейроны, слои, активации, потери и backprop.

Итог

  • Внимание позволяет каждому элементу взвешенно собрать контекст со всей последовательности.
  • Трансформеры заменили рекуррентность вниманием — это параллельно и ловит дальние связи.
  • LLM — это огромные трансформеры; их фундамент — пройденные нами основы.
Проверьте себя
1. Что делает механизм внимания (attention)?
AУдаляет неважные слова
BПозволяет элементу взвешенно собрать информацию со всех остальных по релевантности
CСортирует слова по алфавиту
DСчитает функцию потерь
2. Чем трансформер выгодно отличается от RNN?
AОн меньше по размеру
BСмотрит на всю последовательность сразу — это параллельно и ловит дальние связи
CНе использует softmax
DРаботает только с картинками
3. Чем по сути являются большие языковые модели (LLM)?
AОгромными свёрточными сетями
BОчень большими трансформерами, обученными предсказывать следующее слово
CНаборами правил
DРекуррентными сетями без внимания
Поддержать проект