exponenta event banner

Автокодеры для беспроводной связи

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

Введение

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

Традиционные системы беспроводной связи предназначены для обеспечения надежной передачи данных по каналу, который ухудшает передаваемые сигналы. Эти системы имеют множество компонентов, таких как канальное кодирование, модуляция, выравнивание, синхронизация и т.д. Каждый компонент оптимизирован независимо на основе математических моделей, упрощенных для получения выражений замкнутой формы. Напротив, автокодер совместно оптимизирует передатчик и приемник в целом. Эта совместная оптимизация может обеспечить лучшую производительность по сравнению с традиционными системами [1], [2 ].

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

Базовая система автокодировки

Ниже приведена блок-схема беспроводной системы автоматического кодирования. Кодер (передатчик) сначала отображает k информационных битов в сообщение s так, что s∈{1,..., M}, где M = 2k. Затем сообщение s отображается на n вещественных чисел для создания ∈Rn x = f (s). Последний уровень кодера накладывает ограничения на х, чтобы дополнительно ограничить кодированные символы. Возможны следующие ограничения, реализуемые с использованием уровня нормализации:

  • Энергетическая зависимость: x‖22≤n

  • Ограничение средней мощности: E[|xi|2]≤1,∀i

Определите скорость связи этой системы как R = k/n [bits/channel use], где (n, k) означает, что система посылает одно из M = 2k сообщений с использованием n каналов. Канал ухудшает кодированные (т.е. передаваемые) символы для генерирования y∈Rn. Декодер (т.е. приемник) формирует оценку, sˆ, передаваемого сообщения , s.

Входное сообщение определяется как одноступенчатый вектор 1s∈RM, который определяется как вектор, элементы которого являются нулями, за исключением sth one. Канал представляет собой дополнительный белый гауссов шум (AWGN), который добавляет шум для достижения заданного отношения энергии на бит к плотности мощности шума, Eb/No.

Определите (7,4) сеть автокодера с нормализацией энергии и обучающим Eb/No 3 дБ. В [1] авторы показали, что два полностью соединенных уровня как для кодера (передатчика), так и для декодера (приемника) обеспечивают наилучшие результаты с минимальной сложностью. Входной слой (featureInputLayer) принимает вектор длины M. Кодер имеет два полностью соединенных слоя (fullyConnectedLayer). Первый имеет М входов и М выходов и сопровождается уровнем ReLU (reluLayer). Второй полностью подключенный уровень имеет M входов и n выходов и сопровождается уровнем нормализации (helperAEWNormalizationLayer.m). За уровнями кодера следует уровень канала AWGN (helperAEWAWGNLayer.m). Выходной сигнал канала передается на уровни декодера. Первый уровень декодера является полностью соединенным уровнем, который имеет n входов и M выходов и за которым следует уровень ReLU. Второй полностью подключенный уровень имеет М входов и М выходов и за ним следует уровень softmax (softmaxLayer), который выводит вероятность каждого М символов. Классификационный слой (classificationLayer) выводит наиболее вероятный передаваемый символ от 0 до M-1.

k = 4;    % number of input bits
M = 2^k;  % number of possible input symbols
n = 7;    % number of channel uses
EbNo = 3; % Eb/No in dB

wirelessAutoencoder = [
  featureInputLayer(M,"Name","One-hot input","Normalization","none")
  
  fullyConnectedLayer(M,"Name","fc_1")
  reluLayer("Name","relu_1")
  
  fullyConnectedLayer(n,"Name","fc_2")
  
  helperAEWNormalizationLayer("Method", "Energy", "Name", "wnorm")
  
  helperAEWAWGNLayer("Name","channel",...
    "NoiseMethod","EbNo",...
    "EbNo",EbNo,...
    "BitsPerSymbol",2,...
    "SignalPower",1)
  
  fullyConnectedLayer(M,"Name","fc_3")
  reluLayer("Name","relu_2")
  
  fullyConnectedLayer(M,"Name","fc_4")
  softmaxLayer("Name","softmax")
  
  classificationLayer("Name","classoutput")]
