Введение

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

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

Алгоритм обратного распространения ошибки (backpropagation) сделал обучение глубоких сетей возможным, но сам по себе он не объясняет природу представлений, формирующихся внутри модели. Более того, одна и та же задача может быть решена совершенно разными внутренними конфигурациями, что порождает эффект неоднозначности решений и отсутствия интерпретируемости.

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

Что именно передаётся по слоям нейросети? Что является носителем информации? И как можно это контролировать?

В первой части мы построим нейросеть вручную — без градиентов и обратного распространения — опираясь только на линейные и нелинейные преобразования сигнала. Строить мы будем «сети» для решения классических логических задач XOR, OR и других. А во второй части мы сделаем следующий шаг: попробуем отказаться от амплитудно-фазового кодирования и перейти к частотному представлению информации — более устойчивому, прозрачному и, возможно, более универсальному.

Что такое гармонический сигнал?

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

Классическая форма гармонического сигнала в непрерывном времени:

x(t) = A \cos(2\pi\omega t + \varphi_0)

где:

  • A — это амплитуда, максимальное отклонение от нулевого уровня;

  • \omega = \frac{1}{T}​ частота колебаний, задаёт скорость вращения фазы. Несмотря на небольшую путаницу, также будет означать циклическую частоту \omega = \frac{2\pi}{T}​ ;

  • \varphi_0​ — начальная фаза, положение сигнала в момент времени t = 0;

  • t — непрерывное время;

  • x(t) — значение сигнала в момент времени t.

Характеристики гармонического колебания
Характеристики гармонического колебания

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

А что происходит в цифровой системе?

В цифровой системе времени как такового нет — вместо него используется дискретный индекс. Сигнал превращается в последовательность значений:

\{ x_0, x_1, \dots, x_{N-1} \}, \quad \text{где} \quad x_i = A \cos(\omega t_i + \varphi_0)

Время дискретизируется с постоянным шагом T_0​, так что:

t_i = i \cdot T_0, \quad i = 0, 1, \dots, N-1

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

Периодические сигналы и спектр

Сигнал x(t) называется периодическим, если он повторяется через фиксированный промежуток времени T, называемый периодом:

x(t) = x(t \pm nT), \quad n = 0, \pm 1, \pm 2, \dots
Примеры периодических сигналов разной формы с периодом Т = 0,2
Примеры периодических сигналов разной формы с периодом Т = 0,2

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

x(t) = \frac{a_0}{2} + \sum_{k=1}^{\infty} \left( a_k \cos(k\omega_0 t) + b_k \sin(k\omega_0 t) \right)

или, в более компактной форме:

x(t) = A_0 + \sum_{k=1}^{\infty} A_k \cos(k\omega_0 t - \varphi_k)

где:


  • \omega_0 = \frac{2\pi}{T}​ — основная (фундаментальная) частота,

  • A_k​ — амплитуда k-й гармоники,

  • \varphi_k​ — фаза соответствующей гармоники.

Спектр: частотная подпись сигнала

Разложение в ряд Фурье позволяет получить амплитудный спектр — зависимость A_k​ от k\omega_0​. Это и есть частотная подпись сигнала, показывающая, какие частоты участвуют в формировании сигнала и с какой мощностью.

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

  • Компонент для k = 0 — это DC-составляющая (прямой ток или среднее значение);

  • k = 1основная гармоника;

  • k = 2, 3, \dotsвысшие гармоники.

Зачастую, в спектральном анализе, фазовый спектр — \varphi_k играет вспомогательную роль: для восприятия на слух или для анализа структуры сигнала достаточно одной только амплитуды.

Амплитудный спектр напряжения в электрической розетке 220В 50Гц :)
Амплитудный спектр напряжения в электрической розетке 220В 50Гц :)

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

Дискретное преобразование Фурье (ДПФ)

Когда мы складываем два числа, например 4 + 8 = 12, мы не можем восстановить исходные слагаемые только по результату — информация о них безвозвратно потеряна. Результирующее число 12 — это что-то наподобие черной дыры, которая поглотила слагаемые и не отдает их обратно: осталась только суммарная масса 12, а исходная информация о слагаемых потеряна навсегда. Мы не можем определить, располагая числом, что изначально упало в эту «черную дыру»: то ли 1 и 11, то ли 6 и 6, а может, действительно, 4 и 8. Но сигналы ведут себя иначе. Если сложить, скажем, две синусоиды разных частот:

