? Общая схема работы трансформера
Для понимания структуры и процессов в AGI системе, давайте рассмотрим решения на текущий момент: LLM - большая языковая модель, архитектура трансформер.
Трансформер представляет собой преобразователь текста: входной текст преобразуется в наиболее вероятный токен (часть слова) предсказанный моделью.
Информация основана на подробном разборе кода трансформера GPT2 и DeepSeekV3.


Подробная формула:
Input - вход или промпт.
Input → Tokens = Tokenize(Input)
Output = P(tokens) = Attention(Tokens) + FeedForward(Tokens)

Здесь мы видим что преобразование задается функцией! Т.е оно линейно. Наиболее вероятный токен затем выбирается с помощью случайного значения если задана температура. Т.е здесь случайность влияет в конце и только на выбор токена. Поэтому температура при больших значениях может иметь непредсказуемый результат. Внутри функции Attention: есть матрицы Wq, Wk, Wv и FeedForward: Wa, Wb которые подбираются таким образом чтобы ошибка предсказанного значения имела минимальное значение. Тут мы подходим к задаче минимизации ошибки предсказания модели.
? Минимизация ошибки через градиент функции, TensorFlow
Давайте посмотрим еще раз на формулу предсказания:
Output = P(tokens) = Attention(Tokens) + FeedForward(Tokens)
Мы видим что преобразование задается математической функцией и задача в том, чтобы найти такие значения матриц чтобы результирующая функция потерь LOSS имела меньшее значение чем текущее. Как же это делается? Это называется backpropagation и вычисляется через градиент функции. Для этого все слои Attention, FeedForward представляются в виде вычислительного графа который называется TensorFlow.
Вершины графа это операции, ребра это входные значения. Каждой вершине соответствует некоторая функция. Для примера рассмотрим такую функцию:
Floss = x²
x = 2 · y
Нужно найти такие значения (x, y) чтобы функция уменьшилась. Здесь (x, y) представляет собой входной вектор. Как это сделать? Решение такое: находится производная функции Floss по всем переменным. Что такое производная? Это значение которое показывает скорость изменения функции. Если вычислить его к каждой переменной получим вектор который показывает в какую сторону растет функция (скорость) или нормаль к функции. Таким образом мы можем посчитать вектор изменения функции и двигаться в обратном направлении по этому вектору. Для этого просто отнимаем вектор производных от всех матриц. И получаем лучшее значение Floss.
Формула:
W_new = W_old – η · ∂LOSS/∂W
Здесь n задает скорость оптимизации функции.
Теперь остается посчитать производную, но как это сделать если имеем вычислительный граф тензоров? На примере считается так путем математического тождества:
d(Floss) / dy = d(Floss) / dy * (dy / dx),... и аналогично по любому количеству переменных. Т.е мы считаем производные по всем узлам и затем перемножаем их.
Например входной вектор (x, y) имеет значения (1, 1), т.е (x, y) = (1, 1)
Далее:
d(Floss)/dx = 2 * x (математическое правило вычисления производных)
dx/dy = 2 (математическое правило вычисления производных)
Получаем d(Floss)/dy = 2 x = 2 (2 y) = 4 y
Если подставить значения x и y получаем вектор или нормаль движения функции:
(d(Floss)/dx, d(Floss)/dy) = (2 1 = 2, 4 1 = 4) = (2, 4)
Допустим n = 1
Отнимаем: (1, 1) - (2 1, 4 1) = (1 - 2 = -1, 1 - 4 = -3)
Предыдущее значение Floss - 2, новое значение: 2 * (-3) = -6.
Таким образом считается и оптимизируется весь блок в GPT трансформере.
? Принципы работы Tokenize, Attention, FeedForward
? Tokenize
Задан входной текст, например: “Привет GPT!”. Модель не может обработать строковый текст сразу, модель понимает только числа. Как нам преобразовать текст в числа? Да необходимо разделить текст на части и каждой части дать числовое соответствие. Такое число называется токеном (лексемой).Таким образом мы делим текст на слова:
Tokenize1(“Привет GPT!”) = [“Привет”, “ ”, “GPT”, “!”].
Теперь нам нужно преобразовать эти токены в числа. Но здесь мы имеем проблему. Нам придется создать такой словарь в котором будут все слова языка чтобы каждому слову пунктуации числу и т.д дать числовое значение. Но если это сделать словарь получится очень большим. Как решить проблему? Для решения на примере GPT2 токены дополнительно разделяются на части, например:
Tokenize2(“Привет GPT!”) = [“При”, “вет”, “ ”, “GPT”, “!”], т.е на кусочки от слов. А таких кусочков не очень много и их можно хранить в словаре. Получается такой словарь (пример):
…
При - 34,
…
вет - 56
…
GPT - 102
…
! - 1004
Получаем:
Tokenize3(“Привет GPT!”) = [34, 56, 102]
Теперь имеем задачу как эффективно разделить текст на кусочки? На пример GPT2 можно увидеть что делается это через биграммы. Биграмма это пара показывающая соотвествие между буквами в слове. Например:
(“П”, “р”)
(“Пр”, “и”)
…
(“ве”, “т”).
Этот список биграмм считается по обучаемому тексту (назовем DATA) который имеет большой размер - гигабайты текста. Находятся наиболее вероятные пары встречаемые в тексте.
Далее на примере слова “Привет” делим слово на буквы и строим биграммы:
[(“П”, “р”), (“р”, “и”), (“и”, “в”), (“в”, “е”), (“е”, “т”)] - здесь пары строятся по принципу левая часть первой биграммы равно правой части второй. И по таблице биграмм объединяем буквы находим совпадение по биграмме (“П”, “р”) и далее объединяем по биграмме:
TokenizeBigram([(“П”, “р”), (“р”, “и”), (“и”, “в”), (“в”, “е”), (“е”, “т”)]) =([(“Пр”), (“р”, “и”), (“и”, “в”), (“в”, “е”), (“е”, “т”)])
Далее по биграмме (“Пр”, “и”):
TokenizeBigram([(“Пр”), (“р”, “и”), (“и”, “в”), (“в”, “е”), (“е”, “т”)]) = [(“При”), (“и”, “в”), (“в”, “е”), (“е”, “т”)]
Итак получается функция:
Tokenize(“Привет GPT!”) = [34, 56, 102]=Tokens

