强化学习详解:理论基础与核心算法解析

本文详细介绍了强化学习的基础知识和基本算法,包括动态规划、蒙特卡洛方法和时序差分学习,解析了其核心概念、算法步骤及实现细节。

关注TechLead,复旦AI博士,分享AI领域全维度知识与研究。拥有10+年AI领域研究经验、复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,上亿营收AI产品研发负责人。

file

一、导论

强化学习(Reinforcement Learning, RL)是机器学习中的一个重要分支,其目标是通过与环境的交互来学习决策策略,以最大化长期累积奖励。在强化学习中,智能体(agent)通过执行一系列动作来影响环境,从而获得反馈信号,即奖励(reward)。这种学习机制模仿了生物体在自然界中的学习过程,因此具有很强的现实意义和应用前景。

强化学习已经在多个领域展示了其强大的能力,以下是几个典型的应用场景:

游戏中的强化学习

游戏是强化学习的一个重要应用领域,特别是在复杂的策略游戏中,RL算法已经取得了显著的成功。例如,AlphaGo利用深度强化学习和蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)技术,在围棋比赛中击败了世界顶级棋手。此外,DQN(Deep Q-Network)在 Atari 游戏中的表现也证明了强化学习在复杂策略环境中的潜力。

自动驾驶

自动驾驶汽车需要在复杂的交通环境中做出实时决策,强化学习在这一领域具有重要的应用价值。通过不断与模拟环境交互,RL算法可以学习如何处理各种驾驶场景,包括避障、变道和停车等,从而提高自动驾驶系统的安全性和效率。

机器人控制

机器人控制是另一个重要的应用领域,强化学习可以帮助机器人在未知或动态环境中自主学习如何完成任务。例如,通过RL算法,机器人可以学会行走、抓取物体、组装零件等任务,这为实现高效灵活的机器人系统提供了新的途径。

二、基础知识

在理解强化学习的高级算法和应用之前,我们需要掌握其基础知识。基础知识部分将详细介绍强化学习的定义和关键术语、马尔可夫决策过程(MDP)的数学框架,以及策略与价值函数的定义和区别。这些概念是理解和应用强化学习的基石。

2.1 强化学习的定义和关键术语

强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习策略的机器学习方法。智能体(agent)在环境(environment)中执行动作(action),从而改变环境的状态(state)并获取奖励(reward)。智能体的目标是通过学习策略(policy),在不同状态下选择最佳动作,以最大化累积奖励。

2.1.1 关键术语

  • 智能体(Agent): 在环境中执行动作并学习策略的主体。
  • 环境(Environment): 智能体所处的外部系统,智能体的动作会影响环境的状态。
  • 状态(State, S): 环境在某一时刻的描述,通常由一组变量表示。
  • 动作(Action, A): 智能体在特定状态下可以执行的行为。
  • 奖励(Reward, R): 环境对智能体动作的反馈信号,表示动作的好坏。
  • 策略(Policy, π): 指导智能体在各个状态下选择动作的规则,可以是确定性的(π(s) = a)或随机的(π(a|s) = P(a|s))。
  • 价值函数(Value Function, V): 用来估计智能体在某个状态或状态-动作对下的长期回报。
  • 动作价值函数(Action-Value Function, Q): 用来估计智能体在某个状态下执行某个动作后的长期回报。

2.2 马尔可夫决策过程(MDP)

马尔可夫决策过程(Markov Decision Process, MDP)是强化学习问题的数学框架。MDP通过五元组 (S, A, P, R, γ) 来描述,其中:

  • S: 状态空间,表示所有可能状态的集合。
  • A: 动作空间,表示智能体可以执行的所有动作的集合。
  • P: 状态转移概率矩阵,P(s’|s,a) 表示在状态 s 执行动作 a 后转移到状态 s’ 的概率。
  • R: 奖励函数,R(s,a) 表示在状态 s 执行动作 a 后获得的即时奖励。
  • γ: 折扣因子,0 ≤ γ ≤ 1,用于度量未来奖励的当前价值。

2.2.1 MDP的性质

MDP具有马尔可夫性质,即当前状态的转移只依赖于当前状态和当前动作,而与之前的状态无关。这一性质简化了强化学习问题的求解,使得智能体可以通过递推方式计算最优策略和价值函数。

2.2.2 状态转移与奖励

