Pull to refresh

Comments 49

Респект автору за перевод! Тема важная и интересная!
Спасибо. ) Я хотел всю перевести, но понял, что не осилю. Там дальше уже много такого, что лучше все-таки в оригинале смотреть/читать.

Надо добавить, что описанный в статье подход World Models был один из первых примеров обучения в воображении. Если кто не понял из описания, там картинка переводится автоэнкодером в сжатое состояние из нескольких цифр, отдельная RNN делает прогноз на несколько ходов из этих сжатых представлений (а не из целых картинок, как делалось раньше). И отдельный контроллер, обученный вообще без всяких нейросетей эволюционным алгоритмом, выдает оптимальные действия. Все это позволяет делать прогоны чисто в сжатых векторах, и тем самым учиться как бы в воображении, на базе модели мира world model, что ускоряет расчеты.


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


Но этот подход, обучение на воображаемых world models, за прошедшее время с публикации этой первой работы, получил дальнейшее развитие. Можно порекомендовать почитать про PlaNet, где устранены большинство этих недостатков. Но лучше сразу переходить к последнему Dreamer https://ai.googleblog.com/2020/03/introducing-dreamer-scalable.html. Если коротко, в нем тоже обучение делается по сжатым последовательностям (т.е. "в воображении"), но сами сжатые представления картинок генерируются улучшенным способом, чтобы в них отражать важные для решения задачи нюансы.


А главное, вместо простенького крохотного эволюционного контроллера, здесь оптимальные действия выдает полноценая нейросеть. Поэтому она может делать очень сложные вещи. И, что ещё важнее, в отличие от предыдущего PlaNet и от обычных Model-Based методов, в Deamer она обучается с помощью backpropagation награды прямо по сжатой последовательности.


Все это позволяет иметь очень длинные горизонты планирования (до тысяч шагов), обучается очень быстро, в 20 раз быстрее, чем Actor-Critic архитектуры вроде A3C (благодаря работе со сжатыми векторами), ну и результат в целом очень хорош. Особенно для симуляции движений.



Так что если кто-то интересуется model-based обучением с подкреплением, то это довольно важная веха. Там много хороших вещей в концептуальном плане (в смысле, многое похоже на то как это происходит в живом мозге), поэтому имеет смысл ознакомиться. Исходники Dreamer тоже есть: https://github.com/danijar/dreamer

Спасибо большое за дополнение!
Узким местом алгоритмов RL является проблема распределения подкрепления или проблема обратной связи (англ: CAP, credit assignment problem)
Кто-нибудь пробовал использовать подход мозга, где подкрепление происходит только в моменты превышения интегральной реальной награды над интегральной предсказанной?
* опираюсь на эти данные www.youtube.com/watch?v=5L0O_H7VPOE

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


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


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


Для постепенного изменения весов абсолютная награда с точки зрения распространения градиента не так важна, как ее изменение. Вот и приходится в качестве этого числа, на которое будет умножен (т.е. изменен) вес, либо использовать разницу между реальной наградой и средней, накопленной за некий период (это было первое усовершенствование policy gradient, использовавшего награду напрямую). Здесь средняя награда используется в качестве замены для ожидаемой. Либо, что оказалось еще лучше, использовать разницу между ожидаемой наградой и реальной. Но это уже когда появились архитектуры актер-критик, где есть нейросеть, которая предсказывает награду, а не просто использует для своего обучения готовую интегральную награду из нескольких будущих шагов, как было в Q-learning или ранних policy gradient. Хотя и для старых policy gradient вроде есть аналог такого Advantage, определяемый через высчитываемые значения Q и V. То есть используя будущую награду с учетом текущего action или без него, только на основе текущего state.

опираюсь на эти данные www.youtube.com/watch?v=5L0O_H7VPOE

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


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


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


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


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

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

И ещё несколько важных моментов, следующих из лекции и моих мыслей.

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

