本文將要開始介紹機器學習中的強化學習蝶锋, 這里首先應用一個多臂老虎機(The Multi-Armed Bandit Problem)問題來給大家解釋什么是強化學習逗旁。
多臂老虎機問題
如圖所示,我們有幾個單臂老虎機澎办,組成一起我們就稱作多臂老虎機嘁捷,那么我們需要制定什么樣的策略才能最大化得到的獎勵哀墓。這里假設每個老虎機獎勵的隨機分布是不一樣的。
比如第一個分布散怖,D1這個老虎機的分布大概率落在中間這部分菇绵,很小概率在兩頭的地方肄渗。假設用戶是知道這些分布的,那么用戶應當怎么選擇咬最?答案很簡單翎嫡,我們應當選擇D5這個老虎機,因為它的平均值最高永乌,而且有很大概率在靠右也就是正數(shù)范圍內惑申。但現(xiàn)在的問題是,用戶實際上是不知道這些老虎機的概率分布的翅雏。那么我們需要一次次的嘗試圈驼,盡可能快速的找到這五個老虎機的分布,并利用最佳的分布最大化收益望几。這個在機器學習上叫做碗脊,探索利用。
探索和利用這兩步實際上并不是那么的兼容橄妆,為了解釋這個概念衙伶,這里引入一個定義,叫做遺憾害碾。也就是我們知道D5的分布是最高的矢劲,那么最佳策略是應對不停的選擇D5這個機器,但當我們不知道的時候慌随,可能會選擇其他的機器芬沉,當沒有選擇最佳機器時,都會得到一個得到的獎勵和最佳獎勵的差阁猜,這個差就是遺憾丸逸。
那么現(xiàn)在可以解釋為什么探索和利用為什么并不是那么兼容,比如我們探索很多剃袍,每個機器玩了一百次黄刚,對于每個機器都能得到很好的分布估計,但同時也會帶來很多的遺憾民效。如果探索比較少憔维,可能會找不到最佳的分布,探索得到的結論可能是錯的畏邢。所以說业扒,最佳的策略應該是,通過探索找到最佳分布的老虎機舒萎,并且以一種快速而高效的方法找到這個老虎機程储,且不斷的利用它來獲得最大化的獎勵。
在實際上生活或商業(yè)案例上也有很多相似的情形。比如可口可樂公司設計出了5個不同的廣告章鲤,那么現(xiàn)在的問題就是不知道哪個廣告是最好的致板,能帶來最佳的用戶轉換率,即不知道哪一個投放后會吸引用戶點擊或購買產品咏窿。非常傳統(tǒng)的方式就是把每個廣告都投放到市場上幾天斟或,然后看看得到的結果。但這是很消耗人力和財力的集嵌,而且這本質上只進行了探索卻沒進行利用萝挤。因此我們需要對此進行利用,比如其中某個廣告投放第一天就顯然沒有任何的效果根欧,那么后面幾天的投放的意義就不是很大了怜珍,可以考慮不再投放此廣告來節(jié)省人力財力。即應用強化學習可以優(yōu)化成本和支出凤粗,又可以得到最高的收益酥泛。
置信區(qū)間上界算法
現(xiàn)在來介紹強化學習中的一個算法,叫做置信區(qū)間上界算法(UCB)嫌拣。這里依然用上述的多臂老虎機問題引出的廣告案例柔袁。
下面來描述下這個算法,現(xiàn)在假設我們知道五臺老虎機的分布,那么我們會不斷的選擇D5這個老虎機异逐。假如說不知道這幾個的概率分布捶索,那么就要開始我們的算法。
第一步灰瞻,在我們開始之前腥例,假設每個老虎機的概率分布是相同的,即平均值或期望是相同的酝润。如圖紅色虛線表示平均值或期望燎竖,縱軸表示老虎機可能帶來的收益。這些彩色的橫線代表每個老虎機實際的平均或期望要销,這些期望我們是不知道的构回,這個問題的核心就是我們要進行不斷的嘗試去估算出每個老虎機的平均期望。
置信區(qū)間蕉陋,Confidence Bound捐凭,之前有講過Confidence Interval拨扶,這兩個詞的意義是類似的凳鬓。 這個Confidence Interval指的是當我們有一定的概率分布的時候,置信區(qū)間是和每個概率分布的累積分布曲線有關系患民。對于每個老虎機缩举,我們講置信區(qū)間,用灰色的方框表示。對于每個老虎機仅孩,我們按的概率有很大的概率是在這個區(qū)間當中的托猩。我們每一輪將要選擇的就是擁有最大的區(qū)間上界的老虎機,也就是頂上的這條線最大的老虎機辽慕,我們要在每一輪中選擇它并按下它京腥。在第一輪中,他們的區(qū)間上界是一樣的溅蛉。
比如選擇3號老虎機公浪,按下去,首先會發(fā)現(xiàn)區(qū)間所代表的方框下降了船侧。因為按下去后我們會發(fā)現(xiàn)其給予的獎勵欠气,3號老虎機的實際期望比較低,那么觀察得到的獎勵也是比較低镜撩,那么重新計算觀察到的所有平均值時预柒,那么這個平均值就降低了。第二點袁梗,我們會發(fā)現(xiàn)這個置信區(qū)間變得更小了宜鸯,因為比起上一輪的游戲,我們總共的觀察次數(shù)變多了遮怜,也就是信心升高了顾翼,那么這個置信區(qū)間的長度就會變小。
那么此時第三個機器的置信區(qū)間上界比其他的要低奈泪,所以下一輪要選擇其他四個機器适贸,比如選擇第四個,那么它的置信區(qū)間上界會變高涝桅,區(qū)間大小會變小拜姿。
在下一步,125三個機器的上界時一樣的冯遂,因此可以在他們三個中間選一個蕊肥,比如第一個,它的實際平均值比較低蛤肌,但當我們按下老虎機的時候壁却,它實際是個隨機事件,因此可能高也可能低裸准。雖然它的平均值展东,但假設此時運氣比較好,投下去的錢翻倍了炒俱,那么他的區(qū)間上限變高盐肃,長度變小爪膊。
再然后在25中間選擇一個,比如第二個砸王,此時他的置信區(qū)間上界變低推盛,寬度變小。
那么最后按下第五個機器谦铃,這時得到一個非常高的觀察值耘成,那么上限變高,寬度變小驹闰。但由于D5實際上是最佳的機器凿跳,那么就算置信區(qū)間變小了,但它的上界依然比其他的都要高疮方。
那么我接下來選擇的老虎機依然是它控嗜,當我們選擇了一個最佳的解時,我們可能在這個選擇上停留很多輪骡显,但由于對他的信心會越來越高疆栏,因此這個區(qū)間會越來越小,此時的區(qū)間上界可能就會變成不是最高惫谤。
UCB算法有一個特點壁顶,當我們選擇了一個機器很多次后,他的置信區(qū)間會變得很小溜歪,要給其他的機器一些機會若专,看看其他機器顯示的觀察結果所對應的新的置信區(qū)間上界是否會更高。這樣經過很多輪后蝴猪,最終D5的選擇次數(shù)依然會很多很多调衰,他的置信區(qū)間會越來越扁,一直到最終輪自阱。
以上就是置信區(qū)間算法的一個基本原理嚎莉。
代碼實現(xiàn)
這里用一個商業(yè)案例來做例子。假設有一個汽車公司為了一個車做了十個廣告ad1-ad10沛豌,這個公司需要知道哪個廣告投放后趋箩,點擊率最高。這組數(shù)據(jù)集是在模擬環(huán)境得到的加派,若值為1則指的是這個用戶點擊了這個廣告叫确。總結一下問題就是芍锦,我們有十個廣告竹勉,要決定哪個廣告有最高的點擊率,并對逐步得到的信息來決定醉旦,第n個用戶投放哪個廣告得到最高的點擊數(shù)饶米。我們先看看如果對于每一個用戶桨啃,我們隨機抽選廣告车胡,會得到怎樣的點擊數(shù)檬输。這里提供一個隨機選擇的算法,不是此次算法的重點匈棘。
# Importing the libraries
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset = pd.read_csv('Ads_CTR_Optimisation.csv')
# Implementing Random Selection
import random
N = 10000
d = 10
ads_selected = []
total_reward = 0
for n in range(0, N):
ad = random.randrange(d)
ads_selected.append(ad)
reward = dataset.values[n, ad]
total_reward = total_reward + reward
# Visualising the results
plt.hist(ads_selected)
plt.title('Histogram of ads selections')
plt.xlabel('Ads')
plt.ylabel('Number of times each ad was selected')
plt.show()
運行后得到的ads_selected代表對于每一個用戶丧慈,哪一個廣告被選擇,total_reward指的是所有的點擊數(shù)主卫。得到的圖像表示每個廣告被點擊的次數(shù)逃默。每個廣告的到點擊次數(shù)是接近的,大致在1000左右簇搅。
對于UCB算法完域,我們沒有直接的工具包來使用,因此需要自己實現(xiàn)瘩将,下面是算法邏輯:
這里就不解釋太多吟税,只貼代碼,最終運行后得到的總的點擊數(shù)為2178姿现,明顯高于上面用隨機得到的結果肠仪。且查看ads_selected會發(fā)現(xiàn)編號4出現(xiàn)的次數(shù)最多,即第五個廣告ad5备典。
import matplotlib.pyplot as plt
import pandas as pd
import math
# import the dataset
dataset = pd.read_csv('Ads_CTR_Optimisation.csv')
# Implementing UCB
N = 10000
d = 10
ads_selected = []
numbers_of_selections = [0] * d
sums_of_rewards = [0] * d
total_reward = 0
for n in range(0, N):
ad = 0
max_upper_bound = 0
for i in range(0, d):
if numbers_of_selections[i] > 0:
average_reward = sums_of_rewards[i] / numbers_of_selections[i]
delta_i = math.sqrt(3/2 * math.log(n + 1) / numbers_of_selections[i])
upper_bound = average_reward + delta_i
else:
upper_bound = 1e400
if upper_bound > max_upper_bound:
max_upper_bound = upper_bound
ad = i
ads_selected.append(ad)
reward = dataset.values[n, ad]
numbers_of_selections[ad] = numbers_of_selections[ad] + 1
sums_of_rewards[ad] = sums_of_rewards[ad] + reward
total_reward = total_reward + reward
# Visualising the results
plt.hist(ads_selected)
plt.title('Histogram of ads selections')
plt.xlabel('Ads')
plt.ylabel('Number of times each ad was selected')
plt.show()
以上异旧,就是強化學習置信區(qū)間算法的相關基礎知識。