Трансформеры и внимание: мост к 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 — это огромные трансформеры; их фундамент — пройденные нами основы.