x(t) = 2\cos\left( \frac{2\pi}{3} t \right) + 9\cos\left( \frac{2\pi}{8} t + \pi \right)

то они не мешают друг другу: каждая гармоника остаётся «своей», и их можно извлечь обратно. Именно это свойство и лежит в основе дискретного преобразования Фурье (ДПФ) — метода, позволяющего разложить сигнал на составляющие частоты, даже если у нас есть только конечное число отсчётов.

Как это работает?

Пусть у нас есть дискретный сигнал из N отсчётов:

\{ x_0, x_1, \dots, x_{N-1} \}

Мы хотим представить его как сумму синусоид с разными частотами. Для этого вычисляются коэффициенты:

a_k = \sum_{n=0}^{N-1} x_n \cos\left( \frac{2\pi k n}{N} \right), \quad b_k = -\sum_{n=0}^{N-1} x_n \sin\left( \frac{2\pi k n}{N} \right)

где k = 0, 1, \dots, N-1 — номер гармоники.

На их основе определяются:

  • Амплитудный спектр:

|X_k| = \frac{1}{N} \sqrt{a_k^2 + b_k^2}∣

  • Фазовый спектр:

\angle X_k = \text{atan2}(b_k, a_k)

Почему работает только половина? И при чём здесь поляризация?

При вычислении ДПФ для сигнала длины N, мы получаем N комплексных коэффициентов X_k​, соответствующих разным гармоническим компонентам. Но оказывается, что вторая половина спектра — это зеркальное отражение первой, и она не несёт новой информации. Почему?

Это связано с тем, что исходный сигнал x_n​вещественный. А у вещественного сигнала спектр обладает сопряжённой симметрией:

X_{N-k} = \overline{X_k}, \quad \text{для } k = 1, \dots, N/2-1

То есть если мы знаем X_k​, мы автоматически знаем X_{N-k}​. Таким образом, только первые N/2 значений (включая DC-компонент и среднюю точку) представляют собой независимую информацию.

Геометрическое объяснение: вращение в плоскости

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

  • Линейная поляризация: синусоида, лежащая в одном направлении (прямая осцилляция).

  • Круговая или эллиптическая поляризация: вектор описывает круг или эллипс — как это делают комплексные экспоненты e^{i\omega t}.

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

Отсюда и возникает зеркальность: вращение вправо компенсируется вращением влево, и мы получаем только половину полезного спектра. Полный круг вектора состоит из двух половинок, но вещественный сигнал может выразить только одну половину движения — вторая задаётся автоматически.

Из сигнала длины N мы можем надёжно извлечь максимум N/2 уникальных частот. Это ограничение связано не с алгоритмом, а с природой вещественных данных: информация, содержащаяся в спектре удваивается лишь в комплексной плоскости, но остаётся половинчатой в реальности.

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

Исследование отклика нейрона на сигнал

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

  1. Функция агрегации — взвешенное суммирование входов;

  2. Функция активации — нелинейное преобразование результата агрегации.

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

? Агрегация: складываем гармоники

Классическая функция агрегации имеет вид:

S(t) = \sum_{i=1}^n w_i \cdot x_i(t)

Если на вход подаются сигналы с разными частотами (гармониками), то агрегация просто мультиплексирует их: каждая гармоника передаётся на выход с усилением в w_i раз (и возможным переворотом фазы, если знак отрицательный).

Пример:
Пусть у нейрона будет два таких входа:

  • x_1(t) = \cos(2\pi \cdot 3t), вес w_1 = 2

  • x_2(t) = \cos(2\pi \cdot 8t), вес w_2 = -9

Тогда результат агрегации:

S(t) = 2\cos(2\pi \cdot 3t) + 9\cos(2\pi \cdot 8t + \pi)

Сигнал успешно проходит через нейрон: все гармоники сохраняются, их можно полностью восстановить — то есть, агрегатор действует как мультиплексор.

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

Пример интерференции двух одинаковых частот:

\cos(\omega t + \varphi_1) + \cos(\omega t + \varphi_2) = 2\cos\left(\frac{\varphi_1 - \varphi_2}{2}\right) \cdot \cos\left(\omega t + \frac{\varphi_1 + \varphi_2}{2} \right)

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