? Tokenize → Embedding
У нас получилась последовательность чисел. Но как же модель трансформера понимает смысл из этих чисел?
Для этого данные числа или слова-токены преобразуются в векторы которые задаются моделью в процессе обучения для каждого токена как словарь token[i] -> embedding[i]. Что такое векторы? Векторы показывают различные мерности(признаки) объекта т.е слова имеющего смысл. Например имеем слово кошка Cat. Кошка имеет характеристики и интерпретируются они как атрибуты класса пример на c#:
class Cat
{
public int Mass { get; set; }
public int Color { get; set; }
…
}
Каждый атрибут или характеристика это размерность класса: т.е кошка может иметь массу, цвет: белый, зеленый, красный и т.д. И все это кодируется числами. Но нам не нужно определять эти характеристики вручную. Красота нейронных моделей в том что они сами учатся как это делать. Итак слово преобразуется в большой список характеристик которые называются features (возможности).
Например: “При” => 34 => [35, 67, 32, 78 … ] 1024, 4098… чисел! Это огромное количество атрибутов по которых характеризуются слова-токены. И модель сама учится строить характеристики обучившись на DATA, путем уменьшения функции Floss. В самом векторе закодированы не конкретно атрибуты как в классе, но различные паттерны классификаторы или их части, так как модель не умеет классифицировать формально как человек делает она это примерно чтобы соответствовать всей функции Floss(DATA). Вектор для токена называется embedding.
Для примера примем что длина вектора признаков 2 (в реальности длина 1024 или более!).
Имеем такую функцию:
Embedding(Tokens) = [ [1, 2], [3, 4], [4, 8] ] = Vectors
Таким образом мы можем входной текст преобразовывать в векторы отражающие смысл этого текста или классификаторы токенов. Здесь становится очевидно что чем длиннее вектор тем по большим характеристикам модель будет классифицировать слова и тем точнее будет учитывать смысл.


? Tokenize → Embedding → PositionalEmbedding
После получения векторов смысла (эмбеддингов) необходимо в модели как то закодировать на каком месте находится вектор токена поскольку модель не умеет это различать. Для этого используется позиционный эмбеддинг: PositionalEmbedding.
Он вычисляет позиционные векторы и складывает их с векторами (GPT2). Также может выполняться вращение векторов по ним (DeepSeekV3).

? Внимание (Attention)
Теперь разберем как работает функция Attention.
Формула:
Attention = softmax( (Wq · Wkᵀ) / sqrt(d) ) · Wv


