Работая над собственным проектом Rainbow.Net — нейросетью прямого обучения — я столкнулся с интересной задачей: нейронное кодирование, при котором предполагается, что сигналы, передаваемые между биологическими нейронами, могут обладать огромной информационной ёмкостью. Это вызвало у меня закономерный вопрос:

А какой информационной ёмкостью вообще обладают сигналы в классических искусственных нейросетях?

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

Так и появилась эта статья.

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

И начнём мы, как водится, с самого простого: с гармонического сигнала.

Гармонический сигнал и передача информации

В теории связи гармонический сигнал — это колебание, описываемое синусоидой:

x(t)=A \cdot \sin(2\pi \cdot f \cdot t + \phi)

где A — амплитуда, f — частота, а ϕ — фаза сигнала.

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

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

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

Передавать информацию можно только с помощью случайных сигналов.

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

Обзор способов кодирования номинальных данных

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

1. One-Hot Encoding (OHE)

Каждая категория представляется отдельной бинарной компонентой:

  • «красный» → [1, 0, 0]

  • «зелёный» → [0, 1, 0]

  • «синий» → [0, 0, 1]

Плюсы:

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

Минусы:

  • Высокая размерность при большом числе категорий.

  • Все вектора ортогональны — никакой взаимосвязи между категориями.

2. Ordinal Encoding

Категории просто нумеруются:

  • «красный» → 0

  • «зелёный» → 1

  • «синий» → 2

Плюсы:

  • Минимум памяти.

Минусы:

  • Вводит ложную упорядоченность и метрику (например, что «зелёный» ближе к «синему» чем к «красному»), что может быть вредно.

Отображение кодов классов как сигнала

Рассмотрим самый простой случай: двоичная классификация. Для удобства и большей симметрии мы будем использовать значения -1 и 1 вместо стандартных 0 и 1 — в дальнейшем это позволит лучше анализировать «информационный» характер кода.

В традиционной one-hot кодировке два класса кодируются векторами вида:

  • Класс -1 → [-1, 1]

  • Класс 1 → [1, -1]

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

  • (-1, 1)

  • (1, -1)

Это симметричное и ортогональное представление — удобное с точки зрения линейной разделимости, но для нас интереснее другое:
Как это будет выглядеть, если вместо двумерного пространства мы вернёмся обратно к прямой?
То есть — рассмотрим сами коды классов как последовательность значений, как дискретный сигнал.

Классы как сигнал

Представим, что у нас есть тренировочный набор из N объектов, размеченных как -1 или 1. Отсортируем эти объекты по убыванию. Получим последовательность меток:

y=[1,1,1,1,1,−1,−1,−1,−1,−1]

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

Что мы увидим?

Если мы изобразим последовательность меток −1 и 1 как сигнал во времени, упорядочив примеры, то получим один период меандра длиной, равной числу тренировочных примеров.
Если мы изобразим последовательность меток −1 и 1 как сигнал во времени, упорядочив примеры, то получим один период меандра длиной, равной числу тренировочных примеров.

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

Однако можно поступить иначе:

Устранить разрыв можно, заменив меандр его фундаментальной гармоникой.

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

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

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

Комплексное представление: аналитический сигнал

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

Рассмотрим базовые синусоиды:

  • Реальная часть: cos⁡(ωt)

  • Мнимая часть: sin⁡(ωt)

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

  • Класс -1 → cos⁡(ωt+π)+isin⁡(ωt+π)=−e^{iωt}

  • Класс 1 → cos⁡(ωt)+isin⁡(ωt)=e^{iωt}

Таким образом, мы заменяем "жесткий" бинарный код (−1 и 1) на вращающиеся векторы на комплексной плоскости — по сути, на фазово-сдвинутые сигналы.

Что мы увидим?

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

Технически мы получили фазовую модуляцию: каждый класс представлен как вектор на единичной окружности, с определённой фазой. Это позволяет легко расширить кодировку на множество классов, просто разделив окружность на равные дуги — по одной на каждый класс. Такой приём хорошо известен в теории связи как M-ary Phase Shift Keying (M-PSK).

