强化学习是代理面临的学习问题,它经过与动态环境反复交互试验从而学习到某种行为。它是机器学习的主要学习方法之一,智能体从环境到行为的学习,也就是如何在环境中采起一些列行为,才能使得回报信号函数的值最大,即得到的累积回报最大。mysql
如今强化学习与深度学习结合的深度强化学习更增强大。git
在理解强化学习以前,咱们先了解咱们要解决什么样的问题。其实强化学习过程就是优化马尔科夫决策过程,它由一个数学模型组成,该模型在代理的控制下对随机结果进行决策。github
代理能够执行某些动做,例如上下左右移动,这些动做可能会获得一个回报,回报能够是正数也能够是负数,它会致使总分数变更。同时动做能够改变环境并致使一个新的状态,而后代理能够执行另一个动做。状态、动做和回报的集合、转换规则等,构成了马尔科夫决策过程。sql
强化学习训练主要就是计算各个状态下不一样动做的回报,并不是瞬间完成的,而是要通过大量尝试。下一个状态取决于当前状态和动做,而且状态不依赖于先前的状态,没有记忆,符合马尔可夫性。数组
强化学习是agent与环境之间的迭代交互,须要考虑几点:bash
Q学习便是学习不一样状态下各个动做的质量,它定义为网络
它一样能够变换成Bellman Equation形态,并发
最优动做价值函数,app
能够看到最大化当前的动做价值函数就是最大化当前回报和下一时刻状态的最优动做价值函数。dom
动做价值函数虽然能直接计算出Q值,但实际学习时并无直接使用该Q值来更新,而是经过渐进的方式来更新。学习的方法可用以下伪代码说明,首先初始化Q学习的状态集和动做集组成的数组,而后观察初始状态,接着不断重复执行:选择一个动做,观察回报并转移到新状态,更新Q学习数组值,涉及迭代方式更新,因为咱们不能知道下一刻状态的Q值,因此更新时用以前迭代的Q值来更新这次迭代的Q值,其中α表示学习率。
initialize Q[numstates,numactions] arbitrarily
observe initial state s
repeat
select and carry out an action a
observe reward R and new state s' Q[s,a] = Q[s,a] + α(R + γmaxa'Q[s',a'] - Q[s,a])
s = s' until terminated 复制代码
有个小游戏,以下图,进入入口后初始位置为A,阴影部分表示大炕,踩进去就没命了得重来,操做能够上下左右,最终走到H位置就算胜利。
先定义地图的大小,以及大坑的位置、入口和出口。
ROWS = 5
COLUMNS = 6
ENTRANCE = (0, 0)
EXIT = (4, 5)
BARRIERS = list()
BARRIERS.append((1, 1))
BARRIERS.append((2, 1))
BARRIERS.append((3, 1))
BARRIERS.append((4, 1))
BARRIERS.append((0, 3))
BARRIERS.append((1, 3))
BARRIERS.append((3, 3))
BARRIERS.append((4, 3))
BARRIERS.append((3, 4))
BARRIERS.append((1, 5))
复制代码
定义Q学习的一些参数设置,TIMES为尝试次数,R为随机因子,ALPHA为学习率,GAMMA为折扣因子,q_values为q值表,results为最终结果。
TIMES = 200
R = 0.05
ALPHA = 0.1
GAMMA = 0.9
q_values = dict()
results = list()
复制代码
初始化q值表,按照行数列数和动做初始化全部q值。
def init_q_values():
for row in range(0, ROWS):
for col in range(0, COLUMNS):
state = State(row, col)
for action in Actions:
q = (state.row, state.col, action)
q_values[q] = 0
复制代码
定义某个状态执行某个动做后获得的新状态,其中要考虑到地图的边缘。
def move(curr_state, action):
new_state = State(curr_state.row, curr_state.col)
# check borders
if action == Actions.up:
if (new_state.row - 1) >= 0:
new_state.row -= 1
elif action == Actions.down:
if (new_state.row + 1) <= (ROWS - 1):
new_state.row += 1
elif action == Actions.left:
if (new_state.col - 1) >= 0:
new_state.col -= 1
elif action == Actions.right:
if (new_state.col + 1) <= (COLUMNS - 1):
new_state.col += 1
return new_state
复制代码
定义每一步的探索方法,分别执行不一样动做找到最优的动做,此外还须要有必定几率的随机动做选择。
def explore(curr_state):
rand = random.random()
if rand <= R:
return random.choice(list(Actions))
else:
best = list()
best_action = Actions.up
best_value = -10000000
for action in Actions:
q = (curr_state.row, curr_state.col, action)
if q_values[q] > best_value:
best_action = action
best_value = q_values[q]
best.append(best_action)
# perhaps it has not only one best action
for action in Actions:
q = (curr_state.row, curr_state.col, action)
if action != best_action:
if q_values[q] == best_value:
best.append(action)
return random.choice(best)
复制代码
定义更新状态操做,一旦选出最优的动做后将进行状态的更新,也就是更新q值表,若是到达出口则回报为0,若是掉入大坑则回报为-100。
def update(curr_state, last_action):
q = (curr_state.row, curr_state.col, last_action)
new_state = move(curr_state, last_action)
position = (new_state.row, new_state.col)
reward = -1
if position == EXIT:
reward = 0
elif position in BARRIERS:
reward = -100
old_value = q_values[q]
max_new = max([q_values[(new_state.row, new_state.col, a)] for a in Actions])
q_values[q] = old_value + ALPHA * (reward + (GAMMA * max_new) - old_value)
curr_state.row = new_state.row
curr_state.col = new_state.col
复制代码
好比咱们训练200次后,最终根据q值表就能够找到最佳的执行动做序列以下,说明通过这些动做操做后能成功到达出口。
Actions.right
Actions.right
Actions.down
Actions.down
Actions.right
Actions.right
Actions.right
Actions.down
Actions.down
Actions.down
复制代码
-------------推荐阅读------------
个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
跟我交流,向我提问:
欢迎关注: