1 概述

强化学习是机器学习里面的一个分支。它强调如何基于环境而行动,以取得最大化的预期收益。其灵感来源于心理学中的行为主义理论,既有机体如何在环境给予的奖励或者惩罚的刺激下,逐步形成对刺激的预期,产生能够最大利益的习惯性行为。结构简图如下:

因为强化学习考虑到了自主个体、环境、奖励等因素,所以很多人包括强化学习的研究者Richard Sutton 都认为它是人工智能中最高层的模型,其它深度学习、机器学习模型都是它的子系统。

在围棋界先后打败世界冠军的李世乭和柯洁额alphaGo就使用了强化学习模型,也正是这两次比赛,把人工智能这个概念传递给了大众。

2 结构

智能体(Agent):智能体的结构可以是一个神经网络,可以是一个简单的算法,智能体的输入通常是状态State,输出通常是策略Policy。
动作(Actions):动作空间。比如小人玩游戏,只有上下左右可移动,那Actions就是上、下、左、右。
状态(State):就是智能体的输入
奖励(Reward):进入某个状态时,能带来正奖励或者负奖励。
环境(Environment):接收action,返回state和reward。

3 思想

智能体对环境执行一个动作,环境接收动作后把当前状态和奖励返回给智能体;然后智能体根据环境返回的状态和奖赏执行下一个动作。

4 相关概念

探索(exploration): 不去选择最优解,而是随机选择
开发(exploitation):选择最优解
马尔科夫决策: 马尔科夫决策过程指你接下来的所有状态和决策只取决于你当前的状态和决策。比如你下象棋,你走第四步时,影响你决策和接下来状态的只有第三步。

5 执行过程

拿教电脑玩flappybird游戏来说明:
我们需要确定的两个东西是游戏,一个是电脑,
目的是电脑玩游戏。
游戏接收一个Action操作,Action是一个一维数组,比如a = [0,1] 当a[1] = 1的时候,我们让小鸟向上飞。如果是其它的数,小鸟下落。
游戏返回的是什么呢,游戏返回的是State,reward,terminal。terminal是一个布尔值True或者false,它和reward是对应的。当reward=-1时,terminal为True。reward取值有三种(1,-1,0.1)当crash时为-1,当越过障碍时为1,其它状态为0.1。而State的结构是类似80x80x4这样的图像。
也就是 currentState, reward,newState, terminal是一条数据被保存起来了。

好现在我们有了游戏的输入和输出。
看一下人的输入和输出。这里的人其实就是一个神经网络。
它是边训练,边迭代。
它的输入是state,这个有了。
但是我们还没有y啊 ,没有y我们怎么进行迭代呢。
y的计算方法是:如果停止了,y就等于本次的reward。如果这次没有停止,就等于这次的reward加上下次的价值Q
好了 有了y和x和神经网络的结构
我们的目标函数是二次函数。(y-QValue)^2。

6 推导

就是我们定义一个概念叫价值(Value),就是在某个时刻,某个状态下执行某个动作会得到一个回报(Reward),然后在下一个时刻执行某个动作又会得到一个回报,依次类推。
我们把这些回报累加起来:

这里的G相当于目前状态决策下的总回报。
如果我们把该回报的价值用一个价值函数来表示:
v(s)=E[Gt|St=s] v(s) = E[G_{t}|S_{t} = s] E表示期望
即价值函数为目前状态下回报的期望。
对上式进行展开运算:
v(s)=E[Rt+1+λv(st+1|St=s)] v(s) = E[R_{t+1} + \lambda v(s_{t+1}|S_{t} = s)]
即得到以上贝尔曼方程。当前状态下的价值取决于当前的回报加上之后状态的价值(根据lamda决定其权重)。这其实就相当于一种动态规划的思想。

7 示例 教机器人玩Flappy bird游戏

代码地址(1):https://github.com/yenchenlin1994/DeepLearningFlappyBird
代码地址(2):https://github.com/songrotek/DRL-FlappyBird
两个不同版本都可以实现,我们拿代码1来讲述.

7.1 输入值预处理:

