Суровый программизм

Вот читаю я, допустим, статейку про проект uTensor – совместимую с TensorFlow реализацию нейросетей для ARM Cortex M3 или M4.

https://towardsdatascience.com/why-machine-learning-on-the-edge-92fac32105e6

Штука прикольная – пусть и на “топовых”, но все-таки на недорогих и довольно доступных микроконтроллерах позволяет, например, распознавать рукописный ввод:

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

Ну, для начала – математика. Для понимания хотя бы MIT’овского учебника по Deep Learning желательно иметь представление о линейной алгебре, теории вероятностей, возможно, о каких-то началах функционального анализа. Да, некоторые отрывочные сведения из этих дисциплин приведены в первой части этого учебника (так часто делают в американских учебниках – так как нет гарантий, что слушатели курса по машинному обучению перед этим действительно прослушали несколько курсов по математике) – но их явно недостаточно. Если ориентироваться на программу мехмата, например – это 2-3 курс, если безжалостно ужимать – то все равно необходимо 3-4 семестра одной только математики.

Программирование тут не менее суровое. Даже если предположить, что с Python (в объеме, необходимом для TensorFlow) человек, умеющий немного программировать на C, сможет разобраться самостоятельно – все равно здесь, как и в любом проекте с использованием микроконтроллеров, требуется отличное знание C и даже немного – C++ (даже если говорить о нем, как о C with classes – все же нужно понимать “цену” тех или иных возможностей C++). Не знаю, стоит ли в обязательные общие требования к программисту включать знания классических алгоритмов – но в целом в критичных к производительности задачах это оказывается само собой разумеющимся требованием. Тут у нас нет многоядерного процессора и гигабайтов оперативки. В “профессиональном обучении” программиста это где-то год.

Дальше – микроконтроллерная специфика. Да, “входной порог” в программирование для микроконтроллеров сейчас (благодаря все той же ARM mbed) сводится “до уровня базовых знаний C/C++ и электроники в масштабе «подключить светодиод в нужной полярности»” (c) – но для понимания штук типа CMSIS-NN желательно уже иметь представление об архитектуре ARM, всякого рода оптимизациях, DSP-инструкциях (зря что ли мы берем Cortex-M4?) и прочей такой вот низкоуровневой ерунде – возможно, вплоть до программирования на ассемблере. Электроника, нужная для такого проекта, разумеется, тоже довольно далеко ушла от “подключить светодиод в нужной полярности”.

В общем, если представить учебники по каждой из дисциплин – тут “вырисовывается” книжная полка с десятком книжек страниц по 300 каждая (это минимум – некоторые особенно “хорошие” учебники по некоторым разделам computer science приближаются к полутора тысячам страниц). Можно, конечно, возразить с аргументами в духе разделения труда – мол, не обязательно специалисту по deep learning знать нюансы архитектуры ARM, да и математика ему не особо нужна, и вместо одного “универсала” тут можно взять трех-четырех выпускников трехмесячных курсов. Но с другой стороны – над ними все равно должен быть какой-то руководитель – который должен иметь представление не только о технических аспектах, но еще и направлять процесс разработки.

И заметьте – все это только для того, чтобы можно было пальчиком провести по тачскрину, а на дисплее отобразилась бы введенная цифра. Но, конечно, всегда есть и более простой путь – “еще три года назад Антон был простым раздолбаем, а сегодня он Senior Developer в Luxoft” (c). Сеньер-формошлепом, наверное, быть неплохо :)

Ответить

Или воспользуйтесь входом по OpenID: