Category: it

Category was added automatically. Read all entries about "it".

2017

Pour la science № 511 — как оценить сложность модели?

Одна из тем, больше всего мне понравившихся в Machine Learning — это проблема overfit.

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

Проблема overfit состоит в том, что через любые точки можно провести некую кривую, например, полином огромной степени (грубо говоря, через любые n+1 точку можно провести полином n-й степени) — очевидно, что результат будет прекрасным на наших точках, но совершенно не будет годиться для будущих предсказаний, потому что на самом деле полином будет вести себя достаточно хаотично, лишь «случайно» попадая по всем точкам наших данных.

Стандартным решением этой проблемы является уменьшение количества параметров системы (снижение степени полинома), введение штрафов за слишком большие коэффициенты (снижение хаоса, когда на обучающих точках огромные числа с разным знаком компенсируют друг друга) и т.п. Это действительно, работает, но авторы статьи в журнале обращают внимание на опасность простого подсчёта количества параметров системы для оценки её сложности. Это на самом деле существует — я на работе часто вижу аргументы в духе «эта модель с 3 параметрами, а значит...». Собственно, малое количество параметров нормального распределения объясняет, почему его суют не только туда, где его использование оправдано, но и вообще везде, где нет никакой информации о реальном распределении — это «самое экономное» распределение, к тому же издалека похоже на правду в подавляющем большинстве случаев.

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

Фокус на самом деле достаточно простой, в статье его иллюстрируют другим примером. Предположим, мы хотим построить функцию, которая на целых числах 1, 2, 3, ... даёт бинарные значения a1, a2, a3, ... Функция с параметром p выглядит как D(n, p) = D(D(n — 1, p)), D(1, p) = 2p mod 1 (дробная часть после умножения на 2). На самом деле функция даже E(D(n, p)), где E возвращает первую цифру после запятой от полученного числа. Таким образом, D(1, p) — вторая цифра после запятой в бинарной записи p, D(2, p) — третья цифра и т.д. То есть, p = a1a2a3a4... — просто запись подряд всех нужных нам ответов. Секрет кроется в том, что мы допускаем параметр с бесконечной точностью. Тема, на которую автор писал уже колонку несколько месяцев назад, и я её пересказывал.

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

Удивительно при этом, что автор совсем не затрагивает тему чувствительности системы к её параметрам — у нас это самый что ни на есть стандартный тест (более того, это ещё и стандартный тест при любом контроле нас со стороны законодателя).

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

Шутка про баян

Отличная шутка на bash.org, я давно так не хохотал, но только для программистов:

V: А ещё мне тут пришла в голову правильная аналогия про Vim
V: Это короче так: садишься ты в машину, а там вместо руля и педалей стоит БАЯН
V: И каждая кнопка что-то означает, типа: — вперёд 100 м — вперёд 1 км — вперёд до ближайшего светофора — вперёд до отделения полиции — обогнать впереди едущую машину
V: И ещё когда ты садишься, двери блокируются и надо тоже нажать последовательность кнопок на баяне, чтобы выйти
V: А если в движении случайно нажмёшь esc и выйдешь из режима движения, то вместо движения вперёд машина бибикает
V: И соответственно есть прокачанные баянисты, которые ездят по дорогам, играя мелодии. Быстро, эффективно ездят


Чтобы хотя бы что-то было понятно и остальным. Есть такой текстовый редактор, в котором работаешь не только без мышки, то и без комбинаций кнопок на клавиатуре. То есть, ты не можешь нажать Ctrl-C или Ctrl-V — редактор писали на случай ядерной войны так, чтобы он работал всегда, даже по сети, даже когда связь настолько плохая, что информация о нажатии одной кнопки может дойти, а про вторую — нет. И вам не нужно, чтобы вместо Ctrl-C у нас напечаталось C.

Соответственно, у редактора есть три режима:
1. Режим ввода. Когда каждая кнопка с буквой (символом) обозначает просто букву, и та печатается в редактируемом документе.
2. Режим навигации. Поскольку кнопки со стрелочками — это «сложные» кнопки, то они ведь тоже не работают. Вместо них в режиме навигации используются кнопки j / k / l / m — это влево / вниз / вверх / вправо соответственно. Помимо этих кнопок задействована вся остальная клавиатура, и в этом настоящее богатство vi — есть вариант «перепрыгнуть на одно слово» (аналог «Ctrl-стрелочки»), но есть и вариант «перепрыгнуть на 5 слов». Можно перейти в конец строки (аналог «Ctrl-End»), а можно перейти на третье с конца слово в пятом параграфе, начиная от текущего. Там же поиск — можно перейти на второе слово, в котором не менее четырёх гласных. И начала программирования для замены — найди слова из 4 букв, если первая из них «f», то замени вторую на «*». Вы не поверите, но это часто крайне удобно, экономит часы времени. Красивая иллюстрация того, как наложенные снаружи ограничения заставляют нам создавать шедевры.
3. Режим работы с системой. Здесь те же самые кнопки выполняют команды вроде «сохрани файл», «выйди меня отсюда».
Ну и отдельные кнопки в каждом из режимов, чтобы перейти в другой режим (упомянутый в анекдоте Esc).

Понятно, что первые несколько месяцев работаешь крайне медленно, причём обложившись документацией. Потом либо плюёшь и ставишь себе нормальный редактор, либо становишься вот таким вот, описанным в анекдоте баянистом.
2017

Microsoft Family bug?

У меня на компе создано несколько учётных записей, в том числе одна для сына, под управлением Microsoft Family. В основном для того, чтобы можно было контролировать время, которое он проводит за компом. И тут я столкнулся с идиотской ситуацией, которую в Microsoft, похоже, не предусмотрели.
Понадобилось мне реинициализировать запись нашего мальчика. Он там словил какую-то malware (go-ple, если кому интересно), я провозился несколько вечеров, пытаясь её вычистить, потом решил, что проще снести запись и открыть её заново, чем пытаться почистить эту.
Так вот, очень просто снести независимую учётную запись — там прямо есть кнопка «уничтожить». А для записей члена семьи есть только вариант «заблокировать» — после этого ребёнок теряет доступ к данному компу, но это немного не то, что я искал. Вариант «уничтожить» есть на сайте Microsoft Family, но там это обозначает выкинуть ребёнка из семейной системы (например, по достижении им соответстующего возраста), при этом его записи теоретически выходят из-под родительского контроля на всех наших компах — это тоже не то, что я ищу. И всё, третьего варианта нет.

Что я в итоге сделал:
1. Выкинул мальчика из-под семейного контроля. Скрестил при этом пальчики, чтобы учётки не потерялись на других компах.
2. Понял, что зря скрещивал пальчики, потому что выкинуть ребёнка из семьи эта операция не переводит учётки из статуса семейных в обычный. Она просто сносит родительский контроль, то есть учётки на месте, но больше они не контролируются моими оганичениями. Мы это немедлено проверили на соседнем компе — ребёнок смог открыть свою сессию вне дозволенного ему времени.
3. На том компе, где открывает свою сессию родитель, запись пропадает из control panel. Но место на винте не освобождается, то есть в папочке C:\Users всё ещё есть папка Nathan на много гигабайт, в том числе и с go-ple — меня это всё ещё не устраивает.
4. По-варварски я уничтожил папку Nathan, но не до конца — какие-то файлы намертво заблокированы системой, и снести я их не смог, в том числе после перезагрузки.
5. Создал заново учётку Nathan в Family. Она даже работает, но с глюками — явно из-за остатков папки в C:\Users, потому что каждый раз при открытии сессии Windows пишет об инициализации учётной записи, после чего ругается, что не может сохранить настройки. Ну и, как следствие, забывает всё сделанное после закрытия сессии.

На другом компе всё заработало, как раньше. Но что мне делать с этим компом? Переставлять всю Windows по принципу «жгите всех, бог узнает своих»?
Понятно, что п.4 был отчаянным и безрассудным. Но какой была стандартная процедура? Или Microsoft полагает, что дети выданы нам на небесах, и отказываться от них даже в рамках отдельно взятого компьютера — нереально?
2017

Save Base64 image

Столкнулся с неожиданной для себя проблемой. Есть у меня файл html, в котором все картинки Base64, то есть определены прямо внутри этого же файла. И я эти картинки никаким приличным способом не могу скопировать оттуда в, например, Word.

1. Простой copy-paste не работает.
2. Открыть файл сразу в Word — открывает, но картинки не показывает.
3. Открыть файл в браузере и сохранить в другом формате — перепробовал все опции в IE / Edge / Chrome, ничего не работает, всегда сохраняет в том же формате, как и был изначально.
4. У IE есть опция «редактировать страничку в Word», но она просто не работает.
5. Можно конвертировать картинку одну за другой — в интернете есть полно сервисов: копируешь Base64 в окошко, появляется кнопка «скачать картинку». Но у меня там картинок чуть больше, чем дофига, а операцию, скорее всего, придётся повторять неоднократно.
6. Вопрос однозначно не имеет никакого отношения к защите картинок — файл сгенерил я сам (MatLab LiveScript -> Export to html).

