机器学习之强化学习(mdp 马尔可夫决策过程详解)

一、强化学习

强化学习(Reinforcement Learning, RL)是机器学习的一个重要分支,它主要涉及如何让计算机在环境中通过试错来学习行为策略,以达到某种目标。这里的“环境”通常是指一个可以观察到的、并且与智能体(agent,即学习的主体)互动的系统。智能体通过与环境的交互获得反馈(奖励或惩罚),并根据反馈来调整自己的行为。

主要组成
  1. 智能体(Agent):执行操作的主体,例如机器人、虚拟角色或软件程序。
  2. 环境(Environment):智能体所处并进行交互的外部世界。
  3. 状态(State):环境在某一时刻的具体情况。
  4. 动作(Action):智能体在给定状态下可以选择的行为。
  5. 奖励(Reward):智能体执行动作后,环境给予的反馈,用以衡量动作的好坏。
学习过程

强化学习的核心是学习一个策略(Policy),即从当前状态到采取的动作的映射。智能体的目标是最大化长期累积的奖励。这通常涉及到以下几个步骤:

  • 探索(Exploration):智能体尝试新的动作以发现有用的信息。
  • 利用(Exploitation):智能体利用已知信息来最大化即时奖励。
  • 学习策略(Learning Policy):根据奖励来调整策略,使得长期累积的奖励最大化。
算法

强化学习的算法可以大致分为三类:

  1. 基于价值的方法(Value-Based):通过学习每个状态的价值函数,即未来可以获得的预期奖励,来决定采取的动作。代表算法有Q学习(Q-learning)和时序差分(TD)学习。
  2. 基于策略的方法(Policy-Based):直接学习从状态到动作的映射策略。常见的算法有策略梯度(Policy Gradient)。
  3. 基于模型的方法(Model-Based):构建环境的模型,预测未来的状态和奖励,再据此做决策。

二、机器学习与强化学习的关系

强化学习是机器学习的一个子领域,与监督学习和无监督学习并列,它们共同构成了机器学习的三大主要类型。各种学习方法之间的关系和区别主要体现在数据处理、学习目标和反馈方式上。下面是一些详细的比较:

监督学习
  • 数据和反馈:在监督学习中,训练数据由输入数据和标签组成,学习目标是基于输入数据预测输出标签。模型的训练通常依赖于大量的标注数据。
  • 反馈方式:监督学习使用标签提供的直接反馈来学习,这种反馈是显式的,例如分类问题中的正确或错误标签,或者回归问题中的实际数值与预测数值之间的误差。

无监督学习
  • 数据和反馈:无监督学习只使用输入数据,不依赖于标签。它的目标是发现数据中的结构和模式,如聚类、密度估计或降维。
  • 反馈方式:由于没有标签,无监督学习没有直接的反馈方式。它依赖于算法自身的准则来评估学习的有效性,如数据点之间的距离或数据的内在分布。
强化学习
  • 数据和反馈:强化学习侧重于在环境中通过试错来学习策略。智能体执行动作并接收环境的状态和奖励作为反馈。
  • 反馈方式:强化学习中的反馈是动作导致的奖励或惩罚,这是一种间接的反馈,因为奖励通常不直接指示最佳动作,而是提供了动作好坏的评估。

技术共享:虽然这三种学习方法在目标和方法上有所不同,但它们在技术上经常有所交叉。例如,强化学习中的策略网络和价值网络可以使用监督学习技术进行训练。

应用融合:在实际应用中,这些方法可以组合使用。例如,在一个复杂的机器人控制系统中,可能同时使用监督学习进行物体识别、无监督学习进行数据聚类和降维,以及强化学习来优化决策过程。

强化学习与其他机器学习类型的主要区别在于它是通过与环境的交互来学习如何行动以最大化奖励,而非仅仅预测标签或发现数据模式。

三、马尔可夫决策过程(Markov Decision Process, MDP)

1)MDP的基本组成元素
 2)解决方法
a)基于策略的方法(Policy-Based Methods)

import numpy as np
import gym

def policy(state, weights):
    """ 简单的线性策略 """
    z = state.dot(weights)
    exp = np.exp(z)
    return exp / np.sum(exp)

def policy_gradient():
    env = gym.make('CartPole-v1')  # 使用Gym库中的CartPole环境
    weights = np.random.rand(env.observation_space.shape[0], env.action_space.n)  # 随机初始化权重
    alpha = 0.01  # 学习率
    num_episodes = 1000  # 训练的总episode数

    for episode in range(num_episodes):
        state = env.reset()
        gradients = []
        rewards = []
        score = 0
        done = False

        while not done:
            probabilities = policy(state, weights)
            action = np.random.choice(len(probabilities), p=probabilities)
            next_state, reward, done, info = env.step(action)

            # 计算梯度
            dsoftmax = probabilities.copy()
            dsoftmax[action] -= 1
            gradient = state[:, np.newaxis].dot(dsoftmax[np.newaxis, :])
            gradients.append(gradient)
            rewards.append(reward)
            state = next_state
            score += reward

        # 计算累积奖励
        for i in range(len(gradients)):
            weights += alpha * gradients[i] * sum([r * (0.99 ** t) for t, r in enumerate(rewards[i:])])

        if episode % 100 == 0:
            print(f"Episode {episode}: Total reward = {score}")

if __name__ == "__main__":
    policy_gradient()

b)基于值的方法 (Value-Based Methods)

def value_iteration(states, actions, transition_probs, rewards, gamma, epsilon):
    V = {state: 0 for state in states}  # 初始状态价值函数为0
    while True:
        delta = 0
        for state in states:
            V_old = V[state]
            # 计算每个动作的价值并选择最大值
            V[state] = max(sum(transition_probs[state][action][next_state] *
                               (rewards[state][action] + gamma * V[next_state])
                               for next_state in transition_probs[state][action])
                           for action in actions)
            delta = max(delta, abs(V_old - V[state]))
        if delta < epsilon:
            break

    # 从价值函数导出策略
    policy = {state: None for state in states}
    for state in states:
        policy[state] = max(actions, key=lambda action: sum(transition_probs[state][action][next_state] *
                                                            (rewards[state][action] + gamma * V[next_state])
                                                            for next_state in transition_probs[state][action]))
    return policy, V

# 使用函数
states = ...  # 状态列表
actions = ...  # 动作列表
transition_probs = ...  # 转移概率字典
rewards = ...  # 奖励字典
gamma = 0.99  # 折扣因子
epsilon = 0.01  # 阈值
policy, V = value_iteration(states, actions, transition_probs, rewards, gamma, epsilon)

 

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值