このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ビーム選択用のニューラル ネットワーク
この例では、ニューラル ネットワークを使用してビーム選択タスクのオーバーヘッドを低減する方法を示します。この例では、通信チャネルの情報ではなく、受信機の位置のみを使用します。すべてのビーム ペアに対して網羅的なビーム探索を行う代わりに、選択した 組のビーム ペアの中から探索することで、ビーム スイープのオーバーヘッドを低減できます。この例では、合計 16 組のビーム ペアをもつシステムでシミュレーションを行い、設計した機械学習アルゴリズムが、ビーム ペアの半分のみを網羅的に探索することで 90% の精度を達成できるという結果になります。
はじめに
ミリメートル波 (mmWave) 通信を有効にするには、ビーム管理技術を使用しなければなりません。これは、高周波数ではパス損失や遮断が大きいためです。ビーム管理は、良好な接続性に向けて最適なビーム ペア (送信ビームと対応する受信ビーム) を確立して保持するための、レイヤー 1 (物理レイヤー) とレイヤー 2 (メディア アクセス制御) の手順のセットです [1]。5G New Radio (NR) ビーム管理手順のシミュレーションについては、NR SSB のビーム スイーピング (5G Toolbox)およびCSI-RS を使用した NR ダウンリンク送信側のビーム調整 (5G Toolbox)の例を参照してください。
この例では、ユーザー端末 (UE) とアクセス ネットワーク ノード (gNB) の間で接続が確立されるときのビーム選択手順について考えます。5G NR において、初期アクセスのビーム選択手順はビーム スイープで構成されます。これを行うには、送信側と受信側ですべてのビームを網羅的に探索してから、最も強い基準信号受信強度 (RSRP) が得られるビーム ペアを選択する必要があります。mmWave 通信では多くのアンテナ素子 (つまり多くのビーム) が必要なため、すべてのビームを網羅的に探索すると計算コストが高くなり、初期アクセス時間が長くなります。
網羅的な探索を繰り返し実行することを避け、通信オーバーヘッドを低減するために、機械学習がビーム選択問題に適用されるようになりました。通常、ビーム選択問題は、ターゲット出力が最良のビーム ペア インデックスとなる分類タスクとして提起されます。LiDAR、GPS 信号、路傍カメラ イメージなどの外部情報は、各機械学習アルゴリズム ([2] ~ [6]) への入力として使用されます。具体的には、この帯域外情報が与えられると、学習済み機械学習モデルが 組の適切なビーム ペアのセットを推奨します。すべてのビーム ペアを網羅的に探索する代わりに、シミュレーションは、選択された 組のビーム ペアのみを探索することにより、ビーム スイープのオーバーヘッドを低減します。
この例では、ニューラル ネットワークを使用し、受信機の GPS 座標のみを使用してビーム選択を実行します。この例では、送信機と分布点の位置を固定して、学習サンプルのセットを生成します。各サンプルは、受信機の位置 (GPS データ) と真の最適なビーム ペア インデックス (送信と受信の両端ですべてのビーム ペアの網羅的探索を実行することによって検出) で構成されます。この例では、受信機の位置を入力として使用し、真の最適なビーム ペア インデックスを正解ラベルとして使用するニューラル ネットワークを設計し、それに学習させます。テスト フェーズの際、ニューラル ネットワークは最初に 組の適切なビーム ペアを出力します。これらの 組のビーム ペアに対する網羅的な探索が行われ、平均 RSRP が最も高いビーム ペアが、ニューラル ネットワークによって最終的な予測ビーム ペアとして選択されます。
この例では、平均 RSRP と上位 K 位の精度 ([2] ~ [6]) の 2 つのメトリクスを使用して、推奨された方法の有効性を測定します。次の図は、主な処理手順を示しています。
rng(211); % Set RNG state for repeatability
学習データの生成
事前に記録されたデータでは、受信機が 6 メートル四方の周囲にランダムに配置され、16 組のビーム ペア (各端に 4 つのビーム、1 つの RF チェーンでアナログ ビームフォーミング) で構成されています。MIMO 散乱チャネルを設定した後、この例では、学習セット内の 200 の異なる受信機位置と、テスト セット内の 100 の異なる受信機位置を考慮します。事前に記録されたデータでは、2 次元の位置座標を使用します。具体的には、各サンプルの 3 番目の GPS 座標は常にゼロです。NR SSB Beam Sweeping
の例のように、各位置に対して、SSB ベースのビーム スイープが実行され、16 組のビーム ペアすべてを網羅的に探索します。網羅的探索の際に AWGN が付加されるため、この例では各位置で 4 つの異なる試行を実行し、最も高い平均 RSRP をもつビーム ペアの選択によって、真の最適なビーム ペアを決定します。
新しい学習セットとテスト セットを生成するには、useSavedData
と SaveData
の logical 値を調整できます。データの再生成にはかなりの時間がかかることに注意してください。
useSavedData = true; saveData = false; if useSavedData load nnBS_prm.mat; % Load beam selection system parameters load nnBS_TrainingData.mat; % Load prerecorded training samples % (input: receiver's location; output: optimal beam pair indices) load nnBS_TestData.mat; % Load prerecorded test samples else
周波数とビーム スイープ角度の構成
prm.NCellID = 1; % Cell ID prm.FreqRange = 'FR1'; % Frequency range: 'FR1' or 'FR2' prm.CenterFreq = 2.5e9; % Hz prm.SSBlockPattern = 'Case B'; % Case A/B/C/D/E prm.SSBTransmitted = [ones(1,4) zeros(1,0)]; % 4/8 or 64 in length prm.TxArraySize = [8 8]; % Transmit array size, [rows cols] prm.TxAZlim = [-163 177]; % Transmit azimuthal sweep limits prm.TxELlim = [-90 0]; % Transmit elevation sweep limits prm.RxArraySize = [2 2]; % Receive array size, [rows cols] prm.RxAZlim = [-177 157]; % Receive azimuthal sweep limits prm.RxELlim = [0 90]; % Receive elevation sweep limits prm.ElevationSweep = false; % Enable/disable elevation sweep prm.SNRdB = 30; % SNR, dB prm.RSRPMode = 'SSSwDMRS'; % {'SSSwDMRS', 'SSSonly'} prm = validateParams(prm);
同期信号バーストの構成
txBurst = nrWavegenSSBurstConfig; txBurst.BlockPattern = prm.SSBlockPattern; txBurst.TransmittedBlocks = prm.SSBTransmitted; txBurst.Period = 20; txBurst.SubcarrierSpacingCommon = prm.SubcarrierSpacingCommon;
分布点の構成
c = physconst('LightSpeed'); % Propagation speed prm.lambda = c/prm.CenterFreq; % Wavelength prm.rightCoorMax = 10; % Maximum x-coordinate prm.topCoorMax = 10; % Maximum y-coordinate prm.posTx = [3.5;4.2;0]; % Transmit array position, [x;y;z], meters % Scatterer locations % Generate scatterers at random positions Nscat = 10; % Number of scatterers azRange = prm.TxAZlim(1):prm.TxAZlim(2); elRange = -90:90; % More evenly spaced scatterers randAzOrder = round(linspace(1, length(azRange), Nscat)); azAngInSph = azRange(randAzOrder(1:Nscat)); % Consider a 2-D area, i.e., the elevation angle is zero elAngInSph = zeros(size(azAngInSph)); r = 2; % radius [x,y,z] = sph2cart(deg2rad(azAngInSph),deg2rad(elAngInSph),r); prm.ScatPos = [x;y;z] + [prm.rightCoorMax/2;prm.topCoorMax/2;0];
アンテナ アレイの構成
% Transmit array if prm.IsTxURA % Uniform rectangular array arrayTx = phased.URA(prm.TxArraySize,0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',true)); else % Uniform linear array arrayTx = phased.ULA(prm.NumTx, ... 'ElementSpacing',0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',true)); end % Receive array if prm.IsRxURA % Uniform rectangular array arrayRx = phased.URA(prm.RxArraySize,0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement); else % Uniform linear array arrayRx = phased.ULA(prm.NumRx, ... 'ElementSpacing',0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement); end
Tx/Rx 位置の決定
% Receiver locations % Training data: X points around a rectangle: each side has X/4 random points % X: X/4 for around square, X/10 for validation => lcm(4,10) = 20 smallest NDiffLocTrain = 200; pointsEachSideTrain = NDiffLocTrain/4; prm.NDiffLocTrain = NDiffLocTrain; locationX = 2*ones(pointsEachSideTrain, 1); locationY = 2 + (8-2)*rand(pointsEachSideTrain, 1); locationX = [locationX; 2 + (8-2)*rand(pointsEachSideTrain, 1)]; locationY = [locationY; 8*ones(pointsEachSideTrain, 1)]; locationX = [locationX; 8*ones(pointsEachSideTrain, 1)]; locationY = [locationY; 2 + (8-2)*rand(pointsEachSideTrain, 1)]; locationX = [locationX; 2 + (8-2)*rand(pointsEachSideTrain, 1)]; locationY = [locationY; 2*ones(pointsEachSideTrain, 1)]; locationZ = zeros(size(locationX)); locationMat = [locationX locationY locationZ]; % Fixing receiver's location, run repeated simulations to consider % different realizations of AWGN prm.NRepeatSameLoc = 4; locationMatTrain = repelem(locationMat,prm.NRepeatSameLoc, 1); % Test data: Y points around a rectangle: each side has Y/4 random points % Different data than test, but a smaller number NDiffLocTest = 100; pointsEachSideTest = NDiffLocTest/4; prm.NDiffLocTest = NDiffLocTest; locationX = 2*ones(pointsEachSideTest, 1); locationY = 2 + (8-2)*rand(pointsEachSideTest, 1); locationX = [locationX; 2 + (8-2)*rand(pointsEachSideTest, 1)]; locationY = [locationY; 8*ones(pointsEachSideTest, 1)]; locationX = [locationX; 8*ones(pointsEachSideTest, 1)]; locationY = [locationY; 2 + (8-2)*rand(pointsEachSideTest, 1)]; locationX = [locationX; 2 + (8-2)*rand(pointsEachSideTest, 1)]; locationY = [locationY; 2*ones(pointsEachSideTest, 1)]; locationZ = zeros(size(locationX)); locationMat = [locationX locationY locationZ]; locationMatTest = repelem(locationMat,prm.NRepeatSameLoc,1); [optBeamPairIdxMatTrain,rsrpMatTrain] = hGenDataMIMOScatterChan('training',locationMatTrain,prm,txBurst,arrayTx,arrayRx,311); [optBeamPairIdxMatTest,rsrpMatTest] = hGenDataMIMOScatterChan('test',locationMatTest,prm,txBurst,arrayTx,arrayRx,411); % Save generated data if saveData save('nnBS_prm.mat','prm'); save('nnBS_TrainingData.mat','optBeamPairIdxMatTrain','rsrpMatTrain','locationMatTrain'); save('nnBS_TestData.mat','optBeamPairIdxMatTest','rsrpMatTest','locationMatTest'); end end
送信機と分布点の位置のプロット
figure scatter(prm.posTx(1),prm.posTx(2),100,'r^','filled'); hold on; scatter(prm.ScatPos(1,:),prm.ScatPos(2,:),100,[0.9290 0.6940 0.1250],'s','filled'); xlim([0 10]) ylim([0 10]) title('Transmitter and Scatterers Positions') legend('Transmitter','Scatterers') xlabel('x (m)') ylabel('y (m)')
データ処理と可視化
次に、平均 RSRP が最も高いビーム ペアを真の最適なビーム ペアとしてラベル付けします。one-hot 符号化ラベルを categorical データに変換して、分類に使用します。最後に、categorical データを拡張して合計 16 クラスになるようにし、可能なビーム ペアの数と一致するようにします (クラスの要素数は異なる場合があります)。拡張の目的は、ニューラル ネットワークの出力が確実に目的の次元 16 になるようにすることです。
学習データの処理
% Choose the best beam pair by picking the one with the highest average RSRP % (taking average over NRepeatSameLoc different trials at each location) avgOptBeamPairIdxCellTrain = cell(size(optBeamPairIdxMatTrain, 1)/prm.NRepeatSameLoc, 1); avgOptBeamPairIdxScalarTrain = zeros(size(optBeamPairIdxMatTrain, 1)/prm.NRepeatSameLoc, 1); for locIdx = 1:size(optBeamPairIdxMatTrain, 1)/prm.NRepeatSameLoc avgRsrp = squeeze(rsrpMatTrain(:,:,locIdx)); [~, targetBeamIdx] = max(avgRsrp(:)); avgOptBeamPairIdxScalarTrain(locIdx) = targetBeamIdx; avgOptBeamPairIdxCellTrain{locIdx} = num2str(targetBeamIdx); end % Even though there are a total of 16 beam pairs, due to the fixed topology % (transmitter/scatterers/receiver locations), it is possible % that some beam pairs are never selected as an optimal beam pair % % Therefore, we augment the categories so 16 classes total are in the data % (although some classes may have zero elements) allBeamPairIdxCell = cellstr(string((1:prm.numBeams^2)')); avgOptBeamPairIdxCellTrain = categorical(avgOptBeamPairIdxCellTrain, allBeamPairIdxCell); NBeamPairInTrainData = numel(categories(avgOptBeamPairIdxCellTrain)); % Should be 16
テスト データの処理
% Decide the best beam pair by picking the one with the highest avg. RSRP avgOptBeamPairIdxCellTest = cell(size(optBeamPairIdxMatTest, 1)/prm.NRepeatSameLoc, 1); avgOptBeamPairIdxScalarTest = zeros(size(optBeamPairIdxMatTest, 1)/prm.NRepeatSameLoc, 1); for locIdx = 1:size(optBeamPairIdxMatTest, 1)/prm.NRepeatSameLoc avgRsrp = squeeze(rsrpMatTest(:,:,locIdx)); [~, targetBeamIdx] = max(avgRsrp(:)); avgOptBeamPairIdxScalarTest(locIdx) = targetBeamIdx; avgOptBeamPairIdxCellTest{locIdx} = num2str(targetBeamIdx); end % Augment the categories such that the data has 16 classes total avgOptBeamPairIdxCellTest = categorical(avgOptBeamPairIdxCellTest, allBeamPairIdxCell); NBeamPairInTestData = numel(categories(avgOptBeamPairIdxCellTest)); % Should be 16
ニューラル ネットワークの入出力データの作成
trainDataLen = size(locationMatTrain, 1)/prm.NRepeatSameLoc; trainOut = avgOptBeamPairIdxCellTrain; sampledLocMatTrain = locationMatTrain(1:prm.NRepeatSameLoc:end, :); trainInput = sampledLocMatTrain(1:trainDataLen, :); % Take 10% data out of test data as validation data valTestDataLen = size(locationMatTest, 1)/prm.NRepeatSameLoc; valDataLen = round(0.1*size(locationMatTest, 1))/prm.NRepeatSameLoc; testDataLen = valTestDataLen-valDataLen; % Randomly shuffle the test data such that the distribution of the % extracted validation data is closer to test data rng(111) shuffledIdx = randperm(prm.NDiffLocTest); avgOptBeamPairIdxCellTest = avgOptBeamPairIdxCellTest(shuffledIdx); avgOptBeamPairIdxScalarTest = avgOptBeamPairIdxScalarTest(shuffledIdx); rsrpMatTest = rsrpMatTest(:,:,shuffledIdx); valOut = avgOptBeamPairIdxCellTest(1:valDataLen, :); testOutCat = avgOptBeamPairIdxCellTest(1+valDataLen:end, :); sampledLocMatTest = locationMatTest(1:prm.NRepeatSameLoc:end, :); sampledLocMatTest = sampledLocMatTest(shuffledIdx, :); valInput = sampledLocMatTest(1:valDataLen, :); testInput = sampledLocMatTest(valDataLen+1:end, :);
学習データの最適なビーム ペア分布のプロット
各学習サンプル (合計 200 個) の位置と最適なビーム ペアをプロットします。各色は、1 つのビーム ペア インデックスを表します。つまり、同じ色のデータ点は同じクラスに属します。学習データ セットを増やして、各ビーム ペアの値が含まれるようにすることもできますが、ビーム ペアの実際の分布は分布点と送信機の位置に依存します。
figure rng(111) % for colors in plot color = rand(NBeamPairInTrainData, 3); uniqueOptBeamPairIdx = unique(avgOptBeamPairIdxScalarTrain); for n = 1:length(uniqueOptBeamPairIdx) beamPairIdx = find(avgOptBeamPairIdxScalarTrain == uniqueOptBeamPairIdx(n)); locX = sampledLocMatTrain(beamPairIdx, 1); locY = sampledLocMatTrain(beamPairIdx, 2); scatter(locX, locY, [], color(n, :)); hold on; end scatter(prm.posTx(1),prm.posTx(2),100,'r^','filled'); scatter(prm.ScatPos(1,:),prm.ScatPos(2,:),100,[0.9290 0.6940 0.1250],'s','filled'); hold off xlabel('x (m)') ylabel('y (m)') xlim([0 10]) ylim([0 10]) title('Optimal Beam Pair Indices (Training Data)')
figure histogram(trainOut) title('Histogram of Optimal Beam Pair Indices (Training Data)') xlabel('Beam Pair Index') ylabel('Number of Occurrences')
検証データの最適ビーム ペア分布のプロット
figure rng(111) % for colors in plot color = rand(NBeamPairInTestData, 3); uniqueOptBeamPairIdx = unique(avgOptBeamPairIdxScalarTest(1:valDataLen)); for n = 1:length(uniqueOptBeamPairIdx) beamPairIdx = find(avgOptBeamPairIdxScalarTest(1:valDataLen) == uniqueOptBeamPairIdx(n)); locX = sampledLocMatTest(beamPairIdx, 1); locY = sampledLocMatTest(beamPairIdx, 2); scatter(locX, locY, [], color(n, :)); hold on; end scatter(prm.posTx(1),prm.posTx(2),100,'r^','filled'); scatter(prm.ScatPos(1,:),prm.ScatPos(2,:),100,[0.9290 0.6940 0.1250],'s','filled'); hold off xlabel('x (m)') ylabel('y (m)') xlim([0 10]) ylim([0 10]) title('Optimal Beam Pair Indices (Validation Data)')
figure histogram(valOut) title('Histogram of Optimal Beam Pair Indices (Validation Data)') xlabel('Beam Pair Index') ylabel('Number of Occurrences')
テスト データの最適ビーム ペア分布のプロット
figure rng(111) % for colors in plots color = rand(NBeamPairInTestData, 3); uniqueOptBeamPairIdx = unique(avgOptBeamPairIdxScalarTest(1+valDataLen:end)); for n = 1:length(uniqueOptBeamPairIdx) beamPairIdx = find(avgOptBeamPairIdxScalarTest(1+valDataLen:end) == uniqueOptBeamPairIdx(n)); locX = sampledLocMatTest(beamPairIdx, 1); locY = sampledLocMatTest(beamPairIdx, 2); scatter(locX, locY, [], color(n, :)); hold on; end scatter(prm.posTx(1),prm.posTx(2),100,'r^','filled'); scatter(prm.ScatPos(1,:),prm.ScatPos(2,:),100,[0.9290 0.6940 0.1250],'s','filled'); hold off xlabel('x (m)') ylabel('y (m)') xlim([0 10]) ylim([0 10]) title('Optimal Beam Pair Indices (Test Data)')
figure histogram(testOutCat) title('Histogram of Optimal Beam Pair Indices (Test Data)') xlabel('Beam Pair Index') ylabel('Number of Occurrences')
ニューラル ネットワークの設計と学習
4 つの隠れ層を使用してニューラル ネットワークに学習させます。この設計は、[3] (4 つの隠れ層) と [5] (各層に 128 個のニューロンをもつ 2 つの隠れ層) で提唱されているもので、受信機の位置もニューラル ネットワークへの入力として考慮します。学習を有効にするには、doTraining
の logical 値を調整します。
この例では、クラスに重みを付けるオプションも提供しています。発生頻度の高いクラスは重みが小さくなり、発生頻度が低いクラスは重みが大きくなります。クラス加重を使用するには、useDiffClassWeights
の logical 値を調整します。
ネットワークを変更して、さまざまな設計を実験します。提供されたデータ セットのいずれかを変更する場合は、変更されたデータ セットでネットワークに再学習させなければなりません。ネットワークの再学習には、かなりの時間がかかる場合があります。後続の実行で学習済みネットワークを使用するには、saveNet
の logical 値を調整します。
doTraining = false; useDiffClassWeights = false; saveNet = false; if doTraining if useDiffClassWeights catCount = countcats(trainOut); %#ok<UNRCH> catFreq = catCount/length(trainOut); nnzIdx = (catFreq ~= 0); medianCount = median(catFreq(nnzIdx)); classWeights = 10*ones(size(catFreq)); classWeights(nnzIdx) = medianCount./catFreq(nnzIdx); filename = 'nnBS_trainedNetwWeighting.mat'; else classWeights = ones(1,NBeamPairInTestData); filename = 'nnBS_trainedNet.mat'; end % Neural network design layers = [ ... featureInputLayer(3,'Name','input','Normalization','rescale-zero-one') fullyConnectedLayer(96,'Name','linear1') leakyReluLayer(0.01,'Name','leakyRelu1') fullyConnectedLayer(96,'Name','linear2') leakyReluLayer(0.01,'Name','leakyRelu2') fullyConnectedLayer(96,'Name','linear3') leakyReluLayer(0.01,'Name','leakyRelu3') fullyConnectedLayer(96,'Name','linear4') leakyReluLayer(0.01,'Name','leakyRelu4') fullyConnectedLayer(NBeamPairInTrainData,'Name','linear5') softmaxLayer('Name','softmax')]; maxEpochs = 1000; miniBatchSize = 256; options = trainingOptions('adam', ... 'MaxEpochs',maxEpochs, ... 'MiniBatchSize',miniBatchSize, ... 'InitialLearnRate',1e-4, ... 'ValidationData',{valInput,valOut}, ... 'ValidationFrequency',500, ... 'OutputNetwork', 'best-validation-loss', ... 'Shuffle','every-epoch', ... 'Plots','none', ... 'ExecutionEnvironment','cpu', ... 'Verbose',true); % Train the network net = trainnet(trainInput,trainOut,layers,@(x,t) crossentropy(x,t,classWeights,WeightsFormat='C'),options); if saveNet save(filename,'net'); end else if useDiffClassWeights load 'nnBS_trainedNetwWeighting.mat'; else load 'nnBS_trainedNet.mat'; end end
異なるアプローチの比較: 上位 K 位の精度
このセクションでは、上位 K 位の精度のメトリクスを考慮して、目には見えないテスト データで学習済みのネットワークをテストします。上位 K 位の精度のメトリクスは、ニューラル ネットワークベースのビーム選択タスク ([2] ~ [6]) で広く使用されています。
受信機の位置が与えられると、ニューラル ネットワークは最初に 組の推奨ビーム ペアを出力します。次に、これらの 組のビーム ペアに対して網羅的なシーケンシャル探索を実行し、平均 RSRP が最も高いものを最終予測として選択します。最終的に選択されたビーム ペアが真の最適なビーム ペアであった場合、予測は成功します。同様に、ニューラル ネットワークによって推奨される 組のビーム ペアのうちの 1 つが真の最適なビーム ペアであった場合、成功と見なされます。
3 つのベンチマークを比較します。方式ごとに 個の推奨ビーム ペアが生成されます。
KNN - この手法は、テスト サンプルのために、最初に GPS 座標に基づいて 個の最も近い学習サンプルを収集します。この手法では、これらの 個の学習サンプルに関連付けられたすべてのビーム ペアを推奨します。各学習サンプルには対応する最適なビーム ペアがあるため、推奨されるビーム ペアの数は多くても 組になります (一部のビーム ペアは同じである可能性がある)。
統計的情報 [5] - この手法は、最初に学習セット内での相対頻度に従ってすべてのビーム ペアをランク付けし、次に最初の 組のビーム ペアを常に選択します。
ランダム [5] - この手法は、テスト サンプルのために、ランダムに 組のビーム ペアを選択します。
このプロットは、 の場合の精度が既に 90% を超えていることを示しています。これは、ビーム選択タスクに学習済みニューラル ネットワークを使用することの有効性を強調しています。 の場合、すべての方式 (KNN 以外) で 16 組のビーム ペアすべての網羅的な探索に緩和され、100% の精度が達成されます。しかし、 KNN の場合は、16 個の最も近い学習サンプルが考慮され、これらのサンプルからの "異なる" ビーム ペアの数は多くの場合 16 未満になります。そのため、KNN は 100% の精度を達成しません。
rng(111) % for repeatability of the "Random" policy testOut = avgOptBeamPairIdxScalarTest(1+valDataLen:end, :); statisticCount = countcats(testOutCat); predTestOutput = predict(net,testInput); K = prm.numBeams^2; accNeural = zeros(1,K); accKNN = zeros(1,K); accStatistic = zeros(1,K); accRandom = zeros(1,K); for k = 1:K predCorrectNeural = zeros(testDataLen,1); predCorrectKNN = zeros(testDataLen,1); predCorrectStats = zeros(testDataLen,1); predCorrectRandom = zeros(testDataLen,1); knnIdx = knnsearch(trainInput,testInput,'K',k); for n = 1:testDataLen trueOptBeamIdx = testOut(n); % Neural Network [~, topKPredOptBeamIdx] = maxk(predTestOutput(n, :),k); if sum(topKPredOptBeamIdx == trueOptBeamIdx) > 0 % if true, then the true correct index belongs to one of the K predicted indices predCorrectNeural(n,1) = 1; end % KNN neighborsIdxInTrainData = knnIdx(n,:); topKPredOptBeamIdx= avgOptBeamPairIdxScalarTrain(neighborsIdxInTrainData); if sum(topKPredOptBeamIdx == trueOptBeamIdx) > 0 % if true, then the true correct index belongs to one of the K predicted indices predCorrectKNN(n,1) = 1; end % Statistical Info [~, topKPredOptBeamIdx] = maxk(statisticCount,k); if sum(topKPredOptBeamIdx == trueOptBeamIdx) > 0 % if true, then the true correct index belongs to one of the K predicted indices predCorrectStats(n,1) = 1; end % Random topKPredOptBeamIdx = randperm(prm.numBeams*prm.numBeams,k); if sum(topKPredOptBeamIdx == trueOptBeamIdx) > 0 % if true, then the true correct index belongs to one of the K predicted indices predCorrectRandom(n,1) = 1; end end accNeural(k) = sum(predCorrectNeural)/testDataLen*100; accKNN(k) = sum(predCorrectKNN)/testDataLen*100; accStatistic(k) = sum(predCorrectStats)/testDataLen*100; accRandom(k) = sum(predCorrectRandom)/testDataLen*100; end figure lineWidth = 1.5; colorNeural = [0 0.4470 0.7410]; colorKNN = [0.8500 0.3250 0.0980]; colorStats = [0.4940 0.1840 0.5560]; colorRandom = [0.4660 0.6740 0.1880]; plot(1:K,accNeural,'--*','LineWidth',lineWidth,'Color',colorNeural) hold on plot(1:K,accKNN,'--o','LineWidth',lineWidth,'Color',colorKNN) plot(1:K,accStatistic,'--s','LineWidth',lineWidth,'Color',colorStats) plot(1:K,accRandom,'--d','LineWidth',lineWidth,'Color',colorRandom) hold off grid on xticks(1:K) xlabel('$K$','interpreter','latex') ylabel('Top-$K$ Accuracy','interpreter','latex') title('Performance Comparison of Different Beam Pair Selection Schemes') legend('Neural Network','KNN','Statistical Info','Random','Location','best')
異なるアプローチの比較: 平均 RSRP
目には見えないテスト データを使用して、ニューラル ネットワークと 3 つのベンチマークによって達成された平均 RSRP を計算します。プロットは、学習済みニューラル ネットワークを使用すると、最適な網羅的探索に近い平均 RSRP が得られることを示しています。
rng(111) % for repeatability of the "Random" policy K = prm.numBeams^2; rsrpOptimal = zeros(1,K); rsrpNeural = zeros(1,K); rsrpKNN = zeros(1,K); rsrpStatistic = zeros(1,K); rsrpRandom = zeros(1,K); for k = 1:K rsrpSumOpt = 0; rsrpSumNeural = 0; rsrpSumKNN = 0; rsrpSumStatistic = 0; rsrpSumRandom = 0; knnIdx = knnsearch(trainInput,testInput,'K',k); for n = 1:testDataLen % Exhaustive Search trueOptBeamIdx = testOut(n); rsrp = rsrpMatTest(:,:,valDataLen+n); rsrpSumOpt = rsrpSumOpt + rsrp(trueOptBeamIdx); % Neural Network [~, topKPredOptCatIdx] = maxk(predTestOutput(n, :),k); rsrpSumNeural = rsrpSumNeural + max(rsrp(topKPredOptCatIdx)); % KNN neighborsIdxInTrainData = knnIdx(n,:); topKPredOptBeamIdxKNN = avgOptBeamPairIdxScalarTrain(neighborsIdxInTrainData); rsrpSumKNN = rsrpSumKNN + max(rsrp(topKPredOptBeamIdxKNN)); % Statistical Info [~, topKPredOptCatIdxStat] = maxk(statisticCount,k); rsrpSumStatistic = rsrpSumStatistic + max(rsrp(topKPredOptCatIdxStat)); % Random topKPredOptBeamIdxRand = randperm(prm.numBeams*prm.numBeams,k); rsrpSumRandom = rsrpSumRandom + max(rsrp(topKPredOptBeamIdxRand)); end rsrpOptimal(k) = rsrpSumOpt/testDataLen/prm.NRepeatSameLoc; rsrpNeural(k) = rsrpSumNeural/testDataLen/prm.NRepeatSameLoc; rsrpKNN(k) = rsrpSumKNN/testDataLen/prm.NRepeatSameLoc; rsrpStatistic(k) = rsrpSumStatistic/testDataLen/prm.NRepeatSameLoc; rsrpRandom(k) = rsrpSumRandom/testDataLen/prm.NRepeatSameLoc; end figure lineWidth = 1.5; plot(1:K,rsrpOptimal,'--h','LineWidth',lineWidth,'Color',[0.6350 0.0780 0.1840]); hold on plot(1:K,rsrpNeural,'--*','LineWidth',lineWidth,'Color',colorNeural) plot(1:K,rsrpKNN,'--o','LineWidth',lineWidth,'Color',colorKNN) plot(1:K,rsrpStatistic,'--s','LineWidth',lineWidth,'Color',colorStats) plot(1:K,rsrpRandom,'--d','LineWidth',lineWidth, 'Color',colorRandom) hold off grid on xticks(1:K) xlabel('$K$','interpreter','latex') ylabel('Average RSRP') title('Performance Comparison of Different Beam Pair Selection Schemes') legend('Exhaustive Search','Neural Network','KNN','Statistical Info','Random','Location','best')
最適な手法、ニューラル ネットワーク、および KNN でのアプローチの最終値を比較します。
[rsrpOptimal(end-3:end); rsrpNeural(end-3:end); rsrpKNN(end-3:end);]
ans = 3×4
80.7363 80.7363 80.7363 80.7363
80.7363 80.7363 80.7363 80.7363
80.5067 80.5068 80.5069 80.5212
KNN と最適な手法の間でパフォーマンスのギャップがあることは、より大きなビーム ペアのセット (たとえば 256) を考慮した場合でも、KNN がうまく機能しない可能性があることを示しています。
混同行列のプロット
要素が少ないクラスは、学習済みネットワークで悪影響を受けることがわかります。異なるクラスに対して異なる重みを使用することで、これを回避できる可能性があります。useDiffClassWeights
の logical 値を使用し、クラスごとにカスタムの重みを指定して同じように調査します。
scores = predict(net,testInput);
predLabels = scores2label(scores,allBeamPairIdxCell);
figure;
cm = confusionchart(testOutCat,predLabels);
title('Confusion Matrix')
まとめとその他の調査
この例では、5G NR システムのビーム選択タスクへのニューラル ネットワークの応用について説明しています。 組の適切なビーム ペアのセットを出力するニューラル ネットワークを設計し、それに学習させることができます。ビーム スイープのオーバーヘッドは、選択された 組のビーム ペアのみを網羅的に探索することで低減できます。
この例では、MIMO チャネル内の分布点を指定できます。ビーム選択におけるチャネルの影響を確認するには、さまざまなシナリオを試してください。この例では、さまざまなネットワーク構造とハイパーパラメーターの学習を実験するために使用できる保存済みのデータセットも提供しています。
シミュレーションの結果から、16 組のビーム ペアに対する事前記録された MIMO 散乱チャネルの場合、提案されたアルゴリズムは、 の場合に上位 K 位の精度 90% を達成できます。これは、ニューラル ネットワークを使用する場合に、すべてのビーム ペアの半分のみを網羅的に探索すればよく、ビーム スイープのオーバーヘッドを 50% 削減できることを示しています。他のシステム パラメーターを変更して実験し、データを再生成してネットワークの有効性を確認した後、ネットワークに再学習させて再テストします。
参考文献
3GPP TR 38.802, "Study on New Radio access technology physical layer aspects." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
Klautau, A., González-Prelcic, N., and Heath, R. W., "LIDAR data for deep learning-based mmWave beam-selection," IEEE Wireless Communications Letters, vol. 8, no. 3, pp. 909–912, Jun. 2019.
Heng, Y., and Andrews, J. G., "Machine Learning-Assisted Beam Alignment for mmWave Systems," 2019 IEEE Global Communications Conference (GLOBECOM), 2019, pp. 1-6, doi: 10.1109/GLOBECOM38437.2019.9013296.
Klautau, A., Batista, P., González-Prelcic, N., Wang, Y., and Heath, R. W., "5G MIMO Data for Machine Learning: Application to Beam-Selection Using Deep Learning," 2018 Information Theory and Applications Workshop (ITA), 2018, pp. 1-9, doi: 10.1109/ITA.2018.8503086.
Matteo, Z., <https://github.com/ITU-AI-ML-in-5G-Challenge/PS-012-ML5G-PHY-Beam-Selection_BEAMSOUP> (This is the team achieving the highest test score in the ITU Artificial Intelligence/Machine Learning in 5G Challenge in 2020).
Sim, M. S., Lim, Y., Park, S. H., Dai, L., and Chae, C., "Deep Learning-Based mmWave Beam Selection for 5G NR/6G With Sub-6 GHz Channel Information: Algorithms and Prototype Validation," IEEE Access, vol. 8, pp. 51634-51646, 2020.
ローカル関数
function prm = validateParams(prm) % Validate user specified parameters and return updated parameters % % Only cross-dependent checks are made for parameter consistency. if strcmpi(prm.FreqRange,'FR1') if prm.CenterFreq > 7.125e9 || prm.CenterFreq < 410e6 error(['Specified center frequency is outside the FR1 ', ... 'frequency range (410 MHz - 7.125 GHz).']); end if strcmpi(prm.SSBlockPattern,'Case D') || ... strcmpi(prm.SSBlockPattern,'Case E') error(['Invalid SSBlockPattern for selected FR1 frequency ' ... 'range. SSBlockPattern must be one of ''Case A'' or ' ... '''Case B'' or ''Case C'' for FR1.']); end if ~((length(prm.SSBTransmitted)==4) || ... (length(prm.SSBTransmitted)==8)) error(['SSBTransmitted must be a vector of length 4 or 8', ... 'for FR1 frequency range.']); end if (prm.CenterFreq <= 3e9) && (length(prm.SSBTransmitted)~=4) error(['SSBTransmitted must be a vector of length 4 for ' ... 'center frequency less than or equal to 3GHz.']); end if (prm.CenterFreq > 3e9) && (length(prm.SSBTransmitted)~=8) error(['SSBTransmitted must be a vector of length 8 for ', ... 'center frequency greater than 3GHz and less than ', ... 'or equal to 7.125GHz.']); end else % 'FR2' if prm.CenterFreq > 52.6e9 || prm.CenterFreq < 24.25e9 error(['Specified center frequency is outside the FR2 ', ... 'frequency range (24.25 GHz - 52.6 GHz).']); end if ~(strcmpi(prm.SSBlockPattern,'Case D') || ... strcmpi(prm.SSBlockPattern,'Case E')) error(['Invalid SSBlockPattern for selected FR2 frequency ' ... 'range. SSBlockPattern must be either ''Case D'' or ' ... '''Case E'' for FR2.']); end if length(prm.SSBTransmitted)~=64 error(['SSBTransmitted must be a vector of length 64 for ', ... 'FR2 frequency range.']); end end % Number of beams at transmit/receive ends prm.numBeams = sum(prm.SSBTransmitted); prm.NumTx = prod(prm.TxArraySize); prm.NumRx = prod(prm.RxArraySize); if prm.NumTx==1 || prm.NumRx==1 error(['Number of transmit or receive antenna elements must be', ... ' greater than 1.']); end prm.IsTxURA = (prm.TxArraySize(1)>1) && (prm.TxArraySize(2)>1); prm.IsRxURA = (prm.RxArraySize(1)>1) && (prm.RxArraySize(2)>1); if ~( strcmpi(prm.RSRPMode,'SSSonly') || ... strcmpi(prm.RSRPMode,'SSSwDMRS') ) error(['Invalid RSRP measuring mode. Specify either ', ... '''SSSonly'' or ''SSSwDMRS'' as the mode.']); end % Select SCS based on SSBlockPattern switch lower(prm.SSBlockPattern) case 'case a' scs = 15; cbw = 10; scsCommon = 15; case {'case b', 'case c'} scs = 30; cbw = 25; scsCommon = 30; case 'case d' scs = 120; cbw = 100; scsCommon = 120; case 'case e' scs = 240; cbw = 200; scsCommon = 120; end prm.SCS = scs; prm.ChannelBandwidth = cbw; prm.SubcarrierSpacingCommon = scsCommon; end
参考
関数
オブジェクト
phased.ULA
(Phased Array System Toolbox) |phased.URA
(Phased Array System Toolbox) |phased.IsotropicAntennaElement
(Phased Array System Toolbox) |dlnetwork
関連するトピック
- MATLAB による深層学習
- NR SSB のビーム スイーピング (5G Toolbox)