这里写自定义目录标题
强化学习记录(一)
参考:https://blog.csdn.net/App_12062011/article/details/92075589
1.强化学习初步理解
强化学习是在实践中学习的过程,比如学习走路的过程,如果摔倒了则大脑会给予我们一个负的反馈值,我们从失败中获得知识,重新学习,如果后面走路没有摔倒,大脑会给与一个正的反馈值,我们通过学习就知道如何走路才不会摔倒了。
强化学习是和监督学习,非监督学习并列的第三种机器学习方法:
强化学习与监督学习相比较没有监督学习已经准备好的训练数据输出值。强化学习只有奖励值,但是这个奖励值和监督学习的输出值不一样,他不是事先给出的,而是延后给出的,上面例子是走路摔倒了才得到了大脑的奖励值。同时,强化学习的每一步与时间顺序先后关系紧密。而监督学习的训练数据之间一般都是独立的,没有这种前后的依赖关系。
强化学习与非监督学习的区别,非监督学习没有输出值也没有奖励值,他只有数据特征。同监督学习一样,他们的数据之间是独立的,没有前后的依赖关系。
2.强化学习建模
上面的大脑代表算法执行个体,我们可以操作个体来做决策,即选择一个合适的动作(Action)At。下面的地球代表我们要研究的环境,它有自己的状态模型,我们选择了动作At后,环境的状态(State)会变,我们会发现环境状态已经变为St+1,同时我们得到了我们采取动作At的延时奖励(Reward)Rt+1。然后个体可以继续选择下一个合适的动作,然后环境的状态又会变,又有新的奖励值。
1.环境状态
S
S
S,t时刻环境的状态St是他的环境状态集合中的某一个状态。
2.个体的动作
A
A
A,t时刻个体采取的动作At是他的动作集合中的某一个动作。
3.环境的奖励
R
R
R,t时刻个体咋状态St采取的动作At对应的奖励Rt+1会在
t
+
1
t+1
t+1时刻得到。
4.个体的策略
(
P
o
l
i
c
y
)
π
(Policy)π
(Policy)π,他代表个体采取动作的依据,即个体会依据策略π来选择动作。最常见的策略表达方式为一个条件概率分布π(a|s),表示在状态s是采取动作a的概率。
π
(
a
∣
s
)
=
P
(
A
t
=
a
∣
S
t
=
s
)
π(a|s)=P(At=a|St=s)
π(a∣s)=P(At=a∣St=s),此时概率大的动作被个体选中。
5.个体在策略
π
π
π和状态
s
s
s时,采取行动后的值
(
v
a
l
u
e
)
(value)
(value),一般用
v
π
(
s
)
vπ(s)
vπ(s)表示。这个价值一般是一个期望函数。虽然当前动作会给一个延时奖励
R
(
t
+
1
)
R(t+1)
R(t+1),但是观看这个延时奖励是不够的,因为当前的延时奖励高并不代表
t
+
1
,
t
+
2...
t+1,t+2...
t+1,t+2...的后续时刻延时奖励也高。比如下象棋,我们的某个动作可以吃掉对方的一个车,但是后面我们就输棋了,此时这个车的动作的奖励值
(
r
e
w
a
r
d
)
(reward)
(reward)高,但是价值
(
v
a
l
u
e
)
(value)
(value)并不高。这就需要我们考虑当前的延时奖励和后续的延时奖励,价值函数
v
π
(
s
)
vπ(s)
vπ(s)一般可以表示为下式,不同的算法可能有一些价值函数的变种,但是思路相同。
vπ(s)=?π(Rt+1+γRt+2+γ2Rt+3+…|St=s)
6.奖励衰减因子
γ
γ
γ,
γ
∈
[
0
,
1
]
γ∈[0,1]
γ∈[0,1],如果
γ
=
0
γ=0
γ=0,则是贪婪法,即价值只有当前的奖励决定,如果
γ
=
1
γ=1
γ=1,则所有后续状态奖励与当前奖励一视同仁。大多数时候,会在0 1之间去一个数字,当前延时奖励的权重比后续的权重大。
7.环境的状态转换模型,可理解为一个概率状态机,他可以表示为一个概率模型,即在状态
s
s
s下采取动作
a
a
a,转到下一个状态
s
′
s'
s′的概率,通常表示为
P
s
s
′
a
P_{ss'}^{a}
Pss′a
8.探索率
ϵ
ϵ
ϵ,这个参数主要应用在强化学习训练迭代过程中,由于我们一般会选择使用前轮迭代价值最大的动作,但是这会导致一些较好的但是我们没有执行过的动作被错过。因此我们在训练选择最优动作是,会有一定的概率ϵ不选择是当前轮迭代价值最大的动作,而是选择其他动作。
3.强化学习的简单实例
这里给出一个简单的强化学习例子Tic-Tac-Toe。这是一个简单的游戏,在一个3x3的九宫格里,两个人轮流下,直到有个人的棋子满足三个一横一竖或者一斜,赢得比赛游戏结束,或者九宫格填满也没有人赢,则和棋。
1.环境状态
S
S
S,这是一个九宫格,每个格子有三种状态,没有棋子(0),有第一个选手的棋子(1),有第二个选手的棋子(-1),那么模型状态共有
3
9
=
19683
3^{9}=19683
39=19683种。
2.个体的动作
A
A
A,这里有9个格子,每次只能下一步,所以最多有9个动作选择,实际上已经下的格子上不能再下棋子了,因此动作选择项会更少,实际上可以选择的动作是那些取值为0的格子。
3.环境的奖励
R
R
R,这个一般是自己设计,由于我们的目的是赢棋,所以如果某个动作导致的改变到的状态可以使我们赢棋,结束游戏,那么奖励值是最高的,反之奖励值最低。其余的双方下棋都有奖励值,但奖励值特别少。特别的,对于先下的棋手,不会导致结束的动作奖励要比后下的棋手少。
# give reward to two players
def giveReward(self):
if self.currentState.winner == self.p1Symbol:
self.p1.feedReward(1)
self.p2.feedReward(0)
elif self.currentState.winner == self.p2Symbol:
self.p1.feedReward(0)
self.p2.feedReward(1)
else:
self.p1.feedReward(0.1)
self.p2.feedReward(0.5)
4.个体的策略 π π π,这个一般是学习得到的,我们在每轮较大的概率选择当前价值最高的动作,同时以较小的概率去探索新动作。 e x p l o r e R a t e exploreRate exploreRate就是探索率 ϵ ϵ ϵ。即策略以 1 − ϵ 1-ϵ 1−ϵ的概率选择当前最大价值的动作,以 ϵ ϵ ϵ的概率随机选择新动作。
# determine next action
def takeAction(self):
state = self.states[-1]
nextStates = []
nextPositions = []
for i in range(BOARD_ROWS):
for j in range(BOARD_COLS):
if state.data[i, j] == 0:
nextPositions.append([i, j])
nextStates.append(state.nextState(i, j, self.symbol).getHash())
if np.random.binomial(1, self.exploreRate):
np.random.shuffle(nextPositions)
# Not sure if truncating is the best way to deal with exploratory step
# Maybe it's better to only skip this step rather than forget all the history
self.states = []
action = nextPositions[0]
action.append(self.symbol)
return action
values = []
for hash, pos in zip(nextStates, nextPositions):
values.append((self.estimations[hash], pos))
np.random.shuffle(values)
values.sort(key=lambda x: x[0], reverse=True)
action = values[0][1]
action.append(self.symbol)
return action
5.价值函数,代码里用 v a l u e value value表示。价值函数的更新代码里只考虑了当前动作的现有价值和得到的奖励两部分,可以认为我们的第六个模型要素衰减因子 γ γ γ为0。具体的代码部分如下,价值更新部分的代码加粗。具体为什么会这样更新价值函数我们以后会讲。
# update estimation according to reward
def feedReward(self, reward):
if len(self.states) == 0:
return
self.states = [state.getHash() for state in self.states]
target = reward
for latestState in reversed(self.states):
value = self.estimations[latestState] + self.stepSize * (target - self.estimations[latestState])
self.estimations[latestState] = value
target = value
self.states = []
6.环境的状态转化模型, 这里由于每一个动作后,环境的下一个模型状态是确定的,也就是九宫格的每个格子是否有某个选手的棋子是确定的,因此转化的概率都是1,不存在某个动作后会以一定的概率到某几个新状态,比较简单。