RL算法总结
直接从md拷过来的,有些图片有问题,后续我会继续更新
文章目录
RL算法的前期基础
什么是马尔可夫性?
Q-learning and Sarsa
Q-learning:(off-policy)
Q ( s , a ) ← Q ( s , a ) + α [ r + γ max a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a)+\alpha\left[r+\gamma \max_{a'} Q\left(s^{\prime}, a^{\prime}\right)-Q(s, a)\right] Q(s,a)←Q(s,a)+α[r+γa′maxQ(s′,a′)−Q(s,a)]
碎碎念:这个loss就相当于是她不断趋近于0,让Q完全拟合r+ γ \gamma γ maxQ‘ 吧
Sarsa: (on-policy)
Q ( s , a ) ← Q ( s , a ) + α [ r + γ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a)+\alpha\left[r+\gamma Q\left(s^{\prime}, a^{\prime}\right)-Q(s, a)\right] Q(s,a)←Q(s,a)+α[r+γQ(s′,a′)−Q(s,a)]
碎碎念:这个Sarsa的不同就是 取得不是最大的Q值
所以在代码中一个取Q_max,另一个取任意一个Q。介于之前 Q ( s ′ , a ′ ) Q(s',a') Q(s′,a′)不知道值的原因,代码中在提取下一个Q的时候,是先提前赋值了的。
on-policy and off-policy的区别:
On-policy 的目标策略和行为策略是同一个策略,其好处就是简单粗暴,直接利用数据就可以优化其策略,但这样的处理会导致策略其实是在学习一个局部最优。
Off-policy将目标策略和行为策略分开,可以在保持探索的同时,更能求到全局最优值。
Sarsa Lambda
δ
←
R
+
γ
Q
(
S
′
,
A
′
)
−
Q
(
S
,
A
)
Q
(
s
,
a
)
←
Q
(
s
,
a
)
+
α
δ
E
(
s
,
a
)
E
(
s
,
a
)
←
γ
λ
E
(
s
,
a
)
\begin{aligned} &\delta \leftarrow R+\gamma Q\left(S^{\prime}, A^{\prime}\right)-Q(S, A)\\ &Q(s, a) \leftarrow Q(s, a)+\alpha \delta E(s, a)\\ &E(s, a) \leftarrow \gamma \lambda E(s, a) \end{aligned}
δ←R+γQ(S′,A′)−Q(S,A)Q(s,a)←Q(s,a)+αδE(s,a)E(s,a)←γλE(s,a)
代码在建立Q表的时候,还会建立一个E表。可以看到,上面的更新是乘了E表的值。对于具体如何处理E表,代码中写的很明白。
λ
\lambda
λ = lambda
DQN,double-DQN,dueling-DQN(涉及到构建网络)
DQN:(deep Q network)
DQN的出现是为了解决在复杂的情况下,更新Q表的方法不太现实的问题。对于DQN为什么要有两个网络,我想是因为需要一个现实Q,一个估计Q来计算差值。从而达到两个现实个估计网络几乎相同。
两个网络,一个eval来预测Q表,一个target来计算现实的Q表(Q现实就是根据这个更新的)。两个网络的结构是一样的,只是参数更新的速度不一样。
eval网络输出的是当前s的所有a的q值,eval网络的 loss:
y
i
=
r
+
γ
∗
m
a
x
Q
(
s
′
,
a
′
)
y
i
=
Q
(
s
,
a
)
l
o
s
s
=
(
y
j
−
Q
(
ϕ
j
,
a
j
;
θ
)
)
2
y_i=r+\gamma*maxQ(s',a')\\ y_i=Q(s,a)\\ loss=\left(y_{j}-Q\left(\phi_{j}, a_{j} ; \theta\right)\right)^{2}
yi=r+γ∗maxQ(s′,a′)yi=Q(s,a)loss=(yj−Q(ϕj,aj;θ))2
这个Q(s’,a’)是由target网络预测得到的。而前面的Q-learning只是Q表的更新。
target网络的输出下一个s的所有a的q值,没有loss。在learn 中有一个值替换函数,是用tf.assign实现的。
下一步a根据最大的Q‘值来选择
DQN开始有了经验回放的方法。
double-DQN:
用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差。
以下是改进的公式:
Y
t
DoubleDQN
=
r
+
γ
Q
′
(
s
′
,
argmax
a
Q
(
s
′
,
a
;
θ
t
)
,
θ
t
′
)
Y_{t}^{\text {DoubleDQN }}= r+\gamma Q'\left(s', \underset{a}{\operatorname{argmax}} Q\left(s', a ; \boldsymbol{\theta}_{t}\right), \boldsymbol{\theta}_{t}'\right)
YtDoubleDQN =r+γQ′(s′,aargmaxQ(s′,a;θt),θt′)
double-DQN和DQN的网络结构并没有什么不同,只是q-target的计算方式不一样。
下面给出差别部分的代码:
if self.double_q:
max_act_for_next = np.argmax(q_eval_for_next, axis=1) #q_eval_for_next = q_eval
selected_q_next = q_next[batch_index, max_act4next] # Double DQN
else:
selected_q_next = np.max(q_next, axis=1) # the natural DQN
q_target[batch_index, eval_act_index] = reward + self.gamma * selected_q_next
double-DQN的下一步的q值对应的a‘是根据eval网络来选择的。这样就不会有很大的过拟合。
Prioriized Experience Replay DQN
PER 优先经验回放,改进了DQN中的经验回放策略,值得一看!
dueling-DQN
只要稍稍修改 DQN 中神经网络的结构, 就能大幅提升学习效果, 加速收敛 。 用一句话来概括 Dueling DQN 就是. 它将每个动作的 Q 拆分成了 state 的 Value 加上 每个动作的 Advantage.
下面是它q值的公式: Q ( s , a ; θ , α , β ) = V ( s ; θ , β ) + A ( s , a ; θ , α ) Q(s, a ; \theta, \alpha, \beta)=V(s ; \theta, \beta)+A(s, a ; \theta, \alpha) Q(s,a;θ,α,β)=V(s;θ,β)+A(s,a;θ,α)
在网络中建立V与A两个输出
我们发现当可用动作越高, 学习难度就越大, 不过 Dueling DQN 还是会比 Natural DQN 学习得更快. 收敛效果更好.
value-based and policy-based 的区别:
value-based 的典型算法是DQN,policy-based是policy gradient,结合这两种具体算法可能会更好的理解。
处理的action space不同:value-based适合处理action space低维离散的,policy-based适合处理连续的action space。
针对action的价值输出不同:value-based计算出每个action的价值,policy-based一般情况下只给出较价值较高的actions。
更新频率不同:value-based每个action执行都可以更新,policy-based 每个episode完成之后才能更新一次。这里可以理解成下棋的时候,value-based每下一步就学习一次,而policy-based要在一盘棋下完之后再学习。
像DDPG,AC算法就是将两者都结合了起来。
单步更新(TD算法)和回合更新(蒙特卡洛算法)的区别:
这个就是字面的区别,主要是理解为什么单步是TD算法,回合是蒙特卡洛算法。
MC算法:蒙特卡罗方法又叫做统计模拟方法,它使用随机数(或伪随机数)来解决计算问题。在强化学习中,在为了能够从环境中学习,我们需要让agent与environment交互,得到一些经历(样本)。然后通过这些经历来进行策略评估与策略迭代。从而最终得到最优策略。这种做法的理论是从蒙特卡罗方法中来的。
TD算法:就是单步更新算法
有一个公式可以体现两者的差别:
M C : V ( S t ) ← V ( S t ) + α ( G t − V ( S t ) ) T D : V ( S t ) ← V ( S t ) + α ( R t + 1 + γ V ( S t + 1 ) − V ( S t ) ) MC: V(S_t) \leftarrow V(S_t) + \alpha(G_t-V(S_t))\\ TD: V(S_t) \leftarrow V(S_t)+ \alpha(R_{t+1} + \gamma V(S_{t+1})-V(S_t)) MC:V(St)←V(St)+α(Gt−V(St))TD:V(St)←V(St)+α(Rt+1+γV(St+1)−V(St))
DP(动态规划)算法:上面两个算法可以和DP算法相比较,因为这三种学习方法都是用来计算状态价值的。它们的区别在于,前两种是在不知道模型的情况下常用的方法,而MC方法又需要一个完整的episode来更新状态价值,TD则不需要完整的episode。DP方法则是基于Model(知道模型的运作方式)的计算状态价值的方法
D P : V ( S t ) ← E π [ R t + 1 + γ V ( S t + 1 ) DP: V(S_t) \leftarrow E_{\pi}[R_{t+1} + \gamma V(S_{t+1}) DP:V(St)←Eπ[Rt+1+γV(St+1)我发现TD算法还是有一个大的种类,包括很多的东西,这个有时间可以一起总结一下。而且TD和MC是可以结合起来的,比如说A3C中的n-steps就是一个很好的结合的例子。还有一个统一的方法Eligibility traces(资格迹)。
eligibility traces 优于n-step的主要地方在于计算非常有效率,其只需要一个trace向量,而不需要储存n个特征向量。另外,eligibility trace的学习是逐步的,而不需要等到n-steps之后。
PG
从这里开始就与上面的value-based方法不一样了,value-based方法最后输出的action的一个Q表,policy-based方法输出的直接是一个动作,而且还可以在连续的分布上选取动作。PG是回合更新的。采取随机性策略:
a
t
∼
π
θ
(
s
t
∣
θ
π
)
a_{t} \sim \pi_{\theta}\left(s_{t} | \theta^{\pi}\right)
at∼πθ(st∣θπ)其中
θ
π
\theta^{\pi}
θπ是产生随机性动作的策略网络的参数 .
θ
←
θ
+
α
∇
θ
log
π
θ
(
s
t
,
a
t
)
v
t
θ
就
是
G
D
网
络
的
参
数
\theta \leftarrow \theta+\alpha \nabla_{\theta} \log \pi_{\theta}\left(s_{t}, a_{t}\right) v_{t}\\ \theta就是GD网络的参数
θ←θ+α∇θlogπθ(st,at)vtθ就是GD网络的参数
这样可能看的懂一些:
θ
←
θ
+
α
∇
θ
log
p
θ
(
s
t
,
a
t
)
r
t
p
就
是
概
率
,
r
t
就
是
r
e
w
a
r
d
l
o
s
s
=
1
N
∑
r
∗
log
p
\theta \leftarrow \theta+\alpha \nabla_{\theta} \log p_{\theta}\left(s_{t}, a_{t}\right) r_{t}\\ p就是概率,r_t就是reward \\ loss = \frac{1}{N} \sum r*\log p
θ←θ+α∇θlogpθ(st,at)rtp就是概率,rt就是rewardloss=N1∑r∗logp
下一步a根据最后的概率来选择
关于代码中的一些问题:
-
PG算法中间有一个预测动作的神经网络,最后输出的张量的shape:[None,n_actions],然后再求这个预测值与现实中的动作的cross-entropy误差
公式: H y ′ ( y ) = − ∑ i y i ′ log ( y i ) y i 是 预 测 值 , y i ′ 是 真 实 值 H_{y^{\prime}}(y)=-\sum_{i} y_{i}^{\prime} \log \left(y_{i}\right) \;y_i是预测值,y_i'是真实值 Hy′(y)=−i∑yi′log(yi)yi是预测值,yi′是真实值 (最大化r*logp就是最小化—r*logp)。因为强化学习中现实的动作并不一定都是正确的,所以后面还要乘以每一回合reward用来更正预测。如果不用cross-entropy来计算误差,能否不用log?
这里的loss函数是为了配合policy gradient ,因为输出是概率,所以 需要一个概率之间进行比较的函数,选择了cross entropy。莫烦老师代码中的实现是用的tf.nn.sparse_softmax_cross_entropy_with_logits,这个函数包含了“-” 号。
这里也可以从优化的角度思考,loss =-log§*r, p和r都是向量,如果如果p小,则-log§ 大,r大则loss 更大。r的值和p的值没有关系,所以为了让loss小,只能让r最大的位置的p最大,即收益最大的位置的概率最大
这个地方看了台大李宏毅老师的讲解之后,我发现这个地方的log是直接算出来的:这个地方就和莫烦老师的想法不是很一样。
R ˉ θ = ∑ τ R ( τ ) p θ ( τ ) ∇ R ˉ θ = ∑ τ R ( τ ) ∇ p θ ( τ ) = ∑ τ R ( τ ) p θ ( τ ) ∇ p θ ( τ ) p θ ( τ ) = ∑ τ R ( τ ) p θ ( τ ) ∇ log p θ ( τ ) # 依 据 是 : ∇ f ( x ) = f ( x ) ∇ l o g f ( x ) = E τ ∼ p θ ( τ ) [ R ( τ ) ∇ log p θ ( τ ) ] ≈ 1 N ∑ n = 1 R ( τ n ) ∇ log p θ ( τ n ) = 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ log p θ ( a t n ∣ s t n ) \bar{R}_{\theta}=\sum_{\tau} R(\tau) p_{\theta}(\tau)\\ \nabla \bar{R}_{\theta}=\sum_{\tau} R(\tau) \nabla p_{\theta}(\tau)=\sum_{\tau} R(\tau) p_{\theta}(\tau) \frac{\nabla p_{\theta}(\tau)}{p_{\theta}(\tau)}\\ =\sum_{\tau}R(\tau)p_{\theta}(\tau) \nabla \log p_{\theta}(\tau)\\ \#依据是:\nabla f(x)=f(x) \nabla logf(x)\\ =E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right] \approx \frac{1}{N} \sum_{n=1} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(\tau^{n}\right)=\frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right) Rˉθ=τ∑R(τ)pθ(τ)∇Rˉθ=τ∑R(τ)∇pθ(τ)=τ∑R(τ)pθ(τ)pθ(τ)∇pθ(τ)=τ∑R(τ)pθ(τ)∇logpθ(τ)#依据是:∇f(x)=f(x)∇logf(x)=Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]≈N1n=1∑R(τn)∇logpθ(τn)=N1n=1∑Nt=1∑TnR(τn)∇logpθ(atn∣stn) -
关于每一回合的reward,最后的reward是一个list,通过归一化,我们可以看到每一回合的reward使如何变化的。对于CartPole-v0的第一回合,图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5dYUvmyX-1615342857060)(RL的问题与总结.assets/5-2-2.png)]
这只是第一回合的reward,不是全部回合的reward,可以看到前面的reward很大,说明前面的行为要重视,后面的reward很小(杆子要掉下来了),所以后面的行为要惩罚。
对于MountainCar-v0的第30回合的图如下:
这是第30回合的reward,不是整个回合的reward,可以看到通过前29轮的训练,在第30轮,小车已经可以到达终点了,所以后面的行为要重视。
这里有一个问题,每一回合所有的reward都经过了衰减的处理,而且是倒序的衰减处理,第一个reward反而衰减越小,这个的意思是每一回合的reward都与最后一个reward关系最大,同时考虑之前reward的影响吗?
reward的衰减是与游戏本身有关系的:
如果是目标到达类的游戏,比如到达某个点才有最大的收益,我们会用这种在最终才有较大收益的曲线
如果是保持状态类的,在保持状态的初期有较大的收益,但是偏离了状态,则收益大幅下降。
当然在李宏毅教授的课件当中还提到了一个叫做baseline的东西,用于对reward都为正数的游戏,在这种情况下,我们将简单的 r ( τ ) r(\tau) r(τ)变成 r ( τ ) − b r(\tau)-b r(τ)−b, b b b可以用 E ( r ( τ ) ) E(r(\tau)) E(r(τ))来代替。让reward也有负的时候,这样的好处我在这个地方不知道如何描述,具体可看李宏毅教授课件中的讲解( https://www.bilibili.com/video/BV1iE411e7KQ?p=1 ),这样有正有负的reward对训练也很有帮助!在莫烦老师代码中我还看到一种方法就是对reward归一化,我觉得这样也可以!
还有一个地方就是在上面的 r ( τ ) r(\tau) r(τ)也可以变化为 ∑ t ′ = t T n γ t ′ − t r t ′ n \sum_{t^{\prime}=t}^{T_{n}} \gamma^{t^{\prime}-t} r_{t^{\prime}}^{n} ∑t′=tTnγt′−trt′n的样子,前面的 γ \gamma γ就是一个小于1的衰减系数, r t ′ n r_{t'}^n rt′n就是一个从当前开始到最后的一个reward。当然这个地方我也有点奇怪,啥从当前开始到最后的reward,后来我想了一下,n就是一回合中总的步数, T n T_n Tn就是所有的回合数,这样就是指当前这个回合中所有的reward的和,这样就和莫烦老师代码中的含义一样了。
还有一个地方就是关于cross_entrop的地方,这个交叉熵到底做了什么,为什么里面会用到one-hot编码,最后的为什么只有logp,而不是qlogp这样的交叉熵的形式。
AC
AC算法也是一个很重要的算法,后面的ddpg,dppo,a3c等算法都与它有关。Actor就是PG算法,Critic就是评判函数。AC是单步更新的。(有人说:AC就是PG加Q-learning)
Actor中与PG不一样的地方就是,用现实和估计的差距(TD error)代替了原来的一回合的reward,Actor网络输出的是所有动作的概率值。
这里的td_error就是A 优势函数,那么什么是优势函数?
优势函数表达在状态s下,某动作a相对于平均而言的优势。
从数量关系来看,就是随机变量相对均值的偏差。
使用优势函数是深度强化学习极其重要的一种策略,尤其对于基于policy的学习。
TD error: t d _ e r r o r = r + γ ∗ v _ − v td\_error=r+\gamma*v\_-v td_error=r+γ∗v_−v,v就是在s下得到的value(相当于q值吧),v和v_都由由Critic得到。
因为不是回合更新的,所以用
l
o
s
s
=
log
p
θ
(
s
t
,
a
t
)
t
d
_
e
r
r
o
r
θ
←
θ
+
α
(
R
t
+
1
+
γ
v
^
(
S
t
+
1
)
−
v
^
(
S
t
)
)
∇
θ
log
π
(
A
t
∣
S
t
,
θ
)
loss= \log p_{\theta}\left(s_{t}, a_{t}\right) td\_error\\ \theta \leftarrow \theta+\alpha \left(R_{t+1}+\gamma \hat{v}\left(S_{t+1}\right)-\hat{v}\left(S_{t}\right)\right) \nabla_{\theta} \log \pi\left(A_{t} \mid S_{t}, \theta\right)
loss=logpθ(st,at)td_errorθ←θ+α(Rt+1+γv^(St+1)−v^(St))∇θlogπ(At∣St,θ)
的时候p概率只是针对单次的state做出的action的概率,action根据概率随机选择选择得到的。要求loss的最大值,就是求—loss的最小值。(actor的loss和PG算法的loss非常相似,可以看到,这里就是把PG中的V换成了td_error。负号也是和PG一模一样)
Critic的 l o s s = t d _ e r r o r 2 loss=td\_error^2 loss=td_error2,Critic的作用就是计算v_和优化前面的loss。优化loss部分和之前的DQN类似哎。Critic网络输出的是s的v值。这个网络中状态s的价值和DQN中q值有什么不同?
AC的特点就是有两个网络分别学习,一般情况下,会要求A的学习率大于C的学习率,这里的目的是让A对于动作的更新更准确
这里的V值和Q值,其实没什么区别,这里的critic网络就是直接对Q值的直接估计
前面的DQN,GD,AC网络最后的reward值是:_reward * 0.95 + ep_rs_sum * 0.05,想知道为什么是这个样子?
首先,这个曲线是一个指数衰减的曲线,比较平滑,一般这样做的目的是为了平滑曲线
另外这里的running reward 你是否指的是:
ep_rs_sum = sum(RL.ep_rs) if 'running_reward' not in globals(): running_reward = ep_rs_sum else: running_reward = running_reward * 0.99 + ep_rs_sum * 0.01 if running_reward > DISPLAY_REWARD_THRESHOLD: RENDER = True # rendering print("episode:", i_episode, " reward:", int(running_reward)) # 这段代码的目的是评估当前的学习器是否达到了一个比较好的水平,如果达到了,则可以进行render 渲染,就是把图像打印出来,因为打印图像一般比较耗时 # 使用running_reward是因为进行了平滑之前的曲线,可能有部分步达到了比较好的水平,但是是炸胡,平滑保证能持续达到比较好的水平才进行渲染和打印数值
Actor Critic优点:可以进行单步更新, 相较于传统的PG回合更新要快.
Actor Critic缺点:Actor的行为取决于 Critic 的Value,但是因为 Critic本身就很难收敛和actor一起更新的话就更难收敛了。(为了解决收敛问题, Deepmind 提出了 Actor Critic 升级版 Deep Deterministic Policy Gradient,后者融合了 DQN 的优势, 解决了收敛难的问题)。下面提到的A3C也是早期对AC算法的优化,也有很多值得我们学习的地方。
A3C
Asynchronous Advantage Actor-critic 异步优势 AC算法
相比Actor-Critic,A3C的优化主要有3点,分别是异步训练框架,网络结构优化,Critic评估点的优化。其中异步训练框架是最大的优化。
下面是A3C的框架,可见global network的下面有很多的小网络,这就是异步。公共部分的网络模型就是我们要学习的模型,而线程里的网络模型主要是用于和环境交互使用的
关于第二个优化,网络结构的优化。之前在 Actor-Critic中,我们使用了两个不同的网络Actor和Critic。在A3C这里,我们把两个网络放到了一起,即输入状态SS,可以输出状态价值VV,和对应的策略ππ, 当然,我们仍然可以把Actor和Critic看做独立的两块,分别处理
第三个优化是Critic评估点的优化。原来AC算法的优势函数(就是td_error)是
A
(
S
,
t
)
=
R
+
γ
V
(
S
′
)
−
V
(
S
)
A(S,t) = R+ \gamma V(S') - V(S)
A(S,t)=R+γV(S′)−V(S)
在A3C中,采用了N步采样来加速收敛,优势函数是:
A
(
S
,
t
)
=
R
t
+
γ
R
t
+
1
+
…
γ
n
−
1
R
t
+
n
−
1
+
γ
n
V
(
S
′
)
−
V
(
S
)
A(S, t)=R_{t}+\gamma R_{t+1}+\ldots \gamma^{n-1} R_{t+n-1}+\gamma^{n} V\left(S^{\prime}\right)-V(S)
A(S,t)=Rt+γRt+1+…γn−1Rt+n−1+γnV(S′)−V(S)
于Actor和Critic的损失函数部分,和Actor-Critic基本相同。有一个小的优化点就是在Actor-Critic策略函数的损失函数中,加入了策略π的熵项(这不是和SAC想法一样了吗),系数为c, 即策略参数的梯度更新和Actor-Critic相比变成了这样:
θ
←
θ
+
α
∇
θ
log
π
θ
(
s
t
,
a
t
)
A
(
S
,
t
)
+
c
∇
θ
H
(
π
(
S
t
,
θ
)
)
\theta \leftarrow\theta+\alpha \nabla_{\theta} \log \pi_{\theta}\left(s_{t}, a_{t}\right) A(S, t)+c \nabla_{\theta} H\left(\pi\left(S_{t}, \theta\right)\right)
θ←θ+α∇θlogπθ(st,at)A(S,t)+c∇θH(π(St,θ))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xK64iEL-1615342857075)(C:\Users\slaxes_g\Pictures\6-3-1.png)]
这个A3C论文里面还有涉及了很多的其他要点,我觉得很有意思,来说一下。
我们所说的policy-based和value-based其实是有算法基础依据的。他们统统归纳与policy-gradient methods 和 action-value methods中。
我们把去估计动作值函数(action-value)然后利用其进行决策的方法叫做action-value methods
而把将策略参数化,并且每次依照当前策略参数和环境反馈,去更新参数的方法叫做policy-gradient methods,一种常见的更新方法就是策略梯度上升(gradient ascent)。
我们来说说policy-gradient methods的目标函数,policy-method就是根据目标函数对策略参数的导数进行优化的。
通常我们定义的目标函数是:
J ( θ ) = v π θ ( S start ) J(\theta) = v_{\pi_{\theta}}\left(S_{\text {start }}\right) J(θ)=vπθ(Sstart )
它的导数就是:所有a和所有s的组合
∇ J ( θ ) = ∑ s μ π ( s ) ∑ a q π ( s , a ) ∇ θ π ( a ∣ s , θ ) 其中 μ π ( s ) 是值在策略 π 下任意时间 t 状态 s 的出现的期望 \nabla J(\theta)=\sum_{s} \mu_{\pi}(s) \sum_{a} q_{\pi}(s, a) \nabla_{\theta} \pi(a \mid s, \theta)\\ \text { 其中 } \mu_{\pi}(s) \text { 是值在策略 } \pi \text { 下任意时间 } t \text { 状态 } s \text { 的出现的期望 } ∇J(θ)=s∑μπ(s)a∑qπ(s,a)∇θπ(a∣s,θ) 其中 μπ(s) 是值在策略 π 下任意时间 t 状态 s 的出现的期望
然后我们就可以对上面的公式进行简化:
对 于 某 一 个 e p i s o d e : ∇ J ( θ ) = E π [ ∑ a q π ( S t , a ) ∇ θ π ( a ∣ S t , θ ) ] ∇ log ( f ( θ ) ) ∗ f ( θ ) = ∇ f ( θ ) ∇ J ( θ ) = E π [ q π ( S t , A t ) ∇ θ log π ( A t ∣ S t , θ ) ] θ ← θ + α γ t q π ( S t , A t ) ∇ θ log π ( A t ∣ S t , θ ) 对于某一个episode:\nabla J(\theta)=E_{\pi}\left[\sum_{a} q_{\pi}\left(S_{t}, a\right) \nabla_{\theta} \pi\left(a \mid S_{t}, \theta\right)\right] \\ \nabla \log (f(\theta)) * f(\theta)=\nabla f(\theta)\\ \nabla J(\theta)=E_{\pi}\left[q_{\pi}\left(S_{t}, A_{t}\right) \nabla_{\theta} \log \pi\left(A_{t} \mid S_{t}, \theta\right)\right]\\ \theta \leftarrow \theta+\alpha \gamma^{t} q_{\pi}\left(S_{t}, A_{t}\right) \nabla_{\theta} \log \pi\left(A_{t} \mid S_{t}, \theta\right) 对于某一个episode:∇J(θ)=Eπ[a∑qπ(St,a)∇θπ(a∣St,θ)]∇log(f(θ))∗f(θ)=∇f(θ)∇J(θ)=Eπ[qπ(St,At)∇θlogπ(At∣St,θ)]θ←θ+αγtqπ(St,At)∇θlogπ(At∣St,θ)
式子中的q_{\pi}(S_t,A_t)的不同改进形成了各种的算法对于REINFORCE算法就是policy-gradient methods下的一个具体的算法:
每次取样一个回合(MC算法)对参数进行更新,q(s,a)函数变为:
G t = ∑ k = t + 1 T γ k − t R k θ ← θ + α γ t G t ∇ θ log π ( A t ∣ S t , θ ) G_{t}=\sum_{k=t+1}^{T} \gamma^{k-t} R_{k}\\ \theta \leftarrow \theta+\alpha \gamma^{t} G_{t} \nabla_{\theta} \log \pi\left(A_{t} \mid S_{t}, \theta\right) Gt=k=t+1∑Tγk−tRkθ←θ+αγtGt∇θlogπ(At∣St,θ)REINFORCE还有扩展方法:REINFORCE with baseline
可以在q(s,a)后面减去任意的与动作a无关的项b(s),这样可以减少算法的方差(variance)
θ ← θ + α γ t ( G t − b ( s ) ) ∇ θ log π ( A t ∣ S t , θ ) \theta \leftarrow \theta+\alpha \gamma^{t}\left(G_{t}-b(s)\right) \nabla_{\theta} \log \pi\left(A_{t} \mid S_{t}, \theta\right) θ←θ+αγt(Gt−b(s))∇θlogπ(At∣St,θ)
利用了等式:
∑ a b ( s ) ∇ θ π ( a ∣ s , θ ) = b ( s ) ∇ θ ∑ a π ( a ∣ s , θ ) = b ( s ) ∇ θ 1 = 0 \sum_{a} b(s) \nabla_{\theta} \pi(a \mid s, \theta)=b(s) \nabla_{\theta} \sum_{a} \pi(a \mid s, \theta)=b(s) \nabla_{\theta} 1=0 a∑b(s)∇θπ(a∣s,θ)=b(s)∇θa∑π(a∣s,θ)=b(s)∇θ1=0
我们可以看到,这里用的都是回合的更新,所以REINFORCE用的是MC的思想,如果改用TD的思想的话,我们就得到了AC算 法。 将REINFORCE中更新时使用的Gt 改为
R t + 1 + γ v ^ ( S t + 1 ) − b ( S t ) 其中 v ^ ( s ) 是我们对状态值函数的估计,一般我们可以直接用 v ^ ( S t ) 来确定 b ( S t ) θ ← θ + α γ t ( R t + 1 + γ v ^ ( S t + 1 ) − v ^ ( S t ) ) ∇ θ log π ( A t ∣ S t , θ ) R_{t+1}+\gamma \hat{v}\left(S_{t+1}\right)-b\left(S_{t}\right)\\ \text { 其中 } \hat{v}(s) \text { 是我们对状态值函数的估计,一般我们可以直接用 } \hat{v}\left(S_{t}\right) \text { 来确定 } b\left(S_{t}\right) \\ \theta \leftarrow \theta+\alpha \gamma^{t}\left(R_{t+1}+\gamma \hat{v}\left(S_{t+1}\right)-\hat{v}\left(S_{t}\right)\right) \nabla_{\theta} \log \pi\left(A_{t} \mid S_{t}, \theta\right) Rt+1+γv^(St+1)−b(St) 其中 v^(s) 是我们对状态值函数的估计,一般我们可以直接用 v^(St) 来确定 b(St)θ←θ+αγt(Rt+1+γv^(St+1)−v^(St))∇θlogπ(At∣St,θ)为什么减去一个b,就会减少方差呢??
这里的差指的是估计的梯度的方差,反映了参数更新的稳定性。实际上,减去一个基线虽然不会改变更新值的期望值,但是它会影响更新的方差。赌博机问题中我们介绍了类似的技巧,通过减去平均回报(基准),梯度算法能够学习的更快。比如对于一些状态来说,他们都具有比较大的动作值函数。那么我们就需要有一个大的基线来区分更大的动作值和相对小的动作值。但是对于其他一些状态,所有状态的值函数都比较小,那么我们就需要一个小的基线值。
强化学习的很多算法都是向前看的算法,即当前状态或动作的价值更新是依赖于未来状态或动作的,这样的算法称为forward view (前向视角)。前向视角实施起来多少有些不方便,毕竟未来的事,当前并知道。还有另外一种思路是所谓的backward view (后向视角),通过eligibility trace来考虑最近刚刚访问过的状态或动作。
熵正则化?
这到底是什么东西,我知道熵,交叉熵,相对熵,怎么不知道这个熵正则化?
看名字就知道,这个就是熵作为后面的正则化项了。那什么又是正则化?那就要你自己去了解之间的基础知识了。
DDPG
DDPG算法是对前面AC,DQN,PG算法的综合,集合了各个算法的优点。最后有四个网络。Actor和Critic网络下分别有还有eval,target网络,eval与target网络的结构是一样的。DDPG采取确定性策略: a t = μ ( s t ∣ θ μ ) a_{t} = \mu\left(s_{t} | \theta^{\mu}\right) at=μ(st∣θμ),其中 θ μ \theta^{\mu} θμ就是产生确定性动作的策略网络参数。
Actor:J(-Q)就是loss,至于这里为什么要将Q与a相乘,可能是因为莫烦文章中说的:前半部分的Q,从Critic得到,是Actor要考虑如何移动得到最大的Q,后半部分的
μ
\mu
μ是Actor要如何修改自身的参数,使之更有可能做这个动作。两者合起来Actor要朝着可能获取大Q的的方向去修改参数。
∇
θ
μ
J
≈
1
N
∑
i
∇
a
Q
(
s
,
a
∣
θ
Q
)
∣
s
=
s
i
,
a
=
μ
(
s
i
)
∇
θ
μ
μ
(
s
∣
θ
μ
)
∣
s
i
\left.\left.\nabla_{\theta^{\mu}} J \approx \frac{1}{N} \sum_{i} \nabla_{a} Q\left(s, a | \theta^{Q}\right)\right|_{s=s_{i}, a=\mu\left(s_{i}\right)} \nabla_{\theta^{\mu}} \mu\left(s | \theta^{\mu}\right)\right|_{s_{i}}
∇θμJ≈N1i∑∇aQ(s,a∣θQ)∣∣∣∣∣s=si,a=μ(si)∇θμμ(s∣θμ)∣∣∣∣∣∣si
Actor网络的loss是q,原因是: d q / d θ = d q / d a ∗ d a / d θ dq/d\theta=dq/da*da/d\theta dq/dθ=dq/da∗da/dθ,其中 θ \theta θ就是Actor自身的参数。Actor网络最后输出的是一个动作,预测动作。a由Actor网络直接输出获得
Critic:L就是loss,借鉴了DQN和Q-learning
y
i
=
r
i
+
γ
Q
′
(
s
i
+
1
,
μ
′
(
s
i
+
1
∣
θ
μ
′
)
∣
θ
Q
′
)
L
=
1
N
∑
i
(
y
i
−
Q
(
s
i
,
a
i
∣
θ
Q
)
)
2
y_{i}=r_{i}+\gamma Q^{\prime}\left(s_{i+1}, \mu^{\prime}\left(s_{i+1} | \theta^{\mu^{\prime}}\right) | \theta^{Q^{\prime}}\right)\\ L=\frac{1}{N} \sum_{i}\left(y_{i}-Q\left(s_{i}, a_{i} | \theta^{Q}\right)\right)^{2}
yi=ri+γQ′(si+1,μ′(si+1∣θμ′)∣θQ′)L=N1i∑(yi−Q(si,ai∣θQ))2
在Critic网络中,最后得到的
Q
=
a
∗
w
1
+
s
∗
w
2
+
b
Q=a*w1+s*w2+b
Q=a∗w1+s∗w2+b,这个a就是从Actor网络中输出的a。DQN的target是得到所有动作的q值取max,而DDPG的Critic是得到一个确定的q值。
PPO
如果一句话概括 PPO: OpenAI 提出的一种解决 Policy Gradient 不好确定 Learning rate (或者 Step size) 的问题。PPO 利用 New Policy 和 Old Policy 的比例, 限制了 New Policy 的更新幅度, 让 Policy Gradient 对稍微大点的 Step size 不那么敏感。
限制的部分就在于actor的更新,A会乘一个新旧概率比,如果差距大优势大那么学习幅度就加大 。
下面是理解后面复杂公式的前提基础:
E
x
∼
p
[
f
(
x
)
]
=
∫
f
(
x
)
p
(
x
)
d
x
=
∫
f
(
x
)
p
(
x
)
q
(
x
)
q
(
x
)
d
x
=
E
x
∼
q
[
f
(
x
)
p
(
x
)
q
(
x
)
]
E_{x \sim p}[f(x)]=\int f(x) p(x) d x=\int f(x) \frac{p(x)}{q(x)} q(x) d x=E_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right]
Ex∼p[f(x)]=∫f(x)p(x)dx=∫f(x)q(x)p(x)q(x)dx=Ex∼q[f(x)q(x)p(x)]
下面的新旧概率的比值要理解on-policy ,off-policy的问题,正是因为在PG算法中的每轮的更新需要采取一回合的数据来训练,这个取样所花的时间就很多,所以这个地方改进了算法,让一个
θ
′
\theta'
θ′策略来取样,取样数据拿来在训练
θ
\theta
θ策略
G
r
a
d
i
e
n
t
f
o
r
u
p
d
a
t
e
=
E
(
s
t
,
a
t
)
∼
π
θ
[
A
θ
(
s
t
,
a
t
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
]
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
s
t
,
a
t
)
P
θ
′
(
s
t
,
a
t
)
A
θ
′
(
s
t
,
a
t
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
]
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
p
θ
(
s
t
)
p
θ
′
(
s
t
)
A
θ
′
(
s
t
,
a
t
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
]
#
令
p
θ
(
s
t
)
p
θ
′
(
s
t
)
=
1
,
人
为
使
得
,
因
为
这
个
式
子
不
好
算
#
∇
f
(
x
)
=
f
(
x
)
∇
log
f
(
x
)
上
面
的
式
子
是
∇
,
下
面
的
是
原
来
的
式
子
J
θ
′
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
A
θ
′
(
s
t
,
a
t
)
]
Gradient\;for\;update \\ =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta}}\left[A^{\theta}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] \\ =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{P_{\theta}\left(s_{t}, a_{t}\right)}{P_{\theta^{\prime}}\left(s_{t}, a_{t}\right)} A^{\theta'}(s_t,a_t) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] \\ =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} \frac{p_{\theta}\left(s_{t}\right)}{p_{\theta^{\prime}}\left(\mathbf{s}_{t}\right)} A^{\theta'}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right]\\ \# 令\frac{p_{\theta}(s_t)}{p_{\theta'}(s_t)}=1,人为使得,因为这个式子不好算\\ \# \nabla f(x)=f(x) \nabla \log f(x)\;上面的式子是\nabla,下面的是原来的式子\\ J^{\theta^{\prime}}(\theta)=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right]
Gradientforupdate=E(st,at)∼πθ[Aθ(st,at)∇logpθ(atn∣stn)]=E(st,at)∼πθ′[Pθ′(st,at)Pθ(st,at)Aθ′(st,at)∇logpθ(atn∣stn)]=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)pθ′(st)pθ(st)Aθ′(st,at)∇logpθ(atn∣stn)]#令pθ′(st)pθ(st)=1,人为使得,因为这个式子不好算#∇f(x)=f(x)∇logf(x)上面的式子是∇,下面的是原来的式子Jθ′(θ)=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]
后面加入的KL惩罚项是想让 p θ p θ ′ \frac{p_{\theta}}{p_{\theta'}} pθ′pθ不要相差太多,所以给出了一个惩罚项,相差太多之后,这样的计算方式就会出现问题。
Actor更新有两种方式:(最大化L)
第一个是用KL pernaty:
L
K
L
P
E
N
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
π
θ
(
a
t
∣
s
t
)
π
θ
o
l
d
(
a
t
∣
s
t
)
A
^
t
−
β
K
L
[
π
θ
o
l
d
(
⋅
∣
s
t
)
,
π
θ
(
⋅
∣
s
t
)
]
]
L^{K L P E N}(\theta)=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\mathrm{old}}}\left(a_{t} | s_{t}\right)} \hat{A}_{t}-\beta \mathrm{KL}\left[\pi_{\theta_{\mathrm{old}}}\left(\cdot | s_{t}\right), \pi_{\theta}\left(\cdot | s_{t}\right)\right]\right]
LKLPEN(θ)=E(st,at)∼πθ′[πθold(at∣st)πθ(at∣st)A^t−βKL[πθold(⋅∣st),πθ(⋅∣st)]]
第二个是用clipped surrogate objective:
L
C
L
I
P
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
min
(
[
π
θ
(
a
t
∣
s
t
)
π
θ
old
(
a
t
∣
s
t
)
A
^
t
]
A
^
t
,
clip
(
π
θ
(
a
t
∣
s
t
)
π
θ
old
(
a
t
∣
s
t
)
,
1
−
ϵ
,
1
+
ϵ
)
A
^
t
)
]
L^{C L I P}(\theta)=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\min \left(\left[\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} | s_{t}\right)} \hat{A}_{t}\right]\hat{A}_{t}, \operatorname{clip}\left(\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} | s_{t}\right)}, 1-\epsilon, 1+\epsilon\right) \hat{A}_{t}\right)\right]
LCLIP(θ)=E(st,at)∼πθ′[min([πθold (at∣st)πθ(at∣st)A^t]A^t,clip(πθold (at∣st)πθ(at∣st),1−ϵ,1+ϵ)A^t)]
Critic的更新方式:(最小化loss,这里就和AC算法一模一样)
l
o
s
s
=
(
r
+
γ
∗
v
_
−
v
)
2
loss=(r+\gamma*v\_-v)^2
loss=(r+γ∗v_−v)2
之所以有新旧参数,是因为 E ^ t [ π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) A ^ t ] \hat{\mathbf{E}}_{t}\left[\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} | s_{t}\right)} \hat{A}_{t}\right] E^t[πθold (at∣st)πθ(at∣st)A^t],要更新啊。(感觉这里又和DQN有点像)
SAC
soft actor critic 慢AC 算法
这个部分是自己从看论文到实现一整个SAC都实现了,关于论文网上也有很多的内容,也是各有各的讲法,所以也是需要好好的总结一下的。
基于最大熵的强化学习,熵最高的策略具有更高的随机性。在策略中允许高度随机的动作,更能够顺利的适应预期之外的干扰。是off-policy的。增加熵也就说明策略的随机性增强,所以会增加更多的探索,从而可以加快后续的学习速度。
总结归纳
-
RL的四个要素:
策略
1)确定策略: a = π ( s ) a=\pi(s) a=π(s)
2)随机策略: π ( a ∣ s ) = p [ a t = a ∣ s t = s ] \pi(a|s)=p[a_t=a|s_t=s] π(a∣s)=p[at=a∣st=s]
奖励函数:
r 这个不用多说
累计奖励函数:(需补充)
V 一个策略的优劣取决于长期执行这一策略后的累积奖励,常见的长期累积奖励:
1) V π ( s ) = E π [ ∑ i = 1 h r i ∣ s 0 = s ] V^{\pi}(s)=E_{\pi}\left[\sum_{i=1}^{h} r_{i} | s_{0}=s\right] Vπ(s)=Eπ[i=1∑hri∣s0=s]
2) V π ( s ) = lim h → ∞ E π [ 1 h ∑ i = 1 h r i ∣ s 0 = s ] V^{\pi}(s)=\lim _{h \rightarrow \infty} E_{\pi}\left[\frac{1}{h} \sum_{i=1}^{h} r_{i} | s_{0}=s\right] Vπ(s)=h→∞limEπ[h1i=1∑hri∣s0=s]
3) V π ( s ) = E π [ ∑ i = 1 ∞ γ i − 1 r i ∣ s 0 = s ] V^{\pi}(s)=E_{\pi}\left[\sum_{i=1}^{\infty} \gamma^{i-1} r_{i} | s_{0}=s\right] Vπ(s)=Eπ[i=1∑∞γi−1ri∣s0=s],如:Sarsa-lambda,GD等
4)…
上面这些大多用在后面的加入了神经网络的RL算法中间。作为placeholder输入进行训练的。
模型:
所有强化学习都是马尔科夫决策的过程:(需补充)
附录一
PG算法使用的是交叉熵,SAC算法使用的是相对熵(KL散度),那么为什么在强化学习中会用到熵呢?
熵(信息熵)
熵用来衡量一个系统的混乱程度,代表系统中信息量的总和;熵值越大,表明这个系统的不确定性就越大。 信息量是衡量某个事件的不确定性,而熵是衡 量一个系统的不确定性。
一般我们使用:
信
息
熵
=
∑
x
=
1
n
(
信
息
x
发
生
的
概
率
∗
验
证
信
息
x
需
要
的
信
息
)
信息熵=\sum_{x=1}^n (信息x发生的概率*验证信息x需要的信息)
信息熵=x=1∑n(信息x发生的概率∗验证信息x需要的信息)
信息熵就是所有信息的期望:
H
(
p
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
H(p)=-\sum_{i=1}^n p(x_i)log(p(x_i))
H(p)=−i=1∑np(xi)log(p(xi))
其中
I
(
x
)
=
−
l
o
g
(
p
(
x
)
)
I(x)=-log(p(x))
I(x)=−log(p(x)) 表示的就是信息量,负号是为了保证信息量为非负数。
那为什么信息量这样表示呢?
假设我们有两个不相关的x和y时间,两个事件同时发生的获得的信息量就是各个事件信息量的和,即为
I(x,y)=I(x)+I(y) 。因为两个事件独立不相关,所以p(x,y)=p(x)p(y) 。我们取对数就可以得到log p(x,y)=log p(x)+log q(x) . 我们想要让信息熵最小(消除不确定性),那么就是为0嘛!所以就是I(x)= - log p(x) . 这个负号有意思,又保证了信息量为非负数,又与p(x)成了反比。
交叉熵
表示使用分布q(x)表示目标分布p(x)的困难程度。
交叉熵的公式:
H
(
p
,
q
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
H(p,q)=-\sum_{i=1}^n p(x_i)log(q(x_i))
H(p,q)=−i=1∑np(xi)log(q(xi))
一般p(x)表示真实分布,q(x)表示模型的预测分布
相对熵(KL散度)
表示同一个随机变量的两个不同分布间的距离。
对于一个随机变量x有两个单独的概率分布p(x)和q(x),那么相对熵:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
/
q
(
x
i
)
)
=
∑
i
=
1
m
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
−
∑
i
=
1
m
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
=
−
H
(
p
)
+
H
(
p
,
q
)
D_{KL}(p||q)=\sum_{i=1}^np(x_i)log(p(x_i)/q(x_i))\\ =\sum_{i=1}^mp(x_i)log(p(x_i))-\sum_{i=1}^mp(x_i)log(q(x_i))\\ =-H(p)+H(p,q)
DKL(p∣∣q)=i=1∑np(xi)log(p(xi)/q(xi))=i=1∑mp(xi)log(p(xi))−i=1∑mp(xi)log(q(xi))=−H(p)+H(p,q)
总的来说,相对熵是用来衡量同一个随机变量的两个不同分布之间的距离。在实际应用中,假如p(x)p(x)是目标真实的分布,而q(x)q(x)是预测得来的分布,为了让这两个分布尽可能的相同的,就需要最小化KL散度。
所以为什么计算loss我们使用相对熵(SAC算法),因为我们可以得到:
相对熵=交叉熵 - 信息熵 $ D_{KL}(p,q)=H(p,q)-H§$
因为一般p(x)是目标(训练数据)的分布,是固定的,有时候最小化相对熵也等于最小化交叉熵。
所以经常看到把交叉熵当做loss,交叉熵损失函数:
L
o
s
s
=
−
[
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
]
Loss=-[ylog\hat y+(1-y)log(1-\hat y)]
Loss=−[ylogy^+(1−y)log(1−y^)]
最大似然估计( max linkehood estimate)
通过若干次试验,观察其结果,利用试验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。
设有一组训练样本$X={x1,x2,⋯,xm}
,
该
样
本
的
分
布
为
,该样本的分布为
,该样本的分布为p(x)$ 。假设使用
θ
θ
θ 参数化模型得到
q
(
x
;
θ
)
q(x;θ)
q(x;θ) ,现用这个模型来估计X 的概率分布,得到似然函数
L
(
θ
)
=
q
(
X
;
θ
)
=
∏
i
m
q
(
x
i
;
θ
)
L(θ)=q(X;θ)=\prod _i^m q(x_i;θ)
L(θ)=q(X;θ)=i∏mq(xi;θ)
最大似然估计就是求得
θ
θ
θ使得
L
(
θ
)
L(θ)
L(θ) 的值最大,也就是
θ
M
L
=
arg
max
θ
∏
i
m
q
(
x
i
;
θ
)
θ_{ML}=\arg\max_θ \prod _i^m q(x_i;θ)
θML=argθmaxi∏mq(xi;θ)
对上式的两边同时取log,乘积变成加法 ,等价优化log的最大似然估计即log-likelyhood
,最大对数似然估计
θ
M
L
=
arg
max
θ
∑
i
m
log
q
(
x
i
;
θ
)
θ_{ML}=\arg\max_θ\sum_i^m \log q(x_i;θ)
θML=argθmaxi∑mlogq(xi;θ)
对上式的右边进行缩放并不会改变argmax 的解,上式的右边除以样本的个数m
θ
M
L
=
arg
max
θ
1
m
∑
i
m
log
q
(
x
i
;
θ
)
θ_{ML}=\arg\max_\theta \frac{1}{m} \sum_i^m\log q(x_i;θ)
θML=argθmaxm1i∑mlogq(xi;θ)
上式就是求随机变量X的函数
log
(
X
;
θ
)
\log(X;\theta)
log(X;θ) 的均值,根据大数定理,随着样本容量的增加,样本的算术平均值将趋近与随机变量的期望
1
m
∑
i
m
log
q
(
x
i
;
θ
)
→
E
x
∼
P
(
log
q
(
x
;
θ
)
)
\frac{1}{m}\sum_i^m \log q(x_i;\theta) \rightarrow E_{x \sim P}(\log q(x;\theta))
m1i∑mlogq(xi;θ)→Ex∼P(logq(x;θ))
于是最大化似然估计变成了:(x是训练样本,所以才是x~p的分布)
θ
M
L
=
arg
max
θ
E
x
∼
P
(
log
q
(
x
;
θ
)
)
=
arg
min
θ
E
x
∼
p
(
−
log
q
(
x
;
θ
)
)
\theta_{ML}=\arg\max_\theta E_{x\sim P}(\log q(x;\theta))\\ =\arg\min_\theta E_{x \sim p}(-\log q(x;\theta))
θML=argθmaxEx∼P(logq(x;θ))=argθminEx∼p(−logq(x;θ))
然后我们在看看KL散度:
D
K
L
(
p
∥
q
)
=
∑
i
p
(
x
i
)
log
(
p
(
x
i
)
q
(
x
i
)
)
=
E
x
∼
p
(
log
p
(
x
)
q
(
x
)
)
=
E
x
∼
p
(
log
p
(
x
)
−
log
q
(
x
)
)
=
E
x
∼
p
(
log
p
(
x
)
)
−
E
x
∼
p
(
log
q
(
x
)
)
\begin{aligned} D_{K L}(p \| q) &=\sum_{i} p\left(x_{i}\right) \log \left(\frac{p\left(x_{i}\right)}{q\left(x_{i}\right)}\right) \\ &=E_{x \sim p}\left(\log \frac{p(x)}{q(x)}\right) \\ &=E_{x \sim p}(\log p(x)-\log q(x)) \\ &=E_{x \sim p}(\log p(x))-E_{x \sim p}(\log q(x)) \end{aligned}
DKL(p∥q)=i∑p(xi)log(q(xi)p(xi))=Ex∼p(logq(x)p(x))=Ex∼p(logp(x)−logq(x))=Ex∼p(logp(x))−Ex∼p(logq(x))
前一个式子是固定的,所以最小化交叉熵就和最大化对数似然估计是等价的。
多分类交叉熵
样本容量的增加,样本的算术平均值将趋近与随机变量的期望**
1
m
∑
i
m
log
q
(
x
i
;
θ
)
→
E
x
∼
P
(
log
q
(
x
;
θ
)
)
\frac{1}{m}\sum_i^m \log q(x_i;\theta) \rightarrow E_{x \sim P}(\log q(x;\theta))
m1i∑mlogq(xi;θ)→Ex∼P(logq(x;θ))
于是最大化似然估计变成了:(x是训练样本,所以才是x~p的分布)
θ
M
L
=
arg
max
θ
E
x
∼
P
(
log
q
(
x
;
θ
)
)
=
arg
min
θ
E
x
∼
p
(
−
log
q
(
x
;
θ
)
)
\theta_{ML}=\arg\max_\theta E_{x\sim P}(\log q(x;\theta))\\ =\arg\min_\theta E_{x \sim p}(-\log q(x;\theta))
θML=argθmaxEx∼P(logq(x;θ))=argθminEx∼p(−logq(x;θ))
然后我们在看看KL散度:
D
K
L
(
p
∥
q
)
=
∑
i
p
(
x
i
)
log
(
p
(
x
i
)
q
(
x
i
)
)
=
E
x
∼
p
(
log
p
(
x
)
q
(
x
)
)
=
E
x
∼
p
(
log
p
(
x
)
−
log
q
(
x
)
)
=
E
x
∼
p
(
log
p
(
x
)
)
−
E
x
∼
p
(
log
q
(
x
)
)
\begin{aligned} D_{K L}(p \| q) &=\sum_{i} p\left(x_{i}\right) \log \left(\frac{p\left(x_{i}\right)}{q\left(x_{i}\right)}\right) \\ &=E_{x \sim p}\left(\log \frac{p(x)}{q(x)}\right) \\ &=E_{x \sim p}(\log p(x)-\log q(x)) \\ &=E_{x \sim p}(\log p(x))-E_{x \sim p}(\log q(x)) \end{aligned}
DKL(p∥q)=i∑p(xi)log(q(xi)p(xi))=Ex∼p(logq(x)p(x))=Ex∼p(logp(x)−logq(x))=Ex∼p(logp(x))−Ex∼p(logq(x))
前一个式子是固定的,所以最小化交叉熵就和最大化对数似然估计是等价的。
多分类交叉熵
二分类交叉熵