メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ビーム選択用のニューラル ネットワーク

R2022b 以降

この例では、ニューラル ネットワークを使用してビーム選択タスクのオーバーヘッドを低減する方法を示します。この例では、通信チャネルの情報ではなく、受信機の位置のみを使用します。すべてのビーム ペアに対して網羅的なビーム探索を行う代わりに、選択した K 組のビーム ペアの中から探索することで、ビーム スイープのオーバーヘッドを低減できます。合計 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 信号、路側カメラ イメージなどの外部情報が、各機械学習アルゴリズムへの入力として使用されます。具体的には、この帯域外情報が与えられると、学習済み機械学習モデルが K 組の適切なビーム ペアのセットを推奨します。すべてのビーム ペアを網羅的に探索する代わりに、シミュレーションは、選択された K 組のビーム ペアのみを探索することにより、ビーム スイープのオーバーヘッドを低減します。

この例では、ニューラル ネットワークを使用し、UE の 3 次元座標と TR 38.901 の定義に準拠したチャネル モデルのみを使用してビーム選択を実行します。この例は次の手順で構成されます。

  1. 学習サンプルのセットを生成します。各サンプルは、UE の位置と真の最適なビーム ペア インデックス (送信と受信の両端ですべてのビーム ペアの網羅的探索を実行することによって検出) で構成されます。

  2. UE の位置を入力として使用し、真の最適なビーム ペア インデックスを正解ラベルとして使用するニューラル ネットワークを設計し、それに学習させます。

  3. テスト サンプルのセットを使用してニューラル ネットワークを実行します。このフェーズでは、ニューラル ネットワークが K 組の適切なビーム ペアを出力します。

  4. 上記の手順で得られた K 組の適切なビーム ペアに対して網羅的探索を実行します。ニューラル ネットワークによって、平均 RSRP が最も高いビーム ペアが最終的な予測ビーム ペアとして選択されます。

この例では、2 種類のメトリクス (平均 RSRP および上位 K 位の精度) を使用し、提案された手法の有効性を評価します。次の図は、主な処理手順を示しています。

NeuralNetworkBeamSelectionExample_01-new.png

学習データとテスト データの生成

事前に記録されたデータでは、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);

Figure contains 2 axes objects. Axes object 1 with title Training Data, xlabel x (m), ylabel y (m) contains 3 objects of type line. One or more of the lines displays its values using only markers Axes object 2 with title Testing Data, xlabel x (m), ylabel y (m) contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Cell boundaries, UEs, Transmitter.

データ処理と可視化

クラスの数が、想定されるビーム ペアの数と一致するように、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);

Figure contains an axes object. The axes object with title Optimal Beam Pair Indices (Training Data), xlabel x (m), ylabel y (m) contains 71 objects of type line. One or more of the lines displays its values using only markers

最適なビーム ペアのヒストグラム

各ビーム ペアが最適となった回数を示すヒストグラムをプロットします。1 度も最適とならないビーム ペアがある場合は、UE 位置の数を増やし、学習データセットとテスト データセットを増やしてみてください。

data = {trainOut, valOut, testOut};
plotBeamPairsHist(data,NumBeamPairs);

Figure contains 3 axes objects. Axes object 1 with title Training Data contains an object of type categoricalhistogram. Axes object 2 with title Validation Data contains an object of type categoricalhistogram. Axes object 3 with title Testing Data contains an object of type categoricalhistogram.

ニューラル ネットワークの設計と学習

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 位の精度のメトリクスは、ニューラル ネットワークベースのビーム選択タスクで広く使用されています。

受信機の位置が与えられると、ニューラル ネットワークは最初に K 組の推奨ビーム ペアを出力します。次に、これらの K 組のビーム ペアに対して網羅的なシーケンシャル探索を実行し、平均 RSRP が最も高いものを最終予測として選択します。最終的に選択されたビーム ペアが真の最適なビーム ペアであった場合、予測は成功します。同様に、ニューラル ネットワークによって推奨される K 組のビーム ペアのうちの 1 つが真の最適なビーム ペアであった場合、成功と見なされます。

この例では、最適なビーム ペアのインデックスを見つけるための他の 3 つの手法を実装し、それらをベンチマークとして使用します。各手法において、K 組の推奨ビーム ペアが生成されます。

  1. KNN - この手法は、テスト サンプルのために、最初に GPS 座標に基づいて K 個の最も近い学習サンプルを収集します。この手法では、これらの K 個の学習サンプルに関連付けられたすべてのビーム ペアを推奨します。各学習サンプルには対応する最適なビーム ペアがあるため、推奨されるビーム ペアの数は多くても K 組になります (一部のビーム ペアは同じである可能性がある)。

  2. 統計的情報 [7] - この手法は、最初に学習セット内での相対頻度に従ってすべてのビーム ペアをランク付けし、次に最初の K 組のビーム ペアを常に選択します。

  3. ランダム [7] - この手法は、テスト サンプルのために、ランダムに K 組のビーム ペアを選択します。

このプロットは、K=30 の場合の精度が既に 90% を超えていることを示しています。これは、ビーム選択タスクに学習済みニューラル ネットワークを使用することの有効性を強調しています。K=70 の場合、統計的情報に基づく手法では 70 組のビーム ペアすべてについて網羅的探索が行われます。したがって、統計的情報に基づく手法では 100% の精度が達成されます。しかし、KNN では、K=70, の場合、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");

Figure contains an axes object. The axes object with title Performance Comparison of Different Beam Pair Selection Methods, xlabel $K$, ylabel Top-$K$ blank Accuracy blank (\%) contains 4 objects of type line. These objects represent Neural Network, KNN, Statistical Info, Random.

異なるアプローチの比較: 平均 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");

Figure contains an axes object. The axes object with title Performance Comparison of Different Beam Pair Selection Methods, xlabel $K$, ylabel Average RSRP contains 5 objects of type line. These objects represent Neural Network, KNN, Statistical Info, Random, Exhaustive Search.

最適な手法、ニューラル ネットワーク、および 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 システムのビーム選択タスクへのニューラル ネットワークの応用について説明しています。K 組の適切なビーム ペアのセットを出力するニューラル ネットワークを設計し、それに学習させることができます。ビーム スイープのオーバーヘッドは、選択された K 組のビーム ペアのみを網羅的に探索することで低減できます。

この例では、TR 38.901 チャネル内の UE 位置の数を指定できます。チャネルがビーム選択に与える影響を確認するには、さまざまなシナリオ、アンテナの仰角スイープ、送信ビームと受信ビームの数を試してください。この例では、さまざまなネットワーク構造とハイパーパラメーターの学習を実験するために使用できる保存済みのデータセットも提供しています。

シミュレーションの結果を見ると、70 組のビーム ペアに対する事前記録された TR 38.901 チャネルの場合、提案されたアルゴリズムは、K=30 の場合に上位 K 位の精度 90% を達成していることがわかります。この結果は、ニューラル ネットワークを使用することで、すべてのビーム ペアの半分未満に対して網羅的探索を実行でき、ビーム スイープのオーバーヘッドを 50% 以上削減できることを示しています。他のシステム パラメーターを変更して実験し、データを再生成してネットワークの有効性を確認した後、ネットワークに再学習させて再テストします。

参考文献

  1. 3GPP TR 38.802, "Study on New Radio access technology physical layer aspects." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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).

  8. 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

参考

関数

オブジェクト

トピック