Иногда я замечаю, что люди относятся к нейронным сетям как к «еще одному инструменту для машинного обучения». У них есть некоторые плюсы и минусы, они работают здесь или там, и иногда вы можете использовать их, чтобы выиграть соревнования Kaggle. К сожалению, эта интерпретация полностью пропускает лес за деревьями. Нейронные сети — это не просто еще один классификатор, они представляют собой начало фундаментального сдвига в том, как мы пишем программное обеспечение. Это Software 2.0.

«Классический стек» Software 1.0 — это то, с чем мы все знакомы — оно написано на таких языках, как Python, C ++ и т. д. Оно состоит из явных инструкций для компьютера, написанного программистом. Записывая каждую строку кода, программист идентифицирует конкретную точку в программном пространстве с некоторым желательным поведением.

image

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

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

image

Software 2.0 не собирается заменять 1.0 (наоборот, для обучения и вывода на компиляцию 2.0-кода требуется большая часть инфраструктуры 1.0 ) но возьмёт на себя значительную часть того, за что сейчас отвечает 1.0. Давайте рассмотрим некоторые конкретные примеры, чтобы стало понятнее:

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

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

Синтезирование речи исторически состояло из различных “механизмов сшивания”. Современный подход представляет собой крупные нейронные сети (к примеру WaveNest), которые сразу генерируют выходной поток аудиосигналов.

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

У робототехники есть давняя традиция, разбивать проблему на блоки восприятия, оценивающие ситуацию, планирующие, управляющие и прочие. После этого над каждым промежуточным представлением выполняются явные алгоритмы. Тут мы еще не победили, но исследования UC Berkeley и Google намекают на то, что Software 2.0 может выполнять работу всего этого кода гораздо лучше.

Игры. Игровые программы по Go существуют уже давно, но совсем недавно AlphaGo Zero (ConvNet, обрабатывающая ситуацию на доске, и планирующая ход) стала самым сильным игроком по Go в мире. Думаю, что очень скоро мы увидим схожие результаты для DOTA 2 и StarCraft.

Вы можете заметить, что многие ссылки, которые я предоставляю рассказывают о причастии к работе Google. Это потому, что прямо сейчас Google переписывает огромные блоки кода своих платформ под Software 2.0. Для получения представления о том, как это будет работать, можно почитать “One model to rule them all”, в нём статистическая сила отдельных доменов объединена в последовательное понимание мира.

Преимущества Software 2.0


Почему мы предпочитаем переносить сложные программы в Software 2.0? Ясно, что один простой ответ заключается в том, что они на практике работают лучше. Тем не менее, есть много других причин, чтобы предпочесть этот стек. Давайте рассмотрим некоторые преимущества Software 2.0 (на примере ConvNet) по сравнению с Software 1.0 (на примере: C ++ на уровне производства). Software 2.0. это:

Однородные вычисления. Типичная нейронная сеть состоит из бутерброда всего двух операций: умножения матриц и нулевого порога (ReLU). Сравните это с набором инструкций классического программного обеспечения, оно значительно более гетерогенно и сложно. Поскольку вам нужно обеспечить реализацию Software 1.0 только для небольшого количества основных вычислительных примитивов (например, умножить матрицу), гораздо проще гарантировать правильность / производительность различных операций.

Проще “запечь” в кремнии. В следствии того, что набор операций нейронных сетей относительно невелик, намного проще реализовать эти операции в техническом плане, при помощи ASIC, нейроморфных чипов и т.п. Мир сильно изменится с широким распространением “маломощного интеллекта”. К примеру небольшие дешевые чипы могут поставляться с предварительно разработанной ConvNet, распознаванием речи и сетью генерацией речи WaveNet, и всё это в маленьком прото мозге, который можно прикрепить к чему угодно.

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

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

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

Хорошая гибкость. Если у вас есть код на C++ работу которого нужно ускорить в два раза (даже ценой производительности), перенастраивать его под новую спецификацию будет не простой задачей. При помощи Software 2.0 мы можем взять нашу сеть, удалить половину каналов, провести тренировку еще раз, и пожалуйста, она работает в два раза быстрее и не на много хуже. Это магия. И в другую сторону, если у вас появляется больше данных или вычислений, вы можете улучшить свою программу, увеличив количество каналов и проведя тренировку еще раз.

Модули могут оптимально объединяться в одно целое. Наше программное обеспечение часто разбито на модули, которые связываются друг с другом при помощи различных функций, API-интерфейсов или конечных точек. Однако, если мы используем два модуля Software 2.0, которые изначально были обучены отдельно, их можно легко объединить. Подумайте о том, как удобно, когда браузер сам преобразует 10 стеков низкоуровневых инструкций, для повышения скорости загрузки веб страницы. Это поведение по умолчанию для 2.0.

Его легко изучать. Мне нравится шутка о том, что глубокое машинное обучение не такое уж глубокое. Это не ядерная физика, где вам нужна докторская степень, для того, чтобы сделать хоть что-то полезное. Основные понятия требуют знаний базовой линейной алгебры, вычислений, Python и нескольких лекций из CS231n. Разумеется, в будущем вы сможете использовать полученный опыт и интуицию в решении проблем, поэтому правильно будет сказать, что в стеке Software 2.0 легко разобраться, но он нетривиален для освоения (easy to learn, hard to master).

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

Недостатки Software 2.0


Стек 2.0 также имеет некоторые свои недостатки. После оптимизации у нас остаются большие сети, которые хорошо работают, но очень сложно сказать, как они работают. Во многих областях применения мы будем оставаться с выбором — использовать на 90% точную модель, которую мы понимаем, или на 99% точную модель которую не понимаем.

Стек 2.0 может ошибаться в неинтуитивных и затруднительных ситуациях, или, что еще хуже, они могут «бесшумно ошибаться», например, используя уклоны в своих учебных данных, которые очень трудно правильно анализировать и изучать, когда в большинстве случаев их размеры легко превышают миллионы.

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

Финальные мысли


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

В долгосрочной перспективе будущее Software 2.0 является ярким, потому что многим становится ясно, что при разработке AGI, безусловно, будет использовано Software 2.0.

А Software 3.0? Оно будет полностью соответствовать AGI.


Перевод выполнен при поддержке компании EDISON Software, которая профессионально занимается проектированием ПО (вот примеры ТЗ: раз, два, три), а так же созданием ПО для крупных заказчиков (микротомограф, мобильная связь, освещение города).

Комментарии (0)