摘要

可重构智能表面(RIS)凭借其可编程调控无线信号传播的能力,被认为是第六代(6G)移动通信系统的关键技术之一。本文针对RIS辅助的多用户下行MISO系统,研究基站发射波束赋形矩阵与RIS相位偏移矩阵的联合设计问题,目标是在发射功率和单位模约束下最大化系统总速率。提出一种基于深度强化学习(DRL)的求解框架。将问题建模为马尔可夫决策过程(MDP),采用深度确定性策略梯度(DDPG)算法,通过试错交互与环境学习。状态由发射功率、接收功率、上一时刻动作及信道状态构成;动作为待优化的两个矩阵(实虚部分离);奖励为当前总速率,网络输出后通过归一化层严格满足物理约束。
仿真结果表明所提算法有效性

1 研究背景

  • 6G与RI的兴起
    为实现更智能、更绿色的第六代移动通信(6G),业界提出了可重构智能表面(RIS) 技术。RIS由大量低成本、低功耗的可编程超材料单元构成,能够独立调控入射电磁波的相位、幅度、频率甚至轨道角动量,从而“定制”无线传播环境。
  • RIS辅助MIMO系统的优化难题
    在RIS辅助的下行多用户MISO系统中,需要联合优化基站的发射波束赋形矩阵与RIS的相位偏移矩阵,以提升系统总速率、能量效率或覆盖范围。该联合优化问题通常是非凸、高维、带单位模约束的,传统数学方法(如交替优化、半定松弛、流形优化)计算复杂度高、依赖精确信道模型、收敛性能受初始值影响大。
  • 人工智能与深度强化学习的契机
    近年来,深度强化学习在复杂无线通信系统优化中展现出巨大潜力。DRL通过智能体与环境的试错交互,直接学习最优策略,无需显式数学建模,适合处理非凸、高维、动态变化的优化问题。

2 系统与问题建模

在这里插入图片描述

  • 一个配备 M 根天线的基站
  • 一个配备 N 个反射单元的 被动RIS
  • K个单天线用户
    • BS 与用户之间的直射链路被完全阻挡,信号仅通过 RIS 反射传输
      令G表示基站波束成形矩阵 ,Φ表示RIS的相移矩阵, H1表示从基站到RIS的信道矩阵,hk表示从RIS到用户k的信道向量,则第k个用户的接收信号为
      在这里插入图片描述
      信干噪比为
      在这里插入图片描述

优化目标为最大化多用户的和速率,考虑功率约束和被动RIS,问题为

在这里插入图片描述

  • 目标函数是非凸的,RIS单位模约束也是非凸的
  • 大多数已有工作采用交替优化,缺点为交替迭代可能慢、依赖初始值、且不能保证全局最优

3 强化学习方法

1关键设计,马尔可夫决策过程:**

  • 状态:所有的信道状态信息CSI: H1,hk;各个用户的发射波束成形;各个用户的接收功率;上一时刻的的动作;
    1、CSI是问题的核心参数:虽然在固定环境下信道不变,但智能体需要知道信道才能推断何种动作能产生高奖励。
    2、上一时刻的动作:使智能体知道当前解的“位置”,便于做微小调整。没有历史动作,网络只能依赖当前功率间接推断,效率更低。
    3、功率信息:反映当前波束赋形和相位偏移对每个用户的信号与干扰的影响,是计算奖励的基础。
  • 动作:一般为待优化的变量,为波束成形和相移矩阵G和Φ;
  • 奖励:即优化问题的目标函数。

值得注意的是:

  • 1、信道、波束、相移均为复数,通过,而神经网络的输入必须是实数。将复数拆分为实部和虚部,可以保留完整的相位与幅度信息。文中做了拆解:
    -在这里插入图片描述-
    在这里插入图片描述
    在这里插入图片描述
    2、 考虑到功率约束和单位模约束是连续性优化变量,传统的DQN无法是贪心策略,无法输出连续性动作,故采用了DDPG
    3、功率约束有上限,相移约束是0-2pi,正好在actor网络的输出时做上限的限制,这样设计完美等价于原始优化问题的两个约束条件了,不需要在奖励函数里面额外新增违反约束的惩罚了。

3.2 经典的DDPG算法

定义好MDP后,直接把MDP过程丢进经典的DDPG算法中,没啥额外的设计。

在这里插入图片描述
在这里插入图片描述

4 仿真结果

参数 描述 取值
γ 未来奖励的折扣因子(discount rate) 0.99
μc 训练 Critic 网络的学习率(learning rate) 0.001
μa 训练 Actor 网络的学习率 0.001
τc 目标 Critic 网络的更新率(软更新系数) 0.001
τa 目标 Actor 网络的更新率 0.001
λc 训练 Critic 网络学习率的衰减率 0.00001
λa 训练 Actor 网络学习率的衰减率 0.00001
D 经验回放缓冲区(replay buffer)大小 100000
N 总训练 episodes 数 5000
T 每个 episode 的最大时间步数 20000
W 每次采样的小批量(mini-batch)大小 16
U 目标网络与训练网络的同步步数间隔 1

仿真基本围绕不同的系统建模参数与DDPG参数修改,进行验证。

在这里插入图片描述

在这里插入图片描述
关键的环境设计代码:

import numpy as np

