Pull to refresh
40
0
Юрий Бабуров @buriy

Web, AI, Deep Learning, Python

Send message
Я думаю, много моделей тут недоучились и поэтому показали слабые результаты.
Статья перегружена деталями, нету главной мысли текста.
И выводы странные: «не было коммерческого успеха, потому что была зима ИИ». Отсутствие логики детектед, звучит примерно как «у продавца не было продаж, потому что был плохой день». Плохой день — он потому и плохой, что ничего не продаётся, понимаете? А на самом деле правильное объяснение — не было продаж, потому что нечего было продавать! Не было даже признаков успешных будущих применений технологии в 60е-80е, поэтому и не давали финансирование на усиленные разработки. Какой смысл выделять деньги много раз на расширение неперспективных исследований? Сравните это с кризисом перепотребления, когда всё, что можно, уже изобрели, вот только в области ИИ это называется «зимой ИИ».
>Вы решили, что без специфического обучения на комбинаторном пространстве — это не модель Редозубова.
Именно так. А иначе там тысяча разных моделей, и смысл их все сразу обсуждать не очень понятен.
Вы вполне можете с Алексеем пообщаться, я с ним общался неоднократно.
Нет, дело не в размере, дело в том, что у вас в вашем маленьком пространстве не было случайных подвыборок.
Поэтому же в примере с распознаванием номеров была не модель Алексея, а модель Васи.
Это разные модели. Нет случайных подвыборок — нет LSH, это другая модель, это просто обычные свёрточные нейросети.
Есть случайные подвыборки (random projections) и механизм обучения, как у мухи — это опять другая модель (в нейросетях определённый механизм обучения).
Вы их сливаете вместе, притом, что у этих моделей совершенно разные свойства и разные ограничения. Модель мухи не выучит никогда качество >70% на одном слое, а нейросеть — выучит почти 90% на одном слое. Нейросети отлично стакаются, но когда целевая функция шумит, то это преимущество исчезает.
Ваш код не соответствует идее Алексея. У вас нет случайных подпространств размерностью 20 из пространства размерности 1000000. Там и вылезают хеши, кодирующие эти подпространства.
Кстати, гуглится это по ключевым словам «random projections» (in neural networks)), и в целом, это кое-где применяется, особенно там, где random projections дёшево делать. Если же их делать дорого, то смысла в них нет (гуглить quantization & pruning methods for neural networks )
Сначала произведите векторизацию.
Тогда у вас будет
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, и тогда вы получаете приближённое сравнение вместо точного)
ru.wikipedia.org/wiki/Свёртка_последовательностей
В каждой точки выходной матрицы свёртки — фиксированные координаты сдвига матриц, в какой-то одной (центральной) точке выходной матрицы будет умножение с нулевым сдвигом, которое вам и нужно было.
Мы можем обрезать края, тогда при равном размере матриц у нас останется только центральный элемент. Такой вот вырожденный случай. Правда, чаще это будет всё же называться скалярным умножением (только надо развернуть вторую матрицу в обратном направлении, в свёртке правая матрица считается справа налево),
так же, как «матрица 3х1» не называется обычно матрицей, а называется вектором, а «матрица 1х1» обычно называется скаляром.
Объясняю:
Код на входе у Алексея формируется через преобразование сигналов из других зон. Преобразование этих сигналов напоминает LSH. Лучше дам ссылку: medium.com/@jaiyamsharma/efficient-nearest-neighbors-inspired-by-the-fruit-fly-brain-6ef8fed416ee
Да и преобразование внутри зоны построено по принципу этого же LSH.
А ещё, если мы считаем, что вход прошлой зоны обладал низкой размерностью, то он будет расширен до большой размерности… волновыми паттернами по модели того же самого LSH ( habr.com/ru/post/308370 ).
Вот откуда там хеши: по сути, хеш сидит и хешем погоняет. Если нет обратного распространения ошибки, то «динамический резонанс» (взаимное отображение зон коры друг на друга) можно сделать лишь с помощью LSH-хешей.
>но в моём понимании свёрткой не может быть преобразование, если оно не уменьшает размерность
>Какая она свёртка, если не сворачивает
Ну что за детский сад начинается? Свёрткой называется преобразование, которое умножает одну матрицу на другую со сдвигом. Операцию назвали convolve («переплетать, связывать»). Отсюда пошло определение, а вовсе не от бытового русского смысла слова!
Если матрица второго преобразования 1х1, то это всё равно свёртка, но она не уменьшает размерность.
А теперь, мы же говорим про слой в нейросети, а это обычно одномерный массив из таких операций свёртки, и они добавляют к результирующему массиву дополнительную размерность. Ширина слоя (количество свёрток, они же свёрточные фильтры) может быть любой, хоть миллион, и тогда итоговая матрица будет огромной.
Посмотрите что ли лекцию Семёна в нашем курсе по нейросетям: Лекция №6: www.youtube.com/watch?v=tOgBz8lFz8Q
>Вот в этом фишка, там у него нет нейронов, что-то распознающих, на этом делается акцент
Так в нейросети тоже нет «нейронов, что-то распознающих»! Откуда этот бред вообще берётся?
>В том же моём примере потребовалось бы на каждое новое слово заводить по свёртке и строке в массиве
Так не заводите! Если есть обучение — то оно и без свёртки на каждое новое слово будет работать.
>У Редозубова получается, что можно узнавать любое количество слов
Потому что в нейросети тоже. Вот вы пользуетесь google translate, там что, ограниченный словарь?
Нет, в нейросети ограниченное число нейронов, но бесконечный словарь.
Способ «по нейрону на слово» временами используется на первом слое нейросетей, но только потому, что так выше качество и меньше требования к мощности сети. Но в последнее время это же делается с помощью BPE, это такой код для деления сложных слов на простые, и всего такой словарь кодов может составлять 1000...100000 кодов.
А, например, в библиотеках для работы со словами, на примере spacy-ru, это используется так, что для каждого слова фичами, поступающие на объединяющие слова слои, являются:
— выучиваемое векторное пространство размерности 2000 для кода первых 3 символов
— выучиваемое векторное пространство размерности 2000 для кода последних 3 символов
— выучиваемое векторное пространство размерности 4000 для кода слова
— выучиваемое векторное пространство размерности 2000 для кода
— предобученное векторное пространство размерности 200000 для кодов лемм (лемма — начальная форма слова, например, «ходить» для «ходили», такие леммы со словами сопоставляются по словарю ).
Но в любом случае, один свёрточный фильтр = одна колонка Алексея. С точки зрения структуры и самого распознавания, соответствие между этими моделями взаимнооднозначное. А вот если смотреть на вторичные моменты — в нейросети-то всё понятно, а вот то, как ложится модель Алексея на реальный мир — не очень… Конкретнее, волнуют вопросы обучения колонок и вопросы обмена данными между колонками. Там уровень гипотез вида «ну, как-то оно учится/распространяется», алгоритмов там у Алексея пока я не видел, уж при всём моём уважении к нему.
В нейросетях тоже нет детекторов *конкретного признака*. Сами придумали себе абстракцию, которая нигде не наблюдается, и сами даже не поняли, что запутались.
Интерпретация нейросети / чего-то ещё — это и есть задача попытаться понять, как оно работает. Но везде именно «мультидетекторы», просто иногда получается узнать одно или несколько направлений детектирования.
Ну и я в принципе не понимаю, чем плохо, если какой-то нейрон будет детектором какого-то конкретного признака (и это опять же не значит, что все будут такими). Т.е. мультидетектор иногда может быть детектором, и это нормально.
>Cвёрточное ядро (Хаар и т.д. и т.п.) — это детектор признака.
Вовсе нет. Разве что если вы используете определение «признак — это то, что человек узнаёт».
>Ядро/колонка/контекст Редозубова — никакой не детектор вообще
Колонка — ровно такой же детектор, вон вы ниже в комментарии «детектор HELLO» нарисовали, это же тоже такой «узнаваемый признак», да?
Так 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]]
только в нейросетях этот «контекст» называется эмбеддингом или выходом (свёрточного) слоя.
Я всё равно так и не понял :) Надо будет ещё пообщаться. Особенно по механизмам обновления информации для такого «мультипоиска» в коре, тут мне вообще ничего не понятно пока. То есть, пока эта информация на уровне «можно сделать так», но не «сделано так» и тем более «сделать можно только так». Ощутите разницу. (Гипотеза vs Факт vs Инженерия.)
А по конкретным фактам:
Одна свёртка — сворачивает до одного значения, но 64 фильтров свёртки — сворачивают уже в 64 значения.
Колонка тоже обозревает некоторую область, а «весь слой» получается только за счёт отображения слоя на область колонки через автоэнкодеры, но это, исходя из модели Алексея, просто преобразование — вроде как вычисление хеша (LSH, но можно и обычные хеши рассматривать) от другого значения.
Такое хеширование в целом не увеличивает качество (на небольших моделях, на больших — дискуссионный вопрос).
Так что отличий в этом плане нет.
То, что в нейросети есть «пирамидка» — это просто деталь реализации, которая присутствует и в мозге, т.к. V1 крупнее, чем V2, а V2 крупнее V4. При попытке отловить один конкретный признак (скажем, движение определённого мускула) на выходе, мы всё равно к такой пирамидке придём.
А то, что фильтры дублируются в нейросети в разных положениях — тоже особенность реализации. Возможно, как раз этот LSH обеспечивает лучшую защиту от попыток обмануть нейросеть — т.е. это метод ансамблирования, ну и ещё небольшого дополнительного перебора для более простых случаев в верхних зонах коры. Но в целом вклад лишних (уникальных для каждой колонки) изоморфных преобразований в качество на уровнях V1 и V2 пока что необоснован, хотя и понятно, что если бы можно было в мозгу сделать без него, то сделали бы без него. На компьютере в миллион раз быстрее считать с дублированием, поэтому так сделали.
А внутренний общий SDR из 1-7 объектов на каждой зоне — успешно моделируется сейчас с помощью embeddings или даже embeddings + attention.
>проблема взрывающегося градиента
>Решение очевидно — ограничить значение градиента, в противном случае — уменьшить его значение (нормировать). Такая техника называется «clipping».
Вот только это очень плохое решение… Особенно для ничем не ограниченного ReLU.
Batchnorm намного лучше справляется. (И ещё придумали SELU и другие self-normalizing units.)
>мы пришли к первоначальному тезису моей статьи
Постоянного «Я» человека не существует. «Я» индивида возникает в ответ на взаимодействие человека с миром и необходимо ему для более эффективной работы с окружающим миром.

