Search
Write a publication
Pull to refresh
8
0
Send message

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

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

Если можно, я разовью свою мысль: комплексное число олицетворяет вектор, тогда как действительное число олицетворяет скаляр. Меня смущает, что при определенных поворотах комплексное число становится действительным. Возникает вопрос: можно ли как-то отделить скалярную величину от векторной, сохраняя при этом гибридную струтуру комплексного числа? Т.е. можно ли составить комплексное число из скаляра и вектора? Вот к чему я пришел в своих рассуждениях.
Комплексное число, как вектор обладает величиной и направлением, которые можно варьировать. Допустим, мы возьмем некоторый вектор и начнем его равномерно вращать и получим функцию, описывающую вращение A*e^i{2*pi*f*t+fi}, где A - амплитуда, f частота и fi - начальная фаза вращения. t - это время. В таком представлении A и fi задают векторную величину, а f задает скаляр. Т.е. мы имеем комплексное число вида (f, A, fi). Теперь ведем операцию сложения (f1,A1,fi1) + (f2,A2,fi2) = A1*e^i{2*pi*f1*t+fi1} * A2*e^i{2*pi*f2*t+fi2} которая позволяет складывать скаляры со скалярами и векторы с векторами нигде не пересекаясь. Действительные числа в такой системе получаются путем установки fi в 0 для положительной полуоси или в pi для отрицательной. Умножить здесь можно только на целые числа путем повторения операции сложения. Можно ли построить калькулятор на таких постоянно вращающихся битах?

Раз уж здесь все обсуждают различные сомнительные применения мнимой единицы, вложу ка и я свою лепту. Современная вычислительная техника работает в парадигме кодирования информации с помощью бит - это минимальная единица информации, охватывающая лишь два состояния 0 (низкое состояние) или 1 (высокое состояние). Физически, это осуществляется либо за счет тока 0 - ток не течет, 1 - ток течет в TTL логике, либо за счет напряжения 0 - напряжение или заряд отсутствует, 1 - напряжение присутствует в CMOS логике. Энергетически такая система кодирования является наиболее выгодной, но если мы расширим диапазон в сторону негативных значений, то получим довольно интереные эффекты. Закодируем -1 (минус единицей) высокое состояние, когда ток течет в обратную сторону или напряжение отрицательное, а 1 (плюс единицей) низкое состояние, когда ток течет в прямом направлении или напряжение положительное. Тогда возможны два перехода: либо из низкого состояния в высокое, либо из высокого в низкое. Включим воображение и представим, что эти два состояния представлены двумя точками кружности (вы можете в воображении представить себе двоичный кассовый аппарат с дисками, на которых нанесены две цифры на противоположных концах 0 и 1). Получается, что переход из одного состояния в другое происходит по одной из двух половинок окружности. Пойдем дальше и нанесем на эту оружность еще две точки: средняя точка первой полуокружности будет 1i, a средняя точка второй -1i. Таким образом, при переходе от 1 к -1 в окошке апарата на мгновение мелькнет 1i, а при переходе от -1 к 1 мелькнет -1i. Чтобы избежать мельтешения мы можем добавить в наш "аппарат" второй мнимый диск (но это не обязательно), который будет вращаться синхронно с реальным диском, но будет предварительно повернут на 90 градусов. Т.е. он будет показвать состояние мнимого бита: 1i или -1i.
Теперь посмотрим, как будут выглядеть классические бинарные операции в такой кодировке на примере, допустим, функции AND. Но, сначала свяжем битовые коды -1 и 1 с углом поворота точки (1,0) на единичной окружности. Углу поворота 0 градусов соответствует низкое состояние - код 1, тогда как углу поворота 180 градусов соответствует высокое состояние - код -1. Функция AND для старомодных битов 0 и 1 дает высокое состояние только тогда, когда оба ее входа находятся в высоком состоянии, что эквивалентно вычислению минимума, когда мы оперируем кодами битов как числами. Для наших "новых" кодов -1 и 1 взятие минимума не срабатывает, но только лишь потому что мы берем не тот минимум. В новой кодировке следует брать наименьший из углов поворота среди двух битов на входе, что собственно позволяет определить функцию AND в том числе и для мнимых битов 1i и -1i, как впрочем и для любых других точек на окружности и тем самым построить инновационную логику бит с бесконечным числом кодов. Таким способом - через повороты, мы можем определить и все остальные булевы функции XOR, OR, NAND и пр. Что думаете?

