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 находится во всех мыслимых положениях в строке.
Редозубов настаивает, что кора работает именно в таком виде. Я так не считаю, но профит из этого алгоритма вынести можно.
Чем это принципиально отличается от принципа работы сверточных сетей? Такой де подход использовался еще в «дотензорной» эре — в каскадах Хаара, операторах Собеля и прочих CV-технологиях.
>>>А преимущество в том, что если одно ядро (а их может быть хоть тысячи/миллионы) научилось распознавать букву «A» в одном единственном месте на картинке, то автоматически эта буква без дополнительного обучения теперь будет узнаваться в любом другом положении.
Ядра свертки так же проходят по всей «картинке». Инвариантно как минимум к положению…
>>>То есть, обучение с единственного представления (One-shot learning), как у животных, а не посредством обучения на датасете с миллионами примеров.
Вот! Я вот этого не понимаю! За счет чего? сверточная сеть тренируется методом обратного распространения ошибки и там эти «ядра» образуются естественным образом, как важные признаки изображения… А вот как формируются контексты у Редозубова — я пока не догоняю. Да еще и One-shot…
>>>Тот мой первый пример был простой — демонстрировал ядрам один раз новое слово в начале строки, а потом проверял узнают ли они его в других, ранее не встречавшихся им положениях на строке — инвариантах по положению (аля, «в контекстах», как говорит Редозубов).
А можно подробнее? :) Я, правда, тот еще «специалист»… Вы не подумайте — я не пытаюсь подловить или что-то такое — я понять идею хочу. Даже не алгоритм детально, а саму идею. Что значит «демонстрировал ядрам»? Что в данном случае — «ядра»? архитектурно?
Чем это принципиально отличается от принципа работы сверточных сетей? Такой де подход использовался еще в «дотензорной» эре — в каскадах Хаара, операторах Собеля и прочих CV-технологиях.Вот здесь проблема с объяснением. Я сам долго не понимал. Вот попытка Редозубова объяснить разницу для buriy youtu.be/mcFOl-TKheM?t=6299.
Сходства со свёртками нет. Cвёрточное ядро (Хаар и т.д. и т.п.) — это детектор признака. Ядро/колонка/контекст Редозубова — никакой не детектор вообще. Свёртка сворачивает в одно единственное значение, колонка — преобразует (по некой функции). В том моём примере задана функция трансляции. Получили на вход бинарную строку, строку же и выдали. Никакого сворачивания до единственного значения. И мелочи: свёртка обозревает небольшую область, колонка — весь входной слой.
Вот! Я вот этого не понимаю! За счет чего?Контексты формируются также обучением. В последней статье из цикла есть объяснение как. Но формально никто не запрещает применять другие методы. Сам хочу попробовать ГА и тот свой недавний метод. А one-shot получается за счёт того, что обучали например «на кошках», а используем для распознавания собак.
А по конкретным фактам:
Одна свёртка — сворачивает до одного значения, но 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-хешей.
Кстати, гуглится это по ключевым словам «random projections» (in neural networks)), и в целом, это кое-где применяется, особенно там, где random projections дёшево делать. Если же их делать дорого, то смысла в них нет (гуглить quantization & pruning methods for neural networks )
Ваш код не соответствует идее АлексеяФункция преобразования может быть задана любым способом. Идея Алексея, что её можно получить «обучением» на комбинаторном пространстве (тогда она будет задана таблично). Вы можете прояснить этот момент на следующем вебинаре.
У вас нет случайных подпространств размерностью 20 из пространства размерности 1000000.Ну это смешно, упрекать в том, что для наглядности выбран пример с малой размерностью (160). Вот четыре года назад был пример с распознаванием номеров. Там тоже не «обучали» функции (сдвига, поворота, масштаба), а задали их самостоятельно, получив в итоге не 20, как в демке, а 700 тыс гипотез. Такого масштаба пример подойдёт(?).
Поэтому же в примере с распознаванием номеров была не модель Алексея, а модель Васи.
Это разные модели. Нет случайных подвыборок — нет LSH, это другая модель, это просто обычные свёрточные нейросети.
Есть случайные подвыборки (random projections) и механизм обучения, как у мухи — это опять другая модель (в нейросетях определённый механизм обучения).
Вы их сливаете вместе, притом, что у этих моделей совершенно разные свойства и разные ограничения. Модель мухи не выучит никогда качество >70% на одном слое, а нейросеть — выучит почти 90% на одном слое. Нейросети отлично стакаются, но когда целевая функция шумит, то это преимущество исчезает.
в примере с распознаванием номеров была не модель Алексея, а модель Васи«Его/не_его» — это всё частные мнения. Вы решили, что без специфического обучения на комбинаторном пространстве — это не модель Редозубова. Ок. Такого же ли мнения он сам мне, например, неизвестно, так как обратная связь с автором и его разработчиками отсутствует.
Я не достаточно специалист в вопросе, что бы реально судить, но пока у меня сложилось негативное общее впечатление… Я стараюсь с ним бороться, потому, что вижу людей, которые разбираются в предмете лучше меня, которые, вероятно, считают, что там что-то есть…
Вовсе нет. Разве что если вы используете определение «признак — это то, что человек узнаёт».
>Ядро/колонка/контекст Редозубова — никакой не детектор вообще
Колонка — ровно такой же детектор, вон вы ниже в комментарии «детектор 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 (в своём без общей памяти я использую другой подход). Если я не прав, пусть поправит.
«нейрон» в свёртке, распознающий «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 для кодов лемм (лемма — начальная форма слова, например, «ходить» для «ходили», такие леммы со словами сопоставляются по словарю ).
Но в любом случае, один свёрточный фильтр = одна колонка Алексея. С точки зрения структуры и самого распознавания, соответствие между этими моделями взаимнооднозначное. А вот если смотреть на вторичные моменты — в нейросети-то всё понятно, а вот то, как ложится модель Алексея на реальный мир — не очень… Конкретнее, волнуют вопросы обучения колонок и вопросы обмена данными между колонками. Там уровень гипотез вида «ну, как-то оно учится/распространяется», алгоритмов там у Алексея пока я не видел, уж при всём моём уважении к нему.
Во блин… Где ж вы раньше были! Спасибо.
Свёрткой называется преобразование, которое умножает одну матрицу на другую со сдвигом.А если нет сдвига это тоже свёртка?
В каждой точки выходной матрицы свёртки — фиксированные координаты сдвига матриц, в какой-то одной (центральной) точке выходной матрицы будет умножение с нулевым сдвигом, которое вам и нужно было.
Мы можем обрезать края, тогда при равном размере матриц у нас останется только центральный элемент. Такой вот вырожденный случай. Правда, чаще это будет всё же называться скалярным умножением (только надо развернуть вторую матрицу в обратном направлении, в свёртке правая матрица считается справа налево),
так же, как «матрица 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, чтобы сравнивать описания не в полной длине. И т.п.
Но это можно свести к свёртке с порогомПри желании
Вот это, кстати, хорошо! Шейдеры надо обдумать…
Модели мира. Могут ли агенты учиться в своем воображении?