有k個賭博機,每個賭博機有一定概率p吐出硬幣,但是我們不知道這個概率是多少,每個賭博機吐出的硬幣價值v也是不一樣的,現在有t次機會選擇賭博機,怎麼選才能使得到的硬幣總價值最大?
在下面的不同演算法實現中,統一設定
可以計算出,這種情況下:
如果每次都選期望價值最高的4號賭博機,可以獲得的最高總價值為2800000。
如果每次都選期望價值最低的2號賭博機,可以獲得的最低總價值為300000。
如果隨機選取賭博機,可以獲得的期望總價值為1540000。
原理
「僅探索」(exploration-only)演算法就是將機會平均分配給每乙個賭博機,隨機挑選賭博機。
「僅利用」(exploitation-only)演算法就是選取當前平均價值最高的那台賭博機。
但是由於嘗試的次數有限,所以要在探索與利用之間進行權衡,這也是強化學習面臨的一大問題:探索-利用窘境(exploration-exploitation dilemma)。
實現**
#!/usr/bin/python
# -*- coding: utf-8 -*-
import random
import numpy as np
def r(k, p, v):
if random.random() < p[k]:
return v[k]
else:
return 0
def exploration_bandit(k, p, v, r, t):
r = 0
for t in range(t):
k = random.randint(0, k - 1)
v = r(k, p, v)
r += v
return r
def main():
k = 5
p = np.array([0.1, 0.9, 0.3, 0.2, 0.7])
v = np.array([5, 3, 1, 7, 4])
t = 1000000
print exploration_bandit(k, p, v, r, t)
if __name__ == '__main__':
main()
**執行結果為:獲得總價值1538893。這裡只實現了僅探索方法,結果和預估的情況3還是比較接近的。
原理
這個方法原理就是每次以ε的概率來探索,即以均勻概率隨機挑選乙個搖臂。以1-ε的概率利用,即挑選當前平均價值最高的那個搖臂。
實現**
#!/usr/bin/python
# -*- coding: utf-8 -*-
import random
import numpy as np
def r(k, p, v):
if random.random() < p[k]:
return v[k]
else:
return 0
def eplison_bandit(k, p, v, r, t):
r = 0
q = np.zeros(k)
count = np.zeros(k)
for t in range(t):
eplison = 1. / np.sqrt(t + 1)
if random.random() < eplison:
k = random.randint(0, k - 1)
else:
k = np.argmax(q)
v = r(k, p, v)
r += v
q[k] += (v - q[k]) / (count[k] + 1)
count[k] += 1
return r
def main():
k = 5
p = np.array([0.1, 0.9, 0.3, 0.2, 0.7])
v = np.array([5, 3, 1, 7, 4])
t = 1000000
print eplison_bandit(k, p, v, r, t)
if __name__ == '__main__':
main()
ε一般取值為較小值0.1或者0.01,當然也可以隨著嘗試次數增加而減小,如果嘗試次數為 n,那麼設為ε =1/√n即可。
**執行結果為:獲得總價值2795546。結果和情況1還是很接近的,說明這種方法基本能達到最優。
原理
上面的方法是以ε的概率來進行探索利用抉擇,而softmax方法則是根據boltzmann分布
來進行抉擇。其中τ被稱作「溫度」,τ越小的話平均價值越高的搖臂被選取的概率越高,τ趨向於無窮大的話選取概率就很均勻了,這時候就變成了僅探索。
實現**
#!/usr/bin/python
# -*- coding: utf-8 -*-
import random
import numpy as np
def softmax(x):
return np.exp(x) / np.sum(np.exp(x))
def r(k, p, v):
if random.random() < p[k]:
return v[k]
else:
return 0
def eplison_bandit(k, p, v, r, t, tau=0.1):
r = 0
q = np.zeros(k)
count = np.zeros(k)
for t in range(t):
p = softmax(q / tau)
rand = random.random()
total = 0.0
for i in range(k):
total += p[i]
if total >= rand:
k = i
break
v = r(k, p, v)
r += v
q[k] += (v - q[k]) / (count[k] + 1)
count[k] += 1
return r
def main():
k = 5
p = np.array([0.1, 0.9, 0.3, 0.2, 0.7])
v = np.array([5, 3, 1, 7, 4])
t = 1000000
tau = 0.1
print eplison_bandit(k, p, v, r, t, tau)
if __name__ == '__main__':
main()
**執行結果為: t=0.01 時,獲得總價值1397795。 t=0.1 時,獲得總價值2798372。當然隨機性很大,每次執行結果都會不同。
而ε貪心演算法和softmax演算法誰更好,取決於具體應用,這裡也沒有定論。
增強學習 K 搖臂賭博機
探索與利用 增強學習任務的最終獎賞是在多步動作之後才能觀察到,於是我們先考慮最簡單的情形 最大化單步獎賞,即僅考慮一步操作。不過,就算這樣,強化學習仍與監督學習有顯著不同,因為機器要通過嘗試來發現各個動作產生的結果,而沒有訓練資料告訴機器應當做什麼動作。簡而言之 缺少標記 想最大化單步獎賞要考慮兩個...
強化學習學習筆記(第二章,多臂賭博機)
本章節以多臂賭博機為模型,介紹了若干個在簡化環境下的強化學習演算法 動作不會影響下一時刻的情景和收益 1 貪心演算法,每次選擇期望收益最大的動作 2 貪心,在貪心演算法的基礎上,有 的概率從所有的動作中等概率選擇乙個。如果比較大可以更快的找到收益最大的動作,但是會影響選擇選擇收益最大動作的概率 0....
強化學習演算法 Q learning
q learning 演算法的步驟 1 給定引數lamda和獎勵矩陣r 2 令q為0 3 for each episode 3.1 隨機選擇初始的狀態s 3.2 未達到目標狀態,則執行以下幾步 1 在當前狀態s的所有可能行為中選取乙個行為a 2 按照q s,a r s,a lamda max,其中s...