Вы же понимаете, что это ваше утверждение не фальсифицируемо? Это как про чайник Рассела говорить и про его влияние на судьбы цивилизации. То есть, совершенно бессмысленно и непродуктивно.
>Остаётся надеяться на «квантовую шелуху», поскольку в квантовой физики работают другие законы и существует возможность создать ИИ на квантовом компьютере.
Какие это другие законы? И как они позволяют создать ИИ?
В вашей статье про это ничего так и не получилось объяснить.
деконцентрация = внимание на органах чувств в целом, на новом, итд.
>Бывают ситуации, которые осознаются, но не фиксируются в памяти, либо фиксируются, но доступ мы к ним не имеем.
Запись чего-то в память не означает последующее чтение, это норм.

Ну слава богу, в целом с концепцией согласились, а значит, квантовую шелуху можно наконец-то из рассмотрения убрать. Голографический принцип вполне объясняется параллелизмом в работе нейронов.
Согласен, сознание != память о чём-то.
Давайте чуть по-другому сформулируем тогда: сознание — это внимание в текущий момент на объекты или явления: текущий внешний отслеживаемый объект, часть тела, на текущую проговариваемую мысль, ощущение, текущее действие, или на память о каких-либо объектах. Это внимание может порождать опять же действие или мысль. А эти наблюдения и эти выборы действий/мыслей запоминаются в памяти (без запоминания нет осознания, поэтому я его включаю в концепцию).
Сознание — это просто память о тех объектах, на которые сейчас направлено внимание.
Сначала попробуйте докажите, что это не так, а потом мы уж с вами поговорим о том, как в обычной рекуррентной нейросети с вниманием такое получить (запросто).
a -> s -> a -> o — это нейросеть?
a -> o -> s -> o — это нейросеть?
a -> s -> s -> o -> o — это нейросеть?
a -> o — это нейросеть?

