提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、readme文件解读
- 二、DQN_agent.py文件解读
-
- 1.模块概览
-
- 1、神经网络结构
- 2、经验回放缓存(replay buffer)
- 3、Agent类的功能(Agent)
-
- 初始化参数绑定
- set_loadchkpt_dir()与set_loadchkpt_dir()
- initialization_FIFO()
- reset_buffer(self)
- ε-greedy:choose_action(self, observation, random_epsilon)
- DQN Agent 关键方法 choose_action_test()
- DQN Agent关键方法store_transition()
- DQN Agent辅助工具方法replace_target_network
- decay_epsfix()
- epsilon_reset()
- save_models()与load_models()
- DQN的主训练过程 learn()
- agent()小结
- 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