wirelessAutoencoder = 
  11×1 Layer array with layers:

     1   'One-hot input'   Feature Input            16 features
     2   'fc_1'            Fully Connected          16 fully connected layer
     3   'relu_1'          ReLU                     ReLU
     4   'fc_2'            Fully Connected          7 fully connected layer
     5   'wnorm'           Wireless Normalization   Energy normalization layer
     6   'channel'         AWGN Channel             AWGN channel with EbNo = 3
     7   'fc_3'            Fully Connected          16 fully connected layer
     8   'relu_2'          ReLU                     ReLU
     9   'fc_4'            Fully Connected          16 fully connected layer
    10   'softmax'         Softmax                  softmax
    11   'classoutput'     Classification Output    crossentropyex

helperAEWTrainWirelessAutoencoder.m функция определяет такую сеть на основе (n, k), метода нормализации и значений Eb/No. В разделе Wireless Autoencoder Training Function показано содержимое helperAEWTrainWirelessAutoencoder.m функция.

Автокодировщик поезда

Запустить helperAEWTrainWirelessAutoencoder.m функция для обучения (2,2) автокодера с нормализацией энергии. Эта функция использует trainingOptions функция для выбора

  • оптимизатор Adam (адаптивная оценка момента),

  • Коэффициент начального обучения 0,01,

  • Максимальные эпохи 15,

  • Размер микроавтобатча 20 * M,

  • Кусочный график обучения с периодом падения 10 и коэффициентом падения 0,1.

Затем, helperAEWTrainWirelessAutoencoder.m запускает функцию trainNetwork функция для обучения сети автокодера с выбранными опциями. Наконец, эта функция разделяет сеть на элементы кодера и декодера. Кодер начинается с входного уровня и заканчивается после уровня нормализации. Декодер начинается после канального уровня и заканчивается классификационным уровнем. Входной уровень элемента добавляется в начале декодера.

Обучите автокодер значением Eb/No, которое является достаточно низким, чтобы привести к некоторым ошибкам, но не слишком низким, так что обучающий алгоритм не может извлечь какую-либо полезную информацию из принятых символов, y. Установите значение Eb/No равным 3 дБ.

Обучение автокодировщика может занять несколько минут. Набор trainNow false для использования сохраненных сетей.

trainNow = false; %#ok<*NASGU>

n = 2;                      % number of channel uses
k = 2;                      % bits per data symbol
EbNo = 3;                   % dB
normalization = "Energy";   % Normalization "Energy" | "Average power"

if trainNow
  [txNet22e,rxNet22e,info22e,wirelessAutoEncoder22e] = ...
    helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo); %#ok<*UNRCH>
else
  load trainedNet_n2_k2_energy txNet rxNet info trainedNet
  txNet22e = txNet;
  rxNet22e = rxNet;
  info22e = info;
  wirelessAutoEncoder22e = trainedNet;
end

Постройте график хода обучения. Точность проверки быстро достигает более 90%, в то время как потеря проверки медленно снижается. Это поведение показывает, что обучающее значение Eb/No было достаточно низким, чтобы вызвать некоторые ошибки, но не слишком низким, чтобы избежать сходимости. Определения точности проверки и потери при проверке см. в разделе Мониторинг хода обучения по углубленному обучению.

figure
helperAEWPlotTrainingPerformance(info22e)

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

figure
tiledlayout(2,2)
nexttile([2 1])
plot(wirelessAutoEncoder22e)
title('Autoencoder')
nexttile
plot(txNet22e)
title('Encoder/Tx')
nexttile
plot(rxNet22e)
title('Decoder/Rx')

График передаваемого и принимаемого созвездия

Постройте график созвездия, полученного автокодером, для передачи символов через канал AWGN вместе с принятым созвездием. Для (2,2) конфигурации автокодер распознает совокупность QPSK (M = 2k = 4) с поворотом фазы. Принятая совокупность в основном является значениями активации на выходе канального уровня, полученными с помощью activations и обрабатываются как перемежающиеся комплексные числа.