? Активация: нелинейная трансформация спектра

Функция активации применяет к результату агрегации S(t)некоторое нелинейное преобразование f(S). В эту операцию заложено главное изменение сигнала. Мы возьмем для демонстрации принципа только пару наиболее известных функций активации:

1. Гиперболический тангенс:

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

На спектрограмме выше мы не видим существенных изменений: в сигнале присутствует одна исходная гармоника x(t)=0.4cos(\frac{2π}{20}t​). Стоит увеличить амплитуду гармоники на входе до 2, как картина меняется:

Помимо основной гармоники на спектрограмме начинаются проявляться также высшие гармоники (3-я и 5-я в данном случае). И, если довести до крайности, например, сделав амплитуду на входе равной 100, на выходе получим меандр с бесконечной спектрограммой:

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

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

2. ReLU (линейный выпрямитель):

Какие изменения заметны:

  1. Существенная часть исходной гармоники трансформировалась в константу DC. Отсюда название функции выпрямитель

  2. Заметная доля энергии «утекла» в гармонику с удвоенной частотой.

  3. Энергия остальных гармоник несущественная.

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

? Какие общие закономерности хотелось бы выделить на основе этих двух примеров

  • Функция агрегации — управляет амплитудами и фазами, но сохраняет частоты;

  • Нелинейная активация — создаёт новые частоты, модулирует спектр;

  • Если подавать на нейрон сигнал, состоящий из несколько гармоник — результат становится непредсказуемым.

Обучение нейронных сетей через построение

Пример 1. XOR

Hello world! для нейронных сетей - это функция XOR. Логическая функция XOR не выражается через комбинацию линейных операций и задается следующей таблицей:

Таблица истинности XOR

x_1

x_2

y=XOR(x_1,x_2)

0

0

0

0

1

1

1

1

0

1

0

1

Выход логического элемента XOR находится в высоком состоянии (1), только тогда, когда ровно один его вход находится в высоком состоянии. 

Обратим внимание на то, что таблица состояния входов есть ничто иное как траекторная матрица сигнала 

x_i​

0

0

1

1

Поскольку каждый столбец траекторной матрицы — это циклический сдвиг одного и того же сигнала, их спектры одинаковы по амплитудам и отличаются лишь фазами. Нейронная сеть, которую мы построим будет являться сверточной: ее веса будут «скользить» вдоль сигнала x в соответствии со строками траекторной матрицы. Чтобы не возиться со смещениями нейронов перекодируем исходный сигнал в [-1;-1;1;1], и, соответственно, траекторную матрицу в 

x_1

x_2

y

-1

-1

-1

-1

1

1

1

1

-1

1

-1

1

Это делается для устранения DC-составляющей (нулевой гармоники), чтобы сосредоточиться только на осцилляциях сигнала.

Выполним ДПФ и получим следующие спектрограммы в терминах амплитуд и фаз

Гармоника (k)

x_1 (A, \phi)

x_2

y

0 DC

0.000, 0.000

0.000, 0.000

0.000, 0.000

1

0.707, 2.356

0.707, -2.356

0.000, 0.000

2

0.000, 0.000

0.000, 0.000

1.000, -3.141

3

0.707, -2.356

0.707, 2.356

0.000, 0.000

где мы наблюдаем на входе лишь одну основную гармонику k = 1, а на выходе есть только высшая гармоника k = 2. Помним, что гармоника k = 3 — это зеркальное отражение гармоники #1, а вдвоем они несут полную энергию сигнала. У гармоники #2 на выходе нет зеркальной пары, поэтому она работает за двоих и ее магнитуда равна 1. Нулевую гармонику (DC) мы специально устранили перекодировкой. 

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

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

Поэтому нам нужен специальный тип функции активации, который в чистом виде реализует удвоение частоты. Это — многочлен Чебышева первого рода второй степени:

T_2(x) = 2x^2 - 1

Он обладает фундаментальным свойством:

T_2(\cos(\omega t)) = \cos(2\omega t)

То есть, если на вход поступает синусоидальный сигнал с частотой \omega, функция T_2​ возвращает чистую гармонику с частотой 2\omegaбез сторонних артефактов и паразитных компонентов. Это делает T_2​ идеальным кандидатом для построения управляемой нейросети, работающей на уровне частот.

