#質問
多腕バンディット課題について、Q学習を用いて、報酬が出てきやすい腕をより多く引くための実装を試みています。
次のようなQ学習の更新式のうち、遷移先状態の最大Q値(maxQ(s,a))を実装する方法がわかりません。
(スクリーンショット:https://www.sist.ac.jp/~kanakubo/research/reinforcement_learning.html )
調べると、ライブラリを用いて実装する方法、Q値リストの全ての値を乱数で初期化する方法などがありました。それら以外にはどのような方法がありえるのでしょうか?
具体的な実装ではなく、実装の方針をお教えいただければ幸いです。
現在のコードは次のようになっています。
二腕バンディットで、それぞれの腕を引いたときに報酬が得られる確率は、0.1, 0.9 です。
Q学習の行動選択は、ソフトマックスポリシーです。
学習が進むに従い、行動1を選択しやすくなるのが理想です。
import numpy as np import matplotlib.pyplot as plt import random Npulls = 500# 腕を引く回数 fig = plt.figure() class Bandit: def __init__(self): """ 変数の初期化 """ self.Npulls = Npulls# 腕を引く回数 self.p = [0.1, 0.9]# 腕を引いたときに報酬が得られる確率 [1本めの腕、2本めの腕] self.a = np.zeros(self.Npulls)# 時系列の行動のリスト self.R = np.zeros(self.Npulls)# 時系列の報酬のリスト self.Q = np.zeros((2, self.Npulls+1))# 時系列のQ値のリスト self.alpha = 0.3# Q学習の学習率 self.beta = 5# softmaxの温度 self.gamma = 0.95# 割引率 def softmax(self, x, Q): """ softmax ポリシーで行動を選択 """ sigma = np.sum(np.exp(self.Q[:, x]/self.beta)) vals = [] for i in range(2): softmax = np.exp(self.Q[int(i), x]/self.beta)/sigma vals.append(random.uniform(0, softmax)) self.a[x] = np.argmax(vals)# 次に選択する腕 def get_reward(self, x, p): """ 報酬を得る """ if self.a[x] == 0: if random.random()<self.p[0]: self.R[x] = 1 else: if random.random()<self.p[1]: self.R[x] = 1 #def observe(self, x, reward): """ [不明点]この関数で、遷移先状態の最大Q値を求めようとしています。 """ def update_Q(self, x, R): """ Q値の更新 """ next_Q = [] for i in range(2): #print(max(self.Q[:, x+1])) self.Q[i, x+1] = self.Q[i, x] + self.alpha*(self.R[i] + self.gamma*max(self.Q[:, x+1]) - self.Q[i, x]) #print(self.Q[i,x], self.Q[i, x+1]) b = Bandit() for i in range(Npulls-1): b.softmax(i, b.Q) b.get_reward(i, b.p) b.update_Q(i, b.R) print(b.a) """ 学習が進むに従い、行動で1が選ばれることが増えてほしいです。 """
よろしくお願い致します。
##環境
Jupiter notebook
maxOS Catalina
あなたの回答
tips
プレビュー