Искусственный Интеллект, Вызовы И Риски – Глазами Инженера

Добрый день, коллеги.

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

? Потому что когда дело доходит от лабораторных моделей на python/matplotlib/numpy или lua до высоконагруженного производства в клиентском сервисе, когда ошибка в исходных данных сводит на нет все усилия, то становится не просто весело, а даже начинается нумерологический средневековый экстаз и у инженеров начать танцевать целыми днями, в надежде вылечиться от новомодной чумы)

Искусственный интеллект, вызовы и риски – глазами инженера

Танцующие инженеры тщетно надеются на исцеление



Современное развитие

Полезно начать с того, чтобы вспомнить, как в принципе работает современная разработка программного обеспечения.

Как правило, за основу берутся хорошо изученные в «прошлом веке» классические алгоритмы: поиск, сортировка и т. д. и т. п.

Любимая всеми СУБД — хороший пример робастных, тщательно протестированных и изученных классических алгоритмов (может Кодд и Дата прости нас за такую попсу).

К алгоритмам добавляются стандарты, согласованные сообществом инженеров (хотя часто не согласованные никем, продвигаемые злой силой): сетевые технологии (DNS, TCP/IP), форматы файлов, службы операционной системы (POSIX) и т. д. И, конечно, языки.

В последние годы, к сожалению, в этой области началась какая-то печальная ерунда: добавляют и удаляют автоматические геттеры и сеттеры, автоматически вводят и удаляют типы (как будто это действительно так важно), размазывают идеи функционального программирования из «Алисы в Страна чудес»» и Haskel на Scala, пытаются частично скрыть дыры C++ в Rust, создают C для гуманитарных наук в виде Go, в очередной раз придумывают javascript «с нуля» (ECMAScript 6) и всей душой продолжают верить в красоту модели актера и забивать совершенно другие гвозди с помощью Эрланга Все это движение недаром подпитывается идеей будущего многопоточного программирования на многоядерных процессорах и графических процессорах, возможно, в кластерах с использованием.

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

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

И с новой силой звучит заявление Дсгера Дейкстры о том, что серьезное программирование — для умных, как ни крути, и никакие чудо-технологии здесь не помогут. Хотя, возможно, футуристические квантовые компьютеры нам действительно помогут, ну надо же во что-то верить, правда? В общем, чтобы не путаться с языками и код не изобиловать багами, есть известное средство — писать… «правильно».

Но чтобы понять смысл слова «правильно», нужно прочитать массу книг, перелопатить сотни тысяч строк кода в режиме «завтра должно работать в 10:00 и порадовать клиентов» и выпить много чашек крепкий кофе и разбить множество клавиатур о головы коллег.

Но это правило работает. Всегда.



Искусственный интеллект, вызовы и риски – глазами инженера

Мир глазами инженера Что касается библиотек, то никто, конечно, сейчас все с нуля не пишет. Это глупо и дорого.

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

это, и это работает для них».

Так, конечно, все делают и используют Linux (операционная система, но по сути та же самая «библиотека» для доступа к железу), nginx, apache, mysql, php, стандартные библиотеки коллекций (java, c++ STL).

Библиотеки, к сожалению, сильно отличаются друг от друга как по скорости, так и по степени документирования и количеству «неисправленных ошибок» — поэтому успеха достигают команды, обладающие определенным чутьем и отличающие надежные «крысиные шкуры» от хорошо- продвигаемые, но малополезные, непрозрачные и/или неадекватные решения для несколько нестандартных рабочих нагрузок.

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

Примеров успеха не так уж и много, но они есть ;-)

Искусственный интеллект, вызовы и риски – глазами инженера

Примеров успеха не так много, но они есть.



Машинное обучение

Эта область в основном занимается алгоритмами обучения.

Когда компания, скажем, накопила «большие данные» и хочет их монетизировать и создать полезный алгоритм, который поможет клиентам и/или повысит производительность.

С аналитической точки зрения эту проблему может быть чрезвычайно сложно или невозможно решить в лоб; нужны годы экспертного анализа с учетом многих факторов, вызов Ктулху — и кажется, что можно поступить проще и «нагло»: протащить «рылом» по данным глубокую нейросеть и тыкать в них до тех пор, пока ошибка падает ниже определенного уровня (помните, что обычно проверяются два типа ошибок — ошибка обучения и ошибка обобщения на тестовом наборе данных).

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

А если примеров меньше, то нейрон тоже может принести свою пользу, помогая, но не заменяя человека.



Искусственный интеллект, вызовы и риски – глазами инженера

Полезный нейрон внутри R2D2 Звучит красиво и практично — вот данные, «большие данные»: фас, нейрон, учитесь и помогайте человечеству.

Но, как известно, дьявол кроется в деталях.



Порог для входа в разработку и машинное обучение/глубокое обучение

Ни для кого не секрет, что технологии разработки делятся на категории по уровню освоения.

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

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



Искусственный интеллект, вызовы и риски – глазами инженера

Молодые фронтенд-разработчики JavaScript. Но чтобы стать мегагуру, придется долго учиться; лета явно недостаточно.

К «средней» категории по уровню владения относятся такие динамические языки программирования, как: PHP, Python, Ruby, Lua. Здесь все гораздо сложнее — более развитые концепции ООП, частично реализованные возможности функционального программирования, иногда доступна примитивная многопоточность, более выражена модульность и инструменты для создания больших программ, доступны системные функции, частично реализованы стандартные типы данных и алгоритмы.

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



Искусственный интеллект, вызовы и риски – глазами инженера

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

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

К «высшей» категории по начальному уровню обычно относятся хорошо зарекомендовавшие себя промышленные языки, такие как C++, Java, C#, а также Scala, bash и VisualBasic, которые уже вроде бы начали наступать им на пятки (последние два — это шутить).

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

.

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

здесь зачастую важны тонкости операционной системы и сетевых протоколов.



Искусственный интеллект, вызовы и риски – глазами инженера

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

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

Но с машинным обучением все немного… по-другому.

Аналитиками часто просто рождаются.

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

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

и не каждый сможет справиться и перейти на следующий курс.

.

Многие уйдут из гонки и перейдут в другие ведомства.

Быть учёным дано не каждому, как бы вам этого ни хотелось.



Искусственный интеллект, вызовы и риски – глазами инженера

Стажировка аналитика А может, пройдет? Все сначала в это верят: на выходных разберусь! Но, к сожалению, чтобы понять, как работает самая элементарная «логистическая регрессия» в машинном обучении, своего рода «привет, мир» в программировании, нужно хорошо разбираться хотя бы в паре разделов высшей математики: теория вероятностей и линейная алгебра.

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



Необработанные полулабораторные каркасы

Повышенная влажность добавляет драйва.

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



Искусственный интеллект, вызовы и риски – глазами инженера

Популярные фреймворки для машинного обучения.

Они не исчезли, просто еще очень сырые.

Понятно почему.

Парад «универсальных» фреймворков начался лишь в прошлом, 2015 году.

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

Совсем недавно графические процессоры внезапно оказались в нужном месте и в нужное время.

К сожалению, TensorFlow по-прежнему очень медленный и странный в продакшене, Torch7 страдает от отсутствия нормальной документации и языка Lua, deeplearning4j пытается угодить графическому процессору, а кандидаты вроде Theano для Python не понимают, как эффективно эксплуатировать в продакшене без тяжелых наркотиков.

.

Да, ходят легенды, что обучение нейросети - это одно, а ее работа - совсем другое и этим должны заниматься совсем другие люди и технологии - но реальность требует денег, а это, согласитесь, ужасно неудобно, дорого и не очень.

разумный.

Кажется, что наиболее универсальным и нацеленным на решение конкретных бизнес-задач в сжатые сроки на «нормальном» индустриальном языке является только глубокое обучение4j — но оно также находится в фазе активного роста и взросления со всеми вытекающими.



Как выбрать архитектуру нейронной сети для решения бизнес-задачи?

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