Очевидно, что выходной нейрон будущей «нейронки» будет работать как частотный удвоитель и двигать гармонику #1 в позицию #2. Определим параметры гармоники на входе функции активации: Aвх​ = 1\phiвх=−\frac{\pi}{2}​​. При применении удвоителя к сигналу единичной амплитуды, амплитуда на выходе сохраняется, а начальная фаза удваивается. Этот этап довольно прост. Далее нам потребуется определить коэффициенты функции агрегации так, чтобы в результате получился сигнал с запланированными параметрами. Руководствуясь формулой сложения векторов, определяем коэффициенты (-0.5;0.5). Проверяем

Гармоника (k)

s=-0.5x_1+0.5x_2(A, \phi)

0 DC

0.000, 0.000

1

0.500, -1.571

2

0.000, 0.000

3

0.500, 1.570

И, соответственно, решение задачи из одного нейрона XOR(x_1,x_2)=T_2(\frac{−x_1+x_2}{2}​). Это был простой пример.

Продолжение: сохраняется ли решение при перестановке строк?

Мы показали, как построить выходной нейрон, действующий как частотный удвоитель: он переносит основную гармонику k = 1 на место k = 2. Это стало возможным благодаря особой структуре входных данных — траекторной матрице, в которой столбцы являются циклическими сдвигами одной и той же последовательности.

В примере:

  • Входной сигнал содержал только одну фундаментальную гармонику;

  • Применение функции T_2(x) = 2x^2 - 1 дало нам чистую вторую гармонику с удвоенной фазой;

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

Результат — решение задачи XOR с помощью одного нейрона, полностью построенного вручную и работающего в частотной парадигме.

Осознание допущения: мы использовали порядок

Но давайте задумаемся: что именно мы сделали?

Фактически, мы:

  • Сопоставили входы и выходы по таблице истинности;

  • Использовали тот факт, что входные последовательности являются циклическими сдвигами;

  • Построили решение, опирающееся на вторичную структуру данных, которая не имеет прямого отношения к логике функции XOR.

Возникает закономерный вопрос:

А если строки таблицы переставить? Смогли бы мы всё ещё построить решение? И если да, то каким образом?

Новый эксперимент: нарушим порядок

Возьмём всё ту же функцию XOR, но поменяем строки таблицы местами, нарушив траекторную структуру:

Таблица истинности XOR с измененным порядком строк

x_1

x_2

y

-1

-1

-1

-1

1

1

1

-1

1

1

1

-1

Шаг 1: спектральный анализ

Выполним дискретное преобразование Фурье по каждому столбцу. Получим следующие спектры:

Гармоника (k)

x_1 (A, \phi)

x_2

y

0 DC

0.000, 0.000

0.000, 0.000

0.000, 0.000

1

0.707, 2.356

0.000, 0.000

0.707, -2.356

2

0.000, 0.000

1.000, 3.142

0.000, 0.000

3

0.707, -2.356

0.000, 0.000

0.707, -2.356

Что мы видим:

  • На входах и выходе по-прежнему есть первая гармоника, но теперь они имеют разные фазы;

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

Интересно, что такие входы в точности кодируют последовательность натуральных чисел. Это наталкивает нас на мысль: может ли функция XOR быть восстановлена как спектральная функция от параметра t?

Шаг 2: введём параметр времени

Добавим в таблицу вспомогательную переменную t, которая фактически отражает номер строки от 0 до 3:

x_1

x_2

t

y

-1

-1

0.000

-1

-1

1

1.571

1

1

-1

3.142

1

1

1

4.712

-1

Теперь выполним ДПФ для последовательности t:

Гармоника (k)

t(A, \phi)

0 DC

2.356, 0.000

1

1.110, 2.356

2

0.785, 3.142

3

1.110, -2.356

Сравните это со спектром x_1​: совпадение фаз гармоники k = 1 — не случайность. Поскольку x_1​ и t описывают одну и ту же монотонную последовательность, их спектры частично совпадают. Это же касается и x_2. Теперь мы можем представить t в виде t=\frac{1.11}{0.707}x_1+0.785x_2+2.356, из которого сразу же следует решение:

XOR(x_1,x_2)=1.414\cdot cos(1.571x_1+0.785x_2)

Общность и уникальность решений

В рамках нашей задачи XOR мы перебрали все возможные варианты упорядочивания строк, и, как следствие:

