基于深度强化学习技术优化无线网络中的资源分配(一)DQN部分代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这是一个GitHub上的开源项目,链接:https://github.com/alexis-anzaldo/Deep-Reinforcement-Learning-for-resource-allocation-in-wireless-networks
该项目旨在通过深度强化学习DQL技术优化无线网络中的资源分配,特别关注小型蜂窝和超密集无线蜂窝网络中的功率控制问题,主要目标是提高DRL模型的学习效率和网络吞吐量。
其中的核心技术与方法有:
经验回放机制(experience replay):引入经验回放机制以加速学习过程,显著提升了传统深度Q网络(DQN)的学习速度和性能。
迁移学习(transfer learning):通过迁移学习策略,进一步提高了模型的泛化能力和在不同网络环境下的适应性。
仿真实验:使用python语言,结合Numpy、Pytorch和Matplotlib等库,进行了多种训练策略的仿真实验,验证了所提方法的有效性。

一、readme文件解读

项目目标:

提升DRL模型的学习效率:通过引入经验回放机制,加速模型的训练过程。
提高网络性能:优化资源分配策略,提升网络的整体吞吐量和性能。
验证迁移学习策略的有效性:探索在不同网络环境下,迁移学习对模型泛化能力的提升作用。

实现方法:

经验回放机制:存储智能体的经验,以打破数据相关性,提高训练稳定性。
迁移学习:利用在一个任务中学到的知识,提升在新任务中的学习效率。

实验结果:

学习加速:与传统DQN模型相比,学习速度提高了多达77%。
网络性能提升:网络性能提升了最多24.7%。

二、DQN_agent.py文件解读

1.模块概览

该模块实现了深度Q网络(DQN)智能体的核心功能,主要包括:
1、神经网络结构:用于近似Q值函数。
2、经验回放机制:存储智能体的经验,以打破数据相关性,提高训练稳定性。
3、目标网络:用于稳定训练过程,防止Q值震荡。
4、训练过程:包括动作选择、经验存储、网络更新等步骤。

1、神经网络结构

类定义部分:
class DeepQNetwork(nn.Module):
    def __init__(self, lr, n_actions, name, input_dims, chkpt_dir):
        # lr:学习率,n_actions:动作数,name:模型名,input_dims:输入维度,chkpt_dir:保存路径
        super(DeepQNetwork, self).__init__()  #调用父类
        self.checkpoint_dir = chkpt_dir
        self.checkpoint_file = os.path.join(self.checkpoint_dir, name)
        # 设置模型保存路径,方便后续保存/加载参数
        self.fc1 = nn.Linear(*input_dims, 128)
        self.fc2 = nn.Linear(128, 64)
        self.A = nn.Linear(64, n_actions)
        # 三层全连接网络 输入维度128,128->64,64->动作空间大小 n_actions ,每一层构成一个Q=network的层,最终输出每个动作的Q值估计.
        self.optimizer = optim.Adam(self.parameters(), lr=lr)
        self.device = T.device('cuda:0' if T.cuda.is_available() else 'cpu')
        self.to(self.device)
        # 使用adam优化器,以lr为学习率,判断系统有没有可用的cuda(GPU),如果没有就用cpu,如果有的话就把模型和参数转移到相应设备上.
class DeepQNetwork(nn.Module):

class DeepQNetword 定义一个名为DeepQNetword的类,继承自PyTorch的nn.Model,这是构建所有神经网络模型的基类。

def __init__(self, lr, n_actions, name, input_dims, chkpt_dir):

