深度强化学习3-策略学习

三 策略学习

1. policy Function π ( a ∣ s ) \pi(a|s) π(as)

什么是策略函数 π ( a ∣ s ) \pi(a|s) π(as),策略函数就像现实世界中的参谋长、军师,他们根据你的现身处境,帮你出谋划策,指引你采取下一步动作。

在强化学习中,我们用策略函数来表示它,多数情况下,该函数是以一种概率密度函数PDF(probability density function) π ( a ∣ s ) \pmb{\pi(a|s)} π(as)的形式来表现出来的,以用来模拟现实中做决定的不确定性。
//
策略函数以状态s作为输入, 以 动作a作为输出:
即: s → π → a s \rightarrow \pi \rightarrow a sπa

比如有如下处境s
请添加图片描述

策略给出的结果是:

π ( ← ∣ s ) = 0.7 \pi(\leftarrow | s) = 0.7 π(s)=0.7

π ( → ∣ s ) = 0.2 \pi(\rightarrow | s) = 0.2 π(s)=0.2

π ( ↑ ∣ s ) = 0.1 \pi(\uparrow | s) = 0.1 π(s)=0.1

智能体马里奥根据概率值随机抽样一个动作执行。那么马里奥大概率会向左走。

2. 策略神经网络 π ( a ∣ s , θ ) \pi(a | s, \pmb{\theta}) π(as,θ)

那么问题来了: 既然策略学习流程那么简单, 那我们该如何得到一个这样的策略函数呢?
毕竟游戏里画面简单,动作只有前后跳三种动作,但是现实世界中动作可能都是连续的,可能有无数个可选的动作。
如此复杂的情况,当然需要神经网络上场了。

policy Network: 使用策略网络近似策略函数 :

π ( a ∣ s , θ ) ≈ π ( a ∣ s ) \pi(a|s,\pmb{\theta}) \approx \pi(a|s) π(as,θ)π(as)

其中 θ \theta θ表示可训练的神经网络参数

将一个状态作为输入, 经卷积层得到特征向量。
再经过全连接层映射到一个三维向量(输出是上中下三个动作)
经过softmax激活函数得到概率分布函数.

请添加图片描述

卷积网络
全连接网络
softmax 激活函数
状态输入
特征向量
动作向量
动作概率密度函数

softmax 保证概率是正数且加和等于1

3. state value function 状态值函数

既然策略有了,该如何评价这个策略的好坏(更新策略网络)呢.
V π ( s t ) V_{\pi}(s_t) Vπ(st)状态值函数就是这样一个评价标准。
我们知道动作值函数 Q π ( s t , a t ) Q_{\pi}(s_t, a_t) Qπ(st,at)是用来评价一个动作好坏的标准。
而值函数 V π ( s t ) V_{\pi}(s_t) Vπ(st)评价的是采用该策略后,做出任意动作后状态的好坏。
用公式来说就是:
V π ( s t ) = E A [ Q π ( s t , A ) ] V_{\pi}(s_t) = E_A[Q_{\pi}(s_t, A)] Vπ(st)=EA[Qπ(st,A)]

E A E_A EA Q π Q_{\pi} Qπ的期望值, Q π Q_{\pi} Qπ表示任意动作的好坏,
E A E_A EA = 动作的概率 x 动作的回报。

如果A 是离散的变量有:
V π ( s t ) = ∑ a π ( a ∣ s t ) ⋅ Q π ( s t , a ) . V_{\pi}(s_t) = \sum_a\pi (a|s_t)\cdot Q_\pi (s_t, a). Vπ(st)=aπ(ast)Qπ(st,a).

4. policy-based Reinforcement learning 策略学习

既然理解了上面3个重要成员,下面让我们来看看策略学习是如何进行的。
首先要明确的是,我们的最终目标就是要训练出一个优秀的策略 π \pi π来使得回报最大。

换句话说,就是要训练出一个优秀的 θ \pmb{\theta} θ

我们有预测值 V ( s ; θ ) = ∑ a π ( a ∣ s t ; θ ) ⋅ Q π ( s t , a ) . V(s;\pmb{\theta}) = \sum_a\pi (a|s_t; \pmb{\theta})\cdot Q_\pi (s_t, a). V(s;θ)=aπ(ast;θ)Qπ(st,a).
目标就是使得 V ( s ; θ ) V(s;\pmb{\theta}) V(s;θ)最大。

使用梯度上升来更新 θ \pmb{\theta} θ 以最大化 V ( s ; θ ) V(s;\pmb{\theta}) V(s;θ) :

θ ← θ + β ⋅ δ V ( s ; θ ) δ θ \theta \leftarrow \theta + \beta \cdot \frac{\delta V(s;\theta)}{\delta \theta} θθ+βδθδV(s;θ)

5. policy gradient 策略梯度

根据上一节的推理分析,我们要做的就是求梯度上升的 δ V ( s ; θ ) δ θ \frac{\delta V(s;\theta)}{\delta \theta} δθδV(s;θ)

做一系列数学推导,得到如下两种表达形式:(这里的数学推导就不再解释了,因为比较考验数学,而且也无关紧要,主流的框架都支持自动求梯度)

