一、強化學習簡述
強化學習是一種通過與環境交互,學習狀態到行為的映射關系,以獲得最大積累期望回報的方法。包含環境,動作和獎勵三部分,本質是智能體通過與環境的交互,使得其作出的動作所得到的決策得到的總的獎勵達到最大。強化學習主要是智能體與環境的交互過程。
步驟:
智能體先觀察環境的狀態。狀態是智能體周圍的位置布局或者智能體與周圍物體的距離,通常用向量表示。
基于當前觀察到的狀態,智能體選擇一定策略決定采取的動作,根據每個動作的價值分配一個選擇的概率,價值越高的動作被選中的概率越大,所有動作都有可能會被選擇。
智能體執行動作后,觀察環境對其動作的響應,接收新的狀態和相應的獎勵,獎勵是標量值,用于評估所選動作的好壞。
基于新獲得的狀態和獎勵,智能體采用一定的價值函數更新其對當前策略的價值評估:時序差分學習、蒙特卡洛方法、動態規劃方法。
重復上面步驟改變策略直至達到停止條件。
二、用DQN方法創建智能體并實現智能體訓練與環境的交互
1.簡述
深度Q網絡(DQN)是一種結合了Q學習和深度神經網絡的強化學習算法,用于解決具有高維狀態空間的問題。DQN通過使用一個神經網絡來近似動作價值函數(Q值),從而能夠處理復雜的狀態輸入,并為每個可能的動作估計其預期收益。使得智能體能夠在未知環境中通過試錯學習到最優策略。
?
2.代碼
clear
clc%%
%創建強化學習環境%使用預定義環境直接創建一個離散動作空間的倒立擺環境
env = rlPredefinedEnv('CartPole-Discrete'); %查看環境的狀態信息
%getObservationInfo函數返回環境中狀態觀測值的相關信息,包括每個狀態變量的名稱、描述、低值、高值以及維度
obsInfo = getObservationInfo(env); %查看環境的動作信息
%getActionInfo函數返回環境中所有可能動作的相關信息
actInfo = getActionInfo(env); %rng函數控制隨機數生成器的狀態
%設置為0,表示每次運行時都會使用相同的隨機數序列,確保了結果的一致性和可重復性
rng(0) %%
%創建智能體% 創建神經網絡結構
%定義神經網絡的超參數
layers =[ %特征輸入層,大小為狀態觀測值的維度。%使用featureInputLayer函數創建一個輸入層%obsInfo.Dimension(1)參數表示環境狀態空間的維度featureInputLayer(obsInfo.Dimension(1)) %fullyConnectedLayer函數創建一個全連接層,傳入參數為神經元數量%創建兩個全連接層有助于在保持重要信息的同時降低模型復雜度fullyConnectedLayer(200) fullyConnectedLayer(50) %用reluLayer函數創建一個ReLU激活層,引入了非線性,對輸入數據進行非線性處理reluLayer %創建全連接層為輸出層,神經元數量等于環境中可執行的動作數,通過這個層預測每個動作的價值%length(actInfo.Elements)返回環境中所有可能動作的數量。fullyConnectedLayer(length(actInfo.Elements))
]; %dlnetwork函數將之前定義的layers數組轉換為一個可被MATLAB中的深度學習工具箱所識別和使用深度學習網絡對象,進而進行訓練操作
net = dlnetwork(layers); %用rlVectorQValueFunction函數創建一個Q值函數作為評估器
%傳入參數net表示已創建好的神經網絡;obsInfo和actInfo分別表示狀態信息和動作信息
%該Q值函數用于評估在給定狀態下采取每個可能動作的價值
critic = rlVectorQValueFunction(net, obsInfo, actInfo);%用rlOptimizerOptions函數設置Q值函數的優化參數
%傳入參數LearnRate表示學習率;GradientThreshold表示梯度閾值
%學習率控制模型參數更新速度;梯度閾值有助于穩定訓練過程
crtic_Opts = rlOptimizerOptions(LearnRate=1e-3, GradientThreshold=1);%用rlDQNAgentOptions函數設置DQN智能體的訓練選項
%SampleTime0表示每個時間步的時間間隔
%MiniBatchSize表示每次抽取訓練樣本的數量
%UseDoubleDQN表示不使用雙重DQN
agentoption = rlDQNAgentOptions( ...SampleTime = 0.1, ... Critic = crtic_Opts, ... MiniBatchSize = 256, ... UseDoubleDQN = false); %用rlDQNAgent函數創建DQN智能體
agent = rlDQNAgent(critic, agentoption); %%
%配置訓練選項%MaxEpisodes表示智能體與環境交互的最大次數
%MaxStepsPerEpisode表示每次與環境交互智能體執行的最大操作次數
%"StopTrainingCriteria","AverageReward"表示停止訓練的標準是基于平均獎勵
%"SaveAgentCriteria","AverageReward"表示當達到某個平均獎勵時保存智能體
trainOpts = rlTrainingOptions( ..."MaxEpisodes", 200, ... "MaxStepsPerEpisode", 400, ... "StopTrainingCriteria", "AverageReward", ... "StopTrainingValue", 400, ... "SaveAgentCriteria", "AverageReward", ... "SaveAgentValue", 100); %%
%繪圖,使推桿系統可視化
plot(env) %%
%訓練智能體
%用train函數實現智能體與環境之間的交互訓練過程
%在訓練過程中,智能體學習如何通過最大化累積獎勵來選擇最佳動作
training_Stats = train(agent, env, trainOpts);
3.運行結果
淺藍色折線表示每輪智能體與環境交互的獎勵
深藍色折線表示當前所有交互輪次的平均獎勵
三、用simulink模型創建環境
Simulink是一個基于MATLAB的圖形化編程環境,用于建模、仿真和分析多域動態系統,由一系列模塊組成,這些模塊代表了系統的各個組成部分。
用simulink模型創建強化學習環境,接收智能體的動作作為輸入,輸出相應的觀察值、獎勵和完成信號。
?