强化学习(Reinforcement Learning)学习笔记DAY01(RL分类和Q Learning简单例子)

分类

可以把所有的强化学习分成两类:Model-Free RL和Model-Based RL。

还可以分成以下两类:基于概率(Policy-Based RL)和基于价值(Value-Baesd RL)。

还有另外一种分类:回合更新(Monte-Carlo update)和单步更新(Temporal-Difference update)。

要说的最后一种分类:在线学习(On-Policy)、离线学习(Off-Policy)。

Model-Based与Model-Free

可参考https://blog.csdn.net/broadview2006/article/details/100556095

Model-Based能通过想象来预判接下来遇到的所有情况。然后根据想象中的情况选择最好的那种,并根据这种情况采取下一步的策略。

Model-free类似黑盒,整个Model是未知的,只能按部就班,一步一步等待真实世界的反馈来设置学习策略,进行下一步行动。


Policy-Based RL和Value-Baesd RL

连续的动作不能用基于价值的方法来做。

Policy-Based RL方法:Policy Gradients。

Value-Baesd  RL方法:Q Learning、Sarsa。

结合两种的方法:Actor-Critic。

Actor会基于概率做出动作,Critic会对于做出的动作给出动作的价值。


Monte-Carlo update和Temporal-Difference update

Monte-Carlo update指的是游戏开始后到游戏结束,总结回合中所有的转折点,再更新我们的行为准则。

方法:基础版Policy Gradiente、Monte-Carlo learning。

Temporal-Difference update指的是在游戏过程中每一步都在更新,不用等待游戏的结束,便可以边玩边学习了。

方法:升级版Policy Gradiente、Q learning、Sarsa。


On-Policy和Off-Policy

所谓的在线学习就是必须本人在场,而且必须是本人边玩边学习。离线学习则是可以自己玩也可以看着别人玩。

On-Policy方法:Sarsa、Sarsa(λ)。

Off-Policy方法:Q Learning、Deep Q Network。


Q Learning

Q Learning算法:

参数意义:

  • \varepsilon-greedy是用在决策上的一种策略,\varepsilon等于0.9时就说明90%的情况会按照Q表的最优值来选择行为,10%的情况选择随机行为。
  • α是学习效率,来决定这一次的误差有多少要学习。
  • γ是对未来的衰减值。


Q Learning简单例子

根据以上算法写代码:

import numpy as np
import pandas as pd
import time

np.random.seed(2) #产生一组伪随机数列,每次运行随机过程都是一样的

N_STATES = 6      # 离宝藏的距离有多少步
ACTIONS = ['left', 'right']     # 两个动作(左+右)
EPSILON = 0.9   # 0.9最优动作+0.1随机动作
ALPHA = 0.1     # learning rate
GAMMA = 0.9    # discount factor
MAX_EPISODES = 13   # maximum episodes 只玩13回合
FRESH_TIME = 0.01    # fresh time for one move 走一步花的时间有多长


def build_q_table(n_states, actions):
    table = pd.DataFrame(
        np.zeros((n_states, len(actions))),    # q_table initial values
        columns=actions,      # actions's name
    )
    print(table)
    return table


def choose_action(state, q_table):
    # This is how to choose an action
    state_actions = q_table.iloc[state, :]
    if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()):  # act non-greedy or state-action have no value
        action_name = np.random.choice(ACTIONS)
    else:   # act greedy
        action_name = state_actions.idxmax()    # replace argmax to idxmax as argmax means a different function in newer version of pandas
    return action_name

def get_env_feedback(S, A): #获得行为奖励R和下一个state
    # This is how agent will interact with the environment
    if A == 'right':    # move right
        if S == N_STATES - 2:   # terminate
            S_ = 'terminal'
            R = 1
        else:
            S_ = S + 1
            R = 0
    else:   # move left
        R = 0
        if S == 0:
            S_ = S  # reach the wall
        else:
            S_ = S - 1
    return S_, R

def update_env(S, episode, step_counter):  #建立环境,没必要具体看
    # This is how environment be updated
    env_list = ['-']*(N_STATES-1) + ['T']   # '---------T' our environment
    if S == 'terminal':
        interaction = 'Episode %s: total_steps = %s' % (episode+1, step_counter)
        print('\r{}'.format(interaction), end='')
        time.sleep(2)
        print('\r                                ', end='')
    else:
        env_list[S] = 'o'
        interaction = ''.join(env_list)
        print('\r{}'.format(interaction), end='')
        time.sleep(FRESH_TIME)


def rl():
    # main part of RL loop
    q_table = build_q_table(N_STATES, ACTIONS) #创建qtable
    for episode in range(MAX_EPISODES):
        step_counter = 0
        S = 0       #初始状态
        is_terminated = False  #是否为终止符
        update_env(S, episode, step_counter)  #更新环境
        while not is_terminated:

            A = choose_action(S, q_table)  #根据初始state选择action
            S_, R = get_env_feedback(S, A) #获得行为奖励R和下一个state
            q_predict = q_table.loc[S, A]  #估计值
            if S_ != 'terminal':
                q_target = R + GAMMA * q_table.iloc[S_, :].max() #真实值
            else:
                q_target = R     # next state is terminal
                is_terminated = True #回合终止后没有下一个的qnext,改为终止跳出循环

            q_table.loc[S, A] += ALPHA * (q_target - q_predict)  # update
            S = S_  # move to next state

            update_env(S, episode, step_counter+1)  #探索者走了每一步再更新环境
            step_counter += 1
    return q_table

if __name__ == "__main__":
    q_table = rl()
    print('\r\nQ-table:\n')
    print(q_table)

运行结果如下:

 

可见qtable的左边都是比右边要小的,因为有90%概率选到朝右走的值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
强化学习是一种通过与环境互动来学习最佳行为策略的机器学习方法。为了开始学习这一领域,首先需要了解一些强化学习的基本算法。《Reinforcement Learning: An Introduction》(Sutton and Barto, 1998)是一本经典的强化学习教材,可以帮助初学者了解强化学习的基本概念和算法。该书介绍了强化学习的基本原理、价值函数、贝尔曼方程等重要概念,并介绍了一些经典的强化学习算法,如蒙特卡洛方法、时序差分学习、Q-learning等。这些算法是理解强化学习的基石,对初学者来说非常有帮助。 另外一本不错的入门教材是《Algorithms for Reinforcement Learning》(Szepesvári, 2009),这本书更加强调强化学习的算法和数学基础。它详细介绍了动态规划、值迭代、策略迭代、TD学习强化学习算法,并提供了一些例子和应用场景,有助于初学者更深入地理解强化学习算法的原理和实际应用。 除了书籍,MOOC平台上也有一些优秀的强化学习入门课程,如Coursera上的《Reinforcement Learning Specialization》和Udemy上的《Practical Reinforcement Learning》。这些课程结合了理论和实践,通过视频、案例分析等方式向学习者介绍强化学习的基本原理和算法,并帮助学习者掌握强化学习的实际应用技能。 总之,要想学习强化学习,首先需要了解一些基本的强化学习算法,上述提到的书籍和课程都是不错的入门资料,可以帮助初学者快速入门强化学习领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值