subplot(1,2,1)
helperAEWPlotConstellation(txNet22e)
title('Learned Constellation')
subplot(1,2,2)
helperAEWPlotReceivedConstellation(wirelessAutoEncoder22e)
title('Received Constellation')

Моделирование производительности BLER

Смоделировать частоту блочных ошибок (BLER) автокодера (2,2). Настройка параметров моделирования.

simParams.EbNoVec = 0:0.5:8;
simParams.MinNumErrors = 10;
simParams.MaxNumFrames = 300;
simParams.NumSymbolsPerFrame = 10000;
simParams.SignalPower = 1;

Создайте случайные целые числа в диапазоне [0 M-1], который представляет k случайных информационных битов. Кодировать эти информационные биты в сложные символы с помощью helperAEWEncode.m функция. The helperAEWEncode функция выполняет часть кодера автокодера, затем отображает вектор x с действительными значениями в вектор xc с комплексными значениями, так что нечетные и четные элементы отображаются в синфазную и квадратурную составляющие комплексного символа соответственно, где xc = x (1:2: конец) + jx (2:2: конец). Другими словами, рассматривать массив x как перемежающийся комплексный массив.

Передача комплексных символов через канал AWGN. Декодируйте сложные символы с нарушением канала с помощью helperAEWDecode.m функция. Следующий код запускает моделирование для каждой точки Eb/No по крайней мере для 10 ошибок блока. Чтобы получить более точные результаты, увеличьте минимальное количество ошибок по крайней мере до 100. Если установлена программа Parallel Computing Toolbox™ и доступна лицензия, моделирование будет выполняться в параллельном пуле. Сравните результаты с результатами некодированной системы QPSK с длиной блока 2.

EbNoVec = simParams.EbNoVec;
R = k/n;

M = 2^k;
BLER = zeros(size(EbNoVec));
parfor EbNoIdx = 1:length(EbNoVec)
  EbNo = EbNoVec(EbNoIdx) + 10*log10(R);
  chan = comm.AWGNChannel("BitsPerSymbol",2, ...
    "EbNo", EbNo, "SamplesPerSymbol", 1, "SignalPower", 1);

  numBlockErrors = 0;
  frameCnt = 0;
  while (numBlockErrors < simParams.MinNumErrors) ...
      && (frameCnt < simParams.MaxNumFrames) %#ok<PFBNS>

    d = randi([0 M-1],simParams.NumSymbolsPerFrame,1);    % Random information bits
    x = helperAEWEncode(d,txNet22e);                      % Encoder
    y = chan(x);                                          % Channel
    dHat = helperAEWDecode(y,rxNet22e);                   % Decoder

    numBlockErrors = numBlockErrors + sum(d ~= dHat);
    frameCnt = frameCnt + 1;
  end
  BLER(EbNoIdx) = numBlockErrors / (frameCnt*simParams.NumSymbolsPerFrame);
end
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
figure
semilogy(simParams.EbNoVec,BLER,'-')
hold on
qpsk22BLER = 1-(1-berawgn(simParams.EbNoVec,'psk',4,'nondiff')).^2;
semilogy(simParams.EbNoVec,qpsk22BLER,'--')
hold off
ylim([1e-4 1])
grid on
xlabel('E_b/N_o (dB)')
ylabel('BLER')
legend('AE (2,2)','QPSK (2,2)')

Хорошо сформированное созвездие вместе с результатами BLER показывают, что тренировок на 15 эпох достаточно, чтобы получить удовлетворительную сходимость.

Сравнение диаграмм созвездия

Сравните полученные совокупности нескольких автокодеров, нормированных к единичной энергии и единичной средней мощности. Автокодер канала (2,4) нормализован до единичной энергии.

n = 2;      % number of channel uses
k = 4;      % bits per data symbol
EbNo = 3;   % dB
normalization = "Energy";
if trainNow
  [txNet24e,rxNet24e,info24e,wirelessAutoEncoder24e] = ...
    helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo);
