???♂? 個(gè)人主頁:@Lingxw_w的個(gè)人主頁
???作者簡介:計(jì)算機(jī)研究生在讀,研究方向復(fù)雜網(wǎng)絡(luò)和數(shù)據(jù)挖掘,阿里云專家博主,華為云云享專家,CSDN專家博主、人工智能領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,安徽省優(yōu)秀畢業(yè)生
?? 希望大家多多支持,我們一起進(jìn)步!??
如果文章對(duì)你有幫助的話,
歡迎評(píng)論 ??點(diǎn)贊???? 收藏 ??加關(guān)注+?
目錄
1、強(qiáng)化學(xué)習(xí)是什么
1.1 定義
1.2 基本組成
1.3 馬爾可夫決策過程
2、強(qiáng)化學(xué)習(xí)的應(yīng)用
3、常見的強(qiáng)化學(xué)習(xí)算法
3.1 Q-learning算法
3.2 Q-learning的算法步驟
3.3 Pytorch代碼實(shí)現(xiàn)
1、強(qiáng)化學(xué)習(xí)是什么
1.1 定義
強(qiáng)化學(xué)習(xí)(Reinforcement Learning,RL)是一種機(jī)器學(xué)習(xí)方法,其目標(biāo)是通過智能體(Agent)與環(huán)境的交互學(xué)習(xí)最優(yōu)行為策略,以使得智能體能夠在給定環(huán)境中獲得最大的累積獎(jiǎng)勵(lì)。
強(qiáng)化學(xué)習(xí)在許多領(lǐng)域都有應(yīng)用,例如機(jī)器人控制、游戲智能、自動(dòng)駕駛、資源管理等。通過與環(huán)境的交互和試錯(cuò)學(xué)習(xí),強(qiáng)化學(xué)習(xí)使得智能體能夠在復(fù)雜、不確定的環(huán)境中做出優(yōu)化的決策,并逐步提升性能。
1.2 基本組成
強(qiáng)化學(xué)習(xí)的基本組成部分包括:
智能體(Agent):在強(qiáng)化學(xué)習(xí)中,智能體是學(xué)習(xí)和決策的主體,它通過與環(huán)境的交互來獲取知識(shí)和經(jīng)驗(yàn),并根據(jù)獲得的獎(jiǎng)勵(lì)信號(hào)進(jìn)行學(xué)習(xí)和優(yōu)化。
環(huán)境(Environment):環(huán)境是智能體所處的外部世界,它可以是真實(shí)的物理環(huán)境,也可以是虛擬的模擬環(huán)境。智能體通過觀察環(huán)境的狀態(tài),執(zhí)行動(dòng)作,并接收來自環(huán)境的獎(jiǎng)勵(lì)或懲罰信號(hào)。
狀態(tài)(State):狀態(tài)表示環(huán)境的某個(gè)特定時(shí)刻的觀察或描述,它包含了智能體需要的所有信息來做出決策。
動(dòng)作(Action):動(dòng)作是智能體在某個(gè)狀態(tài)下采取的行為,它會(huì)對(duì)環(huán)境產(chǎn)生影響并導(dǎo)致狀態(tài)的轉(zhuǎn)換。
獎(jiǎng)勵(lì)(Reward):獎(jiǎng)勵(lì)是環(huán)境根據(jù)智能體的行為給予的反饋信號(hào),用于指導(dǎo)智能體學(xué)習(xí)合適的策略。獎(jiǎng)勵(lì)可以是正數(shù)(獎(jiǎng)勵(lì))也可以是負(fù)數(shù)(懲罰),智能體的目標(biāo)是最大化累積獎(jiǎng)勵(lì)。
1.3 馬爾可夫決策過程
(Markov Decision Process,MDP)強(qiáng)化學(xué)習(xí)中常用的建??蚣?,用于描述具有馬爾可夫性質(zhì)的序貫決策問題。它是基于馬爾可夫鏈(Markov Chain)和決策理論的組合。
在馬爾可夫決策過程中,智能體與環(huán)境交互,通過采取一系列動(dòng)作來影響環(huán)境的狀態(tài)和獲得獎(jiǎng)勵(lì)。MDP的關(guān)鍵特點(diǎn)是馬爾可夫性質(zhì),即當(dāng)前狀態(tài)的信息足以決定未來狀態(tài)的轉(zhuǎn)移概率。這意味著在MDP中,未來的狀態(tài)和獎(jiǎng)勵(lì)僅取決于當(dāng)前狀態(tài)和采取的動(dòng)作,而與過去的狀態(tài)和動(dòng)作無關(guān)。?
2、強(qiáng)化學(xué)習(xí)的應(yīng)用
強(qiáng)化學(xué)習(xí)旨在解決以下類型的問題:
決策問題:強(qiáng)化學(xué)習(xí)可以用于解決需要做出一系列決策的問題。例如,自動(dòng)駕駛車輛需要在不同交通情況下選擇合適的行駛策略,智能機(jī)器人需要學(xué)習(xí)在復(fù)雜環(huán)境中執(zhí)行任務(wù)的最佳策略。
控制問題:強(qiáng)化學(xué)習(xí)可用于控制系統(tǒng)的優(yōu)化。例如,通過學(xué)習(xí)最優(yōu)策略來調(diào)整電力網(wǎng)格的能源分配,或者在金融投資中確定最佳的投資組合。
資源管理:強(qiáng)化學(xué)習(xí)可以應(yīng)用于資源管理問題,如動(dòng)態(tài)網(wǎng)絡(luò)管理、數(shù)據(jù)中心的負(fù)載平衡、無線通信中的頻譜分配等。智能體可以通過與環(huán)境的交互來學(xué)習(xí)如何最優(yōu)地利用和分配有限的資源。
序列決策問題:強(qiáng)化學(xué)習(xí)適用于需要在連續(xù)時(shí)間步驟中做出決策的問題。例如,在自然語言處理中,可以使用強(qiáng)化學(xué)習(xí)來訓(xùn)練智能體生成合適的文本回復(fù),或者在推薦系統(tǒng)中根據(jù)用戶行為動(dòng)態(tài)調(diào)整推薦策略。
探索與開發(fā):強(qiáng)化學(xué)習(xí)可以用于探索未知環(huán)境和發(fā)現(xiàn)新知識(shí)。通過與環(huán)境的交互,智能體可以通過試錯(cuò)學(xué)習(xí)來積累經(jīng)驗(yàn)并發(fā)現(xiàn)最優(yōu)策略。
3、常見的強(qiáng)化學(xué)習(xí)算法
- Q-learning:一種基于值函數(shù)(Q函數(shù))的強(qiáng)化學(xué)習(xí)算法,通過迭代更新Q值來學(xué)習(xí)最優(yōu)策略。
- SARSA:另一種基于值函數(shù)的強(qiáng)化學(xué)習(xí)算法,與Q-learning類似,但在更新Q值時(shí)采用了一種“狀態(tài)-動(dòng)作-獎(jiǎng)勵(lì)-下一狀態(tài)-下一動(dòng)作(State-Action-Reward-State-Action)”的更新策略。
- 策略梯度(Policy Gradient):一類直接學(xué)習(xí)策略函數(shù)的方法,通過優(yōu)化策略函數(shù)的參數(shù)來提高智能體的性能。
- 深度強(qiáng)化學(xué)習(xí)(Deep Reinforcement Learning):將深度學(xué)習(xí)方法與強(qiáng)化學(xué)習(xí)相結(jié)合,利用神經(jīng)網(wǎng)絡(luò)來表示值函數(shù)或策略函數(shù),以解決具有高維狀態(tài)空間的復(fù)雜任務(wù)。
3.1 Q-learning算法
Q-learning是一種經(jīng)典的強(qiáng)化學(xué)習(xí)算法,用于解決馬爾可夫決策過程(Markov Decision Process,MDP)的問題。它是基于值函數(shù)的強(qiáng)化學(xué)習(xí)算法,通過迭代地更新Q值來學(xué)習(xí)最優(yōu)策略。
在Q-learning中,智能體與環(huán)境的交互過程由狀態(tài)、動(dòng)作、獎(jiǎng)勵(lì)和下一個(gè)狀態(tài)組成。智能體根據(jù)當(dāng)前狀態(tài)選擇一個(gè)動(dòng)作,與環(huán)境進(jìn)行交互,接收到下一個(gè)狀態(tài)和相應(yīng)的獎(jiǎng)勵(lì)。Q-learning的目標(biāo)是學(xué)習(xí)一個(gè)Q值函數(shù),它估計(jì)在給定狀態(tài)下采取特定動(dòng)作所獲得的長期累積獎(jiǎng)勵(lì)。
Q值函數(shù)表示為Q(s, a),其中s是狀態(tài),a是動(dòng)作。初始時(shí),Q值可以初始化為任意值。Q-learning使用貝爾曼方程(Bellman equation)來更新Q值,以逐步逼近最優(yōu)的Q值函數(shù):
Q(s, a) = Q(s, a) + α * (r + γ * max[Q(s', a')] - Q(s, a))
在上述方程中,α是學(xué)習(xí)率(learning rate),決定了每次更新的幅度;r是當(dāng)前狀態(tài)下執(zhí)行動(dòng)作a所獲得的獎(jiǎng)勵(lì);γ是折扣因子(discount factor),用于權(quán)衡即時(shí)獎(jiǎng)勵(lì)和未來獎(jiǎng)勵(lì)的重要性;s'是下一個(gè)狀態(tài),a'是在下一個(gè)狀態(tài)下的最優(yōu)動(dòng)作。
3.2 Q-learning的算法步驟
- 初始化Q值函數(shù)。
- 在每個(gè)時(shí)間步驟中,根據(jù)當(dāng)前狀態(tài)選擇一個(gè)動(dòng)作。
- 執(zhí)行動(dòng)作,觀察獎(jiǎng)勵(lì)和下一個(gè)狀態(tài)。
- 根據(jù)貝爾曼方程更新Q值函數(shù)。
- 重復(fù)2-4步驟,直到達(dá)到預(yù)定的停止條件或收斂。
通過多次迭代更新Q值函數(shù),Q-learning最終能夠收斂到最優(yōu)的Q值函數(shù)。智能體可以根據(jù)Q值函數(shù)選擇具有最高Q值的動(dòng)作作為策略,以實(shí)現(xiàn)最優(yōu)的行為決策。
Q-learning是一種基于模型的強(qiáng)化學(xué)習(xí)方法,不需要對(duì)環(huán)境的模型進(jìn)行顯式建模,適用于離散狀態(tài)空間和動(dòng)作空間的問題。對(duì)于連續(xù)狀態(tài)和動(dòng)作空間的問題,可以通過函數(shù)逼近方法(如深度Q網(wǎng)絡(luò))來擴(kuò)展Q-learning算法。
3.3 Pytorch代碼實(shí)現(xiàn)
基于PyTorch的Q-learning算法來解決OpenAI Gym中的CartPole環(huán)境。
首先,導(dǎo)入所需的庫,包括gym
用于創(chuàng)建環(huán)境,random
用于隨機(jī)選擇動(dòng)作,以及torch
和torch.nn
用于構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
import gym
import random
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
定義了一個(gè)Q網(wǎng)絡(luò)(QNetwork
)作為強(qiáng)化學(xué)習(xí)算法的近似函數(shù)。該網(wǎng)絡(luò)具有三個(gè)全連接層,其中前兩個(gè)層使用ReLU激活函數(shù),最后一層輸出動(dòng)作值。forward
方法用于定義網(wǎng)絡(luò)的前向傳播。
# 定義Q網(wǎng)絡(luò)
class QNetwork(nn.Module):
def __init__(self, state_dim, action_dim):
super(QNetwork, self).__init__()
self.fc1 = nn.Linear(state_dim, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, action_dim)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
接下來,定義了一個(gè)QLearningAgent類。在初始化中,指定了狀態(tài)維度、動(dòng)作維度、折扣因子和探索率等超參數(shù)。同時(shí)創(chuàng)建了兩個(gè)Q網(wǎng)絡(luò):q_network
和target_network
。target_network
用于計(jì)算目標(biāo)Q值。還定義了優(yōu)化器和損失函數(shù)。?
# Q-learning算法
class QLearningAgent:
def __init__(self, state_dim, action_dim, gamma, epsilon):
self.state_dim = state_dim
self.action_dim = action_dim
self.gamma = gamma # 折扣因子
self.epsilon = epsilon # 探索率
# 初始化Q網(wǎng)絡(luò)和目標(biāo)網(wǎng)絡(luò)
self.q_network = QNetwork(state_dim, action_dim)
self.target_network = QNetwork(state_dim, action_dim)
self.target_network.load_state_dict(self.q_network.state_dict())
self.target_network.eval()
self.optimizer = optim.Adam(self.q_network.parameters())
self.loss_fn = nn.MSELoss()
def update_target_network(self):
self.target_network.load_state_dict(self.q_network.state_dict())
def select_action(self, state):
if random.random() < self.epsilon:
return random.randint(0, self.action_dim - 1)
else:
state = torch.FloatTensor(state)
q_values = self.q_network(state)
return torch.argmax(q_values).item()
def train(self, replay_buffer, batch_size):
if len(replay_buffer) < batch_size:
return
# 從回放緩存中采樣一個(gè)小批量樣本
samples = random.sample(replay_buffer, batch_size)
states, actions, rewards, next_states, dones = zip(*samples)
states = torch.FloatTensor(states)
actions = torch.LongTensor(actions)
rewards = torch.FloatTensor(rewards)
next_states = torch.FloatTensor(next_states)
dones = torch.FloatTensor(dones)
# 計(jì)算當(dāng)前狀態(tài)的Q值
q_values = self.q_network(states)
q_values = q_values.gather(1, actions.unsqueeze(1)).squeeze(1)
# 計(jì)算下一個(gè)狀態(tài)的Q值
next_q_values = self.target_network(next_states).max(1)[0]
expected_q_values = rewards + self.gamma * next_q_values * (1 - dones)
# 計(jì)算損失并更新Q網(wǎng)絡(luò)
loss = self.loss_fn(q_values, expected_q_values.detach())
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
select_action
方法用于根據(jù)當(dāng)前狀態(tài)選擇動(dòng)作。以epsilon
的概率選擇隨機(jī)動(dòng)作,以探索環(huán)境;以1-epsilon
的概率選擇基于當(dāng)前Q值的最優(yōu)動(dòng)作。
# 創(chuàng)建環(huán)境
env = gym.make('CartPole-v1')
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
train
方法用于訓(xùn)練Q網(wǎng)絡(luò)。它從回放緩存中采樣一個(gè)小批量樣本,并計(jì)算當(dāng)前狀態(tài)和下一個(gè)狀態(tài)的Q值。然后計(jì)算損失并進(jìn)行優(yōu)化。
接下來,創(chuàng)建CartPole環(huán)境并獲取狀態(tài)和動(dòng)作的維度。
然后,實(shí)例化一個(gè)QLearningAgent對(duì)象,并設(shè)置相關(guān)的超參數(shù)。
接下來,進(jìn)行訓(xùn)練循環(huán)。在每個(gè)回合中,重置環(huán)境,然后在每個(gè)時(shí)間步中執(zhí)行以下步驟:
- 根據(jù)當(dāng)前狀態(tài)選擇一個(gè)動(dòng)作。
- 執(zhí)行動(dòng)作,觀察下一個(gè)狀態(tài)、獎(jiǎng)勵(lì)和終止信號(hào)。
- 將狀態(tài)、動(dòng)作、獎(jiǎng)勵(lì)、下一個(gè)狀態(tài)和終止信號(hào)存儲(chǔ)在回放緩存中。
- 調(diào)用agent的
train
方法進(jìn)行網(wǎng)絡(luò)訓(xùn)練。
每隔一定的回合數(shù),通過update_target_network
方法更新目標(biāo)網(wǎng)絡(luò)的權(quán)重。
# 創(chuàng)建Q-learning智能體
agent = QLearningAgent(state_dim, action_dim, gamma=0.99, epsilon=0.2)
# 訓(xùn)練
replay_buffer = []
episodes = 1000
batch_size = 32
for episode in range(episodes):
state = env.reset()
done = False
total_reward = 0
while not done:
action = agent.select_action(state)
next_state, reward, done, _ = env.step(action)
replay_buffer.append((state, action, reward, next_state, done))
state = next_state
total_reward += reward
agent.train(replay_buffer, batch_size)
if episode % 10 == 0:
agent.update_target_network()
print(f"Episode: {episode}, Total Reward: {total_reward}")
最后,使用訓(xùn)練好的智能體進(jìn)行測試。在測試過程中,根據(jù)當(dāng)前狀態(tài)選擇動(dòng)作,并執(zhí)行動(dòng)作,直到終止信號(hào)出現(xiàn)。同時(shí)可通過env.render()
方法顯示環(huán)境的圖形界面。
# 使用訓(xùn)練好的智能體進(jìn)行測試
state = env.reset()
done = False
total_reward = 0
while not done:
env.render()
action = agent.select_action(state)
state, reward, done, _ = env.step(action)
total_reward += reward
print(f"Test Total Reward: {total_reward}")
env.close()
代碼執(zhí)行完畢后,關(guān)閉環(huán)境并顯示測試的總獎(jiǎng)勵(lì)。
總體而言,這段代碼實(shí)現(xiàn)了基于PyTorch的Q-learning算法,并將其應(yīng)用于CartPole環(huán)境。通過訓(xùn)練,智能體可以學(xué)習(xí)到一個(gè)最優(yōu)策略,使得桿子保持平衡的時(shí)間盡可能長。
匯總的代碼:
import gym
import random
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
# 定義Q網(wǎng)絡(luò)
class QNetwork(nn.Module):
def __init__(self, state_dim, action_dim):
super(QNetwork, self).__init__()
self.fc1 = nn.Linear(state_dim, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, action_dim)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# Q-learning算法
class QLearningAgent:
def __init__(self, state_dim, action_dim, gamma, epsilon):
self.state_dim = state_dim
self.action_dim = action_dim
self.gamma = gamma # 折扣因子
self.epsilon = epsilon # 探索率
# 初始化Q網(wǎng)絡(luò)和目標(biāo)網(wǎng)絡(luò)
self.q_network = QNetwork(state_dim, action_dim)
self.target_network = QNetwork(state_dim, action_dim)
self.target_network.load_state_dict(self.q_network.state_dict())
self.target_network.eval()
self.optimizer = optim.Adam(self.q_network.parameters())
self.loss_fn = nn.MSELoss()
def update_target_network(self):
self.target_network.load_state_dict(self.q_network.state_dict())
def select_action(self, state):
if random.random() < self.epsilon:
return random.randint(0, self.action_dim - 1)
else:
state = torch.FloatTensor(state)
q_values = self.q_network(state)
return torch.argmax(q_values).item()
def train(self, replay_buffer, batch_size):
if len(replay_buffer) < batch_size:
return
# 從回放緩存中采樣一個(gè)小批量樣本
samples = random.sample(replay_buffer, batch_size)
states, actions, rewards, next_states, dones = zip(*samples)
states = torch.FloatTensor(states)
actions = torch.LongTensor(actions)
rewards = torch.FloatTensor(rewards)
next_states = torch.FloatTensor(next_states)
dones = torch.FloatTensor(dones)
# 計(jì)算當(dāng)前狀態(tài)的Q值
q_values = self.q_network(states)
q_values = q_values.gather(1, actions.unsqueeze(1)).squeeze(1)
# 計(jì)算下一個(gè)狀態(tài)的Q值
next_q_values = self.target_network(next_states).max(1)[0]
expected_q_values = rewards + self.gamma * next_q_values * (1 - dones)
# 計(jì)算損失并更新Q網(wǎng)絡(luò)
loss = self.loss_fn(q_values, expected_q_values.detach())
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
# 創(chuàng)建環(huán)境
env = gym.make('CartPole-v1')
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
# 創(chuàng)建Q-learning智能體
agent = QLearningAgent(state_dim, action_dim, gamma=0.99, epsilon=0.2)
# 訓(xùn)練
replay_buffer = []
episodes = 1000
batch_size = 32
for episode in range(episodes):
state = env.reset()
done = False
total_reward = 0
while not done:
action = agent.select_action(state)
next_state, reward, done, _ = env.step(action)
replay_buffer.append((state, action, reward, next_state, done))
state = next_state
total_reward += reward
agent.train(replay_buffer, batch_size)
if episode % 10 == 0:
agent.update_target_network()
print(f"Episode: {episode}, Total Reward: {total_reward}")
# 使用訓(xùn)練好的智能體進(jìn)行測試
state = env.reset()
done = False
total_reward = 0
while not done:
env.render()
action = agent.select_action(state)
state, reward, done, _ = env.step(action)
total_reward += reward
print(f"Test Total Reward: {total_reward}")
env.close()
?相關(guān)博客專欄訂閱鏈接
【機(jī)器學(xué)習(xí)】——房屋銷售的探索性數(shù)據(jù)分析
【機(jī)器學(xué)習(xí)】——數(shù)據(jù)清理、數(shù)據(jù)變換、特征工程
【機(jī)器學(xué)習(xí)】——決策樹、線性模型、隨機(jī)梯度下降
【機(jī)器學(xué)習(xí)】——多層感知機(jī)、卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)
【機(jī)器學(xué)習(xí)】——模型評(píng)估、過擬合和欠擬合、模型驗(yàn)證
【機(jī)器學(xué)習(xí)】——模型調(diào)參、超參數(shù)優(yōu)化、網(wǎng)絡(luò)架構(gòu)搜索文章來源地址http://www.zghlxwxcb.cn/news/detail-499772.html
【機(jī)器學(xué)習(xí)】——方差和偏差、Bagging、Boosting、Stacking文章來源:http://www.zghlxwxcb.cn/news/detail-499772.html
【機(jī)器學(xué)習(xí)】——模型調(diào)參、超參數(shù)優(yōu)化、網(wǎng)絡(luò)架構(gòu)搜索
到了這里,關(guān)于【強(qiáng)化學(xué)習(xí)】——Q-learning算法為例入門Pytorch強(qiáng)化學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!