Тег «обучение»

Stanford ML and AI Classes

А я ведь тоже их осилил, и даже получил 98.1% за AI, завидуйте! Коллеги-блоггеры, к счастью, все уже написали за меня, так что кто интересуется темой, наверняка уже в курсе. Я добавлю только немного личных ощущений.

ML Class близок к идеалу. Именно таким должен быть настоящий учебный курс — невероятно простым, невыносимо нудным, но при этом дающим твердое понимание того, что происходит и как это работает. Рижским бальзамом на душу льются слова Andrew Ng: «Если вы это не понимаете, не переживайте, сейчас я расскажу, поймете» или «Если вы это не понимаете, не переживайте, я тоже не понимаю, это вам не нужно«. Ну и прочие подобные высказывания и шутки вроде «Если вы эксперт в линейной алгебре и знаете, что такое собственные вектора, то …» доставляют. Столько студентов сразу почувствовали себя экспертами в линейной алгебре! Отдельная благодарность за возможность ускорить лекции в 1.2 и 1.5 раза.

AI Class имеет гораздо больший охват материала, но при этом он менее проработанный. Куча несогласованной терминологии, много недосказанного, вопросы иногда расплывчаты и имеют слабое отношение к тексту. Постоянно происходят какие-то технические накладки, то сроки отодвигаются, то публикуются уточнения к вопросам, то еще какая напасть. Это не говоря уже об очаровательном немецком акценте Prof. Sebastian Thrun, которого я, в отличие от ускоренного Andrew Ng, понимал только процентов на 95 — некоторые фразы не могли понять даже native speakers. Но, несмотря на все недостатки, получился очень неплохой обзорный курс.

Оба курса я изучал в обстановке, приближенной к боевой. У меня было на них действительно очень мало времени, и я искал любую возможность его экономить. Это, конечно, сказалось на глубине обучения.

В целом нисколько не жалею, но курсы будущего семестра — разве что в пассивном режиме посмотрю.

Теория крючков

В студенческие годы мне пришлось столкнуться с одной интересной образовательной проблемой. Она имеет две стороны, кажду из которых проще всего проиллюстрировать на примерах:

  1. На младших курсах все студенты изучают математический анализ. Это очень непростой для неокрепших умов предмет, и самое непростое в нем то, что когда его изучаешь, ты абсолютно не понимаешь, зачем все это нужно. Понять доказательство теоремы Вейерштрасса или разложение в ряд Тейлора в принципе можно, но должно пройти немало времени, прежде чем может быть у кого-то возникнет дежа вю — «Кажется, что-то такое я учил на первом курсе… Но уже нифига не помню». Хуже всего, если эти знания действительно нужны, и приходится открывать учебники и учиться заново. Во второй раз изучать получается быстрее, но все равно время жалко.
  2. На младших курсах многие студенты изучают еще и разнообразную физику. Это вообще труба, потому что используемый в лекциях матаппарат студенты еще не проходили. В результате физику никто не знает, а когда приходит время изучать тот матаппарат, то параллели провести тоже не получается — едва ли кто-то воскликнет «Так вот что, оказывается, имел в виду наш физик год назад, когда говорил о линейных операторах!».

Интересно то, что многие считают второй случай вопиющей халатностью при составлении учебного плана, а первый — неизбежным злом. Некоторые даже добавят что-то в духе «учиться надо было лучше». Так вот, я учился хорошо. Местами даже отлично. И получил красный диплом. Но сейчас, в аспирантуре, мне приходится изучать математику заново, иногда даже по тем же самым учебникам.

Мне придумалась образное объяснение, почему так происходит — теория крючков. Она состоит из следующих постулатов:

  1. Поглощаемые человеком знания ищут в мозгу крючки, за которые могут зацепиться. Чем больше таких крючков, за которые зацепилось некоторое знание, тем дольше оно останется в мозгу.
  2. Крючки типизированные: определенным знаниям нужны определенные крючки. Нельзя зацепить знания о языке Фортран за крючки, относящиеся к плаванию кролем.
  3. Хотя некоторые уникумы умудряются нарушать типизацию крючков, проводя смелые аналогии в различных областях знаний.
  4. Закрепленные в мозгу новые знания сами начинают создавать крючки. Больше знаний — больше крючков — проще усваиваются новые знания.