БК: нет, но если очень надо, то да

:rofl:
И кому же и когда это надо?
Если ответ был бы «нет», то вам нужно было бы сказать «замкнутый ориентированный граф без циклов».
Но нет, тут всё сложнее. o -> o, a->o и a->a не имеют практического смысла, а вот рекуррентные связи в нейросети возможны и они будут именно так рисоваться в виде графа: s->s.
Так что любой ориентированный граф с одним компонентом связности — это нейросеть.
(Да, а сеть, собственно, потому оно и называется нейроСЕТЬ — это ориентированный граф с весами связей, это как раз наши рёбра в графе, но если брать схему из слоёв, а не из нейронов, то это конечно будет просто ориентированный граф.)
Есть такая штука, называется, «правильная абстракция в данном случае», а есть другая штука, называется «неправильная абстракция в данном случае». Вы их, кажется, не различаете!..

>>>Туда мы подаем числа в промежутке [0..1].
>>Нет, туда мы обычно подаём любые вещественные числа. Но бывают нюансы, дополнительное преобразование входа.

>БК: Да, любые, но потом ОБЫЧНО преобразуем данные в [0..1], т.к. так удобнее работать.
Да когда это стало для кого-то обычным? Откуда вы это взяли вообще?
Зачем вообще преобразовывать данные на входе в слой в 0..1? В чём это «удобнее»?
Нет. Например, сетки для зрения нормируют, чтобы матожидание на входе было 0 (считают среднее по датасету), т.к. это немного ускоряет обучение. Это не диапазон 0..1 и даже не -1..1, т.к. про дисперсию тут речи не было, она может быть любой, но часто просто делят на 256, и получают диапазон, скажем, -0.53...0.47 для красного цвета, -0.61..0.39 для зелёного, и ещё какой-то для синего цвета.
Вот именно про эту проблему я и говорю: вы по шкале Данинга-Крюгера сейчас на уровне «я считаю, что я всё знаю про нейросети.»

>БК: Нет, т.к. ваше мнение не репрезентативно. 47 человек добавили статью в закладки, т.к. посчитали ее полезной. Это тоже очевидно.
Так как не разбираются, полезна она или нет, но почитают потом.
Это известная проблема «рынка лимонов»: люди читают всё подряд, не проверяя качество информации. Но это не значит, что надо писать всё подряд для этих людей, т.к. мы тогда вернёмся к вопросу о вашей ответственности за ваши слова.

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

>БК: Не вижу конструктива для обсуждения.
Да конечно, обсуждать тут нечего, всем всё ясно, это вы начали брать на слабо и попросили подробных объяснений, что же у вас не так. А как только их вам предоставили — вместо признания своей неправоты, вы начали выдавать оправдания в духе «но по сути-то я прав, да и тут я не ошибся, это лишь вариант нормы». Не надо так, это лишь ещё раз показывает вашу безответственность. В мире программирования важны нюансы, особенно те, которые приводят потом к ошибкам, как у вас с диапазоном 0..1, когда вы просто не понимаете, зачем это нужно, и придумываете какую-то дичь.
Я не знаю, какой вы руководитель проектов, но показанная здесь грань вашего таланта просто поражает меня своей наглостью и беспринципностью.

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Date of birth
Registered
Activity

Specialization

Backend Developer, Chief Technology Officer (CTO)
Lead