class RIS_MISO(object):
    def __init__(self,
                 num_antennas,
                 num_RIS_elements,
                 num_users,
                 channel_est_error=False,
                 AWGN_var=1e-2,
                 channel_noise_var=1e-2):

        self.M = num_antennas
        self.L = num_RIS_elements
        self.K = num_users

        self.channel_est_error = channel_est_error

        assert self.M == self.K

        self.awgn_var = AWGN_var
        self.channel_noise_var = channel_noise_var

        power_size = 2 * self.K

        channel_size = 2 * (self.L * self.M + self.L * self.K)

        self.action_dim = 2 * self.M * self.K + 2 * self.L
        self.state_dim = power_size + channel_size + self.action_dim

        self.H_1 = None
        self.H_2 = None
        self.G = np.eye(self.M, dtype=complex)
        self.Phi = np.eye(self.L, dtype=complex)

        self.state = None
        self.done = None

        self.episode_t = None

    def _compute_H_2_tilde(self):
        return self.H_2.T @ self.Phi @ self.H_1 @ self.G

    def reset(self):
        self.episode_t = 0

        self.H_1 = np.random.normal(0, np.sqrt(0.5), (self.L, self.M)) + 1j * np.random.normal(0, np.sqrt(0.5),
                                                                                               (self.L, self.M))
        self.H_2 = np.random.normal(0, np.sqrt(0.5), (self.L, self.K)) + 1j * np.random.normal(0, np.sqrt(0.5),
                                                                                               (self.L, self.K))

        init_action_G = np.hstack((np.real(self.G.reshape(1, -1)), np.imag(self.G.reshape(1, -1))))
        init_action_Phi = np.hstack(
            (np.real(np.diag(self.Phi)).reshape(1, -1), np.imag(np.diag(self.Phi)).reshape(1, -1)))

        init_action = np.hstack((init_action_G, init_action_Phi))

        Phi_real = init_action[:, -2 * self.L:-self.L]
        Phi_imag = init_action[:, -self.L:]

        self.Phi = np.eye(self.L, dtype=complex) * (Phi_real + 1j * Phi_imag)

        power_t = np.real(np.diag(self.G.conjugate().T @ self.G)).reshape(1, -1) ** 2

        H_2_tilde = self._compute_H_2_tilde()
        power_r = np.linalg.norm(H_2_tilde, axis=0).reshape(1, -1) ** 2

        H_1_real, H_1_imag = np.real(self.H_1).reshape(1, -1), np.imag(self.H_1).reshape(1, -1)
        H_2_real, H_2_imag = np.real(self.H_2).reshape(1, -1), np.imag(self.H_2).reshape(1, -1)

        self.state = np.hstack((init_action, power_t, power_r, H_1_real, H_1_imag, H_2_real, H_2_imag))

        return self.state

    def _compute_reward(self, Phi):
        reward = 0
        opt_reward = 0

        for k in range(self.K):
            h_2_k = self.H_2[:, k].reshape(-1, 1)
            g_k = self.G[:, k].reshape(-1, 1)

            x = np.abs(h_2_k.T @ Phi @ self.H_1 @ g_k) ** 2

            x = x.item()

            G_removed = np.delete(self.G, k, axis=1)

            interference = np.sum(np.abs(h_2_k.T @ Phi @ self.H_1 @ G_removed) ** 2)
            y = interference + (self.K - 1) * self.awgn_var

            rho_k = x / y

            reward += np.log(1 + rho_k) / np.log(2)
            opt_reward += np.log(1 + x / ((self.K - 1) * self.awgn_var)) / np.log(2)

        return reward, opt_reward

    def step(self, action):
        self.episode_t += 1

        action = action.reshape(1, -1)

        G_real = action[:, :self.M ** 2]
        G_imag = action[:, self.M ** 2:2 * self.M ** 2]

        Phi_real = action[:, -2 * self.L:-self.L]
        Phi_imag = action[:, -self.L:]

        self.G = G_real.reshape(self.M, self.K) + 1j * G_imag.reshape(self.M, self.K)

        self.Phi = np.eye(self.L, dtype=complex) * (Phi_real + 1j * Phi_imag)

        power_t = np.real(np.diag(self.G.conjugate().T @ self.G)).reshape(1, -1) ** 2

        H_2_tilde = self._compute_H_2_tilde()

        power_r = np.linalg.norm(H_2_tilde, axis=0).reshape(1, -1) ** 2

        H_1_real, H_1_imag = np.real(self.H_1).reshape(1, -1), np.imag(self.H_1).reshape(1, -1)
        H_2_real, H_2_imag = np.real(self.H_2).reshape(1, -1), np.imag(self.H_2).reshape(1, -1)

        self.state = np.hstack((action, power_t, power_r, H_1_real, H_1_imag, H_2_real, H_2_imag))

        reward, opt_reward = self._compute_reward(self.Phi)

        done = opt_reward == reward

        return self.state, reward, done, None

    def close(self):
        pass

在这里插入图片描述

5 总结

1、首次(2020年)将将DRL用于RIS辅助多用户MISO系统中的联合波束赋形与相位偏移设计。
2、drl的设计比较简单高效,便于进行深度强化学习进行无线通信资源分配的研究入门。
3、后续研究优化方向可从csi无法实时获取,时变信道,网络结构,多智能体协同等等角度优化。

参考文献:
.Huang, R. Mo and C. Yuen, “Reconfigurable Intelligent Surface Assisted Multiuser MISO Systems Exploiting Deep Reinforcement Learning,” in IEEE Journal on Selected Areas in Communications, vol. 38, no. 8, pp. 1839-1850, Aug. 2020, doi: 10.1109/JSAC.2020.3000835.

更多推荐