Попробую продемонстрировать эту теорию на ней же самой. Эти постулаты сами по себе не очень ценны — какие-то утверждения, сделанные неизвестно кем непонятно с какой целью. Если трактовать их именно так, то на следующий день после прочтения они из головы сотрутся. Но можно прицепить их крючками к уже известным фактам, наведя между ними «знания-мосты». Такими мостами могут быть, например, следующие факты:

  • Когда знаешь много языков программирования (или иностранных языков), изучить еще один — гораздо более простая задача, чем изучить первый. Новый язык цепляется за множество крючков, выращенных уже изученными языками.
  • Система крючков гуманитария кардинально отличается от оной у технаря. Поэтому технические понятия гуманитарии воспринимают с трудом — крючки не подходят!
  • Проводить аналогии между программированием и постройкой домов, литературой, живописью, вышиванием крестиком или выращиванием цветов — нарушение типизации крючков. Но кто сказал, что это плохо?
  • Теория, пересыпанная примерами, изучается куда проще, чем сначала куча теории, а потом куча примеров. Поглощая знания маленькими кусочками, мы цепляем их друг к другу, не давая им успеть забыться. С большими кусками сложнее. Это все равно как есть очень длинную колбасу — пока доедаешь ее конец, начало уже давно переварилось и путешествует по канализации.
  • В этом посте неимоверное, зашкаливающее количество употреблений слова «крючок».

В общем, берегите свои крючки и не цепляйте на них всякую гадость.

УжасноПлохоНормальноХорошоОтлично (4 голосов, средний: 4,75 из 5)
Loading ... Loading ...

Ссылки для изучающих C

Вчера была нетленка, поэтому сегодня расслаблюсь и просто дам несколько ссылок на бесплатные, но очень полезные ресурсы по языку C.

  • C Elements of Style — сокращенный вариант старой доброй книжки лохматого года; слегка устарела, но все равно содержит массу полезного;
  • Learning GNU C — туториал про одноименный диалект C;
  • An Introduction to GCC — руководство по gcc и g++;
  • C FAQ — огромный FAQ по языку;
  • Writing Bug-free C Code — оригинальная методология программирования на C с элементами ООП, позволяющая вроде бы упростить обнаружение ошибок; почитать интересно, но применять стремно;
  • The GNU C Library — мануал по стандартной библиотеке C в исполнении GNU;
  • Top 10 Ways to be Screwed by C — топ 10 сишных граблей; будет особенно полезно начинающим;
  • (UPD) Programming in C — курс лекций по С с упором на UNIX-среду;
  • (UPD) C Traps and Pitfalls — статья про скользкие места C;
  • (UPD) Notes on Writing Portable Programs in C — статья про написание переносимых программ на C; категорически рекомендую;
  • (UPD) Indian Hill: Recommended C Style and Coding Standards — рекомендации по стилю C-программ от ребят из одной лаборатории AT&T.

Интересные ссылки из комментов переносятся в основной пост, так что пишите.

УжасноПлохоНормальноХорошоОтлично (2 голосов, средний: 5,00 из 5)
Loading ... Loading ...

Почем образование?

Ехал сегодня на работу и слышал по радио (кажется, это было «Эхо Москвы») презабавнейшую дискуссию. Суть ее в том, что предлагалось в связи с кризисом как-то помочь родителям, оплачивающим обучение детей. Ну там, беспроцентные кредиты и подобная ерунда. Высказывалось даже такое радикальное мнение, как запретить брать деньги со студентов вообще. По этому поводу у меня возникли некоторые мысли, которыми я не могу не поделиться.

Многие ВУЗы сейчас живут большей частью на деньги, которые стригут с сердобольных родителей. Более того, даже зарплаты преподавателей (по неподтвержденным данным) напрямую зависят от того, скольких они обучают платников. Сделать все образование бесплатным — значит обречь на вымирание добрую половину российских институтов, заодно с преподавателями. Разумеется, так не будет. Не то чтобы я верю в здравый смысл наших властей. Я верю в силу откатов. И поэтому платное образование никуда не денется.

Идеи о субсидировании малоимущих родителей платников я даже и рассматривать не буду. Образование — такой же товар, как и все остальное. Если у меня денег на машину не хватает, мне тоже государство подкинет?

