Доброго времени суток, «Хабр»!
Сегодня мы погрузимся в мир современных языковых моделей, детально изучим их архитектуру и разберемся в принципах работы. Готовы к захватывающему путешествию в мир искусственного интеллекта? Тогда пристегните ремни — мы отправляемся!

Transformer
Трансформер — это вид нейросетевой архитектуры, который хорошо подходит для обработки последовательностей данных. Пожалуй, самым популярным примером таких данных является предложение, которое можно рассматривать как упорядоченный набор слов.
Архитектура создает цифровое представление каждого элемента последовательности, объединяя важную информацию о нём и окружающем контексте. Полученные представления можно передать в другие нейросети, которые смогут использовать эти данные для решения различных задач, включая синтез и классификацию. Благодаря таким представлениям, трансформеры помогают последующим нейросетям лучше понимать скрытые паттерны и взаимосвязи во входных данных.
Пожалуй, главным преимуществом этой архитектуры является её способность обрабатывать длинные зависимости в последовательностях. Кроме того, трансформеры очень производительны, что позволяет им обрабатывать последовательности параллельно. Это особенно полезно в таких задачах, как машинный перевод, анализ и синтез текста.
Как устроен трансформер?

Как и говорилось ранее, трансформеры не требуют обработки последовательностей по порядку. Например, если входные данные — текст, тогда архитектура может обрабатывать все его части одновременно, а не последовательно, поскольку механизм внимания позволяет учитывать взаимосвязи между словами вне зависимости от их позиции.
Архитектура трансформера состоит из кодировщика и декодировщика. Кодировщик получает на вход векторизованную последовательность с позиционной информацией.

Декодер же включает три основные компонента: механизм самовнимания, который обрабатывает выход предыдущего слоя; механизм внимания к выходу кодировщика, принимающий на вход как результат самовнимания, так и выход кодера; и полносвязную нейронную сеть, получающую на вход результат работы второго механизма.

В трансформерах используется многоголовое внимание, где внимание рассчитывается параллельно несколько раз с разными параметрами. То есть, например, вместо того чтобы один раз определить, какие слова важны для текущего предложения, модель делает это несколько раз параллельно, с разных точек зрения.
Конечно, вы можете самостоятельно попробовать данную архитектуру. Приведу пример, как это можно осуществить на языке программирования Python: тык.
Кстати, для практических экспериментов с языковыми моделями может пригодиться агрегатор BotHub — удобная платформа, объединяющая различные нейросети: от текстовых моделей до генераторов изображений и аудио. Новые пользователи получают стартовый бонус в 100 000 токенов, регистрируясь по специальной ссылке, что позволяет основательно протестировать возможности сервиса.
Generative adversarial networks
Генеративно-состязательная сеть (generative adversarial networks, GAN) — алгоритм машинного обучения без учителя, построенный на комбинации из двух нейронных сетей: генератора и дискриминатора, которые обучаются непрерывно в теоретико-игровой схеме. Генератор учится создавать реалистичные данные, в то время как дискриминатор пытается отличить правильные образцы от неправильных. Так как сети имеют противоположные цели — создать образы и отбраковать их, — между ними и возникает так называемая игра.
Как устроен GAN?
Условно строение генеративно-состязательной сети можно разделить на три части: генератор, дискриминатор и состязательный процесс (иначе — антагонистическая игра).
Генератор — это нейронная сеть, которая принимает случайный шум в качестве входных данных и генерирует синтетические данные (например, изображение или текст), имитирующие реальные. Его цель — создавать данные, которые дискриминатор впоследствии не сможет отличить от настоящих.
Дискриминатор — это ещё одна нейронная сеть, которая получает как реальные, так и сгенерированные данные и пытается определить, являются ли они подлинными (из исходного набора) или искусственными. Иными словами, его задача сводится к бинарной классификации.