1)把图像大小resize成80x80
2)把图像转换成灰度图
3)把图像二值化,只有黑白两色0或者255。
4)把连续的四帧图像作为一个输入(State)。

x_t = cv2.cvtColor(cv2.resize(x_t, (80, 80)), cv2.COLOR_BGR2GRAY)
ret, x_t = cv2.threshold(x_t,1,255,cv2.THRESH_BINARY)
s_t = np.stack((x_t, x_t, x_t, x_t), axis=2)

7.2 构建智能体

智能体结构图

智能体是一个6层的神经网络
第一层(输入层)是80x80x4:80x80是图片的长宽像素值,4代表每次输入用4帧图片
第二层是20x20x32:20x20代表特征图的长宽,32代表特征图个数
第三层是5x5x64:5x5代表特征图的长宽,64代表特征图个数
第四层是3x3x64 -> 256x1:3x3代表特征图的长宽,64代表特征图的个数
第五层是256x1:256=2x2x64,是矩阵reshape的结果
第六层(输出层)是2x1:2代表向上走的概率和向下走的概率
注:第二层和第三层在图上都有池化,在代码中并没有这个池化操作。

然后是各层的连接方式:
第一层与第二层,第二层与第三层,第三层与第四层是卷积。
第四层与第五层,第五层与第六层是全连接。

def createNetwork():# network weightsW_conv1 = weight_variable([8, 8, 4, 32])b_conv1 = bias_variable([32])W_conv2 = weight_variable([4, 4, 32, 64])b_conv2 = bias_variable([64])W_conv3 = weight_variable([3, 3, 64, 64])b_conv3 = bias_variable([64])W_fc1 = weight_variable([1600, 512])b_fc1 = bias_variable([512])W_fc2 = weight_variable([512, ACTIONS])b_fc2 = bias_variable([ACTIONS])# input layers = tf.placeholder("float", [None, 80, 80, 4])# hidden layersh_conv1 = tf.nn.relu(conv2d(s, W_conv1, 4) + b_conv1)h_pool1 = max_pool_2x2(h_conv1)h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2, 2) + b_conv2)#h_pool2 = max_pool_2x2(h_conv2)h_conv3 = tf.nn.relu(conv2d(h_conv2, W_conv3, 1) + b_conv3)#h_pool3 = max_pool_2x2(h_conv3)#h_pool3_flat = tf.reshape(h_pool3, [-1, 256])h_conv3_flat = tf.reshape(h_conv3, [-1, 1600])h_fc1 = tf.nn.relu(tf.matmul(h_conv3_flat, W_fc1) + b_fc1)# readout layerreadout = tf.matmul(h_fc1, W_fc2) + b_fc2return s, readout, h_fc1

7.3 获取智能体输入和输出

先观察100000次,把观察数据保存,然后在模型输入的时候,把这些数据拿出来作为模型的输入

# store the transition in D
D.append((s_t, a_t, r_t, s_t1, terminal))
...
s_j_batch = [d[0] for d in minibatch]
a_batch = [d[1] for d in minibatch]
r_batch = [d[2] for d in minibatch]
s_j1_batch = [d[3] for d in minibatch]
y_batch = []
readout_j1_batch = readout.eval(feed_dict = {s : s_j1_batch})for i in range(0, len(minibatch)):terminal = minibatch[i][4]# if terminal, only equals rewardif terminal:y_batch.append(r_batch[i])else:y_batch.append(r_batch[i] + GAMMA * np.max(readout_j1_batch[i]))

7.4 迭代训练

train_step = tf.train.AdamOptimizer(1e-6).minimize(cost)

7.5 智能体玩游戏

 # run the selected action and observe next state and reward
x_t1_colored, r_t, terminal = game_state.frame_step(a_t)

8 应用领域

可以应用到游戏控制、机器人手臂控制、推荐系统、自然语言处理上。

强化学习及Python代码示例相关推荐

  1. python代码设置超参数_超参数调优总结,贝叶斯优化Python代码示例

    本文介绍超参数(hyperparameter)的调优方法. 神经网络模型的参数可以分为两类,模型参数,在训练中通过梯度下降算法更新: 超参数,在训练中一般是固定数值或者以预设规则变化,比如批大小(ba ...

  2. 【深度强化学习】MAPPO 代码学习

    [深度强化学习]MAPPO 代码学习 MAPPO 的开源代码库:https://github.com/marlbenchmark/on-policy MAPPO 的主要实现在 onpolicy 中实现 ...

  3. 决策树算法及Python 代码示例

    决策树是一种基于树形结构的算法,用于在一系列决策和结果之间建立模型.它通过对特征和目标变量之间的关系进行划分,来预测目标变量的值. 决策树算法示例: 假设我们有一组数据,其中包含天气,温度,湿度和是否 ...

  4. 新闻采集系统python_抓取网易新闻的python代码示例

    这篇文章主要介绍了Python正则抓取网易新闻的方法,结合实例形式较为详细的分析了Python使用正则进行网易新闻抓取操作的相关实现技巧与注意事项,需要的朋友可以参考下 本文实例讲述了Python正则 ...

  5. Mac,VSCode编写Python代码示例

    Mac,VSCode编写Python代码示例 之前写Python代码一直用的是Pycharm,后来发现VSCode更加直(jian)观(dan)简(cu)洁(bao) ,于是赶紧在官网下载好VSCod ...

  6. 7个流行的强化学习算法及代码实现

    目前流行的强化学习算法包括 Q-learning.SARSA.DDPG.A2C.PPO.DQN 和 TRPO. 这些算法已被用于在游戏.机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改 ...

  7. 简述7个流行的强化学习算法及代码实现!

    目前流行的强化学习算法包括 Q-learning.SARSA.DDPG.A2C.PPO.DQN 和 TRPO.这些算法已被用于在游戏.机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进 ...

  8. python代码示例-总算知道python入门代码示例

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.作为今年来越来越流行的语言,我们该如何学习或者转行学习Python呢,这里小迹为大家介绍如何入门学习Python.以下是小编为你整理 ...

  9. 白话强化学习(理论+代码)

    文章目录 前言 强化学习概述 案例 alphaGo 无人驾驶 why 强化学习特点 基本理论部分 基本概念 马尔可夫模型 马尔可夫链 案例 马尔科夫决策过程 累计回报 概念及其求取流程 案例 算法目的 ...

最新文章

  1. java 对象多属性排序_java list按照元素对象的指定多个字段属性进行排序
  2. java rmi 还有用吗_java rmi使用后的感想
  3. 2.linux换源问题
  4. 移动短信回执怎么开通_才知道移动积分需要主动开通功能,才会消费产生积分,垃圾!!!...
  5. python中判断字符串的常用操作
  6. PostgreSQL的使用-01-创建一个table
  7. 写给《我也能做CTO》作者的一封信
  8. “SCSA-S学习导图+”系列:文件解析
  9. 软件工程基础作业 可行性与需求分析
  10. Android航海航线地图,航海王热血航线东南之海宝藏一览
  11. 月薪2w的前端工程师,必盘的实战项目
  12. ardupilot rover ardurover 电机相关源码 PreArm servo function 33 unassigned
  13. python解析FreeMind思维导图
  14. 编程实践--决策树分类算法--隐形眼镜材质分类
  15. 光子晶体介质柱的讨论
  16. C/C++语言扫雷小游戏(eaxyX图形库的应用)
  17. hive sql中传date 指定后的“%Y-%m-%d“格式,需要加引号
  18. 【第一个项目开发】创建domain包中的类
  19. 数值统计(多实例测试),统计给定的n个数中,负数、零和正数的个数
  20. [APIO2016]烟火表演

热门文章

  1. 2022最新网络安全基础知识点汇总
  2. Allegro怎样导出Flotherm文件
  3. linux fflush函数,sleep函数和fflush函数
  4. 【战国策】之《齐策·张仪为秦连横说齐王曰》
  5. widget jquery 理解
  6. MVC框架的学习总结
  7. 安装MongoDB出现的问题
  8. 三相桥式全控整流电路simulink仿真_可控硅整流器
  9. UVa10635 - Prince and Princess
  10. 0422-团队项目开发