Добрый день, коллеги.
Сегодня я хочу трезво взглянуть глазами инженера на столь популярные сейчас искусственный интеллект и 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 лет.
выводы
Мы открыто и честно изложили ключевые факты и риски, связанные с внедрением и использованием глубоких нейронных сетей в высоконагруженных сервисах — с точки зрения инженера.Никаких выводов мы пока не делаем.
Понятно, что работы много, работа эта непростая, но ужасно интересная, и успех приходит только к профессионалам, которые умеют совмещать знания и людей из разных областей и имеют вкус к синергии.
Очевидно, что нужно не только отлично программировать и чувствовать систему на кончиках пальцев, но и либо понимать, либо активно привлекать к подобным проектам специалистов в области математики и создавать позитивные, творческие условия для своих коллег – чтобы появилось больше интересных и эффективных идей.
и способы кратко и быстро придумать их реализацию.
В противном случае.
вам придется месяцами сидеть с отверткой перед развалившимся «Гравицапом», крутя винты наугад, жег спички и с завистью глядя на сияющие в небе решения конкурентов своей мощью и красотой искусственного интеллекта.
.
Желаю всем удачи в инженерии, конвергентных нейронных сетях, уверенности, энергии и как можно меньше тонких ошибок! Ку! ;-)
Теги: #большие данные #Машинное обучение #разработка #Алгоритмы #нейронные сети #Большие данные #Машинное обучение
-
Профессиональное Выгорание: Слово Экспертов
19 Oct, 24 -
Почему Ваш Сайт Могут Заблокировать?
19 Oct, 24