Однако у такого подхода есть особенность:

Мы неявно упорядочиваем категории в цикле.

То есть, при переходе от одного класса к другому мы задаём не только факт различия, но и расстояние по фазе между ними. Это вводит метрику, которой в изначальных номинальных данных не существовало. Получается, что в сигнальной плоскости, например, класс 1 «ближе» к классу 2, чем к классу 4, хотя исходные категории могли быть абсолютно независимы.

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

К вершинам информационной плотности: кодировка в стиле QAM

Если мы хотим максимально эффективно кодировать категориальные данные, мы должны не просто повышать энтропию, но и плотно упаковывать информацию в каждом коде. В теории связи для этого давно существует проверенное решение — QAM (Quadrature Amplitude Modulation).

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

Идея QAM

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

Примеры:

  • 4-QAM — 4 точки

  • 16-QAM — 16 точек

  • 64-QAM — 64 точки и т.д.

Каждая точка представляет уникальную комбинацию двух чисел: по оси I (in-phase) и Q (quadrature). Это позволяет кодировать больше информации на единицу сигнала, чем при использовании чисто бинарных схем.

Ключевой сдвиг: один пример — один код

Что, если мы используем не один код на категорию, а уникальный код из QAM-созвездия на каждый тренировочный пример?

  • Это резко повышает энтропию выходного сигнала.

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

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

Такой подход меняет парадигму:

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

Это отличается от классической постановки задачи, где все примеры одного класса стремятся «сжаться» к одной и той же точке в выходном пространстве. При низкой информационной плотности такой кодировки (например, в случае one-hot) множество различных комбинаций внутренних весов могут приводить к одинаковому результату на выходе. В результате:

  • Модель обладает избыточной свободой в принятии решений;

  • Поведение сети становится нестабильным при незначительных изменениях данных;

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

Моя гипотеза: плотность кодировки и стабильность обучения

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

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

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

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

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

Предобучённые модели можно распространять без необходимости переобучения выходных слоёв.

Всё, что требуется — заменить выходной слой на подходящий «наконечник», или иначе — выходной адаптер. В зависимости от задачи, адаптером может быть:

  • обычный массив,

  • база данных,

  • или "эмиттер" — специализированный блок декодирования в рамках парадигмы Rainbow.Net.

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

? Как работает концепция эмиттера на практике, можно посмотреть в соответствующем примере на Kaggle. (ссылка)

Принципы классификации: геометрия как отражение смысла

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

Бинарная классификация: две полуплоскости

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

Если мы используем комплексную или двумерную сигнальную кодировку (например, через аналитический сигнал), то первая компонента (ось I, in-phase) выполняет роль основного классификатора. Класс определяется по её знаку.
Вторая компонента (ось Q, quadrature) активно используется на этапе обучения: она помогает формировать более выразительное и устойчивое представление, управляет геометрией сигнала и может нести вспомогательную фазовую информацию. Однако при инференсе она может быть отброшена, и решение принимается исключительно по знаку компоненты I.

Если коды обучены достаточно точно, такая сигнальная схема даёт важный бонус:

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

Линейно упорядоченные классы: расходящиеся кольца

Если классы имеют естественный порядок (например, «низкий», «средний», «высокий»), это можно отразить геометрически, расположив классы по радиусам — формируя концентрические кольца вокруг начала координат. Это превращает задачу классификации в определение расстояния от центра, а точнее — модуля комплексного (или двумерного) сигнала.

Представим выход модели в виде двумерного сигнала с компонентами:

  • I (in-phase) — по оси X,

  • Q (quadrature) — по оси Y.

Тогда для произвольного выхода \mathbf{z} = (I, Q) расстояние до центра вычисляется как:

r = \sqrt{I^2 + Q^2}

Это и есть радиус, определяющий класс. Например:

  • Класс «низкий» → r \approx 1

  • Класс «средний» → r \approx 2

  • Класс «высокий» → r \approx 3

