一、什麼是Deep Q Network?
Deep Q Network (DQN) 是一種使用深度學習方法實現的強化學習算法。它是在 2013 年由深度學習先驅Deepmind 提出的一種基於Q-learning算法的改進。DQN通過搭建具有多層卷積神經網絡(CNN)的模型實現對遊戲中的決策的自動學習,它作為近年來最重要的深度強化學習算法之一,在實現遊戲智能、醫療診斷、無人駕駛、金融等領域的決策時獲得了很好的應用效果。
二、DQN算法的原理及實現方法
1. Q-learning算法的思想
在顯式學習(supervised learning)中,機器會根據輸入和對應的輸出來生成一個“映射表”,從而直接對輸入進行處理。而強化學習(reinforcement learning)中,機器學習的過程則更像是在一個實際的環境中不停地試錯,從而得到策略的優化。
Q-learning是一種強化學習算法,它通過尋找連續的狀態和動作的最大期望收益(Expected Value of Return),來定義一個動作值函數 Q(s,a)。它的基本思想是對一個狀態s下所有可能的動作a都打分,選擇分值最大的作為下一步執行的動作。這個分值稱之為動作值 (Q-value)。因此,根據 Q 值函數,我們可以知道在一個狀態下最好的動作是什麼。
在基本的Q-learning算法中,Q-value函數被表述為一個表格,稱之為 Q-table。對於每一個狀態-動作對(s,a),Q(s,a)表示在狀態s下採取動作a會獲得的收益。為了克服Q-table過大有可能導致訓練過程的崩潰等問題,可以採用深度神經網絡(DNN)對Q-function進行近似處理,這就是 DQN 算法所採用的方法。
2. DQN算法的核心思想
DQN 算法在Q-learning算法的基礎上,通過使用一個深度神經網絡(Deep Neural Network, DNN)來近似動作值函數 Q(State,Action),以得到更高複雜度的狀態-動作空間的解析式近似。 具體地說,DQN 算法是將一個DNN作為 Q-function 的 function approximator,並在遊戲的不同狀態下,通過對神經網絡的訓練,以使 Q-function 能夠從多個狀態和動作中學到最優的策略。
3. DQN算法的實現方法
下面通過實現Space Invaders遊戲的DQN算法來介紹DQN的具體實現方法:
Step1. 導入必備的Python 庫
import random
import gym
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten, Convolution2D, Permute
from keras.optimizers import Adam
from collections import deque
from skimage.color import rgb2gray
from skimage.transform import resize
from keras import backend as K
Step2. 定義超參數
GAMMA = 0.99 # 折扣係數
INITIAL_EPSILON = 0.5 #初始的探索率
FINAL_EPSILON = 0.01 # 最終的探索率
MEMORY_SIZE = 10000 # replay memory的大小
BATCH_SIZE = 32 # 每次更新的batch大小
FRAME_PER_ACTION = 1 # 每間隔多少幀執行一次更新
Step3. 創建agent
class DQNAgent():
def __init__(self, state_size, action_size):
self.state_size = state_size# 圖像大小
self.action_size = action_size# 行動的種類數量,這裡選擇4種.
self.memory = deque(maxlen=MEMORY_SIZE)# 定義replay memory
self.gamma = GAMMA # 折扣係數
self.epsilon = INITIAL_EPSILON # 探索係數
self.epsilon_min = FINAL_EPSILON # 最小的探索係數
self.epsilon_decay = (self.epsilon - self.epsilon_min) / 50000 # 探索係數的變化率
self.learning_rate = 0.0001#學習率
self.model = self.build_model() # 建立模型
def build_model(self):
model = Sequential()
# 用CNN處理輸入
model.add(Convolution2D(32, 8, 8, subsample=(4,4),
input_shape= self.state_size, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 4, 4, subsample=(2, 2), border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3, subsample=(1, 1), border_mode='same'))
model.add(Activation('relu'))
model.add(Flatten())
# hidden layer
model.add(Dense(512))
model.add(Activation('relu'))
# 輸出層
model.add(Dense(self.action_size))
model.compile(loss='mse', optimizer=Adam(lr=self.learning_rate))
print("model built successfully")
return model
Step4. 對狀態進行處理
img_rows , img_cols = 84, 84
img_channels = 4 # 一個狀態包含4幀的連續畫面
# 對遊戲的圖像進行裁剪和重定形,以加快運算速度
def preprocess_frame(frame):
# 裁剪有用部分
frame = frame[35:195:2, ::2, :]
# 渲染成不同顏色,便於進行圖像識別
frame = rgb2gray(frame)
# 圖像壓縮和大小調整
frame = resize(frame, (img_rows, img_cols))
# 轉換為矩陣形式
frame = np.reshape(frame, (1, img_rows, img_cols, 1))
return frame
Step5. 訓練agent
首先將初始狀態輸入系統初始狀態之後,不斷地建立多個輪次,每一輪次都先選擇行動,然後計算Q值的函數,最後更新神經網絡,以得到最佳的遊戲策略。
def train_agent():
env = gym.make("SpaceInvaders-v0") # 加載遊戲環境
state_size = (img_rows, img_cols, img_channels)
action_size = env.action_space.n # 可選動作數量
agent = DQNAgent(state_size, action_size) # 創建agent
# 初始化行動Q值列表
episode_rewards = []
for episode in range(20000):
total_reward= 0
state = env.reset() # 初始狀態
state = preprocess_frame(state) # 對狀態進行預處理
# 停止遊戲的標誌
done = False
while not done:
# 打印遊戲信息
env.render()
# 選擇行動
action = agent.act(state)
# 執行行動
next_state, reward, done, _ = env.step(action)
# 對下一個狀態進行預處理
next_state = preprocess_frame(next_state)
total_reward += reward
# 將轉換存儲到記憶庫中,以便後續使用
agent.remember(state, action, reward, next_state, done)
state = next_state
# 訓練agent
if len(agent.memory) > BATCH_SIZE:
agent.train_step()
# 降低探索率
if agent.epsilon > agent.epsilon_min:
agent.epsilon -= agent.epsilon_decay
# 記錄每一輪次的總收益
episode_rewards.append(total_reward)
# 每一輪次打印一次回報值
print("episode: {}/{}, score: {}, e: {:.2}".format(episode, 20000, total_reward, agent.epsilon))
train_agent()
三、DQN算法的應用
DQN算法在遊戲智能、醫療診斷、金融等領域得到了廣泛應用,以下是DQN算法在遊戲行業的應用舉例:
1. 電動車自主駕駛
英國電動汽車製造商Milton Keynes(MK特孚科技)研發了一款自動駕駛的出租車,該車搭載了由英偉達提供的深度學習技術 DQN,使它能通過機器學習從不斷的數據中收集候選的行為,從而準確地進行判斷和預測。
2. AlphaGo Zero
AlphaGo Zero 是一種全新的人工智能算法,它利用了 Monte Carlo tree search 和 DQN 算法相結合的方式解決了圍棋領域的最大挑戰——圍棋棋譜的規模極大和狀態數的極高複雜度。
四、總結
本文詳細介紹了DQN算法的原理、實現方法以及在遊戲行業的應用。DQN算法以其高效準確的特點成功地解決了困擾傳統強化學習算法的稀疏賞集反饋難題,為解決許多實際應用領域的問題提供了新的思路和方法。
原創文章,作者:EQKJI,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/334907.html