Состязательный процесс заключается в том, что генератор и дискриминатор играют в минимаксную игру для двух игроков, где один пытается обмануть второго, а второй пытается не быть обманутым. Исходя из этого, цель генератора — минимизировать точность дискриминатора, в то время как цель дискриминатора — максимизировать точность классификации.
Подобная игра будет повторяться до тех пор, пока генератор не выдаст данные, неотличимые от реальных, а дискриминатор не сможет обнаружить разницу с точностью до 50%.
Приведу базовую реализацию простого GAN опять же на Python. Для этого используем библиотеку TensorFlow: тык.
ResNet
ResNet (residual network) — архитектура сверточных нейросетей, разработанная исследовательской группой Microsoft. Использует остаточные блоки, которые позволяют строить сверхглубокие сети (до 152 слоев) без проблемы затухающих градиентов.
Архитектура стала одной из самых значимых в области глубокого обучения, так как именно она позволила решить проблему обучения глубоких сетей.
Как устроен ResNet?

Резидуальные связи (skip connection) — ключевая инновация ResNet, которая позволяет пропускать информацию через один или несколько слоёв. Эти связи передают данные напрямую от одного слоя к последующему, минуя промежуточные преобразования, в результате чего предотвращается затухание градиентов и облегчается обучение чрезвычайно глубоких сетей.
Кроме того, выход предыдущих слоёв суммируется с выходом последующих, что помогает сети эффективно сохранять и передавать значимые признаки даже при большой глубине архитектуры.
Резидуальные блоки (residual blocks) — базовые структурные элементы ResNet. Каждый блок содержит несколько сверточных слоев с активацией ReLU, дополненных сквозным соединением, проходящим через весь блок. Такая конструкция улучшает производительность и выделение признаков.
Обычно в резидуальных блоках применяются свертки 3×3, но возможны и иные варианты. Например, сокращенные блоки (bottleneck blocks) состоят из трёх слоёв: сначала 1×1 для уменьшения размерности, затем 3×3 для свертки и снова 1×1 для восстановления размерности. Это снижает вычислительные затраты и число параметров без потери эффективности.
Как и в предыдущих случаях, приведу пример реализации на Python: тык.
Capsule networks
В 2017 году Джеффри Хинтон опубликовал статью, где представил капсульные нейронные сети и разработал алгоритм динамической маршрутизации между капсулами для обучения этой архитектуры.
Капсульные сети, по сути, представляют собой усовершенствованную версию классических сверточных нейронных сетей, у которых имелись существенные ограничения. Главный недостаток сверточных сетей — их внутреннее представление данных не учитывает пространственные взаимосвязи между простыми и сложными объектами.

Например, если на изображении в произвольном порядке расположены глаза, нос и губы, сверточная нейронная сеть всё равно распознает это как явные признаки лица, хотя такое расположение не соответствует реальной структуре.
Как устроены капсульные нейросети?
Капсулы хранят информацию об обнаруженных объектах в виде специальных векторов. Чем длиннее вектор, тем выше вероятность правильного обнаружения объекта. Направление вектора при этом отражает пространственные характеристики объекта — его ориентацию и положение на изображении.
При перемещении или изменении объекта длина вектора сохраняется, что означает неизменную уверенность системы в его присутствии. Однако направление вектора обновляется, фиксируя новые параметры объекта. Подобное можно сравнить с фонариком: интенсивность свечения (длина вектора) указывает на достоверность обнаружения, а направление луча — на местоположение.
Данный подход обеспечивает чёткое разделение между фактом обнаружения объекта и его пространственными характеристиками. Даже при повороте или смещении объекта нейросеть сохраняет способность его распознавать, корректируя лишь данные о положении.

Остановимся и разберем подробнее таблицу, указанную выше. В ней приведено сравнение низкоуровневой капсулы и традиционного нейрона. Входными данными для капсулы представлены вектором , который содержит информацию о состоянии или признаках низкоуровневой капсулы, в то время как для нейрона вход — это скаляр
, как в классических нейронных сетях.
Далее в капсуле начинается аффинное преобразование, где входной вектор умножается на матрицу весов, чтобы получить новый преобразованный вектор. Подобное нужно для того, чтобы капсула учитывала пространственные и иерархические отношения между признаками.
После этого в капсуле используется взвешенная сумма преобразованных векторов, где веса определяют степень важности каждого входа, и результатом является вектор.
В то же время в традиционном нейроне аффинное преобразование отсутствует, так как входы уже являются скалярами. Поэтому там сразу вычисляется взвешенная сумма скалярных входов с весами и смещением, что дает скаляр
.
На этапе нелинейной активации капсула применяет функции к полученному вектору, чтобы получить готовый выходной, нормализованный с сохраненной длинной. В традиционном нейроне применяется стандартная нелинейная функция активации.
Теперь рассмотрим подробнее нововведение, которым стала специальная нелинейная функция активации: она нормализует длину вектора (не превышая 1), сохраняя при этом его направление.

Капсула расширяет классическую модель нейрона, используя векторную форму представления данных для повышения выразительной способности модели. Матричные весовые коэффициенты кодируют иерархические связи между признаками на разных уровнях. Подобное обеспечивает эквивариантность (чувствительность к преобразованиям входных данных), одновременно сохраняя инвариантность вероятностей обнаружения признаков.
Приведу реализацию на Python: тык.
Kolmogorov-Arnold Networks
Сети Колмогорова — Арнольда появились не так давно — в апреле 2024 года. По праву данная архитектура получила звание новаторской концепции.

Как устроен KAN?
В основе этой новаторской концепции лежит теорема представления Колмогорова — Арнольда, что и объясняет название архитектуры. Хотя теорема была открыта давно, лишь в 2024 году исследователи разработали саму архитектуру и компактную библиотеку для работы с ней.
Теорема утверждает, что любые сложные многомерные функции можно разложить на комбинацию простых одномерных функций, что и легло в основу уникальной структуры KAN.

Такое разложение позволяет выявить все составные компоненты функций, устраняя необходимость работы с высокоразмерными пространствами при вычислениях. Это эффективно решает проблему «проклятия размерности» (curse of dimensionality), характерную для традиционных MLP-сетей.
Если рассмотреть устройство этих функций подробнее, окажется всё достаточно просто: KAN использует параметризованные функции активации, делая их обучаемыми. В этом и заключается ключевая идея архитектуры — переход от активации в узлах (нейронах) к активации на ребрах сети. Такой подход позволяет KAN эффективно моделировать сложные зависимости, сохраняя интерпретируемость и значительно сокращая количество требуемых параметров.

В отличие от традиционных чёрных ящиков со скрытыми слоями, дающими неконтролируемый результат, KAN обеспечивает понимание того, как входные признаки преобразуются на всем протяжении сети, делая работу нейросетей более прозрачной.

В заключении к этой архитектуре приведу простейший пример реализации архитектуры на PyTorch: тык.
Графовые нейронные сети
Графовые сети — способ применения классических моделей нейронных сетей к графовым данным. Графы, не обладая регулярной структурой как изображения, долгое время оставались вне поля зрения классических нейросетей, которые получили широкое распространение в области машинного обучения и искусственного интеллекта.

Как устроены графовые нейронные сети?
Один слой графовой нейросети — обычный полносвязный слой, но веса в нем применяются не ко всем входным данным, а только к тем, которые являются соседями конкретной вершины в графе, в дополнение к ее собственному представлению с предыдущего слоя. Веса для соседей и самой вершины могут задаваться общей матрицей весов или двумя отдельными.
Кроме того, иногда добавляются нормализации для ускорения сходимости, а также меняются нелинейные функции активаций, но общая конструкция будет оставаться похожей.

На изображении показано сравнение двух методов агрегации информации в графовых нейронных сетях. В верхней формуле представлен базовый подход к агрегации соседних вершин, где каждая из них обновляет свое представление путем усреднения информации от соседей, с отдельной обработкой собственных характеристик через дополнительную матрицу. Нормализация выполняется простым делением на количество соседей, а результат пропускается через функцию активации.
Нижняя формула демонстрирует усовершенствованный подход, используемый в графовых сверточных сетях. Здесь информация агрегируется одновременно от соседей и самой вершины, без разделения на разные матрицы. Применяется симметричная нормализация, учитывающая степени как текущей вершины, так и соседних, что делает процесс более устойчивым. Весовые коэффициенты для соседей и собственного представления вершины объединены в единую матрицу, что упрощает архитектуру.
На этом закончился экскурс в мир архитектур современных моделей.
Спасибо за прочтение. Надеюсь, вам было интересно.