Connect with us

Разработка

Программное обеспечение 2.0

Руководитель отдела искусственного интеллекта в Tesla Андрей Карпатый рассказал, почему нейронные сети — это не просто новый вид программного обеспечения, а совершенно новый этап в развитии вычислительной техники.

Анна Гуляева

Опубликовано

/

     
     

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

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

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

Что читать, смотреть и где учиться машинному обучению

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

ПО 2.0 не заменит ПО 1.0 (большое количество инфраструктуры 1.0 необходимо для обучения и “компиляции” кода 2.0), но оно будет выполнять большую часть задач, за которые сегодня отвечает ПО 1.0. Давайте рассмотрим некоторые примеры этого перехода:

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

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

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

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

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

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

Искусственному интеллекту для игры в Го больше не нужны люди

Вы могли заметить, что множество ссылок включают работы Google. Это потому, что сейчас Google переписывает большую часть своей инфраструктуры на Код 2.0. Подход “Одна модель, чтобы править всеми” показывает, как это может выглядеть, когда статистические мощности отдельных областей объединены в одно непрерывное понимание мира.

Преимущества программного обеспечения 2.0

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

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

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

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

Постоянное использование памяти. В ПО 2.0 отсутствует динамически распределенная память, поэтому утечки памяти, которые вы должны выискивать в своем коде, маловероятны.

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

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

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

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

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

Ограничения ПО 2.0

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

Стек 2.0 может допускать постыдные ошибки, воспринимая предрассудки в данных для обучения, которые очень сложно обнаружить в таких больших объемах.

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

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

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

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

А программное обеспечение 3.0? Он будет уже полностью зависеть от этого сильного искусственного интеллекта.

Комментарии
Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement
Click to comment

You must be logged in to post a comment Login

Leave a Reply

Мероприятия

ВКонтакте открывает регистрацию на чемпионат по программированию VK Cup 2018

ВКонтакте анонсировал ежегодный чемпионат по программированию VK Cup 2018. К участию приглашаются программисты от 14 до 23 лет. В одной команде может быть один или два человека.

AppTractor

Опубликовано

/

Автор:

Призовой фонд VK Cup 2018 составляет 2,5 млн руб.:

  • 1 место – 1 048 576 руб.
  • 2 местo – 524 288 руб.
  • 3 местo – 262 144 руб.
  • 4-8 места – 131 072 руб.

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

В финале VK Cup 2018, который состоится в августе в Санкт-Петербурге, сразятся 20 команд, прошедших все этапы предварительных отборов. ВКонтакте покроет расходы на проезд и проживание финалистов.

Комментарии
Продолжить чтение

Разработка

Почему структура команды разработки может вас замедлять

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

Анна Гуляева

Опубликовано

/

“Почему мы так медленно выпускаем новые функции так медленно?” — думал я спустя год после присоединения к быстро растущему стартапу. Релиз каждой новой функции был болезненно долгим. Это не то, чего я ожидал — стартапы должны двигаться быстро. Особенно, если вы ещё не нашли свою нишу. В начале моей работы у нас было три команды разработки. Спустя год и несколько миллионов инвестиций у нас в распоряжении было девять команд разработки. Наша способность к разработке утроилась, но новые функции выходили с той же скоростью. В чем же дело? Я думаю, что дело было в законе Брукса, который утверждает, что добавление новых разработчиков в проект на поздней стадии, приводит к ещё большему замедлению проекта. Мы наняли многих отличных разработчиков, но им нужно было понять что замедляло остальных сотрудников.

Наш мотивирующий постер для разработчиков

Спустя полгода мы по-прежнему выпускали новые функции медленно. Поэтому, очевидно, закон Брукса был уже не при чем. Должна была существовать ещё одна причина, но какая? Потом мы столкнулись с проблемой в производстве, которая указала мне на возможного виновника.

Проблема и урок

Мы только выпустили новую функцию фильтрации по тегам. Поддержка получала жалобы о том, что функция не работает. Первым делом я попытался загрузить картинку и отметить её как “Не хот-дог”. Потом я попробовал отфильтровать картинки по этому тегу и убедился, что фильтрация не работает. Я составил список команд, которые участвовали в создании функции. Каждая команда была ответственна за свой компонент:

  1. Загрузка и обработка изображений.
  2. Elasticsearch.
  3. Фронтенд фотоальбома.
  4. Команда DevOps, ответственная за инфраструктуру и развертывание новых функций в облаке.

Я решил сначала поговорить с командой по загрузке изображений. Я спросил руководителя команды, почему их функция не работала. Он посмотрел, что теги были сохранены и предположил, что они не были проиндексированы, что привело меня к команде Elasticsearch. Разработчик из следующей команды заглянул в Elasticsearch. Тег был проиндексирован, все выглядело отлично. Поэтому он отправил меня к команде фронтенда альбома. Они обнаружили, что фронтенд-библиотека была развернута в более старой версии. Функция фильтрации зависит от этой библиотеки, поэтому это, вероятно, было причиной проблемы. Фронтенд-команда посоветовала мне поговорить с командой DevOps, чтобы они развернули нужную библиотеку. Я устал ходить от одной команды к другой и сказал им, чтобы они сразу исправили эту проблему. Наконец проблема была решена. Я понял, что командам не хватало ответственности за то, что они создавали. Команды были разбиты по компонентам, и никто из них не чувствовал ответственности за функции – каждый работал только над маленьким кусочком пазла. Разбитие команд по компонентам сделала быстрый выпуск новых функций сложным. Все их усилия были тесно связаны. Если одна из четырех команд не работала или задерживалась, это влияло на выпуск всего функционала.