Других по существу отличающихся решений в нашей парадигме не существует —любая другая сортировка приведет к одному из двух рассмотренных вариантов, отличающихся лишь фазами.

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

Если мы строим функцию, опираясь на порядок (например, на траекторную структуру), то каждой перестановке строк может соответствовать своё уникальное решение. Но все эти решения вычисляют одну и ту же таблицу, вне зависимости от порядка.

Таким образом, порядок важен на этапе построения сети, но становится несущественным при её эксплуатации. Сеть будет корректно работать, даже если входные данные будут поданы в другом порядке — при условии, что соответствие между входами и выходами сохранено.

Свойства решения распространяются на всю эквивалентность

Что это означает на практике?

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

Таким образом:

  • Наше первое решение, построенное через траекторную матрицу, действительно является свёрточным;

  • Второе решение, полученное после перестановки строк, можно также перевести в свёрточную форму, упорядочив входы соответствующим образом;

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

И наоборот: второе решение опирается на счёт: оно привязывает результат к порядковому номеру строки. Следовательно, и первое решение также можно интерпретировать как считающее, если представить, что строки упорядочены по параметру t.

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

Пример 2. AND

Продолжим исследование и применим нашу методику к построению других логических функций. Следующей в списке будет логическая функция AND.

Таблица истинности AND (в кодировке -1 / 1):

x_1

x_2

y=AND(x_1,x_2)

-1

-1

-1

-1

1

-1

1

1

1

1

-1

-1

Выход логического элемента AND находится в высоком состоянии (1), только тогда, когда оба входа равны 1. Во всех остальных случаях результат равен -1.

Выполним ДПФ и получим спектрограммы

Гармоника (k)

x_1 (A, \phi)

x_2

y

0 DC

0.000, 0.000

0.000, 0.000

0.500, 3.142

1

0.707, 2.356

0.707, -2.356

0.500, 3.142

2

0.000, 0.000

0.000, 0.000

0.500, 0.000

3

0.707, -2.356

0.707, 2.356

0.500, 3.142

Мы видим, что на выходе присутствуют все гармоники, в отличие от XOR, где спектр был «более разреженным». Понятно, что для такого простого случая есть всего две степени разреженности, но тем не менее для больших задач степень разреженности спетра на выходе играет главную роль в определении ее сложности.

План построения

Поймём, как сконструировать нейроны, воспроизводящие такую зависимость. Идём поэтапно:

  1. DC-составляющая (нулевая гармоника) — добавим в конце, как сдвиг.

  2. Первая гармоника — получим суммированием входных векторов x_1 + x_2​. Их сумма:

    x_1 + x_2 = 0.707 \cdot e^{2.356i} + 0.707 \cdot e^{-2.356i} = \\\\ (-0.5+0.5i) + (-0.5-0.5i) = -1 = 1.0 \cdot e^{i\pi}

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

  3. Вторая гармоника — создаётся функцией активации-удвоителем. Требуемая гармоника на выходе:

    A = 0.5,\quad \phi = 0 \quad \Rightarrow \quad A \cdot e^{i\phi} = 0.5 + 0i

    Чтобы получить её, на вход функции активации необходимо подать:

    z =1 \cdot e^{i0/2} = 1 + 0i или сумму (x_1+x_2), знак которой не важен из-за квадрата в удвоителе.

Теперь всё готово. Конструируем агрегационную функцию, подаём её на функцию активации (удвоитель), добавляем сдвиг DC и, получаем искомую реализацию AND.

AND(x_1,x_2)=0.5(x_1+x_2)+0.5T_2(\frac{x_1+x_2}{2})-0.5

Посмотрим, что получилось: в отличие от XOR, где спектр был локализован, функция AND демонстрирует полный спектр гармоник и это неудивительно: из четырёх возможных входов только один даёт положительный результат, т.е. целевая функция близка по смыслу к дельта-функции, а дельта-функция в спектральном представлении содержит все частоты. Таким образом, можно сделать обобщённый вывод:

Чем более «уникален» класс (реже встречается), тем более равномерно распределена энергия его спектра. А значит, тем сложнее его выделить, поскольку требуется настройка на множество гармоник.

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

Ещё одно наблюдение: природа бинарного разделения

Дополнительную трудность создают все задачи бинарной классификации, в которых требуется разделить множество данных на два класса. Почему?

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