Колонка — это независимая структура (микро-ядро), обучающаяся без учителя, и включаемая/выключаемая ганглией через рубильник-таламус. Награда не оказывает влияния на колонку и её обучение. Награда только определяет включить или нет соответствующую колонку для обработки текущих «данных». То есть, RL есть только для базальных ганглиев. Они обучаются, как сказал Шумский, тому, какие в данный момент допустимы мысли. Скорее всего до коры и колонок они же сами их и заменяли, давали случайное распределение активности, которое корректировалось внешней средой посредством награды. А колонка позволила им (ганглиям) вместо случайной активности стать детекторами, что видимо хорошо сказалось на сложности поведения.

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

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

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

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

Не-не, там в самой лекции на 28:08 было сказано, что кора неокортекса практически линейно проецируется на таламус. Мол, таламус поэтому называют седьмым слоем коры. Сначала у рептилий появился таламус и он выполнял все функции по мышлению (совместно с базальными ганглиями), а потом у млекопитающих неокортекс развился как расширение памяти для таламуса. Увеличенный детектор паттернов. Но вместе с механизмом концентрации, управляемым из ганглий (которые обучены с подкреплением) и рекуррентными связями, это получился не просто детектор, в нем происходит и длительное логическое мышление. Количество переросло в качество. Но до этого все аналогичные (упрощенные) процессы у рептилий происходили в таламусе. Поэтому таламус и некортекс так синхронно работают в паре на частоте 40 Гц (см. 28:27 ). Таламус у млекопитающих все передает в кору, чтобы просто получить от нее улучшенный детекторный ответ.


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


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


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

Ну, вообще-то не совсем. В лекции эта тема просто мало раскрыта. При превышении реальной награды над ожидаемой это только при начальном обучении. А после сформированного рефлекса основной всплеск дофамина делается только при ожидании награды (см. раздел "Эксперимент Шульца на обезьяне" в википедии ). А еще система наказания, т.е. отрицательного подкрепления, в мозге тоже существует. Как минимум, при неудаче впрыскивается гормон стресса кортизол, а при опасности еще и адреналин, а при готовом решении действовать (вариант "бей" вместо "беги") дополнительно норадреналин. Там сложная система. Есть какие-то сведения, что дофамин участвует и при отрицательном опыте, просто по другим путям: статья из Наука и Жизнь. Обсуждаемая видеолекция все же сильно упрощенная версия, особо больших выводов о работе мозга по ней делать не стоит...

Не-не, там в самой лекции на 28:08 было сказано, что кора неокортекса практически линейно проецируется на таламус.
Таламус у млекопитающих все передает в кору, чтобы просто получить от нее улучшенный детекторный ответ.
Согласен, я упустил этот момент: «Все сигналы из внешнего мира идут в кору через таламус». Но как и у ящеров этими обособленными структурами таламуса управляет стриатум по типу вкл/выкл (https://youtu.be/5L0O_H7VPOE?t=2076).

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

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

И ради интереса на скорую руку набросал модель такой работы мозга ящера, без коры (как я себе это представляю). Каждое ядро таламуса я спроецировал в «моторную функцию»: +1, +2,… +9. Задача таламуса создать такой минимальный паттерн своей активности, чтобы сумма чисел стала равна числу, которое я загадал (я выступаю внешней средой и даю оценку).

Например, для загаданного числа 15, правильный паттерн может быть таким:
0,0,1,1,0,0,0,1,0
что соответствует выбору чисел:
3, 4, 8
дающих в сумме число 15.

Удивительно, но алгоритм подбирает паттерн за несколько шагов, при том что полный перебор равен 2^10. Согласно лекции теперь мозжечку надо было бы связать подобранный паттерн с числом 15 и в следующий раз просто достать его из памяти.

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

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

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

Могли бы дать ссылку?
Интересный материал. Но я так и не понял основную идею. Он там сразу после основной лекции критикует теорию конектома, что дескать там ничего не предлагают. НУ а сам-то он что предлагает? Какой практический смысл идеи с контекстом? В лекции Шумского хоть прямое сравнение коры головного мозга с картой Кохонена, а у Редозубова в чем суть контекстов?

Вот вы говорите, что быстренько «накидали» и оно «работает»… Я не вполне понимаю что именно работает, и в каком, прости господи, контексте? ;)

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

