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

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

Введение

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

Традиционные системы радиосвязи спроектированы, чтобы обеспечить надежную передачу данных по каналу, который повреждает переданные сигналы. Эти системы имеют несколько компонентов, таких как кодирование канала, модуляция, эквализация, синхронизация, и т.д. Каждый компонент оптимизирован независимо на основе математических моделей, которые упрощены, чтобы достигнуть закрытых выражений формы. Наоборот, автоэнкодер совместно оптимизирует передатчик и приемник в целом. Эта объединенная оптимизация имеет потенциал обеспечения лучшей эффективности, чем традиционные системы [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 образовывают канал использование. Канал повреждает закодированный (i.e. переданный) символы, чтобы сгенерировать yRn. Декодер (i.e. приемник), производит оценку, 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

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

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

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

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

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

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

  • Мини-пакетный размер 20*M,

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

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

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

Обучение автоэнкодер может занять несколько минут. Установите trainNow ко лжи, чтобы использовать сохраненные сети.

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 = информация;
  wirelessAutoEncoder22e = trainedNet;
end

Постройте прогресс traning. Точность валидации быстро достигает больше чем 90%, в то время как потеря валидации медленно продолжает уменьшаться. Это поведение показывает что обучение Eb/No значение было достаточно низким, чтобы вызвать некоторые ошибки, но не слишком низко избежать сходимости. Для определений точности валидации и потери валидации, смотрите раздел Monitor Deep Learning Training Progress.

figure
helperAEWPlotTrainingPerformance(info22e)

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

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 символами на основе случайного начального условия, используемого во время обучения. Последний график показывает 2D отображение 7-D созвездия, сгенерированного (7,4) автоэнкодер с энергетическим ограничением. 2D отображение получено с помощью t-Distributed стохастического вложения соседей (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) Код Хемминга с модуляцией QPSK и для трудного решения и для декодирования наибольшего правдоподобия (ML). Используйте незакодированный (4,4) QPSK как базовая линия. (4,4) незакодированный QPSK является в основном модулируемой системой QPSK, которая отправляет блоки BLER и мер 4 битов. Данные для следующих фигур получены с помощью 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) Код Хемминга с модуляцией 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 вместе с теоретической верхней границей для трудного решения, декодировал Хэмминга (7,4) код и симулировал BLER наибольшего правдоподобия декодируется (MLD) Хэмминг (7,4) код. Эффективность BLER (7,4) автоэнкодер становится ближе к Хэммингу (7,4) код с MLD как обучение Eb/No уменьшения от 10 дБ до 1 дБ, на уровне которой точки это почти совпадает с Хэммингом MLD (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 значения. Смотрите справку для helperAEWTrainWirelessAutoencoder.m, helperAEWPrepareAutoencoders.mlx и helperAEWAutoencoderBLER.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] Т. О'Ши и Дж. Хойдис, "Введение в Глубокое обучение для Физического уровня", в Транзакциях IEEE на Cognitive Communications и Организации сети, издании 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.

Смотрите также

| | | |

Похожие темы