Почему компании начали разбивать команды по компонентам?

В начале разработки продукта команды часто самостоятельно разбиваются по компонентам. Если сам продукт пока не имеет структуры, то технические компоненты для его работы понятны. Поэтому команды проще организовать по этим компонентам. Эта идея довольно проста — каждая команда ответственна за один или более компонентов. Такая структура помогает увеличить продуктивность разработчиков, которые работают над конкретными частями системы. Создание чего-то нового на Amazon RedShift? Только одна команда должна беспокоиться об изучении RedShift. Недостаток таких команд заключается в том, что менеджеры должны беспокоиться о выпуске функций. Границы между командами создают зависимости, которые требуют активного управления. Это возможно, если у вас не так много компонентов или функции не распределены между множеством команд. Представьте, что вы владелец продукта и хотите внедрить Feature 2,  как на картинке ниже. Она зависит от двух компонентов, за которые отвечают разные команды. Функция выйдет, только если обе команды завершат необходимую работу над своими компонентами. Вернемся к примеру с фильтрацией тегов. Так как даже причину неисправности было сложно установить, представьте, как неэффективно было заставлять все эти команды координироваться ради одной маленькой функции. Любая задержка в любом компоненте вызывала задержку релиза функции. Чем больше компонентов и команд вовлекалось в дело, тем больше возникало проблем с координацией и вынужденного ожидания. Если один спринт одной команды проваливается, функция не может быть выпущена.

Альтернатива: команды по функциям

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

Переход к командам по функциям

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

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

Если это происходит, вам стоит рассмотреть переход на команды по функциям. Такая работа имеет свои сложности: вам нужно будет придумать лучшее распределение компонентов между командами и подстроить свою архитектуру, чтобы разъединить как можно больше компонентов. Переход к командам по функциям — это самая сложная часть работы с подобной структурой. Как структурировать команды? Как передавать знания? Как убедиться, что организация разрешит вам изменить структуру? Этому будет посвящена уже другая статья.    https://apptractor.ru/develop/myi-uvolili-nashego-luchshego-razrabotchika.html https://apptractor.ru/info/articles/vyi-uvolili-luchshego-razrabotchika-nadeyus-vyi-dovolnyi.html  

Комментарии
Продолжить чтение

Новости

Интересные материалы: 21.02

В новой подборке ASCII-арт, карты развития, практики и ловушки.

Леонид Боголюбов

Опубликовано

/

Весь день мы собираем лучшие материалы о разработке и маркетинге технологий, стартапов, мобильных приложений и игр для iOS и Android из самых разных источников:

Комментарии
Продолжить чтение

Программирование

Создание анимации в 7 строк кода

Android-разработчик Леонардо Пирро рассказывает, как создать простую анимацию при помощи ConstraintLayout и ConstraintSet.

Анна Гуляева

Опубликовано

/

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

ConstraintLayout + ConstraintSet

Я хочу поделиться с вами новым способом создания анимаций в приложении при помощи всего семи строк кода, используя Keyframe Animations, ConstraintLayout и ConstraintSet. Эта концепция заключается в создании двух разных макетов: одного для начальной точки и одного для конечной точки анимации. Давайте посмотрим, что мы хотим создать: наша цель — создать плавную анимацию детали, которая будет появляться при нажатии пользователем на экран.

Анимация создается при помощи двух файлов макета: circuit.xml and circuit_detail.xml. Эти макеты очень похожи и различаются только тем, что на первом элементы вынесены за экран, а на втором — находятся в нужной позиции.

Поэтому давайте создадим анимацию и увидим, как просто создавать анимацию при помощи ConstraintLayout и ConstraintSet.

Пусть магия произойдет

Сначала создадим отдельный ConstraintSet, куда мы скопируем ограничения второго макета, вызвав метод clone():

val constraintSet = ConstraintSet()
constraintSet.clone(this, R.layout.circuit_detail)

Теперь создадим объект перехода, используемый для установки интерполятора и продолжительности анимации:

val transition = ChangeBounds()
transition.interpolator = AnticipateOvershootInterpolator(1.0f)
transition.duration = 1200

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

TransitionManager.beginDelayedTransition(constraint, transition)

constraintSet.applyTo(constraint)

Это действительно семь строк кода. Вот и все! Вы можете посмотреть полный пример в моем репозитории GitHub по этой ссылке.

Комментарии
Продолжить чтение

Постеры для разработчиков

Наша рассылка

Каждому подписавшемуся - "1 час на UI аудит": бесплатный ускоренный курс для разработчиков!

Нажимая на кнопку "Подписаться" вы даете согласие на обработку персональных данных.

Вакансии

Популярное

X
X

Спасибо!

Теперь редакторы в курсе.