На шаг ближе к Скайнету: научились ли нейросети умножать?. Gated linear unit.. Gated linear unit. GLU.. Gated linear unit. GLU. SwiGLU.. Gated linear unit. GLU. SwiGLU. нейронная сеть.. Gated linear unit. GLU. SwiGLU. нейронная сеть. функция активации.

Занимаясь созданием систем искусственного интеллекта, не перестаешь удивляться, из каких порой «костылей» состоят настоящие чудеса прогресса. Например, знаете ли вы, что даже самые современные нейросети фундаментально не умеют перемножать два числа? Они не считают в привычном нам смысле, а скорее запоминают и аппроксимируют ответы.

Как так вышло, что ИИ пишет код и сочиняет стихи, но буксует на таблице умножения? Давайте разбираться.

Фундаментальная проблема: сложение вместо умножения

Самым распространенным видом искусственного интеллекта сегодня являются нейронные сети. Любую нейронную сеть можно описать схематично:

Входы → Магия (слои нейронной сети) → Выходы

Заявляется, что нейросети — универсальные аппроксиматоры, т.е. способны вычислить ответ для любой задачи. Хорошо, пусть нам надо вычислить стоимость товара, зная цену и количество. Что необходимо сделать? Правильно, умножить цену на количество.

Казалось бы, простейшая задача: два входа (цена и количество) и один выход (стоимость). Нейронная сеть должна справиться. Да? Но если взглянуть на архитектуру базового нейрона (персептрона), мы заметим проблему. Внутри сети входные значения складываются, а не перемножаются.

Простейшая (но не работающая) нейронная сеть для вычисления стоимости товара по его цене и количеству

Простейшая (но не работающая) нейронная сеть для вычисления стоимости товара по его цене и количеству

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

Увеличение количества скрытых слоев не приводит к умножению входов
Увеличение количества скрытых слоев не приводит к умножению входов

Сеть может «угадать» правильный ответ за счёт глубины и количества нейронов, запомнив паттерны, но математической операции умножения x1​⋅x2​ внутри классического персептрона не происходит.

Что происходит внутри нейрона? (Для любопытных)

Давайте заглянем внутрь «чёрного ящика». Ниже я подробно расписал, что происходит с сигналами при прохождении через слои.

Осторожно, много формул!

Что происходит внутри нейрона?

В нейроне h1(1)​ происходит сложение Цены и Количества. Повторюсь – именно сложение. Правда, перед этим цена была увеличена (или уменьшена) в некое число раз (на схеме это число обозначено значком w11(1)​), а количество было отмасштабировано в w12(1)​ раз.

Первый скрытый слой:

h1(1)=x1⋅w11(1)+x2⋅w12(1)

h2(1)​=x1​⋅w21(1)​+x2​⋅w22(1)​

Верхний индекс в скобках это номер скрытого слоя. Веса отмечаются цифрами «куда» «откуда», т.е. w12(1) это вес, который идет к нейрону 1 на следующем слое от нейрона 2 на текущем слое.

Переходя ко второму слою:

h1(2)​=h1(1)​⋅w11(2)​+h2(1)​⋅w12(2)

Если подставим значения из первого слоя, то получим:

h1(2)​=(x1​⋅w11(1)​+x2​⋅w12(1)​)⋅w11(2)​ +

  +(x1​⋅w21(1)​+x2​⋅w22(1)​)⋅w12(2)​

Приведем подобные слагаемые:

h1(2)​=x1​⋅(w11(1)​⋅w11(2)​+w21(1)​⋅w12(2)​)+

    +x2​⋅(w12(1)​⋅w11(2)​+w22(1)​⋅w12(2)​)

Вывод: Перемещаясь вглубь слоёв и к выходу, мы по-прежнему видим сумму взвешенных входов (x1​и x2). Веса перемножаются между собой, складываются в сложные комбинации, но Цена и Количество так и остаются разделёнными знаком «плюс». Они никогда не встречаются в виде произведения. Добавление слоёв и нейронов не помогают.

Математическая хитрость: как получить умножение через сложение

Так что нам делать, если нейронная сеть не умеет умножать? Конечно, можно вручную подать на вход уже перемноженные значения. Но это «инженерный костыль»: в реальной задаче много входов и мы заранее не знаем, какие комбинации понадобятся.

Правда такими «костылями» пользуются многие, по сути подгоняя ответ под известное решение. Например, создатели Tensorflow в своей демонстрации https://playground.tensorflow.org/ не просто так добавили вход x1*x2.

Демонстрация работы библиотеки Tensorflow

Демонстрация работы библиотеки Tensorflow

Кстати, а почему на скриншоте выше вместо (или кроме) умножения еще предлагается использовать возведение в квадрат? Дело в том, что зная квадраты входов, нейронная сеть сможет сымитировать умножение, используя известную школьную формулу:

(x + y)2 = x2 + 2xy + y2

Отсюда выражаем произведение:

x⋅y = 1/2 * ( (x+y)2 −x2 −y2 )

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

Использование гипотетической функции активации «возведение в квадрат» для имитации умножения

Использование гипотетической функции активации «возведение в квадрат» для имитации умножения

Отлично? Нет. Проблема в том, что такую функцию активации как возведение в квадрат никто не использует, а классические функции активации (ReLU, Sigmoid, Tanh и т.д.) даже близко не похожи на функцию f(z) = z2.

