この問題では、あなたが望むものをより深く行くが、さまざまなウェブサイトを検索、多腕・バンディットモデルを指し、「データドリブン品揃えパーソナにA動的クラスタリングアプローチ」の経営科学の最近の記事を参照してください、私たちは中国のものではありませんプレゼンテーションは、とても勉強にチューブ行き、その後、あなたと共有するためにここに中国語に翻訳します。
探査とesploitationトレードオフ
強化学習、すなわち探査とesploitationのトレードオフで古典的な問題は、あるジレンマは、この質問にあります:最後に、私たちは、収益のより正確な推定値を持つために探索するエネルギーを費やす必要があり、または現在持っている情報に従うべきである、最大を選択しますアクションの収益期待?
これにより、拡張モデル多腕バンディット-
多腕バンディット・モデル
スロットマシンあたりの期待収益が事前に存在し、n個のスロットマシン、スロットマシンごとに異なる収入がありますが、私たちが知らないと仮定します。
ここでは、想定しています。各スロットマシンへの収益の対象の分散は、事前に知られていない意味、正規分布です。私たちは、それぞれのスロットマシンの収益の分配を探索し、最終的にいくつかのスロットマシンのアクション期待リターンのためのほとんどのオプションを持っている必要があります。
従来のソリューションA / Bテスト
考えA / Bテストは、各テストの同じ量のスロットマシンの数に割り当てられ、スロットマシンは、すべてのテスト結果によれば、全てのスロットマシンの操作の残りの部分を実行する最良の選択されています。
このアプローチの最大の欠点は、探求し、分離開発することです。探査プロセスでのみ検討していないだけで、収集情報を発見し、開発段階ではもはや学ぶ機会を失うことになる、発見と考えられているために、局所最適に陥る可能性があり、我々は最高のスロットマシンを見つけられませんでした。
イプシロン - 貪欲アルゴリズム
イプシロン-貪欲アルゴリズムも貪欲アルゴリズムですが、それぞれの選択の過程で、他の行動よりも小さい選択に継続的な探査を可能にするための最善の行動を変更されます。以下イプシロンのために、そして最終的に最適な行動を発見するアルゴリズムなので、最高の行動の選択の最終確率が近い1-イプシロンになります。
Pythonのコードを以下に示します:
import numpy as np
import matplotlib.pyplot as plt
class EpsilonGreedy:
def __init__(self):
self.epsilon = 0.1 # 设定epsilon值
self.num_arm = 10 # 设置arm的数量
self.arms = np.random.uniform(0, 1, self.num_arm) # 设置每一个arm的均值,为0-1之间的随机数
self.best = np.argmax(self.arms) # 找到最优arm的index
self.T = 50000 # 设置进行行动的次数
self.hit = np.zeros(self.T) # 用来记录每次行动是否找到最优arm
self.reward = np.zeros(self.num_arm) # 用来记录每次行动后各个arm的平均收益
self.num = np.zeros(self.num_arm) # 用来记录每次行动后各个arm被拉动的总次数
def get_reward(self, i): # i为arm的index
return self.arms[i] + np.random.normal(0, 1) # 生成的收益为arm的均值加上一个波动
def update(self, i):
self.num[i] += 1
self.reward[i] = (self.reward[i]*(self.num[i]-1)+self.get_reward(i))/self.num[i]
def calculate(self):
for i in range(self.T):
if np.random.random() > self.epsilon:
index = np.argmax(self.reward)
else:
a = np.argmax(self.reward)
index = a
while index == a:
index = np.random.randint(0, self.num_arm)
if index == self.best:
self.hit[i] = 1 # 如果拿到的arm是最优的arm,则将其记为1
self.update(index)
def plot(self): # 画图查看收敛性
x = np.array(range(self.T))
y1 = np.zeros(self.T)
t = 0
for i in range(self.T):
t += self.hit[i]
y1[i] = t/(i+1)
y2 = np.ones(self.T)*(1-self.epsilon)
plt.plot(x, y1)
plt.plot(x, y2)
plt.show()
E = EpsilonGreedy()
E.calculate()
E.plot()
最終結果を以下に示す:
進行中の動作により、累積精度は、(最適な周波数は、アームに選択される)増加している、およびオンライン近似は、我々が提供さ
、証明
-greedyアルゴリズムの妥当性!