定义一个__init__初始化函数,接受超参数(学习率lr,动作数n_actions,模型名name,输

super(DeepQNetwork, self).__init__()  

super()调用父类初始化,这是pytorch模型中必须步骤.

 self.checkpoint_dir = chkpt_dir
 self.checkpoint_file = os.path.join(self.checkpoint_dir, name) 

设置模型保存路径,方便后续保存/加载参数.

self.fc1 = nn.Linear(*input_dims, 128)
self.fc2 = nn.Linear(128, 64)
self.A = nn.Linear(64, n_actions)

三层全连接网络,输入维度128,128->64,64->动作空间大小n_actions,每层构成一个q_network的层,最终输出每个动作的Q值估计.

self.optimizer = optim.Adam(self.parameters(), lr=lr)
self.device = T.device('cuda:0' if T.cuda.is_available() else 'cpu')
self.to(self.device)

使用Adam优化器,以lr为学习率,判断系统是否支持cuda(GPU),自动选择设备.
self.to(self.device)将模型参数转移到相应设备上.

前向传播函数forward:
    def forward(self, state):#前向传播函数
        flat1 = F.relu(self.fc1(state)) # 第一层全连接 + relu
        flat2 = F.relu(self.fc2(flat1)) # 第二层全连接 + relu
        # 经过两次relu激活后,输出每个动作对应的Q值
        A = self.A(flat2)  # A is the action set 输出每个动作的Q值
        return A
        # 计算当前状态的Q值并输出

state:状态输入
经两层ReLU激活后,输出每个动作对应的Q值(不加softmax,因为Q-learning使用最大值决策,不需要概率).
return A:返回动作值函数(action values).
也就是说,当你想知道当前状态的Q值的话,就可以套用这个代码块,输出这个状态下的每个动作的Q值(状态-动作价值).

保存模型参数save_checkpoint:
    def save_checkpoint(self):
        print('... saving checkpoint ...')
        T.save(self.state_dict(), self.checkpoint_file)

save_checkpoint是一个模型快照保存函数,它将当前网络的参数写入磁盘,路径由self.checkpoint_file指定,以便之后可以恢复训练或部署模型.

加载模型参数load_checkpoint:
    def load_checkpoint(self):
        print('... loading checkpoint ...')
        #self.load_state_dict(T.load(self.checkpoint_file))
      	self.load_state_dict(T.load(self.checkpoint_file,map_location=T.device('cpu')))

从文件加载模型参数. map_location='cpu’是为了即使模型保存在gpu上,也能在cpu上恢复.

以上为DeepQNetwork代码块的解读,该类的作用是定义一个可训练的Q-Network,用来估计每个状态下每个动作的价值Q(s,a),在DQN强化学习中作为agent的核心组件.
Q-network是用来近似Q值函数的一个函数比近期,这个函数的目标是学习在状态s下执行动作a后,未来能获得的累计回报,记作Q(s,a)
可训练的意思是这个Q-Network是一个具有可调参数(如权重\偏置)的神经网络模型,可以通过反向传播来更新参数,从而逐步拟合真实的Q值函数.
完整代码如下:

class DeepQNetwork(nn.Module):
    def __init__(self, lr, n_actions, name, input_dims, chkpt_dir):
        # lr:学习率,n_actions:动作数,name:模型名,input_dims:输入维度,chkpt_dir:保存路径
        super(DeepQNetwork, self).__init__()  #调用父类
        self.checkpoint_dir = chkpt_dir
        self.checkpoint_file = os.path.join(self.checkpoint_dir, name)
        # 设置模型保存路径,方便后续保存/加载参数
        self.fc1 = nn.Linear(*input_dims, 128)
        self.fc2 = nn.Linear(128, 64)
        self.A = nn.Linear(64, n_actions)
        # 三层全连接网络 输入维度128,128->64,64->动作空间大小 n_actions ,每一层构成一个Q=network的层,最终输出每个动作的Q值估计.
        self.optimizer = optim.Adam(self.parameters(), lr=lr)
        self.device = T.device('cuda:0' if T.cuda.is_available() else 'cpu')
        self.to(self.device)
        # 使用adam优化器,以lr为学习率,判断系统有没有可用的cuda(GPU),如果没有就用cpu,如果有的话就把模型和参数转移到相应设备上.

    def forward(self, state):#前向传播函数
        flat1 = F.relu(self.fc1(state)) # 第一层全连接 + relu
        flat2 = F.relu(self.fc2(flat1)) # 第二层全连接 + relu
        # 经过两次relu激活后,输出每个动作对应的Q值
        A = self.A(flat2)  # A is the action set 输出每个动作的Q值
        return A
        # 计算当前状态的Q值并输出

    def save_checkpoint(self):#模型快照保存函数,将当前网络的参数写入磁盘,路径由self.checkpoint_file指定
        print('... saving checkpoint ...')
        T.save(self.state_dict(), self.checkpoint_file)

    def load_checkpoint(self):# 加载模型参数,从文件加载模型参数,map_location是为了即使模型保存在GPU,也可以在CPU上恢复
        print('... loading checkpoint ...')
        #self.load_state_dict(T.load(self.checkpoint_file))
        self.load_state_dict(T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值