Поэтому общий рецепт — выбрать наиболее подходящую архитектуру для решаемой задачи в виде примера в коде, реализовать ее 1 в 1 в удобном фреймворке, заказать молебен и, возможно, вам повезет. ! Что значит «может быть, тебе повезет»? И все очень просто.

Вы столкнетесь со следующим спектром инженерных рисков:

Искусственный интеллект, вызовы и риски – глазами инженера

Аналитик, ведущий разработчик и руководитель проекта готовятся к молитве «О сближении нейрона».

Говорят, что скоро докажут теорему о влиянии молитв на поведение градиентного спуска в условиях многочисленных плато, седловин и локальных минимумов.

1) Нейронная архитектура хорошо работает с данными исследователя, но с вашими данными она может работать совершенно «по-другому» или работать совсем наоборот. 2) Ваш фреймворк может не иметь полного набора элементарных кубов: автоматического дифференцирования, алгоритма обновления с тонкой настройкой (updater), расширенных инструментов регуляризации (dropout и другие), необходимой функции ошибки (потери), конкретной операции над данными ( векторное произведение) и т. д. Их можно заменить аналогами, но это приведет к рискам.

3) Иногда, хоть и редко, хочется попробовать продукцию Matlab или R ;-) Совет один - идите сразу к врачу.

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

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

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

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



Искусственный интеллект, вызовы и риски – глазами инженера

Что делать, что крутить? Разработчик C++ пытается понять разницу софтмакс от мягкий знак

Привет, тензоры!

Для инженера тензор — это просто многомерный массив, позволяющий выполнять над собой различные операции и жертвовать.

Но к работе с тензорами нужно привыкнуть ;-) В первые недели даже 3D-тензоры вызывают головную боль, не говоря уже о гораздо более «глубоких» тензорах для рекуррентных и сверточных сетей.

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

Обязательно учтите этот риск — тензоры только кажутся простыми.



Искусственный интеллект, вызовы и риски – глазами инженера

Будь осторожен! Попытки представить структуру 4-х и более размерных тензоров приводят к агрессивному косоглазию.



Особенности работы с GPU

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

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

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

Поэтому мы учитываем и этот важный инженерный риск, влияющий на трудоемкость.

Сроки можно смело умножать на 3.

Искусственный интеллект, вызовы и риски – глазами инженера

Видеокарта.

Оказывается, на нем можно не только играть!

Нейронная сеть в производстве

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

Но.

данные меняются, и модель необходимо изменить/переобучить.

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

Поверьте, мороки здесь гораздо больше, чем с классической СУБД, которую нужно только оптимизировать раз в 5 лет и удалять паутину с материнской платы раз в 10 лет :-) Также ходят легенды о том, что нейросеть можно просто.

переобучить и не нужно будет переобучать ее заново на всем объеме данных.

На самом деле это невозможно, но это действительно всем очень нужно и иногда.

везет. Если данных достаточно мало и нужно постараться запомнить как можно больше их (не уменьшая погрешность на тестовом наборе данных, конечно), то просто «переобучить» без «переобучения» не получится.

без риска забыть что-то важное.

Нет никакой гарантии, что стохастический градиентный спуск (SGD), запомнив новое, не забудет важное старое ;-) А если данных много (миллионы фотографий, например) и нет необходимости запоминать это на конкретном примере, получится (но молебен не помешает).



Разработчик, тестировщик и самоубийство

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

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

— головная боль гарантирована надолго и серьезно, а шлем только для красоты.

3) Вам повезло и вы нашли ошибку в нейросети.

за неделю до релиза.

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



Искусственный интеллект, вызовы и риски – глазами инженера

Настойка паранойи, старение – 5 лет.

выводы

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

Никаких выводов мы пока не делаем.

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

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

и способы кратко и быстро придумать их реализацию.

В противном случае.

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

.

Желаю всем удачи в инженерии, конвергентных нейронных сетях, уверенности, энергии и как можно меньше тонких ошибок! Ку! ;-)

Искусственный интеллект, вызовы и риски – глазами инженера

Теги: #большие данные #Машинное обучение #разработка #Алгоритмы #нейронные сети #Большие данные #Машинное обучение

Вместе с данным постом часто просматривают: