- PVSM.RU - https://www.pvsm.ru -
Привет всем! Хочу поделиться с Вами своей идеей машинного обучения.
Большие достижения в области машинного обучения, впечатляют. Сверточные сети и LSTM это круто. Но почти все современные технологии основаны на обратном распространении ошибки. На основе этого метода вряд ли получится построить думающую машину. Нейронные сети получаются чем-то вроде замороженного , обученного раз и навсегда, неспособным меняться размышлять.
Я подумал, почему бы не попробовать создать что-то похожее на живой
Есть несколько вопросов, на которые я не нашел однозначных ответов в популярной литературе;
Правдоподобным ответом на все эти вопросы мне представляется то, что
Посмотрим, что нам нужно, чтобы реализовать алгоритм кластеризации.
Проверим получившийся алгоритм на практике. Я набросал несколько строчек на Питоне. Вот что получается с двумя измерениями из случайных чисел:

А вот MNIST:

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

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

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

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

Случайным будет только одно, выберет ли первая маска левую цифру или правую.
Я называю полученные маски мета-кластерами. А процесс формирования масок мета-кластеризацией. Почему мета? Потому, что происходит кластеризация не входных примеров, а самих входов.
Пример посложнее. Попробуем разделить 25 параметров на 5 мета-кластеров.
Для этого возьмем пять групп по пять параметров, закодированные унитарным кодом.
То есть в каждой группе одна и только одна единица на случайном месте. В каждом подаваемом примере всегда пять единиц.
На картинках ниже каждый столбец это входной параметр, а каждая строка это маска мета-кластера. Сами кластеры не показаны.

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

Работает! Местами, даже немного напоминает изображение матрицы из одноименного фильма.
Применяя мета-кластеризацию можно радикально снизить количество кластеров.
Например, возьмем десять групп по десять параметров, в каждой группе одна единица.
Если у нас один кластеризатор (нет мета-кластеров), то нам нужно 1010 = 10000000000 кластеров, чтобы получить нулевую ошибку.
А если у нас десять кластеризаторов, то нужно всего 10 * 10 = 100 кластеров. Это похоже на десятичную систему счисления, не нужно придумывать обозначения для всех возможных чисел, можно обойтись десятью цифрами.
Мета-кластеризация очень хорошо распараллеливается. Самые затратные вычисления (сравнение примера с центром кластера) можно выполнять независимо для каждого кластера. Обратите внимание, не для кластеризатора, а для кластера.
До этого я говорил только о дендритах, но у нейронов есть аксоны. Причем они тоже учатся. Так вот, очень похоже, что аксоны это и есть маски мета-кластеров.
Добавим к описанию работы дендритов, приведенному выше, еще одну функцию.
Предположим, что если происходит спайк нейрона, все дендриты как-то выбрасывают в синапс какое-то вещество, показывающее концентрацию нейромедиатора в дендрите. Не из аксона в дендрит, а обратно. Концентрация этого вещества зависит от ошибки сравнения. Пусть, чем ошибка меньше, тем большее количество вещества выбрасывается. Ну и аксон реагирует на количество этого вещества и растет. А если вещества мало, что означает большую ошибку, то аксон постепенно уменьшается.
И если так изменять аксоны с самого рождения
Пример: пусть нужно запоминать человеческие лица. Пусть каждое лицо изображено с помощью мегапиксельного изображения. Тогда для каждого лица нужен нейрон с миллионом дендритов, что нереально. А теперь разделим все пиксели на мета-кластеры, такие как глаза, нос, уши и так далее. Всего десять таких мета-кластеров. Пусть в каждом мета-кластере будет десять кластеров, десять вариантов носа, десять вариантов ушей и так для всего. Теперь, чтобы запомнить лицо, достаточно нейрона с десятью дендритами. Это снижает объем памяти (ну и объем
А теперь, если допустить, что
Кластеры необходимо постоянно обучать, иначе новые данные, не будут правильно обрабатываться. Для обучения кластеров в
Представьте,
Допустим,
Спасибо за внимание, код здесь [5].
Автор: ivalnic
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/mozg-2/296720
Ссылки в тексте:
[1] мозга: http://www.braintools.ru
[2] сон: https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BD
[3] аналогия: https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F
[4] воображение: https://ru.wikipedia.org/wiki/%D0%92%D0%BE%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
[5] здесь: https://github.com/ivalnic/E2mc
[6] Источник: https://habr.com/post/427407/?utm_campaign=427407
Нажмите здесь для печати.