随机抽样
from numpy.random import choice
classes = ['R','G','B']
size = 50
p = [0.1, 0.6, 0.3]
result = choice(classes, size, p)
print(type(result), result.shape)
result
reinforcement learning 专有名词
-
state:状态
-
action:行为
-
Agent:智能体,行为的主体
-
episode:回合
-
policy:根据state做出决策
policy function Π \Pi Π :概率密度函数,条件概率
Π ( a ∣ s ) = P ( A = a ∣ S = s ) \Pi(a|s) = P(A=a|S=s) Π(a∣s)=P(A=a∣S=s) :在状态s下做出a行为的概率
强化学习的目的就是通过训练得到policy函数,随机性
-
reward:奖励,强化学习旨在得到最高的奖励
-
state transition:状态转换,一个动作后给出一个新状态,随机性
状态转移条件概率: p ( s ′ ∣ s , a ) = P ( S ′ = s ′ ∣ S = s , A = a ) p(s'|s,a) = P(S' = s'|S=s,A=a) p(s′∣s,a)=P(S′=s′∣S=s,A=a)
意思是在状态s下做出a行为得到s‘状态的概率
-
Agent & environment
Agent在当前状态 S t S_t St下根据environment做出一个行为action a t a_t at,环境会根据这个
action给Agent一个奖励Reward r t r_t rt -
游戏轨迹trajectory (state,action,reward)——一个序列
-
Return 回报
未来累计回报: U t = R t + R t + 1 + R t + 2 + . . . U_t=R_t+R_{t+1}+R_{t+2}+... Ut=Rt+Rt+1+Rt+2+...由于未来回报的不确定性,所以要使用折扣回报来就按未来的累计回报
-
Discounted return
γ \gamma γ: discount rate 是一个超参数,需要自己调整设置U t = R t + γ R t + 1 + γ 2 R t + 2 + γ 3 R t + 3 + . . . U_t=R_t+\gamma R_{t+1}+\gamma^{2}R_{t+2}+\gamma^{3}R_{t+3}+... Ut=Rt+γRt+1+γ2Rt+2+γ3Rt+3+...
当奖励未知时,用大写字母R表示,这是一个随机变量,在结束后,奖励变为已知,此时用小写字母r表示,U也是随机变量
-
RL中的随机性
- 行为随机(action):对于给定的状态,agent做出的行为是随机的 P ( A = a ∣ S = s ) = π ( a ∣ s ) P(A=a|S=s)=\pi(a|s) P(A=a∣S=s)=π(a∣s)
- 状态转换随机(state transition):对于给定的状态和行为状态的转换是随机的
P
(
S
′
=
s
′
∣
S
=
s
,
A
=
a
)
=
p
(
s
′
∣
s
,
a
)
P(S'=s'|S=s,A=a)=p(s'|s,a)
P(S′=s′∣S=s,A=a)=p(s′∣s,a)
对于任意时刻i>t,回报是依赖于当前的状态和行为,也就是说在这个状态下做出这个行为所得到的回报
value function
-
价值函数:Agent处于某种状态时的价值,状态值函数描述了给定状态的收获( G_t)的期望,状态值函数是针对策略而定义的,因为预期回报取决于策略
v π ( s ) = E π ( Q t ∣ S t = s t ) v_\pi(s)=E_\pi(Q_t|S_t=s_t) vπ(s)=Eπ(Qt∣St=st) -
Q ( s , a ) Q(s,a) Q(s,a):policy π \pi π的动作价值函数
根据策略 π 选择动作 a,则状态的动作值是预期回报
Q π ( s t , a t ) = E ( U t ∣ S t = s t , A t = a t ) Q_{\pi}(s_t,a_t)=E(U_t|S_t=s_t,A_t=a_t) Qπ(st,at)=E(Ut∣St=st,At=at)
U t U_t Ut是依赖于未来的状态S和未来的行为A
使用期望可以将 S t , A t S_t,A_t St,At给消去(连续函数是积分、离散的权重加)
Q π Q_\pi Qπ 依赖于policy函数和 s t , a t s_t,a_t st,at
已知policy函数 π \pi π,则 Q π Q_\pi Qπ会给当前状态下的action打分
- Optimal action-value function最优动作价值函数
Q ∗ ( s t , a t ) = m a x π Q π ( s t , a t ) Q^*(s_t,a_t)=\mathop{max}\limits_\pi Q_\pi(s_t,a_t) Q∗(st,at)=πmaxQπ(st,at)
寻找最优的policy函数来让Q*对当前状态的的动作做出评价
Agent根据Q*对动作的评价来做出决策
-
State-Value Function 状态价值函数
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))
V π V_{\pi} Vπ是 Q π Q_{\pi} Qπ的期望,A是随机变量,关于A求期望,消去A,V就是一个只关于 π \pi π
和s的函数当前状态的价值,当前形势
A π ( ⋅ ∣ s t ) A~\pi (\cdot|s_t) A π(⋅∣st)
- 当随机变量为离散型时: V π ( s t ) = ∑ a π ( a ∣ s t ) ⋅ Q π ( s t , a ) V_{\pi}(s_t)=\sum\limits_{a}\pi(a|s_t)\cdot Q_{\pi}(s_t,a) Vπ(st)=a∑π(a∣st)⋅Qπ(st,a)
- 当随机变量为连续型时: V π ( s t ) = ∫ π ( a ∣ s t ) ⋅ Q π ( s t , a ) d a V_{\pi}(s_t)=\int \pi(a|s_t) \cdot Q_{\pi}(s_t,a)da Vπ(st)=∫π(a∣st)⋅Qπ(st,a)da
-
总结:
- 动作价值函数:对于policy π, Q π Q_{\pi} Qπ表示在状态s下做出动作a的的价值
- 状态价值函数:对于policy π, V π V_{\pi} Vπ表示当前状态的好坏,比如说在围棋中,当前棋局的局势
- V π V_{\pi} Vπ可以评价策略π的好坏,其平均值越大表示策略policy越好
RL examples
使用RL来控制agent可以使用policy π 或者Q*两种方式,RL通过训练得到这两个来实现对智能体行为的控制
- policy π:根据当前给出的状态,使用π获取当前状态下做出动作的概率,根据概率随机选取一个动作让智能体agent执行
- Q*(s,a):根据当前给出的状态,对于所有的行为计算出其价值,选择最大价值的行为让智能体agent执行
a t = a r g m a x a Q ∗ ( s t , a ) a_t=argmax_aQ^*(s_t,a) at=argmaxaQ∗(st,a)
import gym
env = gym.make('CartPole-v0')
type(env)
state = env.reset() #重置环境
for t in range(100): #每一轮循环,agent做出动作,环境更新状态
env.render() #渲染,pygame窗口
# print(state) #状态
action = env.action_space.sample() #随机均匀抽样一个动作,实际中会使用policy或者Q*得到action
state,reward,done,info = env.step(action) #agent做动作,返回信息
if done: #游戏结束
print("finished")
break
env.close()
import gym
env = gym.make("CartPole-v1")
observation, info = env.reset(seed=42, return_info=True)
for _ in range(1000):
env.render()
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
observation, info = env.reset(return_info=True)
env.close()
总结
强化学习的目的:
学会控制agent,使agent基于当前状态s做出动作a,使其在未来能够得到尽可能多的奖励