Нейронные сети, структура которых повторяет принципы работы мозга, быстро набирают популярность, что неудивительно: их работа впечатляет. Уже существует длинный список онлайн-сервисов и приложений, которые на основе нейросетевых алгоритмов генерируют изображения по заданным параметрам (Ostagram, Reface App, FaceApp, ruDALL-E, ThisPersonDoesNotExist и др.). Алгоритмы на основе нейронных сетей позволяют озвучивать текст голосом любого человека, дописали Десятую симфонию Бетховена, делают качественный перевод на многие языки и даже побеждают лучших игроков в шахматы и китайскую игру го.
Но самой главной областью для нейронных сетей является робототехника. Многие такие задачи, как перемещение и взаимодействие с объектами, распознавание устной речи и взаимодействие с человеком, осмысливание команд и принятие решений, невозможно реализовать с помощью классического программирования, но они сравнительно легко реализуются с использованием нейросетевых алгоритмов.
Для начала необходимо разобраться, что такое нейронная сеть и как она работает. Уже само название «нейронная сеть» указывает на то, что в ее основе лежит работа нейронов. Дендриты биологического нейрона принимают сигналы от других нейронов через синапсы, которые возбуждают или тормозят входные сигналы, и передают их в тело нейрона. Тело нейрона, в свою очередь, объединяет полученные сигналы и активирует новый сигнал, зависящий от поступивших сигналов: чем больше поступило возбужденных нейронов, тем сильнее новый сигнал. И, наконец, сигнал от нейрона попадает в аксон, где через синапсы передается дендритам новых нейронов. Таким образом, работа нейрона заключается в том, чтобы преобразовать в синапсе входные сигналы от предыдущих нейронов, накопить сигналы со всех дендритов, передать новый сигнал через аксон в другие нейроны. Сложность заключается в том, что в изначальном состоянии нейроны должны пройти этап обучения, то есть в подборе такой комбинации возбуждающих и тормозящих синапсов, чтобы активация нейрона происходила только при заданных значениях.
Искусственные нейронные сети работают аналогичным образом. При программной реализации на вход нейронов первого слоя поступает набор чисел, определяющих входные данные. Для каждого нейрона вычисляется произведение входного числа на «вес» соответствующего синапса, а затем суммируются полученные значения. К полученной величине применяется заданная функция активации, и рассчитывается число, которое поступит на входы нейронов второго слоя.
Для решения сложных задач используются нейронные сети, содержащие несколько сотен и даже тысяч слоев, каждый из которых, в свою очередь, содержит несколько сотен или тысяч нейронов. Для работы и обучения таких структур необходимо каждый раз проводить расчеты для каждого нейрона.
Нужно обратить внимание, что две обученные нейронные сети, имеющие одинаковую структуру нейронов при проведении одинаковых расчетов, могут по-разному активировать внутренние нейроны, но тем не менее в итоге выдавать одинаковый результат. Таким образом, они выступают в роли некоего черного ящика, имеющего входы и выходы, а содержимое которого остается загадкой даже для создателя этой нейронной сети. Именно этим нейросетевые вычисления отличаются от вычислений на классическом компьютере.
Можно привести наглядный пример. Если классическому компьютеру и человеку поставить одинаковую задачу (найти, сколько будет 54), компьютер в соответствии с заложенными инструкциями будет перемножать два числа, то у человека, мозг которого, по сути, является обученной нейронной сетью, всплывет в памяти число 20 без проведения каких-либо расчетов. Грубо говоря, нейросеть пропускает через все свои слои сигналы, в результате чего активируется нужное значение.
В подавляющем большинстве работа нейросетевых алгоритмов осуществляется в виде выполнения определенных программ на стандартной архитектуре вычислительных устройств (процессор, оперативная память и устройство хранения информации являются различными микросхемами на одной плате), которая плохо оптимизирована для мультипараллельных вычислений нейронных сетей больших размерностей. Зарубежными компаниями уже выпускаются нейросетевые ускорители — дополнительные микросхемы, позволяющие частично увеличить производительность нейронных сетей за счет распараллеливания вычислений, однако при этом все равно остается проблема скорости передачи информации: длительность выполнения элементарной операции вычисления сопоставима с временем переноса информации из микросхемы памяти в вычислительную микросхему, в результате существенная часть работы микросхемы уходит исключительно на обмен информацией между устройствами.
Наш коллектив ученых из Института нанотехнологий, электроники и приборостроения Южного федерального университета пошел другим путем: все функции искусственного нейрона можно реализовать с использованием физических процессов. В качестве исходных значений могут использоваться импульсы напряжений с заданной амплитудой. Произведение входного значения на «вес» синапса соответствует току, величина которого определяется произведением входного напряжения на обратное сопротивление резистора. Суммирование полученных значений эквивалентно суммированию токов при схеме с параллельным подключением. А функция активации может быть реализована добавлением соответствующей нагрузки.
Однако и здесь кроется один нюанс. Для реализации функции обучения мы должны изменять «веса» синапсов, а значит, должно меняться сопротивление резисторов. Это можно реализовать с использованием таких «умных» элементов электроники, как мемристоры (от англ. memory — память и англ. resistor — электрическое сопротивление), которые меняют свое сопротивление при приложении внешнего электрического поля.
Нейронные сети в виде таких микросхем имеют следующие преимущества: нет необходимости обмена информацией между различными микросхемами, поскольку вся информация уже записана в виде сопротивления мемристора, выполняющего функцию искусственного синапса; за счет отсутствия калькуляции как таковой все функции нейрона осуществляются за один шаг; возможности применения мемристоров позволяют уйти от бинарных значений и тем самым обеспечивают более тонкую настройку нейронной сети.
В результате мы уже изготовили макет полносвязной однослойной нейронной сети, состоящий из входных контактов (горизонтальные шины), мемристорных синапсов (пересечения горизонтальных и вертикальных шин) и выходов нейронов (вертикальные шины). Такая структура содержит четыре нейрона, каждый из которых посредством синапсов получает информацию с четырех входных контактов.
Несмотря на кажущуюся готовность, на самом деле перед нами стоит колоссальный объем работы. На данный момент мы проводим исследования режимов переключения мемристорных синапсов между различными сопротивлениями, а также воспроизводимости такого переключения в условиях длительной эксплуатации. Необходимо также реализовать и определить наиболее подходящие функции активации нейронов, а также изготовить макеты многослойных нейронных сетей. Более того, на программном уровне активно используются различные структуры нейронных сетей, такие как рекуррентные и сверточные, которые также необходимо реализовать в виде микросхем.
Если нейронные сети в виде программ уже прошли большой эволюционный путь, то нам только предстоит пройти весь этот путь с нашими структурами.