状态转移和奖励是MDP的核心,决定了智能体与环境的交互方式。状态转移概率矩阵 P 定义了环境的动态行为,而奖励函数 R 则评估了智能体动作的效果。通过不断试验和观察,智能体可以逐渐学会如何在不同状态下选择动作,以实现长期回报的最大化。

2.3 策略与价值函数

策略(Policy)和价值函数(Value Function)是强化学习中的两个关键概念,它们分别描述了智能体的行为规则和状态的价值评估。

2.3.1 策略(Policy, π)

策略 π 定义了智能体在每个状态下选择动作的规则。策略可以是确定性的,也可以是随机的。确定性策略 π(s) = a 表示在状态 s 下总是选择动作 a,而随机策略 π(a|s) = P(a|s) 则表示在状态 s 下以概率 P(a|s) 选择动作 a。

策略的目标是指导智能体选择最优动作,从而最大化累积奖励。学习最优策略是强化学习的核心任务之一。

2.3.2 价值函数(Value Function, V)

价值函数 V 用来估计某个状态或状态-动作对的长期回报。价值函数的定义有两种形式:
file

2.3.3 贝尔曼方程

file

贝尔曼方程提供了计算价值函数的递归公式,是求解最优策略和价值函数的基础。

三、基本算法

强化学习中,算法的设计和实现是智能体能够学习和优化策略的关键。基本算法包括动态规划(Dynamic Programming, DP)、蒙特卡洛方法(Monte Carlo Methods)和时序差分(Temporal-Difference, TD)学习。这些算法各有特点,适用于不同的场景和问题。

3.1 动态规划(Dynamic Programming, DP)

动态规划是一种通过递推方式求解优化问题的算法。在强化学习中,动态规划用于计算最优策略和价值函数。动态规划的前提是模型已知,即环境的状态转移概率和奖励函数是已知的。

3.1.1 价值迭代(Value Iteration)

价值迭代是一种通过不断更新价值函数来逼近最优价值函数的方法。其核心思想是利用贝尔曼最优方程递归地更新状态价值函数,直到收敛。

算法步骤:
file

代码示例:

import numpy as np

