筆記:強化學習入門:Q Learning+ 補充:代碼部分

1強化學習是機器學習的一個重要的分支,它主要研究如何在環境中做出合適的動作以最大化某些獎勵

理解:在所處環境下,怎樣達到目標的最優方法或者步驟

2強化學習中的幾個核心概念

  • 智能體(Agent)
  • 環境(Environment)
  • 動作(Action)
  • 獎勵(Reward)

智能體存在於環境中,並會在環境中作出一些動作,這些動作會使得智能體獲得一些獎勵,這些獎勵有正有負。

強化學習的目標是學習一個策略,使得智能體可以在合適的時候作出合適的動作以獲得最大的獎勵。

就像我們要達成某個目標一步步的行動,比如英語考級,作出的行動對於目標 正的反饋和負的反饋

比如專注背單詞 有助於 考英語等級  正反饋  荒廢了一些時間 負反饋 

強化學習就是要學習達成目標的最後策略

3還有一個重要的概念:狀態

狀態是描述了智能體和環境的狀況,它和環境以及智能體都有關

智能體一般以當前的狀態作爲決策依據,作出決策後,智能體的行爲又會引起狀態的改變。

4圖示

自己畫的 

狀態就是指智能體+環境的狀態 

5例子:走迷宮

孩子在迷宮中要找到圖中的寶藏

這裏孩子只能上下左右一步一步的走

其中不同的位置代表不同的狀態( s1,s2,s3....)

孩子採取的行動(Action)有四個上下左右:a1,a2,a3,a4。

在不同的位置(不同的狀態下)採取不同的行動(Action)會得到不同的期望獎勵(Reward)

6 Q函數

Q Learning算法的核心是Q(s,a)函數 ,其中s表示狀態,a表示行爲 

Q函數可以看作一個“表格”,每一行代表一個狀態,每一列代表一個行爲。

Q(s,a)的值是在s狀態執行了a行爲後的期望獎勵值

只要得到正確的函數Q函數,可以在沒個狀態做出合適的決策了

7 Q函數的學習策略

Q(state,action):表示在狀態state下執行action後期望得到的獎勵

實際上執行action後狀態爲state變成new_state  並得到了獎勵reward

Q Learning算法用 

數學公式上:

Q(s,a)←(1-α)Q(s,a)+α[R+γmaxQ(s',a)] 

來更新Q函數 s’代表新的狀態

代碼上

Q Learning 算法用reward+GAMMA*Q[new_state,:].max() 來近似期望得到的獎勵

8 用學習率ALPHA來代替公式中的GAMMA

GAMMA:

Q[new_state,:].max 表示新狀態下的最大期望獎勵 由於是下一個時間節點的值 因此要乘以一個衰減係數GAMMA

一般不直接使用reward+GAMMA*Q[new_state,:].max() 來更新Q函數 

而是設置一個學習率ALPHA  :

(1-ALPHA)*Q(state,action)+ALPHA*Q[new_state,:].max() 來更新Q函數

原因: 這樣更新比較平緩 防止模型過早收斂到局部極小值

9ε-greedy策略

在Q learning的更新過程中 每一步都要根據當前狀態一起Q函數確定一個合適的行動action

這裏要考慮一個平衡經驗和探索的問題

完全按照經驗行動 : 每次都根據Q函數選擇期望對應最大的action 我們可有可能會一直侷限現有的經驗之中,難以發現新的行爲。

如果智能體只關注探索新的行爲 :完全隨機行爲 ,而大多數行爲是沒有價值的 ,導致Q函數學習的速度很慢。

使用ε-greedy策略來選擇合適的行動。

設置一個較小ε的值 

以(1-ε)概率來憑藉經驗做出選擇,得到Q(s,a)最大的期望。

以ε概率來隨機進行探索

10Qlearning算法每次更新Q函數的步驟

  1. 使用ε-greedy策略或其他方法選出一個acion
  2. 智能體猜取動作action 得到獎勵reward 和 新的狀態 new_state
  3. (1-ALPHA)*Q(state,action)+ALPHA*Q[new_state,:].max() 來更新Q函數

代碼

迷宮的環境

from __future__ import print_function
import copy

迷宮的地圖 

#迷宮地圖
MAP = \
    '''
.........
.       .
.     o .
.       .
.........
'''
MAP = MAP.strip().split('\n')
MAP = [[c for c in line] for line in MAP]

現在MAP

​
MAP 
[['.', '.', '.', '.', '.', '.', '.', '.', '.'],
 ['.', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '.'],
 ['.', ' ', ' ', ' ', ' ', ' ', 'o', ' ', '.'],
 ['.', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '.'],
 ['.', '.', '.', '.', '.', '.', '.', '.', '.']]

​

四個action 

DX = [-1, 1, 0, 0]
DY = [0, 0, -1, 1]
#左右上下

環境類的定義:我的理解寫在註釋上面 

#環境類

class Env(object):
    #初始化
    def __init__(self):
        #迷宮
        self.map = copy.deepcopy(MAP)
        #智能體的初始位置1,1
        self.x = 1
        self.y = 1
        self.step = 0
        self.total_reward = 0
        self.is_end = False
    
    #在環境中做出行動
    def interact(self, action):
        assert self.is_end is False
        new_x = self.x + DX[action]
        new_y = self.y + DY[action]
        new_pos_char = self.map[new_x][new_y]#計算新的座標
        self.step += 1#移動次數
        #判斷新的位置是什麼樣的?牆壁 or 無東西 or 寶藏 or 陷阱
        if new_pos_char == '.':
            reward = 0  # do not change position
        elif new_pos_char == ' ':
            self.x = new_x
            self.y = new_y
            reward = 0
        elif new_pos_char == 'o':
            self.x = new_x
            self.y = new_y
            self.map[new_x][new_y] = ' '  # update map
            self.is_end = True  # end #獲得保障 結束遊戲
            reward = 100 #獎勵值100 get
        elif new_pos_char == 'x':
            self.x = new_x
            self.y = new_y
            self.map[new_x][new_y] = ' '  # update map
            reward = -5 #掉入陷阱 懲罰 :獎勵值-5
        self.total_reward += reward
        return reward

    @property
    #總的狀態數
    def state_num(self):
        rows = len(self.map)
        cols = len(self.map[0])
        return rows * cols#行×列 5×9 = 45

    @property
    #當前狀態的編碼
    def present_state(self):
        cols = len(self.map[0])
        return self.x * cols + self.y#x座標×cls數+y座標
    #打印智能體在迷宮上面的位置
    def print_map(self):
        printed_map = copy.deepcopy(self.map)
        printed_map[self.x][self.y] = 'A'
        print('\n'.join([''.join([c for c in line]) for line in printed_map]))

    def print_map_with_reprint(self, output_list):
        printed_map = copy.deepcopy(self.map)
        printed_map[self.x][self.y] = 'A'
        printed_list = [''.join([c for c in line]) for line in printed_map]
        for i, line in enumerate(printed_list):
            output_list[i] = line

 Q Learning 算法 

from __future__ import print_function
import numpy as np
import time
from env import Env

設置超參數

EPSILON = 0.1
ALPHA = 0.1
GAMMA = 0.9
MAX_STEP = 30

np.random.seed(0)

 定義了epsilon_greedy策略函數

和Q Learning 算法的過程

def epsilon_greedy(Q, state):
    #np.random.uniform()隨機參數 大於 0.9時 採用 隨機的探索的方式 來決定下一個action
    #如果根據經驗 來期望最大值action的期望值爲0  採用隨機探索方式
    #np.random.uniform()隨機參數 小於 0.9時  根據Q函數採取最大期望獎勵的action
    if (np.random.uniform() > 1 - EPSILON) or ((Q[state, :] == 0).all()):
        action = np.random.randint(0, 4)  # 0~3
    else:
        action = Q[state, :].argmax()
    return action

#Q函數的定義
#這裏一共有45個狀態 每個狀態有4個action Q函數就是這些狀態對應不同的操作的期望獎勵的值
#45×4
e = Env()
Q = np.zeros((e.state_num, 4))

for i in range(200):
    e = Env()#迷宮環境
    while (e.is_end is False) and (e.step < MAX_STEP):
        action = epsilon_greedy(Q, e.present_state)#根據epsilon_greedy 確定接下來的action
        state = e.present_state#當前的狀態
        reward = e.interact(action)#執行action 運行這個函數的時候 智能體的座標改變 相當於更新了狀態
        new_state = e.present_state#更新state
        #更新Q值 ALPHA = 0.1 GAMMA = 0.9
        Q[state, action] = (1 - ALPHA) * Q[state, action] + \
            ALPHA * (reward + GAMMA * Q[new_state, :].max())
        #打印
        e.print_map()
        time.sleep(0.1)#遲調用線程的運行,可通過參數secs指秒數,表示進程掛起的時間
    print('Episode:', i, 'Total Step:', e.step, 'Total Reward:', e.total_reward)
    time.sleep(2)

其中一次遊戲運行的過程 

.........
. A     .
.     o .
.       .
.........
.........
.A      .
.     o .
.       .
.........
.........
. A     .
.     o .
.       .
.........
.........
.  A    .
.     o .
.       .
.........
.........
.   A   .
.     o .
.       .
.........
.........
.    A  .
.     o .
.       .
.........
.........
.     A .
.     o .
.       .
.........
.........
.       .
.     A .
.       .
.........

源碼分享:碼雲:https://gitee.com/MaLuBuShiWo/Q-Learning/tree/master

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章