Хабрахабр

[Из песочницы] Мета-кластеризация с минимизацией ошибки, и почему я думаю, что так работает мозг

Привет всем! Хочу поделиться с Вами своей идеей машинного обучения.

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

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

Что я не знаю о нейронах

Есть несколько вопросов, на которые я не нашел однозначных ответов в популярной литературе;

  • Очевидно, нейрон как-то реагирует на нейромедиаторы, но как именно? Простое предположение, что чем больше нейромедиатора тем чаще спайки, очевидно не выдерживает никакой критики. Если бы было так, то срабатывание одного нейрона вызывало бы срабатывание нескольких соседей, те следующих, и через короткое время эта лавина захватила бы весь мозг. Но на самом деле этого не происходит, одновременно в мозге работает только небольшая часть нейронов. Почему?
  • Очевидно, что нейтроны являются единицами памяти, но как они хранят информацию? Центральная часть нейрона не представляет собой ничего особенного: ядро митохондрии и тому подобное. Аксон на спайк влиять не может, поскольку информация идет только в одну сторону, от ядра. Значит единственное что остается это дендриты. Но как в них хранится информация? В аналоговой или цифровой форме?
  • Очевидно, что нейроны как-то обучаются. Но как именно? Допустим, что дендриты растут в тех местах, где нейромедиатора было много непосредственно перед спайком. Но если это так, то сработавший нейрон немножко вырастет и в следующий раз когда появится нейромедиатор он будет самый толстый среди соседей, впитает больше всех нейромедиатора и снова сработает. И снова немножко подрастет. И так до бесконечности, пока не задушит всех своих соседей? Что-то тут не так?
  • Если один нейрон растет, то соседние должны уменьшатся, голова-то не резиновая. Что-то должно побуждать нейрон усыхать. Что?

Просто кластеризация

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

Посмотрим, что нам нужно, чтобы реализовать алгоритм кластеризации.

  • Центры кластеров, конечно же это дендриты нейронов нашей группы. Но как запомнить информацию? Предположим, что элементарной ячейкой хранения информации в дендрите является объем веточки дендрита в области синапса. Чем веточка толще, соответственно больше её объем, тем большее значение сохранена. Таким образом каждый дендрит может запомнить несколько аналоговых величин.
  • Компараторы, позволяющие вычислить близость примера. Тут посложнее. Предположим, что после подачи данных (аксоны выбросили нейромедиатор) каждый нейрон сработает тем быстрее, чем более сохраненные данные (центр кластера) похожи на поданный пример (количество нейромедиаторов). Обратите внимание, на скорость срабатывания нейрона влияет не абсолютное количество нейромедиатора, а именно близость количества нейромедиатора к сохраненным в дендритах значению. Предположим, что если нейромедиатора мало, то дендрит не дает команду на спайк. Ничего не происходит и если нейромедиатора много, спайк дендритной веточки происходит раньше чем у других дендритной веточек и не доходит до ядра. А вот если нейромедиатора в самый раз, тогда все дендритные веточки дадут мини-спайк примерно одновременно, и эта волна превратится в спайк нейрона, который пойдет по аксону.
  • Многовходовый компаратор позволяет сравнить результаты и выбрать лучший. Предположим, что находящиеся рядом нейроны обладают тормозящим действием на всех своих соседей. Так, в некоторой группе нейронов, активным в каждый момент времени может являться только один. Именно тот, который сработал первым. Поскольку нейроны в группе находятся рядом, они имеют одинаковый доступ ко всем аксонам приходящим к этой группе. Таким образом в группе сработает тот нейрон, у которого запомненная информация наиболее близка к рассматриваемому примеру.
  • Механизм смещения центра в сторону примера. Ну тут все просто. После спайка нейрона, все дендриты этого нейрона меняют свой объем. Там где концентрация нейромедиатора была слишком большой, веточки растут. Там где была недостаточной, веточки уменьшаются. Там где концентрация в самый раз, объем не меняется. Объемы веточек меняются по чуть-чуть. Но сразу. Следующий спайк — следующее изменение.

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

А вот MNIST:

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

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

Назовем их “ВКУСНО” и “СТРАШНО”. Приведу пример: Допустим в группе кластеризаторе есть только два нейрона. Для этого нам нужен учитель. Чтобы позволить мозгу принимать решение, нужно только к первому подсоединить нейрон “КУШАТЬ”, а ко второму “УБЕГАТЬ”. Но сейчас не об этом, обучение с учителем тема для другой статьи.

Крайний случай — количество кластеров равное количеству примеров. Если увеличивать количество кластеров, то точность будет постепенно расти. Нужно постоянно идти на компромисс, либо точность либо размер мозга. Но есть проблема, количество нейронов в мозге ограничено.

Мета-кластеризация

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

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

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

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

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

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

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

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

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

Попробуем подавать на вход сдвоенные цифры, не наложенные друг на друга, а расположенные рядом, вот такие (это один пример, а не два):

image

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

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

А процесс формирования масок мета-кластеризацией. Я называю полученные маски мета-кластерами. Потому, что происходит кластеризация не входных примеров, а самих входов. Почему мета?

Попробуем разделить 25 параметров на 5 мета-кластеров. Пример посложнее.

Для этого возьмем пять групп по пять параметров, закодированные унитарным кодом.

В каждом подаваемом примере всегда пять единиц. То есть в каждой группе одна и только одна единица на случайном месте.

Сами кластеры не показаны. На картинках ниже каждый столбец это входной параметр, а каждая строка это маска мета-кластера.

100 параметров и 10 мета-кластеров:

Работает! Местами, даже немного напоминает изображение матрицы из одноименного фильма.

Применяя мета-кластеризацию можно радикально снизить количество кластеров.

Например, возьмем десять групп по десять параметров, в каждой группе одна единица.

Если у нас один кластеризатор (нет мета-кластеров), то нам нужно 1010 = 10000000000 кластеров, чтобы получить нулевую ошибку.

Это похоже на десятичную систему счисления, не нужно придумывать обозначения для всех возможных чисел, можно обойтись десятью цифрами. А если у нас десять кластеризаторов, то нужно всего 10 * 10 = 100 кластеров.

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

Как это работает в мозге

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

Добавим к описанию работы дендритов, приведенному выше, еще одну функцию.

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

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

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

Заключение

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

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

После мета-кластеризации имеем три активных нейрона в трех мета-кластерах. Представьте, мозг видит что-то маленькое, СЕРЕНЬКОЕ, которое бежит. Потом, мозг видит что-то маленькое, СИНЕНЬКОЕ, которое бежит. И благодаря воспоминанию, мозг знает, что это вкусно. Достаточно временно отключить мета-кластер, где находятся цвета, и останется только маленькое, которое бежит. Но мозг не знает, вкусно это или страшно. Это называется аналогия. А мозг знает это это вкусно.

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

Спасибо за внимание, код здесь.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть