IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 强化学习算法实现小结 -> 正文阅读

[人工智能]强化学习算法实现小结

Q learning

主要就是选择动作和更新Q表两个函数。

选择动作就是选Q表中当前状态Q值最大的动作,用np.argmax就能返回值最大元素的下标。

Q表使用defaultdict字典类型建立,一级索引state得到该状态下所有动作的Q值,二级索引action得到该状态该动作的Q值。

from collections import defaultdict
self.Q_table = defaultdict(lambda: np.zeros(self.action_dim)) 

Q表的更新:Q(t) <- Q(t) + lr * (reward + gamma * Q(t+1) - Q(t))

Q_target = reward + self.gamma * np.max(self.Q_table[str(next_state)]) 
self.Q_table[str(state)][action] += self.lr * (Q_target - Q_predict)

DQN

就是用一个Q网络代替Q learning中的Q表,并加上target network和replay buffer。

target network隔一阵用load_state_dict从行动网络复制最新的参数更新一次,计算q_target时记得用target network算。

replay buffer就是个指定capacity的list,并用一个position标记下次要替换记录的下标。主要就sample和push两个功能,sample用random.sample(self.buffer, batch_size)采集一个batch用于计算梯度更新网络,push在训练时往buffer中加入新的[state, action, reward, next_state,done]。


SARSA

和Q learning只有Q表的更新方式不同。SARSA是on-policy,用于更新Q表的下一状态动作是真实采取的动作;Q learning是off-policy,用于更新的下一状态动作价值是所有动作价值取max。

Q_target = reward + self.gamma * self.Q[next_state][next_action] 
self.Q[state][action] += self.lr * (Q_target - Q_predict) 

Double DQN

只是稍加修改DQN网络的更新公式,一个网络选出使Q值最大的动作,另一个网络计算这个动作的Q值,从而防止Q值的过高估计。

# 计算loss
next_q_values = self.policy_net(next_state_batch)# 用于选取最大Q值的动作       
next_target_values = self.target_net(next_state_batch) # 用于计算policy_net选出的动作的Q值
next_target_q_value = next_target_values.gather(1, torch.max(next_q_values, 1) [1].unsqueeze(1)).squeeze(1) # 得到Q’(s_t|a=argmax Q(s_t‘, a))
q_target = reward_batch + self.gamma * next_target_q_value * (1-done_batch)
self.loss = nn.MSELoss()(q_value, q_target.unsqueeze(1))  # 计算均方误差

Policy Gradient

1. 回报归一化

easy-rl版本的实现里在计算完Gt后进行了归一化,这是因为我们不关心绝对值只关心相对值,一般来说对数据进行归一化处理后训练效果会更好,但不是必须的。

2. 没有epsilon探索

因为策略网络输出的是动作的概率分布,选取动作的时候是依概率采样,本身就包含了随机性,不需要再用epsilon去随机探索了。

3. 迭代计算Gt时,遇到奖励为0的步则Gt+1置为0

有的实现里没有这一步,但加上这个条件判断之后训练效果明显改善。算是算法实现的改进技巧,非必须。

4. 为什么这里策略网络最后一层设置的输出维度是1?self.fc3 = nn.Linear(hidden_dim, 1)

正常输出维度应该是动作数目,且在forward最后用softmax转成概率分布。这里之所以把输出维度设置为1且最后没用softmax而是用sigmoid,是因为cartpole里只有两个动作向左和向右,所以直接输出了向左的概率,之后用伯努利分布采样。easy-rl版本的代码不是通用的,要具体问题具体分析。自己平时看资料多思考,尽信书不如无书。

def choose_action(self,state):
    state = torch.from_numpy(state).float()
    state = Variable(state)
    probs = self.policy_net(state) # 因为CartPole只有向左和向右两个动作,所以这里的策略网络设置成了输出一个实数表示向左的概率。
    m = Bernoulli(probs) # 伯努利分布(n次伯努利实验成功次数服从的分布。伯努利实验只有成功和失败两个结果。),probs表示成功的概率
    # 如果有两个以上动作,那么就按照常规的写法,也即策略网络输出各个动作的概率,选择动作函数里用其生成一个Categorical类别分布,然后一样从中采样。
    action = m.sample()
    action = action.data.numpy().astype(int)[0] # 转为标量
    return action

知识巩固:

torch.nn.Linear(in_features, out_features, bias=True)

  • 作用:对输入数据做一个线性变化
  • in_features:每个输入样本的大小。也就是输入的[batch_size, size]中的size
  • out_features:每个输出样本的大小。也就是输出[batch_size,size]中的size,batch_size与输入中的一致

5. 为什么这版loss.backward()和optimizer.step()不是同步的?

通常是三步走:

optimizer.zero_grad() # 梯度清零 weights.grad=None
loss.backward()# 更新 weights.grad 的值
for param in self.policy_net.parameters(): ?# 也可以加上clip防止梯度爆炸
? ? param.grad.data.clamp_(-1, 1)
optimizer.step() # 根据新的 weights.grad 值更新迭代 weights 值

用optimizer.zero_grad()梯度清零是因为loss.backward()不会自动清除旧的梯度值而是会增加到原来的梯度上。easy-rl这版代码里一个episode调用一次update函数,update里对每一步都用loss.backward()计算loss,最后用总的loss来optimizer.step()更新一次模型。总之根据需要来,应该都可以。


A2C

actor网络:目标和PG里的策略网络一样,最大化期望回报。由PG的回合更新引入TD改为了单步或若干步更新,用Q值的估计代替PG里的Gt,于是引入critic网络估计Q值。为了使Q和V只需要估计一种,所以统一估计V值。最后目标就是最大化动作对数概率*TD_error。

critic网络:目标就是最小化TD_error,从而让价值估计更接近真实值。

1. rlcn的AC实现里用了replay buffer

DDPG也属于AC,它引入了DQN的replay buffer。

A3C样本间低相关,不需要replay buffer。

ACER 是 actor-critic with experience replay 的缩写,是一种带经验回放的 off-policy 的actor-critic模型,提高了样本效率,降低了数据相关性。

所以AC有很多种算法,有的有经验复现有的没有,都可以。

2. easyrl和rlcn都是把两个网络合在一个类里,总loss的计算略有不同:

actor_loss = -(log_probs * advantage.detach()).mean()
critic_loss = advantage.pow(2).mean()
loss = actor_loss + 0.5 * critic_loss - 0.001 * entropy

其中entropy是每一步动作分布dist.entropy().mean()的和。advantage就是td_error。

在loss中加入entropy是AC实现的一个小tip:用策略网路输出分布的熵作为正则化,大的熵有利于探索。所以loss里有 -0.001 * entropy 这一项。

loss = torch.stack(policy_loss).sum() + torch.stack(value_loss).sum()

也可以直接把两个网络的loss相加作为self.model总的loss。


DDPG

DDPG是对DQN的扩展,用一个actor去弥补DQN不能处理连续控制性问题的缺点,所以DDPG也是Actor-Critic架构。


PPO

1. 为什么PPO也有actor和critic两个网络

PPO也是AC架构。actor是采用了重要性采样的策略网络(从而采样到的数据可以多次使用),critic估计V值(从而能用TD单步更新)。


代码参考

easy-rl/codes at master · datawhalechina/easy-rl · GitHub

GitHub - jidiai/ai_lib

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:16:52  更:2021-09-13 09:19:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 15:42:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码