Однако, функция ступеньки является разрывной, в то время как нейронная сеть строится из непрерывных функций (включая ReLU, tanh и др.). Это несоответствие приводит к типичным побочным эффектам:

  • Появлению неустранимых осцилляций (в ряде Фурье ступенька требует бесконечного числа гармоник). Осцилляции можно подавлять примененяя отрицательную обратную связь, но это рекуррентные сети и уже совсем другой коленкор;

  • Формированию переходной зоны — вместо чёткой ступеньки возникает гладкий наклон.

Однако проблема здесь несколько смягчается:

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

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

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

Пример 3. OR

Будем двигаться дальше по тому же пути. Следующей в списке будет логическая операция OR.

Таблица истинности OR (в кодировке -1 / 1 как и ранее):

x_1

x_2

y=OR(x_1,x_2)

-1

-1

-1

-1

1

1

1

1

1

1

-1

1

Выход логического элемента OR находится в высоком состоянии (1) всегда, когда хотя бы один из его входов равен 1. Иначе результат равен -1. Таким образом, только одна строка таблицы соответствует классу -1, что делает задачу аналогичной AND, но с противоположной симметрией.

Проведём дискретное преобразование Фурье для входов и выхода:

Гармоника (k)

x_1 (A, \phi)

x_2

y

0 DC

0.000, 0.000

0.000, 0.000

0.500, 0.000

1

0.707, 2.356

0.707, -2.356

0.500, 3.142

2

0.000, 0.000

0.000, 0.000

0.500, 3.142

3

0.707, -2.356

0.707, 2.356

0.500, 3.142

Комментарии к спектру

  • DC-компонента на выходе составляет 0.5 и ее мы добавим в конце.

  • Первая гармоника у выходного сигнала точно такая же, как в случае AND.

  • Вторая гармоника соответствует по характеристикам случаю XOR.

Таким образом, выходной сигнал y = OR(x₁, x₂) содержит полный спектр гармоник, аналогично функции AND, но с отличающимся фазовым рисунком.

OR(x_1,x_2)=0.5(x_1+x_2)+0.5T_2(\frac{x_1-x_2}{2})+0.5

Пример 4. Счёт

По мотивам первого примера научим нейронную сеть считать. Задача будет состоять в том, чтобы сопоставить каждому входу его натуральный порядковый номер. Входные данные отсортированы в свёрточном порядке, и целевая переменная — это просто номер строки (от 0 до 3).

Таблица: перевод свёрточного порядка в натуральный

x_1

x_2

y (порядковый номер)

-1

-1

0

-1

1

1

1

1

2

1

-1

3

Шаг 1: спектральный анализ

Выполним дискретное преобразование Фурье для каждого из трёх столбцов:

Гармоника (k)

x_1 (A, \phi)

x_2

y

0 DC

0.000, 0.000

0.000, 0.000

1.500, 0.000

1

0.707, 2.356

0.000, 0.000

0.707, 2.356

2

0.000, 0.000

1.000, 3.142

0.500, 3.142

3

0.707, -2.356

0.000, 0.000

0.707, -2.356

Шаг 2: проектирование нейронной сети

Как и раньше, будем использовать два нейрона:

  • Первый будет линейным и передавать гармонику k = 1;

  • Второй — удваивать частоту, формируя гармонику k = 2;

  • В конце прибавим константу DC для смещения.

Поскольку гармоника k = 1 у выходного сигнала совпадает с x₁, мы можем напрямую использовать сигнал x₁ в линейном нейроне. Гармоника k = 2 по форме и фазе совпадает с тем, что мы уже строили в примере 3 — так что второй нейрон можно просто переиспользовать оттуда. И, наконец, добавляем константу 1.5, чтобы учесть DC-компонент.

N(x_1,x_2)=x_1+0.5T_2(\frac{x_1-x_2}{2})+1.5

Мы научили сеть переводить свёрточный порядок в натуральный счёт — то есть извлекать из сигнала информацию о его порядковом номере.

Если проанализировать работу каждого нейрона отдельно (при нормализации выходов до амплитуды 1), становится видно, что:

  • первый нейрон отвечает за старший разряд порядкового номера — он задаёт крупный шаг;

  • второй нейрон — за младший разряд, уточняя положение внутри пары.

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

Но этим примером я хотел продемонстрировать ещё одно важное свойство свёрточной нейросети:

отсутствие внутренней памяти.

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

Заключение

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

Что мы выяснили:

  • Таблица истинности может быть представлена как траекторная матрица сигнала, где каждая строка — это временной срез, а каждый столбец — компонент сигнала.

  • Прямое спектральное разложение позволяет поэтапно синтезировать требуемое поведение нейросети.

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

  • Логические функции, такие как XOR, AND, OR и даже счёт, можно выразить в виде частотных конструкций, где каждый нейрон играет роль частотного фильтра, модулятора или фазового сдвига.

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

Метафорически, это можно сравнить с ситуацией на дороге:

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

Точно так же и в нейросети: гладкая поверхность не способна строго отделить классы, если примеры проникают друг в друга. Классические нейронные сети строятся на парадигме амплитудно-фазового кодирования. Эта традиция уходит корнями к временам персептрона, когда Розенблатт сформулировал модель, в которой рецепторы выдавали бинарный отклик: «есть сигнал — 1, нет сигнала — 0». Такой подход зафиксировал представление о сигнале как о мгновенном значении, определяемом только амплитудой и фазой. Но если бы тогда речь шла не о фиксированном значении, а о передаче сообщения во времени, история нейросетей могла бы пойти по совершенно иному пути.

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

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


? Вопросы, замечания и размышления приветствуются в комментариях.
Особенно если вы интересуетесь альтернативами backpropagation, работаете со спектральными методами или исследуете структуру обучаемых сетей без стохастического градиента.

Комментарии (15)


  1. S_A
    02.06.2025 01:12

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

    Вся проблема в выборе функции "положения" нейрона. Я не подобрал) возможно это можно сделать другой сеткой или RL, или например KAN. Вобщем, поле для экспериментов есть, времени нет.


  1. Refridgerator
    02.06.2025 01:12

    Например, если перемешать фазы в аудиосигнале, то вы почти не заметите изменений на слух

    Заметите. Например, если просто поменять знаки фаз в спектре - во временном домене это приведёт к реверсу, то есть звук будет воспроизводиться задом наперёд.

    Ну а применительно к теме больше смысла рассматривать не преобразование Фурье, а преобразование Лапласа, как это делается в электротехнике. Там тоже есть частоты и фазы, но а) он определён от 0 до бесконечности и б) для действительных чисел.


    1. enemigo Автор
      02.06.2025 01:12

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

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

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

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


      1. S_A
        02.06.2025 01:12

        а я вот соглашусь насчёт преобразования Лапласа, и причины две. была такая сетка, NeuralODE, и неплохо перформила, и с другой стороны, преобразование Лапласа сводит диффуры к рациональным многочленам.

        Короче говоря Лапласом можно извлекать структуру процессов


    1. iShrimp
      02.06.2025 01:12

      Заметите. Например, если просто поменять знаки фаз в спектре - во временном домене это приведёт к реверсу, то есть звук будет воспроизводиться задом наперёд.

      Автор, по-видимому, имел в виду периодический сигнал с коротким периодом. Если взять звуковой сигнал частотой 1 кГц произвольной формы и менять в нём фазы гармоник, то его звучание почти не изменится.

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

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

      Но пока непонятно, как выражать в виде периодического сигнала многомерные непрерывные входные данные. Индексировать их кривой Гильберта?


      1. Refridgerator
        02.06.2025 01:12

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


  1. MAXH0
    02.06.2025 01:12

    Следующий шаг: Фурье–голограммы и распознавание образов))). Довольно старая технология. Но можно попробовать обновить.


  1. cheptsov2016
    02.06.2025 01:12

    В вашей формуле:

    я бы знак равно не ставил, т.к.

    XOR(0,0) = 1.414
    XOR(1,0) = -0.0002879939100249815
    XOR(0,1) = 1.0002470126024203
    XOR(1,1) = -0.9996545088665344


    1. enemigo Автор
      02.06.2025 01:12

      Справедливое замечание — действительно, в приведённой формуле точное равенство не соблюдается в битовой кодировке 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)

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

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


      1. cheptsov2016
        02.06.2025 01:12

        Не, опять чуть-чуть не то...

        XOR(0,0) = 1.2071067811865475
        XOR(1,0) = 0.5
        XOR(0,1) = 1.0
        XOR(1,1) = 0.0

        и поверхность решений вашего выражения не очень: