Если бы выбирал что-либо кроме браузера, то смотрел бы прежде всего на С++ или rust. скорость тогда на порядок была ы выше и код был бы намного проще. А в браузере - чтобы любой желающий мог попробовать
да, чтобы были "понятия" а не набры букв нужно делать "надстройку" над "термодинамическим мозгом". Для этого LSH буду использовать или еще что. Тоесть этот концепт - базовый слой - хлеб на который будет намазываться масло. А насчет тоенизации - я не придумал как это делать в браузере. BPE - медленный бестолковый алгоритм. Разбивать на слова - рабочий варинант, быстро. Но в "термодинамическом мозге" токенизация происходит сама-собой, его даже как не точный токенизатор можно использовать.
да, это реально развитие цепей Маркова) вообще все это делалось для "первого слоя" нейросети построенного на них: https://habr.com/ru/articles/996268/ Но я столкнулся с комбинаторным взрывом, так что пришлось выдумывать, как построить "навороченную" цепь Маркова любой длинны не потребляя оперативки.
Конечно планы могут измениться, но базовый сценарий - статистическими методами. Очень упрощенно - берем текст и строим табличку - такая-то маска встречатеся с такой-то вероятностью и после нее идут символы с такой-то вероятностью - это данные чтобы собрать первый слой. Потом берем тот-же текст и "сжимаем его" через эту табличку, прогоняем получившееся и строим новую такую-же табличку - получаем второй слой. *этот концепт сейчас в процессе разработки и это лишь базовое описание идеи
тут сложно сказать что он в чем-то не прав, но для более полной картины, я еще бы спросил у gemini, как показывает практика он чуть более продвинутый, в том числе рекомендую вскормить ему ответ от GPT и этот мой ответ.
На 65-й бит жалко тратить UINT64) я пока не знаю как решить эту проблему, но 1 бит надо удалить)
да, обучение предполагается с негативом, об этом не сказано, т.к. я пытался сделать описание как можно короче и понятнее
Но вот выход зависит от структуры различий а не отлько от расстояния. тут он не прав или невнимателен.. нейрон то не один, разные нейроны смотрят на разные биты
Насчет памяти - исправлю, но всеже Хочется надеяться что нейронки построенные по reverse hash будут менее прожорливыми по памяти.
Битность и входа в выхода может быть любой, скажем проблем сделать нейрон с 10000 входов - нет и масштабируется линейно, то есть нет такого что "большущий" нейрон будет сильно медленнее считаться. Размер нейрона подбирается под задачу и железо.
Да, действительно, я выложил недостаточно протестирова) подправлю. На тестовом датасете точность в среднем 98%, какой-то косяк при анализе нарисованной картинки(
Я думаю о том чтобы найти большой интересный датасет и сделать на этом принципе нейронку побольше, в том числе как доказательство работоспособности и эффективности, но я это делаю по фану, и когда руки дойдут - не знаю.
Обучение в простейшем случае:
Когда мы показываем сети цифру «7»:
Нейрон вычисляет dist = popcount(Input ^ Mask).
Мы делаем A[dist]++ (если это правильный класс) или A[dist]-- (если неправильный).
у нейрона 64 битовых входа, соответственно он может принять 64 входа от 64 нейронов. Если нейнонов в слое до текущего больше чем 64, что всегда будет верно, то нейрон текущего слоя примет входы от рандомных нейронов предыдущего слоя (берем количеством)
В принципе можно подумать о том чтобы нейрон имел вызод больше одного бита, но предварительно вычислительно выгоднее увеличитиь количество нейронов а не увеличивать битность выхода (требует проверки)
Действительно, XOR + POPCNT + LUT можно представить как ансамбль пороговых перцептронов с весами +-1, Но дьявол, в деталях реализации и нелинейности.
Вы пишете, что модель точно не сильнее обычной нейросети. Возможно. Но классический пример: функция XOR. Один классический перцептрон не может решить XOR. Ему нужна сеть. Наш один LUT-нейрон решает XOR от 64 входов мгновенно. Для этого достаточно заполнить таблицу A[] чередующимися нулями и единицами.
Таким образом, один наш «урезанный» нейрон на 64 входа способен реализовать функции, для которых классическому перцептрону (даже с float весами) понадобится скрытый слой. LUT дает нам произвольную нелинейность от расстояния. Да. это частный случай, но он - показательный
Про «можно выкинуть маски» : Математически — да, маска это просто перенос начала координат. Но инженерно — это LSH (Locality Sensitive Hashing).XOR + POPCNT — это способ вычислить «похожесть» входа на эталон (маску) за 2 такта процессора. Если мы выкинем маски и будем пытаться собрать это из пороговых перцептронов, как вы предложили в доказательстве, мы получим чудовищную конструкцию, которая будет работать в 100 раз медленнее. Наша цель — максимальный КПД на такт процессора.
Про теорему аппроксимации: Существует теорема для WiSARD (Weightless Neural Networks), которая доказывает их аппроксимационную способность. Наша модель — это WiSARD «на стероидах», где мы добавили топологическую связность через расстояние Хэмминга.
Мы не пытаемся сделать модель, которая «умнее» классической нейронки в бесконечном пространстве. Мы делаем модель, которая эффективнее классической в пространстве команд современного CPU. Классический нейрон тратит 64 умножения, чтобы разделить пространство одной плоскостью. Наш нейрон за 4 инструкции разделяет пространство 64-мя нелинейными «сферами».
Тесты на MNIST уже готовятся — они и станут финальным аргументом в споре о «слабости».
Зависит от задачи. В случае распознавания рукописных цифр думаю использовать ранговое кодирование -
Нейрону не важна абсолютная яркость. Ему важен перепад (градиент). Мы берем 64 случайные пары точек изображения.
Если точка А ярче точки Б — пишем 1.
Иначе — 0.
Но это не значит что "тупо" брать случайные биты - не сработает. этого я не знаю
А в средних слоях инпуты - это аутпуты других нейронов. У нас у каждого нейрона 64 инпута, 1 аутпут (64 бита на вход, 1 на выход). Можно в принципе AVX512 использовать, тогда можно и больше бит на вход использовать, но 64 на современных процах наверно оптимум, батч (за такт сразу 4 нейрона считать например, заюзав 256 бит) при этом конечно можно использовать, но это уже тонкости
Выход нейронов первого слоя идет на рандомный вход нейронов второго слоя. сети не обязательно быть полносвязной
все будет) руки пока не дошли. Индексация в массиве - только в процессе обучения. Потом - это операция (A >> dist) & 1 (массив предращается в 64 битное число)
Входы - разные биты input - не уверен что будет работать. для распознавания символов планируется ранговое кодирование. Для друих задач - "heatmap" - больше число - больше единиц в байте
У нас массив A (LUT) позволяет задать любую нелинейную реакцию на расстояние (так что скорее продвинутый а не урезанный персептрон).
Для обучения планируем опираться на принципы Feedback Alignment и Target Propagation. В нашем Proof of Concept для MNIST планируем использовать логику близкую к Extreme Learning Machines (ELM): скрытые слои создают случайную проекцию признаков, а обучается только последний слой (статистически). Теоретически градиентный спуск тут не нужен, но покажут тесты..
Маски - это просто статические случайные "картинки" они не меняются в процессе обучения
Не планировалось, Однако если возникнут хорошие идеи для следующих эпизодов, то все возможно)
Я думал использовать Еву как "отмычку" для выхода из симуляции, но не придумал пока что за гранью стмуляции
хмм.. да, пожалуй) мне на будущее, но сейчас я новую версию на webgpu делаю, кторая уже и не только детерминированные паттерны ловит)
https://habr.com/ru/articles/1003270/
это - часть 1 (фундамент) ответа на ваш вопрос. часть 2 еще готовится
Если бы выбирал что-либо кроме браузера, то смотрел бы прежде всего на С++ или rust. скорость тогда на порядок была ы выше и код был бы намного проще.
А в браузере - чтобы любой желающий мог попробовать
00 -> 0; 01->1; 10->1; 11->0. 4 узла.. в узлах же могут быть последовательности
можете даже такой текстовик по приколу закинуть на обучение в прогу
да, чтобы были "понятия" а не набры букв нужно делать "надстройку" над "термодинамическим мозгом". Для этого LSH буду использовать или еще что. Тоесть этот концепт - базовый слой - хлеб на который будет намазываться масло.
А насчет тоенизации - я не придумал как это делать в браузере. BPE - медленный бестолковый алгоритм. Разбивать на слова - рабочий варинант, быстро. Но в "термодинамическом мозге" токенизация происходит сама-собой, его даже как не точный токенизатор можно использовать.
да, это реально развитие цепей Маркова)
вообще все это делалось для "первого слоя" нейросети построенного на них: https://habr.com/ru/articles/996268/
Но я столкнулся с комбинаторным взрывом, так что пришлось выдумывать, как построить "навороченную" цепь Маркова любой длинны не потребляя оперативки.
пока у меня нет хорошего ответа на этот вопрос. но скоро появится) как будет готов - напишу
Да, но скорее не не придумал, а не проверил - будет ли работать. Сейчас работаю над этим.. Делаю мини чат бота на reverse hash нкйронах
Конечно планы могут измениться, но базовый сценарий - статистическими методами. Очень упрощенно - берем текст и строим табличку - такая-то маска встречатеся с такой-то вероятностью и после нее идут символы с такой-то вероятностью - это данные чтобы собрать первый слой. Потом берем тот-же текст и "сжимаем его" через эту табличку, прогоняем получившееся и строим новую такую-же табличку - получаем второй слой. *этот концепт сейчас в процессе разработки и это лишь базовое описание идеи
пофиксил, теперь и ручками нарисованные символы нормально понимает) ссылка - не изменилась
тут сложно сказать что он в чем-то не прав, но для более полной картины, я еще бы спросил у gemini, как показывает практика он чуть более продвинутый, в том числе рекомендую вскормить ему ответ от GPT и этот мой ответ.
На 65-й бит жалко тратить UINT64) я пока не знаю как решить эту проблему, но 1 бит надо удалить)
да, обучение предполагается с негативом, об этом не сказано, т.к. я пытался сделать описание как можно короче и понятнее
Но вот выход зависит от структуры различий а не отлько от расстояния. тут он не прав или невнимателен.. нейрон то не один, разные нейроны смотрят на разные биты
Насчет памяти - исправлю, но всеже Хочется надеяться что нейронки построенные по reverse hash будут менее прожорливыми по памяти.
Битность и входа в выхода может быть любой, скажем проблем сделать нейрон с 10000 входов - нет и масштабируется линейно, то есть нет такого что "большущий" нейрон будет сильно медленнее считаться. Размер нейрона подбирается под задачу и железо.
Да, действительно, я выложил недостаточно протестирова) подправлю. На тестовом датасете точность в среднем 98%, какой-то косяк при анализе нарисованной картинки(
Я думаю о том чтобы найти большой интересный датасет и сделать на этом принципе нейронку побольше, в том числе как доказательство работоспособности и эффективности, но я это делаю по фану, и когда руки дойдут - не знаю.
Обучение в простейшем случае:
Когда мы показываем сети цифру «7»:
Нейрон вычисляет dist = popcount(Input ^ Mask).
Мы делаем A[dist]++ (если это правильный класс) или A[dist]-- (если неправильный).
готово:
https://schoolscience.org/bit_nn/
не идеал, сделано "на коленке" но это-же proof of concept. Важем сам факт - работает)
На CPU - скорее можно попробовать, но сам концепт нейросети просто идеально ложится на асики, и проблем с использованием GPU тоже особо не видно
ага, вижу, спасибо) планируется полноценный редактор сплайнов, но пока не знаю когда. ответил только сейчас, т.к. забанили)
у нейрона 64 битовых входа, соответственно он может принять 64 входа от 64 нейронов. Если нейнонов в слое до текущего больше чем 64, что всегда будет верно, то нейрон текущего слоя примет входы от рандомных нейронов предыдущего слоя (берем количеством)
В принципе можно подумать о том чтобы нейрон имел вызод больше одного бита, но предварительно вычислительно выгоднее увеличитиь количество нейронов а не увеличивать битность выхода (требует проверки)
Действительно, XOR + POPCNT + LUT можно представить как ансамбль пороговых перцептронов с весами +-1, Но дьявол, в деталях реализации и нелинейности.
Вы пишете, что модель точно не сильнее обычной нейросети. Возможно. Но классический пример: функция XOR. Один классический перцептрон не может решить XOR. Ему нужна сеть.
Наш один LUT-нейрон решает XOR от 64 входов мгновенно. Для этого достаточно заполнить таблицу A[] чередующимися нулями и единицами.
Таким образом, один наш «урезанный» нейрон на 64 входа способен реализовать функции, для которых классическому перцептрону (даже с float весами) понадобится скрытый слой. LUT дает нам произвольную нелинейность от расстояния. Да. это частный случай, но он - показательный
Про «можно выкинуть маски» :
Математически — да, маска это просто перенос начала координат. Но инженерно — это LSH (Locality Sensitive Hashing).XOR + POPCNT — это способ вычислить «похожесть» входа на эталон (маску) за 2 такта процессора. Если мы выкинем маски и будем пытаться собрать это из пороговых перцептронов, как вы предложили в доказательстве, мы получим чудовищную конструкцию, которая будет работать в 100 раз медленнее. Наша цель — максимальный КПД на такт процессора.
Про теорему аппроксимации: Существует теорема для WiSARD (Weightless Neural Networks), которая доказывает их аппроксимационную способность. Наша модель — это WiSARD «на стероидах», где мы добавили топологическую связность через расстояние Хэмминга.
Мы не пытаемся сделать модель, которая «умнее» классической нейронки в бесконечном пространстве. Мы делаем модель, которая эффективнее классической в пространстве команд современного CPU. Классический нейрон тратит 64 умножения, чтобы разделить пространство одной плоскостью. Наш нейрон за 4 инструкции разделяет пространство 64-мя нелинейными «сферами».
Тесты на MNIST уже готовятся — они и станут финальным аргументом в споре о «слабости».
del
Зависит от задачи. В случае распознавания рукописных цифр думаю использовать ранговое кодирование -
Нейрону не важна абсолютная яркость. Ему важен перепад (градиент).
Мы берем 64 случайные пары точек изображения.
Если точка А ярче точки Б — пишем 1.
Иначе — 0.
Но это не значит что "тупо" брать случайные биты - не сработает. этого я не знаю
А в средних слоях инпуты - это аутпуты других нейронов. У нас у каждого нейрона 64 инпута, 1 аутпут (64 бита на вход, 1 на выход). Можно в принципе AVX512 использовать, тогда можно и больше бит на вход использовать, но 64 на современных процах наверно оптимум, батч (за такт сразу 4 нейрона считать например, заюзав 256 бит) при этом конечно можно использовать, но это уже тонкости
Выход нейронов первого слоя идет на рандомный вход нейронов второго слоя. сети не обязательно быть полносвязной
все будет) руки пока не дошли.
Индексация в массиве - только в процессе обучения. Потом - это операция (A >> dist) & 1 (массив предращается в 64 битное число)
Входы - разные биты input - не уверен что будет работать. для распознавания символов планируется ранговое кодирование. Для друих задач - "heatmap" - больше число - больше единиц в байте
У нас массив A (LUT) позволяет задать любую нелинейную реакцию на расстояние (так что скорее продвинутый а не урезанный персептрон).
Для обучения планируем опираться на принципы Feedback Alignment и Target Propagation. В нашем Proof of Concept для MNIST планируем использовать логику близкую к Extreme Learning Machines (ELM): скрытые слои создают случайную проекцию признаков, а обучается только последний слой (статистически). Теоретически градиентный спуск тут не нужен, но покажут тесты..
Маски - это просто статические случайные "картинки" они не меняются в процессе обучения
да, я думаю когда руки дойдут еще одну статью уже с двигателем и файлом проекта создать, который можно бедет в солвере открыть, но вилимо не скоро(