Ну и теперь самое главное: в чем высший смысл платного образования? Ну например, приходят два студента — Вася и Петя — поступать в машиностроительный институт. Вася блестяще сдает экзамены, поступает на бюджетную форму обучения. Петя экзамены благополучно заваливает, но щедрый Петин родитель говорит: «Фигня вопрос, да неужто я позволю сыну в армию пойти?!» В результате Петя учится с Васей в одной группе, но если Вася старательно грызет гранит науки, и защищает красный диплом, то Петя на учебу кладет все что может, и в результате едва вытягивает на диплом, получив трояк с минусом. Платник ведь, нельзя заваливать. Вася затем едет в Штаты и работает в Chrysler, а Петя устраивается на ВАЗ. Дальнейшая импликация, думаю, понятна.

Ситуация становится еще более пикантной, если рассмотреть подруг Васи и Пети, которые поступали в медицинский по тому же сценарию…

Единственное вменяемое решение этой проблемы, на мой взгляд — делать одни специальности исключительно платными, а другие — исключительно бесплатными. Ну, например, развелось у нас слишком много экономистов — сделать экономическое образование платным. А если вдруг, наоборот, коварный вирус выкосил всех юристов, юридическое образование оплачивать из бюджета. Возможен еще вариант делать платными «прибыльные» специальности, типа финансистов или стоматологов. Как бы то ни было, нельзя мешать платное с бесплатным на одной специальности. Или так, или этак.

Но самое главное: ни в коем случае нельзя к платникам относиться как к людям, покупающим диплом в рассрочку! К ним должны предъявляться те же требования на вступительных экзаменах, и их точно так же нужно гнать из ВУЗа, если завалят сессию. Иначе страна так и останется в том месте организма, в котором она обитает уже почти 20 лет. Жаль только, что в действительности все идет как раз по худшему сценарию, и с каждым годом мы углубляемся все выше в сторону желудка.

УжасноПлохоНормальноХорошоОтлично (2 голосов, средний: 5,00 из 5)
Loading ... Loading ...

Как работать с библиографическими источниками

Для всех, я думаю, очевидно, что научные работы не пишутся в вакууме. Будь ты хоть трижды гением, в гробу видавшим всех остальных авторов по своей теме, все равно — без анализа существующих наработок не обойтись. Хотя бы для того, чтобы убедиться, что до тебя кто-нибудь не написал то же самое, и ознакомиться с принятой терминологией. А если не принимать в расчет этих мифических гениев, то всем ученым так или иначе приходится опираться на результаты своих предшественников. А это десятки и сотни статей, технических отчетов, монографий, докладов…

Когда я писал магистерскую диссертацию, для меня стало откровением, насколько непростая это штука — работать с литературой. Читаешь одну статью — вроде все понятно. Читаешь другую — все замечательно. Самооценка растет, в голове плещутся новые знания, жизнь прекрасна. Но где-то на десятой статье я стал забывать, что читал раньше. Ну то есть в общих чертах помнил, что вроде бы там написано о том и о сём, но вот что конкретно — хоть режьте, вылетело из головы. Приходилось искать нужную статью и просматривать ее снова и снова. Но это только одна сторона. Самое неприятное наступает, когда ты излагаешь прочитанное в своей работе, а вспомнить, где ты это читал, чтобы поставить ссылку — не можешь. Не говоря уже о том, что какие-то знания могут просто забыться начисто, а это чревато снижением качества работы и даже непроизвольным плагиатом. Вот тут-то и понимаешь, что голова не резиновая, и что фаршировать ее информацией бесконечно без потери качества невозможно. В общем, намучился я с этим делом от души.

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

Во-первых, нужно сразу ввести четкую классификацию всех источников. Как именно это делать — назначением тегов, организацией иерархии, простым распределением по категориям или как-то еще — каждый решает для себя сам. Лично я просто распределил все по семи категориям без вложенности, пока этого хватает с избытком. Если источник доступен только в бумажном виде, нужно как-то пометить его место в классификации (карандашиком или, еще лучше, цветными наклейками).

Затем нужно определить порядок, в котором будет прорабатываться информация. Я сделал это, распределив источники по трем группам:

  1. фундаментальная и общая информация по основной теме;
  2. частная информация по основной теме и общая информация по смежным темам;
  3. все остальное.

Читать надо именно в таком порядке: от общего к частному. В каждой категории лучше читать сначала самое большое и фундаментальное, и только потом переходить к частностям. Иначе говоря, начать с учебников и монографий, и закончить статьями и прочей мелочью. Желательно упорядочить проработку источников в хронологическом порядке, чтобы не путать устаревшее с актуальным.