else
  load trainedNet_n2_k4_energy txNet rxNet info trainedNet
  txNet24e = txNet;
  rxNet24e = rxNet;
  info24e = info;
  wirelessAutoEncoder24e = trainedNet;
end

Автокодер канала (2,4) нормализован до средней мощности блока.

n = 2;      % number of channel uses
k = 4;      % bits per data symbol
EbNo = 3;   % dB
normalization = "Average power";
if trainNow
  [txNet24p,rxNet24p,info24p,wirelessAutoEncoder24p] = ...
    helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo);
else
  load trainedNet_n2_k4_power txNet rxNet info trainedNet
  txNet24p = txNet;
  rxNet24p = rxNet;
  info24p = info;
  wirelessAutoEncoder24p = trainedNet;
end

Автокодер канала (7,4) нормализован до единичной энергии.

n = 7;      % number of channel uses
k = 4;      % bits per data symbol
EbNo = 3;   % dB
normalization = "Energy";
if trainNow
  [txNet74e,rxNet74e,info74e,wirelessAutoEncoder74e] = ...
    helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo);
else
  load trainedNet_n7_k4_energy txNet rxNet info trainedNet
  txNet74e = txNet;
  rxNet74e = rxNet;
  info74e = info;
  wirelessAutoEncoder74e = trainedNet;
end

Постройте график созвездия с помощью helperAEWPlotConstellation.m функция. Обученный (2,2) автокодер сходится в QPSK-созвездии со сдвигом фазы в качестве оптимальной совокупности для испытанных условий канала. (2,4) автокодер с нормализацией энергии сходится к 16PSK созвездию со сдвигом фазы. Следует отметить, что нормализация энергии заставляет каждый символ иметь единичную энергию и помещает символы на единичную окружность. Учитывая это ограничение, наилучшая совокупность - это совокупность PSK с равным угловым расстоянием между символами. (2,4) автокодер со средней нормализацией мощности сходится к трехуровневой совокупности из 1-6-9 символов. Нормализация средней мощности заставляет символы иметь среднюю мощность единицы во времени. Это ограничение приводит к созвездию APSK, которое отличается от обычных схем QAM или APSK. Следует отметить, что эта конфигурация сети может также сходиться к двухуровневой совокупности с 7-9 символами на основе случайного начального условия, используемого во время обучения. На последнем графике показано 2-D отображение совокупности 7-D, генерируемой (7,4) автокодером с ограничением по энергии. 2-D отображение получается с помощью метода t-Distributed Stochastic Neighbor Embedding (t-SNE) (см. tsne (Статистика и инструментарий машинного обучения)).

figure
subplot(2,2,1)
helperAEWPlotConstellation(txNet22e)
title('(2,2) Energy')
subplot(2,2,2)
helperAEWPlotConstellation(txNet24e)
title('(2,4) Energy')
subplot(2,2,3)
helperAEWPlotConstellation(txNet24p)
title('(2,4) Average Power')
subplot(2,2,4)
helperAEWPlotConstellation(txNet74e,'t-sne')
title('(7,4) Energy')

Сравнение производительности автоматических кодировщиков BLER с кодированными и некодированными QPSK

Имитировать характеристики BLER (7,4) автокодера с помощью (7,4) кода Хэмминга с модуляцией QPSK как для жесткого решения, так и для декодирования с максимальным правдоподобием (ML). Использовать некодированный (4,4) QPSK в качестве базовой линии. (4,4) некодированный QPSK является в основном системой, модулированной QPSK, которая посылает блоки из 4 битов и измеряет BLER. Данные для следующих рисунков получены с помощью файлов helperAEWSimulateBLER.mlx и helperAEWPrepreAutoencoders.mlx.

