人工智能笔记11 --强化学习
基本设置
例子:瓜农种西瓜
• 多步决策过程
• 过程中包含状态、动作、反馈 (奖赏) 等
• 需多次种瓜,在过程中不断摸索,才能总结出较好的种瓜策略
监督学习对比强化学习
预测:最小化预测误差,预测结果不会对环境产生影响
比如,是否为肿瘤,天气预测是否影响天气
决策:决策动作会对环境产生影响
比如:肿瘤去除,股票投资会影响股市
强化学习的关键要素
<A,X,R,P><A,X,R,P><A,X,R,P>
动作空间 A
状态空间 X
奖赏函数 R:X×A×X→RX\times A\times X\rightarrow \mathcal{R}X×A×X→R
状态转移概率P:X×A×X→RX\times A\times X\rightarrow \mathcal{R}X×A×X→R
目标:通过在种瓜过程中不断摸索,总结出较好的种瓜策略,种出好瓜(获得的累积奖赏最大)
强化学习的目标
器通过在环境中不断尝试,从而学到一个“策略”(policy)π\piπ,使得
长期执行该策略后得到的累积奖赏最大。
策略表示:
确定性策略和随机性策略
策略的评估:累计奖赏
状态值函数:从x输出用策略π\piπ带来的累计奖赏
状态值函数,从状态x出发,策略π\piπ的累计奖赏
{VTπ(x)=Eπ[1T∑t=1Trt∣x0=x]T步累计奖赏Vγπ(x)=Eπ[∑t=0+∞γtrt+1∣x0=x]γ折扣累计奖赏\left\{\begin{array}{l} V^\pi_T(x)=\mathbb{E}_\pi[\frac{1}{T}\sum^T_{t=1}r_t|x_0=x]&T步累计奖赏\\ V^\pi_\gamma(x)=\mathbb{E}_\pi[\sum^{+\infty}_{t=0}\gamma^t r_{t+1}|x_0=x]&\gamma折扣累计奖赏 \end{array}\right.{VTπ(x)=Eπ[T1∑t=1Trt∣x0=x]Vγπ(x)=Eπ[∑t=0+∞γtrt+1∣x0=x]T步累计奖赏γ折扣累计奖赏
状态-动作值函数,从状态x出发,执行动作a再用策略π\piπ的累计奖赏
{QTπ(x)=Eπ[1T∑t=1Trt∣x0=x,a0=a]T步累计奖赏Qγπ(x)=Eπ[∑t=0+∞γtrt+1∣x0=x,a0=a]γ折扣累计奖赏\left\{\begin{array}{l} Q^\pi_T(x)=\mathbb{E}_\pi[\frac{1}{T}\sum^T_{t=1}r_t|x_0=x,a_0=a]&T步累计奖赏\\ Q^\pi_\gamma(x)=\mathbb{E}_\pi[\sum^{+\infty}_{t=0}\gamma^t r_{t+1}|x_0=x,a_0=a]&\gamma折扣累计奖赏 \end{array}\right.{QTπ(x)=Eπ[T1∑t=1Trt∣x0=x,a0=a]Qγπ(x)=Eπ[∑t=0+∞γtrt+1∣x0=x,a0=a]T步累计奖赏γ折扣累计奖赏
强化学习方法分类
- 马尔科夫决策过程中,A、 X、 P、R已知:动态规划
- 模型意指马尔可夫决策过程:P和R往往未知
- 基于模型(model-based)的RL:先学习/还原环境模型,即P和R再求解最优策略
- 免模型(model-free)的RL:不学习/原环境模型,直接逼近最优策略
Q-learning算法
基本思想
• 学习状态-动作值函数Q(s,a)Q(s,a)Q(s,a),再从学到的QQQ函数里求出最优策略πππ(即带来的累积奖赏最大)
• 免模型方法:无需先学习状态转移概率P和奖赏函数R
• 从与环境交互的轨迹数据中学习
一条轨迹数据:s1,a1,r2,s2,a2...s_1,a_1,r_2,s_2,a_2...s1,a1,r2,s2,a2...
【当动作和下一时刻状态都已经(通过采样)确定时】
Qγπ(x)=Eπ[∑t=0+∞γtrt+1∣x0=x,a0=a]Q^\pi_\gamma(x)=\mathbb{E}_\pi[\sum^{+\infty}_{t=0}\gamma^t r_{t+1}|x_0=x,a_0=a]Qγπ(x)=Eπ[t=0∑+∞γtrt+1∣x0=x,a0=a]
转换为
Q(st,at)=R(st,at)+γ⋅Q(st+1,at+1)Q(s_t,a_t)=R(s_t,a_t)+\gamma\cdot Q(s_{t+1},a_{t+1})Q(st,at)=R(st,at)+γ⋅Q(st+1,at+1)
基本思想:维护两个策略
目标策略:π(a∣s)\pi(a|s)π(a∣s)用状态-动作值函数Q(s,a)Q(s,a)Q(s,a)评估
执行/行为策略(用于收集数据和做探索):μ(a∣s)\mu(a|s)μ(a∣s)用于收集轨迹数据
{s1,a1,r2,s2,a2……sT}∼μ\{s_1,a_1,r_2,s_2,a_2……s_T\}\sim \mu{s1,a1,r2,s2,a2……sT}∼μ
μ(a∣s)\mu(a|s)μ(a∣s)实现,可以使用ϵ−greedy\epsilon-greedyϵ−greedy的环境探索法【平衡探索与利用】
πϵ(s)={π(s)=argmaxaQ(s,a)以概率1−ϵA中以均匀概率选取动作概率ϵ\pi^\epsilon(s)=\left\{\begin{array}{l} \pi (s) = argmax_aQ(s,a) & 以概率1-\epsilon \\ A中以均匀概率选取动作 & 概率\epsilon\end{array}\right.πϵ(s)={π(s)=argmaxaQ(s,a)A中以均匀概率选取动作以概率1−ϵ概率ϵ
状态-动作值函数更新:
绵羊走迷宫
假设一个迷宫有5个房间,房间之间通过门相连,将这五个房间按照从0至4进行编号,且5号房间里面是草地。因绵羊要吃草,设定5号房间为绵羊的目标房间。求绵羊从任意一个房间走到目标房间(5号房间)的最优路径。
基于图表示的房间结构
• 节点:房间
• 边:如果两个房间有门相连,那么两个节点之间存在一条边。边的权重即为奖赏值(直接连接到5号房间的奖赏值为100,其他门的奖赏值为0)。没有门直接相连,奖赏值为-1
绵羊从任意一个房间走到目标房间的最优路径
→\rightarrow→从任意状态到达目标状态的最大累积奖赏
令学习参数γ=0.8,初始状态为1号房间
• 根据奖赏矩阵R,状态1的下一步动作有两种选择:转向状态3或者状态5。
- 根据行为策略,假设我们转向状态5。
• 绵羊位于状态5以后,有三种可能的动作选择
:转向状态1或4或5。
- 根据目标策略,选择Q值最大的动作,并更新值函数:
Q(1,5)=R(1,5)+γ×max{Q(5,1),Q(5,4),Q(5,5}=100Q(1,5)=R(1,5)+\gamma\times max\{Q(5,1),Q(5,4),Q(5,5\}=100Q(1,5)=R(1,5)+γ×max{Q(5,1),Q(5,4),Q(5,5}=100
当前状态为5号房间(达到目标状态)
完成了一次episode,矩阵Q也相应地更新了
接着,假设选取3为初始状态
• 根据奖赏矩阵R,状态3有三种可能的动作选
择:转向状态1或2或4。
- 根据行为策略,假设我们转向状态1。
绵羊位于状态1以后,有两种可能的动作选择
:转向状态3或5。
- 根据目标策略,选择Q值最大的动作,并更
新值函数:
Q(3,1)=R(3,1)+γ×max{Q(1,3),Q(1,5)}=80Q(3,1)=R(3,1)+\gamma\times max\{Q(1,3),Q(1,5)\}=80Q(3,1)=R(3,1)+γ×max{Q(1,3),Q(1,5)}=80
当前状态为1号房间(不是目标状态)
第二次episode还没有结束
• 根据奖赏矩阵R,状态1有两种可能的动作选
择:转向状态3或5。
- 根据行为策略,假设我们转向状态5。
由前面的分析,我们有:Q(1,5)=100。更新新矩阵Q,但是Q没有发生变化。第二次episode结束
继续执行更多的episode,最终Q将收敛成如下一个矩阵
如果以3号房间为初始状态,根据Q表,累积的奖赏最大的路径是3-﹥1-﹥5或者3-﹥4-﹥5,总的reward都为100。
强化学习拓展
RL需要对环境进行探索
智能体在探索中加深对环境的理解,使得长期累积奖赏最大
比如婴儿走路
智能体在探索中加深对环境的理解,使得长期累积奖赏最大
具体阐述:
K臂老虎机(K-armed Bandit):
一个状态,k个动作,每个摇臂奖励服从某个期望位置的分布,执行有限次动作,最大化累计奖赏
简化RL(无状态转移,因为只有一个状态),把探索抽象出来单独研究
若只探索:平均分配尝试次数(浪费大量尝试)
只利用:每个摇一次,根据反馈结果只选择期望最高的摇臂(误差大)
主要难题之一:平衡探索与利用
摇臂次数有限,如何分配资源做探索和利用,使得长期累积奖赏尽可能的大?
环境探索方法
ϵ贪心\epsilon贪心ϵ贪心
以ϵ\epsilonϵ的概率探索:均匀随机选择一个摇臂
以1−ϵ1-\epsilon1−ϵ概率利用,选择当前期望最高的摇臂Softmax:基于当前已知摇臂期望对探索和利用这种
if 摇臂当前平均奖赏大,选择概率高
概率用Boltzmann分布
P(k)=eQ(kr∑i=1KeQ(i)rP(k)=\frac{e^{\frac{Q(k}{r}}}{\sum^K_{i=1} e^{ \frac{Q(i)}{r}}}P(k)=∑i=1KerQ(i)erQ(k
Q(i)Q(i)Q(i)是记录当前摇臂的平均奖赏
两种算法都有折中参数(ϵ,r)(\epsilon,r)(ϵ,r)
深度强化学习:深度模型+强化学习
深度强化学习
使用(深度)神经网络表示策略或值函数
迷宫:有限状态、动作,小规模
深度强化学习
大规模/连续动作、状态,复杂策略表示,可考虑深度强化学习
应用
例如,DQN(深度Q网络)玩游戏,可以超过人类水平
AlphaGo:树搜索+深度强化学习(深度网络+强化学习
除了各种棋类、还应用于机器人控制、推荐系统、军事博弈、股票预测
等各种决策任务
小结
有监督学习 | 无监督学习 | 强化学习 | |
---|---|---|---|
学习依据 | 基于监督信息 | 基于对数据结构的假设 | 基于评估 |
数据来源 | 一次给定 | 一次给定 | 在时序交互中产生 |
决策过程 | 单步决策(如分类和识别) | 无 | 序贯决策(如棋类博弈) |
学习目标 | 样本到语义标签的映射 | 数据的分布模式 | 选择能够获取最大受益的状态到动作的映射 |
强化学习:多步决策过程,解决how的问题,决策会影响环境
• 强化学习拓展:探索-利用难题、深度强化学习、应用及问题
• Q-Learning 算法
迷宫寻宝
当然,你不需要写出程序所有代码,你只需要补全以下函数并提交即可。
函数部分定义如下(部分变量的说明已经在提示中详尽给出):
void Qlearning()
{int nx = 1 + rand() % n, ny = 1 + rand() % m;int cnt = 0;while (!isEnd(nx,ny) && cnt < n*m) {auto &s0 = Qstate[(nx-1)*m+ny];int siz = s0.size();int _next = -1,idx = 0;if (!siz) return;if (siz == 1) _next = s0[0].first;else {sort(s0.begin(),s0.end(),cmp);double p = rand() / double(RAND_MAX);if (p < 1 - greedy_factor) {_next = s0[0].first;}else {idx = 1 + rand() % (siz - 1);_next = s0[idx].first;}}auto &s1 = Qstate[_next];sort(s1.begin(),s1.end(),cmp);double _nextMax = (int)s1.size() ? s1[0].second : 0.0;nx = (_next - 1) / m + 1;ny = (_next - (nx-1) * m) % (m+1);/********/// TODO// HINTS: 使用s0[idx].second、alpha、gama、_nextMax、Reward[nx][ny]变量,// 完成Qlearning的状态更新公式/********/cnt++;}
}
#include <bits/stdc++.h>
using namespace std;
const int maxn = 21;
const int epics = 50000;
const int target_success = 5000;
const double inf = 1e8;bool cmp(pair<int,double> X, pair<int,double> Y)
{if(X.second == Y.second) return X.first < Y.first;return X.second > Y.second;
}// 迷宫尺寸 n*m
// x,y坐标从1开始 起点(1,1) 终点(n,m)
// 对于每个位置(i,j),可以向U,L,R,D四个方向移动,不可走出迷宫边界,不可走到障碍物上
int n,m;// maze[maxn+5][maxn+5]存储迷宫 0代表可走通 1代表陷阱 (maze[i][j], 1<=i<=n,1<=j<=m)
// 答案保证有解 即 maze[1][1] = 0, maze[n][m] = 0, 起点与终点之间保证至少存在一条路径
int maze[maxn+5][maxn+5];// 奖励函数R 设置普通格子奖励为-(abs(i-n)+abs(j-m)) 陷阱奖励为-10000 终点奖励为100000 衰减因子alpha = 0.9 , gama = 0.9
const double alpha = 0.9;
const double gama = 0.9;
double Reward[maxn+5][maxn+5];// 状态函数Q 下一步的选取采用1-ϵ贪心
// 关于Qstate[pos]中的pos索引到二维坐标(px,py)的转换:
// px = (pos - 1) / m + 1
// py = (pos - (px-1) * m) % (m+1);
const double greedy_factor = 0.1;
vector< pair<int,double> > Qstate[(maxn+5)*(maxn+5)];// 存储答案
vector< pair<int,int> > ans;// 初始化奖励函数R和状态函数Q
void init_RQ(int i,int j)
{// 陷阱不设置奖励函数(可理解成均为-inf)if (maze[i][j] == 1) return;// Upif (Reward[i-1][j]) {Qstate[(i-1)*m+j].push_back({(i-2)*m+j,-1});}// Leftif (Reward[i][j-1]) {Qstate[(i-1)*m+j].push_back({(i-1)*m+j-1,-1});}// Rightif (Reward[i][j+1]) {Qstate[(i-1)*m+j].push_back({(i-1)*m+j+1,-1});}// Downif (Reward[i+1][j]) {Qstate[(i-1)*m+j].push_back({i*m+j,-1});}
}int success_time = 0;
bool isEnd(int i,int j)
{if (i == n && j == m) {++success_time;return true;}if (maze[i][j] == 1) {return true;}return false;
}void Qlearning()
{int nx = 1 + rand() % n, ny = 1 + rand() % m;int cnt = 0;while (!isEnd(nx,ny) && cnt < n*m) {auto &s0 = Qstate[(nx-1)*m+ny];int siz = s0.size();int _next = -1,idx = 0;if (!siz) return;if (siz == 1) _next = s0[0].first;else {sort(s0.begin(),s0.end(),cmp);double p = rand() / double(RAND_MAX);if (p < 1 - greedy_factor) {_next = s0[0].first;}else {idx = 1 + rand() % (siz - 1);_next = s0[idx].first;}}auto &s1 = Qstate[_next];sort(s1.begin(),s1.end(),cmp);double _nextMax = (int)s1.size() ? s1[0].second : 0.0;nx = (_next - 1) / m + 1;ny = (_next - (nx-1) * m) % (m+1);/********/// TODO// HINTS: 使用s0[idx].second、alpha、gama、_nextMax、Reward[nx][ny]变量,// 完成Qlearning的状态更新公式// 你的代码将被嵌在此处/********/cnt++;}
}int main()
{ios::sync_with_stdio(false);srand(2022);cin >> n >> m;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++) {int t;cin >> t;maze[i][j] = t;Reward[i][j] = (t == 0 ? -(abs(i-n)+abs(j-m)) : -10000.0);}}Reward[n][m] = 100000.0;for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {init_RQ(i,j);}}int cnt = 0;while (cnt < epics && success_time != target_success) {Qlearning();++cnt;}cnt = 0;int x = 1, y = 1;while ((x!=n || y!=m) && cnt < n*m) {auto &s = Qstate[(x-1)*m+y];if (!(int)s.size()) {// 无解情况,可忽略cout << "Something Wrong!" << endl;return 0;}ans.push_back({x,y});sort(s.begin(),s.end(),cmp);int _next = s[0].first;x = (_next - 1) / m + 1; y = (_next - (x-1) * m) % (m+1);++cnt;}ans.push_back({n,m});cout << (int)ans.size() << endl;for(auto& u : ans) {cout << u.first << ' ' << u.second << endl;}return 0;
}
思路
搞清楚每个部分干啥套公式即可
代码
double former = (1 - alpha) * s0[idx].second;
double later = alpha * (Reward[nx][ny] + gama * _nextMax);
s0[idx].second = former + later;
人工智能笔记11 --强化学习相关推荐
- 学习笔记:强化学习与最优控制(Chapter 2)
Approximation in Value Space 学习笔记:强化学习与最优控制(Chapter 2) Approximation in Value Space 1. 综述 2. 基于Value ...
- 【医疗人工智能】通过强化学习和分类的自适应对齐进行有效的症状查询和诊断
Article 文献题目:Efficient Symptom Inquiring and Diagnosis via Adaptive Alignment of Reinforcement Learn ...
- 强化学习笔记-01强化学习介绍
本文是博主对<Reinforcement Learning- An introduction>的阅读笔记,不涉及内容的翻译,主要为个人的理解和思考. 1. 强化学习是什么?解决什么样的问题 ...
- David Silver强化学习公开课自学笔记——Lec1强化学习简介
本笔记摘自知乎博主旺财的搬砖历险记和叶强,仅用于自学 1.背景介绍 (1)背景 强化学习是多学科多领域交叉的产物,本质是解决决策问题,即学会自动决策,在各个领域体现不同,但都归结为人类如何且为什么能做 ...
- 阿尔法狗的秘密:人工智能中的强化学习
在有监督学习(supervised learning)中,训练数据中包含了数据样本的目标. 不过现实中可没有上帝一样的监督者给出这些目标或答案! 强化学习(reinforcement learning ...
- 【人工智能】深度强化学习的新突破:如何打造智能决策系统
文章目录 深度强化学习的新突破:如何打造智能决策系统 引言 概念和术语介绍 强化学习 深度学习 强化学习和深度学习的结合 智能决策系统 关键问题分析 问题解决方案核心原理讲解 模型设计 数据集 模型评 ...
- 【从零开始学习人工智能】 人工智能简介 - 04强化学习
人工智能简介 - 强化学习 引言 强化学习是人工智能领域的一个重要分支,它通过与环境进行交互学习,以最大化累积奖励为目标.在本篇文章中,我们将介绍强化学习的基本概念.关键要素和应用场景. 1. 强化学 ...
- 机器学习读书笔记:强化学习
文章目录 强化学习基本模型 K-摇臂赌博机模型 ϵ\epsilonϵ-贪心 Softmax 有模型学习 策略评估 策略改进 免模型学习 蒙特卡洛强化学习 采样 策略改进 时态差分学习 值函数近似 模仿 ...
- 读书笔记 - 基于强化学习的城市交通信号控制方法研究 - 西电MaxPlus
<基于强化学习的城市交通信号控制方法研究> 针对TC-GAC交通信号控制方法中只考虑局部拥堵因子的缺陷,引入车辆目的车道的全局拥堵因子,实现了多交叉口控制器Agent之间的简单协作. 由于 ...
- 强化学习笔记:强化学习的约束
1 所需的样本数量过大 深度强化学习一个严重的问题在于需要巨大的样本量.举个例子,玩Atari游戏 图 19.17 中纵轴是算法的分数与 人类分数的比值,100% 表示达到人类玩家的水准. 图中横轴是 ...
最新文章
- Expandable Table的Demo
- C++ STL 算法精选之查找篇
- CodeForces 15B Laser
- linux lzo 压缩文件,Linux常用压缩和解压命令
- 关于Visual Studio .NET 2010最近的发布情况
- 实习踩坑之路:多线程+多个锁下面导致的数据库状态不对
- 莞工计算机学院杀手,莞工oj第40题神奇的fans
- 内网通手动修改积分_WooCommerce微信小程序2.9.4版本发布 拼团积分购适配可变产品 微信搜索推送...
- c语言的Hello World
- 蜂鸣器干扰通讯_蜂鸣器工作原理是什么,为什么需要接振荡的信号才能工作?...
- 无线局域网和蜂窝移动网络_为什么 iPhone 的数据流量叫做「蜂窝移动网络」?...
- JS实现歌词同步滚动效果
- 无线网ppp服务器连接失败,关于无线上网PPP拨号问题
- 2022智源大会议程公开 | 神经计算与生物智能论坛
- 学习Python数据分析,需要几个阶段?
- 16从零开始学Java之Java里的输入与输出语句有哪些?
- 搭搭云-超级应用平台 与JNPF Java多用户商城系统源码
- RDM redis操作
- SVG大神专访:计育韬,开创行业更要守护行业。
- BNCT知识宝典(中文2022版)
热门文章
- 数据中台之数据集成平台的数据抽取
- linux伊甸园论坛,Deepin2014壁纸大赛评审团——不断努力的Linux伊甸园
- 开心斗服务器维修要多久,大危机 《开心OL》史上最惨服务器开启?
- 计算机系统故障常用检测及排除方法有哪些,常见的电脑故障及排除方法
- 哪种软件测试硬盘速度,哪种工具最适合硬盘,SSD,U盘,存储卡速度性能测试?...
- nProtect的一些知识
- phpbb简体中文语言包的安装
- troublemaker中文谐音_troublemaker歌词, trouble maker 音译中文歌词
- 在C#中用一个按钮控制斑马zebra条码打印机进行打印
- 海康威视复赛题 --- 算法说明书