Программирование, машинное обучение, и жизнь
Этой осенью я обычно просыпаюсь в 5-6 часов утра, чтобы учиться в ai-class.com и ml-class.org. Позади 6 из 10-ти учебных недель. Уже десяток раз я восклицал “Ну почему же я не начал так учиться год назад?!”. Эти курсы изменили меня - открыли новые интересные предметные области и помогли вспомнить как сильно я люблю математику. Я изменил отношение к университетскому образованию и расширил набор принципов эффективного самообразования, которые собираю на протяжении семи лет.
В первый день ai-class я за два часа разобрался с различными алгоритмами поиска и особенно с бывшим до этого полупонятным алгоритмом A*. Сегодня за полтора часа я узнал как написать программу, играющую в шахматы и получил отличное введение в теорию игр. Для меня такое быстрое расширение кругозора просто бесценно. У меня появляется шанс полюбить области, которые раньше казались сложными и непостижимыми для простых смертных. На эту тему я даже написал пост в Google+.
Порой я встречаю такую позицию - “Я не хочу захламлять свой мозг потенциально ненужными знаниями. Умею программировать и этого достаточно. Если столкнусь с неизвестной проблемой, то погуглю, разберусь и найду решение.”
В 2004-м году мне подвернулся интересный проект, для участия в котором нужен был хороший письменный английский. В школе и институте я учил немецкий, а английские тексты “понимал” только с помощью программы-словаря, часто удивляясь переводу слов be, the и особенно had had. Решил, что незнание английского - это не проблема, что я выучу его за месяц и догоню проект. Начал серьезные занятия по 20-30 часов в неделю и действительно стал свободно читать, сносно писать, прилично слушать и даже как-то говорить по-английски. Но через 9 месяцев. Проект к тому времени уже давно закончился.
Иногда незнание каких-то областей не дает шанса их полюбить. Иногда интересные возможности проходят мимо. Я не считаю, что нужно знать все. Я считаю, что очень полезно периодически повышать свою осведомленность вширь - знакомиться с новыми областями, разбираться с их подходами, терминологией и используемым инструментарием. Особенно, если появляются возможности сделать это быстрее и эффективнее, чем изучать эти области по книгам.
В школе я учился в математическом классе. В университете тоже было много математики, правда специфической не для computer science, а для инженера-электрика. Тем не менее некоторые компьютерные статьи (papers) и книги я не читал, потому что было некомфортно разбираться с китайской (ну хорошо, греческой) грамотой сумм, произведений, векторов, матриц и вероятностей.
Классы по AI и ML содержат много математического материала, постоянно читая который, эти формы записи становятся знакомыми, понятными и больше не пугают (так сильно). Кроме того, становится понятно зачем нужны дискретная математика, теория вероятности, линейная алгебра, комбинаторика.
Более того, математика позволяет добавить доказательности в статьи, алгоритмы, программы, архитектуру систем и прочие артефакты деятельности работников интеллектуального труда. Steve Yegge отлично написал про это в своей статье Math For Programmers:
With the Wikipedia approach, you’ll also quickly find your way to the Foundations of Mathematics, the Rome to which all math roads lead. Math is almost always about formalizing our “common sense” about some domain, so that we can deduce and/or prove new things about that domain. Metamathematics is the fascinating study of what the limits are on math itself: the intrinsic capabilities of our formal models, proofs, axiomatic systems, and representations of rules, information, and computation.
Статья без математики (если считать логику одним из разделов математики) зачастую содержит лишь некоторый опыт и эмоциональные суждения автора. Хорошая же доказательная аналитическая статья может послужить хорошей опорой для последующих статей и суждений. Предполагаю, что именно математика помогла мне сделать эту мою статью немного более стройной, информативной и полезной для кого-то еще.
Я закончил школу в 1997 году. Мы тогда жили в маленьком казахстанском городе Павлодар. Мне было всего 15 лет, а паспорт можно было получить только в 16. У меня был выбор - подождать год и поехать поступать в Томск-Новосибирск или поступать сразу, но в Павлодаре. Ситуация осложнялась тем, что я еще не знал кем я хочу быть. В девятом классе я познакомился с компьютерами и полюбил их всей душой, но к ним нужно было ездить на другой конец города, также было много других вызовов (в частности, более актульным было научиться хорошо драться, чтобы комфортно жить в нашем не очень благополучном районе).
Я поступил на энергетический факультет. Выбрал специализацию “электроснабжение” как относительно универсальную и начал учиться. Первые год-полтора было интересно: много математики, физика, теоретические основы электротехники, информатика. Информатика все испортила. Сначала я начал пропадать в компьютерном классе, потом мой друг купил себе компьютер, потом я уговорил родителей купить компьютер нам. Стал намного реже появляться на занятиях, обучение трансформировалось в квест по прохождению сессий, сдачи курсовых и получению диплома. Попробовал дизайн-полиграфию, наигрался в игры, с упоением бродил по интернету, читал много книг, которых было не купить в наших магазинах. В 19 лет я начал писать небольшую программку для себя и нашел себя в программировании. Я учился сам, где-то по книжкам, где-то по статьям в интернете. Писал разные програмки, отправлял друзьям, хвалился, спрашивал совета, исправлял ошибки, находил новые неизвестные мне области и нырял в них.
По окончании университета я конечно же отказался от магистратуры/аспирантуры, из-за чего пришлось долго разговаривать с отцом, объяснять, что несмотря на то что у меня хорошо получается учиться, продолжать я не хочу - хочу заниматься программированием, а ему в университете меня научить не могут. Это отношение к университетскому образованию сохранилось у меня надолго. Когда кто-то из знакомых решал пойти получить второе высшее, я обычно его высмеивал, говорил что это пустая трата времени и денег (и зачастую был неправ, за что сейчас мне очень стыдно).
Мое неверие в пользу университетов сначала пошатнулось от знакомства с Теодором Шаниным в 2009-м году. Он рассказывал про систему обучения в ведущих университетах мира, про важность письменных работы, про office hours и про использование этих подходов в Московской высшей школе социальных и экономических наук (за открытие которой он получил Орден Британской империи).
Потом я наткнулся на видеозапись семинара Александра Степанова. Был приятно удивлен его позицией о роли ученых в прогрессе программирования. Вскоре после этих лекций я проходил собеседование в Яндексе, на котором рассказывал Ивану Сагалаеву, что хочу быть программистом-ученым, как Александр Степанов или Brett Slatkin.
Уже в этом году, работая над проектами в Grammarly, я по новому начал уважать ученое сообщество, особенно традицию делиться своими находками в форме открытых статей (white papers). Один из наших проектов занял бы в разы больше времени, не найди мы группу ученых, которые работали над похожей проблемой и опубликовали некоторые возможные варианты ее решений.
Учась в классах AI/ML я увидел, что университеты очень полезны тем, что собирают людей, которые не только разбираются в какой-то своей любимой области, но которым также нравится помогать другим людям разобраться в этой области и (возможно) полюбить ее. Если эта мотивация является приоритетной, если университету удается собрать под своей крышей действительно выдающихся деятелей и учителей, если учебный процесс ориентирован на самых разных студентов (17-летних, 30-ти и 80-летних), если он помогает учиться быстрее, нежели в одиночку по книгам, то таким университетам - честь и хвала!
Еще в конце 90-х годов в лекционных залах нашего университета висели телевизоры - остатки оборудования от проекта трансляции лекций ведущих профессоров МЭИ. Проект не пошел. Такие лекции оказались менее эффективны, чем лекции местных преподавателей. Говорили, что не хватало возможности задавать вопросы профессору, не было связи с аудиторией и пр. В общем - не работало.
В 2009 году я наткнулся на Youtube Edu и начал смотреть один из програмистских курсов. Лектор был хорош, но меня хватило лишь на час или два. Причину я сформулировал так - “я быстрее научусь по книге”.
Как же сделать онлайн-курсы более эффективными, чем старая добрая книга?
К курсу по AI нужно было повторить линейную алгебру и теорию вероятности. В скайп-чате посоветовали видео-лекции MIT OpenCourseWare. Меня очень порадовало наличие выбора скорости вопроизведения (1x, 1.5x, 2x) - возможность подобрать скорость подачи информации, равную моей скорости восприятия на текущий момент. Очень важно, чтобы в процессе обучения не было скучно от того, что лектор рассказывает часовую лекцию недостаточно быстро.
Ближе к началу AI появился список лекций из Khan Academy, которых достаточно для математической основы курса. Я начал смотреть эти короткие (10-15 минут) лекции и … был изумлен. Все выводы были понятны, мне совсем не было скучно, обе темы я изучил за три дня вместо двух-трех недель, которые я запланировал для прохождения курса MIT.
Почему лекции Khan Academy сработали эффективнее?
Черная доска + голос в наушниках - очень удачное сочетания для онлайн-урока. Лекции в университете оптимизированы для студентов, сидящих в этом же помещении. Для онлайн-класса недостаточно просто сделать видеозапись университетской лекции и выложить её в интернет.
10-15 минут - очень хороший размер урока. Этого времени достаточно чтобы передать довольно большую мысль, достаточно чтобы я успел сосредоточиться на обучении. Этот же временной формат вынуждает делать лекции максимально самодостаточными (self-contained). Самодостаточность лекций вкупе с их небольшой продолжительностью дает возможность использовать для самообучения любые свободные десятиминутки. А поскольку лекции содержат одну-две большие мысли, то упрощается навигация по ним. Вместо того чтобы идти в конец третьей лекции, я иду на Compound Probability of Independent Events.
Есть еще пока малопонятная для меня причина - “смотреть видео-лекции легче, чем читать книгу, особенно если я зашел в какой-то логический тупик”. Лекция идет, продолжается, увлекает и я прохожу сложные моменты, сложные пороги, которые иногда останавливали меня, когда книга была моим единственным помощником.
Я обнаружил еще две особенные черты этих классов, которые помогают мне учиться.
В начале этого сентября я посмотрел выступление на TED Sugata Mitra “Child-driven education”. Он рассказывал про свой опыт создания небольших пространств, в которых дети учатся, тесно общаясь, обсуждая и даже обучая друг друга. Тогда я понял важность групповой динамики в образовании.
Когда я учусь не один, а с несколькими десятками тысяч других людей, то во-первых мне сложнее остановиться, когда я устал, заболел, что-то не понял или потерял веру в себя. Во-вторых, есть с кем обсудить непонятные для меня места, есть с кем обсудить различные подходы к более эффективному обучению. В-третьих, группа постоянно вбрасывает новые поленья в топку образовательного процесса: новые интересные статьи, новые идеи, рекомендации книг, примеры из практики.
Вторая важная черта это - временнАя структура класса. Новые блоки лекций и заданий выкладываются постепенно. В результате мы в группах обсуждаем примерно одни и те же темы. Дискуссии становятся более сфокусированными. Два месяца - это достаточно много, чтобы погрузиться в новую тему и достаточно мало, чтобы продержаться, чтобы не сдаться. Одна неделя - это достаточно много, чтобы успеть просмотреть лекции и сделать домашние задания и достаточно мало чтобы начать предвкушать материалы по новым темам, успеть почитать книги и что-то спрограммировать.
Когда я начал смотреть первую лекцию по AI, то я был возмущен тем, что каждые одну-две минуты мне задают вопросы, на которые я еще не знаю ответов. Мне приходилось много думать, гуглить и считать на бумаге. Потом я заметил насколько эффективнее я усваиваю новый материал, когда сначала делаю попытку решить новую задачу сам и лишь после знакомлюсь с другими вариантами решения. Оказалось, что такой подход широко известен и называется “Inquiry based learning”.
Вместе с названием я нашел две хорошие статьи на эту тему: The Worst Way To Teach и The Best Way to Learn. Приведу несколько цитат для разжигания интереса к ним.
“The best way to learn is to do; the worst way to teach is to talk.” - Paul Halmos
What is most impressive is how well controlled the study was—ensuring that the two classes really were comparable—and how strong the outcome was: The clicker-based peer instruction class performed 2.5 standard deviations above the control group.
The strongest gains were observed among women and students with weak prior achievement. These gains appeared not just in the IBL class but also continued through subsequent required mathematics courses, whether or not they were taught using IBL. This happened without decreasing the achievement levels of men and students with strong prior achievement.
Иными словами, такой способ организации лекций - это не смелый эксперимент профессоров-одиночек, а результат продолжающихся экспериментов во многих ведущих университетах мира.
Знакомство с этим подходом помогло мне на прошлой неделе с подбором книги по дискретной математике. В двух лучших книгах, подходящих по уровню подачи, качеству и формату, использовались разные подходы. Первая сначала давала все необходимые формулы и теоремы, а потом вываливала кучу заданий. Вторая давала лишь самые необходимые аксиомы, но вывод последующих теорем производился в режиме “вот интересная теорема, попробуйте ее доказать, еще раз попробуйте, а вот как доказали бы мы”. Эта книга - A First Course in Discrete Mathematics, автор Ian Anderson. Рекомендую!
Недавно я прочитал высказывание (цитирую по памяти, если знаете источник, пожалуйста укажите его в комментариях) - “Предсказания по поводу интернета делать легко. Возьмите любую область, которую он еще не изменил - в течении 20 лет он полностью ее изменит”. Khan Academy, лаборатории Sugata Mithra и новые стэнфордские курсы полностью меняют систему образования.
В начале следующего года будут доступны как минимум 16 (!) бесплатных онлайн-классов от Стенфорда по Computer Science, Enterpreneurship, Civil Engineering и Electrical Engineering. Полный их список можно найти внизу главной страницы любого из классов, к примеру algo-class.org. И этот список постоянно пополняется!
comments powered by Disqus