Революция Трансформеров и скрытая сила GLU

Перенесемся к Трансформеру — современной архитектуре нейронных сетей, благодаря которой произошла настоящая революция искусственного интеллекта. Именно на Трансформерах работают чаты GPT и другие современные модели.

Долгое время считалось, что и они лишь «угадывают» математику, но на самом деле они могут умножать (если конечно захотят).

Все слышали про статью Google под названием Attetion is All You Need, вышедшую в 2017 году. Да, это действительно революция. Но эта революция НЕ привела к появлению чатов GPT (в конце 2022 года).

Для создания чата GPT потребовалась еще одна мини-революция, произошедшая в 2020 году. Многие пропустили её, сосредоточившись только на механизме внимания (Attention).

Так что же нового произошло в 2020 году? Речь идёт про статью Ноема Шазира (Noam Shazeer) «GLU Variants Improve Transformer» (https://arxiv.org/pdf/2002.05202). В ней впервые предложено заменить стандартные функции активации (такие как ReLU) на так называемые вентили (Gates): ReGLU, GEGLU, SwiGLU.

В указанной статье всего 4 страницы. Но обратите внимание на эту таблицу:

Скриншот из статьи «GLU Variants Improve Transformers»

Скриншот из статьи «GLU Variants Improve Transformers»

Как говорится, вызовем пояснительную бригаду. Верхняя строчка – это использовавшаяся ранее в Трансформерах функция активации ReLU. Да да, если вы её до сих пор используете в 2026 году, то вы проспали последние лет 6. В трех последних строчках использованы современные вентили (gates) ReGLU, SwiGLU, GEGLU. Цифры справа – это по сути оценки ошибок сети, т.е. чем ниже цифра, тем качество сети лучше. Видно, что все варианты вентилей (GLU), работают лучше, чем ReLU.

В статье жирным шрифтом выделены два наилучших вентиля это GEGLU и SwiGLU, именно они используются в полносвязной части всех современных трансформеров. При этом предпочтение отдается SwiGLU, т.к. она вычислительно работает быстрее, чем GEGLU.

В чем суть вентилей вместо функций активации?

Смысл механизма GLU (Gated Linear Unit) в том, что входной сигнал не просто проходит через функцию активации. Он «размножается», проходит двумя разными путями через линейные проекции и «обычные» функции активации, а затем эти пути перемножаются друг с другом.

Схематичное отображение вентиля активации SwiGLU

Схематичное отображение вентиля активации SwiGLU

Формула для SwiGLU выглядит так:

SwiGLU(x)=Swish(x⋅W+b)⋅(x⋅V+c)

Здесь происходит поэлементное умножение результатов двух линейных преобразований. Это дает сети возможность моделировать квадратичные зависимости (возведение в квадрат) и, следовательно, при необходимости имитировать умножение входов. Именно благодаря архитектуре SwiGLU современные модели стали значительно «умнее» и лучше сходятся при обучении.

Это «побочное» открытие осталось мало замеченным широкой публикой, но именно оно позволило трансформерам выйти на новый уровень понимания зависимостей в данных. Это новшество позволяет ввести в нейронные сети понятие умножения, пусть и очень странным способом, настолько странным, что нейронная сеть не всегда его находит при обучении (не выбирает нужные параметры для W, b, V и c).

Реальность: калькулятор в кармане ИИ

Означает ли это, что теперь ChatGPT идеально считает? Не совсем. Несмотря на способность архитектуры моделировать умножение, точность все еще страдает. Нейросеть, особенно генеративная большая языковая модель — это вероятностная, размышляющая, модель. Для неё «2 + 2 = 4» — это как наиболее вероятный токен, но не строгий логический вывод.

Поэтому, когда вы просите современный чат-бот решить сложный пример, он часто поступает как человек: не считает в уме, а берет калькулятор. Точнее говоря, внешний инструмент, выполняющий код на языке Python в отдельной песочнице. Если программа скомпилируется, то нейросеть узнает точный результат. Это долго и требует дополнительных ресурсов и вообще говоря не всегда работает.

Будущее: ИИ как компьютер

Куда мы движемся дальше? В последнее время появились эксперименты по интеграции исполняемых сред прямо в архитектуру модели Трансформера (например, через WebAssembly). Идея в том, чтобы нейросеть могла не просто эмулировать вычисления, а делегировать их нативному коду внутри своего контекста выполнения. Т.е. делать это «родным» образом, а не на дополнительном компьютере. Кто не боится английского языка и вообще не боится трудностей, добро пожаловать в подробности.

Ссылка для смелых

https://www.percepta.ai/blog/can-llms-be-computers

За «наводку» на статью спасибо телеграмм каналу: https://t.me/Futuris/4101

Выводы

Если вы создаёте чат GPT, опираясь на старинные книжки, в которых написано ReLU, поищите более качественную книгу, где используются вентили.

Если вы обучаете ML модель, а она принципиально не хочет «учиться», попробуйте использовать вентили, вместо функций активации.

Подписывайтесь на канал https://t.me/nova_cortex, закрытое сообщество ИИ экспертов из Республики Беларусь. Там мы будем делиться другими тайнами.

Автор: Dmitry_Barovik

Источник