Многие дотнетчики знают Дмитрия shwars Сошникова (Microsoft) по его докладам, связанным с машинным обучением. А сейчас миры ML и .NET сближаются благодаря технологии ML.NET, так что очень пригодился бы новый доклад — и на DotNext он как раз будет (даже два, от Дмитрия и от Джеффа Просайза).
Но деятельность Дмитрия не ограничивается докладами — например, ещё он популяризует технологии разработки среди новичков, включая собственную дочь. И это не менее интересная тема: наверняка среди аудитории Хабра есть родители, которые думают, как правильнее приобщать детей к IT.
Поэтому в ожидании DotNext мы взяли интервью, где начали с биографии Дмитрия, потом подробно поговорили о детском IT-образовании — а в конце затронули машинное обучение и новые доклады о нём.
Биография
— Вас знают как технологического евангелиста Microsoft, но хочется узнать биографию подробнее: что было до Microsoft, как попали в компанию, чем именно занимаетесь там теперь?
— Я занимался разработкой, наверное, ещё лет 30 назад. Пример для своей диссертации разрабатывал на Java, но, когда у Microsoft появилась платформа .NET, мне она полюбилась. И я руководил разработкой на .NET некоего аналога SharePoint для американской компании, а параллельно преподавал в институте — люблю делиться своим опытом.
В какой-то момент в МАИ стали сотрудничать с Microsoft по разным студенческим программам. Студенты начали участвовать в международных конкурсах, однажды заняли второе место в мире. И тогда из Microsoft мне сказали: «Вот ты здесь со студентами работаешь, а не хочешь ли работать со студентами у нас?». И я подумал, что это хорошее предложение, потому что смогу сочетать в одном месте то, что мне нравится делать: и популяризацию технологий, и сами технологии.
Но преподавать при этом не бросил. Разработкой заниматься, конечно, стал меньше, но позиция евангелиста в Microsoft всё-таки в первую очередь техническая, она подразумевает постоянное знакомство с технологиями и определённый объем программирования.
Я с удовольствием занимался этим где-то лет десять — сначала работал в основном со студенческой аудиторией, потом с разработчиками и стартапами, несколько раз объехал всю Россию с хакатонами, делали их по крупным вузам. В общем, было интересно.
А в последние два года я занимался в Microsoft машинным обучением и искусственным интеллектом, разработкой пилотных проектов для больших международных компаний. Задача Microsoft немного трансформируется: раньше мы стремились, чтобы люди с помощью технологий повышали свою продуктивность, а сейчас, помимо людей, помогаем компаниям думать, как им внедрять современные технологии.
Не всегда компания понимает, как ей взять и внедрить искусственный интеллект: какие данные собрать, как это сделать. Вот такие вещи мы помогали делать в режиме пилотных проектов.
Это была очень интересная работа, потому что, с одной стороны мы делали какие-то полуисследовательские вещи, читали научные статьи, смотрели, можем ли мы сделать лучше, чем там написано, и много коллег с разным бэкграундом, из Великобритании, Норвегии, некоторые практически из академической среды.
Сейчас я чуть-чуть возвращаюсь к евангелизму, теперь это называется cloud developer advocate.
— Перед тем, как расспрашивать про обучение других, хочется узнать: а как вы изначально попали в IT и кто учил вас?
— Удивительно, но меня изначально практически никто не учил. Вышло так, что когда я был ещё совсем маленький, я пытался конструировать радиоприёмники, мне очень хотелось собрать свой. Но это было ещё до 6-го класса, физики я не знал и «почему-то» не очень получалось, я брал какие-то устаревшие инструкции.
А однажды папа сказал: «Смотри, будущее за цифровой электроникой, а не аналоговой», и дал «Искусство схемотехники» Хоровица и Хилла. Это учебник для студентов. Я пытался в ней разобраться, в итоге понравилось читать на эту тему, стали покупать книжки по программированию, но компьютеров тогда ещё не было.
И в какой-то момент удалось на время взять у знакомых компьютер, и я на нём начал… Тогда это была программа по обучению Basic, я помню, сам в этом пытался ещё в школе разбираться. Учителей не было тогда, это было ещё до 90-х годов, 1985-й. Я учился программировать сам: BASIC, PASCAL, Assembler, C. Потом пришлось самому себе собрать компьютер — конечно, папа помог с комплектующими и с первоначальной сборкой и настройкой.
В первый раз запустить всё это было, конечно, непросто. Но я горжусь тем, что я был где-то в 7-8 классе, когда в компьютер неправильно воткнули микросхему, оттуда пошел дым, и мне пришлось этот компьютер чинить, а там были в 5-6 местах обгоревшие провода на плате. Найти это было непросто, мы пошагово, потактово запускали, смотрели как процессор считывает команды из памяти. Это было очень полезно, тогда человек ещё мог понять, как устроен компьютер, сейчас это уже вряд ли возможно. Было хорошее время, прямо ностальгия.
Приобщение детей к IT
— Известно, что вы популяризуете технологии даже среди школьников — а как это выглядит на практике? Например, в числе прочего вы «ведущий кафедры компьютерных технологий детского лагеря “ЮНИО-Р”», что это такое?
— На практике всё просто. У меня растёт дочь, которой сейчас 15 лет, и мне очень хочется приобщить её к миру компьютеров, потому что я искренне верю, что в будущем очень многие профессии окажутся на стыке с ним. И чем бы человек ни хотел заниматься, ему будет намного проще, если он владеет компьютерными технологиями.
Дмитрий с дочерью Викой
Дочь ходит в художественную школу, ей нравится рисовать, и я пытаюсь найти что-то хорошее где-то на стыке — вроде компьютерного генеративного искусства. Я вместе с ней расту и вовлекаюсь в разные интересные активности. Из последнего, что мы сделали в Microsoft — было открытое мероприятие, посвященное дню женщин в IT, куда приглашали всех желающих. И записали онлайн-уроки по машинному обучению и ИИ для детей от 7-8 лет, чтобы они понимали, в каком мире мы начинаем жить.
Причем эти уроки были вполне себе практическими. Есть инструмент Azure Machine Learning Studio, позволяющий без навыков программирования обучать модели машинного обучения. И в качестве примеров в этом курсе мы брали фотографии из популярного Instagram-аккаунта, и с помощью когнитивных сервисов вытаскивали признаки: например, какой цвет превалирует, сколько людей, насколько они счастливы, какой у них средний возраст, ключевые слова, на улице или в помещении сделана фотография.
И пытались найти зависимость количества лайков от этих признаков. Обучив простую регрессионную модель, сразу можно увидеть, какой фактор влияет на количество лайков.
Как мне кажется, даже если дети не могут сами повторить такой эксперимент, он помогает им понять, как устроен современный мир. Что для того, чтобы сделать что-то оптимально, нужно сначала собрать данные, потом померить, а потом построить модель и научиться предсказывать.
Ну и сами результаты тоже интересные. Я полностью их не вспомню, но, например, фотографии на улице оказывались с большим количеством лайков, чем в помещении. Такого рода выводы делать интересно. Ну и сам инструмент очень простой.
Параллельно с этим есть «ЮНИО-Р» — это детский лагерь, который организует мой друг Юрий Горвиц практически для детей знакомых. Информация передаётся из уст в уста, и туда ездит устоявшая компания детей, каждый год приезжает кто-то новый. Идея лагеря — собираются взрослые люди, которым интересно чем-то хорошим поделиться с детьми. Дети первую часть дня находятся на море, а вторую половину — работают над проектами под руководством взрослых.
Там разные проекты: снимают кино, издают журналы, собирают роботов. Мы делали разные интересные арт-объекты с электроникой, с Arduino. На основе «черепашьей графики» я делал небольшой курс для детей по C#, когда они рисовали картины. Делали что-то интересное на основе программирования в Minecraft.
И, кстати, очень хороший ролик, правда, в другом лагере, в Dilijan в Армении мы делали проект, когда я учил детей основам программирования в Minecraft, и мы запрограммировали строительство гигантского города. Понятно, что запрограммировать дом несложно, и мы построили город из небоскребов, длинный и красивый.
Мне очень интересно, как увлечь детей такого рода вещами и что за это отвечает. Многих детей это очень привлекает и увлекает, я ищу какие-то хитрые интересности.
— По-вашему, как именно и с какого возраста стоит начинать приобщение к IT?
— Мне кажется, хорошо руководствоваться принципом из книги «После трёх уже поздно», но не тем принципом, который вынесен в её название, а другим. Там есть важная мысль: не нужно заставлять детей и настаивать на чём-то, нужно, чтобы они находились в правильном месте. Если вы собираете компьютер, пусть они будут рядом, и на эту тему можно поговорить. Если вы делаете что-то интересное, то обязательно скажите детям об этом и попытайтесь их вовлечь. Но не заставляйте делать что-то насильно. У меня самого не всегда так получается, но это важно.
Насчёт возраста есть некоторые исследования, которые показывают, что дети до 10 лет плохо усваивают искусственные текстовые языки. То есть до 10-12 лет не нужно им учить C# или тот же Python. Для этого возраста есть графические языки типа Scratch, который хорошо ложится лет с семи.
У Microsoft есть прекрасный продукт Microsoft Code — это тоже блочный язык, в котором можно одновременно программировать из блоков, и можно переключаться на JavaScript-подобный язык. В какой-то момент, когда человеку станет тесно в блочном программировании, он сможет легко переключиться и понять, как те же самые блоки выглядят на текстовом языке.
На Microsoft Code можно программировать Minecraft Education, но он пока что в России не сильно распространился. И на нём же Code можно программировать маленькое устройство-плату Microbit.
В свое время в Англии был проект по раздаче таких плат школьникам для обучения программированию. На плате 25 светодиодов (5х5), датчик температуры, ускорения — всё в одном флаконе. Её очень просто программировать, она подключается как флешка, на неё закачивается файл с программой.
И можно из «микробитов» делать потрясающие вещи. На них есть bluetooth-радио, так что они могут между собой коммуницировать. Есть совершенно потрясающие проекты. Из того, что мне запомнилось — это проект, в котором симулируется процесс заражения. Например, мы пишем программу, которая с какой-то вероятностью заражается от близлежащей такой платы. Интересно, как это заражение распространяется в группе детей: у каждого по плате, и мы смотрим, кто заболеет, а кто нет. Получается наполовину урок биологии, наполовину информатики.
Современное образование во многом пытается перенимать такие междисциплинарные вещи. У зарубежных учителей это больше развито, я читаю об этом в Twitter. Например, Minecraft для образования. Но своего ребёнка можно всё равно пытаться учить чему-то и смотреть в сторону междисциплинарных проектов.
— Про упомянутый Scratch иногда можно услышать «ну это так отличается от «настоящих» языков, что ни к каким реалиям детей толком не подготовит». А что говорит ваша практика, успешно ли дети переходят от блочных языков к текстовым?
— Здесь у меня практики меньше, но мне кажется, что переход не должен быть очень болезненным. Основные концепции одинаковые: цикл, переменные и так далее. По-моему, усвоив концепции, изложить их другим языком не должно быть катастрофически сложно.
С другой стороны, к этому нужно подходить без фанатизма. Не нужно думать, что если сначала вы не научили ребёнка Scratch, а в 10 или 12 лет он не начал учить Python, то он где-то опоздает. Может быть, стоит не спешить и обходиться без Scratch.
Также не стоит учить ребёнка в 7 лет индустриальным языкам. Он же привык играть в игрушки, а тут нужно писать всякие «void main».
— Про «всякие void main» Кай Хорстманн рассказывал нам, что для удобства обучения новичков пытался избавить «hello world» в Java от такого, но его предложение не приняли. Есть ли у вас ощущение, что языки вроде C# недружелюбны по отношению к начинающим, и зря их не сделали дружелюбнее?
— Мне кажется, их можно делать дружелюбнее при обучении. Например, по опыту моего видеокурса «Увлекательное программирование на C#»: от «void main» нельзя избавиться полностью, но можно сказать «это всё игнорируй, смотри только в то место, куда ты что-то вписываешь».
И тогда получается, что сам по себе синтаксис языка не такой уж катастрофически тяжёлый. Конечно, в подобных языках сложноват оператор for: вместо того, чтобы сказать «повторить 10 раз», приходится писать это сложнее. Но в целом опыт обучения C# не сложнее Python. В Python тоже попробуй объясни ребёнку, зачем писать for i in range(10).
С другой стороны, есть позитивный опыт упрощения языков. который делается создателями среды программирования для Arduino и среды программирования Processing. Arduino сделан на основе C++, Processing — кажется, на основе JavaScript или Java, но поддерживает Python. Processing сделан для дизайнеров, Arduino сделан для электронщиков, которым не хочется разбираться в программировании. Поэтому там всё сделано так, чтобы нужно было поменьше писать всего вокруг, в основном только сам код.
Эти среды успешно развиваются и очень популярны. Поэтому да, можно как-то в существующие языки встроить упрощение так, чтобы они использовались в обучении. В Python нужно встраивать минимум упрощений, потому что он и так достаточно простой. Плюс для него есть разные инструменты, включая Jupiter Notebooks, и, кстати совершенно замечательные Azure Notebooks, доступные из облака совершенно бесплатно, с поддержкой режима презентаций, библиотек и т.д. Всё это очень удобно использовать для обучения.
— Возвращаясь к словам «тогда человек ещё мог понять, как устроен компьютер». Когда-то проще было понимать и сайты: школьник мог открыть любимый сайт, заглянуть в его HTML-код и начать сам что-то делать. А в 2019-м порог входа куда выше, школьник ещё на стадии настройки окружения всё проклянёт. Не является ли это проблемой, мешающей вовлечению новых поколений?
— Мне кажется, основная проблема в том, что повысились наши ожидания к тому, что мы называем сайтом. Если взять классический сайт в академическом дизайне 1991 года, сейчас люди посмотрят на него и ужаснутся.
Усложняется сама предметная область. Чтобы делать сайты такого уровня, как Facebook, нужно к этому привыкнуть. При этом библиотеки, фреймворки, языки берут на себя часть борьбы со сложностью. Есть среды программирования, которые относительно просты и эту сложность как-то на себя берут.
И не нужно думать, что веб-программирование сильно сложнее, чем любое другое. В Arduino есть свои сложности, там нужно уметь подключать электронику. Не так подключишь — всё сгорит.
Основной сложностью в веб-программировании считается то, что есть фронтенд и бэкенд, и нужно понимать и разбираться, как оно работает. Но вполне можно начать с простого. В конце концов, сделать себе домашнюю страничку — вполне себе приятное и полезное занятие. Начать с этого, и если человеку интересно, он будет развиваться и углубляться в этом направлении.
К сожалению, общая проблема в том, что теперь человеку сложно быть универсалом. Если раньше любой программист мог и на бэкенде, и на фронтенде, а при необходимости даже на ассемблере, то сейчас люди, занимающиеся электроникой и умеющие на ассемблере, вряд ли будут программировать в стиле реактивного функционального программирования. Просто потому, что всё объять сложно.
— Вы упоминали, что видите много зарубежных «межпредметных» примеров, и в России такого меньше. А как в целом соотносятся ситуации с IT-образованием школьников в России и за рубежом?
— Ну, я просто подписан на сообщества вроде Minecraft in Education, поэтому и вижу много зарубежных межпредметных примеров — например, когда учитель истории говорит «Я даю задание построить в Minecraft историческое поле битвы». Мне кажется, у нас мало такого, чтобы в школе было столько свободы. Обычно учитель преподаёт свой предмет и не очень глядит в сторону.
В плане IT-образования у нас возможностей много. Есть очень сильные детские лагеря для тех, кто хочет заниматься IT, есть GoTo, зимняя школа при физтехе. Желающий найдёт себе место. Для совсем детей тоже есть — «Лига Роботов», «Кодабра», целая куча таких частных компаний, которую эту нишу неплохо закрывают.
И в школе тоже не так плохо: например, международная инициатива «Час кода» (когда в школах призывают потратить один час и показать, как устроено программирование) года три назад была поддержана Минобразования, Минсвязи. И были очень впечатляющие цифры по количеству школьников, которые прошли «Час кода» и попробовали что-то сделать своими руками. Это в России исчисляется миллионами школьников.
Человек, который никогда не слышал о программировании, думаю, как-то был охвачен и что-то услышал. Поэтому мне кажется, что всё неплохо. Но, конечно, статистика всё равно показывает, что в IT есть нехватка людей: их нужно очень много, а многие думают, что это непросто и зачем усложнять жизнь.
ИИ
— Переходя от темы детей к теме ИИ/машинного обучения, спросим про обе. Вот вам когда-то папа сказал «Будущее за цифровой электроникой» и оказался прав. И если сейчас мы приобщаем детей к IT, нам тоже надо думать, за чем будущее — ведь к моменту, когда они придут в индустрию, оно уже настанет.
Но будущее нам самим неочевидно. Вот ИИ развивается, но где он будет через 10 лет? Некоторые считают, что вообще код за нас писать начнёт. В такой непонятной ситуации о чём и как нам следует говорить?
— Мне кажется, что про искусственный интеллект однозначно нужно говорить. Проблема ИИ не в том, что компьютер сразу начнет писать код за нас, а в том, что многие задачи сейчас решаются не написанием кода, а сбором данных и обучением ML. И тут уже никуда не деться: есть задачи, для которых человек хорошо пишет код, и для них разумно писать код. А есть задачи, для которых человек не может написать код, и тогда приходится использовать ML.
И за счёт того, что ML позволяет решать всё более сложные задачи, оно занимает все больше и больше места в арсенале компьютерных специалистов. Но и на смену классическим программистам, которые занимались алгоритмами, приходят дата-сайентисты, у них тоже алгоритмы, но чуть-чуть другой взгляд на жизнь. Это нормально, они тоже, в целом, компьютерные специалисты.
Поэтому я не думаю, что здесь ИИ лишит кого-то работы. Искусственный интеллект в обозримом будущем остаётся неким инструментом для нас, очень хорошим инструментом: он позволяет нам не делать скучные вещи.
Существовало большое количество программистов, которые размещали кнопочки на формах и таким образом зарабатывали на жизнь. Это, может быть, для них было хорошо, но человек не должен этим заниматься, он должен ставить себе более интересные задачи. Искусственный интеллект как раз какие-то сложные задачи возьмет на себя. Был какой-то проект, который по эскизу по бумаге строит дизайн формочек самостоятельно — вот так, наверное, и должно быть. Но при этом у человека будет больше интересных задач, и это хорошо.
Говорить про ИИ нужно. Но в целом, какую бы область мы ни взяли, сейчас очень быстро происходят изменения. И происходят они из-за цифровизации, из-за того, что как только мы что-то оцифровали, компьютер очень быстро может с этим что-то делать.
Поэтому очень важно научиться учиться. Раньше цикл изменения был сотни лет, и можно было, выучившись в детстве, больше никогда не учиться, а просто работать. А сейчас, скорее всего, мир будет меняться, и нужно будет по ходу дела что-то осваивать. Мы, программисты, всё время в таком мире живем, у нас с самого рождения всё время новые технологии, иногда они выходят с очень большой скоростью. Особенно в JS-мире — в .NET как-то проще с этим, наверное, поэтому с ним более спокойные люди работают.
Нужно обладать какими-то метапредметными навыками, чтобы был какой-то здравый смысл. А дальше с любопытством смотреть, что происходит и куда жизнь вынесет.
— Вы состоите в Российской ассоциации искусственного интеллекта — а что это вообще такое?
— Вообще Российская ассоциация искусственного интеллекта — это организация ученых, которые занимаются исследованиями в области ИИ. Она имеет давнюю историю, и моё занятие ИИ тоже имеет давнюю историю. Я ещё лет 15-20 назад защищал диссертацию на тему, связанную с распределённым искусственным интеллектом.
Тогда это был не такой ИИ, как сейчас модно, а основанный на явном представлении знаний, когда мы у человека из головы вынимали модель. И что, собственно, я предлагал — делать эти модели распределёнными, чтобы были распределённые логический вывод и представление знаний. Это было в некотором смысле появление идеи Semantic Web ещё до Semantic Web, но чуть-чуть в другом виде.
С тех пор я состою в ассоциации, раз в два года проводятся конференции на тему ИИ — это некоторая «научная тусовка». Есть ещё одна — ассоциация нейроинформатики, которая больше занимается нейросетевыми вопросами. Многие люди находятся в обеих сразу.
Ассоциация, может, не так плотно связана с индустрией, как хотелось бы, потому что индустрия смотрит в сторону западных компаний, готовых решений, нейросетей и так далее. Но это не отменяет и каких-то фундаментальных решений.
— Про ML.NET впервые заговорили в прошлом году, но тогда это явно подходило только совсем early adopters. А теперь, когда прошёл год с лишним, насколько технологии повзрослела? Какому кругу она подходит сейчас?
— Здесь, мне кажется, нету однозначного ответа, потому что нельзя ждать, пока что-то будет совсем готово. Машинное обучение внедряется быстро и эффективно, и без него можно проспать и опоздать с бизнесом, поэтому тащить нужно. Вопрос в том, что лучше тащить в продакшен: ML.NET или Python, который прикручен с помощью какого-то веб-сервиса. Это вопрос философский, можно и так, и так, но и так, и так не очень здорово. Поэтому, конечно, с точки зрения мейнстрима машинное обучение Python намного больше существует, как сообщество, так и инструменты. А ML.NET — это набор инструментов для другой тусовки, и о нём как раз хорошо рассказывать на DotNext.
У компании, естественно, внутри были какие-то процессы, и во многом инструменты в основе ML.NET — это внутренние инструменты, которые постепенно выносят наружу. Поэтому эта технология на самом деле опробована «в деле» самым жёстким образом, а не просто написанная с нуля в угоду моде.
Эта технология уже показала себя в жизни, но она меняется очень быстро. ML.NET год назад был версии 0.6, и в нем было не очень много алгоритмов, а сейчас добавилось очень многое и бурно развивается. Если именно стремиться не опоздать, а идти в ногу со временем, то ML.NET смотреть, конечно, нужно.
Будет ли это хорошим способом начать изучать машинное обучение — вопрос сложный. .NET более многословный, чем Python, просто в силу языка.
— И напоследок — о докладах, связанных с ML.NET. На DotNext их будет сразу два, ваш и Джеффа Просайза — как они соотносятся?
— Первое важное отличие: мой доклад на русском, а у него на английском. Так что те, кто недопонял на английском, могут потом прийти ко мне и послушать! Но главная разница, наверное, в том, что Джефф будет рассказывать про ML в .NET вообще с самого начала: что это такое, как им пользоваться. А я постараюсь сконцентрироваться на самых продвинутых вещах — нейросетях и глубоком обучении.
Всем интересно, можно ли обучать нейросети на .NET. Я об этом рассказывал на своих прошлых докладах, и ответ был такой — да, можно, но это мучительно. Ответ по-прежнему такой. ML.NET на текущий момент не предоставляет возможности взять, и с нуля начать экспериментировать с произвольными архитектурами нейросетей, увы, но у него немного другой фокус.
Тем не менее, ML.NET позволяет применять модели, которые были обучены раньше. А в практическом машинном обучении — если говорить, например, про работу с изображениями или текстами — очень много задач связано с тем, что мы берём готовую модель и немного дотачиваем её под свои нужды.
Условно, если нужно научиться распознавать на фотографии разные виды домашних инструментов, мы не будем обучать модель с нуля, а, скорее всего, возьмём модель, которая обучена на изображениях вообще, и её немного допилим. Это называется transfer learning, и такие задачи как раз на ML.NET относительно неплохо решаются. Поэтому я покажу ряд примеров, как можно легко взять и обучить такую модель на распознавание объектов — это называется Custom Vision, есть специальное средство от Microsoft, которое позволяет эффективно делать такие решения.
Ну и поговорим, что такое вообще нейросети для распознавания изображений, текстов, как и с чем их едят, и что можно сделать в ML.NET.
DotNext с упомянутыми докладами про ML.NET (и многими докладами на другие темы) пройдёт 6-7 ноября в Москве. На сайте уже есть полная программа. Например, помимо доклада, Дмитрий на конференции ещё и проведёт тренинг «F# Coding Dojo on Machine Learning» — где можно будет познакомиться сразу и с F#, и с ML.NET.
Автор: Евгений Трифонов