Как работают двоичные нейронные сети, и почему они будут популярными в 2020-м

Автор оригинала: Henk Muller
  • Перевод

Нейросети – штука классная, однако их потенциал до сих пор ограничивают стоимость и энергия; с этим, возможно, помогут справиться двоичные нейросети




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

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

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

Одна из альтернатив, которые изучают многие организации – двоичные сети. Это достаточно новая технология, но она, вероятно, станет достаточно влиятельной в 2020-м. Чтобы понять, почему, нам нужно уяснить, как работают оба типа сетей.

Как работают нейросети


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

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

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


Рис. 1

На рис. 1 (а это фото Барака Обамы) видно, как эти слои анализа и вероятностей суммируются, позволяя сети, работающей с приближёнными значениями, выдавать относительно точный ответ.

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

Недостатки традиционных нейросетей


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

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

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

Как работают двоичные сети


Если обычная нейросеть – это картина Пикассо, то двоичная нейросеть – это грубый карандашный набросок.

Если нейросети присваивают каждому сегменту точно подсчитанную вероятность, то двоичные нейросети, как следует из их имени, сводят вероятные значения к чёрно-белому варианту, то есть, либо к -1 (если сеть считает, что признака в этом фрагменте нет), либо +1 (если он есть).

Теперь взвешенная сумма оценивает каждый признак либо положительно (умножая на +1), либо отрицательно (умножая на -1), и вместо полных перемножений нам нужно рассматривать лишь умножения на +1 и -1.


Рис. 2

Такой подход жертвует определённой долей точности, но мы можем возместить потери, немного увеличив сеть. Двоичные сети по своей сути гораздо проще.

По сравнению со своими двойниками с плавающей запятой, им требуется в 32 раза меньше места для хранения числа (1 бит вместо 32), и в сотни раз меньше энергии, из-за чего они куда как более применимы для «краевых приложений» типа робомобилей, когда сами устройства могут обработать информацию, не привлекая облачные вычисления.

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

Будущее двоичных сетей


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

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