Вот вы говорите, что быстренько «накидали» и оно «работает»… Я не вполне понимаю что именно работает, и в каком, прости господи, контексте? ;)
Слово «контекст», которое у него везде повторяется, оно для тех, кто хорошо знает материал. Это некое вычислительное ядро. Ядра имеют общую память. То, что в неё записало одно ядро, могут прочесть все остальные ядра. Если знакомы с GPU, то это аналогия с шейдерами.

А преимущество в том, что если одно ядро (а их может быть хоть тысячи/миллионы) научилось распознавать букву «A» в одном единственном месте на картинке, то автоматически эта буква без дополнительного обучения теперь будет узнаваться в любом другом положении. То есть, обучение с единственного представления (One-shot learning), как у животных, а не посредством обучения на датасете с миллионами примеров.

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

HELLO_______________ - единственная входная строка для обучения

последующие распознанные строки:
_HELLO______________
__HELLO_____________
___HELLO____________
...
_______________HELLO

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

Редозубов настаивает, что кора работает именно в таком виде. Я так не считаю, но профит из этого алгоритма вынести можно.
>>>> Слово «контекст», которое у него везде повторяется, оно для тех, кто хорошо знает материал. Это некое вычислительное ядро. Ядра имеют общую память. То, что в неё записало одно ядро, могут прочесть все остальные ядра. Если знакомы с GPU, то это аналогия с шейдерами.

Чем это принципиально отличается от принципа работы сверточных сетей? Такой де подход использовался еще в «дотензорной» эре — в каскадах Хаара, операторах Собеля и прочих CV-технологиях.

>>>А преимущество в том, что если одно ядро (а их может быть хоть тысячи/миллионы) научилось распознавать букву «A» в одном единственном месте на картинке, то автоматически эта буква без дополнительного обучения теперь будет узнаваться в любом другом положении.

Ядра свертки так же проходят по всей «картинке». Инвариантно как минимум к положению…

>>>То есть, обучение с единственного представления (One-shot learning), как у животных, а не посредством обучения на датасете с миллионами примеров.

Вот! Я вот этого не понимаю! За счет чего? сверточная сеть тренируется методом обратного распространения ошибки и там эти «ядра» образуются естественным образом, как важные признаки изображения… А вот как формируются контексты у Редозубова — я пока не догоняю. Да еще и One-shot…

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

А можно подробнее? :) Я, правда, тот еще «специалист»… Вы не подумайте — я не пытаюсь подловить или что-то такое — я понять идею хочу. Даже не алгоритм детально, а саму идею. Что значит «демонстрировал ядрам»? Что в данном случае — «ядра»? архитектурно?
Чем это принципиально отличается от принципа работы сверточных сетей? Такой де подход использовался еще в «дотензорной» эре — в каскадах Хаара, операторах Собеля и прочих CV-технологиях.
Вот здесь проблема с объяснением. Я сам долго не понимал. Вот попытка Редозубова объяснить разницу для buriy youtu.be/mcFOl-TKheM?t=6299.

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

