Автоэнкодеры для беспроводных коммуникаций

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

Введение

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

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

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

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

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

  • Энергетическое ограничение: x22n

  • Ограничение средней степени: E[|xi|2]1,i

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

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

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

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

Обучите автоэнкодер

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

  • Оптимизатор Адама (оценка адаптивного момента),

  • Начальная скорость обучения 0,01,

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

  • Мини-бат размером 20 * М,

  • Кусочное расписание обучения с периодом падения 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
нормализация = "Energy";   % Normalization "Energy" | "Average power"

if trainNow
  [txNet22e, rxNet22e, info22e, wirelessAutoEncoder22e] = ...
    helperAEWTrainWirelessAutoencoder (n, k, нормализация,  EbNo);%#ok<*UNRCH>
else
  груз 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). Setup параметров симуляции.

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:end)+jx(2:2:end). Другими словами, лечите 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-распределенного метода Stochastic Neighbor Embedding (t-SNE) (см tsne (Statistics and Machine Learning Toolbox).

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) Hamming кода с QPSK модуляцией как для жесткого решения, так и для декодирования с максимальной вероятностью (ML). Используйте незакодированный (4,4) QPSK в качестве базовой линии. (4,4) незакодированный QPSK является в основном QPSK модулированной системой, которая отправляет блоки по 4 бита и измеряет BLER. Данные для следующих рисунков получаются с помощью файлов helperAEWSimulateBLER.mlx и helperAEWPrepareAutoencoders.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) Код Хемминга с QPSK модуляцией обеспечивает около 0,6 дБ Eb/No преимущество перед незакодированным QPSK, в то время как ML-декодирование (7,4) Hamming кода с QPSK-модуляцией обеспечивает другое преимущество в 1,5 дБ для BLER 10-3. (7,4) Эффективность BLER автоэнкодера приближается к декодированию ML (7,4) кода Хемминга, когда обучен с 3 дБ Eb/No. Эта эффективность BLER показывает, что автоэнкодер способен учиться не только модуляции, но и канальному кодированию для достижения коэффициента усиления кодирования приблизительно 2 дБ для скорости кодирования R = 4/7.

Затем моделируйте эффективность BLER автоэнкодеров с R = 1 с производительностью незакодированных систем QPSK. Используйте незакодированные (2,2) и (8,8) QPSK в качестве базовых линий. Сравните производительность BLER этих систем с эффективностью (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 значения. Для получения дополнительной информации см. справку по helper AEWT rain Wireless Autoencoder.m, helper AEWP repare Autoencoders.mlx и helper AEWA utoencoder BLER. m.

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

Функция обучения беспроводного автоэнкодера

В этом разделе показано содержимое функции helperAEWTrainWirelessAutoencoder. Чтобы открыть исполняемую версию функции в редакторе MATLAB, щелкните helperAEWTrainWirelessAutoencoder.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] T. O'Shea and J. Hoydis, «Введение в глубокое обучение для физического слоя», в транзакциях IEEE по когнитивным коммуникациям и сетям, том 3, № 4, стр. 563-575, декабрь 2017, doi: 10.1109/TCCN.2017.2758370.

[2] С. Дернер, С. Кэммерер, Дж. Хойдис и S. t. Край, «Основанная на глубоком обучении Коммуникация По Воздуху», в Журнале IEEE Отобранных Тем в Обработке Сигнала, издании 12, № 1, стр 132-143, февраль 2018, doi: 10.1109/JSTSP.2017.2784180.

См. также

| | | |

Похожие темы