Таким образом, следующее поколение технологий будет основано на простоте.

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

    +2

    Эээм. А что там по обучению этого чуда? "Классические" сетки основаны как раз на аналоговости своих весов. Если это пропадает, то мы не можем шагнуть на маленький шаг.


    Далее, для такой же точности, дайте угадаю, понадобится сетка, у которой в 32 раза больше весов, чем у классической?

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

      P.S. Вот у интела написано что только на этапе обучения используются полные веса
      software.intel.com/en-us/articles/binary-neural-networks
        0

        Действительно, что-то не догадался. Тогда уже интереснее

        +2
        1) с обучением как раз всё как-то работает: как один из вариантов решения, в бинарных сетях используется стохастическое обучение. Если backprop даёт 0.65, то это значит, то с вероятностью 0.65 текущий вес поменяется. Плохонько, но работает. Кроме того, пока что не придумали, как к такому прикрутить тот же BatchNorm (хотя Dropout — запросто).
        2) нет, опыты показывают, что float32 хранит в среднем только 5 значащих разрядов. Поэтому примерно ему можно поставить в соответствие 5-10 бинарных нейрончиков (5 при идеальном разбиении, 10 при неидеальном). Итого экономия в 3-6 раз. Но вот прунинг показывает более хорошие результаты — в 10-50 раз…
        3) но вообще, нейроны на выходах и так бинарные… но вот что делать со входом? Как нормально заменить в традиционной компьютерной архитектуре аналоговое суммирование с 10-100 входов? тем более, бинаризовав… ну, есть векторные popcnt и and, но это нам чтобы считать каждый нейрон нужно конвертировать результаты в int8/int16, а потом перевести в бинарный вид. вот если железо будет ещё больше заточено на это, то выигрыш может быть ещё в разы или в десятки раз больше, наверное.
        но, заметим, что такой же трюк с аккумуляцией и умножением можно применить и для float16 входов… и получаем 100 TFlops на видюшке для подобных же вычислений, и не меньшую эффективность на нейрон, чем с бинарными данными, но без требований стохастической бинаризации, снижающей скорость и качество обучения.
        ситуация может в очередной раз поменяться только когда вместо 10-1000 ALU на устройстве мы захотим сделать миллионы ALU с собственной памятью, вот тогда бинаризация существенно упростит конструкцию и расход энергии на один ALU.
          +1
          1)… Вроде бы стохастическое это скорее так: у нас есть бинаризованный вес, и есть непрерывный, в расчетах прямого и обратного прохода используем бинаризованный, но вычисленный градиент прибавляем к непрерывному, а его используем как вероятность выбора нового веса для следующего прохода.
          Как нормально заменить в традиционной компьютерной архитектуре аналоговое суммирование с 10-100 входов?
          Да всё также, умножением на матрицу весов, только веса +-1. Вон, NVidia поддержала 4-битные данные, у нас вот в Нейроматриксе есть умножение на упакованный вектор двухбитных чисел.
            0
            ситуация может в очередной раз поменяться только когда вместо 10-1000 ALU на устройстве мы захотим сделать миллионы ALU с собственной памятью, вот тогда бинаризация существенно упростит конструкцию и расход энергии на один ALU.

            Вроде как такие вещи хорошо делаются на FPGA, например.
              0
              Ага, в теории. А на практике, по ссылке лишь 200к ALUs на 35 вт, и никакой бинаризации. А без бинаризации получилось решение в 5 раз слабее видеокарты, жрущее в 5 раз меньше энергии, и не дешевле.
                0
                Вот ещё ссылка, правда здесь уже не коробочный акселератор, а университетское исследование на стартките. В таблице в конце 7.6 TOPs на 8 Вт. В статье они также грубо оценивают вычислительный параллелизм GPU и FPGA, при этом на 1 LUT в среднем по их прикидке выходит 2.5 операции XNOR. Не знаю, корректно ли это считать за АЛУ, но если да, то вот вам порядка миллиона АЛУ на кристалле.
                Конечно есть вопросы к их реализации: как и в ссылке на Nallatech, они тоже кодили с использованием средств высокоуровневого синтеза (HLS), вероятно обычным RTL было бы эффективнее по ресурсам и частоте, кроме того, по идее могли бы попробовать вписаться в меньший и более дешёвый кристалл. У них там дорогой Virtex за 5K$, хотя наверно удалось бы влезть в Kintex за 1.5К$.
                За пределами FPGA что-то похожее на описанные вами миллионы АЛУ с собственной памятью делают GSI Technology: вот презентация их APU, здесь простейшие вычислители совмещены с ячейками памяти.
                  0
                  Спасибо. Да, многие пытаются, но пока вычислительная эффективность на традиционных дизайнах FPGA не очень высока почему-то… Но энергоэффективность при предсказании при этом раз в 3-10 выше по сравнению с максимальным TDP неспециализированной видюшки, поэтому крупные компании их всё же используют.
                  Мои догадки: остаётся критичной узкая шина обращения к памяти, и плохо исследованы эффективные под FPGA модификации алгоритмов обучения и предсказания с бинарными весами: предсказания на сетке с прунингом+int8 сейчас работают лучше (заметим, что всё это обычно и исследуется на картинках, где int8 на входе).
                  Я надеюсь на то, что допилят мемристоры, энергоэффективность ALU повысится, проблема с памятью рядом с вычислениями решится… в результате, аналоговые/float вычисления станут ещё более конкурентноспособными, можно будет делать быстрое обучение прямо на чипе, и одновременно решится проблема быстрого суммирования при inference — в том числе, бинарного.
          +1
          > чтобы мы смогли воспользоваться преимуществами нейросетей на переднем крае информационных технологий и сетей связи
          Оригинал: to spread the benefits of neural networks closer to the edge of IT and communication networks
          Смысл в оригинале: распространить преимущества нейросетей ближе к краю, т.е. не в ядре сетей (в датацентрах), а на серверах ближе к пользователю (на узлах провайдера, в сотовых вышках, и т.д.) и на сами устройства (мобильные телефоны, автомобили, телевизоры, весь этот IoT).
            –5
            У таких сетей есть еще масса приемуществ. Не обязательно считать всю сеть а можно лишь ее часть. Я считал как то сколько это может быть и уменя вышли такие цифры Для расчета достаточно 3.2% (32 нейрона) при сети в тысячу нейронов, 0.1% (1 тыс) при миллионе «нейронов» в сети и 0.003% (32 тыс) при сети размером в миллиард «нейронов». Цифры могут немного разница от результата расчета, но порядки будут оставаться в близких пределах. Это даст просто огромное приемущество на действительно больших массивах данных. И еще одной свойство это отсутствие эффекта переобуения, то, чем страдает большая часть «аналоговых» алгоритмов.
              0
              И еще одной свойство это отсутствие эффекта переобуения, то, чем страдает большая часть «аналоговых» алгоритмов

              А можно пруфы?
              Не вижу никаких причин для отсутствия переобучения в таких сетях…
                +3
                Предупреждаю, у этого товарища своё определение «Переобучения», никак не связанное с настоящим переобучением. А ещё свой чудесный алгоритм без «переобучения» (в его формулировке).
                  0

                  Может он имеет ввиду проблемы со значениями весов (которые, правда, фиксятся L1 и L2)?

                    +1
                    Нет, у него переобучение — это не когда «на трейне — отлично, на тесте — хреново», а когда с увеличением количества эпох на тренировочной (и единственной, ибо весь тест слит туда) выборке данных не растёт точность.
                    Его в ods.ai уже на протяжении 5700 сообщений народ переубедить пытается.
                      0

                      Ясно). Давно в этот слек не заходил

              0

              А что если вместо одного бита использовать чуть больше: 2 или 4?

                0
                Немного иронии, а все потому, что в России нет 5G )
                  0

                  https://arxiv.org/abs/1602.02830
                  Есть bnn
                  Возможно речь о них. Вопрос один есть ли готовая библиотека для создания обучения и тестов?

                    0

                    Статья отражает многие современные исследования. На ум приходит компания Numenta, Jeff Howkins with Hierarchical Temporal Memory. У них много есть чего на youtube в том числе очень интересные курсы по HTM. Так вот они тоже все строят на бинарной идее.
                    Далеко ходить не надо. Наш могз построен на бинарной основе и пока что никакие супер-сложные и быстрые процессоры его не переплюнули. Numenta как раз идет от работы мозга.
                    Так что, я тоже думаю, что бинарные сети будут рулить.
                    Похоже, что самая большая проблема на этом пути — в создании "правильного" двоичного железа. Не того, что моделирует плавающую арифметику на двоичной элементной базе, а железа, похожего на HTM.
                    … и вдогонку. Дискуссии о проблемах имплементирования бинарных сетей на существующих процессорах понятны, но, по большому счету, мало что значат. Как в свое время быстренько выдумали GPU для каких-то там игра, так и сейчас, быстренько сварганят двоичные процессоры для бинарных сетей. С современными компьютерами — это небольшая работа :)

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

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