強化學習 CNN幾個重要的基本概念與DQN

前言

最近在讀一篇強化學習的論文以及代碼,學到了很多新東西,特此記錄下來。

CNN基本知識

Convolution:卷積

卷積核大小(filter size)爲m * m卷積核(convolution kernel/convolution filter)一次移動一個卷積步長(convolution stride),在n * n圖像上從左至右自上而下依次將卷積操作進行下去,最終輸出大小(n-m+1)*(n-m+1)的卷積特徵,同時該結果將作爲下一層操作的輸入。

Channels: 通道

首先,是 tensorflow 中給出的,對於輸入樣本中 channels 的含義。一般的RGB圖片,channels 數量是 3 (紅、綠、藍);而monochrome圖片,channels 數量是 1 。

Number of color channels in the example images. For color images, the number of channels is 3 (red, green, blue). For monochrome images, there is just 1 channel (black). ——tensorflow

其次,mxnet 中提到的,一般 channels 的含義是,每個卷積層中卷積核的數量。

  • channels (int) : The dimensionality of the output space, i.e. the number of output channels (filters) in the convolution. ——mxnet*

個人覺得mxnet的說法比較容易理解,因爲大部分時候並不會按照顏色來分通道。

Filter size:卷積核大小

卷積操作的兩個超參數(hyper parameters)之一。

Stride:卷積步長

卷積操作的兩個超參數之一。

Pooling:池化/匯合

平均值(最大值) 匯合在每次操作時,將匯合核覆蓋區域中所有值的平均值(最大值)作爲匯合結果。

Fully Connected Layer:全連接層

在這裏插入圖片描述
例如輸入爲 3 × 3 × 5 的特徵張量,從上圖我們可以看出,我們用一個3 x 3 x 5的filter 去卷積激活函數的輸出,得到的結果就是一個fully connected layer 的一個神經元的輸出,這個輸出就是一個值。若後層是含4096個神經元的全連接層時,則可用卷積核爲 3 × 3 × 5 × 4096 的全局卷積(4096個大小爲3 * 3 * 5不同的卷積核分別對輸入進行卷積,每一個輸出都作爲一個結果神經元)來實現這一全連接運算過程。

參數爲filter_size = 3; padding = 0; stride = 1; D_in = 5; D_out = 4096。

Batch/Epoch

批大小,就是每次調整參數前所選取的樣本(稱爲mini-batch或batch)數量:

如果批大小爲N,每次會選取N個樣本,分別代入網絡,算出它們分別對應的參數調整值,然後將所有調整值取平均,作爲最後的調整值,以此調整網絡的參數。

如果批大小N很大,例如和全部樣本的個數一樣,那麼可保證得到的調整值很穩定,是最能讓全體樣本受益的改變。

如果批大小N較小,例如爲1,那麼得到的調整值有一定的隨機性,因爲對於某個樣本最有效的調整,對於另一個樣本不一定最有效(就像對於識別某張黑貓圖像最有效的調整,不一定對於識別另一張白貓圖像最有效)

訓練中的另一個重要概念是epoch。每學一遍數據集,就稱爲1個epoch。 舉例,若數據集中有1000個樣本,批大小爲10,那麼將全部樣本訓練1遍後,網絡會被調整1000/10=100次。但這並不意味着網絡已達到最優,我們可重複這個過程,讓網絡再學1遍、2遍、3遍數據集。

注意每一個epoch都需打亂數據的順序,以使網絡受到的調整更具有多樣性。同時,我們會不斷監督網絡的訓練效果。通常情況下,網絡的性能提高速度會越來越慢,在幾十到幾百個epoch後網絡的性能會趨於穩定,即性能基本不再提高。

DQN(Deep Q Network)

建議閱讀:
NIPS2013 Playing Atari with Deep Reinforcement Learning
Nature-2015:Human-level control through deep reinforcement learning
建議觀看:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-1-A-q-learning/

本篇博文主要想記的就是自己對DQN這個算法的理解。一開始看這篇paper的時候結合GitHub上一個強化學習玩Flappy Bird的代碼覺得自己懂了這個算法,但是後來在讀另一篇關於DDPG的paper時確被DQN結合Actor-Critic繞暈了,可見並沒完全吃透。

Q-learning算法

DQN是基於Q-learning的。Q-Learning是強化學習算法中value-based的算法,Q即爲Q(s,a)就是在某一時刻的 s 狀態下(s∈S),採取 動作a (a∈A)動作能夠獲得收益的期望,環境會根據agent的動作反饋相應的回報reward r,所以算法的主要思想就是將State與Action構建成一張Q-table來存儲Q值,然後根據Q值來選取能夠獲得最大的收益的動作。
即agent通過每次選取當前最優動作來不斷玩遊戲、不斷更新Q-table(我理解爲策略表),自學習到更優。
由Bellman方程求解馬爾可夫決策過程,總結出更新公式:在這裏插入圖片描述
還有一種說法,和上面的公式是等價的:
在這裏插入圖片描述
兩個是一樣的。

Deep Q Network

在這裏插入圖片描述
我覺得DQN革新性的創意主要有

記憶庫

記憶庫就是一個樣本集。每一個樣本包含當前狀態,當前狀態做出的動作,做出動作的獎勵以及下一個狀態。每完成一個動作後,CNN並不直接學習當前的數據,而是存到記憶庫中,從記憶庫中隨機抽一個出來學習。這樣可以切斷數據間的相關性。

CNN算Q

用CNN計算S對應的Q值。用CNN算Q值不難理解,比較妙的是用算出來的Q值當作Q網絡更新的學習目標。Q-learning那樣學習是線性的,而這樣不是。

Nature Deep Q Network

這個是2015DeepMind在Nature上發的改進版。
在這裏插入圖片描述

Q-Target和Q

這個改進版最妙的是用了兩個網絡。簡單來說,Q是由S決定動作A的網絡,但這個網絡需要學習集,Q-target就是用來算學習集/目標數據的。
上述的做法會令算Q-target的網絡更新慢(因爲只更新Q沒更新Q-target),也可以看作Q-target參數被凍結了。所以每隔一段時間,會把比較新的網絡(Q)copy到比較老的網絡(Q-target),“解凍”。

後記

後續改進的DDQN以及Actor-Critic什麼的有時間再寫吧。本篇記載了DQN的基本最重要的思路,用這些跑個Flappy Birds啥的還是很OK的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章