load codedBLERResults.mat
figure
qpsk44BLERTh = 1-(1-berawgn(simParams.EbNoVec,'psk',4,'nondiff')).^4;
semilogy(simParams.EbNoVec,qpsk44BLERTh,':*')
hold on
semilogy(simParams.EbNoVec,qpsk44BLER,':o')
semilogy(simParams.EbNoVec,hammingHard74BLER,'--s')
semilogy(simParams.EbNoVec,ae74eBLER,'-')
semilogy(simParams.EbNoVec,hammingML74BLER,'--d')
hold off
ylim([1e-5 1])
grid on
xlabel('E_b/N_o (dB)')
ylabel('BLER')
legend('Theoretical Uncoded QPSK (4,4)','Uncoded QPSK (4,4)','Hamming (7,4) Hard Decision',...
  'Autoencoder (7,4)','Hamming (7,4) ML','Location','southwest')
title('BLER comparison of (7,4) Autoencoder')

Как и ожидалось, жесткое решение (7,4) Hamming code with QPSK modulation обеспечивает около 0,6 дБ Eb/No преимущества по сравнению с некодированным QPSK, в то время как ML декодирование (7,4) Hamming code with QPSK modulation обеспечивает еще 1,5 дБ преимущества для BLER 10-3. Производительность (7,4) автокодера BLER приближается к декодированию ML (7,4) кода Хэмминга при обучении с 3 дБ Eb/No. Эта характеристика БЛЕР показывает, что автокодер способен изучать не только модуляцию, но и канальное кодирование для достижения коэффициента усиления кодирования около 2 дБ для скорости кодирования R = 4/7.

Затем смоделируйте производительность BLER автокодеров с R = 1 с производительностью некодированных систем QPSK. Использовать некодированные (2,2) и (8,8) QPSK в качестве базовых линий. Сравните характеристики БЛЕР этих систем с характеристиками автокодеров (2,2), (4,4) и (8,8 ).

load uncodedBLERResults.mat
qpsk22BLERTh = 1-(1-berawgn(simParams.EbNoVec,'psk',4,'nondiff')).^2;
semilogy(simParams.EbNoVec,qpsk22BLERTh,':*')
hold on
semilogy(simParams.EbNoVec,qpsk88BLER,'--*')
qpsk88BLERTh = 1-(1-berawgn(simParams.EbNoVec,'psk',4,'nondiff')).^8;
semilogy(simParams.EbNoVec,qpsk88BLERTh,':o')
semilogy(simParams.EbNoVec,ae22eBLER,'-o')
semilogy(simParams.EbNoVec,ae44eBLER,'-d')
semilogy(simParams.EbNoVec,ae88eBLER,'-s')
hold off
ylim([1e-5 1])
grid on
xlabel('E_b/N_o (dB)')
ylabel('BLER')
legend('Uncoded QPSK (2,2)','Uncoded QPSK (8,8)','Theoretical Uncoded QPSK (8,8)',...
  'Autoencoder (2,2)','Autoencoder (4,4)','Autoencoder (8,8)','Location','southwest')
title('BLER performance of R=1 Autoencoders')

Частота битовых ошибок QPSK одинакова как для (8,8), так и для (2,2) случаев. Однако BLER зависит от длины блока n и становится хуже, поскольку n увеличивается, как задано BLER = 1- (1-BER) n. Как и ожидалось, производительность BLER (8,8) QPSK хуже (2,2) системы QPSK. Характеристики BLER (2,2) автокодера соответствуют характеристикам BLER (2,2) QPSK. С другой стороны, (4,4) и (8,8) автокодеры оптимизируют канальный кодер и совокупность совместно для получения усиления кодирования по отношению к соответствующим некодированным системам QPSK.

Влияние обучения Eb/No на производительность BLER

Проучайте (7,4) автокодер с нормализацией энергии при различных значениях Eb/No и сравните характеристики BLER.

n = 7;
k = 4;
normalization = 'Energy';

EbNoVec = 1:3:10;
if trainNow
  for EbNoIdx = 1:length(EbNoVec)
    EbNo = EbNoVec(EbNoIdx);
    [txNetVec{EbNoIdx},rxNetVec{EbNoIdx},infoVec{EbNoIdx},trainedNetVec{EbNoIdx}] = ...
      helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo);
    BLERVec{EbNoIdx} = helperAEWAutoencoderBLER(txNetVec{EbNoIdx},rxNetVec{EbNoIdx},simParams);
  end
