強化學習的一些相關概念
- 智能體(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 後的累計
獎勵。
假定已經獲得一個最優的 Q 矩陣,則對任意狀態 s 出發,到達目標狀態的算法如下
步驟 1:隨機選擇一個初始狀態 s
步驟 2:確定行動 a,使它滿足 a = argmax{ Q(s , )},∈A ,A是所有可能行動集合
步驟 3:令 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 , 得到下一個狀態
步驟 4:按照轉移規則,計算Q(s,a)
步驟 5: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矩陣的求取嗎?
繼續學強化學習,看看有啥新的體會與想法沒