Ох, да — мой косяк, спешил на обед 🙂

Спасибо за замечание, вы правы: я ошибся в переходе и не учёл масштабирование. Вот правильная формула и переход

XOR(x_1,x_2)=\frac{1}{2}\left(\sqrt{2}cos\left(\pi x_1 + \frac{\pi}{2} x_2- \frac{3\pi}{4}\right) +1\right)

Справедливое замечание — действительно, в приведённой формуле точное равенство не соблюдается в битовой кодировке 0 и 1.

Но я хотел бы уточнить, что в статье используется альтернативная кодировка входов и выходов: -1 и 1.

Разумеется, для получения абсолютного равенства нужно было бы выписать результат в аналитическом виде и сделать поправку на смещения

XOR(x_1,x_2)=\frac{1}{2} \left(\sqrt{2}cos\left(\frac{\pi}{2}x_1+\frac{\pi}{4}x_2 \right) +1\right)

Но основной акцент я делал на то, что нейросети всегда работают с приближёнными значениями.

Спасибо за внимательное прочтение!

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

Архитектура свёрточной сети, на мой взгляд, излишне ограничена: она вынужденно "смотрит" на сигнал через узкое окно, и это ограничение накладывается не столько вычислительными возможностями, сколько самой структурой входных данных. Свёрточная сеть опирается на текущую точку и её сдвинутые копии и лишь за счёт этой “окрестности” может ориентироваться в последовательности.

Моя цель — научиться извлекать позиционную информацию из одной точки, без обращения к соседним значениям. Именно этому будет посвящена следующая статья.

Спасибо за содержательный комментарий!

Информацию по прямому распространению ошибки я не нашел. Похоже все увлечены обратным. Идея прямого обучения довольно проста. Если вкраце: нейрон состоит из двух частей - линейной и нелинейной. Неочевидный факт, на который никто не обращает внимения состоит в том, что нейроны "видят" на своем входе сигнал. Представьте, что данный сигнал состоит из набора гармонических составляющих. Тогда линейная часть отвечает за их линейную модификацию, т.е. за изменение амплитуд и фаз. А нелинейная часть отвечает за перемещение их энергии между частотами. Создать линейный фильтр с заданными характеристиками просто. С нелинейными фильтрами дела обстоят сложно. Могу лишь сказать, что традиционные функции активации очень плохо двигают энергию по спектру. Например, классическая сигмоида, большую часть энергии оставляет на месте, ReLu чуть побольше энергии перемещает в строну удвоенных частот. Идеальными двигателями энергии являются многочлены Чебышева. Зная спектр на входе и на выходе, можно подобрать подходящий многочлен. В общем, можно строить сеть непосредственно двигаясь от входа к выходу, добавляя нейроны по смыслу с нужными линейными и нелинейными фильтрами на каждом этапе. Результатом такого строительства получится "пассивный" вариант сети. Активный вариант сети можно посмотреть у меня на Kaggle по ключевому слову Rainbow.Net

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

Альтернативный подход, который можно назвать "нейронными сетями прямого обучения", может помочь решить эти проблемы, делая структуру решений более прозрачной. Он позволяет выявлять неочевидные закономерности, например, тот факт, что в разобранном автором примере "логического ИЛИ" полученное решение на самом деле является сверточной нейросетью для последовательности [0, 0, 1, 1]. Также оказывается, что для реализации "логического ИЛИ" требуется на один нейрон больше, чем для "исключающего ИЛИ", а само решение можно получить всего за один прямой проход.

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

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

Information

Rating
715-th
Registered
Activity