else
  load ae74TrainedEbNo1to10 BLERVec trainParams simParams txNetVec rxNetVec infoVec trainedNetVec EbNoVec
end

Постройте график производительности BLER вместе с теоретической верхней границей для кода Hamming (7,4), декодированного жестким решением, и смоделированного BLER кода Hamming (7,4), декодированного с максимальным правдоподобием (MLD). Производительность BLER (7,4) автокодера приближается к коду Hamming (7,4) с MLD, так как обучающий Eb/No уменьшается с 10 дБ до 1 дБ, и в этот момент он почти совпадает с кодом MLD Hamming (7,4).

berHamming = bercoding(simParams.EbNoVec,'hamming','hard',7);
blerHamming = 1-(1-berHamming).^7;
load codedBLERResults hammingML74BLER
figure
semilogy(simParams.EbNoVec,blerHamming,':k')
hold on
linespec = {'-*','-d','-o','-s',};
for EbNoIdx=length(EbNoVec):-1:1
  semilogy(simParams.EbNoVec,BLERVec{EbNoIdx},linespec{EbNoIdx})
end
semilogy(simParams.EbNoVec,hammingML74BLER,'--vk')
hold off
ylim([1e-5 1])
grid on
xlabel('E_b/N_o (dB)')
ylabel('BLER')
legend('(7,4) Hamming HDD Upper','(7,4) AE - Eb/No=10','(7,4) AE - Eb/No=7',...
  '(7,4) AE - Eb/No=4','(7,4) AE - Eb/No=1','Hamming (7,4) MLD','location','southwest')

Выводы и дальнейшие исследования

Результаты BLER показывают, что автокодеры могут обучаться схемам совместного кодирования и модуляции без контроля. Можно даже обучить автокодер с R = 1 для получения коэффициента усиления кодирования по сравнению с традиционными способами. Пример также показывает влияние гиперпараметров, таких как Eb/No, на производительность BLER.

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

trainParams.Plots = 'none';
trainParams.Verbose = false;
trainParams.MaxEpochs = 15;
trainParams.InitialLearnRate = 0.01;
trainParams.LearnRateSchedule = 'piecewise';
trainParams.LearnRateDropPeriod = 10;
trainParams.LearnRateDropFactor = 0.1;
trainParams.MiniBatchSize = 20*2^k;

simParams.EbNoVec = -2:0.5:8;
simParams.MinNumErrors = 100;
simParams.MaxNumFrames = 300;
simParams.NumSymbolsPerFrame = 10000;
simParams.SignalPower = 1;

Измените эти параметры, чтобы обучить различные автокодеры и проверить их характеристики BLER. Эксперимент с различными значениями n, k, нормализации и Eb/No. Для получения дополнительной информации см. справку по helperAEWTrainStartAutoencoder.m, helperAEWPrepreAutoencoders.mlx и helperAEWAutoencyBLER.m.

Список вспомогательных функций

Обучающая функция беспроводного автокодера

В этом разделе показано содержимое функции helperAEWTrainStartAutoencoder. Чтобы открыть работоспособную версию функции в редакторе MATLAB, щелкните helperAEWTrainStartAutoencoder.m.

type helperAEWTrainWirelessAutoencoder
function [txNet,rxNet,info,trainedNet] = ...
  helperAEWTrainWirelessAutoencoder(n,k,normalization,EbNo,varargin)