Таким образом, модель учится управлять амплитудой сигнала, сохраняя произвольную фазу. Это соответствует амплитудной модуляции в QAM, где дальность точки от начала координат — носитель информации.

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

Циклически упорядоченные классы: сектора

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

В такой ситуации удобно использовать сигнальную окружность, разбитую на равные сектора. Это аналог фазовой модуляции в теории связи — M-PSK (Phase Shift Keying).

Сначала определим фазу (аргумент) комплексного числа:

\theta = \text{atan2}(Q, I)

Затем приведём фазу к диапазону [0, 2π):

\theta =  \begin{cases} \theta + 2\pi, & \text{если } \theta < 0 \\ \theta, & \text{иначе} \end{cases}

Если всего M классов (например, 4 направления по компасу), разбиваем круг на M равных секторов, и определяем номер класса.

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

  • Каждому классу соответствует определённый сектор на круге;

  • Классификация превращается в определение угла вектора и выбор ближайшего сектора;

  • Такая кодировка естественно отражает цикличность: класс 0 соседствует с классами M−1 и 1.

А как быть с неупорядоченными категориями?

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

  • Названия городов, стран, компаний;

  • Цвета, формы, имена товаров;

  • Любые ID или текстовые лейблы без внутреннего порядка.

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

  • Все категории разнесены,

  • Нет ложного порядка,

  • Сохраняется компактность представления.

На графике представлено созвездие 3D-QAM из 64 точек — это трёхмерная решётка, каждая точка которой может быть использована как уникальный код для неупорядоченной категории. В отличие от one-hot кодирования (где размерность растёт с числом категорий), здесь всего три измерения позволяют выразить до 64 классов, сохраняя хорошую разнесённость между ними.
На графике представлено созвездие 3D-QAM из 64 точек — это трёхмерная решётка, каждая точка которой может быть использована как уникальный код для неупорядоченной категории. В отличие от one-hot кодирования (где размерность растёт с числом категорий), здесь всего три измерения позволяют выразить до 64 классов, сохраняя хорошую разнесённость между ними.

Границы аналогии: сигнал — это метафора, но не универсальный инструмент

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

  • бинарных задач (через фазу),

  • упорядоченных категорий (радиальные структуры),

  • циклических классов (PSK),

  • ограниченного числа неупорядоченных классов (QAM в 2D или 3D).

Однако при переходе к большим множествам неупорядоченных категорий аналогия начинает давать сбои:

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

  • Даже при использовании 3D-QAM невозможно разместить сотни категорий без потерь в разнесённости.

  • Чтобы обеспечить полную независимость, нужна размерность, сравнимая с числом классов — и это уже one-hot.

Вывод:

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

Заключение: активация как трансформация сигнала

Если рассматривать входные данные и признаки нейросети как сигналы, то и функция активации становится сигнальным преобразованием. В своём проекте Rainbow.Net — нейронной сети прямого обучения — я использую нетипичную функцию активации, основанную на многочлене Чебышёва первого рода второй степени: T_2(x) = 2x^2 - 1

Эта функция возникает естественным образом при обработке синусоидальных сигналов. Если на вход подаётся сигнал вида x = \cos(\omega t), то активация преобразует его в:
T_2(\cos(\omega t)) = \cos(2\omega t)

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

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

Значения функции естественным образом делятся на три зоны:

  1. [-1, 0] — используется для кодирования компонент, попадающих в левые или нижние квадранты сигнальной плоскости;

  2. (0, 1] — соответствует компонентам, размещаемым в правых или верхних квадрантах;

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

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

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

Если у вас есть идеи, сомнения, альтернативные подходы или просто желание поспорить — буду рад обсудить это в комментариях. Особенно интересны мысли от тех, кто работает на стыке теории информации, нейросетей и цифровой обработки сигналов.

Спасибо за внимание — и до связи внизу страницы.

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


  1. MzMz
    13.05.2025 15:27

    как представить категориальные данные для нейросети

    1. One-Hot Encoding (OHE)

    2. Ordinal Encoding

    и ни слова про ембеддинги...