莫烦——强化学习笔记1_Q learning

前言:最近学习强化学习的一些理论,主要是跟着bilibili中莫烦大神的视频学习练习的,此处是一些个人笔记。详细内容可见莫烦大神视频资源。

视频资源:

https://www.bilibili.com/video/BV13W411Y75P?from=search&seid=18050089611052352050

强化学习基本概念

  1. 强化学习的算法
  • 通过价值选行为:(1)Q learning ; (2) Sarsa ; (3) Deep Q network
  • 直接选行为: policy gradients
  • 想象环境并从中学习:model based RL
  1. 强化学习的分类
    (1)基于环境
  • 不理解环境:model free RL
  • 理解环境:model based RL 多出一个步骤——为现实环境建模
    (2)基于概率/价值
  • 基于概率 policy-based:根据概率选择动作,每个动作都有可能选到
  • 基于价值 value-based:选择价值最高的,对于连续动作无能为力
    (3)更新方式
  • 回合更新
  • 单步更新
    (4)学习方式
  • 在线学习(on-policy):必须是自己参与学习 [Sarsa]
  • 离线学习(off-policy):可以借鉴其他人的学习经验 [Q learning、 DQN]

Q learning

s为状态,a为动作,R为奖励值
Q ( s 1 , a 2 ) Q(s_1,a_2) Q(s1,a2)为根据q table 估计的q值, R + r ∗ m a x Q ( s 2 ) R+r*maxQ(s_2) R+rmaxQ(s2)为现实的q值,即考虑了后续步骤的奖励所计算出的q值
莫烦——强化学习笔记1_Q learning_第1张图片
根据现实和估计值的差距,更新q-table。alpha是学习效率,r是对未来奖励的衰减值。
在这里插入图片描述
越远的奖励,衰减越多。r在0到1之间,r越大,说明模型对未来的考虑越多,越有“远见”。
莫烦——强化学习笔记1_Q learning_第2张图片

实例1: 一维探索

import numpy as np
import pandas as pd
import time
np.random.seed(2) #reproducible
#GLOBAL VARIABLES
N_STATES = 6  #状态数
ACTIONS = ['left','right'] #动作
EPSILON = 0.9 #greedy policy
ALPHA = 0.1 #学习率
LAMBDA = 0.9 #未来奖励的衰减因子
MAX_EPISODES = 13 #最多只玩13回合
FRESH_TIME = 0.3 #0.3秒走一步

def build_q_table(n_states,actions):
    table = pd.DataFrame(
    np.zeros((n_states,len(actions))),
    columns=actions,)
    print(table)
    return table

def choose_action(state,q_table):
    state_actions = q_table.iloc[state,:]
    if(np.random.uniform() > EPSILON) or (state_actions.all() == 0):
        #10%的情况或者是初始化的时候,随机选择action
        action_name = np.random.choice(ACTIONS)
    else:
        # 90%的情况选择使得q值最大的action
        action_name = state_actions.idxmax()
    return action_name
    
def get_env_feedback(S,A):
    #s_为下一个状态,R为reward
    if A == 'right':
        if S == N_STATES - 2:
            S_ = 'terminal'
            R = 1
        else:
            S_ = S+1
            R = 0
    else:
        R = 0
        if S == 0:
            S_ =S
        else:
            S_ =S-1
    return S_,R    

def update_env(S, episode, step_counter):
    #更新环境,到达最右端就是胜利,在一维的环境移动
    env_list = ['-'] * (N_STATES -1)+['T'] #'-----T'就是环境
    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():
    q_table = build_q_table(N_STATES, ACTIONS)
    for episode in range(MAX_EPISODES):
        step_counter = 0
        #初始化状态
        S = 0
        is_terminated = False
        #首先更新环境
        update_env(S,episode,step_counter)
        while not is_terminated:
            #选择action
            A = choose_action(S, q_table)
            #得到下一个state个reward
            S_, R =get_env_feedback(S,A)
            # q的估计值
            q_predict = q_table.loc[S,A]
            if S_ != 'terminal':
                #q的真实值
                q_target = R + LAMBDA * q_table.iloc[S_,:].max()
            else:
                q_target = R
                is_terminated = True
            # 更新q table
            q_table.loc[S,A] += ALPHA * (q_target - q_predict)
            #state 更新
            S = S_
            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)           

效果展示
莫烦——强化学习笔记1_Q learning_第3张图片

实例2: 二维迷宫

小结

强化学习q-learning的主要步骤:

  1. 初始化环境
  2. choose_action
  3. 得到state_, reward
  4. learn,更新q-table
  5. 判断本轮学习是否结束

你可能感兴趣的:(强化学习)