Что такое Q, K, V?
Это концепты-векторы которые работают в пространстве внимания, Q - вектор поиска, K - вектор ключа, V - вектор преобразования или важности. Разложены они в матрице по токенам которая спроецирована на пространство большей мощности. Что такое пространство внимания? Логически это так выходные векторы лежат в пространстве смысла, мы их преобразуем (проецируем) в пространство внимания и считаем по ним очки внимания.
Чтобы спроецировать вектор Vector на пространство внимания он умножается на матрицу W. Которая дает правило проекции каким образом вектор проецируется на вектор внимания. В пространстве внимания существует 3 вектора: Q, K, V. Матрица W имеет большую мерность чем матрица вектора, чтобы преобразование сделать в большем пространстве чем вектор. Логически пространство смысла расширяется до большего пространства и там строится внимание. Внимание показывает по всем токенам насколько сам токен уделяет внимание к другим токенам, т.е насколько токену Token(i) интересно Token(j). В пространстве внимания Q представляет собой такую характеристику: какую свою цель имеет токен? представляется она вектором цели. K представляет собой целевой вектор что токен может дать другим токенам? Т.е по каждым парам токенов вычисляются векторы целей:
Vq, Vk. И далее считается их скалярное произведение. Оно показывает сонаправленность векторов. Т.е если Vq, Vk со-направленны, они имеют общую цель (угол ближе к 0). А это значит что они представляют повышенный интерес (друг к другу).
В формуле Wq * (Wk^T) означает вычисление dot product по матрице: матрица Q умножается на транспонированную матрицу K, которые содержат данные вычисленные цели векторов по токенам. Результат делится на SQRT(d) это просто оптимизационный параметр (в модели много таких для стабилизации вектора производных). После умножения мы получаем матрицу скоров внимания например на слове [“При”, “вет”]:
[ 0, 0.8,
0.2, 0 ]

Т.е
“При” к “При” внимания 0,
“При” к “вет” внимания 0.8,
“вет” к “При” внимания 0.2.
Но здесь если посмотреть есть внимания в которых предыдущий токен имеет внимание в будущему. Т.е прошлое смотрит на будущее. Но чтобы делать прогноз модель не должна знать будущее иначе она будет просто извлекать из будущего не делая прогноза! Чтобы этого избежать мы делаем матрицу треугольной т.е будущие внимания (те которые выше диагонали (сверху-вниз) матрицы обнуляем):
[ 0, 0,
0.2, 0 ]

Далее данная матрица проходит через функцию softmax. Эта функция превращает скоры внимания в вероятности усиливая различия в значениях т.е получаются более сильные различия как в усилителе сигнала.
softmax(Wattention)=Wp
Затем мы умножаем данную матрицу на матрицу Wv:
Wa = Wp * Wv.
Это дает средневзвешенную матрицу т.е векторы по токенам учитывающие внимание друг к другу. Внимание показывает различные паттерны в языке в лексике синтаксисе семантике самого языка и дает направление по таким целям.
Далее так как результат Wa представлен в пространстве внимания мы должны спроецировать векторы внимания обратно в пространство смыслов. Это делает модель которая учится это делать на DATA.
Получаем вектор [Vectors<attention>].
Теперь как нам к нашим векторам смысла [Vectors] сделать так чтобы они учитывали внимание? Делается это через сложение векторов:
[Vectors2] = [Vectors] + [Vectors<attention>]
В нашем примере пусть attention:
[ [0.1, 0.2],
[0.3, 0.4],
[0.4, 0.6] ] (здесь просто пример)
[ [1, 2],
[3, 4], + attention
[4, 8] ]
Получаем: [ [1.1, 2.2], [3.3, 4.4], [4.4, 8.6] ].
Адаптация Low‑Rank (LoRA):
При вычислениях матрица Wq может быть представлена двумя матрицами: Wq = Wa * Wb^T. Это называется LoRA или Low Rank Adaptation. Зачем это нужно?
Например матрица Wq имеет размерность [4098, 4098] т.е 4098 * 4098 значение а это около 16млн! Обучение такого количества параметров ресурсозатратно. Для этого матрица Wq раскладывается на две низкоразмерные матрицы Wr. Например если ранг 16 то получается:
Wa: [4098, 16]
Wb: [16, 4098]
И умножение их дает матрицу Wq! Но в обоих матрицах мы имеем количество параметров: 4098 16 + 16 4098 т.е гораздо меньше. Через это делается fine tuning модели. Fine tuning применяется к attention но может применяться и к feed forward.
Fine tune перестраивает только малую часть модели и при обучении при малом или некачественном количестве примеров перестраивает модель так что цели в модели стремятся только к этим примерам и другие она забывает на которых обучалась.
Заметки по Attention слою
Какие есть проблемы с механизмом определения целей внимания:
Проблема общая, внимание работает только на знаниях и паттернах на которых она обучена. Если что то новое например из предметной области которой не было в примерах (так как данные конфиденциальные) модель не станет обращать внимания на них. Поэтому мы вынуждены тренировать модели на предметных областях что отдаляет от AGI. Здесь решением для AGI я вижу примерно так: нужно считать не только цели внимания но и общую цель без учета внимания, а далее берем векторы как центр масс по ним. Attention = Factor * Mass(Wq,k,v) + Attention(Q, K, V). Тогда модель будет иметь внимание к тем областям текста где не было еще обучения. Результат пока неизвестен требуются эксперименты.
⚙️ Feed‑Forward (FFN) и Mixture‑of‑Experts
Разберем как работает слой FeedForward.
Модель аналогично как с вниманием преобразует пространство векторов смысла на пространство паттернов. Что представляет собой пространство паттернов?
Это матрица которая учитывает все паттерны и закономерности при обучении на DATA. Векторы умножаясь на эту матрицу получают представление насколько они релевантны к общим паттернам в общих целях DATA. Модель считает определенный паттерн например наиболее встречаемый цвет кошки это белый и черный цвет а не голубой. И вектору цели для паттерна кошка белая и черная ставит большой вес. А вектору цели кошка голубая очень малый отрицательный вес. У нас получается проблема очень отрицательные и положительные веса. Для решения используется функция активации например GELU (GPT2), SILU (DeepSeekV3).


