Продолжаю кстати слушать онлайновые курсы по Computer Science. С момента как я в последний раз о них писал, они здорово видоизменились.
Во-первых, Себастьян Тран и компания запустили собственный проект Udacity. На самом деле этот проект несколько пока разочаровывает. Я прослушал (на самом деле прокрутил довольно быстро, выполнив всего пару заданий) курсы «Building a serach engine» (CS101) и «Programming a robotic car» (CS373, его просмотрел не до конца), и впечатление сложилось негативное.
CS101 оказался на редкость примитивным и мне показалось, что слишком уж примитивны он будет даже для новичка. То есть посоветовать никому я этот курс не могу на самом деле, хотя конечно мне сложно судить — сам с программированием я познакомился много лет назад, и рассуждать что лучше для новичка, не имея преподавательской практики, я конечно не вправе. Но то что курс не тянет на «top university level», как они себя позиционируют — это по-моему очевидный факт даже для CS101. Максимум — уровень среднеобразовательной школы (единственный плюс — изучается Python, а не какой-нибудь Basic или Pascal, как в России).
Домашние задания даже нельзя назвать тривиальными. Пяток программ типа «print 2+3» за неделю — это реально смешно. То есть никакой наработки практических навыков программирования курс не дает, для меня он оказался 100% бесполезным, что странно даже для CS101 — обычно лекторы в любой курс вставляют хотя бы какие-то факультативные факты, которые и для опытного разработчика оказываются новыми. Тут не было вообще ничего.
Короче я не доволен.
CS373 был чуть лучше, но тоже не особо. Задания крайне примитивные и часто вообще не на CS, а на какие-то отвлеченные вещи. Например, домашнее задание на реализацию фильтра Кальмана сводилось к тому, чтобы догадаться о размерности перемножаемых матриц, а смысл самих матриц даже в общих чертах не объяснялся — это полностью убило мою мотивацию слушать лекции Себастьяна далее. Никакой математики почти не рассматривается, а там где она вдруг появляется, она быстро пробегается мимо как что-то очень сложное, а затем опять разжевываются тривиальные вещи.
На все это наслаивается еще и ряд ошибок движка сайта. Половину домашних заданий мне не засчитали из-за каких-то проблем на сервере, причем проблемы эти похоже что не особо лечатся. Это конечно второстепенно, если нет цели получить их сертификат. Но сертификат их гроша ломаного не стоит и вряд ли кому-то сдался.
А вот Coursera произвела совершенно противоположное впечатление. Во-первых, к проекту присоединился целый ряд университетов, и помимо Стэнфорда свои курсы публикуют так же Princeton University, University of Michigan, Universoty of California, Berkley и University of Pennsylvania. Сам состав курсов тоже значительно расширился: теперь это не только Computer Science и Enterpreneurship, но и медицина, история, социология, экономика, какая-то даже математика.
Из всех курсов, увы, я оказался спобен заниматься только Natural Language Processing. Качаю и остальные, конечно, но выполнять задания не успеваю — восьмичасовой рабочий день банально не позволяет слушать большее количество лекций. Начинал слушать Probabilistic Graphical Models, но не успевал и сконцентрировался на одном только курсе.
Вот эти курсы действительно оказались близки к «top university level». Во-первых, сам материал актуальный, интересный и не тривиальный. Курс составлен очень качественно и продуманно. Но помимо лекций, важны еще и домашние задания.
Одно из последних домашних заданий требовало находить в тексте имена людей. Это на самом деле нетривиальная задача: многие слова имеют двоякий смысл, например «Victoria» может быть именем девушки, а может означать победу, и если это слово стоит в начале предложения, то проверка того имя это или нет сильно затруднено. Так же могут использоваться клички и псевдонимы, которые тоже надо вычленять из текста как имена собственные.
В итоге используется вероятностная модель текста, которая для каждого слова проверяет набор признаков, и сравнивает различные варианты классификаций этого слова по данным признакам с разными весами. Весы подбираются эмпиричеки, в ходе чего решается оптимизационная задача — целевая функция в этой задаче имеет порядка 250000 параметров (плюс-минус сотня тысяч в зависимости от того каких признаков и сколько вы нагенерили).
Мне это сразу напомнило курс методов оптимизации в МИФИ. Там мы градиентным методом поиска искали экстремум функции . Причем я не шучу — это на полном серьезе называлось словом «лабораторная работа». В других институтах насколько я знаю ситуация с контентом курсов хоть и лучше, но тоже фатальна.
Курс NLP хорош тем, что дает реальные практические навыки в задачах, приближенных к реальным условиям (в отличие от курса CS101 Udacity, например, где мне плакать хотелось, особенно учитывая то что я когда-то немного читал учебник по Information Retrieval), и дает почувствовать масштаб реальных задач.
Еще полезный аспект — реальное применение каких-то математических концепций в Computer Science. Математика там конечно исключительно примитивная (логарифмы, вероятность, производная), но все равно забавно как применение какой-нибудь базовой теории вероятностей порой может кардинально повысить точность в сравнении с чем-нибудь совсем простым и очевидным. Если бы подобные курсы читались в технических ВУЗах, то ни у кого бы не возникало вопроса «а зачем мне это надо».
Ну и сами задания по программированию интересны. Я как-то писал, что в большинстве случаев довольно глупо требовать от учеников решения задачек — вместо этого надо выполнять проекты. Курс NLP почти целиком следует этому подходу (следовать ему целиком — сложная задача разработчика курса, и вероятно не всегда решаемая). В половине Programming Assignments не существует верного ответа, и вы можете рассчитывать лишь на некоторую точность работы вашей модели, выраженную в процентах (вернее, там почти всегда используется F1-мера, но это уже детали). У вас не получится догадаться какое должно быть решение и у вас не получится нащупать какой-то один заранее запланированный путь — вы именно сидите и думаете над реальной задачей, где решение не определено, а ваш балл получается не за ошибки в решении, а за его реальную применимость в жизни. И это очень круто (на самом деле существование решения конечно предполагается, и вам оно примерно известно из лекций, но и собственная творческая работа там довольно обширна).
Кстати, занятно, что многие из тех алгоритмов, которые рассматриваются в курсе, были разработаны еще годах в шестидесятых, но в те времена они не имели применений из-за отсутствия необходимых мощностей и объемов текстов в электронном виде. Сейчас это направление становится актуальным, и если предположить, что вычислительные мощности будут расти, эти направления скоро станут крайне актуальными и востребованными, и я например смогу рубить больше бабла. И это тоже хорошо.
Но это в общем-то главным образом про NLP. Остальные курсы я смотрел лишь мельком — там не везде есть Programming Assignments, но лекции тем не менее производят приятное впечатление. Так что всем рекомендую.
Подобная инициатива кстати есть и у MIT, но у них там пока только курсы по электрическим цепям, чего я не потяну. Помимо них конечно есть куча выложенных лекций в рамках проекта MIT OCW, среди которых есть хорошие, но там по большей части все же не полноценные курсы, а порой и вообще только заметки от руки или текстовая расшифровка лекций без формул, что конечно не имеет смысла.
Но собственно все это я написал, чтобы как-то прорекламировать. Всем настоятельно рекомендую. Coursera — это пожалуй наиболее полезный и интересный курс, который мне до сих пор приходилось слушать. Очень жалею, что не успеваю больше.
P.S. Очень извиняюсь перед всеми, кому не успеваю отвечать на почту или ВКонтакте. Меня жутко раздражают люди, игнорирующие письма, я это считаю довольно высокомерным и не приятным поведением, но я сам теперь стал таким. Пишут мне много, и я банально не успеваюсь, особенно на фоне того


