Posts with tag hrl

11-trpo算法

2024-11-11
hrljulyfunnotes技术学习

对 AC 做了非常多优化【策略目标】修改成新策略 $pi_(theta^prime)$ 下的形式并做近似近似过程要求 $theta^prime$ 和 $theta$ 不能差太多,故 KL 散度约束到 $delta$ 之内.【近似求解】对目标函数 1 阶近似,带 $g$,KL 约束 2 阶近似,带海森矩阵 $H$.可直接用 KKT 导出问题的解 $theta_(k + 1)$.【共轭梯度】直接假设每一步 KL 散度都更新到 $delta$,可简化 KKT 解直接用共轭梯度法解算 $H x = g$【线性搜索】由于多处近似,解可能不满足 KL 散度约束取 $(0, 1)$ 之间的超参数 $alpha$,求最小非负整数 $i$ 使得 $alpha^i$ 倍变化量满足 KL 散度限制.【广义优势估计】上面还没估计优势函数 [?]设时序差分误差 $delta_t = r_t + gamma V(s_(t + 1)) - V(s_t)$令 $A_t^((k)) = sum_(l = 0)^(k - 1) gamma^l delta_(t + l)$对 $A$ 进行指数加权平均.代码实践如果动作时连续的,策略网络可输出动作高斯分布的均值和标准差,形同: mu, std = self.actor(states) old_action_dists = torch.distributions.Normal(mu.detach(), std.detach()) old_log_probs = old_action_dists.log_prob(actions) critic_loss = torch.mean( F.mse_loss(self.critic(states), td_target.detach())) self.critic_optimizer.zero_grad() critic_loss.backward(

10-actor-critic算法

2024-11-11
hrljulyfunnotes技术学习

see: https://hrl.boyuai.com/chapter/2/actor-critic%E7%AE%97%E6%B3%95上一章用 $G_t$ 代替 $Q^pi (s, a)$,现在用时序差分残差公式代替之.因为 $Q = r + gamma V$.所以训练一个 $V$ 网路就行原文已经写的很像回忆提纲了训练一个价值网络:Input : 可微状态 $s$Output : $V(s)$Loss: $$1 / 2 (r + gamma V_omega (s_(t + 1)) - V_omega (s_t))^2$$其中 $r + gamma V_omega (s_(t + 1))$ 不参与梯度计算. 代码中使用 detach() 直接实现,不用双网络.和 DQN 一样训练数据来源于采样池.训练过程和 Actor 的关系?Actor 产生了采样池,Actor 变强后采样分布会变化采样数据为 $(s_i, a_i, r_i, s_i^prime)$.注意采样的 $a$ 并不影响 $V$ 梯度下降,乱采样也能训练出正确的 $V$ 网络先来看 Actor + Critic 包装器的 updateclass ActorCritic: # self.critic = ValueNet(state_dim, hidden_dim).to(device) # 价值网络 ... def update(self, transition_dict): states = torch.tensor(transition_dict['states'], dtype=torch.float).to(self.device) actions = torch.tensor(transition_dict['actions']).view(-1, 1).to( self.device) rewards = torch.tensor(transition_dict['rewards'], dtype=torch.float).view(-1, 1).to(self.device) next_states = torch.tensor(transition_dict['next_states'], dtype=torch.float).to(self.device) dones = torch.tensor(transition_dict['dones'], dtype=torch.float).view(-1, 1).to(self.device) # 时序差分目标 td_target = rewards + self.gamma * self.critic(next_states) * (1 - dones) td_delta = td_target - self.critic(states) # 时序差分误差 log_probs = torch.log(self.actor(states).gather(1, actions)) actor_loss = torch.mean(-log_probs * td_delta.detach()) # 均方误差损失函数,这里直接 detach() 来实现类似 Double DQN 的效果... (不演了是吧) critic_loss = torch.mean( F.mse_loss(self.critic(states), td_target.detach())) self.actor_optimizer.zero_grad() self.critic_optimizer.zero_grad() actor_loss.backward() # 计算策略网络的梯度 critic_loss.backward() # 计算价值网络的梯度 self.actor_optimizer.step() # 更新策略网络的参数 self.critic_optimizer.step() # 更新价值网络的参数 class PolicyNet(torch.nn.Module): def __init__(self, state_dim, hidden_dim, action_dim): super(PolicyNet, self).__init__() self.fc1 = torch.nn.Linear(state_dim, hidden_dim) self.fc2 = torch.nn.Linear(hidden_dim, action_dim) def forward(self, x): x = F.relu(self.fc1(x)) return F.softmax(self.fc2(x), dim=1) class ValueNet(torch.nn.Module): def __init__(self, state_dim, hidden_dim): super(ValueNet, self).__init__() self.fc1 = torch.nn.Linear(state_dim, hidden_dim) self.fc2 = torch.nn.Linear(hidden_dim, 1) def forward(self, x): x = F.relu(self.fc1(x)) return self.fc2(x)效果:抖动比基于蒙特卡洛的 REINFORCE 收敛更快,且非常稳定

其他一样.

2024-11-11
hrljulyfunnotes技术学习

之前的算法基于价值,没有显式策略(策略就是选最大动作价值的动作)。下述 REINFORCE 方法基于策略.设 $pi_theta$ 是策略,处处可微,要学习的参数为 $theta$目标是最大化 : $$J(theta) = EE_(s_0) [V^(pi_theta) (s_0) ]$$设状态访问分布为 $nu^pi$(无穷步状态概率加权向量,见第三章),有:提示: $(log f)^prime = f^prime / f$image.png另一证明:https://paddlepedia.readthedocs.io/en/latest/tutorials/reinforcement_learning/policy_gradient.html此图第一行少写了一个 $sum$这里 $T(s, a)$ 是执行 $a$ 后转移到 $s$ 的概率.image.png蒙特卡洛 REINFORCE考虑用蒙特卡洛方法估计,对有限步的环境来说,依据上式有:其中 $T$ 为最大步数. 小括号内就是 $G_t$,下面第二张图中以 $psi_t$ 表示.image.png训练步骤image.png网络结构:Input: 可微状态Output: 离散动作的概率多项分布损失函数: 上述梯度更新公式(去掉微分符号)class PolicyNet(torch.nn.Module): def __init__(self, state_dim, hidden_dim, action_dim): super(PolicyNet, self).__init__() self.fc1 = torch.nn.Linear(state_dim, hidden_dim) self.fc2 = torch.nn.Linear(hidden_dim, action_dim) def forward(self, x): x = F.relu(self.fc1(x)) return F.softmax(self.fc2(x), dim=1) class REINFORCE: def __init__(self, state_dim, hidden_dim, action_dim, learning_rate, gamma, device): self.policy_net = PolicyNet(state_dim, hidden_dim, action_dim).to(device) ... def take_action(self, state): # 根据动作概率分布随机采样 state = torch.tensor([state], dtype=torch.float).to(self.device) probs = self.policy_net(state) action_dist = torch.distributions.Categorical(probs) action = action_dist.sample() # 随机选一个 return action.item() def update(self, transition_dict): reward_list = transition_dict['rewards'] state_list = transition_dict['states'] action_list = transition_dict['actions'] G = 0 self.optimizer.zero_grad() for i in reversed(range(len(reward_list))): # 从最后一步算起 reward = reward_list[i] state = torch.tensor([state_list[i]], dtype=torch.float).to(self.device) action = torch.tensor([action_list[i]]).view(-1, 1).to(self.device) log_prob = torch.log(self.policy_net(state).gather(1, action)) G = self.gamma * G + reward loss = -log_prob * G # 每一步的损失函数 loss.backward() # 反向传播计算梯度 self.optimizer.step() # 梯度下降 # 其他一样.考虑最优情况的正确性:若 $G_1 = 200, G_2 = -200$,则会学到使得 $p_1$ 尽可能大(取 -log 后尽可能小,损失尽可能小),$p_2$ 尽可能小(取 -log 后极大,损失极小)softmax 应该能防止数值爆炸.优化问题,神经网络和强化学习..

8-DQN-改进算法

2024-11-09
hrljulyfunnotes技术学习

Double DQN上一章的 DQN 在计算 $y^"real"$ 时,使用的是:image.pngimage.png如 $w^-$ 有正向误差估计,则 $Q(s, a)$ 会被过高估计,而拿 $Q(s, a)$ 更新上一步 $Q$ 时,误差会逐渐累积。如何解决?将优化目标改为下式,也就是选取下一步最优动作时使用训练网络而不是目标网络. 这样可以缓解此问题.image.pngDouble DQN 代码区别 if self.dqn_type == 'DoubleDQN': # DQN与Double DQN的区别 max_action = self.q_net(next_states).max(1)[1].view(-1, 1) max_next_q_values = self.target_q_net(next_states).gather(1, max_action) else: # DQN的情况 max_next_q_values = self.target_q_net(next_states).max(1)[0].view(-1, 1)结果可视化打印了两个图.打印每个 episode 的回报移动平均对每个时间步,记录该 episode (模拟采样周期)内的移动最大值,这是用于观察是否有 $Q$ 超限的情况 while not done: # 每个模拟时间步 action = agent.take_action(state) max_q_value = agent.max_q_value( state) * 0.005 + max_q_value * 0.995 # 平滑处理 max_q_value_list.append(max_q_value) # 保存每个状态的最大Q值Dueling DQNimage.png这里 $eta, alpha, beta$ 都是网络参数的意思。$V$ 为状态价值函数,$A$ 为优势函数,数学上定义为 $A(s, a) = Q(s, a) - V(s)$.image.png注意训练数据依然是 $(s, a, r, s^prime)$ 的批量采样.好处:某些情况下动作对价值影响不大。如果分开建模,训练这些情况时注意力会集中在 $V$ 网络上.image.png不唯一性问题image.png平均化操作更稳定,训练时采用之.代码基本上与 DQN 的区别只有下述代码:class VAnet(torch.nn.Module): ''' 只有一层隐藏层的A网络和V网络 ''' def __init__(self, state_dim, hidden_dim, action_dim): super(VAnet, self).__init__() self.fc1 = torch.nn.Linear(state_dim, hidden_dim) # 共享网络部分 self.fc_A = torch.nn.Linear(hidden_dim, action_dim) self.fc_V = torch.nn.Linear(hidden_dim, 1) def forward(self, x): A = self.fc_A(F.relu(self.fc1(x))) V = self.fc_V(F.relu(self.fc1(x))) Q = V + A - A.mean(1).view(-1, 1) # Q值由V值和A值计算得到 return Q效果 : 学习更加稳定(回报曲线),得到回报的最大值也更优秀.DQN 对 Q 值过高估计的定量分析利用简单的累积分布函数知识(初中数学知识),如果 Q-net 的 $m$ 个动作的预测值会随机偏大偏小,则预测值的最大值的期望会比真实值最大值大.当神经网络的预测方差与动作优势值达到同量级时,会非常严重

常规 Q-learning

2024-11-08
hrljulyfunnotes技术学习

DQN 作用:对于连续的状态和离散的动作,可通过采样方式更新神经网络Input: 可微状态(并不含动作)Output: 离散动作的动作价值这就是学了个 $Q$,有了 $Q$ 策略就是选最大价值动作。本章训练环境为小车上平面倒立摆的控制,奖励函数: 坚持 1 帧获得奖励 1,倾斜度数或者偏离程度过大或坚持 200 帧则结束。image.png损失设计由于 Q-learning 是这样的:image.png所以对于一个批量的采样 ${(s_i, a_i, r_i, s_i^prime)}$,可以这样设计损失函数:注意下面损失函数里有 $Q$ 本身,无法方便求损失,所以后面设计了双网络(训练网络和目标网络)。这里 $w$ 是 MLP 权重。image.png损失函数为 $0$ 时,再训练时满足: 动作奖励函数 = 该动作奖励 + $gamma times$ (状态随机采样,动作最优)后续状态下最优动作奖励函数训练细节: 经验回放 experience replay将历次采样放入缓冲区,取缓冲区的若干次数据(而不是最近一次)作为一个小批量来优化 $Q_w$整个训练过程中,replay_buffer 不重置,每次训练拿出的数据大小为 batch_size目标网络 + 训练网络其实就是复制两份网络,训练网络每次批量优化时都会更新(目标网络暂不更新),其中损失函数使用目标网络计算,每隔 $C$ 步将目标网络同步到训练网络。注意神经网络形式化的损失函数总是 $sum (F(x_i) - y_i^"real")^2$,在下方原文中可以见到。$w^-$ : 目标网络的权重image.png# 常规 Q-learning ... action = agent.take_action(state) next_state, reward, done = env.step(action) agent.update(state, action, reward, next_state) state = next_state class ...: def update(self, s0, a0, r, s1): td_error = r + self.gamma * self.Q_table[s1].max( ) - self.Q_table[s0, a0] self.Q_table[s0, a0] += self.alpha * td_error# DQN class Qnet(torch.nn.Module): def __init__(self, state_dim, hidden_dim, action_dim): super(Qnet, self).__init__() self.fc1 = torch.nn.Linear(state_dim, hidden_dim) self.fc2 = torch.nn.Linear(hidden_dim, action_dim) def forward(self, x): x = F.relu(self.fc1(x)) return self.fc2(x) class ...: def update(self, transition_dict): states = torch.tensor(transition_dict['states'], dtype=torch.float).to(self.device) actions = torch.tensor(transition_dict['actions']).view(-1, 1).to( self.device) rewards = torch.tensor(transition_dict['rewards'], dtype=torch.float).view(-1, 1).to(self.device) next_states = torch.tensor(transition_dict['next_states'], dtype=torch.float).to(self.device) # dones[i]: 第 i 个状态是否为终止状态 dones = torch.tensor(transition_dict['dones'], dtype=torch.float).view(-1, 1).to(self.device) # q_values: 训练网络给出的 Q值, 作为 y^hat,上面存了梯度 # `gather`函数用于从输出中选择特定的Q值。`1`表示在第二个维度(动作维度)进行选择,`actions`是动作的索引 # [q] gather 也能存梯度么? q_values = self.q_net(states).gather(1, actions) # 下个状态的最大Q值,目标网络给出,这是 y^real 的一部分 max_next_q_values = self.target_q_net(next_states).max(1)[0].view(-1, 1) q_targets = rewards + self.gamma * max_next_q_values * (1 - dones) # 终止状态不考虑下步奖励 dqn_loss = torch.mean(F.mse_loss(q_values, q_targets)) # 均方误差损失函数 self.optimizer.zero_grad() # PyTorch中默认梯度会累积,这里需要显式将梯度置为0 dqn_loss.backward() # 反向传播更新参数 self.optimizer.step() if self.count % self.target_update == 0: self.target_q_net.load_state_dict( self.q_net.state_dict()) # 更新目标网络 self.count += 1 action = agent.take_action(state) next_state, reward, done, _ = env.step(action) replay_buffer.add(state, action, reward, next_state, done) state = next_state # 当buffer数据的数量超过一定值后,才进行Q网络训练 if replay_buffer.size() > minimal_size: b_s, b_a, b_r, b_ns, b_d = replay_buffer.sample(batch_size) transition_dict = { 'states': b_s, 'actions': b_a, 'next_states': b_ns, 'rewards': b_r, 'dones': b_d } agent.update(transition_dict)最后输出image.png这里输出的每一个值是单个 episode 重置环境后的若干步采样的平均 return。相当于把机器人放到现实环境里去跑了几秒钟。done

训练部分

2024-11-08
hrljulyfunnotes技术学习

时序差分算法用于评估价值函数,$alpha$ 为常数,和蒙特卡洛一样是基于采样。优点在于,每采样一步就可以更新状态估计。同样会收敛。下式中 $t$ 为模拟的时间步。$$V(s_t) <- V(s_t) + alpha [r_t + gamma V(s_(t + 1)) - V(s_t)]$$Sarsa用于求解最优策略。时序差分能估计 $V$,但没法直接拿到策略.然而时序差分算法也可以用来估计动作价值函数 $Q(s_t, a_t)$ :以 $1 - epsilon$ 概率采样动作价值最大的动作,剩下概率随机选一个每次采样步更新:$Q(s, a) <- Q(s, a) + alpha [r + gamma Q(s^prime, a^prime) - Q(s, a)]$字母定义见下代码最后通过 Q table 的最大值获取策略每个时间步(已知 s 和动作 a): 得到环境反馈 r, s' e-greedy 选一个 a' Q(s, a) <- Q(s, a) + alpha[r + gamma Q(s', a') - Q(s, a)] s, a = s', a'# 训练部分 for i_episode in num_episodes: state = env.reset() action = agent.take_action(state) done = False while not done: next_state, reward, done = env.step(action) next_action = agent.take_action(next_state) agent.update(state, action, reward, next_state, next_action) state = next_state action = next_action # 原文 Q-learning 处的写法似乎更好 ... state = env.reset() done = False while not done: action = agent.take_action(state) next_state, reward, done = env.step(action) agent.update(state, action, reward, next_state) state = next_state class CliffWalkingEnv: def step(self, action): ... return next_state, reward, done class Sarsa: def update(self, s0, a0, r, s1, a1): td_error = r + self.gamma * self.Q_table[s1, a1] - self.Q_table[s0, a0] self.Q_table[s0, a0] += self.alpha * td_error def take_action(self, state): if np.random.random() < self.epsilon: action = np.random.randint(self.n_action) else: action = np.argmax(self.Q_table[state]) return action效果:采取比较原理悬崖的方式抵达目标。n 步 Sarsa采样到至少 $n$ 步后,对最近 $n$ 步实施类似蒙特卡洛的反向更新。class Sarsa: def update(self, s0, a0, r, s1, a1, done): self.state_list.append(s0) self.action_list.append(a0) self.reward_list.append(r) if len(self.state_list) == self.n: # 若保存的数据可以进行n步更新 G = self.Q_table[s1, a1] # 得到Q(s_{t+n}, a_{t+n}) for i in reversed(range(self.n)): G = self.gamma * G + self.reward_list[i] # 不断向前计算每一步的回报 # 如果到达终止状态,最后几步虽然长度不够n步,也将其进行更新 if done and i > 0: s = self.state_list[i] a = self.action_list[i] self.Q_table[s, a] += self.alpha * (G - self.Q_table[s, a]) s = self.state_list.pop(0) # 将需要更新的状态动作从列表中删除,下次不必更新 a = self.action_list.pop(0) self.reward_list.pop(0) # n步Sarsa的主要更新步骤 self.Q_table[s, a] += self.alpha * (G - self.Q_table[s, a]) if done: # 如果到达终止状态,即将开始下一条序列,则将列表全清空 self.state_list = [] self.action_list = [] self.reward_list = []训练部分不变会传入一个环境产生的 done.效果:采取更保守的策略,更原理悬崖边。Q-learning$$Q(s_t, a_t) <- Q(s_t, a_t) + alpha [r + gamma max_a Q(s_(t + 1), a) - Q(s, a)]$$image.png更新 Q 的公式不同,但采样过程可以用 $epsilon$ 贪心走到下一步。class QLearning: def update(self, s0, a0, r, s1): td_error = r + self.gamma * self.Q_table[s1].max( ) - self.Q_table[s0, a0] self.Q_table[s0, a0] += self.alpha * td_error效果:生成的策略更激进,策略回报也更优。但是交互过程采用 $epsilon$ 贪婪,常会掉进悬崖,训练过程中采样的回报较差。在线策略和离线策略原文声称,on-policy 指模拟采样策略(行为策略)和更新公式(目标策略)一致的策略。例如 Sarsa.在线策略的目标就是老老实实最小化采样回报。而离线策略采样回报和严格按照策略执行的回报会不一致。不一致则为离线策略done

4-动态规划算法

2024-10-22
hrljulyfunnotes技术学习

策略评估已知策略 $pi$ ,状态转移函数 $P$ 和奖励函数也已知,求状态价值函数 $V^pi (s)$(一个期望)初始 $V^(t = 0)$ 任选,比如所有 $V^0 (s) = 0$建立方程 $V(s) = "加权" sum V("nxt"_s)$ (使用贝尔曼期望方程)这不就是带概率和 $r$ 的一个模拟么迭代直到 $V^k = V^(k + 1)$,可以证明会收敛策略提升用于求解最优策略。根据易证明的策略提升定理(到了下一步以后直接一直采用原策略,会获得一个期望,其不会更劣),评估 $pi$ 策略后,策略改为每一状态贪心选择最优的 $"argmax"_a Q^pi (s, a)$,策略就会在每个状态更优。策略提升就是反复贪心(提升)+ 重新迭代评估,直到策略不变。价值迭代上述方法是迭代评估 + 一轮提升,太慢。现在改为一轮评估 + 一轮提升。迭代过程中不维护 $a$,只维护状态价值函数。$$V^(k + 1) (s) = max_(a in A) { Q^k (s, a) }$$done

3-马尔科夫决策过程

2024-09-26
hrljulyfunnotes技术学习

ref: https://hrl.boyuai.com/chapter/1/%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E5%86%B3%E7%AD%96%E8%BF%87%E7%A8%8B状态转移矩阵 $cal(P)$,表示状态对转移概率,为方阵,第 $i$ 行第 $j$ 个表示 $s_i$ 转移到 $s_j$ 概率MRP 问题下方 $s$ 表示状态集合中的元素,$S_t$ 表示某时刻状态取值 <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream <<<<<<< Updated upstream$R_t$: 随机变量,$t$ 时刻获得的奖励(实际)$r(s)$: 转移到状态 s 获得的奖励的期望 =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes =======$R_t$: 随机变量,$t$ 时刻获得的奖励$r(s)$: 转移到状态 s 获得的奖励的期望******Stashed changes$G_t$: 一个马尔科夫过程中,从状态 $S_t$ 开始到无穷步后衰减奖励之和$gamma$: 这里引入了衰减系数,则有 $G_t = R_t + gamma R_(t + 1) + gamma^2 R_(t + 2).. = sum_(k = 0)^oo gamma^k R_(t + k)$$V(s)$: 价值函数, 为一个状态的期望回报 $= EE[G_t | S_t = s] = EE[R_t + gamma V(S_(t + 1)) | S_t = s] = r(s) + gamma sum_(s^prime in S) p(s^prime | s) V(s^prime)$上一行等号最右边叫做贝尔曼方程,由 V 和邻接 V 组成$cal(V) eq.def [V(s_1) ... V(s_n)]^T$奖励函数列向量 $cal(R)$ 由 $r(s_i)$ 组成贝尔曼方程矩阵形式: $cal(V) = (I - gamma cal(P))^(-1) cal(R)$ 此法复杂度 $n^3$,不适用于大数据MDP 问题$A$:动作集合$r(s, a)$:期望奖励同时取决于状态和动作$P(s^prime | s, a)$ :状态转移概率也是,故马尔可夫矩阵不再有用策略$pi(a | s)$:状态 $s$ 下采取 $a$ 的概率$V^pi (s) eq.def EE_pi [G_t | S_t = s]$ 状态价值函数 state-value function,即还不确定 $a$$Q^pi (s, a) = EE_pi [G_t | S_t = s, A_t = a]$ 动作价值函数 action-value function,即确定了 $a$有 $V^pi (s) = sum_(a in A) pi(a | s) Q^pi (s, a)$有 $Q^pi (s, a) = r(s,a) + gamma sum_(s^prime in S) P(s^prime | s, a) V^pi (s^prime)$$s -->^pi a_i -->^P s^prime$贝尔曼期望方程代入即可,要么由 V 和邻接 V 组成,要么由 Q 和邻接 Q 组成将 $V^pi (s)$ 表示为关于下一个状态的等式将 $Q^pi (s, a)$ 同样表示为关于下一个状态和动作的等式image.png$A$ 和 $S$ 的例子image.png边缘化求状态价值函数边缘化:将 MDP 转化为 MRP:状态期望奖励 = 所有动作奖励 $times$ 动作概率,$"状态转移到 s' 概率" = "所有动作转移到 s' 概率" times "动作概率"$蒙特卡洛方法随机采样若干条序列,计算统计回报,用于计算状态价值函数$V(s) <- V(s) + 1 / N(s) (G - V(s))$, 这是增量更新,$G$ 由实际采样计算得到代码实现更新方法:先获得一个序列,对该序列从后往前计算def MC(episodes, V, N, gamma): # 这里 episode 是一个采样序列 for episode in episodes: G = 0 # 由于 G 的定义跟后续状态有关,只能从后往前计算. # 所以最后一个状态没有良好的 G(G = 0) for i in range(len(episode) - 1, -1, -1): (s, a, r, s_next) = episode[i] G = r + gamma * G N[s] = N[s] + 1 V[s] = V[s] + (G - V[s]) / N[s]占用度量$nu_0 (s)$ : MDP 的初始状态分布(在状态 $s$ 的概率)$P_t^pi (s)$ : 策略 $pi$ 下智能体 $t$ 时刻为状态 $s$ 的概率$nu^pi (s)$ : 状态访问分布,$nu^pi (s) = (1 - gamma) sum_(t = 0)^oo gamma^t P_t^pi (s)$ ,指策略下所有步在状态 $s$ 的概率的衰减加权和似乎需要确定 $nu_0$.性质(离散形式类似于 MDP 贝尔曼期望方程):image.png$rho^pi (s, a) space eq.def space (1 - gamma) sum_(t = 0)^oo gamma^t P_t^pi (s) pi (a | s)$ : 占用度量,就是动作状态访问分布,等于状态访问分布乘动作权重,表示策略下所有步在该(状态-动作对)的概率的衰减加权和定理 1: 占用度量相同 $<==>$ 策略相同定理 2: 合法占用度量 $rho$ ,可生成该占用度量的唯一策略为:$$pi_rho (s, a) = rho(s, a) / (sum_(a^prime) rho(s, a^prime)) $$最优策略定理:有限状态和动作集合中,必然存在一个策略,在任意状态下的状态价值函数均不劣于其他策略感性上确实能理解$V^(s), Q^(s, a)$ : ...重要:$V^* (s) = max_(a in cal(A)) Q^*(s, a)$,只需选最好的一个动作即可。这是一个循环依赖,需要解方程贝尔曼最优方程由上面导出image.pn

2-多臂老虎机

2024-08-19
hrljulyfunnotes技术学习

符号$cal(A)$: 动作集合 $cal(R)$: 奖励概率分布,动作 $a$ 对应一个奖励分布 $cal(R)(r | a)$对动作 $a$,定义其期望奖励为 $Q(a)$最优期望奖励 $Q^* = max_(a in cal(A)) Q(a)$懊悔 $R(a) = Q^* - Q(a)$$limits(Q)^("hat")$: 对 $a$ 的期望奖励估值名称MAB: 多臂老虎机UCB: 上置信界法问题表述多臂老虎机是无状态的强化学习,即与环境交互不会改变环境。在下述算法里,每个老虎机的奖励服从伯努利分布,即以 $p_i$ 的概率获得 $1$$epsilon$ 贪心算法$$ a_t = cases( arg max_(a in cal(A)) Q^"hat" (a) & "采样概率" 1 - epsilon, "从" cal(A) "随机选择" & "采样概率" epsilon ) $$以 $epsilon$ 的概率随机探索一个。结果由于随机的部分,懊悔是线性增长的。随时间衰减的 $epsilon$ 贪心算法$epsilon_t = 1 / t$测试时 $K = 10$(老虎机个数),结果累计懊悔是 $ln$ 形式增长的。image.png上置信界算法在 https://hrl.boyuai.com/chapter/1/%E5%A4%9A%E8%87%82%E8%80%81%E8%99%8E%E6%9C%BA/#25-%E4%B8%8A%E7%BD%AE%E4%BF%A1%E7%95%8C%E7%AE%97%E6%B3%95 中已经最小化讲清楚了。用到了霍夫丁不等式。每一时刻设一个概率 $p = 1 / t$。对于每个动作 $a$ 算出一个 $U_t^"hat" (a)$ s.t. $p = e^(-2N_t(a)U_t(a)^2) (<=> U^"hat"_t (a) = sqrt((-log p) / (2 N_t (a))) )$,根据霍夫丁不等式必有: $Q_t (a) < Q^"hat"_t (a) + u$ 至少以 $1 - p$ 概率成立,称不等式右边为期望奖励上界(其实是大概率上界)。当 $t$ 增大时该可能性极大。实操时, $U^"hat"t (a) = sqrt((-log p) / (2 (N_t (a) + 1)))$,每次选择 $a = arg max(a in cal(A)) Q^"hat" (a) + c dot U^"hat" (a)$ 其中 $c$ 为控制不确定性比重的系数。ipynb 中 $c = 1$累计懊悔也是 $ln$ 形式:image.png汤普森采样算法若拉杆 $m_1$ 次奖励为 $1$,$m_2$ 次奖励为 $0$ ,则大胆假设拉杆的奖励概率(注意奖励概率为 $p$,每次要么得 $1$ 要么得 $0$)的概率分布为 $Beta(m_1 + 1, m_2 + 1)$那么每步怎么做决策呢?我们已经大胆假设了所有拉杆的奖励的期望的分布,那么就直接对所有拉杆进行一次 $Beta$ 分布上的采样。拉动采样最大的那

No more posts to load.