1. 程式人生 > 其它 >強化學習——Q學習演算法

強化學習——Q學習演算法

————————————————————2020.8.11更新————————————————————

強化學習的一些相關概念

  • 智慧體(Agent): 智慧體對環境進行觀察,決策出行動,獲得一個從環境返回的獎勵
  • 決策(Decision):意識層面的
  • 行動(Action , a):物質層面的
  • 環境(Environment):與智慧體互動的物件
  • 狀態(State,s):是歷史資訊的函式,包含所有已有的資訊。
  • 獎勵(Reward,R):是智慧體採取行動後環境的一個反饋
  • 策略(Policy):是狀態到動作的函式
  • 價值函式(Value function):是評價狀態的一個指標
  • 模型(Model):是個體對環境的建模

例題 1

背景描述:假設某個樓層共有 5 個房間,房間之間通過一道門相連,正如下圖所示。我們將
房間編號為房間 0 到房間 4,樓層的外部,編號為 5。注意到房間 1 和房間 4 都可以直接通
到外部 5。


問題:假設有一個機器人對樓層的佈局事先不知道,如何讓一個機器人,從任意房間出發,能走到外面嗎?

從獎勵矩陣 R 出發來理解各個概念:
智慧體(Agent):機器人
決策(Decision):從當前所在房間準備往哪裡去
行動(Action):決策好到哪裡去後,行動到那裡去
環境(Environment):樓層佈局
狀態(State):當前所在房間
獎勵(Reward):從當前房間走到另一個房間的獎勵值(獎勵矩陣中-1 表示無效值)

獎勵矩陣 R(state, action)或 R(s, a): 每個元素值 R(s,a)表示在當前狀態 s 下,採取行動 a 後
的即時獎勵。

Q-學習簡介

Q 矩陣:跟 R 矩陣維數相同,不同的是 Q(s, a)表示在當前狀態 s 下,採取行動 a 後的後續累計獎勵。是狀態 s 和行動 a的函式, Q(s, a)用於評價當前狀態 s 下,採取行動 a的結果好壞,Q也叫動作價值函式

假定已經獲得一個最優的 Q 矩陣,則對任意狀態 s 出發,到達目標狀態的演算法如下

步驟 1:隨機選擇一個初始狀態 s
步驟 2:確定行動 a,使它滿足 a = argmax{ Q(s , \(\widetilde{a}\)

)},\(\widetilde{a}\)∈A ,A是所有可能行動集合
步驟 3:令 s = \(\widetilde{s}\),(\(\widetilde{s}\)為執行動作 a 後對應的下一個狀態)
步驟 4:返回步驟 2

假定初始狀態為 2,根據最優 Q 矩陣,有 2→3→1(4) →5→5;
假定初始狀態為 1,根據最優 Q 矩陣,有 1→5→5;
假定初始狀態為 0,根據最優 Q 矩陣,有 0→4→5→5;

如何獲取最優的 Q 矩陣?
答案:Q-學習演算法

Q-學習演算法流程

步驟 1:給定獎勵矩陣 R 和學習引數 γ,初始化 Q = 0,
步驟 2:隨機選擇一個初始狀態 s,在當前狀態 s 的所有可能行動中選取一個行動 a
步驟 3:利用選定的行為 a , 得到下一個狀態 \(\widetilde{s}\)
步驟 4:按照轉移規則,計算Q(s,a)
步驟 5:s = \(\widetilde{s}\),判斷得到的Q矩陣是否收斂,不收斂則返回步驟 2,收斂則退出,完成q矩陣的學習

matlab演算法如下

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 機器人如何從五個房間中的任意一個走出來?
% 中南大學 自動化學院 智慧控制與優化決策課題組
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Q學習演算法
% function Q = Reinforcement_Learning(R,gamma)
clear all
clc;
format short    %顯示4位小數
format compact  %壓縮空格

% 輸入: R and gamma
% R:即時獎勵矩陣; 行、列表示狀態
% -1 = 表示無效值
R = [-1,-1,-1,-1,0, -1;
     -1,-1,-1,0,-1, 100;
     -1,-1,-1,0,-1, -1;
     -1, 0, 0,-1,0, -1;
      0,-1,-1,0,-1, 100;
     -1,0, -1,-1,0, 100];
gamma = 0.80;            % 學習引數

N = size(R,1); % R的行數,所有狀態的個數,一行代表一個狀態的所有資訊
Q  = zeros(size(R));     % 初始化Q矩陣,其行數和列數和R一樣。Q初始全是0
Q1 = ones(size(R))*inf;  % 前一次比較物件,判定收斂,Q初始全是無窮大
count = 0;               % 計數器
    
    for episode = 0:50000
       % 產生隨機初始狀態
       state = ceil(N*rand);    %產生1-N之間的隨機數
       % 從當前狀態出發,選擇一個行動
       x = find(R(state,:)>=0);   % 所有可能行動,R(state,:)代表R的第state行,find(R(state,:)>=0)代表R的第state行裡面大於0的數的列位置集合,是個行向量,
       %上一句程式碼理解成找出當前狀態可以向那些狀態轉移
       if ~isempty(x)   %如果有可以轉移的
          x1= x((ceil(length(x)*rand)));                  % 隨機選擇一個行動,理解成隨機向一個狀態轉移,x1代表第幾行(即為第幾個狀態)
       end

       qMax = max(Q,[],2);   %返回矩陣中每行的最大值,是一個列向量,大小是Q的行數,每行最大值物理含義是這個狀態下的最好獎勵(最好出路)
       Q(state,x1) = R(state,x1) + gamma*qMax(x1);   % 轉移規則。qMax(x1)代表x1這個狀態下的最好獎勵
       
       % 判定是否收斂  其實就是前後兩個Q矩陣的差很小就認為是收斂了
       if sum(sum(abs(Q1-Q)))<0.0001 && sum(sum(Q>0)) %sum(sum(Q>0))代表Q大於0的數的個數,sum(sum(abs(Q1-Q)))代表Q1與Q對應位置相減絕對值之和
          if count > 1000         %且學習了超過1千次
              disp(strcat('強化學習的總次數: ',num2str(episode)));     
             break                %跳出for迴圈
          else                    %沒有學習了超過1千次
             count = count+1; 
          end
       else  %不收斂,差距很大
          Q1 = Q;  %把最新的一個Q作為比較物件,覆蓋掉原來的
          count = 0; 
       end
    end

% 歸一化
Qmax = max(max(Q));%max(max(Q))代表Q裡面最大的元素,max(Q)代表每一列最大的元素
if Qmax >0
    Q = 100*Q/Qmax;
end
Q

本文來源於中南大學 自動化學院 智慧控制與優化決策課題組周曉君老師的學習筆記,加了一些我自己對程式碼的註釋,

還有兩個問題未解決

1、Q-學習演算法的轉移規則可以換成其他的公式來產生新解迭代嗎

2、除了Q-學習演算法還可以用其他方法來解決Q矩陣的求取嗎?

繼續學強化學習,看看有啥新的體會與想法沒

強化學習學習什麼東西?

1、Q矩陣,動作價值函式算出來的一個矩陣,其中的Q(s,a)評價當前狀態 s 下,採取行動 a 後的結果好壞程度。

2、策略函式π,π(s,a)代表當前狀態 s 下,採取行動 a 的一個概率。當前狀態下所有行動的概率和為1.

只要學到其中一個就可以實現對智慧體的控制了。上面程式碼顯示的就是第一種——Q矩陣的學習