強化學習 K 搖臂賭博機演算法

2021-10-24 13:21:44 字數 3976 閱讀 7776

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...