%helperAEWTrainWirelessAutoencoder Train wireless autoencoder
%   [TX,RX,INFO,AE] = helperAEWTrainWirelessAutoencoder(N,K,NORM,EbNo)
%   trains an autoencoder, AE, with (N,K), where K is the number of input
%   bits and N is the number of channel uses. The autoencoder employs NORM
%   normalization. NORM must be one of 'Energy' and 'Average power'. The
%   channel is an AWGN channel with Eb/No set to EbNo. TX and Rx are the
%   encoder and decoder parts of the autoencoder that can be used in the
%   helperAEWEncoder and helperAEWDecoder functions, respectively. INFO is
%   the training information that can be used to check the convergence
%   behavior of the training process.
%
%   [TX,RX,INFO,AE] = helperAEWTrainWirelessAutoencoder(...,TP) provides
%   training parameters as follows:
%     TP.Plots: Plots to display during network training defined as one of
%               'none' (default) or 'training-progress'.
%     TP.Verbose: Indicator to display training progress information
%               defined as 1 (true) (default) or 0 (false).
%     TP.MaxEpochs: Maximum number of epochs defined as a positive integer.
%               The default is 15.
%     TP.InitialLearnRate: Initial learning rate as a floating point number
%               between 0 and 1. The default is 0.01;
%     TP.LearnRateSchedule: Learning rate schedule defined as one of
%               'piecewise' (default) or 'none'.
%     TP.LearnRateDropPeriod: Number of epochs for dropping the learning 
%               rate as a positive integer. The default is 10.
%     TP.LearnRateDropFactor: Factor for dropping the learning rate,
%               defined as a scalar between 0 and 1. The default is 0.1.
%     TP.MiniBatchSize: Size of the mini-batch to use for each training
%               iteration, defined as a positive integer. The default is 
%               20*M.
%
%   See also AutoencoderForWirelessCommunicationsExample, helperAEWEncode,
%   helperAEWDecode, helperAEWNormalizationLayer, helperAEWAWGNLayer.

%   Copyright 2020 The MathWorks, Inc.

% Derived parameters
M = 2^k;
R = k/n;

if nargin > 4
  trainParams = varargin{1};
else
  % Set default training options. Set maximum epochs to 15. SGD requires a
  % representative mini-batch that has enough symbols to achieve
  % convergence. Therefore, increase the mini-batch size with M. Set the
  % initial learning rate to 0.01 and reduce the learning rate by a factor
  % of 10 every 10 epochs. Do not plot or print training progress.
  trainParams.MaxEpochs = 15;
  trainParams.MiniBatchSize = 20*M;
  trainParams.InitialLearnRate = 0.01;
  trainParams.LearnRateSchedule = 'piecewise';
  trainParams.LearnRateDropPeriod = 10;
  trainParams.LearnRateDropFactor = 0.1;
  trainParams.Plots = 'none';
  trainParams.Verbose = false;
end

% Convert Eb/No to channel Eb/No values using the code rate
EbNoChannel = EbNo + 10*log10(R);

% As the number of possible input symbols increase, we need to increase the
% number of training symbols to give the network a chance to experience a
% large number of possible input combinations. The same is true for number
% of validation symbols.
numTrainSymbols = 2500 * M;
numValidationSymbols = 100 * M;

% Define autoencoder network. Input is a one-hot vector of length M. The
% encoder has two fully connected layers. The first one has M inputs and M
% outputs and is followed by an ReLU layer. The second fully connected
% layer has M inputs and n outputs and is followed by the normalization
% layer. Normalization layer imposes constraints on the encoder output and
% available methods are energy and average power normalization. The encoder
% layers are followed by the AWGN channel layer. Set BitsPerSymbol to 2
% since two output values are mapped onto a complex symbol. Set the signal
% power to 1 since the normalization layer outputs signals with unity
% power. The output of the channel is passed to the decoder layers. The
% first decoder layer is a fully connected layer that has n inputs and M
% outputs and is followed by an ReLU layer. Second fully connected layer
% has M inputs and M outputs and is followed by a softmax layer. The output
% of the decoder is chosen as the most probable transmitted symbol from 0
% to M-1.
wirelessAutoEncoder = [
  featureInputLayer(M,"Name","One-hot input","Normalization","none")
  
  fullyConnectedLayer(M,"Name","fc_1")
  reluLayer("Name","relu_1")
  
  fullyConnectedLayer(n,"Name","fc_2")
  
  helperAEWNormalizationLayer("Method", normalization)
  
  helperAEWAWGNLayer("NoiseMethod","EbNo",...
    "EbNo",EbNoChannel,...
    "BitsPerSymbol",2,...
    "SignalPower",1)
  
  fullyConnectedLayer(M,"Name","fc_3")
  reluLayer("Name","relu_2")
  
  fullyConnectedLayer(M,"Name","fc_4")
  softmaxLayer("Name","softmax")
  
  classificationLayer("Name","classoutput")];