def value_iteration(P, R, gamma, theta):
    V = np.zeros(len(P))
    while True:
        delta = 0
        for s in range(len(P)):
            v = V[s]
            V[s] = max(sum([P[s][a][s'] * (R[s][a] + gamma * V[s']) for s' in range(len(P))]) for a in range(len(P[s])))
            delta = max(delta, abs(v - V[s]))
        if delta < theta:
            break
    policy = np.zeros(len(P), dtype=int)
    for s in range(len(P)):
        policy[s] = np.argmax([sum([P[s][a][s'] * (R[s][a] + gamma * V[s']) for s' in range(len(P))]) for a in range(len(P[s]))])
    return V, policy

# 示例用法
P = [[[0.8, 0.2], [0.1, 0.9]], [[0.7, 0.3], [0.2, 0.8]]]
R = [[1, 0], [0, 1]]
gamma = 0.9
theta = 1e-6
V, policy = value_iteration(P, R, gamma, theta)
print("Value Function:", V)
print("Policy:", policy)

3.1.2 策略迭代(Policy Iteration)

策略迭代通过交替进行策略评估和策略改进来找到最优策略。其核心思想是基于当前策略计算价值函数,然后改进策略,直到策略不再改变。

算法步骤:
file

代码示例:

def policy_iteration(P, R, gamma, theta):
    policy = np.zeros(len(P), dtype=int)
    V = np.zeros(len(P))
    
    def policy_evaluation(policy):
        while True:
            delta = 0
            for s in range(len(P)):
                v = V[s]
                a = policy[s]
                V[s] = sum([P[s][a][s'] * (R[s][a] + gamma * V[s']) for s' in range(len(P))])
                delta = max(delta, abs(v - V[s]))
            if delta < theta:
                break

    while True:
        policy_stable = True
        policy_evaluation(policy)
        
        for s in range(len(P)):
            old_action = policy[s]
            policy[s] = np.argmax([sum([P[s][a][s'] * (R[s][a] + gamma * V[s']) for s' in range(len(P))]) for a in range(len(P[s]))])
            if old_action != policy[s]:
                policy_stable = False
        if policy_stable:
            break

    return V, policy

# 示例用法
V, policy = policy_iteration(P, R, gamma, theta)
print("Value Function:", V)
print("Policy:", policy)

3.2 蒙特卡洛方法(Monte Carlo Methods)

蒙特卡洛方法是一种基于随机采样的强化学习方法。它通过多次模拟智能体与环境的交互过程,来估计状态价值或动作价值。与动态规划不同,蒙特卡洛方法不需要已知的环境模型,因此适用于模型未知的情况。

3.2.1 首访蒙特卡洛(First-Visit Monte Carlo)

首访蒙特卡洛方法通过记录智能体在每个状态第一次访问时的回报,来估计状态价值函数。具体步骤如下:

算法步骤:
file

代码示例:

def first_visit_mc(env, num_episodes, gamma):
    V = np.zeros(env.observation_space.n)
    N = np.zeros(env.observation_space.n)

    for _ in range(num_episodes):
        state = env.reset()
        trajectory = []
        done = False
        while not done:
            action = env.action_space.sample()
            next_state, reward, done, _ = env.step(action)
            trajectory.append((state, action, reward))
            state = next_state
        
        visited_states = set()
        G = 0
        for state, action, reward in reversed(trajectory):
            G = reward + gamma * G
            if state not in visited_states:
                visited_states.add(state)
                N[state] += 1
                V[state] += (G - V[state]) / N[state]
                
    return V

# 示例用法
import gym
env = gym.make('FrozenLake-v1')
num_episodes = 5000
gamma = 0.9
V = first_visit_mc(env, num_episodes, gamma)
print("Value Function:", V)

3.2.2 每次访问蒙特卡洛(Every-Visit Monte Carlo)

每次访问蒙特卡洛方法通过记录智能体在每个状态每次访问时的回报,来估计状态价值函数。具体步骤如下:

算法步骤:

file

代码示例:

def every_visit_mc(env, num_episodes, gamma):
    V = np.zeros(env.observation_space.n)
    N = np.zeros(env.observation_space.n)

    for _ in range(num_episodes):
        state = env.reset()
        trajectory = []
        done = False
        while not done:
            action = env.action_space.sample()
            next_state, reward, done, _ = env.step(action)
            trajectory.append((state, action, reward))
            state = next_state
        
        G = 0
        for state, action, reward in reversed(trajectory):
            G = reward + gamma * G
            N[state] += 1
            V[state] += (G - V[state]) / N[state]
                
    return V

# 示例用法
V = every_visit_mc(env, num_episodes, gamma)
print("Value Function:", V)

3.3 时序差分(Temporal-Difference, TD)学习

时序差分学习结合了蒙特卡洛方法和动态规划的优点。它既不需要完整的轨迹,也不需要已知的环境模型,通过每一步的经验更新价值函数。

3.3.1 SARSA(State-Action-Reward-State-Action)

SARSA 是一种基于策略的 TD 学习算法,其名称代表了五元组 ((S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}))。SARSA 通过每一步的经验更新动作价值函数。

算法步骤:

file

代码示例:

def sarsa(env, num_episodes, alpha, gamma, epsilon):
    Q = np.zeros((env.observation_space.n, env.action_space.n))

    def epsilon_greedy_policy(state):
        if np.random.rand() < epsilon:
            return np.random.choice(env.action_space.n)
        else:
            return np.argmax(Q[state])

    for _ in range(num_episodes):
        state = env.reset()
        action = epsilon_greedy_policy(state)
        done = False
        while not done:
            next_state, reward, done, _ = env.step(action)
            next_action = epsilon_greedy_policy(next_state)
            Q[state, action] += alpha * (reward + gamma * Q[next_state, next_action] - Q[state, action])
            state, action = next_state, next_action
            
    return Q

# 示例用法
alpha = 0.1
Q = sarsa(env, num_episodes, alpha, gamma, epsilon)
print("Q-Value Function:", Q)

3.3.2 Q学习(Q-Learning)

Q学习是一种无策略的 TD 学习算法,其目标是直接逼近最优动作价值函数。Q学习通过每一步的经验更新 Q 值函数,但不同于 SARSA,Q学习使用最大化未来 Q 值的动作来更新当前 Q 值。

算法步骤:

file

代码示例:

def q_learning(env, num_episodes, alpha, gamma, epsilon):
    Q = np.zeros((env.observation_space.n, env.action_space.n))

    def epsilon_greedy_policy(state):
        if np.random.rand() < epsilon:
            return np.random.choice(env.action_space.n)
        else:
            return np.argmax(Q[state])

    for _ in range(num_episodes):
        state = env.reset()
        done = False
        while not done:
            action = epsilon_greedy_policy(state)
            next_state, reward, done, _ = env.step(action)
            Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
            state = next_state
            
    return Q

# 示例用法
Q = q_learning(env, num_episodes, alpha, gamma, epsilon)
print("Q-Value Function:", Q)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/748720.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的安装与配置

MySQL提供安装包和压缩包两种安装方式&#xff0c;安装包是以.msi作为后缀名的二进制分发文件&#xff0c;压缩包是以.zip为后缀的压缩文件。安装包的安装只要双击安装文件&#xff0c;然后按照提示一步步安装就可以了&#xff0c;属于“傻瓜”式安装&#xff1b;压缩包的安装需…

成都百洲文化传媒有限公司专业电商服务的典范

在电商风起云涌的时代&#xff0c;成都百洲文化传媒有限公司凭借其深厚的行业经验和独特的创新思维&#xff0c;成为了众多品牌电商之路上的得力助手。今天&#xff0c;就让我们一起走进成都百洲文化传媒&#xff0c;看看他们是如何在电商领域乘风破浪&#xff0c;助力品牌实现…

新能源、新智造、新技术、新未来​ 2024常州国际新能源汽车产业博览会​ 9月20-22日盛大举行!

深入贯彻党的二十大关于制造强国建设、推动汽车产业高端化、制造化、绿色化发展的战略部署&#xff0c;构建新发展格局、推动高质量发展的内在要求。在“双碳”政策背景下&#xff0c;常州市紧扣“国际化智造名城、长三角中轴枢纽”城市定位&#xff0c;奋力推进“532”发展战略…

MyBatis源码分析--一级缓存、二级缓存原理

前言&#xff1a; 有点项目经验的朋友都知道缓存的重要性是不言而喻的&#xff0c;不仅仅我们在开发项目业务功能的时候使用了各种缓存&#xff0c;框架在设计的时候也有框架层面的缓存&#xff0c;尤其在查询多的场景下&#xff0c;缓存可以大大的减少数据库访问&#xff0c;…

valgrind调试c/c++内存问题:非法地址访问_内存泄漏_越界访问

1.valgrind命令 调试内存问题: valgrind --leak-checkfull 更新详细的显示: valgrind --leak-checkfull --show-leak-kindsall valgrind提示信息汇总 内存泄漏 lost in loss record 丢失记录 , 内存泄漏实例[[#2.内存泄漏–不完全释放内存|实例链接]]段错误 Process termina…

vue3-cropperjs图片裁剪工具-用户上传图片截取-(含预览视频)

效果图 上传图片弹窗预览 对于这个上传图片样式可以参考 官方原代码 官网传送入口 Upload 上传 | Element Plus (element-plus.org) <template><el-uploadclass"upload-demo"dragaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6…

吴恩达LangChain教程:Embedding与文档解析

当前有很多应用想要实现根据文档或者文本内容实现用户问答&#xff0c;或者实现多轮会话能力&#xff0c;这时候就会使用到Embedding的能力。 01 | 使用类介绍 想要依据Embedding实现文本检索&#xff0c;需要引入如下的依赖。 其中&#xff0c;RetrievalQA的作用是对一些文档…

一天跌20%,多只可转债“腰斩”,近百只跌破面值,“退可守”的香饽饽为何破防?

专业人士指出&#xff0c;近期部分可转债大跌原因主要有两点&#xff1a;一方面&#xff0c;转债市场与权益市场联动性强。另一方面&#xff0c;近期公布的宏观经济数据稳中趋缓&#xff0c;“供强需弱”特征依然明显&#xff0c;证监会主席吴清发言及“科创板八条”新规延续了…

Python 基础 (标准库):heapq (堆)

1. 官方文档 heapq --- 堆队列算法 — Python 3.12.4 文档 2. 相关概念 堆 heap 是一种具体的数据结构&#xff08;concrete data structures&#xff09;&#xff1b;优先级队列 priority queue 是一种抽象的数据结构&#xff08;abstract data structures&#xff09;&…

秘籍来啦!手机找回删除的文件,掌握这3种方法

你是否曾经不小心删除了手机上的重要文件&#xff0c;如照片、视频、文档等&#xff0c;然后束手无策&#xff0c;不知道该如何恢复&#xff1f;这时候&#xff0c;找回删除的文件就显得尤为重要。别担心&#xff0c;本文将为大家揭秘3种方法&#xff0c;让你轻松找回那些被删除…

Redis Stream Redisson Stream

目录 一、Redis Stream1.1 场景1&#xff1a;多个客户端可以同时接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;发消息 &#xff09;1.1.2 XREAD - 从stream中读取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 从stream指定区间读取Entry&#xff08;收消息&…

徐徐拉开的帷幕:拜登与特朗普的辩论大戏 日元跌破160大关!创1986年以来最低纪录

北京时间6月27日&#xff08;本周五&#xff09;上午9:00&#xff0c;拜登和特朗普将参加2024年总统候选人电视辩论。作为参考&#xff0c;2016年大选辩论期间&#xff0c;美元汇率对辩论结果的反应相对温和&#xff0c;希拉里胜选预期增强在一定程度上支撑了美元。 时间逐渐临…

AI产品打造全攻略:看我是如何预测用户流失,搞定AI产品全流程的

前言 对于任何互联网公司而言&#xff0c;用户流失无疑是一个不容忽视的问题。在本文中&#xff0c;我将通过一个真实的预测用户流失的项目案例&#xff0c;带领大家深入了解AI产品从筹备到上线的整个流程。这个过程将展现AI产品经理的工作全貌&#xff0c;包括各个环节的角色…

钉钉在MAKE 2024大会上宣布开放AI生态;NBC将用AI主播播报巴黎奥运会内容

&#x1f680; 钉钉在MAKE 2024大会上宣布开放AI生态 摘要&#xff1a;钉钉总裁叶军在MAKE 2024生态大会上宣布&#xff0c;钉钉将对所有大模型厂商开放&#xff0c;构建“国内最开放AI生态”。目前已有六家大模型厂商接入钉钉&#xff0c;用户可直接使用七家大模型产品。未来…

下拉选择输入框(基于elment-ui)

最近在需求中&#xff0c;需要有一个下拉选择功能&#xff0c;又得可以输入&#xff0c;在 element-ui 官网找了&#xff0c;发现没有适合的&#xff0c;然后在修炼 cv 大法的我&#xff0c;也在网上看了一下&#xff0c;但是也都感觉不合适&#xff0c;所以就自己写了一个&…

R语言数据分析案例37-旅游景点聚类分析

一、研究背景 近年来&#xff0c;随着旅游业的迅猛发展&#xff0c;旅游景点的竞争日益激烈。如何在众多景点中脱颖而出&#xff0c;吸引更多游客&#xff0c;成为各大景点管理者关注的焦点。通过对旅游景点进行深入的数据分析&#xff0c;可以帮助管理者更好地了解景点的优势…

C#1.0-11.0所有历史版本主要特性总结

文章目录 前言名词解释主要版本一览表各版本主要特性一句话总结 C# 1.0 (Visual Studio 2002, .Net Framework 1.0)C# 2.0 (Visual Studio 2005, .Net Framework 2.0)C# 3.0 (Visual Studio 2008, .Net Framework 3.0)C# 4.0 (Visual Studio 2010, .Net Framework 4)C# 5.0 (V…

赏金猎人src挖掘入门

文章目录 1. 什么是漏洞2. OWASP Top 103. 利用的漏洞来源4. SRC安全应急响应中心5. Burpsuite简介6. 浏览器代理插件6.1 firefox浏览器代理插件6.2 edge浏览器代理插件3.chrome浏览器代理插件&#xff08;需要科学上网&#xff09; 1. 什么是漏洞 漏洞是指一个系统存在的弱点或…

2024广东省职业技能大赛云计算赛项实战——构建CICD

构建CI/CD 前言 题目如下&#xff1a; 构建CI/CD 编写流水线脚本.gitlab-ci.yml触发自动构建&#xff0c;具体要求如下&#xff1a; &#xff08;1&#xff09;基于镜像maven:3.6-jdk-8构建项目的drone分支&#xff1b; &#xff08;2&#xff09;构建镜像的名称&#xff1a…

C# VTK 自定义封装 vtkwPipeline 多边形管道建模

vtkwPipeline 简介 public vtkwPipeline(vtkLineSource lineSource, double outR, double inR, int sides) vtkwPipeline 是我自定义封装的C# 类 用于对管道壁建模&#xff0c;有内半径&#xff0c;外半径设置&#xff0c; 以及多边形边数设置。 参数 1. vtkLineSource li…