δ V ( s ; θ ) δ θ = { ∑ a δ π ( a ∣ s ; θ ) δ θ ⋅ Q π ( s , a ) ,离散情况 E A ∼ π ( ⋅ ∣ s ; θ ) [ δ l o g π ( a ∣ s ; θ ) δ θ Q π ( s , a ) ] ,连续情况 \frac{\delta V(s;\theta)}{\delta \theta} =\begin{cases} \sum_a \frac{\delta \pi(a|s;\theta)}{\delta \theta} \cdot Q_{\pi}(s, a),离散情况\\ E_{A\sim \pi(\cdot|s;\pmb{\theta})}[\frac{\delta log \pi (a|s; \theta)}{\delta \theta} Q_{\pi}(s, a)],连续情况\end{cases} δθδV(s;θ)={aδθδπ(as;θ)Qπ(s,a),离散情况EAπ(s;θ)[δθδlogπ(as;θ)Qπ(s,a)],连续情况

对于离散的情况,就是把每个动作对应的值叠加,就得到了梯度 δ V ( s ; θ ) δ θ \frac{\delta V(s;\theta)}{\delta \theta} δθδV(s;θ)

对于连续的动作,公式右边的期望计算非常复杂,目前学界都是使用蒙特卡罗近似

蒙特卡洛抽样近似,就是抽多个随机样本,通过抽取样本的观测值的期望来近似所要计算的公式的期望。
也就是说我们虽然不能计算这个期望,但是我们可以枚举,通过多次的枚举,也能大差不差的算出函数的期望值。
蒙特卡罗近似记为: g ( a ^ , θ ) \pmb{g}(\hat{a}, \pmb{\theta}) g(a^,θ)
这里的蒙特卡洛就是用来近似: g ( a ^ , θ ) = δ l o g π ( a ∣ s ; θ ) δ θ Q π ( s , a ) \pmb{g}(\hat{a}, \pmb{\theta}) = \frac{\delta log \pi (a|s; \theta)}{\delta \theta} Q_{\pi}(s, a) g(a^,θ)=δθδlogπ(as;θ)Qπ(s,a)

6. 让我们总结以下算法的伪代码

  1. 观测到状态 s t s_t st
  2. 根据策略 π ( ⋅ ∣ s t ; θ t ) \pi(\cdot|s_t; \pmb{\theta_t}) π(st;θt)的概率随机抽取动作 a t a_t at执行
  3. 计算该动作的预期价值回报: q t ≈ Q π ( s t , a t ) q_t \approx Q_{\pi}(s_t, a_t) qtQπ(st,at)
  4. 微分求策略网络的梯度: d θ , t = δ l o g π ( a t ∣ s t , θ ) δ θ ∣ θ = θ t \pmb{d_{\theta,t}} = \frac{\delta log\pi(a_t|s_t,\pmb{\theta)}}{\delta \theta} |_{\pmb{\theta = \theta_t}} dθ,t=δθδlogπ(atst,θ)θ=θt (tensorflow, pythorch 这些框架都支持自动求梯度)
  5. 近似求策略梯度(用蒙特卡洛采样求梯度): g ( a t , θ t ) = q t ⋅ d θ , t \pmb{g}(a_t, \pmb{\theta_t}) = q_t \cdot \pmb{d_{\theta, t}} g(at,θt)=qtdθ,t
  6. 更新策略网络: θ t + 1 = θ t + β ⋅ g ( a t , θ t ) \pmb{\theta_{t+1}} = \pmb{\theta_t}+\beta\cdot\pmb{g}(a_t, \pmb{\theta_t)} θt+1=θt+βg(at,θt)

上述步骤3中,如何近似计算 q t q_t qt:

方法1: 强化学习的暴力破解方法:1局玩完,然后计算所有状态的奖励r:
s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . . . . . , s T , a T , r T s_1, a_1, r_1, s_2, a_2, r_2, ......, s_T, a_T,r_T s1,a1,r1,s2,a2,r2,......,sT,aT,rT
然后对所有时刻的t 计算回报: u t = ∑ K = t T γ K − t r K u_t = \sum_{K=t}^{T}\gamma^{K-t}r_K ut=K=tTγKtrK

方法2:使用神经网络来近似计算 Q π Q_{\pi} Qπ
那么这样就有2个神经网络了,一个叫actor(策略网络),一个叫critic(评价网络)即actor-critic方法。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用ε-greedy策略实现深度强化学习的示例代码: ```python import random import numpy as np import tensorflow as tf # 定义ε-greedy策略参数 epsilon = 0.2 # 创建深度强化学习模型 model = create_model() # 定义损失函数和优化器 loss_function = tf.keras.losses.MeanSquaredError() optimizer = tf.keras.optimizers.Adam() # 定义动作空间数量 num_actions = 4 # ε-greedy策略的选择动作函数 def choose_action(state): rand = random.random() if rand < epsilon: # 随机选择一个动作进行探索 return random.randint(0, num_actions-1) else: # 利用深度强化学习模型选择最优动作 q_values = model.predict(np.array([state])) return np.argmax(q_values[0]) # 深度强化学习训练循环 for episode in range(num_episodes): state = env.reset() # 重置环境的初始状态 while True: action = choose_action(state) # 根据ε-greedy策略选择动作 next_state, reward, done, _ = env.step(action) # 执行动作并观察奖励和下一个状态 # 计算目标Q值 target_q_values = model.predict(np.array([next_state])) max_q_value = np.max(target_q_values[0]) target = reward + discount_factor * max_q_value with tf.GradientTape() as tape: # 计算当前状态的Q值 q_values = model(np.array([state])) q_value = q_values[0][action] # 计算损失函数 loss = loss_function(target, q_value) # 计算梯度并更新模型 gradients = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables)) state = next_state if done: break ``` 请注意,上述代码是一个简化的示例,展示了如何使用ε-greedy策略来实现深度强化学习。实际的代码需要根据具体问题和深度强化学习模型进行调整和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值