Вот! Я вот этого не понимаю! За счет чего?
Контексты формируются также обучением. В последней статье из цикла есть объяснение как. Но формально никто не запрещает применять другие методы. Сам хочу попробовать ГА и тот свой недавний метод. А one-shot получается за счёт того, что обучали например «на кошках», а используем для распознавания собак.
Я всё равно так и не понял :) Надо будет ещё пообщаться. Особенно по механизмам обновления информации для такого «мультипоиска» в коре, тут мне вообще ничего не понятно пока. То есть, пока эта информация на уровне «можно сделать так», но не «сделано так» и тем более «сделать можно только так». Ощутите разницу. (Гипотеза vs Факт vs Инженерия.)
А по конкретным фактам:
Одна свёртка — сворачивает до одного значения, но 64 фильтров свёртки — сворачивают уже в 64 значения.
Колонка тоже обозревает некоторую область, а «весь слой» получается только за счёт отображения слоя на область колонки через автоэнкодеры, но это, исходя из модели Алексея, просто преобразование — вроде как вычисление хеша (LSH, но можно и обычные хеши рассматривать) от другого значения.
Такое хеширование в целом не увеличивает качество (на небольших моделях, на больших — дискуссионный вопрос).
Так что отличий в этом плане нет.
То, что в нейросети есть «пирамидка» — это просто деталь реализации, которая присутствует и в мозге, т.к. V1 крупнее, чем V2, а V2 крупнее V4. При попытке отловить один конкретный признак (скажем, движение определённого мускула) на выходе, мы всё равно к такой пирамидке придём.
А то, что фильтры дублируются в нейросети в разных положениях — тоже особенность реализации. Возможно, как раз этот LSH обеспечивает лучшую защиту от попыток обмануть нейросеть — т.е. это метод ансамблирования, ну и ещё небольшого дополнительного перебора для более простых случаев в верхних зонах коры. Но в целом вклад лишних (уникальных для каждой колонки) изоморфных преобразований в качество на уровнях V1 и V2 пока что необоснован, хотя и понятно, что если бы можно было в мозгу сделать без него, то сделали бы без него. На компьютере в миллион раз быстрее считать с дублированием, поэтому так сделали.
А внутренний общий SDR из 1-7 объектов на каждой зоне — успешно моделируется сейчас с помощью embeddings или даже embeddings + attention.
Колонка тоже обозревает некоторую область
Я тоже об это спотыкался до схемы на бумаге. Как и ядро в Энигме, она обозревает весь вход полностью. Вот что значит — «лучше один раз увидеть, чем сто раз услышать». )

У Алексея LSH там нет (* это я из LSH пирамиду леплю).

По поводу макс 7 объектов у меня есть более простое объяснение. Мозг работает с низко-разряжённым представлением. Семь сложений разных описаний — это предел, после него получается «каша из бит», множественная интерференция описаний.
>>> Как и ядро в Энигме, она обозревает весь вход полностью.

Картинка с Энигмой красивая, но оторванная от реальности. Энигма — линейное преобразование, с сохранением размерности. У Редозубова Колонка/Контекст — этакая «волшебная» система, способная преобразовать любое входящее значение в хеш, сопоставляемый с внутренней памятью. Причем такой, что какая бы не была входная информация — на выходе хеш будет «одного формата», пригодный для узнавания…

Не — это круто, но есть какая-то реализация подобного? git там, или еще что-то рабочее? Или это классический "мыши, вы меня не грузите — я стратегией занимаюсь"
Энигма — линейное преобразование, с сохранением размерности.
Не понимаю где вы с buriy видите хеш. Ведь я писал же, и это видно в примере — размерность не меняется.

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

Не, ну может «хеш» в данном случае не вполне верное определение? Допускаю… А почему?
Вы говорите про последующий уровень обработки. Прежде чем связать в единый образ представления объекта в разных модальностях, его необходимо в них распознать. Отдельная модель под каждую модальность. И выход с них уже можно ассоциативно связывать.
Отдельная модель под каждую модальность.

