このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ビーム選択用のニューラル ネットワーク
この例では、ニューラル ネットワークを使用してビーム選択タスクのオーバーヘッドを低減する方法を示します。この例では、通信チャネルの情報ではなく、受信機の位置のみを使用します。すべてのビーム ペアに対して網羅的なビーム探索を行う代わりに、選択した 組のビーム ペアの中から探索することで、ビーム スイープのオーバーヘッドを低減できます。合計 70 組のビーム ペアをもつシステムについて考えた場合、シミュレーション結果を見ると、設計された機械学習アルゴリズムは、ビーム ペアの半分未満に対して網羅的探索を実行することで、90% の精度を達成できることがわかります。この例のシミュレーションでは、TR 38.901 および TR 38.843 で定義されている都市マクロセル (UMa) のシナリオについて考えます。
はじめに
ミリメートル波 (mmWave) 通信を有効にするには、ビーム管理技術を使用しなければなりません。これは、高周波数ではパス損失や遮断が大きいためです。ビーム管理は、良好な接続を実現する最適なビーム ペア (送信ビームおよび対応する受信ビーム) を確立して保持するための、レイヤー 1 (物理レイヤー) とレイヤー 2 (メディア アクセス制御) の手順のセットです。5G New Radio (NR) ビーム管理手順のシミュレーションについては、NR SSB のビーム スイーピング (5G Toolbox)およびCSI-RS を使用した NR ダウンリンク送信側のビーム調整 (5G Toolbox)の例を参照してください。
この例では、ユーザー端末 (UE) とアクセス ネットワーク ノード (gNB) の間で接続が確立されるときのビーム選択手順について考えます。5G NR において、初期アクセスのビーム選択手順はビーム スイープで構成されます。これを行うには、送信側と受信側ですべてのビームを網羅的に探索してから、最も強い基準信号受信パワー (RSRP) が得られるビーム ペアを選択する必要があります。mmWave 通信では多くのアンテナ素子 (つまり多くのビーム) が必要なため、すべてのビームを網羅的に探索すると計算コストが高くなり、初期アクセス時間が長くなります。
網羅的な探索を繰り返し実行することを避け、通信オーバーヘッドを低減するために、機械学習がビーム選択問題に適用されるようになりました。通常、ビーム選択問題は、ターゲット出力が最良のビーム ペア インデックスとなる分類タスクとして提起されます。LiDAR、GPS 信号、路側カメラ イメージなどの外部情報が、各機械学習アルゴリズムへの入力として使用されます。具体的には、この帯域外情報が与えられると、学習済み機械学習モデルが 組の適切なビーム ペアのセットを推奨します。すべてのビーム ペアを網羅的に探索する代わりに、シミュレーションは、選択された 組のビーム ペアのみを探索することにより、ビーム スイープのオーバーヘッドを低減します。
この例では、ニューラル ネットワークを使用し、UE の 3 次元座標と TR 38.901 の定義に準拠したチャネル モデルのみを使用してビーム選択を実行します。この例は次の手順で構成されます。
学習サンプルのセットを生成します。各サンプルは、UE の位置と真の最適なビーム ペア インデックス (送信と受信の両端ですべてのビーム ペアの網羅的探索を実行することによって検出) で構成されます。
UE の位置を入力として使用し、真の最適なビーム ペア インデックスを正解ラベルとして使用するニューラル ネットワークを設計し、それに学習させます。
テスト サンプルのセットを使用してニューラル ネットワークを実行します。このフェーズでは、ニューラル ネットワークが 組の適切なビーム ペアを出力します。
上記の手順で得られた 組の適切なビーム ペアに対して網羅的探索を実行します。ニューラル ネットワークによって、平均 RSRP が最も高いビーム ペアが最終的な予測ビーム ペアとして選択されます。
この例では、2 種類のメトリクス (平均 RSRP および上位 K 位の精度) を使用し、提案された手法の有効性を評価します。次の図は、主な処理手順を示しています。
学習データとテスト データの生成
事前に記録されたデータでは、TR 38.901 で説明されているように、3 セクター セルの最初のセクター内に UE がランダムに分散配置されているチャネルがシミュレートされています。この例では、TR 38.843 Table 6.3.1-1 に示された AI/ML に対するベースライン システムレベルのシミュレーションの前提条件を使用しています。送信ビームと受信ビームの数は、半値ビーム幅によって異なります。この例では、ビームの数を最小限に抑えながら、領域全体をカバーするのに十分なビーム数を選択します。この例では、既定で、TR 38.843 Table 6.3.1-1 で定義されているアンテナ仕様に従い、送信ビームを 10 個、受信ビームを 7 個にすることを検討します。この例では、TR 38.901 のチャネルを設定した後、学習セットでは UE 位置を 15,000 個、テスト セットでは UE 位置を 500 個にすることを検討します。この例では、各位置に対して、SSB ベースのビーム スイープを実行して 70 組のビーム ペアすべてについて網羅的探索を行い、平均 RSRP が最も高いビーム ペアを選択して真の最適なビーム ペアを決定します。
新しい学習セットとテスト セットを生成するには、useSavedData
チェックボックスおよび SaveData
チェックボックスを調整します。
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
データ生成パラメーター
TR 38.843 Table 6.3.1-1 の既定値に従ってシナリオを構成します。
prm.NCellID =1; prm.FrequencyRange =
'FR2'; prm.Scenario =
"UMa"; prm.CenterFrequency =
30e9; % Hz prm.SSBlockPattern =
"Case D"; % Case A/B/C/D/E % Number of transmitted blocks. Set it to empty to let the example use % the minimum number that ensures a full coverage of the 120-degree % sector without overlapping of beams or gaps in the coverage prm.NumSSBlocks =
[]; prm.InterSiteDistance =
200; % meters prm.PowerBSs =
40; % dBm prm.UENoiseFigure =
10; % UE receiver noise figure in dB % Define the method to compute the RSRP: |SSSonly| uses SSS alone and % |SSSwDMRS| uses SSS and PBCH DM-RS. prm.RSRPMode =
'SSSwDMRS';
アンテナ アレイの構成
c = physconst('LightSpeed'); % Propagation speed prm.Lambda = c/prm.CenterFrequency; % Wavelength prm.ElevationSweep = false; % Enable/disable elevation sweep
TR 38.901 の定義に従い、4×8 の交差偏波素子をもつ方形アレイとして送信アンテナ アレイを定義します。この例では、TR 38.901 Table 7.8-1 で定義されているように、最初のセクターが 30 度を中心として配置された 3 セクター セルの最初のセクターをカバーする基地局を検討しています。アンテナ アレイがセクターの中心を向いていることを考慮して、120 度のセクター全体をカバーするようにアンテナ スイープの方位角の範囲を設定します。
% Transmit array prm.TransmitAntennaArray = phased.NRRectangularPanelArray(... Size=[4,8,1,1],... Spacing=[0.5,0.5,1,1]*prm.Lambda); % Transmit azimuth and elevation sweep limits in degrees prm.TxAZlim = [-60 60]; prm.TxELlim = [-90 0];
送信アンテナのダウンチルト角度を度単位で定義します。既定値は TR 38.843 Table 6.3.1-2 で定義されています。
prm.TxDowntilt = 110;
TR 38.901 の定義に従い、1×4 の無指向性の交差偏波素子をもつ方形アレイとして受信アンテナ アレイを定義します。アンテナ アレイ パターンは対称で、アンテナ素子は無指向性であるため、360 度空間全体の半分をカバーするようにアンテナ スイープの方位角の範囲を設定します。
% Receive array prm.ReceiveAntennaArray = phased.NRRectangularPanelArray(... Size=[1,4,1,1],... Spacing=[0.5,0.5,1,1]*prm.Lambda,... ElementSet={phased.ShortDipoleAntennaElement,... phased.ShortDipoleAntennaElement}); % Ensure the two elements are cross polarized with +45 and -45 deg % polarization angles prm.ReceiveAntennaArray.ElementSet{1}.AxisDirection = "Custom"; prm.ReceiveAntennaArray.ElementSet{1}.CustomAxisDirection = [0; 1; 1]; prm.ReceiveAntennaArray.ElementSet{2}.AxisDirection = "Custom"; prm.ReceiveAntennaArray.ElementSet{2}.CustomAxisDirection = [0; -1; 1]; % Receive azimuth and elevation sweep limits in degrees prm.RxAZlim = [-90 90]; prm.RxELlim = [0 90];
現在のパラメーター セットを検証します。
prm = validateParams(prm);
学習データの生成
学習データの UE 位置の数を設定します。hGenData38901Channel
関数は、指定された数の UE をセルの最初のセクター境界内にランダムに配置します。
prmTrain = prm;
prmTrain.NumUELocations = 15e3;
prmTrain.Seed = 42; % Set random number generator seed for repeatability
各 UE 位置の学習データを生成します。
disp("Generating training data...") [optBeamPairIdxTrain,rsrpMatTrain,dataTrain] = hGenData38901Channel(prmTrain); disp("Finished generating training data.")
テスト データの生成
テスト データの UE 位置の数を設定します。
prmTest = prm;
prmTest.NumUELocations = 500;
prmTest.Seed = 24; % Set random number generator seed for repeatability
各 UE 位置のテスト データを生成します。
disp("Generating test data...") [optBeamPairIdxTest,rsrpMatTest,dataTest] = hGenData38901Channel(prmTest); disp("Finished generating test data.")
生成されたデータを保存します。
if saveData save('nnBS_prm.mat','prm'); save('nnBS_TrainingData.mat','optBeamPairIdxTrain','rsrpMatTrain','dataTrain'); save('nnBS_TestData.mat','optBeamPairIdxTest','rsrpMatTest','dataTest'); end end
送信機と UE 位置のプロット
TR 38.901 で定義されているように、セルの最初のセクター内に学習データとテスト データをプロットします。
% Extract the UE and BS positions for training and testing data
positionsUE = {dataTrain.PosUE, dataTest.PosUE};
positionsBS = {dataTrain.PosBS, dataTest.PosBS};
plotLocations(positionsUE, positionsBS, prm.InterSiteDistance);
データ処理と可視化
クラスの数が、想定されるビーム ペアの数と一致するように、categorical データを拡張します (ただし、要素の数はクラスごとに異なっても構いません)。拡張の目的は、ニューラル ネットワークの出力が確実に目的の次元になるようにすることです。
学習データの処理
NumBeamPairs = prm.NumRxBeams*prm.NumTxBeams; allBeamPairIdxCell = cellstr(string((1:NumBeamPairs)')); % Create the categories from the optimal beam index data optBeamPairIdxCellTrain = cellstr(string(optBeamPairIdxTrain)); % Augment the categories to be as many as the total number of beam pairs optBeamPairIdxCellTrain = categorical(optBeamPairIdxCellTrain, allBeamPairIdxCell);
テスト データの処理
% Create the categories from the optimal beam index data optBeamPairIdxCellTest = cellstr(string(optBeamPairIdxTest)); % Augment the categories to be as many as the total number of beam pairs optBeamPairIdxCellTest = categorical(optBeamPairIdxCellTest, allBeamPairIdxCell);
ニューラル ネットワークの入出力データの作成
% Use 10% of training data as validation data valTrainDataLen = dataTrain.NumUELocations; valDataLen = round(0.1*valTrainDataLen); trainDataLen = valTrainDataLen-valDataLen; % Randomly shuffle the training data such that the distribution of the % extracted validation data is closer to the training data rng(111) shuffledIdx = randperm(dataTrain.NumUELocations); optBeamPairIdxCellTrain = optBeamPairIdxCellTrain(shuffledIdx); optBeamPairIdxTrain = optBeamPairIdxTrain(shuffledIdx); rsrpMatTrain = rsrpMatTrain(:,:,shuffledIdx); sampledLocMatTrain = dataTrain.PosUE(shuffledIdx, :); % Create training input/output data trainInput = sampledLocMatTrain(valDataLen+1:end, :); trainOut = optBeamPairIdxCellTrain(valDataLen+1:end); % Create validation input/output data valInput = sampledLocMatTrain(1:valDataLen, :); valOut = optBeamPairIdxCellTrain(1:valDataLen); % Create test input/output data testDataLen = dataTest.NumUELocations; testInput = dataTest.PosUE; testOut = optBeamPairIdxCellTest;
学習データの最適なビーム ペア分布のプロット
各学習サンプルの位置と最適なビーム ペアをプロットします。各色は、1 つのビーム ペア インデックスを表します。同じ色のデータ点は同じクラスに属します。各ビーム ペアの値を含めるには、学習データ セットを増やします。プロットは、分類ニューラル ネットワークの学習用に生成されたデータセットの判定領域を示しています。
plotBeamPairsDist(sampledLocMatTrain,optBeamPairIdxTrain,dataTrain.PosBS,NumBeamPairs);
最適なビーム ペアのヒストグラム
各ビーム ペアが最適となった回数を示すヒストグラムをプロットします。1 度も最適とならないビーム ペアがある場合は、UE 位置の数を増やし、学習データセットとテスト データセットを増やしてみてください。
data = {trainOut, valOut, testOut}; plotBeamPairsHist(data,NumBeamPairs);
ニューラル ネットワークの設計と学習
4 つの隠れ層を使用してニューラル ネットワークに学習させます [5]。学習を有効にするには、doTraining
チェックボックスをオンにします。
この例では、学習データ セット内のクラスに重みを付けます。発生頻度の高いクラスは重みが小さくなり、発生頻度が低いクラスは重みが大きくなります。クラスに重みを付けない場合は、useDiffClassWeights
チェックボックスをオフにします。
ネットワークを変更して、さまざまな設計を実験します。提供されたデータ セットのいずれかを変更する場合は、変更されたデータ セットでネットワークに再学習させなければなりません。後続の実行で学習済みネットワークを使用するには、saveNet
チェックボックスをオンにします。
doTraining =false; useDiffClassWeights =
true; saveNet =
false; if doTraining if useDiffClassWeights catCount = countcats(trainOut); 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,NumBeamPairs); 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(NumBeamPairs,'Name','linear5') softmaxLayer('Name','softmax')];
ネットワークが学習データに過適合するのを避けるため、maxEpochs
を 50、InitialLearnRate
を 1e-4 に設定します。accuracyMetric
(Deep Learning Toolbox)オブジェクトを使用し、NumTopKClasses
を 30 に設定して、学習中に上位 30 位のビームの精度をプロットします。
maxEpochs = 50; miniBatchSize = 500; options = trainingOptions("adam", ... MaxEpochs=maxEpochs, ... MiniBatchSize=miniBatchSize, ... InitialLearnRate=1e-4, ... ValidationData={valInput,valOut}, ... ValidationFrequency=500, ... OutputNetwork="best-validation-loss", ... Shuffle="every-epoch", ... Plots="training-progress", ... Verbose=false, ... Metric=accuracyMetric(Name="Top30_Accuracy",NumTopKClasses=30)); % 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
ネットワークは、50 エポック後に上位 30 位のビーム ペアで 90% の精度に達しています。
異なるアプローチの比較: 上位 K 位の精度
このセクションでは、上位 K 位の精度のメトリクスを考慮して、目には見えないテスト データで学習済みのネットワークをテストします。上位 K 位の精度のメトリクスは、ニューラル ネットワークベースのビーム選択タスクで広く使用されています。
受信機の位置が与えられると、ニューラル ネットワークは最初に 組の推奨ビーム ペアを出力します。次に、これらの 組のビーム ペアに対して網羅的なシーケンシャル探索を実行し、平均 RSRP が最も高いものを最終予測として選択します。最終的に選択されたビーム ペアが真の最適なビーム ペアであった場合、予測は成功します。同様に、ニューラル ネットワークによって推奨される 組のビーム ペアのうちの 1 つが真の最適なビーム ペアであった場合、成功と見なされます。
この例では、最適なビーム ペアのインデックスを見つけるための他の 3 つの手法を実装し、それらをベンチマークとして使用します。各手法において、 組の推奨ビーム ペアが生成されます。
KNN - この手法は、テスト サンプルのために、最初に GPS 座標に基づいて 個の最も近い学習サンプルを収集します。この手法では、これらの 個の学習サンプルに関連付けられたすべてのビーム ペアを推奨します。各学習サンプルには対応する最適なビーム ペアがあるため、推奨されるビーム ペアの数は多くても 組になります (一部のビーム ペアは同じである可能性がある)。
統計的情報 [7] - この手法は、最初に学習セット内での相対頻度に従ってすべてのビーム ペアをランク付けし、次に最初の 組のビーム ペアを常に選択します。
ランダム [7] - この手法は、テスト サンプルのために、ランダムに 組のビーム ペアを選択します。
このプロットは、 の場合の精度が既に 90% を超えていることを示しています。これは、ビーム選択タスクに学習済みニューラル ネットワークを使用することの有効性を強調しています。 の場合、統計的情報に基づく手法では 70 組のビーム ペアすべてについて網羅的探索が行われます。したがって、統計的情報に基づく手法では 100% の精度が達成されます。しかし、KNN では、 の場合、70 個の最も近い学習サンプルが考慮され、これらのサンプルからの異なるビーム ペアの数は多くの場合 70 未満になります。そのため、KNN は 100% の精度を達成しません。
rng(111) % for repeatability of the "Random" policy statisticCount = countcats(testOut); predTestOutput = predict(net,testInput); K = NumBeamPairs; 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 = double(testOut(n)); % Neural Network [~, topKPredOptBeamIdx] = maxk(predTestOutput(n, :),k); if any(topKPredOptBeamIdx == trueOptBeamIdx) % 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= optBeamPairIdxTrain(neighborsIdxInTrainData); if any(topKPredOptBeamIdx == trueOptBeamIdx) % 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 any(topKPredOptBeamIdx == trueOptBeamIdx) % if true, then the true correct index belongs to one of the K predicted indices predCorrectStats(n,1) = 1; end % Random topKPredOptBeamIdx = randperm(NumBeamPairs,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
結果をプロットします。
results = {accNeural, accKNN, accStatistic, accRandom}; plotResults(results,K); ylabel("Top-$K$ Accuracy (\%)",Interpreter="latex"); legend("Neural Network","KNN","Statistical Info","Random",Location="best");
異なるアプローチの比較: 平均 RSRP
目には見えないテスト データを使用して、ニューラル ネットワークと 3 つのベンチマークによって達成された平均 RSRP を計算します。
rng(111) % for repeatability of the "Random" policy K = NumBeamPairs; 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(:,:,n); if ~isinf(rsrp(trueOptBeamIdx)) rsrpSumOpt = rsrpSumOpt + rsrp(trueOptBeamIdx); end % Neural Network [~, topKPredOptCatIdx] = maxk(predTestOutput(n, :),k); if ~isinf(max(rsrp(topKPredOptCatIdx))) rsrpSumNeural = rsrpSumNeural + max(rsrp(topKPredOptCatIdx)); end % KNN neighborsIdxInTrainData = knnIdx(n,:); topKPredOptBeamIdxKNN = optBeamPairIdxTrain(neighborsIdxInTrainData); if ~isinf(max(rsrp(topKPredOptBeamIdxKNN))) rsrpSumKNN = rsrpSumKNN + max(rsrp(topKPredOptBeamIdxKNN)); end % Statistical Info [~, topKPredOptCatIdxStat] = maxk(statisticCount,k); if ~isinf(max(rsrp(topKPredOptCatIdxStat))) rsrpSumStatistic = rsrpSumStatistic + max(rsrp(topKPredOptCatIdxStat)); end % Random topKPredOptBeamIdxRand = randperm(NumBeamPairs,k); if ~isinf(max(rsrp(topKPredOptBeamIdxRand))) rsrpSumRandom = rsrpSumRandom + max(rsrp(topKPredOptBeamIdxRand)); end end rsrpOptimal(k) = rsrpSumOpt/testDataLen; rsrpNeural(k) = rsrpSumNeural/testDataLen; rsrpKNN(k) = rsrpSumKNN/testDataLen; rsrpStatistic(k) = rsrpSumStatistic/testDataLen; rsrpRandom(k) = rsrpSumRandom/testDataLen; end
結果をプロットします。
results = {rsrpNeural, rsrpKNN, rsrpStatistic, rsrpRandom, rsrpOptimal}; plotResults(results,K); ylabel("Average RSRP"); legend("Neural Network","KNN","Statistical Info","Random","Exhaustive Search",Location="best");
最適な手法、ニューラル ネットワーク、および KNN でのアプローチの最終値を比較します。
table(rsrpOptimal(end-3:end)', rsrpNeural(end-3:end)', rsrpKNN(end-3:end)', VariableNames=["Optimal","Neural Network","KNN"])
ans=4×3 table
Optimal Neural Network KNN
_______ ______________ _______
-22.975 -22.978 -23.934
-22.975 -22.978 -23.931
-22.975 -22.975 -23.92
-22.975 -22.975 -23.909
KNN と最適な手法の間でパフォーマンスのギャップがあることは、より大きなビーム ペアのセット (たとえば 256) を考慮した場合でも、KNN がうまく機能しない可能性があることを示しています。
まとめとその他の調査
この例では、5G NR システムのビーム選択タスクへのニューラル ネットワークの応用について説明しています。 組の適切なビーム ペアのセットを出力するニューラル ネットワークを設計し、それに学習させることができます。ビーム スイープのオーバーヘッドは、選択された 組のビーム ペアのみを網羅的に探索することで低減できます。
この例では、TR 38.901 チャネル内の UE 位置の数を指定できます。チャネルがビーム選択に与える影響を確認するには、さまざまなシナリオ、アンテナの仰角スイープ、送信ビームと受信ビームの数を試してください。この例では、さまざまなネットワーク構造とハイパーパラメーターの学習を実験するために使用できる保存済みのデータセットも提供しています。
シミュレーションの結果を見ると、70 組のビーム ペアに対する事前記録された TR 38.901 チャネルの場合、提案されたアルゴリズムは、 の場合に上位 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.
3GPP TR 38.843, "Study on Artificial Intelligence (AI)/Machine Learning (ML) for NR air interface" 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
3GPP TR 38.901, "Study on channel model for frequencies from 0.5 to 100 GHz" 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) %#ok<*DEFNU> % Validate user specified parameters and return updated parameters % % Only cross-dependent checks are made for parameter consistency. if strcmpi(prm.FrequencyRange,'FR1') if prm.CenterFrequency > 7.125e9 || prm.CenterFrequency < 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 (prm.CenterFrequency <= 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.CenterFrequency > 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.CenterFrequency > 52.6e9 || prm.CenterFrequency < 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 end % Verify that there are multiple TX and Rx antennas prm.NumTx = getNumElements(prm.TransmitAntennaArray); prm.NumRx = getNumElements(prm.ReceiveAntennaArray); if prm.NumTx==1 || prm.NumRx==1 error(['Number of transmit or receive antenna elements must be', ... ' greater than 1.']); end % Number of beams at transmit end % Assume a number of beams so that the beams span the entire 120-degree % sector, with a maximum of 64 beams, as mentioned in TR 38.843 Table % 6.3.1-1 % Assume the number of transmitted blocks is the same as the number of % beams at transmit end if prm.FrequencyRange=="FR1" maxNumSSBBlocks = 8; else % FR2 maxNumSSBBlocks = 64; end if isempty(prm.NumSSBlocks) % The number of blocks/beams is automatically generated as the % minimum need to span the 120-degree sector azTxBW = beamwidth(prm.TransmitAntennaArray,prm.CenterFrequency,Cut='Azimuth'); numAZTxBeams = round(diff(prm.TxAZlim)/azTxBW); if prm.ElevationSweep % If elevation sweep is enabled, consider elevation as well in % the computation of the number of blocks/beams needed. elTxBW = beamwidth(prm.TransmitAntennaArray,prm.CenterFrequency,'Cut','Elevation'); numELTxBeams = round(diff(prm.TxELlim)/elTxBW); else numELTxBeams = 1; end prm.NumTxBeams = min(numAZTxBeams*numELTxBeams, maxNumSSBBlocks); prm.NumSSBlocks = prm.NumTxBeams; else % The number of blocks/beams is defined by the user if prm.NumSSBlocks>maxNumSSBBlocks error("Invalid number of SSB blocks. For " + prm.FrequencyRange + ... ", there can be only up to " + maxNumSSBBlocks + " blocks."); end prm.NumTxBeams = prm.NumSSBlocks; end prm.SSBTransmitted = [ones(1,prm.NumTxBeams) zeros(1,maxNumSSBBlocks-prm.NumTxBeams)]; % Number of beams at receive end % Assume a number of beams so that the beams cover the full azimuth % sweep, with a maximum of 8 beams, as mentioned in TR 38.843 Table % 6.3.1-1. azRxBW = beamwidth(prm.ReceiveAntennaArray,prm.CenterFrequency,Cut='Azimuth'); numAZRxBeams = round(diff(prm.RxAZlim)/azRxBW); if prm.ElevationSweep % If elevation sweep is enabled, consider elevation as well in % the computation of the number of blocks/beams needed. elRxBW = beamwidth(prm.ReceiveAntennaArray,prm.CenterFrequency,'Cut','Elevation'); numELRxBeams = round(diff(prm.RxELlim)/elRxBW); else numELRxBeams = 1; end prm.NumRxBeams = min(numAZRxBeams*numELRxBeams, 8); % 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; % Set up SSBurst configuration txBurst = nrWavegenSSBurstConfig; txBurst.BlockPattern = prm.SSBlockPattern; txBurst.TransmittedBlocks = prm.SSBTransmitted; txBurst.Period = 20; txBurst.SubcarrierSpacingCommon = prm.SubcarrierSpacingCommon; prm.TxBurst = txBurst; end function plotLocations(positionsUE,positionsBS,ISD) % Plot UE and BS 2D locations within the cell boundaries % Compute the cell boundaries [sitex,sitey] = h38901Channel.sitePolygon(ISD); % Plot training and testing data t = tiledlayout(TileSpacing="compact", GridSize=[1,2]); titles = ["Training Data", "Testing Data"]; for idx = 1:numel(titles) nexttile plot(sitex,sitey,'--'); box on; hold on; plot(positionsUE{idx}(:,1), positionsUE{idx}(:,2), 'b.'); plot(positionsBS{idx}(:,1), positionsBS{idx}(:,2), '^', MarkerEdgeColor='r', MarkerFaceColor='r'); xlabel("x (m)"); ylabel("y (m)"); xlim([min(sitex)-10 max(sitex)+10]); ylim([min(sitey)-10 max(sitey)+10]); axis('square'); title(titles(idx)); end title(t, "Transmitter and UEs 2D Positions"); l = legend("Cell boundaries","UEs","Transmitter"); l.Layout.Tile = "south"; end function plotBeamPairsDist(sampledLocMat,avgOptBeamPairIdxScalar,PosBS,NumBeamPairs) % Plot the optimal beam pair distribution across the UE locations figure rng(111) % for colors in plot color = rand(NumBeamPairs, 3); uniqueOptBeamPairIdx = unique(avgOptBeamPairIdxScalar); hold on; for n = 1:length(uniqueOptBeamPairIdx) beamPairIdx = find(avgOptBeamPairIdxScalar == uniqueOptBeamPairIdx(n)); locX = sampledLocMat(beamPairIdx, 1); locY = sampledLocMat(beamPairIdx, 2); plot(locX, locY, LineStyle="none", Marker="o", MarkerEdgeColor=color(n, :)); end box on; plot(PosBS(:,1), PosBS(:,2), LineStyle="none", Marker="^", MarkerFaceColor="r", MarkerSize=10); hold off; xlabel("x (m)"); ylabel("y (m)"); title("Optimal Beam Pair Indices (Training Data)"); end function plotBeamPairsHist(data,NumBeamPairs) % Plot the optimal beam pair histogram t = tiledlayout(TileSpacing="compact", GridSize=[2,2]); titles = ["Training Data", "Validation Data", "Testing Data"]; labelIdx = 1:NumBeamPairs; labelIdx(1:5:end) = []; labels = cell(1, numel(labelIdx)); labels(:) = {""}; for idx = 1:numel(titles) ax = nexttile; histogram(data{idx}); ax.XTickLabel(labelIdx) = labels; title(titles(idx)); end title(t, "Histogram of Optimal Beam Pair Indices"); xlabel(t, "Beam Pair Index"); ylabel(t, "Number of Occurrences"); end function plotResults(results,K) % Plot the results from the comparison of different beam pair selection % methods figure lineWidth = 1.5; markerStyle = ["*","o","s","d","h"]; hold on for idx = 1:numel(results) plot(1:K,results{idx},LineStyle="--",LineWidth=lineWidth,Marker=markerStyle(idx)); end hold off grid on xticks(1:4:K) xlabel("$K$",Interpreter="latex"); title("Performance Comparison of Different Beam Pair Selection Methods"); end
参考
関数
featureInputLayer
(Deep Learning Toolbox) |fullyConnectedLayer
(Deep Learning Toolbox) |reluLayer
(Deep Learning Toolbox) |trainNetwork
(Deep Learning Toolbox) |trainingOptions
(Deep Learning Toolbox)
オブジェクト
phased.ULA
(Phased Array System Toolbox) |phased.URA
(Phased Array System Toolbox) |phased.IsotropicAntennaElement
(Phased Array System Toolbox)
トピック
- MATLAB による深層学習 (Deep Learning Toolbox)
- NR SSB のビーム スイーピング (5G Toolbox)
- CSI-RS を使用した NR ダウンリンク送信側のビーム調整 (5G Toolbox)