Python(強化学習の試し02_過去の試行3つ分で学習)
■学習するコードの試し。
前回サンプルコードを作成したので、学習するコードの試しを行っていきたい。
サンプルコードの条件は下のようなもの
・ボタン(0と1)がある状態で、どちらかを押す想定。
・0を押した後に1を押すと報酬として1が追加される。
・試行は10回。
過去に押したものを記憶しているという想定で、3つ前までの結果を使う。これに基づいてActionを決めて報酬を得る。とりあえず、3つの結果を2進数表示と考えて、0~7までの8通りの結果があると見なす。それに対して、Actionで0か1を入れたときの報酬を考えてみた。
学習のコードが下。3回結果が得られるまではランダム。
def getAction(self, history):
val = 0
action = 0
if (len(history) >= 3):
for i in range(len(history)):
if len(history) - i <= 3:
val = val + (history[i] * 2 ** ((len(history) - i - 1)))
a = np.where(self._Qtable[val] == self._Qtable[val].max())[0]
action = np.random.choice(a)
else:
action = np.random.choice([0, 1])
return action
def updateSelectAction(self, curhistory, action, reward):
gamma = 0.9
alpha = 0.5
val = 0
if (len(curhistory) >= 3):
for i in range(len(curhistory)):
if len(curhistory) - i <= 3:
val = val + (curhistory[i] * 2 ** ((len(curhistory) - i - 1)))
self._Qtable[val, action] = (1 - alpha) * self._Qtable[val, action] + alpha * (
reward + gamma * self._Qtable[val, action])
return self._Qtable
このコードを実行させた結果の1つが下。1回目が0で、その後はずっと1になっている。他の場合も0か1に固定されていく感じ。報酬は初めの0,1のみなのでReward:1だけ。
Qtable内の数字は試行を重ねるごとに更新されているので、学習は進んでいるはず。更新の式をもう少し改良したい。