Что вы понимаете под моделью?
Массив контекстных ядер. Отдельные массивы под обработку картинки, звука и т.д.
Объясняю:
Код на входе у Алексея формируется через преобразование сигналов из других зон. Преобразование этих сигналов напоминает LSH. Лучше дам ссылку: medium.com/@jaiyamsharma/efficient-nearest-neighbors-inspired-by-the-fruit-fly-brain-6ef8fed416ee
Да и преобразование внутри зоны построено по принципу этого же LSH.
А ещё, если мы считаем, что вход прошлой зоны обладал низкой размерностью, то он будет расширен до большой размерности… волновыми паттернами по модели того же самого LSH ( habr.com/ru/post/308370 ).
Вот откуда там хеши: по сути, хеш сидит и хешем погоняет. Если нет обратного распространения ошибки, то «динамический резонанс» (взаимное отображение зон коры друг на друга) можно сделать лишь с помощью LSH-хешей.
Я обсуждаю здесь только работу к.ядер, а не всю модель мозга. Сам Алексей нигде не упоминает хеш в к.ядрах. Да, он может использоваться в подготовке кода для контекстных ядер. Но в самих ядрах (см. код ниже) хеша нет. Также его нет и в процессе обучения (можете посмотреть исходники его демки). То, что хеша полно за пределами к.ядер — согласен.
Ваш код не соответствует идее Алексея. У вас нет случайных подпространств размерностью 20 из пространства размерности 1000000. Там и вылезают хеши, кодирующие эти подпространства.
Кстати, гуглится это по ключевым словам «random projections» (in neural networks)), и в целом, это кое-где применяется, особенно там, где random projections дёшево делать. Если же их делать дорого, то смысла в них нет (гуглить quantization & pruning methods for neural networks )
Ваш код не соответствует идее Алексея
Функция преобразования может быть задана любым способом. Идея Алексея, что её можно получить «обучением» на комбинаторном пространстве (тогда она будет задана таблично). Вы можете прояснить этот момент на следующем вебинаре.

У вас нет случайных подпространств размерностью 20 из пространства размерности 1000000.
Ну это смешно, упрекать в том, что для наглядности выбран пример с малой размерностью (160). Вот четыре года назад был пример с распознаванием номеров. Там тоже не «обучали» функции (сдвига, поворота, масштаба), а задали их самостоятельно, получив в итоге не 20, как в демке, а 700 тыс гипотез. Такого масштаба пример подойдёт(?).
Нет, дело не в размере, дело в том, что у вас в вашем маленьком пространстве не было случайных подвыборок.
Поэтому же в примере с распознаванием номеров была не модель Алексея, а модель Васи.
Это разные модели. Нет случайных подвыборок — нет LSH, это другая модель, это просто обычные свёрточные нейросети.
Есть случайные подвыборки (random projections) и механизм обучения, как у мухи — это опять другая модель (в нейросетях определённый механизм обучения).
Вы их сливаете вместе, притом, что у этих моделей совершенно разные свойства и разные ограничения. Модель мухи не выучит никогда качество >70% на одном слое, а нейросеть — выучит почти 90% на одном слое. Нейросети отлично стакаются, но когда целевая функция шумит, то это преимущество исчезает.
в примере с распознаванием номеров была не модель Алексея, а модель Васи
«Его/не_его» — это всё частные мнения. Вы решили, что без специфического обучения на комбинаторном пространстве — это не модель Редозубова. Ок. Такого же ли мнения он сам мне, например, неизвестно, так как обратная связь с автором и его разработчиками отсутствует.
>Вы решили, что без специфического обучения на комбинаторном пространстве — это не модель Редозубова.
Именно так. А иначе там тысяча разных моделей, и смысл их все сразу обсуждать не очень понятен.
Вы вполне можете с Алексеем пообщаться, я с ним общался неоднократно.
>>>Я всё равно так и не понял

