無線通信のための自己符号化器
この例では、自己符号化器を使用して無線チャネル経由で情報ビットを確実に送信するエンドツーエンドの通信システムをモデル化する方法を説明します。
はじめに
従来の自己符号化器は、データの圧縮 (符号化) を効率よく行う方法を学習する教師なしニューラル ネットワークです。自己符号化器は、元のデータと再構成されたデータの差が最小となるように圧縮表現からデータを再構成する方法も学習します。
従来の無線通信システムは、送信信号が劣化するチャネルでも信頼性の高いデータ送信を行えるように設計されています。これらのシステムは、チャネル符号化、変調、イコライズ、同期などを行う複数のコンポーネントで構成されています。各コンポーネントは、閉形式表現で到達するように単純化された数学モデルに基づいて、それぞれ個別に最適化されます。これに対し、自己符号化器では、送信機と受信機がまとめて同時に最適化されます。この同時最適化によって、従来のシステムよりも優れたパフォーマンスを実現できる可能性があります [1]、[2]。
従来の自己符号化器は、通常、イメージの圧縮に使用されます。つまり、イメージに含まれる冗長性を排除してイメージの次元を減らすために使用されます。一方、無線通信システムは、チャネル符号化と変調方式を使用して情報ビットに冗長性を追加します。このシステムは、このように追加された冗長性を利用することで、無線チャネルで失われた情報ビットを復元できます。したがって、無線自己符号化器は、実際には、チャネル符号化と変調を適用する方法を教師なし手法で学習しながら、指定のチャネルで送信される情報に冗長性を追加して受信情報の誤り数を最小限に抑えようとします。
基本的な自己符号化器システム
次の図は、無線自己符号化器システムのブロック線図です。まず、符号化器 (送信機) によって、 個の情報ビットが、 のようなメッセージ s にマッピングされます。ここで、 です。次に、メッセージ s が n 個の実数にマッピングされ、 が作成されます。符号化器の最後の層によって、 に対してさらに制約が課せられ、符号化されたシンボルがさらに制約されます。そのような制約として次のものがあります。これらは正規化層を使用して実装されます。
エネルギーの制約:
平均強度の制約:

このシステムの通信速度を [ビット/使用チャネル数] と定義します。ここで、(n,k) は、システムが 個のメッセージのいずれかを n 個の使用チャネルを使用して送信することを意味します。チャネルは送信機からの符号化されたシンボルを劣化させ、 を生成します。受信機の復号化器は、送信されたメッセージ の推定値 を生成します。
入力メッセージは one-hot ベクトル として定義されます。これは、 の要素が 1 で、その他の要素がすべて 0 であるベクトルとして定義されます。チャネルには、データ ビットごとのエネルギーとノイズ パワー密度の比率 が指定の値に達するまでノイズを追加する加法性ホワイト ガウス ノイズ (AWGN) を使用します。
自己符号化器は、 個のデータ ビットを 個の使用チャネルにマッピングします。これにより、効率的な符号化速度 [データ ビット/使用チャネル数] が得られます。次に、2 つの使用チャネルが 1 つのシンボルにマッピングされます。これにより、1 つのシンボルにつき 2 つのチャネルが使用されるようになります。チャネル シンボルごとの使用チャネル数の値を、AWGN チャネルの BitsPerSymbol パラメーターにマッピングします。
自己符号化器の構成
自己符号化器の選択
自己符号化器ネットワークを選択します。この例では、次の自己符号化器ネットワークをサポートします。
(2,2) 自己符号化器
(2,4) 自己符号化器
(4,4) 自己符号化器
(7,4) 自己符号化器
(8,8) 自己符号化器
selectAutoencoder =
"2,4 Autoencoder";自己符号化器ネットワークとデータセットの作成に必要なパラメーターを初期化します。
[n,k] = getAEWParameters(selectAutoencoder);
M = 2^k; % number of possible input symbols の値を使用して、自己符号化器に学習させます。このとき、いくつか誤りが発生する程度にこの値を低くしますが、学習アルゴリズムが受信シンボル y から有用な情報を抽出できなくなるほど低くはしません。EbNo を 3 dB に設定します。
EbNo = 3; % in dB normalization ="Energy"; % Normalization "Energy" | "Average power"
符号化率を使用して EbNo をチャネル の値に変換します。
R = k/n; EbNoChannel = EbNo + 10*log10(R);
入力シンボルの候補数の増加にしたがって学習シンボルの数を増やし、ネットワークが入力候補の多数の組み合わせを経験できるようにする必要があります。同じことは検証シンボルの数についても当てはまります。
numTrainSymbols = 2500*M; numValidationSymbols = 100*M;
学習データと検証データの生成
ランダムな学習データを生成します。one-hot 入力ベクトルとラベルを作成します。
d = randi([0 M-1],numTrainSymbols,1);
trainSymbols = zeros(numTrainSymbols,M);
trainSymbols(sub2ind([numTrainSymbols,M], ...
(1:numTrainSymbols)',d+1)) = 1;
trainLabels = categorical(d);ランダムな検証データを生成します。one-hot 入力ベクトルとラベルを作成します。
d = randi([0 M-1],numValidationSymbols,1);
validationSymbols = zeros(numValidationSymbols,M);
validationSymbols(sub2ind([numValidationSymbols,M], ...
(1:numValidationSymbols)',d+1)) = 1;
validationLabels = categorical(d);自己符号化器ネットワークの定義
[1] の著者は、符号化器 (送信機) と復号化器 (受信機) の両方で 2 つの全結合層を使用すると、複雑度を最小限に抑えながら最適な結果が得られることを説明しています。入力層 (featureInputLayer (Deep Learning Toolbox)) は、長さ M の one-hot ベクトルを受け取ります。符号化器は 2 つの全結合層 (fullyConnectedLayer (Deep Learning Toolbox)) をもちます。最初の全結合層には M 個の入力と M 個の出力が含まれ、その後ろに ReLU 層 (reluLayer (Deep Learning Toolbox)) が続きます。2 番目の全結合層には M 個の入力と n 個の出力があり、その後ろに正規化層 (helperAEWNormalizationLayer.m) が続きます。符号化器層の後ろには、AWGN チャネル層 (helperAEWAWGNLayer.m) が続きます。チャネルの出力は復号化器層に渡されます。最初の復号化器層は、n 個の入力と M 個の出力が含まれる全結合層で、その後ろに ReLU 層が続きます。2 番目の全結合層には M 個の入力と M 個の出力が含まれ、その後ろに、M 個の各シンボルの確率を出力するソフトマックス層 (softmaxLayer (Deep Learning Toolbox)) が続きます。学習済みの (n,k) 無線自己符号化器ネットワークは、0 ~ M-1 のシンボルのうち送信されたシンボルである確率が最も高いものを出力します。
enableAnalyzeNetwork =false; 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, "Name", "wnorm") helperAEWAWGNLayer("Name","channel", ... "NoiseMethod","EbNo", ... "EbNo",EbNoChannel, ... "BitsPerSymbol",2, ... % channel use per channel symbol "SignalPower",1) fullyConnectedLayer(M,"Name","fc_3") reluLayer("Name","relu_2") fullyConnectedLayer(M,"Name","fc_4") softmaxLayer("Name","softmax")]; wirelessAutoEncoder = dlnetwork(wirelessAutoEncoder);
選択した (n,k) 自己符号化器アーキテクチャを解析します。
if enableAnalyzeNetwork wirelessAutoEncoderAnalyzerInfo = analyzeNetwork(wirelessAutoEncoder); end
ワイヤレス自己符号化器の構成と学習
学習の構成
自己符号化器ネットワークの学習に必要なハイパーパラメーターを設定します。
trainParams.SolverName = "adam"; % Select the solver for training trainParams.NumEpochs = 10; trainParams.MiniBatchSize = 100*M; trainParams.IniLearnRate = 0.08; trainParams.LearnRateDropPeriod = 5; trainParams.LearnRateDropFactor = 0.1; trainParams.LearnRateSchedule = "piecewise"; trainParams.LossFcn = "crossentropy"; trainParams.Metrics = "accuracy"; trainParams.ExeEnvironment = "cpu"; trainParams.TrainingPlot ="none"; % Select "training-progress" to see dynamic plot of training trainParams.EnableVerbose =
false; options = trainingOptions(trainParams.SolverName, ... MaxEpochs=trainParams.NumEpochs, ... MiniBatchSize=trainParams.MiniBatchSize, ... InitialLearnRate=trainParams.IniLearnRate, ... LearnRateDropFactor=trainParams.LearnRateDropFactor, ... LearnRateDropPeriod=trainParams.LearnRateDropPeriod, ... LearnRateSchedule=trainParams.LearnRateSchedule, ... ValidationData={validationSymbols, validationLabels}, ... Shuffle="every-epoch", ... Metrics=trainParams.Metrics, ... ExecutionEnvironment=trainParams.ExeEnvironment, ... Plots=trainParams.TrainingPlot, ... Verbose=trainParams.EnableVerbose);
自己符号化器の学習
trainnet 関数を使用して、選択した (n,k) 自己符号化器ネットワークに学習させます。
[trainedNet,trainedNetInfo] = trainnet(trainSymbols,trainLabels, ...
wirelessAutoEncoder,trainParams.LossFcn,options);自己符号化器の分割
ネットワークを符号化器と復号化器に分離します。
符号化器は、入力層で始まり、正規化層で終わります。
for idxNorm = 1:length(trainedNet.Layers) if isa(trainedNet.Layers(idxNorm),"helperAEWNormalizationLayer") break end end txNet = dlnetwork(trainedNet.Layers(1:idxNorm));
復号化器は、チャネル層の後から始まり、ソフトマックス層で終わります。最初に特徴入力層を追加します。
for idxChan = idxNorm:length(trainedNet.Layers) if isa(trainedNet.Layers(idxChan),"helperAEWAWGNLayer") break end end n = trainedNet.Layers(idxChan+1).InputSize; rxNetLayers = [ featureInputLayer(n,Name="rxin") trainedNet.Layers(idxChan+1:end) ]; rxNet = dlnetwork(rxNetLayers);
学習済みネットワーク オブジェクトの plot オブジェクト関数を使用して、自己符号化器全体、送信機の符号化器ネットワーク、および受信機の復号化器ネットワークの層グラフを表示します。
figure tiledlayout(2,2) % Plot autoecoder network nexttile([2 1]) plot(trainedNet) title('Autoencoder') % Plot encoder network nexttile plot(txNet) title('Encoder/Tx') % Plot decoder network nexttile plot(rxNet) title('Decoder/Rx')

コンスタレーションのプロット
helperAEWPlotConstellation 補助関数を使用してコンスタレーションをプロットします。高次の自己符号化器のコンスタレーションをプロットするには、t 分布型確率的近傍埋め込み (t-SNE) 法を使用します。詳細については、関数tsne (Statistics and Machine Learning Toolbox)を参照してください。
plotTitle = string(sprintf('(%d,%d) %s',n,k,normalization)); figure subplot(1,2,1) helperAEWPlotConstellation(txNet) title(plotTitle) subplot(1,2,2) if k > 2 helperAEWPlotConstellation(txNet,"t-sne") end title(plotTitle + " t-SNE")

学習済みのコンスタレーションを検証します。必要に応じて、自己符号化器の学習セクションに示されているようにネットワークに再学習させます。
コンスタレーションの比較
次の Figure は、異なる自己符号化器のコンスタレーションを示しています。

(2,2) 自己符号化器は、経験済みのチャネル条件に合わせてコンスタレーションが最適となるように位相がシフトされた QPSK コンスタレーションに収束します。
エネルギーが正規化された (2,4) 自己符号化器は、位相シフトを伴う 16PSK コンスタレーションに収束します。エネルギーを正規化することで、各シンボルは単位エネルギーをもつようになり、単位円上にシンボルが配置されます。この制約の下では、シンボル間の角度間隔が等しい PSK コンスタレーションが最適なコンスタレーションとなります。
平均強度が正規化された (2,4) 自己符号化器は、各層が 1 個、6 個、9 個のシンボルをもつ 3 層コンスタレーションに収束します。平均強度を正規化することで、時間の経過に伴いシンボルの平均強度は単一になります。この制約の下では、従来の QAM スキームや APSK スキームとは異なる APSK コンスタレーションが得られます。このネットワーク構成は、学習時に使用するランダムな初期状態によっては各層が 7 個、9 個のシンボルをもつ 2 層コンスタレーションに収束する場合があります。
エネルギーの制約がある (7,4) 自己符号化器によって生成された 7 次元コンスタレーションの 2 次元マッピング。2 次元マッピングは、t 分布型確率的近傍埋め込み (t-SNE) 法を使用して取得します。詳細については、関数
tsne(Statistics and Machine Learning Toolbox)を参照してください。
BLER 性能のシミュレーション
選択した (n,k) 自己符号化器のブロック エラー レート (BLER) 性能をシミュレーションします。シミュレーション パラメーターを設定します。
simParams.EbNoVec = 0:0.5:8; simParams.MinNumErrors = 10; simParams.MaxNumFrames = 300; simParams.NumSymbolsPerFrame = 10000; simParams.SignalPower = 1;
個のランダムな情報ビットを含められる [0 -1] 範囲にランダムな整数を生成します。helperAEWEncode 関数を使用して、この情報ビットを複素シンボルに符号化します。The helperAEWEncode 関数は、自己符号化器の符号化器の部分を実行してから、奇数の要素と偶数の要素がそれぞれ複素シンボルの同相成分と直交成分にマッピングされるように、実数値 ベクトルを複素数値 ベクトルにマッピングします。ここで、 です。つまり、インターリーブされた複素配列として配列 を扱います。
AWGN チャネルを使用して複素シンボルを渡します。helperAEWDecode 関数を使用して、チャネルで劣化された複素シンボルを復号化します。次のコードは、各 の点について、ブロック エラーが少なくとも 10 個発生するまでシミュレーションを実行します。より正確な結果を得るには、最小の誤り数を 100 以上に増やします。Parallel Computing Toolbox™ がインストールされており、ライセンスを使用できる場合、parfor の行のコメントを解除して並列プールでシミュレーションを実行できます。
たとえば、(2,2) 構成では、自己符号化器は、コンスタレーションのプロットセクションに示すように、位相回転を伴う QPSK () コンスタレーションを学習します。
AWGN チャネルを介してシンボルを送信するために自己符号化器が学習したコンスタレーションと受信したコンスタレーションのプロットを有効にします。
plotConstellation =false; if plotConstellation txConst = comm.ConstellationDiagram(ShowReferenceConstellation=false, ... ShowLegend=true,ChannelNames={'Tx Constellation'}); rxConst = comm.ConstellationDiagram(ShowReferenceConstellation=false, ... ShowLegend=true,ChannelNames={'Rx Constellation'}); end EbNoChannelVec = simParams.EbNoVec + 10*log10(R); BLER = zeros(size(EbNoChannelVec)); %parfor trainingEbNoIdx = 1:length(EbNoChannelVec) for trainingEbNoIdx = 1:length(EbNoChannelVec) EbNo = EbNoChannelVec(trainingEbNoIdx); chan = comm.AWGNChannel(BitsPerSymbol=2, ... EbNo=EbNo,SamplesPerSymbol=1,SignalPower=1); numBlockErrors = 0; frameCnt = 0; while (numBlockErrors < simParams.MinNumErrors) ... && (frameCnt < simParams.MaxNumFrames) d = randi([0 M-1],simParams.NumSymbolsPerFrame,1); % Random information bits classNames = categorical(0:M-1); x = helperAEWEncode(d,txNet(1)); % Encoder if plotConstellation txConst(x) end y = chan(x); % Channel if plotConstellation rxConst(y) end dHat = helperAEWDecode(y, rxNet(1), classNames); % Decoder numBlockErrors = numBlockErrors + sum(d ~= dHat); frameCnt = frameCnt + 1; end BLER(trainingEbNoIdx) = ... numBlockErrors / (frameCnt*simParams.NumSymbolsPerFrame); end
選択した自己符号化器ネットワークの BLER 結果をベースラインとともにプロットします。
helperAEWPlotComparisonBLER(selectAutoencoder,n,k,normalization, ...
BLER,simParams.EbNoVec)
自己符号化器の保存
学習済みの自己符号化器ネットワークとそのパラメーターを保存します。
saveToMAT =false; if saveToMAT fileName = sprintf('trainedNet_n%d_k%d_%s.mat',n,k,normalization); saveParams.trainedNet = trainedNet; saveParams.txNet = txNet; saveParams.rxNet = rxNet; saveParams.info = trainedNetInfo; saveParams.trainParams = trainParams; saveParams.simParams = simParams; save(fileName,"-struct","saveParams"); end
符号化あり QPSK と符号化なし QPSK を使用した自己符号化器の BLER 性能の比較
以下の Figure のデータは、helperAEWSimulateBLER.mlx 補助関数および helperAEWPrepareAutoencoders.mlx 補助関数を使用して取得できます。これらは、以下についての BLER 性能の比較を示すものです。
(7,4) 自己符号化器と QPSK 変調方式 (7,4) ハミング符号 (硬判定と最尤 (ML) 復号化の両方)。符号化なし (4,4) QPSK をベースラインとして使用します。これは基本的に、4 ビットのブロックを送信して BLER を測定する QPSK 変調システムです。

硬判定の QPSK 変調方式 (7,4) ハミング符号は、符号化なしの QPSK に比べて約 0.6 dB 優れています。ML 復号化の QPSK 変調方式 (7,4) ハミング符号は、BLER がさらに 1.5 dB 優れています。(7,4) 自己符号化器の BLER 性能は、3 dB で学習させたときに、ML 復号化の (7,4) ハミング符号の BLER 性能に近づきます。この BLER 性能は、自己符号化器が変調とチャネル符号化の両方を学習でき、符号化率 R=4/7 で約 2 dB の符号化ゲインを達成できることを示しています。
ここで、R=1 の自己符号化器の BLER 性能を、符号化なしの QPSK システムと比較します。符号化なし (2,2) QPSK および符号化なし (8,8) QPSK をベースラインとして使用します。

QPSK のビット エラー レートは、(8,8) と (2,2) のどちらの場合も同じです。ただし、BLER はブロック長 に依存し、 からわかるように、 が大きくなるにつれて悪化します。予期したとおり、(8,8) QPSK の BLER 性能は、(2,2) QPSK システムより悪くなります。(2,2) 自己符号化器の BLER 性能は、(2,2) QPSK の BLER 性能に匹敵します。一方、(4,4) および (8,8) 自己符号化器は、チャネルの符号化器とコンスタレーションを同時に最適化するため、対応する符号化なし QPSK システムと比べて優れた符号化ゲインを得ることができます。
の学習が BLER 性能に与える影響
の値を変えながら、エネルギーが正規化された (7,4) 自己符号化器に学習させ、BLER 性能を比較します。simParams.EbNoVec を 0:4 に設定し、BLER 曲線を延長します。
n = 7; k = 4; normalization = "Energy"; traningEbNoVec = -3:5:7; simParams.EbNoVec = 0:4; for trainingEbNoIdx = 1:length(traningEbNoVec) trainingEbNo = traningEbNoVec(trainingEbNoIdx); [txNetVec{trainingEbNoIdx},rxNetVec{trainingEbNoIdx},infoVec{trainingEbNoIdx},trainedNetVec{trainingEbNoIdx}] = ... helperAEWTrainWirelessAutoencoder(n,k,normalization,trainingEbNo); %#ok<SAGROW> BLERVec{trainingEbNoIdx} = helperAEWAutoencoderBLER(txNetVec{trainingEbNoIdx},rxNetVec{trainingEbNoIdx},simParams); %#ok<SAGROW> end
BLER パフォーマンスに加えて、硬判定で復号化された (7,4) ハミング符号の理論上の上限と、最尤度復号化 (MLD) による (7,4) ハミング符号の BLER シミュレーションの結果をプロットします。(7,4) 自己符号化器の BLER 性能は、学習値 が 10 dB から 1 dB に減少するにつれて MLD の (7,4) ハミング符号の BLER 性能に近づき、MLD の (7,4) ハミング符号とほぼ等しくなります。
berHamming = bercoding(simParams.EbNoVec,'hamming','hard',n); blerHamming = 1-(1-berHamming).^k; hammingBLER = load('codedBLERResults'); figure semilogy(simParams.EbNoVec,blerHamming,':k') legendStr = sprintf('(%d,%d) Hamming HDD Upper',n,k); hold on linespec = {'-*','-d','-o','-s',}; for trainingEbNoIdx=length(traningEbNoVec):-1:1 semilogy(simParams.EbNoVec, BLERVec{trainingEbNoIdx},linespec{trainingEbNoIdx}) legendStr = [legendStr {sprintf('(%d,%d) AE - Training Eb/No=%1.1f', ... n, k, traningEbNoVec(trainingEbNoIdx))}]; %#ok<AGROW> end semilogy(hammingBLER.simParams.EbNoVec,hammingBLER.hammingML74BLER,'--vk') legendStr = [legendStr {'Hamming (7,4) MLD'}]; hold off xlim([min(simParams.EbNoVec) max(simParams.EbNoVec)]) grid on xlabel('E_b/N_o (dB)') ylabel('BLER') legend(legendStr{:},'location','southwest')

まとめとその他の調査
この BLER の結果から、自己符号化器では、符号化と変調スキームを教師なし手法で同時に学習できることがわかります。さらに、R=1 で自己符号化器に学習させることで、従来の手法に匹敵する符号化ゲインを得ることができます。また、この例は、 などのハイパーパラメーターが BLER 性能に与える影響についても示しています。
この結果は、以下の既定の設定を使用して学習と BLER のシミュレーションを行うことで得られます。
trainParams.Plots = 'none'; trainParams.Verbose = false; trainParams.MaxEpochs = 10; trainParams.InitialLearnRate = 0.08; trainParams.LearnRateSchedule = 'piecewise'; trainParams.LearnRateDropPeriod = 5; trainParams.LearnRateDropFactor = 0.1; trainParams.MiniBatchSize = 100*2^k; simParams.EbNoVec = -2:0.5:8; simParams.MinNumErrors = 100; simParams.MaxNumFrames = 300; simParams.NumSymbolsPerFrame = 10000; simParams.SignalPower = 1;
これらのパラメーターを変化させてさまざまな自己符号化器に学習させ、それらの BLER 性能をテストします。n、k、正規化、および の値を変化させて実験を行います。詳細については、helperAEWTrainWirelessAutoencoder.m、helperAEWPrepareAutoencoders.mlx、および helperAEWAutoencoderBLER.m の各補助関数を参照してください。
ローカル関数
function [n,k] = getAEWParameters(autoencoderType) %getAEWParameters Get the autoencoder parameters % [N,K] = getAEWParameters(autoencoderType) returns % the (N,K) parameter values for selected % autoencoder network % Copyright 2024 The MathWorks, Inc. switch autoencoderType case "2,2 Autoencoder" n = 2; k = 2; case "2,4 Autoencoder" n = 2; k = 4; case "4,4 Autoencoder" n = 4; k = 4; case "7,4 Autoencoder" n = 7; k = 4; case "8,8 Autoencoder" n = 8; k = 8; end end
参考文献
[1] T. O’Shea and J. Hoydis, "An Introduction to Deep Learning for the Physical Layer," in IEEE Transactions on Cognitive Communications and Networking, vol. 3, no. 4, pp. 563-575, Dec. 2017, doi:10.1109/TCCN.2017.2758370.
[2] S. Dörner, S. Cammerer, J. Hoydis and S. t.Brink, "Deep Learning Based Communication Over the Air," in IEEE Journal of Selected Topics in Signal Processing, vol. 12, no. 1, pp. 132-143, Feb. 2018, doi:10.1109/JSTSP.2017.2784180.
参考
featureInputLayer (Deep Learning Toolbox) | fullyConnectedLayer (Deep Learning Toolbox) | reluLayer (Deep Learning Toolbox) | softmaxLayer (Deep Learning Toolbox)
トピック
- MATLAB による深層学習 (Deep Learning Toolbox)





