Math Ajax

понедельник, 23 сентября 2019 г.

Полезные команды


Редактировать много файлов в разных вкладках вима:

vim -p $(grep "Attempted" -r ./tests/*.py | awk '{print substr($1, 1, length($1)-1)}')
Ищем определённое сообщение об ошибке в папке тестов, печатаем часть до пробела ($0 – вся строка, $1 – от начала до первого пробела, $2 – между первым и вторым пробелом и т.д.), потом срезаем последний символ (двоеточие).

UPD: чуть более правильная версия

vim -p $(grep "relative" -r . --include=*.py | awk -F : '{print $1}' | uniq)
Другой юз-кейс:

vim -p $(git status | grep "both modified" | awk '{print $3}')
Разрешаем конфликты оптом (если git mergetool не работает)

Пуллреквесты в битбакете, когда у вас дата сайенс

Джаваскрипт для пуллреквестов в битбакете, который скрывает ноутбуки и таблицы (оставляя заголовки)
let elements = document.getElementsByTagName("section");

Array.prototype.forEach.call(
    elements,
    elem => {
      if (elem.id.substr(-6, 6) == ".ipynb" || elem.id.substr(-4, 4) == ".csv") {
          console.log(elem.id);
      let container = elem.children[0];
      container.removeChild(container.children[1]);
  }
});  

Настроить скроллбары в джупитер ноутбуке

display(HTML("""<style>
div.output_html {  
    white-space: nowrap;  
}
div .output_subarea > pre {  
    white-space: pre;  
    word-wrap: normal;  
}
div .output_stdout > pre {  
    white-space: pre-wrap !important;  
    word-wrap:  break-word !important;  
}
</style>"""))  
Теперь ноутбук становится удобнее для просмотра длинного вывода.
Во-первых, он не переносит длинные строки (если они появились через display), а у длинных ячеек появляется горизонтальный скроллбар.
Во-вторых, длинные строки, которые появились из stdout (то есть через print), по-прежнему дробятся и переносятся.

воскресенье, 30 июня 2019 г.

Extended Mind (версия 2.0)

Вопреки расхожему заблуждению, люди думают не головой. Люди думают телом.

(И нет, это не избитая шутка про мышление задницей. Это вольный пересказ тезиса, изложенного Энди Кларком и Дэвидом Чалмерсом в книге Supersizing the Mind / статье The Extended Mind.)





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


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


Из всего этого можно сделать смелый вывод. Выражения лица, язык тела, жестикуляция и прочее — это спонтанная утечка мыслительного процесса наружу, где он продолжается телом, и на эти утёкшие (беглые?) мысли можно влиять.

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


Это утверждение может прозвучать тривиальным словоблудием, софизмом  из разряда "лысина — это такой цвет волос", "раз полупустое = полуполное,  то пустое = полное" или "атеизм — это религия".


С одной стороны, это действительно скорее философская перспектива,  нежели что-то неожиданное и эмпирическое. С другой стороны, эту перспективу стоит прочувствовать, и из нее можно сделать несколько нетривиальных выводов, и именно поэтому мне кажется важным всё это изложить.


Границы телесности


Мозг не стесняется считать штуки из внешнего мира частью себя. Когда  вы сидите за компьютером, вы же не думаете о том, как нужно двигать мышкой по столу? Вам кажется, что вы просто передвигаете курсор по экрану силой мысли.

Вы не думаете "надо подвинуть мышку сюда". Вы думаете "надо кликнуть на эту иконку". 

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

(это явление называется феноменом зонда)



И, точно также, мозг очень любит вываливать вычислительную работу во внешний мир.

Внешняя рабочая память


Я хочу начать с одного замечательного исследования. 




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


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



Если озвучить этот ход мысли вслух, то выйдет что-то в духе "Ага, мне нужно взять красный блок и поставить его над зелёным. Где красный? Вот красный. Ага, ставим его сюда".



Но на самом деле люди выполняли задачу не так. Если проследить за движением их зрачков (на картинке жирные линии -- это путь курсора, а тонкие -- траектория взгляда), то становилось понятно, что на самом деле происходило что-то в духе "Ага, мне нужно взять красный блок. Где красный? Вот красный. Куда его ставить? Под зелёным. Ага, ставим его вот сюда", т.е. человек запоминал только один кусочек своей задачи: либо цвет, либо позицию.
Что происходило, если незаметно поменять цвет перетаскиваемого блока?
Во-первых, обычно никто этого не замечал. Во-вторых, люди тратили на задачу чуть больше времени. В-третьих, перекрашенный блок в итоге ставился в подходящее для него место, с учётом его нового цвета (то есть обмануть подопытных не получалось).

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

В своей статье авторы исследования прямым текстом говорили, что "перевод взгляда в другое место можно напрямую сравнить с изменением указателя на объект в памяти компьютера"

Можно привести множество примеров того, что окружение непринужденно используется не только для хранения информации, а для экономии вычислений: 

* Вращение детальки в Тетрисе. Многие люди вращают детальку не только для того, чтобы правильно вставить её в паз, но и для того, чтобы понять, подойдёт она или нет. Строго говоря, такое "вращение вхолостую" не приближает игрока к победе; однако лишний раз нажать на кнопку оказывается проще и быстрее, чем вращать детальку в уме.
* Сортировка объектов в пространстве. Например, раскладывание кусочков паззла в несколько куч, перетасовывание букв в Скрэббл/Эрудит, упорядочивание игральных карт согласно стратегии игрока (хотя теоретически люди могли бы запомнить расположение всех карт).

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

Обдумав всё это, а также рассмотрев кучу мысленных экспериментов про людей-со-слабой-памятью-записывающих-всё-в-блокнот и нейроимпланты-которые-ускоряют-вращение-фигурок-Тетриса, Энди Кларк и Дэвид Чалмерс предлагают принцип эквивалентности: если единственное отличие процесса X от родных когнитивных процессов человека N состоит в том, что X происходит снаружи черепа N, то X стоит объявить частью родных когнитивных процессов N [1]. 
Мне хочется найти более запоминающееся название для этого принципа. Я называю его "тезисом экстернализма".


Перейдём к интересным выводам.

Моральные выводы


1) 

Если вам говорят "ну нельзя же так полагаться на свой смартфон", то не надо испытывать стыд. Не надо пытаться оправдываться. Правильная реакция — это недоумение. 


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

А если вы стараетесь запомнить всё наизусть, чтобы не полагаться на техносферу — то вы на самом деле высокомерный наглец, дерзнувший бросить вызов естественному положению дел :)
2) 
Нехорошо переставлять значки на чужом рабочем столе, трогать без спросу чужую электронику, перевешивать календари и так далее. Просто потому, что в какой-то степени это то же самое, что и промывка мозгов, и промывка мозгов — это важный ответственный шаг, к которому следует относиться крайне серьёзно.
3) 
Очень странно говорить про то, что пользоваться какими-то внешними протезами "нечестно", хотя в нашей культуре принято так считать. 
Например, дисциплинированным человеком обычно считают человека, который в случае чего способен потратить очень много силы воли, а не человека, который организовал свою жизнь таким образом, чтобы максимально экономить силу воли и всё равно добиваться своих целей.
Точно также очень странно считать плохим человеком, например, расиста, который отлеживает свой расизм и сознательно корректирует своё поведение так, чтобы не выпускать его наружу. 
Скажем, он сознательно предпринимает какие-то усилия для того, чтобы увидеть в неграх живых людей, и поэтому он регулярно сверяется с чеклистом, в котором есть пункты "спросить у собеседника его любимое хобби" и "узнать, откуда он родом". Или, может быть, расист принимает какие-то медикаменты. Или регулярно посещает терапевта.
Про такого расиста можно сказать лишь то, что это замечательный, ответственный человек, в котором нет ничего дурного, и которому не стоит ничего стыдится.
Если мы не понимаем, как проводить границу между мозгом и окружением, то как можно проводить границу между разными частями собственного разума и делать после этого какие-то моральные выводы? Если мы решили, что бессмысленно говорить "ты без своего блокнотика козел", то говорить "ты без своего левого полушария козел" и подавно полная бредятина. 
Всегда нужно рассматривать человека в целом. 
Практические выводы
1) 
Окружение — очень важно.

Если вам плохо работается, возможно, вина не на вас, а на плохом контексте. Всерьёз подумайте о том, чтобы взять ноутбук и уйти с ним в библиотеку или в кафе.

Не засоряйте информационно ту среду, в которой вы живёте. Если есть возможность, то работайте в специально отведённых для этого местах, и в этих местах занимайтесь только работой. 

(Также можно вспомнить про гигиену сна: не стоит лежать на кровати с ноутбуком)

2) 
Близкие знакомства — это не только повод приятно провести время. С точки зрения экстернализма, это удвоение вычислительной мощности.
Ещё это сильный аргумент про важность взаимного доверия между людьми. С доверием банально пропускная способность канала выше!
Ну и можно пофилософствовать о том, что какие-то формы коллективной деятельности правильнее называть мышлением, а не общением.

3) 
Вопрос со звёздочкой, ответа на который я не знаю: а как теперь относиться к шпаргалкам на экзаменах?
Получается, что шпаргалки в каком-то роде естественны. А вот традиционная модель обучения, делающая упор на записывании разных фактов в мозг — не очень естественна. 
Я слышал про преподавателей физики, которые на экзамене писали на доске кучу формул, в которой была, например, E = mc^2 вместе со своим злым братом-близнецом, E=mc^3. Намеренно искажённые версии формул можно было опознать, если ты хорошо знаешь предмет, и у тебя есть какая-то интуиция.
Мне кажется, что за чем-то подобным будущее. Если у кого-то есть какие-то идеи, то мне было бы интересно их послушать.
Заключение
Итак, ещё раз: мозг настолько обожает вываливать вычисления в окружение, что было бы естественно считать некоторые внешние штуки частями его мыслей. С этой любовью бессмысленно бороться, и бессмысленно её осуждать. Используйте её!

Литература
Статья Ballard, Deictic codes for the embodiment of cognition
Статья David Kirsh и Paul Maglio: On Distinguishing Epistemic from Pragmatic Action
Книга Andy Clark, Supersizing The Mind его же статья Extended Mind в соавторстве с Chalmers)

[1] А ещё они приводят неполный (но интересный) список требований, которому должны удовлетворять ресурсы, имеющие право называться частью разума:

1) Обращение к ресурсу должно быть частым и типичным (например: не отвечать "не знаю", не проверив перед этим свой блокнот).
2) Необходимая информация добывается быстро и легко, почти сразу же после того, как она потребовалась.
3) Полученная информация автоматически принимается на веру в той же степени, как и информация из биологической памяти: нет никакой критической проверки, которой подвергаются мнения других людей или результаты поиска в интернете.
4) Но эта информация в какой-то момент проходила осознанную критическую проверку, и человек "положил её внутрь" ресурса именно потому, что он счёл её надёжной.

суббота, 1 июня 2019 г.

Жатва Кхайбера: конверсия для D&D 5e

Это нельзя назвать новостью (дело было в прошлом году), но я про это не писал.

У небезызвестной настолки Dungeons and Dragons есть редакции. Сейчас актуальна пятая редакция (с неё хорошо начинать знакомство с D&D, она минималистична и изящна). Материалы, рассчитанные на одну редакцию не всегда совместимы с другой.

Я взял на себя задачу сделать конверсию модуля Khyber's Harvest из четвёртой редакции в пятую редакцию. Это хороший модуль в сеттинге Эберрон, написанный автором этого сеттинга.

Ну, в общем в итоге это предприятие удалось. Могу с гордостью представить вам результат многих вечеров рисёрча, плэйтестинга и вёрстки: Khyber’s Harvest: 5e conversion. Это законченный документ на английском языке, который я даже выложил на DM's Guild.

Дата публикации -- 5 декабря 2018. За прошедшие полгода моё творение скачало 285 человек, 29 из них даже купило его за деньги (оно опубликовано в формате Pay What You Want: то есть можно скачать бесплатно, а можно при желании поддержать материально).




четверг, 10 января 2019 г.

"Язык как инстинкт" Пинкера, часть 3: универсальная структура языка


Язык мышления


Насколько человеческая мысль зависит от слов? На этот вопрос возможны по крайней мере две точки зрения.

Первая точка зрения утверждает, что люди буквально мыслят «по-русски», «по-английски» или, к примеру, «на китайском». Процесс мышления напрямую состоит из строк русского текста (а понятия, для которых нет слов, в самом прямом смысле являются “немыслимыми”). Этот взгляд находит своё выражение в известной гипотезе Сапира-Уорфа:

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

(Бенджамин Ли Уорф)

Вторая точка зрения утверждает, что мысль состоит из объектов другой природы. Что объекты когнитивных операций не являются словами, или, по крайней мере, облачены в какие-то другие структуры, специфичные для разума, но отсутствующие в языке. Иными словами, существует особый язык мышления (который можно назвать “ментализ” (mentalese)), неэквивалентный языку естественному.

Реальное положение дел, по всей видимости, намного ближе к гипотезе языка мышления, чем к гипотезе Сапира-Уорфа (хотя нет сомнения в том, что естественный язык каким-то образом влияет на язык мышления).
В пользу этого говорит, например, неоднозначность предложений естественного языка.

Например, рассмотрим предложение “раскапывайте погребенных в земле слепых исполинов”. Это фраза имеет около двух десятков разных интерпретаций, которые удобно выделить, сгруппировав связанные слова при помощи скобок: например, “раскапывайте [погребенных в земле] [слепых исполинов]” (слепых исполинов нужно выкапывать из земли), “раскапывайте [погребенных [в земле [слепых исполинов]]” (у слепых исполинов есть местность, в которой кто-то закопан), или даже “раскапывайте [погребенных [в земле слепых] исполинов]” (исполины закопаны в земле, принадлежащей слепым; их следует раскопать).

Сам факт того, что эта фраза имеет разные “смыслы”, означает то, что смысл и фраза неравнозначны. Следовательно, в языке мышления есть что-то дополнительное, позволяющее различить эти два смысла. В своём разуме человек оперирует не просто с цепочками слов, а с некими другими, более сложными объектами



Структура языка и его понимание

Вернёмся к нашему примеру про трансформацию предложения «John is saying that Mary could sing» в вопрос «Is John saying that Mary could sing?». 

По какому правилу случилось это преобразование? Мы перенесли в начало первый глагол? Мы перенесли в начало самый короткий глагол? Если мы перенесли в начало «главный» глагол, то что такое «главный» и почему это правило кажется людям более естественным, чем остальные?

Согласно Хомскому, причина этого в том, что универсальная грамматика относится к математическому классу порождающих грамматик. Грамматически корректными являются те и только те предложения, которые получаются в результате применения определённых правил вывода. 

Процесс “создания” предложения можно представить в виде дерева вывода. Самый первый уровень понимания текста --- это понимание того, какому дереву вывода он соответствует. Переход от “плоского” предложения к дереву его разбора называется парсингом.

(на самом деле, универсальная грамматика Хомского включает себя не только деревья разбора, но и правила их трансформации. Например, правило «поставь в начало главный глагол»)

Таким образом, предложение не является просто цепочкой слов. Предложение - это иерархия, найти в которой “главный глагол” не составляет труда. Это объясняет, почему предложения так естественно анализировать, группируя слова внутри вложенных скобок (это уже затрагивалось в разделе про неоднозначность синтаксического разбора предложений). Как известно программистам, любую правильную скобочную последовательность можно представить в виде дерева и наоборот.

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

Ещё одна важная особенность универсальной грамматики заключается в том, что она в некотором смысле очень проста. Если дано дерево разбора предложения, то на многие вопросы можно ответить, даже не имея ни малейшего представления о смысле этого предложения. К таким вопросам относятся, например, «является ли это предложение корректным?», «как превратить это утверждение в вопрос?» и «какие объекты участвуют в этом предложении? Каковы логические отношения между ними?».

На вопросы, связанные со структурой предложения, можно отвечать, просто преобразуя дерево разбора механическим образом по определённым правилам. Аналогичным образом возможно и построить само дерево разбора.

Именно это и делают, например, компиляторы для языков программирования. Алгоритм их работы основан на идеях Хомского касательно парсинга контекстно-свободных грамматик.

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

Продираясь сквозь синтаксический бурелом

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

(Этот абзац можно перефразировать по-другому, сохранив его смысл, но сделав его очень трудным для понимания. Сравните:

Аргумент за теорию Хомского, состоящий в том, что человеку трудно читать предложения, требующие для парсера, предназначенного для обработки контекстно-свободной грамматики, описанной Хомским, дополнительной памяти, является довольно интересным.)

В качестве примера рассмотрим два предложения, аналогичных по глубине вложенности, но иначе структурированных.

Предложение [Удивительна [скорость [движения [крыла [колибри]]]]] читается с некоторым трудом, но в целом понятно. При этом единственный способ понять предложение [Скорость, [которую имеет движение, [которым обладает крыло [этой птицы] ] ] ] удивительна] --- это перечитать его несколько раз, осознанно разворачивая слои изнутри наружу.

Пирахан

На мой взгляд, сейчас необходимо остановится на одном распространённом заблуждении. Это отступление прояснит, чем является и чем не является теория Хомского.

Один из самых известных контраргументов к теории Хомского – это язык Пирахан, на котором говорит бразильский народ охотников-собирателей.

Пирахан не поддерживает рекурсии (хотя это утверждение является спорным). Например, на Пирахане невозможно сказать "дом брата Джона", вместо этого нужно сказать "у Джона есть брат. У этого брата есть дом".

Этот факт означает, что рекурсия не является универсальным свойством естественных языков. При этом рекурсия является самым главным свойством универсальной грамматики. Опровергает ли Пирахан теории Хомского?

На самом деле нет.

Хомский утверждает, что в мозге человека есть общечеловеческий “языковой орган”, умеющий оперировать с рекурсивными структурами, подобными деревьям разбора. До тех пор, пока все люди способны обучиться языку с рекурсией, существование языка без рекурсии не противоречит этой картине. И никто не ставит под сомнение тот факт, что дети племени Пирахан могут свободно говорить по-португальски.

Сам Хомский приводит следующую аналогию. Пусть исследователи обнаружили племя, люди которого закрывают один глаз чёрной повязкой. Это племя будет интересно антропологам, но оно не будет иметь никакого отношения к теориям бинокулярного зрения

Что было бы таким контраргументом? Например, существование языка, правила которого сформулированы не в терминах деревьев (“перенеси в начало главный глагол”), а в терминах линейного порядка (“перенеси в начало самый первый глагол”), нанесло бы теориям Хомского серьёзный удар. Пирахан таким серьёзным контраргументом не является.

Заключение

Тезис Хомского о врождённости языка имеет множество убедительных свидетельств в свою пользу. Язык представляет собой сложную структуру, изучить которую «с нуля» очень сложно. Дети не столько учатся языку, сколько реконструируют его. За восприятие языка отвечают определённые зоны мозга.

Сейчас теория Хомского об универсальной грамматике продолжает развиваться и оказывает сильное влияние на лингвистику, психологию, информатику и на современный мир в целом.