Проблему я в итоге решил через экспорт в LaTeX. Но что всё это вот было? Мои кривые ручки? Или считается, что реально никому никогда не нужно копировать картинки, которые в Base64?
2017

Полезная книжка по информатике...

Слушаю передачу про то, как мы учимся. Гость в студии — когнитивный психолог и нейролог, то есть ну вот никак не программист. В какой-то момент рассказывает о сложности учителя увидеть сложность ученика («я не понимаю, что тут можно не понимать!»), приводит пример каких-то совершенно противоположных подходов к обучению чтению (совершенно нетривиальная вещь, которая у всех взрослых — по крайней мере тех взрослых, которые занимаются образованием детей, — давно на неосознаваемом автомате). А потом рассказывает историю из своего детства, когда ему в руки попал первый персональный компьютер (герою было 15 лет, это было ещё до первого Apple). И он самоучкой, по каким-то мануалам и книжкам выучился программировать. А потом, говорит, к нему попала книга, после которой ему стало понятно, что нет, всё программирование на интуиции не выучишь, нужен преподаватель. Очень хорошая книжка, говорит. Дональда Кнута.


Пока лица, приближённые к информатике, вылезают из-под стола, я объясню всем остальным. Дональд Кнут — это такой легендарный дядька, который в частности написал книгу «Искусство программирования» (я уверен, в передаче говорилось именно о ней). Когда лично я дошёл до чтения этой книги, было выпущено 3 тома, каждый размером с Библию. И особенно меня поражал третий том — «Поиск и сортировка». Название — две стандартные задачки, на которых нас учили программировать ещё в школе, — совершенно не вязалось с талмудом на 832 страницы. И это как раз иллюстрирует мысль героя передачи: настоящему преподавателю всегда есть, что дополнить к теме урока.

Дональд Кнут ещё придумал TeX, то есть это реально великий человек. Но больше всего мне нравится история, как мы с Серёгасом в конце 1990-х нашли в интернете личный сайт Кнута, практически блог. И там был, во-первых, план по выпуску оставшихся томов «Искусства». Томов на 7, по одному тому каждые 5 лет — на этом месте мы с Серёгасом хором спели «Who wants to live forever» (стоит заметить, что Кнут до сих пор жив, что с тех пор он дописал 4 тома, последний из которых вышел в 2017 году). А последней записью в блоге было описание, как Дональд с братом строили колонку для басов. Как они осознали, что для хорошей колонки нужен объём и стабильность стен, а значит идеальная колонка должна иметь размер сарая, и строить её нужно из кирпича. Интернет того времени не позволял выложить в блог даже фотографию, тем более аудио-запись результата, но мы тем не менее сильно впечатлились. Чем в свободное время занимается к тому времени уже несколько десятилетий легендарный дедушка.
2017

Сумма прописью

Вспомнил старую задачку начинающего программиста: написать сумму прописью. То есть, имея «123,45» на входе, вернуть строку «сто двадцать три рубля сорок пять копеек». Пока нам не разрешили сокращать до «руб.» и «коп.», мы искали общее правило для всех этих «рубль / рубля / рублей» и «копейка / копейки / копеек». Правило несложное: если число заканчивается на «1», но не на «11», то «рубль», если на «2/3/4», но не на «12/13/14», то «рубля», иначе — «рублей».

Написали, заработало, забыли. А недавно я задумался: откуда такое разнообразие? Забудем на минуту про большие числа — в принципе, понятна логика, когда «пять тысяч сто два» подчиняется тем же правилам, что и просто «два». И даже исключение «11-19» можно понять.

Так вот, «рубль» — это именительный падеж единственного числа. Множественное число будет «рубли». А родительный падеж от них — это «рубля» и «рублей». Таким образом, «1», даётся в именительном падеже, а все остальные — в родительном. Почему бы и нет, логику падежей я так и не понял, поверим на слово. Но почему единственное число идёт до «4», и только с «5» мы переключаемся на множественное?
2017

Мотивирующие фразы MathWorks

А ещё на недавнем семинаре MathWorks понравилась мотивирующая на создание тестов фраза:
Do you care if it really works? If no — just write the code. If yes — write test case before coding.
Интересно, сработает ли на мне — у меня уже несколько лет висит TODO: разобраться с unit test framework :-)

И другая фраза про то, что нам не страшно неполное понимание механизмов машинного обучения: скоро мы будем не программировать компьютеры, а дрессировать их, как собак. И ведь действительно, никого не смущает, что мы не до конца контролируем собачий разум, что иногда дрессура даёт сбой. Мы все прекрасно понимаем, насколько удобно «пользоваться» собаками даже и без абсолютного контроля над результатом.
Наверное, разница в том, что в случае с собаками злоумышленник находится примерно в той же ситуации, что и мы — достаточно сложно незаметно хакнуть мозг собаки, переучив её на что-то другое (хотя Швейк, как известно, приводил подобные примеры). В то время как нейронную сеть достаточно легко обмануть.
2017

Увеличенная реальность

Слушаю сейчас курс по Machine Learning (в двух словах: пока весело, но первые несколько недель слишком просто), мысли в основном о нейронных сетях. И вдруг подумал, что первое приложение, которое все поставят себе на «умные очки», будет не распознавание лиц (эту фичу поставит себе полиция), а распознавание взглядов. Применений куча!

1. Можно увидеть в компании / в баре, кто на тебя «незаметно» пялится. Аж интересно, как эта фишка изменит весь этот микро-мир флирта. Ведь там не только удовольствие посмотреть на нравящегося тебе человека, но ещё и искусство дать ему понять, что ты на него смотришь.
2. Можно наоборот, найти момент, когда никто на тебя не смотрит. Например, чтобы застегнуть ширинку или поправить лифчик. Не говоря уже о воровстве в магазинах.
3. Если проанализировать брошенные на тебя взгляды, можно увидеть, что именно притягивает их. Начиная от пятна на галстуке, которое тебе казалось незаметным, и до глубокого декольте.

Какие ещё есть идеи?
green_fr

Matlab под Unix

На работе надумали обзавестись серьёзным production для проекта, написанного на MatLab.

Как говорят на anekdot.ru, преамбула. Мы когда-то давно говорили с MathWorks по несколько иному поводу — у нас были сомнения в производительности системы, они предложили аудит нашего кода, мы с удовольствием согласились. Ребята втроём копали код несколько дней, сгенерировали кучу слайдов для презентации, которая сводилась к двум пунктам:
1. Ваш код написан идеально, не к чему придраться!
2. Мы можем вам продать сервер за какие-то шестизначные суммы в год, летать будет всё.

Первый пункт лично мне понравился, но оставались какие-то сомнения в его искренности. Через некоторое время у меня дошли руки просмотреть profile проекта, перечитать код модуля, который жрал 90% общего времени (в качестве отмазки себя и своих коллег скажу, что он таки был написан IT-консультантом, настоящим профессионалом своего дела, за какие-то космические деньги в час), выкинул оттуда все лишние строчки (только то, что считается по два раза, и то, что считается впустую — никакой алгоритмической оптимизации), и код стал работать вчетверо быстрее.

После чего сомнения появились и во второй строчке презентации MathWorks (дети! никогда не обманывайте! особенно там, где вас можно легко поймать...) — так ли нам нужен их сервер, если мы можем скопилировать проект и распихать его по уже имеющимся серверам в виде простых exe-шников?


Перехожу ко вчерашней истории. Погоняли мы проект на Windows-машине, хоть на физической, хоть на виртуальной. По этому поводу удивительное дело — у нас IT-дирекция перешла недавно на какую-то более свежую версию виртуализации, и вместо x4 к времени рассчётов, как было раньше, виртуализация даёт всего +10%. Очень хорошо, но мы решили проверить и виртуальные Unix-машины. И тут начался эпос.

1. Компилятор MatLab компилирует только под ту платформу, где он сам находится. При том, что для скомпилированного кода ставится «Matlab runtime environment» на гигабайт, то есть я ожидал компиляции по типу java — в некоторый псевдо-код, единый для всех платформ. Но нет. Я несколько раз переспрашивал, прежде чем поверил. В счастью, «платформа» — это одна из трёх групп: Windows, Mac, Unix.

2. У нас нет клиентских Unix-машин. В смысле простого доступа к ним (я не могу ни «подключиться к экрану», ни зайти по telnet — это отдельная сетка, мне туда входа нет. Договорились, что я подъеду в Orléans, где сидят наши администраторы. По этому поводу — карикатурная ситуация с бородатыми админами в майках и с пивом осталась, только мальчики успели подрасти и поседеть/полысеть, но атмосфера всё та же.

3. У нас нет никакого графического интерфейса на Unix. По этому поводу MathWorks выдал прекрасный термин (наверное, распространённый, я просто давно не общался на эти темы): headless installation. Да, MatLab можно поставить без GUI, только с командной строкой.

4. Стандартный вариант установки: скачиваем «маленький» инсталлятор (120 MB), вводим все идентификаторы, и он скачивает всё необходимое для установки именно того, что ты купил. Очевидно, что этот инсталлятор графический, для нас не подходит. Ок, говорят MathWorks (в какой-то момент они меня начали по голосу узнавать, я им звонил раз 10 вчера), вы можете скачать два iso-образа со всеми продуктами, в момент инсталляции поставится то, что вам нужно. По этому поводу я не премину потоптаться по компетентности наших коллег из MathWorks. Говорят дословно: скачайте iso-образы и разархивируйте их в одну папку. Что значит, «разарзивируйте», в некотором ошалении спрашиваю я? Да, говорят, это то же самое, что zip, он просто называется iso :-)

5. Скачали образы, 11 GB. Сидящий рядом со мной администратор Unix’а начинает нервничать, потому что у него на машине свободного места не так много, и он не собирался сегодня пересматривать всю свою файловую систему. Начали ставить, места предсказуемо не хватает. Попытался стереть откровенно ненужные файлы (всё, что начинается с Simulink — это другой продукт MathWorks, мы его не покупали), но установщику зачем-то нужны все эти файлы. Я вспомнил молодость, жонглирование файлами на дискетах без жёского диска — красиво, но нет, тоже не получилось. С матюками админ полез добавлять ещё одну файловую систему.

6. Ещё одно погружение в детство — для установки нужно отредактировать файл параметров. Очевидно запускаем vi — и руки мои всё ещё помнят, как в нём работать! В этот момент я, по-моему, сильно вырос в глазах всех администраторов. До этого я был для них очередным «представителем клиента», человеком, который должен путать слова «монитор» и «компьютер».

7. Аутентификация MatLab’а проходит через так называемый license server. У нас было много вопросов по этому поводу: моя лицензия привязана к моему Windows-account, как объяснить серверу, что я из-под Unix — это тот же самый я? Попытались вообразить разные варианты аутентификации, потом всё-таки позвонили MathWorks — спокойно, говорят. Мы проверяем только имя пользователя. Чисто как строку. Хозяйке на заметку: для того, чтобы использовать зарегистрированный на кого-то другого MatLab, достаточно создать локальную учётную запись с тем же именем.

8. С горем пополам поставили, скомпилировали, запустили — не работает. Но это уже понятно: у нас весь код с анти-слэшами, а для Unix’а слэши нужны прямые. MatLab даже предлагает мега-функцию filesep, которая возвращает «\» или «/» в зависимости от платформы. На этом мы с админами расстались, договорившись, что я сегодня перепишу всё через эту функцию.

9. Приехав сегодня на работу, я увидел, что мы используем ещё и system для запуска команд DOS (тоже всё работа с файлами) — понятно, что можно написать везде if и продублировать на Unix, но как мы всё это будем тестрировать без доступа к машинам? Плюс, у нас есть работа с Excel — опять же, MathWorks божится, что все его функции используют MS Office API только для скорости, а если Офиса нет — то они и своими средствами обходятся, но как-то даже и пробовать расхотелось. Спасибо за творчески проведённый день, но мы пока что останемся на той же платформе.
green_fr

Excel 2016

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

1. Первая ошибка просто анекдотична. Эту часть мы даже не думали тестировать, настолько она тривиальна: скрипт, который создаёт новый файл, переименовывает первые две закладки и пишет туда какие-то данные. Навернулось из-за того, что Excel 2016 создаёт новые файлы не с тремя пустыми закладками (как это было всегда), а с одной. Логично (я давно ждал, когда же они, наконец-то перестанут создавать пустые закладки), но скрипт, пытающийся переименовать вторую закладку, падает: index out of bounds.

2. Вторую ошибку я так и не понял. Эту часть мы тоже не думали проверять — Total Commander. После перехода на Office 2016 он виснет после длинного нажатия на правую кнопку мыши на директории (длинное нажатие там делает то же, что короткое нажатие в Windows Explorer — показывает контекстное меню). Опытным путём выяснили, что если сначала длинно нажать на файл, то контекстное меню показывается, и дальше в этой копии Total Commander’а ошибки не будет и на директории. А если начать с директории — то падает глухо (not responding). Вылечилось переходом на последнюю версию Total Commander, но мне чисто по-человечески интересно — какие могут быть варианты объяснения такого бага?