- BrainTools - https://www.braintools.ru -
Занимаясь созданием систем искусственного интеллекта [1], не перестаешь удивляться, из каких порой «костылей» состоят настоящие чудеса прогресса. Например, знаете ли вы, что даже самые современные нейросети фундаментально не умеют перемножать два числа? Они не считают в привычном нам смысле, а скорее запоминают и аппроксимируют ответы.
Как так вышло, что ИИ пишет код и сочиняет стихи, но буксует на таблице умножения? Давайте разбираться.
Самым распространенным видом искусственного интеллекта сегодня являются нейронные сети. Любую нейронную сеть можно описать схематично:
Входы → Магия (слои нейронной сети) → Выходы
Заявляется, что нейросети — универсальные аппроксиматоры, т.е. способны вычислить ответ для любой задачи. Хорошо, пусть нам надо вычислить стоимость товара, зная цену и количество. Что необходимо сделать? Правильно, умножить цену на количество.
Казалось бы, простейшая задача: два входа (цена и количество) и один выход (стоимость). Нейронная сеть должна справиться. Да? Но если взглянуть на архитектуру базового нейрона [2] (персептрона), мы заметим проблему. Внутри сети входные значения складываются, а не перемножаются.
Даже если мы добавим скрытые слои и сделаем сеть глубокой, принцип не изменится. В каждом нейроне происходит линейная комбинация входов. Цена и количество умножаются на веса (константы), но никогда не перемножаются друг с другом.
Сеть может «угадать» правильный ответ за счёт глубины и количества нейронов, запомнив паттерны, но математической операции умножения x1⋅x2 внутри классического персептрона не происходит.
Давайте заглянем внутрь «чёрного ящика». Ниже я подробно расписал, что происходит с сигналами при прохождении через слои.
Что происходит внутри нейрона?
В нейроне h1(1) происходит сложение Цены и Количества. Повторюсь – именно сложение. Правда, перед этим цена была увеличена (или уменьшена) в некое число раз (на схеме это число обозначено значком w11(1)), а количество было отмасштабировано в w12(1) раз.
Первый скрытый слой:
Верхний индекс в скобках — это номер скрытого слоя. Веса отмечаются цифрами «куда» «откуда», т.е. w12(1) — это вес, который идет к нейрону 1 на следующем слое от нейрона 2 на текущем слое.
Переходя ко второму слою:
Если подставим значения из первого слоя, то получим:
Приведем подобные слагаемые:
Вывод: Перемещаясь вглубь слоёв и к выходу, мы по-прежнему видим сумму взвешенных входов (и
). Веса перемножаются между собой, складываются в сложные комбинации, но Цена и Количество так и остаются разделёнными знаком «плюс». Они никогда не встречаются в виде произведения. Добавление слоёв и нейронов не помогают.
Так что нам делать, если нейронная сеть не умеет умножать? Конечно, можно вручную подать на вход уже перемноженные значения. Но это «инженерный костыль»: в реальной задаче много входов и мы заранее не знаем, какие комбинации понадобятся.
Правда такими «костылями» пользуются многие, по сути подгоняя ответ под известное решение. Например, создатели Tensorflow в своей демонстрации https://playground.tensorflow.org/ [3] не просто так добавили вход .
Кстати, а почему на скриншоте выше вместо (или кроме) умножения еще предлагается использовать возведение в квадрат? Дело в том, что зная квадраты входов, нейронная сеть сможет сымитировать умножение, используя известную школьную формулу:
(x + y)2 = x2 + 2xy + y2
Отсюда выражаем произведение:
x⋅y = 1/2 * ( (x+y)2 −x2 −y2 )
Таким образом, умножение сводится к комбинации трех операций: сложение, вычитание и возведение в квадрат. Вот как выглядело бы перемножение входов, если в качестве функции активации использовать возведение в квадрат.
Отлично? Нет. Проблема в том, что такую функцию активации как возведение в квадрат никто не использует, а классические функции активации (ReLU, Sigmoid, Tanh и т.д.) даже близко не похожи на функцию f(z) = z2.
Перенесемся к Трансформеру — современной архитектуре нейронных сетей, благодаря которой произошла настоящая революция искусственного интеллекта. Именно на Трансформерах работают чаты GPT и другие современные модели.
Долгое время считалось, что и они лишь «угадывают» математику [4], но на самом деле они могут умножать (если конечно захотят).
Все слышали про статью Google под названием Attetion is All You Need, вышедшую в 2017 году. Да, это действительно революция. Но эта революция НЕ привела к появлению чатов GPT (в конце 2022 года).
Для создания чата GPT потребовалась еще одна мини-революция, произошедшая в 2020 году. Многие пропустили её, сосредоточившись только на механизме внимания [5] (Attention).
Так что же нового произошло в 2020 году? Речь идёт про статью Ноема Шазира (Noam Shazeer) «GLU Variants Improve Transformer» (https://arxiv.org/pdf/2002.05202 [6]). В ней впервые предложено заменить стандартные функции активации (такие как ReLU) на так называемые вентили (Gates): ReGLU, GEGLU, SwiGLU.
В указанной статье всего 4 страницы. Но обратите внимание на эту таблицу:
Как говорится, вызовем пояснительную бригаду. Верхняя строчка – это использовавшаяся ранее в Трансформерах функция активации ReLU. Да да, если вы её до сих пор используете в 2026 году, то вы проспали последние лет 6. В трех последних строчках использованы современные вентили (gates) ReGLU, SwiGLU, GEGLU. Цифры справа – это по сути оценки ошибок сети, т.е. чем ниже цифра, тем качество сети лучше. Видно, что все варианты вентилей (GLU), работают лучше, чем ReLU.
В статье жирным шрифтом выделены два наилучших вентиля это GEGLU и SwiGLU, именно они используются в полносвязной части всех современных трансформеров. При этом предпочтение отдается SwiGLU, т.к. она вычислительно работает быстрее, чем GEGLU.
Смысл механизма GLU (Gated Linear Unit) в том, что входной сигнал не просто проходит через функцию активации. Он «размножается», проходит двумя разными путями через линейные проекции и «обычные» функции активации, а затем эти пути перемножаются друг с другом.
Формула для SwiGLU выглядит так:
Здесь происходит поэлементное умножение результатов двух линейных преобразований. Это дает сети возможность моделировать квадратичные зависимости (возведение в квадрат) и, следовательно, при необходимости имитировать умножение входов. Именно благодаря архитектуре SwiGLU современные модели стали значительно «умнее» и лучше сходятся при обучении [7].
Это «побочное» открытие осталось мало замеченным широкой публикой, но именно оно позволило трансформерам выйти на новый уровень понимания зависимостей в данных. Это новшество позволяет ввести в нейронные сети понятие умножения, пусть и очень странным способом, настолько странным, что нейронная сеть не всегда его находит при обучении (не выбирает нужные параметры для W, b, V и c).
Означает ли это, что теперь ChatGPT идеально считает? Не совсем. Несмотря на способность архитектуры моделировать умножение, точность все еще страдает. Нейросеть, особенно генеративная большая языковая модель — это вероятностная, размышляющая, модель. Для неё «2 + 2 = 4» — это как наиболее вероятный токен, но не строгий логический вывод.
Поэтому, когда вы просите современный чат-бот решить сложный пример, он часто поступает как человек: не считает в уме, а берет калькулятор. Точнее говоря, внешний инструмент, выполняющий код на языке Python в отдельной песочнице. Если программа скомпилируется, то нейросеть узнает точный результат. Это долго и требует дополнительных ресурсов и вообще говоря не всегда работает.
Куда мы движемся дальше? В последнее время появились эксперименты по интеграции исполняемых сред прямо в архитектуру модели Трансформера (например, через WebAssembly). Идея в том, чтобы нейросеть могла не просто эмулировать вычисления, а делегировать их нативному коду внутри своего контекста выполнения. Т.е. делать это «родным» образом, а не на дополнительном компьютере. Кто не боится английского языка и вообще не боится трудностей, добро пожаловать в подробности.
https://www.percepta.ai/blog/can-llms-be-computers [8]
За «наводку» на статью спасибо телеграмм каналу: https://t.me/Futuris/4101 [9]
Если вы создаёте чат GPT, опираясь на старинные книжки, в которых написано ReLU, поищите более качественную книгу, где используются вентили.
Если вы обучаете ML модель, а она принципиально не хочет «учиться», попробуйте использовать вентили, вместо функций активации.
Подписывайтесь на канал https://t.me/nova_cortex [10], закрытое сообщество ИИ экспертов из Республики Беларусь. Там мы будем делиться другими тайнами.
Автор: Dmitry_Barovik
Источник [11]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/28294
URLs in this post:
[1] интеллекта: http://www.braintools.ru/article/7605
[2] нейрона: http://www.braintools.ru/article/6020
[3] https://playground.tensorflow.org/: https://playground.tensorflow.org/
[4] математику: http://www.braintools.ru/article/7620
[5] внимания: http://www.braintools.ru/article/7595
[6] https://arxiv.org/pdf/2002.05202: https://arxiv.org/pdf/2002.05202
[7] обучении: http://www.braintools.ru/article/5125
[8] https://www.percepta.ai/blog/can-llms-be-computers: https://www.percepta.ai/blog/can-llms-be-computers
[9] https://t.me/Futuris/4101: https://t.me/Futuris/4101
[10] https://t.me/nova_cortex: https://t.me/nova_cortex
[11] Источник: https://habr.com/ru/articles/1019500/?utm_campaign=1019500&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.