среда, 28 декабря 2011 г.

Астрономия - Фото 2011 - VIII


пятница, 23 декабря 2011 г.

Джеф Раскин — Интерфейсы

Прочитал книгу Джефа Раскина: «Интерфейс: новые направления в проектировании компьютерных систем».

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

Книга описывает особенности взаимодействия человека и компьютера. То, как должны строится интерфейсы между человеком и машиной. Должны для того, чтобы человек мог быстрее выполнять свою работу. Меньше нервничать. Быстрее усваивать интерфейс. Быстро интегрироваться в комплекс программ. Не забывать полученные навыки. Делать меньше ошибок.

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

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

Во время прочтения интуитивно становится понятно, почему люди выбирают Macintosh вместо Windows, и почему «Windows must die». В чем же интерфейсы Microsoft ужасны и чему они могут поучиться у Mac'ов.

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

Интересно, что подход к сохранению паролей Раскина был очень похож на мой 2-й способ (; — генерация трех произвольных слов из английского языка.


суббота, 10 декабря 2011 г.

Разработка с помощью примеров и на основе правил

ML, наслоившись на Лерера, и на опыт разработок различных систем, нарисовало противоречие двух различных подходов в разработке. Это разработка на основе правил (формулировка фиксированных требований) и с помощью примеров (на основе единичных примеров).

Разработка с помощью примеров

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

Например.

Пользователь: «Хочу, чтобы я нажал на кнопочку, а письмо ушло по вот этому адресу.» Здесь пользователя не волнует, что будет если письмо будет очень большое. Или если сервер будет не доступен. Ему в формулировке важно, чтобы было создано письмо и оно дошло.

При тестировании таких требований происходит то же самое. Создается тест, в котором создается письмо, отправляется на ящик, проверяется в приемнике. Если оно дошло — значит все работает.

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

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

Грамотный программист в отличие от новичка в состоянии подобрать такую функцию, которая не только бы удовлетворяла всем примерам, но и имела бы грамотный запас прочности по расстоянию (не скатывалась в Overfitting и Underfitting). И кроме того, он в состоянии найти эту функцию быстро.

Можно рассмотреть это как пример формального вывода. Если мы имеем функцию возведения в квадрат:

int sqr( int x )
{
    return x*x;
}
То тест будет выглядеть например так:
int
test_sqr( int x  )
{
    const int result = sqr( 1 );
    assert_true(result > 0);
    return result;
}

void
test()
{
    assert_true( test_sqr(1) == 1 );
    assert_true( test_sqr(4) == 16 );
    assert_true( test_sqr(-1) == 1 );
    assert_true( test_sqr(0) == 0 );
}

Фактически, есть ряд примеров, которые хочет пользователь, и на них проверяет программу.

Разработка на основе правил

Основой для разработки является набор правил, которые должны быть выполнены. Как аксиомы в математике, от которых можно отталкиваться и строить какие-либо другие утверждения.

Примеры правил:

  • В системе реакция на события происходит с задержкой не более 100 мс.
  • Отправленное сообщение если не доставлено в течение 1 с, то оно не будет доставлено вообще.
  • Стрелка не должна переводиться в случае, если её секция занята (перевод стрелки под поездом).
  • При входе в функцию аргумент не должен превышать 100.

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

Например если взять нашу функцию sqr, то с применением метода predicate Abstraction и выводом постусловия сверху вниз можно вывести постусловие из предусловия. Например если на входе аргумент находится в диапазоне от 0 до 10, (предусловие {0 < x < 10}), то на выходе аргумент будет находится в диапазоне от 0 до 100 (постусловие {0 < x < 100}).

Другое применение: если мы требуем, чтобы на выходе не было переполнения ({-INT_MAX < x < INT_MAX}), то с помощью правил вывода можно рассчитать предусловие:

{-INT_MAX < x*x < INT_MAX}

{x*x < INT_MAX}

{-sqrt(INT_MAX) < x < sqrt(INT_MAX)}

Таким образом получить предусловие, для которого вычисление x*x не даст переполнения.

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

Так исторически сложилось, что значительную часть времени мне пришлось провести именно в таком контексте работы — длительным изучением и применением доказательства правильности к системам. И это наложило последующий отпечаток.

Разница подходов на характерных примерах

Тренировка на примерах и вывод нужной функции из аксиом

Подход на примерах

  • Формулируется что-то вида «оно-интуитивно-должно-работать».
  • Запускается тестовый пример (на доске, в тетрадке, в голове, …). Смотрится, как оно по идее должно отработать. Интуитивно понимается, что скорее всего вот здесь проблема, а здесь возможно долго кодить, а здесь наверное надо-ещё-подумать.
  • Если обнаружены проблемы на предыдущем шаге, то начинается размышление чего-исправить-чтобы-заработало.
  • Добавляется ещё много-много-примеров. Пока не появится уверенность, что все должно работать.
  • Если ничего не получается, то идет переход к первому шагу с попыткой переписать все с нуля. Или берется таймаут до новых идей.

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

Эффективность работы определяется: способностью интуитивно (то есть, на основе опыта по Лереру) подобрать решение, способностью интуитивно собрать хорошие тестовые примеры (качественные тестировщики и идееобламыватели). Конечно же, делать все это надо быстро, с минимумом затрат времени и ресурсов.

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

Подход на системе правил

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

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

В синтезе с подходом на примерах получается приблизительно следующее:

  • Исследование предметной области (ТЗ, железо, библиотеки, …) и установка правил (трафик не превышает 100 транзакций в секунду; таблица не должна содержать более 1М записей; введение индекса по такому-то полю позволит выполнить select со сложностью log N).
  • Формулировка варианта решения с учетом всех правил. Если правила невыполнимы, то задача в таком ключе не решается и надо их пересмотреть.
  • Формулировка дополнительных правил исходя из варианта решения.
  • Прогон на тестовых примерах (не важно где, в уме или на стенде).

Такой подход позволяет быстрее отбраковывать неэффективные или неверные решения, аналитически находить узкие места, формулировать конкретные требования к модулям ещё до разработки, выдавать рекомендации к построению софта. Такой подход при разработке ПРЦ для ответственных модулей и при верификации действующего софта во многом помогал и оправдывал себя. Даже не имея большого опыта разработки, и наличия мощной системы по последовательному внедрению и сопровождению, удалось создать работающую и безопасную систему. Но вот напротив, за время работы в «Intervale» данный подход имел очень ограниченное и малоэффективное применение.

Особенность железной дороги в том, что разрабатываемый софт нижнего уровня работает на одном и том же железе. С минимумом привлечения сторонних библиотек. При конкретных и не меняющихся требованиях заказчика. Все намного более жестко детерминировано. В банковских системах эти моменты теряют смысл. Требования к проекту могут измениться через неделю после старта разработки при проведенном проектировании. Исследовать свойства предметной области чаще не удается, чем удается. Перед внедрением внезапно заказчику хочется прикрутить какую-нибудь рюшечку. В документации написано, что на запрос должен прийти ответ «Пиво», а на самом деле приходит «Жопа». В договоре темп 100 транзакций в секунду, но почему-то раз в сутки в зависимости от фазы Луны происходит всплеск в 200 шт в секунду. Когда показываешь логи с фактом, то оказывается, что лучше допилить приложение. И т.д. и т.п.. В таких условиях сформулированные когда-то правила летят кувырком. Аксиомы, на которых строилась теорема, перестают быть аксиомами. И лишенное фундамента здание начинает рушиться.

Полюса применения

Известность области

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

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

Изменение требований ТЗ

Для постоянно развивающихся приложений, приложений, где ничего не понятно, что будет в результате разработки, приложений, где предполагается постоянное обновление библиотек, приложений, где пользователям постоянно в голову приходят разные идеи, семь пятниц на неделе и пр. — нужно всяческое тестирование, TDD, Unit-testing, итерационная разработка, способность к постоянному допиливанию и т.п..

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

Использование библиотек

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


пятница, 9 декабря 2011 г.

Stanford Classes Впечатление

Уже давно перевалили за экватор два стенфордских курса, в которых участвую (ML и DB).

Отдельными впечатлениями оказались качественный Feedback (обратная связь) с его оперативностью и ориентация на предоставление шанса обучения, а не обучение во что бы то ни стало.

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

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

Если в наших формах обучения штампуется множество вариантов, чтобы не списали, всячески контролируется процесс обучения, то тут по-другому. Вариантов фактически нет. Чтобы ответить на вопросы quiz'a, достаточно прокрутить их несколько раз и посмотреть на ошибочные. Чтобы сделать упражнения, можно по диагонали просмотреть форум и найти полурешения. Но обучения в таком процессе ноль. И сам курс строится как «Вы пришли к нам из интернета и диплома мы вам не дадим. Но дадим возможность изучить предмет. Пользуйтесь.»

Обучение идет в 3 волны с корректировкой по обратной связи. Сначала лекции. В течение которых задаются вопросы, на которые слушатель отвечает. Отвечает для того, чтобы можно было себя проверить, насколько хорошо усвоен материал (но может вопросы и пропустить). Это где-то 1 простой вопрос на 10-15 минут видео. Следующим этапом является послелекционный Quiz. Серия вопросов, средней сложности. После ответа на каждый из них идет разъяснение, что такой ответ не подходит по такой-то причине. Попробуйте ещё раз. И по большому счету, пробуйте сколько хотите. Далее последней волной являются упражнения. Для закрепления практических навыков. Среди которых есть основные (которые учитываются в курсе) и есть дополнительные (хотите — изучайте, не хотите — ваш выбор).

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


четверг, 8 декабря 2011 г.

Психологические тесты на обобщения

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

К таким тестам относятся многие категории. Это классификация (найти лишнее, разбить на 2 группы), поиск закономерности (продолжите ряд 1,2,4,9,…), подведение двух понятий под общую категорию (объедините одним общим понятием дождь-снег-град) и др..

Попробуем рассмотреть данное явление в контексте распознавания, обучения и понятий ML: что же именно проверяют данные тесты, почему они могут не работать и как их можно оценивать и улучшать?

Предмет тестирования

Рассмотрим тест Амтхауэра. Есть 5 понятий, найти лишнее:

  1. занавес
  2. щит
  3. невод
  4. фильтр
  5. стена

В представлении автора теста данные понятия расположены приблизительно так:

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

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

Какое же решение более оптимальное?

С точки зрения ML наиболее приемлемым решением будет являться прямая 3. Это легко определяется математически: должно быть значительное расстояние от прямой до точек, которые она разделяет. Например среднее квадратичное величин, обратных расстоянию от точек до прямой. Или минимальное расстояние до любой из точек. Тут могут быть варианты решения. Но главная особенность в том, что расстояние должно быть по возможности больше. Чтобы в последующем функция имела большие шансы на выживание. То есть, когда появятся новые примеры, чтобы они удовлетворяли проведенной классификации и функцию не пришлось бы менять.

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

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

Область применения

Почему такой тест может сработать неадекватно?

Первый случай — когда ответ совсем не очевиден. Например для таких понятий:

 

Да, для них можно найти какую-то обобщающую функцию, но вряд ли она будет эффективна или полезна.

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

Ещё один случай: не факт, что сам автор теста придумал эффективное обобщение. Возможно имеется более хорошо работающее решение. Или сравнимое по работоспособности, но не попадающее в ответ.

Оценка и улучшение теста

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

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

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

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


среда, 7 декабря 2011 г.

Строгое определение понятия

Понятия могут возникать как стихийно (интуитивное, на основе примеров, как описывалось ранее), так и задаваться строго.

Пример строгого понятия: «чётное число — это такое целое число, которое делится на 2 без остатка». При задании такого определения можно четко определить, какое число четное, а какое не является чётным. Такое определение не нуждается в примерах для его понимания (но для человеческого сознания более удобно провести несколько тестовых проверок).

Удобство и возможность использования

Строгое определение более удобно тем, что при его использовании не возникает проблем при работе с понятием в различных контекстах. Число является или не является чётным всегда, у любого человека, на любом языке. А если возникает проблема определения, то можно обратиться к определению (то есть, если допустима операция деления на 2, возможно вычисление остатка и сравнения его с нулем).

Но строгое определение можно использовать не всегда. Например для «быстро бежать» определить строгую границу проблематично, и по большому счету, зачастую не имеет смысла.

Даже если строгое определение возможно, то на его вывод могут потребоваться ресурсы. Которые выделять совсем необязательно.

Необходимое условие строгого определения

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

Перевод понятия в строгое определение

Понятие может длительное время существовать в понятии на примерах. И только в какой-то исторический момент стать переведенным под строгое определение.

Характерным примером может служить какая-либо мера длины. В древности интуитивно было понятно, приблизительно сколько составляет английский ярд, египетский локоть или русский фунт. Но со временем потребовалось ввести более строгое определение понятия, чтобы например улучшить точность измерений.

До введения строгого определения все пользовались понятием в своем понимании, и более-менее это все работало. После же введения нового определения у тех, кто пользовался немного другим значением, может возникнуть конфликт интересов (сто лет расстояние между деревнями было 20 верст, поэтому одна верста — это 1/20 расстояния между этими деревнями, и меня не переубедите!). Где для всеобщего счастья и взаимопонимания кто-то должен изменить, кто-то урезать область понимания (раньше интуитивно считал, что бежать со скоростью "вжи-и-ить!" это от 20 до 30 км/ч. Сейчас Си постановила, что это от 21 до 35 км/ч).

Если ещё раз взглянуть на понятия роботов, то такое приведение ведет к приравниванию областей слов 1 к 1.

Историческое развитие и изменение понятия

Широкополосное понятие может изменять свой смысл, несколько раз определяться или переходить опять в интуицию и обратно. В зависимости от имеющегося уровня знаний и общего background'a и соответственно их изменения.

Рассмотрим понятие «планета». Изначально это «блуждающая звезда». То есть, определение предельно понятно для своего времени — есть строгое понятие звезды (то что ночью в виде точки), есть строгое понятие блуждания (перемещение, заметное невооруженному человеческому глазу). То есть, достаточно посмотреть на небо и найти все звезды, которые перемещаются с течением времени.

Далее, как мы знаем, со временем астрономы изобрели телескопы и прочие приборы, позволяющие заглянуть вглубь космоса. Были открыты новые планеты и счёт успешно был доведен до 8. Во время открытия Плутона уже были известны малые планеты, но Плутон все равно зачислили к планетам.

Во время этих астрономических открытий строгое понятие стало исчезать и терять свой смысл. Стало понятно, что блуждают все звёзды, только их блуждание не так заметно. К звезде надо отнести и Солнце тоже, и она тоже блуждает по небу. Смысл же понятия с определением блуждания по небу (т.е. относительно Земли) теряется, так как начинаются открываться планеты у других звёздных систем. В результате имеем с 1930 по 2006-й год 9 планет, которые являются примерами для интуитивного определения. Но строгое определение исчезает и полностью теряет смысл, а планетами считаются «большие шарообразные массы вещества, летающие вокруг звезды». Насколько большие, насколько шарообразные, насколько вокруг и как летающие — все это интуитивно понятно, а впоследствии — интуитивно непонятно.

В 2006-м Плутона разжаловали и придумали новое определение. В котором хотелось оставить 8 примеров, но при этом чтобы не попали другие небесные тела с намеками на планету (то есть, выполнить грамотное обобщение). Нынешнее определение опирается на интуитивные понятия и не готово к будущим открытиям: если мы прилетим в другую систему и увидим, что мусор орбиты не очищен, то придется переделывать справочники; если найдем планету за пределами звёзд, то её как-то надо будет назвать.

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


вторник, 6 декабря 2011 г.

Понятия в переводах

Интересным моментом является перевод понятий из одной системы понятий в другую. Например, из понятий одного описанного робота в понятия другого. Или перевод с русского на английский. Или перевод из блок-схемы в C++. Или перевод понимания термина одного человека в понимание другого.

Во всех описанных случаях мы имеем два множества вариантов описания (множества понятий), и нужно из терминов одних понятий перевести в термины других понятий, при этом желательно с минимумом потерь.

Перевод из одного контекста в другой

Понятия в разных языках не совпадают. Какие-то практически не совпадают, и их сложно переводить, а какие-то более-менее точно совпадают, и их переводить легче. Например при переводе с англ-рус можно практически 1 к 1 переводить такие слова, как понедельник, 40, юг, … То есть, при переводе они идут без каких-либо искажений (например). Но в большинстве случаев это не так.

Если взять например интуитивный параметр расстояния до чего-либо, то на русском и английском понятия можно расположить так:

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

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

Зависимость от контекста

Как оказывается, данная зависимость полностью формируется той самой тренировкой понятий, которую провел у себя человек (или какая-либо другая сущность, типа робота). Например анекдот:

— А в каком направлении мы идем?

— Думаю что на юг.

— Почему ты так решил?

— Становится все жарче!

Если тренировка прошла в южном полушарии, или на экваторе, то понятие «юг» не похоже на «жарко». И такому человеку понять будет сложнее.

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

Обучение и тренировка

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

Контексты характерны не только для «официальных языков» или диалектов. Они формируются естественным образом у групп взаимодействующих людей. У народа, у семьи, у команды, … Чем более изолированное взаимодействие (профессиональное, территориальное, временное, …), тем больше шансов на возникновение внутреннего диалекта.

Для обучения важно взаимодействие. Или наличие другого контекста. Обучение 1 к 1 в виде словарного заучивания (up это вверх, собака это dog) дает некоторую степень соответствия понятий, но оно все равно нуждается в шлифовке (hot-dog это не горячая собака, а time is up не время вверху).

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

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


понедельник, 5 декабря 2011 г.

Рабы собственных предрассудков

Фрагмент из книги Джона Лерер «Как мы принимаем решения». Этот фрагмент не про политику и не про веру, а про ошибки человеческого мозга и о механизмах, заложенных в фундаменте нашего мышления.

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

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


воскресенье, 4 декабря 2011 г.

Джона Лерер — Как мы принимаем решения

Прочитал книгу Джона Лерер «Как мы принимаем решения». Долго сначала искал в сети, и в конце концов заказал.

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

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

А далее отдельные моменты и их описание.

Интуитивная и образная основа нашей психики

Человеческое сознание изначально оперирует понятиями и интуитивным аппаратом предсказания. Это его базовая основа, аппаратный уровень, native-машина. То мышление, которое мы называем логическим, рациональным, конкретным, математическим — не встроено в инстинктивную/биологическую основу. Это мышление было приобретено в результате социально-психической эволюции. То есть, есть факторы, которые влияют на это (что кто-то генетически лучше понимает логику/рационализм и пр.), но в любом случае это верхний слой над абстрактным мышлением. И у человека не может быть чисто рационального мышления, и нет жесткого разделения на мышление точное и гуманитарное.

Обучение на эмоциях и принятие решений

Существует с давних времен такое разделение мышления/сознания, как рационализм и эмпиризм (разум/чувства, Бэкон vs Декарт). И до сих пор существует значительное число мнений и людей, которые склоняются к одной из крайностей.

В философии это противоречие разрешил Кант своим трансцендентализмом. В кибернетике по-своему это разрешается, когда вводится две различные машины — прямая и обратная — одна из которых ставит задачи, а вторая решает.

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

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

Влияние на поведение и обучение степени развития мозга

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

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

Дисциплина и оперативная память в решении проблемы

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

Второй важный фактор — наличие большей оперативной памяти. То есть, количество единиц информации, которой манипулирует человек при решении.

Эффект Плацебо

Многие знают об эффекте Плацебо в медицинской практике. Но данный эффект имеет более широкую область действия и основан на природе нашего мозга. Эффект заключается в том, что префронтальная кора коррелирует эмоции в соответствии с нашим ожиданием. На любом уровне. Например дорогие вещи кажутся более качественными. Хорошие отзывы автоматически меняют мнение, вне зависимости от обоснованности. Поэтому интуитивно товар надо оценивать до того, как увидели цену. Если увидели слово «скидка!», то это автоматический сигнал мозгу что надо непременно купить. И этот автоматизм должен быть учтен в решении.

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

Плюрализм и уверенность мозга

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

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

То есть, для однозначного действия нужно выбрать какое-либо решение, иначе сложно будет действовать. Для выбора решения нужен обратный процесс — перевод в состояние неуверенности, вызов внутреннего спора внутри мозга.


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

И, естественно, это далеко не все, что есть в книге.


суббота, 3 декабря 2011 г.

Overfitting и Underfitting

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

Общая идея

Допустим, у нас есть выборка из 5-ти элементов. И на основании их нужно построить интерполяцию, позволяющую предсказать значения в точках, отличных от известных. Например мы будем использовать нижеописанную выборку, и попробуем найти 3 функции (простая линейная, средней сложности парабола, и функция 4-й степени, проходящая через все 5 точек):

Первая функция линейная, — она простая, но имеет значительную погрешность.

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

Третья функция точно проходит через все точки, но ужасно работает вне рассматриваемых точек.

Получается, что сложность, которая нужна в поставленной задаче имеет какой-то наиболее эффективный участок. Линейная функция имеет малую точность, и недостаток этой сложности и есть Underfitting. Результат плохо работает по сравнению с большей сложностью.

Третья функция имеет слишком высокую сложность — Overfitting. Она слишком хорошо работает на обученных примерах и ужасно работает на примерах, которые находятся вне обучения.

Если рассмотреть то же самое явление на плоскости (что возможно более наглядно), то оно имеет вид:

Идея в понятиях

Если мы очень жестко определяем понятие, то рискуем нарваться на Overfitting. Если определение слишком слабое, то можем получить Underfitting.

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

Поэтому если мы строим понятия на примерах, то важно не только учесть все актуальные моменты, но и определить понятие так, чтобы с ним можно было работать с каким-то запасом прочности.

Иногда въедливость вида «было названы примеры только A,B,C и D, а значит, никаких E, даже если оно очень похоже!» является результатом такого вот Overfitting'a. Или слишком сильное обобщение — результат Underfitting'a («мне разрешили есть сыр, а это молочный продукт, поэтому мне можно пить молоко, и даже есть молочный шоколад!»).

Если мы хотим уменьшить вероятность ошибки при выборе положительного результата, то мы можем взять понятие, которое имеет свойство большего Overfitting'a. Если хотим более наверняка захватывать все искомые понятия, то лучше взять более сильное по Underfitting. Например, если мы смотрим на неопознанный летающий объект, и при этом это может быть как свой, так и чужой, то в боевой обстановке может быть более рационально сбивать все, что более-менее похоже на врага, а если мирное время, то лучше сбивать только если это известно более утвердительно, так как лучше снизить риск сбить гражданский объект.


пятница, 2 декабря 2011 г.

Понятия и определения

Продолжение выводов из предыдущего поста.

Представление понятия в кибернетических системах

Если посмотреть на предыдущие изображения,

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

Данная разность в системе не создает особых проблем. Для большинства вариантов общения роботам достаточно представленных понятий. И, если происходит конфликт (например в какой-то точке кто-то считает rije, а кто-то pize), то каким-либо образом разрешается противоречие и картины за счёт самообучения корректируются и сближаются. Хотя, как посмотрим далее, конфликта может и совсем не быть.

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

Возникновение понятий на неизвестном поле

Если сталкиваемся с обширным неизвестным полем для изучения (это может быть географическая местность; куча результатов экспериментов в физике; неизвестный программный комплекс; непонятное поведение зверюшек; и пр.), то на этом поле у нас отсутствуют какие-либо понятия. Тогда мозг включает очень мощный аппарат для классификации происходящего. Это может быть классификация по признакам (река, лес, поле в географии; быстро/медленно бегает зверюшка; резкие всплески выходных параметров эксперимента; …), классификация исходя из потребностей (топать туда где есть вода; ловить жирных зверюшек на охоте; выделять те результаты, которые дают наибольший энергетический эффект; выделять узкие точки программного комплекса) или классификация на ровном месте (для того, чтобы разобраться). Но в любом случае даже в отсутствие строгих определений на основе примеров легко и быстро определяются новые понятия, которыми можно оперировать.

Человеческий мозг — это очень мощная система для решения задач подобного типа. Порядка 1011 нейронов с 1014 синапсами, постоянно работающих в синхронном комплексе. То есть, например, если есть набор примеров с результатом 1 и с результатом 0,

 

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

Именно тогда, когда в сознании появляется подобная обобщающая функция, то это приводит к состоянию «Понял!» или «Эврика!».

Существование понятий без строгого определения

Если кто-то часто слышит о понятии X или даже пытается им оперировать, то понятие существует на основе натренированных примеров. При этом для понятия не требуется строгого определения.

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

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

Иллюстрация:

Где имеем множество положительных и отрицательных примеров (с которыми все согласны; или на которых шло обучение). Обобщающая функция, которая была создана A, и обобщающая функция, которая была создана B. Функции разные (и это естественно) и решения разные, и оба решения подходят. Но как только появляются конфликтные примеры — необходимо уточнять то понятие, которым идет оперирование.

Само же понимание такого механизма сводит на нет многие споры и позволяет упорядочить мыслительные процессы. Если мы имеем понятие X, то у A оно будет как A(X), а у B — B(X). Если в контексте задачи A(X) и B(X) не конфликтуют, то приводить их к общему базису необязательно. Если конфликтуют, то можно решить, стоит оно того (приевдение) или нет.


четверг, 1 декабря 2011 г.

Возникновение естественных языков

Прохождение курса Machine Learning нанесло свой отпечаток, наложившись на известную информацию… В результате несколько статей.

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

Machine Learning

В двух словах. ML представляет собой один из обширных подразделов кибернетики, занимающийся вопросами машинного обучения. То есть, набор техник, алгоритмов и приемов, позволяющих создавать такие системы, которые можно обучить (или которые сами могут себя обучить) и в дальнейшем на основе обучения решать какие-либо задачи. Например обучиться на кликах пользователя спам/не спам и отсеивать спам и не спам. Сортировать галактики по различным классам, сами определяя данные классы и вычленяя особенные. Обучиться распознавать буквы-цифры с помощью нейронных сетей. Исходя из истории работы БД соптимизировать её параметры работы в дальнейшем. Прогнозировать цены на рынке. И мн.др..

Пример возникновения искусственного языка

Рассматриваемая статья — о роботах, которые сами придумали себе язык для общения.

После форвардинга данной новости о её значимости откликнулось несколько человек. Сейчас попробуем эту значимость раскрыть.

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

Суть эксперимента

Было собрано несколько роботов, которые обладали неким обучающим себя поведением. Изначально в их конструкции имелся только алгоритм поведения, а факт обучения равен нулю. То есть, языковые конструкции как таковые изначально отсутствовали.

Далее роботы начали жить своей жизнью. В которой они общались между собой и закрепляли какое-либо поведение. Такое закрепление можно организовывать через любую обратную связь — подкрепление положительным/отрицательным стимулом, фиксация внешних событий и построение связей, присвоение признаков к какому-либо поведению и др..

В процессе происходило приблизительно следующее. Робот говорил случайную фразу F и ехал в точку А. Другой робот видел, что тот, кто сказал F, поехал в точку А. И закреплял связь между сказанной фразой F и точкой А. Далее если он хотел как-то ассоциировать действие с точкой А, он говорил это фразой F, или если это не подходило к фразе F, то говорил что-то другое.

В результате такого общения у них появился свой словарь. Например такой:

Здесь области для слов двух разных роботов. В словаре пять слов, с каждым из которых ассоциирована своя область. Кроме того, имеются слова, ассоциированные с направлениями:

Результаты

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