Теперь для каждого очередного источника нужно сделать следующее:

  1. распечатать, если он в электронном виде;
  2. прочитать, подчеркивая ключевые фразы и делая пометки; не нужно подчеркивать все подряд — только основные идеи;
  3. выбрать ключ, под которым будет фигурировать этот источник; я обычно комбинирую фамилию автора, год и один-два ключевых слова, например, «fidge2002schedtest»;
  4. записать выходные данные и ключ в библиографическую базу (я пользуюсь BibTeX и ebib);
  5. составить краткий конспект, переписав, по сути, все подчеркнутые фрагменты; при этом совсем не обязательно должен получиться связный текст; вы можете даже использовать mind maps, если вам так удобнее; я предпочитаю делать конспект, полностью отражающий структуру исходного текста (то есть, всю иерархию разделов), но некоторые разделы, не представляющие особого интереса, оставляю пустыми; все это делаю в LaTeX, чтобы можно было распечатать и почитать на досуге;
  6. посмотреть, нет ли чего интересного в библиографии источника;
  7. не забыть вписать в конспект путь к файлу источника;
  8. на твердой копии или оригинале источника надписывается выбранный библиографический ключ.

Второй шаг можно отделить. Я, например, читаю и размечаю статьи, когда еду в метро. Обычно на 30-страничную статью уходит две-три поездки на работу и с работы. Конспектирование идет гораздо медленнее, в среднем от 2 до 6 часов на статью, в зависимости от раздела. Поэтому у меня всегда есть запас прочитанных, но не законспектированных статей.

Ну вот, собственно. Надеюсь, кому-нибудь пригодится в научной работе. Буду рад, если поделитесь своими способами организации работы с текстами.

УжасноПлохоНормальноХорошоОтлично (Еще не оценили)
Loading ... Loading ...

Ген программизма

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

Не стоит сразу меня обвинять в мракобесии и развешивать ярлыки. Как ни удивительно, проблема склонности к программированию существует, и люди даже пишут по этому поводу серьезные статьи. В статье заявляется с известной долей недоумения, что, оказывается, существует способ сказать до начала обучения, сумеет ли человек осилить программирование или лучше сразу на рудники. Нехило так, а? Приходит студент поступать на программерскую кафедру, а его просят ответить на три простых вопроса, после чего (голосом магистра Йоды): «Тебя обучать не будем мы! Силы в тебе увидеть не можем!..»

Я бы, наверное, принял все это за шутку, если бы сам не столкнулся с живым подтверждением. Однажды я попробовал в порядке развлечения научить азам программирования двух людей. Один из них не смог понять, как работает присваивание значений переменным. То есть, натурально, пришлось минут 20 объяснять, что означает запись a = 1. Другой человек воспринял концепцию присваивания легко и непринужденно, хотя никогда до этого не программировал, да и желания такого не имел. Каково же было мое удивление, когда я наткнулся на пост Джеффа Этвуда, откуда и узнал про существование исследования в этой области. И вопрос на понимание присваивания у них первый в списке!

В общем, как ни крути, существует разница между людьми. Одни могут в уме строить и выполнять модели дискретных структур, а другие — не могут. Одни люди потенциально могут стать программистами, а другие — нет. Конечно, есть масса людей, зарабатывающих деньги программированием, но неспособные понять рекурсию, косвенную адресацию или функциональную парадигму. Но это другое — такие люди не строят ментальные модели программ, они просто действуют по аналогии или используют упрощенные способы формализации (строительство SQL-запросов мышкой в Access), и хакеров из них не получится ни при каком раскладе.

Ну и самое главное — список понятий, которые настоящий программист должен понимать. Причем не умом, а подсознанием, интуитивно — словами ведь всякий может рассказать, что такое рекурсия, если ему достаточно долго это повторять. Итак, необходимо понимать:

  • присваивание;
  • последовательное выполнение;
  • циклы;
  • рекурсию;
  • косвенную адресацию (указатели);
  • мультипрограммирование (многопоточность);
  • «чувство правильной вещи».

Я несколько расширил список, приведенный в вышеупомянутом исследовании, добавив косвенность и «чувство правильной вещи«. Под последним подразумевается нечто вроде программистского здравого смысла, способность выбрать из нескольких способов реализации одного и того же самый «правильный» и «красивый» вариант. Причем не формулируя критерии, по которым сделан выбор.

Попробуйте испытать своих некомпьютерных знакомых и убедитесь, что ген программизма таки существует. Ну а не убедитесь — бросайте в меня камень, чего уж там.

УжасноПлохоНормальноХорошоОтлично (3 голосов, средний: 5,00 из 5)
Loading ... Loading ...