文章目录
前言
论文题目: Power of Deep Learning for Channel Estimation and Signal Detection in OFDM Systems
这篇文章设计了一个全新的智能反射面架构,整个传感器包含两类的传感器元素:(1) 无源的反射单元;(2) 活动的信道传感器 active channel sensors。 作者想利用active channel sensors 获得信道以收集环境描述参数,从而利用深度学习得到环境描述参数映射到反射波束赋形向量。这里根据我自己的认识写一篇学习心得, 希望可以帮助大家更好地理解。
中心思想
本篇论文发表于2019年的arXiv上,整篇论文的模型和框架比较容易理解。文章考虑的场景是当直达径不存在的时候,如何优化波束赋形向量 ϕ \phi ϕ使 K K K个子载波的可达速率和最大化。
最初的智能反射面都是基于假设信道是完美估计的。然而智能反射面的信道估计采用全信道的方法时,并且最优的波束赋形一般需要从码本 P P P中穷搜获得,者将会产生 prohibitive training overhead。
因此作者想找到一种低硬件复杂度的架构以及低训练开销的方法。本文的贡献之一就是提出了一种全新的 energy-efficient智能反射面架构,能通过可以忽略不计的训练开销实习near-optimal 的可达速率。
从图中可以看出,智能反射面包含两个部分:(1)
M
M
M个被动反射单元,每歌采用RF移相器,并且不与基带单元连接 (2)以及
M
‾
≪
M
\overline{M}\ll M
M≪M个active channel sensors,它有两种工作模式,(i) 信道感知模式 (channel sensing mode),作为全RF链和基带处理的接收端 (ii) 反射模式(reflection mode) ,像其他被动元素反射入射信号。
因此引入选取
M
‾
×
M
\overline{M}\times M
M×M维矩阵
G
L
I
S
G_{LIS}
GLIS转化信道,从而sampled channel可以表示为:
h
‾
=
G
L
I
S
h
T
,
k
\overline{h}=G_{LIS}h_{T,k}
h=GLIShT,k
因此信道可以表示为
h
ˉ
k
=
h
ˉ
T
,
k
⊙
h
ˉ
R
,
k
\bar{\mathbf h}_k=\bar{\mathbf h}_{T,k}\odot\bar{\mathbf h}_{R,k}
hˉk=hˉT,k⊙hˉR,k
随后作者分别提出了两种信道估计的方式:一种是基于码本处理的压缩感知的方法,另一种是基于深度学习的方法。后面将对两种方法进行详细介绍。
其中压缩感知的方法是利用经过稀疏折射的采样信道向量(
h
‾
T
,
k
,
h
‾
R
,
k
\overline h_{T,k},\overline h_{R,k}
hT,k,hR,k)来恢复全部的信道
而深度学习则是利用环境信息映射出最优的波束赋形向量。
具体实现
A.COMPRESSIVE SENSING BASED 智能反射面设计
基站到智能反射面的信道可以表示为
h
T
,
k
=
∑
l
=
1
L
β
l
,
k
a
(
θ
l
,
ϕ
l
)
\mathbf{h}_{T,k}=\sum_{l=1}^L \beta_{l,k}\mathbf{a}(\theta_l,\phi_l)
hT,k=l=1∑Lβl,ka(θl,ϕl)
转换成一个更compact 的形式为
h
T
,
k
=
A
β
\mathbf{h}_{T,k}=\mathbf{A}\mathbf{\beta}
hT,k=Aβ.
在毫米波频段,以及以及LOS为主的sub-6 GHz下,信道多为稀疏折射的,路径数
L
L
L
一般特别小。 因此引入阵列响应向量字典
A
D
\mathbf{A}_D
AD来利用这种稀疏性,其中字典的每一列都对应于azimuth或者elevation 方向上的量化后的一个响应向量。那么信道可以重新表示为
$
h
T
,
k
=
A
D
x
β
\mathbf{h}_{T,k}=\mathbf{A}_D \mathbf{x}_{\beta}
hT,k=ADxβ,其中
x
β
\mathbf{x}_{\beta}
xβ的维度与码本字典网格数量相同,
N
D
A
z
N
D
E
I
N_D^{Az}N_D^{EI}
NDAzNDEI稀疏向量with
L
≪
N
D
A
z
N
D
E
I
L\ll N_D^{Az}N_D^{EI}
L≪NDAzNDEI与
β
\beta
β条目数量相同的非零元素个数。
值得注意的是,这些非零的条目对应于信道的azimuth/elevation 达到角度的position,因此我们有noisy sampled channel vectors,
其中
v
k
∼
N
c
(
0
,
σ
n
2
I
)
\mathbf{v}_k \sim \mathcal{N_c}(\mathbf{0},\sigma_n^2\mathbf{I})
vk∼Nc(0,σn2I)表示从active sensotrs 接受到的噪声向量. 为了恢复出原始的信道。建立如下目标函数:
m
i
n
∣
∣
x
β
∣
∣
0
s
.
t
.
∣
∣
h
‾
T
,
k
−
Φ
x
β
∣
∣
2
≤
σ
\rm{min}||\mathbf x_\beta||_0 ~~~~\mathbf{s.t.}~~||\overline{\mathbf h}_{T,k}-\boldsymbol{ \Phi}\mathbf x_\beta||_2\leq \sigma
min∣∣xβ∣∣0 s.t. ∣∣hT,k−Φxβ∣∣2≤σ
随后采用压缩感知的方法,例如OMP(正交匹配追踪)来获得一个近似的
x
β
\mathbf x_\beta
xβ.随后重构出full-channel expression
h
T
,
k
\mathbf h_{T,k}
hT,k
局限性:
1.需要知道array geometry ,难以应用到不知道阵列架构的智能反射面系统
2. 压缩感知需要基于信道的稀疏性,在NLOS折射的场景下非常局限性。
3. 压缩感知方法不能利用之前的观察来提升当前信道的恢复质量。
B. DEEP LEARNING BASED LIS I智能反射面设计
由于智能反射面表面上的大量天线数量导致获取信道knowledge 有以下困难:(1)智能反射面是passive导致过高的训练开销。(2)全数字或混合的智能反射面架构导致不合理的硬件复杂度和能量开销。
因此考虑采用通过少量active elements获得的采样信道 作为 环境描述符号捕捉多径特征,如下图所示:
图2. 该图总结了所提出的深度学习解决方案的关键思想。 采样的信道向量被认为是环境描述符,因为它们以某种分辨率定义了发送器/接收器的位置以及周围的环境。 深度学习模型学习如何将观察到的环境描述符映射到最佳LIS反射向量。
其中环境因素包括折射体(墙体,家具等等),以及传输和接收的locations。
因此基于深度学习智能反射面信道估计的思想即为:采用深度学习学习模型学一种从环境描述符到最优智能反射面相互作用的向量(本文是反射波束赋形向量) 的一种映射关系。也就是说,教会智能反射面如何与已知的环境描述符(抽样信道向量)的无线信号相互作用,其中抽样信道信息可以通过忽略不计的训练开销获得。
实现细节
主要包括两个阶段:
(I)
~
学习阶段:通过给定的数据级训练深度学习框架。
(II) 预测阶段 :利用阶段I中训练的深度学习框架预测反射波束赋形向量。
值得注意的是:本文提出的深度学习模型框架,在DL模型训练后,阶段I到阶段II织金县一次调整,因此当环境改变时,需要重新学习和更新。
下面将详细介绍两个阶段的细节:
PHASE I :深度学习学习阶段
f o r s = 1 t o S d o \mathbf {for} ~s = 1 ~\mathbf{to} ~S ~\mathbf{do} for s=1 to S do
- 采样信道估计: 智能反射面接收到从发射端和接收端发送的两个正交导频从而预测信道
h
‾
^
T
,
k
\widehat{\overline\mathbf h}_{T,k}
h
T,k
h ‾ ^ T , s ( s ) = h ‾ T , s ( s ) + v k \widehat{\overline h}_{T,s}(s)=\overline h_{T,s}(s)+\mathbf v_k h T,s(s)=hT,s(s)+vk. 预测信道可以表示为 h ‾ ^ k ( s ) = h ‾ ^ T , s ( s ) ⊙ h ‾ ^ R , s ( s ) \widehat{\overline \mathbf h}_k(s)=\widehat{\overline\mathbf h}_{T,s}(s) \odot \widehat{\overline\mathbf h}_{R,s}(s) h k(s)=h T,s(s)⊙h R,s(s),以及在想干块 s s s建立串行采样信道向量 h ‾ ^ = ( [ h ‾ ^ 1 ( s ) , . . . , h ‾ ^ K ( s ) ] ] ) \widehat{\overline\mathbf h}=\mathbf([\widehat{\overline\mathbf h}_1(s),...,\widehat{\overline\mathbf h}_K(s)]]) h =([h 1(s),...,h K(s)]])。其中 s s s表示想干块
f o r n = 1 t o ∣ P ∣ d o ~~~~~~~\mathbf {for} ~n = 1 ~\mathbf{to} ~|\mathcal P| ~\mathbf{do} for n=1 to ∣P∣ do
-
穷搜反射波束赋形的码字: 智能反射面通过码本 P \mathbf{\mathcal P} P进行波束训练,每个波束赋形向量 Ψ n . n = 1 , . . . , ∣ P ∣ \Psi_n.n=1,...,|\mathcal P| Ψn.n=1,...,∣P∣,对应于一个可达速率, R n ( s ) R_n^{(s)} Rn(s),因此可以建立可达速向量 r ( s ) = [ R 1 ( s ) , R 2 ( s ) , 。 。 。 , R ∣ P ∣ ( s ) \mathbf r(s)=[R_1(s),R_2(s),。。。,R_{|\mathcal P|}(s) r(s)=[R1(s),R2(s),。。。,R∣P∣(s)
e n d \mathbf {end} end -
向学习数据集中增加一个新的数据点 : D ← ⟨ h ‾ ^ , r ( s ) ⟩ \mathcal D\leftarrow \left \langle \widehat{\overline\mathbf h},\mathbf r (s) \right \rangle D←⟨h ,r(s)⟩
-
数据传输阶段:在波束训练后,选取能使可达速率最大的波束赋形向量 Ψ n ∗ \Psi_{n^*} Ψn∗,其中 n ∗ = a r g m a x n R n ( s ) n^*=\mathrm{arg ~max}_n R_n(s) n∗=arg maxnRn(s),并将其用来在剩余的想干块中进行反射传输数据
e n d \mathbf {end} end
- 深度学习训练: 采用可用数据集
D
\mathcal D
D来训练DL模型
在获得全部 S S S时隙的数据条目后,通过 D \mathcal D D来训练DL模型
学习结果:找到一种映射关系;
输入数据:采样信道向量 h ‾ ^ \widehat{\overline\mathbf h} h ,
输出数据:预测的所有可能的波束赋形向量: r ^ = [ R ^ 1 , R ^ 2 , . . . , R ^ ∣ P ∣ ] \widehat {\mathbf r}=[\widehat {\mathbf R}_1,\widehat {\mathbf R}_2,...,\widehat {\mathbf R}_{|\mathcal P|}] r =[R 1,R 2,...,R ∣P∣]
PHASE II:深度学习预测阶段
- 采样信道估计:与阶段1 类似
- 可达速率预测:将预测的采样信道 h ‾ ^ \widehat{\overline\mathbf h} h ,放到深度学习模型中预测可达速率向量 r ^ \widehat {\mathbf r} r
- 数据传输:将预测出的对应于最高的预测可达速率的反射波束赋形向量
Ψ
n
D
L
\Psi_{n^{DL}}
ΨnDL用于反射传输信号。
值得注意是,可以选择 K b K_b Kb个波束对应 K b K_b Kb个最高预测速率。 然后在这个set中进行优化更新
深度学习模型
-
输入表示:一个由一对传输和接收在 K K K个子载波频段的环境描述(采样信道向量 h ‾ ^ \widehat{\overline\mathbf h} h )的堆栈煤,单向量 的维度为 K M ‾ K\overline M KM
对于输入一般要进行归一化,保证了学习的稳定性和有意义性。而归一化一般采用简单的缩放,即将所有样本初一最大的信道的绝对值:
除了帮助学习过程,这种归一化选择保留了编码在环境描述符中的距离信息。通过归一化,该模型学会了更多地了解周围环境,这是提出由机器学习驱动的智能反射面的基础。
同时对输入信息需要将数据实虚分离,这是通过将每个复数项分为实值和虚值,将每个输入向量的维数加倍来完成的。 此步骤背后的主要原因是DL模型的现代实现,该模型主要使用实值计算。 -
目标表示:有监督模式
这意味着该模型是通过输入数据进行训练的,这些输入数据伴随着它们的目标响应。从根本上说,它们是模型在遇到输入训练数据中的输入时,期望模型近似的期望响应。
而对于有监督学习的训练标签,也是需要归一化: r ( s ) / m a x n [ r ( s ) ] n \mathbf r(s)/\mathrm {max}_n [\mathbf r (s)]_n r(s)/maxn[r(s)]n.标准化每个向量的选择独立地保证模型不会偏向某些强响应。 就我们的智能反射面应用而言,无论接收者与智能反射面有多远,它都给予接收者同等的重要性。 -
神经网络架构:多层感知器(MLP)网络,前馈全连通网络(feedforward Fully Connected network)
MLP 网络能做一个万能函数逼近器,促使采用MLP网络来捕获环境描述符和智能反射面交互作用(反射波束成形)矢量之间的关系。
图3.采用的神经网络体系结构由Q个完全连接的层组成。 每一层后面是非线性ReLU激活层。 深度学习模型学习如何使用每个智能反射面交互向量将观察到的采样信道向量映射到预测的可实现速率。
神经网络架构: 总共包含
Q
Q
Q层,
前
Q
−
1
Q-1
Q−1层在全连接(fully-connected) 和非线性层(non-linearity layers)之间交替进行,
输出层(第
Q
Q
Q层,即最后一层),是一个全连接层
对于
q
t
h
q^{th}
qth层,是一个包含
N
q
N_q
Nq个神经元的堆栈(stack),每一个神经元都能看到所有上一层的输出。
对于非线性层,他们全部采用ReLUs,每个单元在单个输入值上操作,输出另一个单个值。
因此,每层的单元数等于先前完全连接的层的输出数。
- 训练损失函数:模型训练过程旨在最小化测量模型预测质量的损失函数。
L ( θ ) = M S E ( r ‾ , r ^ ) L(\mathbf{\theta})=\mathrm {MSE}(\overline r,\widehat{r}) L(θ)=MSE(r,r )
其中 r ^ \widehat{r} r 为神经元训练的输出,及同归最优的波束赋形的向量 Ψ n D L \Psi_{n^{DL}} ΨnDL预测的最大可达速率
r ‾ \overline r r为期望的输出,即归一化后的可达速率
θ \theta θ为所有神经元网络参数的集。
仿真结果
A. 仿真设置
采用MATLAB R2019a 的深度学习工具箱
**图4.**该图说明了采用的光线跟踪方案,其中RIS将从一个固定的发射器接收的信号反射到接收器。 从候选位置的x-y网格中选择接收器。 此光线跟踪场景是使用Remcom Wireless InSite [41]生成的,可在DeepMIMO数据集上公开获得
B. 基于压缩感知和深度学习的LIS系统可达到的速率
我们考虑在毫米波28GHz频段上的仿真设置,其中LIS采用了64X64天线的UPA。结果表明,所提出的深度学习解决方案使用很少数量的有源天线即可达到最佳上限
该图采用了3.5GHz频段的仿真设置。 假设RIS采用具有16个16天线的UPA,并且每个信道都包含最强的L = 15条路径。在深度学习情况下,只需要4个活动元素,而在压缩感测情况下,只有约18个元素收敛到上限,这体现了这一点。 该图还说明了与6 GHz以下系统中的压缩感测方法相比,深度学习解决方案具有更大的增益,在6 GHz以下系统中,通道的稀疏度小于mmWave系统。 但是,此增益具有收集数据集以训练深度学习模型的成本,而这在压缩感测方法中是不需要的。
C. 深度学习模型需要多少数据训练
结果表明只要8个active天线,当模型在x-y网格中的1万个数据点(53400个点中)上训练后,所提出的深度学习解决方案可以获得近90%的最佳速率。
此外,该图突出显示了与压缩感测解决方案相比,深度学习方法的性能提升。 随着压缩感测解决方案不利用先前的信道估计/ LIS交互观察,并且其性能不依赖于数据集的大小,该增益随数据集大小的增加而增加。
总结
这篇文章将深度学习与智能反射面结合,能给人很多不错的启示
- 精彩地演绎了如何找到一个好的切入点,把深度学习引入到智能反射面中
- 提出了一种新框架,其中存在少量支持两种模式的element,能根据需求切换功能
- 神经网络能用低复杂度以及低消耗来预测全新的智能反射面模型
- 其他结果也差不多,感兴趣的可以自行去看论文。
代码学习
系统模型
- 场景模型参数
采用Deep MIMO dataset的室外光线跟踪场景’O1’,选取’O1’场景下的BS 3 作为智能反射面,以及(行850列90)作为固定的发射端.
接收端:选取’O1’场景下的行1000-行1300的数据,每行包括181个点,总共54300个点。
图6. 该图说明了采用的光线跟踪方案,其中LIS将从一个固定的发射器接收的信号反射到接收器。 从候选位置的x-y网格中选择接收器。 该光线跟踪场景是使用Remcom Wireless InSite 生成的,可在DeepMIMO数据集上公开使用。
智能反射面在毫米波28GHz上采用UPA ,维度为64 X 64 (M= 4096)根天线,在3.5GHz上采用16 X 16 (M=256)根天线
激活元素是在UPA天线上随机选取 - 信道参数
DeepMIMO 数据参数 | 值 |
---|---|
天线间隔 | 0.5 |
系统带宽 | 100MHz |
OFDM载波数量 | 512 |
OFDM采用要素 | 1 |
OFDM限制 | 64 |
路径数制 | 1,2,5,10 |
基站天线数量 | ( M x , M y , M z M_x,M_y,M_z Mx,My,Mz=(1,16,16);(1,32,32);(1,64,64) |
噪声系数 | 5dB |
- 码本生成
考虑一个UPA架构,定义LIS波束赋形码本为 D F T M H ⊗ D F T M V \mathrm {DFT}_{M_H} \otimes\mathrm {DFT}_{M_V} DFTMH⊗DFTMV,其中 D F T M H ∈ C M H × M H \mathrm {DFT}_{M_H}\in\mathbb C^{M_H \times M_H} DFTMH∈CMH×MH,并且其第 m H m_H mH列为 [ 1 , e − j 2 π M H m H , . . . , e − j ( M h − 1 ) 2 π M H m H ] [1,e^{-j\frac{2\pi}{M_H}m_H},...,e^{-j(M_h-1)\frac{2\pi}{M_H}m_H}] [1,e−jMH2πmH,...,e−j(Mh−1)MH2πmH] - 深度学习参数
为了简化神经网络复杂度,只将前 K D L = 64 K_{DL}=64 KDL=64个子载波的归一化采样信道作为输入
DL输入向量的长度为 2 M ˉ K D L 2\bar MK_{DL} 2MˉKDL
DL输出向量为 M = ∣ P ∣ M=|\mathcal {P}| M=∣P∣.
DK架构包括四个全连接层,对于四层的隐藏节点分别为 M , 4 M , 4 M , M M,4M,4M,M M,4M,4M,M,其中 M M M为智能反射面的天线数量
再给定了参考接收坐标的x-y网格点后,DL数据集总共有54300个数据点
数据集分为两个部分,分为训练集85%,和测试集15%
考虑Batch Size(一次训练所选取的样本数)为500,以及50%的丢失率,每个dropout 层都加在每一个ReLU层的后面。 - 压缩感知参数:采用OMP方法,网格大小为 N D A z N D E l N_D^{Az}N_D^{El} NDAzNDEl,其中 N D A z = 2 M H , N D E l = 2 M v N_D^{Az}=2M_H,N_D^{El}=2M_v NDAz=2MH,NDEl=2Mv.
数据集生成
要生成数据集,请按照以下步骤操作:
1.下载“ DeepMIMO_Dataset_Generation_v1.1.zip”文件并展开/解压缩。
2.下载所采用方案的光线跟踪输出文件,然后将其展开/解压缩。 (请注意,这些光线跟踪方案在[此网站(http://deepmimo.net/ray_tracing.html)上进行了详细描述)。
3.将光线跟踪方案的扩展文件夹(例如“ O1”文件夹)添加到路径“ DeepMIMO_Dataset_Generation / RayTracing Scenarios /”。
4.打开文件’DeepMIMO_Dataset_Generation.m’并调整DeepMIMO数据集参数。 (请注意,这些参数在本文的III-B节中有详细说明)。
5.从MATLAB命令窗口中,调用函数
DeepMIMO_dataset = DeepMIMO_Dataset_Generator()
。
给定定义的光线跟踪场景和采用的参数集,此功能将生成DeepMIMO数据集。
6.给定生成的DeepMIMO数据集,可以按本文第III-D节所述访问信道和用户位置。
函数学习
- 码本生成函数
function [F_CB,all_beams]=UPA_codebook_generator(Mx,My,Mz,over_sampling_x,over_sampling_y,over_sampling_z,ant_spacing)
theta_qx=0:pi/codebook_size_x:pi-1e-6 //量化波控角度
F_CBx(:,i)=sqrt(1/Mx)*exp(-1j*kd*antx_index'*cos(theta_qx(i))); //第i个元素的值:
F_CB=kron(F_CB_z,kron(F_CBy,F_CBx)) //码本生成
- 深度学习数据集生成
A. 数据集输入:定义结构体
例如:params.num_ant_x=Mx
,params.num_paths=L;
B. 数据集生成函数DeepMIMO_generator
function [DeepMIMO_dataset,params]=DeepMIMO_generator(params)
file_scenario_params=strcat('./RayTracing Scenarios/',params.scenario,'/',params.scenario,'.params.mat'); //读取文件
load(file_scenario_params) //加载文件
//计算用户数据位置
num_rows=max(min(user_grids(:,2),params.active_user_last)-max(user_grids(:,1),params.active_user_first)+1,0); //行数计算
current_grid=min(find(max(params.active_user_first,user_grids(:,2))==user_grids(:,2)));
user_first=sum((max(min(params.active_user_first,user_grids(:,2))-user_grids(:,1)+1,0)).*user_grids(:,3))-user_grids(current_grid,3)+1;
user_last=user_first+params.num_user-1;
//读取ray tracing 数据
[TX{t}.channel_params]=read_raytracing(filename_DoD,filename_CIR,filename_Loc,params.num_paths,user_first,user_last); //read_raytracing是一个专门用于读取ray-tracing文件的函数
//构建信道矩阵
for t=1:1:params.num_BS
for user=1:1:params.num_user
[DeepMIMO_dataset{TX_count}.user{user}.channel]=construct_DeepMIMO_channel(TX{t}.channel_params(user),params.num_ant_x,params.num_ant_y,params.num_ant_z, ...
BW,params.num_OFDM,params.OFDM_sampling_factor,params.OFDM_limit,params.ant_spacing);//生成用户信道
DeepMIMO_dataset{TX_count}.user{user}.loc=TX{t}.channel_params(user).loc; //生成用户坐标
end
end
//存储文件
if params.saveDataset==1
sfile_DeepMIMO=strcat('./DeepMIMO Dataset/DeepMIMO_dataset.mat');
save(sfile_DeepMIMO,'DeepMIMO_dataset','-v7.3');
end
其中构建DeepMIMO信道的函数为:
function [channel]=construct_DeepMIMO_channel(params,num_ant_x,num_ant_y,num_ant_z,BW,...
ofdm_num_subcarriers,output_subcarrier_downsampling_factor,output_subcarrier_limit,antenna_spacing_wavelength_ratio)
for l=1:1:params.num_paths
gamma_x=1j*kd*sin(params.DoD_theta(l)*ang_conv)*cos(params.DoD_phi(l)*ang_conv);
gamma_y=1j*kd*sin(params.DoD_theta(l)*ang_conv)*sin(params.DoD_phi(l)*ang_conv);
gamma_z=1j*kd*cos(params.DoD_theta(l)*ang_conv);
gamma_comb=Mxx_Ind*gamma_x+Myy_Ind*gamma_y + Mzz_Ind*gamma_z;
array_response=exp(gamma_comb);
delay_normalized=params.ToA(l)/Ts;
channel=channel+array_response*sqrt(params.power(l)/ofdm_num_subcarriers)*exp(1j*params.phase(l)*ang_conv)*exp(-1j*2*pi*(k/ofdm_num_subcarriers)*delay_normalized);
end
大矩阵计算,如果用single类型的数据能节省一半的内存空间,double数据类型占8个字节,single类型占4个字节读取信道的函数为,可以加快运行时间,因此采用single函数读取信道信息,并在读取后释放内存
Ht = single(DeepMIMO_dataset{1}.user{Ut_element}.channel);
clear DeepMIMO_dataset \\释放内存
同样以类似方法获得接收信号后,计算最大等效信道向量
Hr = single(conj(DeepMIMO_dataset{1}.user{u}.channel));
Delta_H = max(max(abs(Ht.*Hr)));
if Delta_H >= Delta_H_max
Delta_H_max = single(Delta_H);
end
其中接收信号,以100行为间隔进入数据集中因此有
Ur_rows_step = 100; // 同一时间处理数据集的100行
Ur_rows_grid=Ur_rows(1):Ur_rows_step:Ur_rows(2); %1000,1100,1200
for pp = 1:1:numel(Ur_rows_grid)-1 % loop for Normalizing H
clear DeepMIMO_dataset //注意每次外循环都要释放内存
params.active_user_first=Ur_rows_grid(pp);
params.active_user_last=Ur_rows_grid(pp+1)-1;
[DeepMIMO_dataset,params]=DeepMIMO_generator(params);
for u=1:params.num_user
...//内循环,获得接收信道以及最大等效信道
end
end
- 随机生成激活元素
不同于直接调用rand函数,本文采用的方式是
Rand_M_bar_all = randperm(M);
Rand_M_bar =unique(Rand_M_bar_all(1:M_bar)); %随机排列后,随机选取M_bar,并进排序
Ht_bar = reshape(Ht(Rand_M_bar,:),M_bar*K_DL,1);
其中unique函数的功能位:C = unique(A) 返回与 A 中相同的数据,但是不包含重复项。C 已排序。
4. 建立深度学习输入
A. 构建采样信道
Hr_bar = reshape(Hr(Rand_M_bar,:),M_bar*K_DL,1);
n1=sqrt(noise_power_bar/2)*(randn(M_bar*K_DL,1)+1j*randn(M_bar*K_DL,1));//发射端噪声
n2=sqrt(noise_power_bar/2)*(randn(M_bar*K_DL,1)+1j*randn(M_bar*K_DL,1));//接收端噪声
H_bar = ((Ht_bar+n1).*(Hr_bar+n2));
DL_input(:,u+uu-1+((pp-1)*params.num_user))= reshape([real(H_bar) imag(H_bar)].',[],1); //将实部虚部分离,输入为加了噪声后的采样信道
B. 性能评估的实际可实现率,即用于测试的数据
H = Htx.*Hrx;
H_BF=H.'*BF_codebook;
SNR_sqrt_var = abs(H_BF);
for uu=1:1:u_step
if sum((Validation_Ind == u+uu-1+((pp-1)*params.num_user))) //与最前设定的训练集序号相同
count=count+1;
DL_output_un(count,:) = single(sum(log2(1+(SNR*((SNR_sqrt_var(uu,:)).^2))),1));
end
end
C. 标签以及 归一化
//采样信道标签
R = single(log2(1+(SNR_sqrt_var/Delta_H_max).^2));//采样信道标签
//采样信道归一化
Delta_Out_max = max(R,[],2);
if ~sum(Delta_Out_max == 0)
Rn=diag(1./Delta_Out_max)*R;
end
DL_output(u+((pp-1)*params.num_user):u+((pp-1)*params.num_user)+u_step-1,:) = 1*Rn;
//输出归一化
DL_input= 1*(DL_input/Delta_H_bar_max);
- 基于深度学习波束赋形
A. 训练以及测试数据集
DL_output_reshaped = reshape(DL_output.',1,1,size(DL_output,2),size(DL_output,1)); %
DL_output_reshaped_un = reshape(DL_output_un.',1,1,size(DL_output_un,2),size(DL_output_un,1));
DL_input_reshaped= reshape(DL_input,size(DL_input,1),1,1,size(DL_input,2));
for dd=1:1:numel(Training_Size) //Training_Size=[2 1e4*(1:.4:3)];
Training_Ind = RandP_all(1:Training_Size(dd));
XTrain = single(DL_input_reshaped(:,1,1,Training_Ind));
YTrain = single(DL_output_reshaped(1,1,:,Training_Ind));
XValidation = single(DL_input_reshaped(:,1,1,Validation_Ind));
YValidation = single(DL_output_reshaped(1,1,:,Validation_Ind));
YValidation_un = single(DL_output_reshaped_un);
B. 深度学习模型定义
深度学习框架layers
layers = [
imageInputLayer([size(XTrain,1),1,1],'Name','input') //建立输出层
fullyConnectedLayer(size(YTrain,3),'Name','Fully1')//建立全连接1层
reluLayer('Name','relu1')//建立ReLU1层
dropoutLayer(0.5,'Name','dropout1')//建立dropout layer1层。目的是为了防止CNN 过拟合
fullyConnectedLayer(4*size(YTrain,3),'Name','Fully2')//虚拟节点为4层
reluLayer('Name','relu2')
dropoutLayer(0.5,'Name','dropout2')
fullyConnectedLayer(4*size(YTrain,3),'Name','Fully3')
reluLayer('Name','relu3')
dropoutLayer(0.5,'Name','dropout3')
fullyConnectedLayer(size(YTrain,3),'Name','Fully4')
regressionLayer('Name','outReg')];//回归层计算回归问题。定义损失函数, mean-squared-error
深度学习选项options
options = trainingOptions('sgdm', ...
'MiniBatchSize',miniBatchSize, ...
'MaxEpochs',20, ... //用于训练的最大轮数。 默认值为30。
'InitialLearnRate',1e-1, ...//用于训练的初始学习率。如果学习率太低,则训练将花费很长时间,但是如果学习率太高,则训练可能会陷入次优的结果。求解器’sgdm’的默认值为0.01,求解器’adam’和’rmsprop’的默认值为0.001。
'LearnRateSchedule','piecewise', ...//该选项允许用户指定一种在训练期间降低整体学习率的方法。“piecewise”-每当经过一定数量的时期时,学习率就会乘以一个系数。乘法因子由参“ LearnRateDropFactor”控制,乘法之间的纪元数由“ LearnRateDropPeriod”控制。
'LearnRateDropFactor',0.5, ...//仅当“ LearnRateSchedule”设置为“ piecewise”时,此参数才适用。这是一个乘数因子,每次经过一定数量的纪元时,它就会应用于学习率。默认值为0.1。
'LearnRateDropPeriod',3, ... //仅当“ LearnRateSchedule”设置为“ piecewise”时,此参数才适用。每次经过此时期数时,学习率下降因子将应用于全局学习率。默认值为10。
'L2Regularization',1e-4,... //L2正则化因子。应当注意,层中的每个参数集都可以为此L2正则化器指定一个乘数,默认值为0.0001。。
'Shuffle','every-epoch', ...//这个控制训练数据是否被重排。选项包括:在每个训练时期之前,将对数据进行重新排序。
'ValidationData',{XValidation,YValidation}, //训练期间用于验证的数据。可以是:单元格数组{X,Y},其中X是包含输入数据的数字数组,Y是响应数组
'ValidationFrequency',validationFrequency, ...//验证指标评估之间的迭代次数。
'Plots','none', ...// 'training-progress'
'Verbose',0, ... // 1,仅在“Verbose”设置为true时才有效
'ExecutionEnvironment', 'cpu', ...
'VerboseFrequency',VerboseFrequency); //打印到命令窗口之间的迭代次数。
- 深度学习训练和预测
[~,Indmax_OPT]= max(YValidation,[],3);
Indmax_OPT = squeeze(Indmax_OPT); //可达率的上限
MaxR_OPT = single(zeros(numel(Indmax_OPT),1));
//trainedNet = trainNetwork(X,Y,layers,options)
//用途:可用于回归或分类问题,训练网络中最常用的使用方式。
//参数说明:X包含预测变量,Y包含分类标签或数字响应。
[trainedNet,traininfo] =trainNetwork(XTrain,YTrain,layers,options);
YPredicted = predict(trainedNet,XValidation);
- 可达速率
[~,Indmax_DL] = maxk(YPredicted,kbeams,2); //= maxk(A,k) 返回 A 的 k 个最大元素。
MaxR_DL = single(zeros(size(Indmax_DL,1),1)); %True achievable rates
for b=1:size(Indmax_DL,1)
MaxR_DL(b) = max(squeeze(YValidation_un(1,1,Indmax_DL(b,:),b)));
MaxR_OPT(b) = squeeze(YValidation_un(1,1,Indmax_OPT(b),b));
//B = squeeze(A) 返回一个数组,其元素与输入数组 A 相同,但删除了长度为 1 的维度。例如,如果 A 是 3×1×2 数组,则 squeeze(A) 返回 3×2 矩阵。
end
Rate_OPT(dd) = mean(MaxR_OPT);
Rate_DL(dd) = mean(MaxR_DL);
LastValidationRMSE(dd) = traininfo.ValidationRMSE(end);
clear trainedNet traininfo YPredicted
clear layers options Rate_DL_Temp MaxR_DL_Temp Highest_Rate