Быстрая и точная классификация радиоволн

Люк Кербс и Джордж Уильямс ([email protected])

Последний раз

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

Поиск сходства

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

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

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

Вложения нейронных сетей

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

Вот архитектура ResNet, которая использовалась для обучения моего классификатора сигналов: данные размерного сигнала 2х1024 вводятся через модель в качестве входных данных, а выход представляет собой 24-мерный список вероятностей, связанных с каждым классом сигналов.

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

Давайте подробнее рассмотрим слой встраивания:

Мы применяем функцию активации сигмоида к каждому отдельному узлу нашего слоя встраивания. Результатом сигмоидной функции является десятичное значение от 0 до 1.

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

Если мы введем данные для некоторого сигнала в нашу модель, мы сможем извлечь выходные данные модели на уровне внедрения - результатом будет список из 50 чисел от нуля до единицы. Результат внедрения может выглядеть примерно так:

[0.5, 0.018, 0.269, 0.007, 0.119, 0.269, 0.953, 0.953, 0.269, 0.881, 0.018, 0.047, 0.047, 0.047, 0.007, 0.018, 0.018, 0.982, 0.047, 0.047, 0.881, 0.047, 0.953, 0.881, 0.881, 0.982, 0.953, 0.731, 0.269, 0.982, 0.5, 0.731, 0.018, 0.269, 0.5, 0.881, 0.119, 0.881, 0.731, 0.5, 0.881, 0.119, 0.119, 0.047, 0.018, 0.881, 0.047, 0.007, 0.119, 0.269]

Визуализация вложений

Как и в предыдущем примере с ростом и весом, мы можем нанести на график функции встраивания, чтобы получить визуальное представление о сходстве. Однако единственная проблема заключается в том, что извлеченные нами векторы признаков являются 50-мерными. Визуализировать простой 2D-график на основе данных о росте и весе очень легко, но мы не можем понять значимую концепцию любой визуализации за пределами третьего измерения.

Решением этой проблемы является алгоритм уменьшения размерности под названием t-SNE. Этот алгоритм позволяет нам проецировать данные встраивания сигнала в 2D-сетку таким образом, чтобы сохранялась исходная кластеризация из 50-мерного пространства.

На изображении выше мы построили точки данных для 20 000 различных радиосигналов. Точки данных одного цвета относятся к одному классу сигнала.

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

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

Если все сигналы, окружающие нашу случайную точку данных, являются сигналами AM, мы можем с некоторой уверенностью предположить, что наша случайная точка данных также является сигналом AM.

Но как насчет большой капли пятнистых смешанных точек данных в середине графика?

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

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

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

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

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

Чтобы преобразовать вектор внедрения в отпечаток битового вектора, мы делаем следующее: если узел больше 0,5, мы устанавливаем узел равным 1. Если узел меньше 0,5, мы устанавливаем узел равным нулю. Вот и все!

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

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

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

k-поиск ближайших соседей

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

Для своего эксперимента я выбрал k = 5. Это означает, что мы ищем в нашей базе данных пять основных сигналов (то есть ближайших соседей), которые имеют наименьшее расстояние Хэмминга до нашего вектора запроса.

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

Оценка производительности

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

Поговорим о том, что означает этот сюжет.

Каждый класс сигналов состоит из множества примеров с разным уровнем шума. Более чистые сигналы имеют наивысшее отношение сигнал / шум, и поэтому их легче классифицировать для поиска сходства ResNet и k-NN. По мере уменьшения отношения сигнал / шум точность снижается.

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

Заключение

Одно из больших преимуществ этого подхода - огромная экономия памяти. Наши исходные сигналы хранятся в виде данных с плавающей запятой размером 2x1024. Для каждого сигнала требуется 65536 бит памяти. Сравните это с созданными нами 50-битными отпечатками пальцев. Наш битовый вектор требует на 99,99% меньше памяти, чем исходный сигнал.

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

Мы также с нетерпением ждем проведения экспериментов над новым чипом Gemini APU от GSI, который оптимизирован для приложений поиска сходства, таких как классификация сигналов.

Код

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

Нейронная сеть со слоем встраивания, Классификатор поиска по сходству