冒個泡..昨天是立冬啦(雖然福州還是艷陽天)~時間很快,學習也要抓緊鴨!今天就來看一下強化學習。
強化學習
定義
什么是強化學習呢?其實強化學習在我們的生活中并不陌生,比如前陣子的Alpha go就是一個典型的例子。簡單來說,深度學習是通過學習選擇能達到目標最優(yōu)動作的一個策略過程,本質(zhì)是在解決 decision making 問題,即自動進行決策,并且可以做連續(xù)決策。

一個完整的強化學習過程:讓計算機實現(xiàn)從一開始什么都不懂, 腦袋里沒有一點想法, 通過不斷地嘗試, 從錯誤中學習, 最后找到規(guī)律, 學會了達到目的的方法。
要素
【可參考馬爾可夫決策過程(Markov Decision Process,簡稱MDP)】

狀態(tài)(x):機器對環(huán)境的感知,所有可能的狀態(tài)稱為狀態(tài)空間;
動作(a):機器所采取的動作,所有能采取的動作構(gòu)成動作空間;
轉(zhuǎn)移概率(p):當執(zhí)行某個動作后,當前狀態(tài)會以某種概率轉(zhuǎn)移到另一個狀態(tài)
獎賞函數(shù)(r):在狀態(tài)轉(zhuǎn)移的同時,環(huán)境給反饋給機器一個獎賞。
因此,強化學習的主要任務(wù)就是通過在環(huán)境中不斷地嘗試,根據(jù)嘗試獲得的反饋信息調(diào)整策略,最終生成一個較好的策略,機器根據(jù)這個策略便能知道在什么狀態(tài)下應(yīng)該執(zhí)行什么動作。
辨析
a.強化學習與監(jiān)督學習的區(qū)別
1.首先,監(jiān)督學習, 是已經(jīng)有了數(shù)據(jù)和數(shù)據(jù)對應(yīng)的正確標簽,而強化學習是在沒有任何標簽的情況下,通過先嘗試做出一些行為得到一個結(jié)果,通過這個結(jié)果是對還是錯的反饋,調(diào)整之前的行為,就這樣不斷的調(diào)整,算法能夠?qū)W習到在什么樣的情況下選擇什么樣的行為可以得到最好的結(jié)果。

2.兩種學習方式都會學習出輸入到輸出的一個映射,監(jiān)督式學習出的是之間的關(guān)系,可以告訴算法什么樣的輸入對應(yīng)著什么樣的輸出,強化學習出的是給機器的反饋,即用來判斷這個行為是好是壞。
3.強化學習的結(jié)果反饋有延時,有時候可能需要走了很多步以后才知道以前的某一步的選擇是好還是壞,而監(jiān)督學習做了比較壞的選擇會立刻反饋給算法。
4.強化學習面對的輸入總是在變化,每當算法做出一個行為,它影響下一次決策的輸入,而監(jiān)督學習的輸入是獨立同分布的。
b.強化學習與無監(jiān)督學習的區(qū)別
非監(jiān)督式不是學習輸入到輸出的映射,而是模式。
例如在向用戶推薦新聞文章的任-務(wù)中,非監(jiān)督式會找到用戶先前已經(jīng)閱讀過類似的文章并向他們推薦其一(聚類),而強化學習將通過向用戶先推薦少量的新聞,并不斷獲得來自用戶的反饋,最后構(gòu)建用戶可能會喜歡的文章的“知識圖”。
(總的來說,強化學習的重在通過反饋去做決策。)
接下來介紹一下強化學習中的Q-learning以及簡單實現(xiàn)
Q-learning
首先,Q-learning是強化學習中的一種算法。

Q-learning關(guān)鍵在于是Q-table。Q-table的行和列分別表示state和action的值,Q-table的值Q(s,a)衡量當前state采取action到底好不好,即接受反饋。*
Q函數(shù)
Q-table中的值根據(jù)如下的公式來進行不斷更新:

在這個公式里:
s→當前狀態(tài)
a→當前動作
r→當前的收益
γ→折扣因子,表示時間的遠近對回報的影響程度(通常在0-1之間)
s'→下一個狀態(tài)
a'→下一個動作(Q(s',a')要在Q-Table里面查詢)
接下來就舉個栗子來說明Q-learning:
假設(shè)我們在一個由門連接的建筑物中有5個房間,如下圖所示。我們將每個房間編號為0到4.建筑物的外部可以被認為是一個大房間(5)。請注意,1號門和4號門從5號房間(外部)通向建筑物。

對于這個例子,我們想把一個代理人放在任何房間,從那個房間,走到大樓外面(這將是我們的目標房間,也就是5號房間)。要將此房間設(shè)置為目標,我們會將獎勵值與每個門相關(guān)聯(lián)(即節(jié)點之間的鏈接)。直接通向目標的門具有100的即時獎勵。與目標房間沒有直接連接的其他門沒有獎勵。
對于這個問題我們可以先簡化為點線且線之間具有值的網(wǎng)絡(luò)圖。

接下來我們可以根據(jù)這個圖來創(chuàng)建一個R矩陣。
(沒有相連的點之間為-1,相連但是不與目標相連的為0,與目標相連的為100)

這個時候也要創(chuàng)建一個Q-Table,來不斷更新。(Q表要求和R行列一致且都為0)

然后隨機選擇一個狀態(tài),比如選取1,查看狀態(tài)1所對應(yīng)的R表(值不為-1的),也就是1可以到達3或5,我們隨機我們選擇5,則Q函數(shù)和更新后的Q表可為:

這樣的話,就到達目標5號,一次嘗試結(jié),成功。
再選擇一個隨機狀態(tài),比如3,3對應(yīng)的下一個狀態(tài)有1,2,4,我們隨機選擇1,則Q函數(shù)和更新后的Q表可為:

然后經(jīng)過不斷迭代最后得到的表如下:

綜上可以得到Q-learning的算法步驟為:
利用Q矩陣的算法:
1.設(shè)置當前狀態(tài)=初始狀態(tài)。
2.從當前狀態(tài),找到具有最高Q值的動作。
3.設(shè)置當前狀態(tài)=下一狀態(tài)。
4.重復(fù)步驟2和3,直到當前狀態(tài)=目標狀態(tài)。
用代碼實現(xiàn):
import numpy as np
# 將Q矩陣初始化為0
q = np.matrix(np.zeros([6, 6]))
# 報酬矩陣為提前定義好的
#-1表示無相連接的邊,100為最后通向出口,0表示有連接。
r = np.matrix([[-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.8
#是否選擇最后策略的概率
e= 0.4
# the main training loop
for time in range(101):
# random initial state
state = np.random.randint(0, 6)
# 如果不是最終轉(zhuǎn)態(tài)
while (state != 5):
# 選擇可能的動作
possible_actions = []
possible_q = []
for action in range(6):
if r[state, action] >= 0:
possible_actions.append(action)
possible_q.append(q[state, action])
action = -1
if np.random.random() < e:
# 隨意選擇
action = possible_actions[np.random.randint(0, len(possible_actions))]
else:
action = possible_actions[np.argmax(possible_q)]
# 更新
q[state, action] = r[state, action] + gamma * q[action].max()
#下一步
state = action
# 輸出訓練過程
if time % 10 == 0:
print("------------------------------------------------")
print("訓練的次數(shù)為: %d" % time)
print(q)
結(jié)果為:
訓練的次數(shù)為: 0
[[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 100.]
[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]]
------------------------------------------------
訓練的次數(shù)為: 10
[[ 0. 0. 0. 0. 80. 0.]
[ 0. 0. 0. 0. 0. 100.]
[ 0. 0. 0. 64. 0. 0.]
[ 0. 0. 0. 0. 80. 0.]
[ 64. 0. 0. 0. 0. 100.]
[ 0. 0. 0. 0. 0. 0.]]
------------------------------------------------
訓練的次數(shù)為: 20
[[ 0. 0. 0. 0. 80. 0.]
[ 0. 0. 0. 0. 0. 100.]
[ 0. 0. 0. 64. 0. 0.]
[ 0. 80. 0. 0. 80. 0.]
[ 64. 0. 0. 0. 0. 100.]
[ 0. 0. 0. 0. 0. 0.]]
------------------------------------------------
訓練的次數(shù)為: 30
[[ 0. 0. 0. 0. 80. 0.]
[ 0. 0. 0. 0. 0. 100.]
[ 0. 0. 0. 64. 0. 0.]
[ 0. 80. 0. 0. 80. 0.]
[ 64. 0. 0. 64. 0. 100.]
[ 0. 0. 0. 0. 0. 0.]]
------------------------------------------------
訓練的次數(shù)為: 40
[[ 0. 0. 0. 0. 80. 0. ]
[ 0. 0. 0. 0. 0. 100. ]
[ 0. 0. 0. 64. 0. 0. ]
[ 0. 80. 51.2 0. 80. 0. ]
[ 64. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 0. 0. 0. ]]
------------------------------------------------
訓練的次數(shù)為: 50
[[ 0. 0. 0. 0. 80. 0. ]
[ 0. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 64. 0. 0. ]
[ 0. 80. 51.2 0. 80. 0. ]
[ 64. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 0. 0. 0. ]]
------------------------------------------------
訓練的次數(shù)為: 60
[[ 0. 0. 0. 0. 80. 0. ]
[ 0. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 64. 0. 0. ]
[ 0. 80. 51.2 0. 80. 0. ]
[ 64. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 0. 0. 0. ]]
------------------------------------------------
訓練的次數(shù)為: 70
[[ 0. 0. 0. 0. 80. 0. ]
[ 0. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 64. 0. 0. ]
[ 0. 80. 51.2 0. 80. 0. ]
[ 64. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 0. 0. 0. ]]
------------------------------------------------
訓練的次數(shù)為: 80
[[ 0. 0. 0. 0. 80. 0. ]
[ 0. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 64. 0. 0. ]
[ 0. 80. 51.2 0. 80. 0. ]
[ 64. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 0. 0. 0. ]]
------------------------------------------------
訓練的次數(shù)為: 90
[[ 0. 0. 0. 0. 80. 0. ]
[ 0. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 64. 0. 0. ]
[ 0. 80. 51.2 0. 80. 0. ]
[ 64. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 0. 0. 0. ]]
------------------------------------------------
訓練的次數(shù)為: 100
[[ 0. 0. 0. 0. 80. 0. ]
[ 0. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 64. 0. 0. ]
[ 0. 80. 51.2 0. 80. 0. ]
[ 64. 0. 0. 64. 0. 100. ]
[ 0. 0. 0. 0. 0. 0. ]]
參考資料:(http://mnemstudio.org/path-finding-q-learning-tutorial.htm)
(https://morvanzhou.github.io/tutorials/machine-learning/)
(https://blog.csdn.net/aliceyangxi1987/article/details/73327378)
Finally~好好學習鴨!