Формула:
Wffn = GELU([Vectors] * W<patterns space>).
Как видим это тоже линейная функция.
В DeepSeek помимо простой FFN определяющей паттерны используется MOE mixture of experts. Что это такое? Вход векторов пространства паттернов проходит через Gate который классифицирует паттерны на большие группы: например математика, программирование и т.д. Считаются очки по экспертам и наиболее релевантные работают со входом. Сам эксперт это такой же Wffn. Это решает проблему GPT2: так как модель делает маленькие шаги по каждому токену она оперирует только малыми целями в промпте большие цели (глобальные) она не учитывает. Архитектура MOE делит цели на специализации и решает проблему локальных целей. Но тем не менее проблема остается внутри самой специализации. Например в программировании модель также учитывает малые цели и не учитывает глобальные. Для решения проблемы в AGI должен быть более сложный механизм целеполагания для этого нужно применять не одно пространство проекции например только паттерны как случае с LLM, но и другие например сложная семантика, эмоциональное пространство, казуальное пространство и т.д.

Затем мы опять складываем выход с [Vectors]: [Vectors] + [Vectors<attention>] + [Vectors<ffn>]
Что мы имеем? Мы имеем сами эмбеддинги векторы [Vectors] которые отражают семантику смысла текста в векторах. Мы имеем векторы семантики текста которые отклонены по целям attention и ffn. Теперь как посчитать вероятности для всех токенов?
Для этого мы считаем dot product т.е угол отклонения между векторами с учетом attention и ffn c оригинальными векторами embedding. Это дает отклонения которые называются логиты. Т.е это скоры или градусы насколько векторы по каждому токену отклоняются от общей цели полученной путем предсказания на обучении массива DATA.
А далее по логитам мы определяем вероятный токен.
? Итоги
LLM это хорошая модель но она имеет проблемы:
она учитывает внимание внутри текста и общие паттерны в модели мира, но ограничена лишь этим, поэтому мы используем fine tune, а это не AGI.
она двигается только к маленьким целям и не учитывает глобальные это также отдаляет от AGI
Модель является просто функцией оптимизированной на потере ошибок при обучении на DATA. Она не является сетью нейронов как в мозге человека. Это лишь приближенная модель. Модель не имеет стохастического фактора сама архитектура производных не даст этого сделать.
? Идеи для AGI-архитектуры
В attention представлен механизм чтобы модель учитывала не только по вниманию
В ffn необходимо внедрить другие пространства чтобы модель смогла учитывать те аспекты которые относятся не только к паттернам
В AGI должен быть фактор случайности не так как он сделан как температура по логитам а напрямую внутри attention и ffn слоев.
P.S.: Если вам интересен данный разбор, могу также разобрать код модели Grok1.
Комментарии (2)
digrobot
23.07.2025 08:39Сейчас на kaggle идет соревнование ARC Prize 2025, в нем вы можете проверить свои идеи экспериментально.
NeriaLab
Я так понимаю, Сэр, что Вы создали новый аккаунт на Хабре, чтобы продолжать что-о публиковать - это похвально, действительно похвально.
Но теперь к главному. Я читал все три статьи, которые Вы опубликовали, можно Вас немного расстроить? У Вас не получится создать AGI, даже близко не подойдёте к нему. Ответы очевидны:
Вы не понимаете принципов работы ИИ;
Скажите пожалуйста самое главное правило при прохождении строгого теста Тьюринга;
Вы опубликовали бредовый "манифест" (самая первая статья из этого цикла статей на Вашем "мертвом" акке), который был полностью сгенерирован при помощи LLM, но не опубликовали ни строчки информации о проблемах интеграции в общество ИИ и способов их решения
...
Я мог бы и дальше продолжать и продолжать перечислять, но не горю желанием. Прошу Вас задуматься над моими словами, почему Вы не сможете создать ИИ, а не то что AGI. Сами для себя перечислите каких знаний и компетенции Вам не хватает