company_banner

Нейросетевой калькулятор для сложения и вычитания не очень больших чисел

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


    Работа уже опубликована на arXiv и сегодня будет представлена на конференции SIGBOVIK в формате аудиозаписи. В этом посте мы поделимся с вами результатами нашего эксперимента. Мотивация и детали реализации также под катом.



    Введение


    Генеративно-состязательные сети (Generative Adversarial Networks, GANs) успешно применяются во многих приложениях компьютерного зрения, включая генерацию кошек и аниме. До настоящего момента было не так много подтверждений, что такие нейросети хороши ещё и в математике.


    Мы следуем тренду развития калькуляторов и представляем нейросетевой калькулятор, принимающий на вход изображение математического выражения и обученный с помощью adversarial-подхода (GAN). Схема работы калькулятора представлена на изображении выше.


    Созданный калькулятор поддерживает сложение и вычитание двузначных чисел. Демо находится по адресу https://yandex.ru/lab/calc_tfjs. Как и положено калькулятору, он считается на устройстве. Для этого используется библиотека TensorFlow.js. Но если она не работает на вашем устройстве, то вы можете воспользоваться версией, запущенной на наших серверах.


    Обзор предыдущих работ


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



    Короткая история калькуляторов: a — механический калькулятор из 1920-х, b — электронный калькулятор из 1980-х, с — калькулятор в Windows 3.x, d — калькулятор в поисковой системе, e — наше решение.


    Механический зверь из 1920-х (см. рис. a) поддерживает сложение и вычитание двух девятизначных чисел. Взамен он требует лишь немного внимания и поворотов ручки. Умножение и деление также поддерживаются, но за 10 минут изучения предмета мы так и не поняли, как именно.


    Изобретение электронных ламп, транзисторов и микросхем подстегнуло развитие электронных калькуляторов. Мультифункциональный калькулятор, работающий от батарейки (см. рис. b), стал вершиной человеческого творения в вещественном мире. Он сочетает в себе непревзойденную эффективность, удобство использования и функциональность. Идея, что эпоха электронных калькуляторов была лучшим временем человеческой цивилизации, подтверждается многими людьми и агентами. А. Смит сказал: «Поэтому Матрица стала такой. Воссоздан пик вашей цивилизации. Именно вашей цивилизации, ведь когда машины начали думать за вас, возникла наша цивилизация».


    В любом случае потом что-то пошло не так и человечество изобрело компьютеры. Сначала для управления требовались перфокарты, потом консоль и, наконец, графический интерфейс.


    Высокопроизводительный (относительно карманного калькулятора) компьютер хранит операционную систему в оперативной памяти и выполняет её в бесконечном цикле, видеокарта отрисовывает 60 кадров в секунду, и это всё лишь для того, чтобы отрисовать калькулятор. Монитор светит пикселями вместо того, чтобы использовать солнечный свет. Посмотрите на пример этого безумия (на рис. с): видно, что функциональность калькулятора упрощена, хотя потребление энергии увеличено в сотни раз.


    Человечество оступилось в проектировании калькуляторов? Возможно. Нашло ли оно правильный путь? Насколько нам известно, нет. Современный калькулятор — это либо приложение на устройстве, либо веб-страница. Математические выражения — частый тип запросов к поисковым машинам (см. рис. d). Теперь для того, чтобы сложить два числа, требуется не только высокопроизводительное устройство, но и соединение с интернетом (который, без сомнения, очень сложная штука).


    Итак, калькуляторы становятся более ресурсоёмкими и менее функциональными. Наш калькулятор (рис. e) — логическое продолжение процесса развития калькуляторов.


    Метод


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


    Мы обнаружили, что существует возможность создания парного датасета математических выражений (например, 5 + 2) и соответствующих им ответов (например, 7). Для сбора данных применялись калькуляторы предыдущих поколений. Для каждой пары выражений и ответов мы генерируем пару изображений, используя случайные числа соответствующих классов из датасета MNIST.


    Мы взяли за основу UNet-подобную архитектуру, так как она позволяет принимать картинку на вход и генерировать картинку-результат. Основное отличие нашей модели в том, что мы убрали все skip-connections и добавили несколько полносвязных слоёв в ботлнек-модели. Это сделало модель больше не похожей на UNet. Зато это останавливает сеть от использования частей входной картинки в выходной.


    К сожалению, задачу невозможно решить, обучая нейросеть просто с использованием функции потерь L1. Из-за того что изображения ответов собраны из случайных чисел MNIST, сеть сходится к генерации размытых ответов, напоминающих усреднённые числа из MNIST. Для того чтобы поощрять сеть генерировать различное написание чисел, мы предлагаем применять функции потерь GAN и perceptual. Для последней мы используем классификационную нейросеть VGG, обученную распознавать числа из MNIST.


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


    Результаты


    Используя процедуру, описанную выше, мы успешно обучили наш нейросетевой калькулятор. Он принимает числа от –99 до 99 и способен складывать и вычитать. Согласно нашему опыту, этого достаточно для покрытия всех повседневных нужд.


    Качественные результаты калькулятора показаны на рисунке ниже. Результаты, отобранные вручную, показывают идеальное качество работы модели. Также можно взглянуть на наше демо.



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


    Метод Качество
    Большинство калькуляторов 100% успеха
    Наш метод Мы не используем распознавание чисел как часть нашего решения, так как калькулятор предназначен для людей.

    Заключение


    С тех пор как мы разработали этот калькулятор, мы показали его многим влиятельным людям в области компьютерного зрения. Некоторые из них посоветовали отправить работу на SIGBOVIK. Мы надеемся, что читатели оценят по достоинству нашу работу, начнут использовать более современный калькулятор и вступят в новую эру вычислений (шутка).


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




    Важность этого эксперимента в том, чтобы показать, что нейросети способны обобщать даже вот такие логические задачи. Мы не первые, кто проводит подобный эксперимент, есть вот такая известная работа на этот счет. Отличие нашей работы в том, что мы используем различные написания символов и подаем на вход выражение одной картинкой, что усложняет задачу для нейросети. Но она все равно справляется.


    Конечно, в основном Яндекс проводит более практичные исследования. Мы в Лаборатории машинного интеллекта занимаемся генеративными сетями, вот наша последняя научная работа. Все научные работы Яндекса собраны здесь.

    Яндекс
    Как мы делаем Яндекс

    Комментарии 47

      –1
      Было бы круто, если бы цифры можно было перетаскивать из заданного набора (причем разных). А то так чет с кнопками не алё.
        0
        Мышью рисовать!
          +4
          Это не наш метод! Слишком просто. Взаимодействие с пользователем должно быть максимально невыносимым.
        0
        Когда считаю «10 — 10», он пишет "-0", немного странно.
        Ох, а «99 — 99» он не может посчитать, неправильные ответы выдаёт. То 10, то 32.
          0
          Кстати, можно нажимать на "=" несколько раз – тогда выражение будет оставаться тем же, но начертание символов выражения будет меняться. От этого будет немного меняться изображение ответа
            0
            10-10=





            0
            68-62=0, ок
              0
              ага или -0
              никогда Штирлиц не был так близко к провалу…
                0
                Да, сетка иногда ошибается =) Все-таки она не вычисляет заданное выражение напрямую. Возможно, в этом примере начертания 2 и 8 были похожи, и сетка их перепутала
                  0
                  она ошибается, когда идёт вычитание, а результат должен быть в диапазоне 1-9. Тогда 0 получается. 68-60, 91-23 и тд
                    0
                    *91-83
                0
                Прикольно, но непонятен практический смысл этой работы. Я бы вам предложил попробовать собрать нейросеть для символьных вычислений, типа такой arxiv.org/abs/1912.01412. Может быть можно будет её развить до уровня, когда она сможет сама доказывать теоремы? :)
                  +1
                  Может быть можно будет её развить до уровня, когда она сможет сама доказывать теоремы? :)

                  Любые? Куча учёных 20-го века не даст.

                  –1
                  56 — 57
                    +3

                    Правильный ответ в оценке этого комментария? :)

                    +8
                    Будущее здесь. Примерно так через 30 лет будет вычисляться операция a+b на устройствах. А мы, старики, будем неодумевать, почему никого не беспокоит такая грандиозная неэффективность.

                    И если вам кажется это бредом – предлагаю посчитать сколько времени тратится на вычисление a+b в Python и сравнить это с одной ассемблерной инструкцией.

                    Так что спасибо Яндекс что приоткрыл всем нам дорогу в ад.
                      +2

                      Будущее давно предсказано. У Айзека Азимова есть коротенький рассказ, называется "Чувство силы". По моему, как раз про это.

                        0
                        *гранциозная неэффективность
                        Вот, так гораздо легче продать.
                        +1
                        Как я понимаю — натренировали сеть на распознавание всех комбинаций двузначных чисел (10000 комбинаций), каждой комбинации сопоставили ответ, далее выдают это за достижение.

                        А чем это достижение отличается от распознавания китайских иероглифов? Иероглифов больше, чем 10000.

                        Надо бы включать самокритику до публикации, а то вот приходится подключаться…
                          +9
                          Сегодня день такой, особенный.
                          0
                          95+95=180
                            0

                            Напоминает язык karasik с оператором "примерное присваивание"

                            +1
                            Вопрос, нафига? Любому человеку, кто работает с нейросетями и так понятно что это возможно сделать, даже ради чистой науки.
                              +4
                              ну уже не раз отвечали. посмотрите в календарь;)
                                0
                                ), я как то со всей этой коронавирусной ист[о, е]рией совсем забыл что есть вещи над которыми можно улыбнуться
                              +2

                              30 — 30 выдает 10 с разной степенью стёртости единицы. Иногда ее почти не видно, и на выходе как бы 0, но в основном получается 10.

                                +2
                                Сначала подумал, что первоапрельская шутка.
                                  +3
                                  Так это ж она и есть)
                                    0
                                    Ну сетка-то настоящая? В чем шутка? Ну, применение, конечно забавное, но это примерно как статьи из «ненормального программирования».
                                  0
                                  Эх, всё прекрасно, но вот наличие у статьи лишь одного автора сильно бросается в глаза. Ещё и глаз спотыкается об эти «we».
                                    +2

                                    Видимо невнимательно прочитал статью, не нашел информацию о точности

                                      0
                                      Первая же попытка на tfjs: 11-2=19. На /calc 11-2=0.
                                      Мда.
                                        0
                                        33+33 = 86, 44+44=98. Мда…
                                          0
                                          23+31=5?
                                          Загогулина в числе «пятьдесят с чем-то» — то ли единица, то ли семёрка, то ли вопросительный знак.
                                        +1
                                        Заготовка для разгадывателя капч? :)
                                        Вроде попадались где-то такие арифметические
                                          0
                                          С аугментацией данных явно проблем не было:-)
                                            0
                                            Теперь на этом калькуляторе можно сэмулировать не очень большую нейронную сеть.
                                              0
                                              Некоторые цифры напоминают ответы некоторых школьников у доски: если не можешь сосчитать нужно пробормотать под нос что-то невнятное типа «бырбырнадцать» :)

                                              22-22=?
                                              Заголовок спойлера

                                                +1
                                                вызывает сомнение, что данный калькулятор действительно освоил арифметику с 2значными числами. более похоже, что он освоил какую картинку надо рисовать в ответ на другую картинку. освоить арифметику, это если бы он учился на двузначных числах, а в результате мог оперировать значительно более многозначными, со всякими высокоуровневыми правилами, типа сдвига разрядов и т д. а так — в нейросети в неявном виде хранятся просто все варианты. ее ведь так и учили, на куче сгенерированных картинок с правильными ответами.
                                                  0
                                                  Хорошее замечание =)
                                                  Действительно, в этом случае она могла просто попытаться всё запомнить. Чтобы проверить знания арифметики, нужны примеры посложнее. Я пробовал учить сетку решать выражения вплоть до 9-значного входа (например «56789+456») – сетка обучается, но начинает чаще ошибаться в простых примерах, типа «2+2». Возможно, более правильные лоссы/перевзвешивание выборки могли бы помочь.

                                                  В работе arxiv.org/abs/1506.02264 коллегам удалось в более простой постановке задачи поддержать сложение и вычитание 7-значных чисел (с долей ошибок 2-3%). В то же время, авторам не удалось поддержать умножение (72% ошибок). Если бы сети хватало capacity просто запомнить все ответы, то разницы бы не было. Похоже, что сеть все-таки действительно может освоить сложение и вычитание просто из парных ответов. Если у кого-то получится поддержать умножение, то это потянет на настоящую научную работу)
                                                    0
                                                    Вот все комбинации семизначных чисел мне кажется она просто запомнить не сможет, и придется именно разбираться в правилах. хотя не ясно, почему появилась проблема с умножениями, ведь в результате умножений получается числа имеющие больше разрядов, чем исходные, как и в случае сложения. а в случае вычитания разрядов может стать меньше. не понимаю, почему сетке не без разницы. Почему правило сложения с ее точки зрения проще, чем правило умножения…
                                                    С другой стороны, мне кажется порочным путь, в которым мы учим сетку отдельно складывать однозначные, двузначные, трезначные, однозначные с двузначными, однозначные с трехначными. Подсовывая такие выборки может статься, что она вычленит именно правила например сложения двузначных с однозначными, а остальные (например, однозначные с однозначными) позабудет. Именно это, скорее всего вы и наблюдали, когда сетка стала ошибаться в простых примерах. То есть вы как бы переобучали ее на больших примерах вытесняя правила маленьких примеров. А общая логика, которая работала бы для любых примеров ею схвачена не была изначально. Может быть это можно решить увеличением количества слоев, или чем то в этом роде.
                                                  0
                                                  del
                                                    0
                                                    Что-то подобное есть в приложении Photomath для решения математических примеров, там распознавание рукописного ввода очень даже ничего.
                                                      0
                                                      Тут главное не распознавание как таковое, а сам принцип решения. Так то распознать цифры и классически решить все — вообще не проблема.
                                                      0
                                                      Сеть, бывают случаи, что просто наглухо не видит некоторые цифры.
                                                      Картинка №1
                                                      image

                                                      А перед нулём может, с чего-то, становиться + или -, а то и они оба…
                                                        0
                                                        77-11=-66
                                                          +1
                                                          Мы взяли за основу UNet-подобную архитектуру,… убрали все skip-connections и добавили несколько полносвязных слоёв в ботлнек-модели. Это сделало модель больше не похожей на UNet.
                                                          — да это же… автоэнкодер! )

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

                                                          Самое читаемое