% Generate random training data. Create one-hot input vectors and labels. 
d = randi([0 M-1],numTrainSymbols,1);
trainSymbols = zeros(numTrainSymbols,M);
trainSymbols(sub2ind([numTrainSymbols, M],...
  (1:numTrainSymbols)',d+1)) = 1;
trainLabels = categorical(d);

% Generate random validation data. Create one-hot input vectors and labels. 
d = randi([0 M-1],numValidationSymbols,1);
validationSymbols = zeros(numValidationSymbols,M);
validationSymbols(sub2ind([numValidationSymbols, M],...
  (1:numValidationSymbols)',d+1)) = 1;
validationLabels = categorical(d);

% Set training options
options = trainingOptions('adam', ...
  'InitialLearnRate',trainParams.InitialLearnRate, ...
  'MaxEpochs',trainParams.MaxEpochs, ...
  'MiniBatchSize',trainParams.MiniBatchSize, ...
  'Shuffle','every-epoch', ...
  'ValidationData',{validationSymbols,validationLabels}, ...
  'LearnRateSchedule', trainParams.LearnRateSchedule, ...
  'LearnRateDropPeriod', trainParams.LearnRateDropPeriod, ...
  'LearnRateDropFactor', trainParams.LearnRateDropFactor, ...
  'Plots', trainParams.Plots, ...
  'Verbose', trainParams.Verbose);

% Train the autoencoder network
[trainedNet,info] = trainNetwork(trainSymbols,trainLabels,wirelessAutoEncoder,options);

% Separate the network into encoder and decoder parts. Encoder starts with
% the input layer and ends after the normalization layer.
for idxNorm = 1:length(trainedNet.Layers)
  if isa(trainedNet.Layers(idxNorm), 'helperAEWNormalizationLayer')
    break
  end
end
lgraph = addLayers(layerGraph(trainedNet.Layers(1:idxNorm)), ...
  regressionLayer('Name', 'txout'));
lgraph = connectLayers(lgraph,'wnorm','txout');
txNet = assembleNetwork(lgraph);

% Decoder starts after the channel layer and ends with the classification
% layer. Add a feature input layer at the beginning. 
for idxChan = idxNorm:length(trainedNet.Layers)
  if isa(trainedNet.Layers(idxChan), 'helperAEWAWGNLayer')
    break
  end
end
firstLayerName = trainedNet.Layers(idxChan+1).Name;
n = trainedNet.Layers(idxChan+1).InputSize;
lgraph = addLayers(layerGraph(featureInputLayer(n,'Name','rxin')), ...
  trainedNet.Layers(idxChan+1:end));
lgraph = connectLayers(lgraph,'rxin',firstLayerName);
rxNet = assembleNetwork(lgraph);

Ссылки

[1] Т. О'Ши и Дж. Хойдис, «Введение в глубокое обучение для физического уровня», в транзакциях IEEE по когнитивным коммуникациям и сетям, том 3, № 4, стр. 563-575, декабрь 2017, дои: 10.1109/TCCN.2017.2758370.

[2] С. Дёрнер, С. Каммерер, Дж. Хойдис и С. Т. Бринк, «Глубокая коммуникация на основе обучения по воздуху», в IEEE Journal of Selected Topics in Signal Processing, vol. 12, no. 1, pp. 132-143, Feb. 2018, doi: 10.1109/JSTSP.2017.2784180.

См. также

| | | |

Связанные темы