Я не достаточно специалист в вопросе, что бы реально судить, но пока у меня сложилось негативное общее впечатление… Я стараюсь с ним бороться, потому, что вижу людей, которые разбираются в предмете лучше меня, которые, вероятно, считают, что там что-то есть…
>Cвёрточное ядро (Хаар и т.д. и т.п.) — это детектор признака.
Вовсе нет. Разве что если вы используете определение «признак — это то, что человек узнаёт».
>Ядро/колонка/контекст Редозубова — никакой не детектор вообще
Колонка — ровно такой же детектор, вон вы ниже в комментарии «детектор HELLO» нарисовали, это же тоже такой «узнаваемый признак», да?
Колонка — ровно такой же детектор, вон вы ниже в комментарии «детектор HELLO» нарисовали, это же тоже такой «узнаваемый признак», да?
И нет и да, как ниже ответил. Под детектором понимается узнавание чего-то конкретного. Например детектор линии наклоном 45 градусов. Детектор угла. Детектор скорого падения доллара. Они узнают только что-то конкретное, детекторами чего являются. А колонка получается что она есть детектор всего — полидетектор. Сейчас она детектор слова HELLO, добавили в память слово DOLLY, стала его детектором. Колонка говорит «я узнала». А что она узнала, надо смотреть, с чем совпало её преобразование. В таком смысле она детектор, но полидетектор. Сейчас нейробиологи эту функцию полидетектора приписывают нейронам в коре. Он не только «нейрон бабушки», но и «дедушки», яхты и сериала.
В нейросетях тоже нет детекторов *конкретного признака*. Сами придумали себе абстракцию, которая нигде не наблюдается, и сами даже не поняли, что запутались.
Интерпретация нейросети / чего-то ещё — это и есть задача попытаться понять, как оно работает. Но везде именно «мультидетекторы», просто иногда получается узнать одно или несколько направлений детектирования.
Ну и я в принципе не понимаю, чем плохо, если какой-то нейрон будет детектором какого-то конкретного признака (и это опять же не значит, что все будут такими). Т.е. мультидетектор иногда может быть детектором, и это нормально.
А можно подробнее? :) Я, правда, тот еще «специалист»… Вы не подумайте — я не пытаюсь подловить или что-то такое — я понять идею хочу.
Идея не моя, поэтому без проблем ). Я проверял общий принцип распознавания, а не метод обучения контекстов, которое как выше писал, можно применять любой. Поэтому просто забил функцию преобразования вручную.

На входе строки постоянной длины:
HELLO________________
____HELLO_DOLLY______

Функции преобразования колонок задана как трансляция/сдвиг строки на некий шаг. Входной бинарный вектор полученный из кодов символов строки преобразуем так, чтобы получилась строка, которая представляет сдвинутую строку.
____HELLO_DOLLY______ - входная строка
________HELLO_DOLLY__ - на выходе строка, сдвинутая вправо на 4 символа

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

Если подать на вход коре строку, например, ________________HELLO, то каждый контекст преобразует её согласно своей функции сдвига:
выходные строки контекстов
_______________HELLO_ - С1 (<< 1)
______________HELLO__ - С2 (<< 2)
_____________HELLO___ - С3 (<< 3)
____________HELLO____ - С4 (<< 4)
___________HELLO_____ - С5 (<< 5)
__________HELLO______ - С6
_________HELLO_______ - C7
________HELLO________ - С8
_______HELLO_________ - С9
______HELLO__________ - С10
_____HELLO___________ - С11
____HELLO____________ - С12
___HELLO_____________ - С13
__HELLO______________ - С14
_HELLO_______________ - С15
HELLO________________ - С16

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

Допустим мы первый раз демонстрируем «коре» такую строку:
____HELLO____________ - смещение 4 от начала строки. Кладём её в общую память.

Теперь будем искать слово HELLO в других положениях. Подадим
_______HELLO_________ - смещение 7 от начала строки
Каждый контекст сдвинет её и сравнит со строкой из памяти. Сработает контекст C3.
Подадим
_________HELLO_______ - смещение 9 от начала строки
Сработает контекст C5.
И т.п.

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

В общем, вот так я понял алгоритм AlexeyR (в своём без общей памяти я использую другой подход). Если я не прав, пусть поправит.
Так 1d-свёртка в нейросети именно так и работает!
«нейрон» в свёртке, распознающий «hello», будет во всех положениях сверен со строкой, и результат будет записан в разные ячейки, зависимые от положения. Эти срабатывания результата и есть «контексты». А вот какой нейрон сработает, это второе измерение, когда свёрток много.
строка -> 1d-нейрон-детектор-HELLO -> [c1 c2 c3 c4… c16]
строка -> 1d-нейрон-детектор-BYE -> [c'1 c'2 c'3 c'4… c'16]
итого получаем 2d-массив с «контекстами»:
[[c1 c2 c3 c4… c16],
[c'1 c'2 c'3 c'4… c'16]]
только в нейросетях этот «контекст» называется эмбеддингом или выходом (свёрточного) слоя.
Может я не прав (не математик), но в моём понимании свёрткой не может быть преобразование, если оно не уменьшает размерность. Какая она свёртка, если не сворачивает. Контекстное ядро получило на вход бинарный вектор, пережевало его и такой же длины выплюнуло.

«нейрон» в свёртке, распознающий «hello»
итого получаем 2d-массив с «контекстами»
Вот в этом фишка, там у него нет нейронов, что-то распознающих, на этом делается акцент. Массив контекстов не представляет собой набор детекторов, он не умеет распознавать вообще ничего. Но внешне выглядит так, как будто детекторы есть.

В том же моём примере потребовалось бы на каждое новое слово заводить по свёртке и строке в массиве: два слова, получили 2d-массив, 3 слова — 3d и т.д. А если слов бесчисленное множество? У Редозубова получается, что можно узнавать любое количество слов, а необходимый размер «сети» задаётся изначально требуемым количеством инвариантов, в которых может быть слово, и размер «сети» не растёт. Для узнавания нового слово никаких дополнительных манипуляций с «контекстами» не делается, веса не крутятся. Подставьте в моём примере вместо HELLO любое другое слово в любом инварианте, и какой-то контекст его узнает.
>но в моём понимании свёрткой не может быть преобразование, если оно не уменьшает размерность
>Какая она свёртка, если не сворачивает
Ну что за детский сад начинается? Свёрткой называется преобразование, которое умножает одну матрицу на другую со сдвигом. Операцию назвали convolve («переплетать, связывать»). Отсюда пошло определение, а вовсе не от бытового русского смысла слова!
Если матрица второго преобразования 1х1, то это всё равно свёртка, но она не уменьшает размерность.
А теперь, мы же говорим про слой в нейросети, а это обычно одномерный массив из таких операций свёртки, и они добавляют к результирующему массиву дополнительную размерность. Ширина слоя (количество свёрток, они же свёрточные фильтры) может быть любой, хоть миллион, и тогда итоговая матрица будет огромной.
Посмотрите что ли лекцию Семёна в нашем курсе по нейросетям: Лекция №6: www.youtube.com/watch?v=tOgBz8lFz8Q
>Вот в этом фишка, там у него нет нейронов, что-то распознающих, на этом делается акцент
Так в нейросети тоже нет «нейронов, что-то распознающих»! Откуда этот бред вообще берётся?
>В том же моём примере потребовалось бы на каждое новое слово заводить по свёртке и строке в массиве
Так не заводите! Если есть обучение — то оно и без свёртки на каждое новое слово будет работать.
>У Редозубова получается, что можно узнавать любое количество слов
Потому что в нейросети тоже. Вот вы пользуетесь google translate, там что, ограниченный словарь?
Нет, в нейросети ограниченное число нейронов, но бесконечный словарь.
Способ «по нейрону на слово» временами используется на первом слое нейросетей, но только потому, что так выше качество и меньше требования к мощности сети. Но в последнее время это же делается с помощью BPE, это такой код для деления сложных слов на простые, и всего такой словарь кодов может составлять 1000...100000 кодов.
А, например, в библиотеках для работы со словами, на примере spacy-ru, это используется так, что для каждого слова фичами, поступающие на объединяющие слова слои, являются:
— выучиваемое векторное пространство размерности 2000 для кода первых 3 символов
— выучиваемое векторное пространство размерности 2000 для кода последних 3 символов
— выучиваемое векторное пространство размерности 4000 для кода слова
— выучиваемое векторное пространство размерности 2000 для кода
— предобученное векторное пространство размерности 200000 для кодов лемм (лемма — начальная форма слова, например, «ходить» для «ходили», такие леммы со словами сопоставляются по словарю ).
Но в любом случае, один свёрточный фильтр = одна колонка Алексея. С точки зрения структуры и самого распознавания, соответствие между этими моделями взаимнооднозначное. А вот если смотреть на вторичные моменты — в нейросети-то всё понятно, а вот то, как ложится модель Алексея на реальный мир — не очень… Конкретнее, волнуют вопросы обучения колонок и вопросы обмена данными между колонками. Там уровень гипотез вида «ну, как-то оно учится/распространяется», алгоритмов там у Алексея пока я не видел, уж при всём моём уважении к нему.
>>>Посмотрите что ли лекцию Семёна в нашем курсе по нейросетям: Лекция №6: www.youtube.com/watch?v=tOgBz8lFz8Q

Во блин… Где ж вы раньше были! Спасибо.
Свёрткой называется преобразование, которое умножает одну матрицу на другую со сдвигом.
А если нет сдвига это тоже свёртка?
ru.wikipedia.org/wiki/Свёртка_последовательностей
В каждой точки выходной матрицы свёртки — фиксированные координаты сдвига матриц, в какой-то одной (центральной) точке выходной матрицы будет умножение с нулевым сдвигом, которое вам и нужно было.
Мы можем обрезать края, тогда при равном размере матриц у нас останется только центральный элемент. Такой вот вырожденный случай. Правда, чаще это будет всё же называться скалярным умножением (только надо развернуть вторую матрицу в обратном направлении, в свёртке правая матрица считается справа налево),
так же, как «матрица 3х1» не называется обычно матрицей, а называется вектором, а «матрица 1х1» обычно называется скаляром.
Вы видите свёртку в моей демке? Вот совсем ужатый код:
uint V, M;
...
if (V >> 8 & M == M) {
// узнано M
};
Сначала произведите векторизацию.
Тогда у вас будет
for(i){
r[i] = (V >> i & M == M);
}
но это будет не свёртка, т.к. у вас не суммирование, а точное сравнение. У него другие свойства, и, мне кажется, фиговая обобщающая способность, т.к. приближённое равенство он не найдёт.
Но это можно свести к свёртке с порогом равным len(M), обозначая свёртку за "%", поэлементное логическое отрицание за "~", поэлементное сложение за "+":
Y = (M % V) + ((~M) % V)
r = (Y[i] >= len(M)-i)
или лучше даже добавить паддинг нулями:
Y = (padded(M) % V) + ((~(padded(M))) % V)
r = (Y[i] >= len(M))
(И вот тогда вы кстати поймёте, что порог не обязательно должен быть равен M, и тогда вы получаете приближённое сравнение вместо точного)
мне кажется, фиговая обобщающая способность
А её там и не должно быть в такой примитивной реализации.
Я хотел показать, что есть всего две базовые операции: преобразовать и сравнить. И в их реализации нет жёстких ограничений. Можно использовать побитовое сравнение, можно расстояние Хемминга. Можно прикрутить LSH, чтобы сравнивать описания не в полной длине. И т.п.

Но это можно свести к свёртке с порогом
При желании довести до абсурда можно всё на свете свести к свёртке. «Когда в руке молоток, все кажутся гвоздями»
>>>Если знакомы с GPU, то это аналогия с шейдерами.

Вот это, кстати, хорошо! Шейдеры надо обдумать…
Sign up to leave a comment.

Articles

Change theme settings