이제 들리지 않는 강화 학습(4): 행동 가치 함수 구현
소개
강화 학습을 해설하는 제4탄입니다.
이제 들리지 않는 강화 학습 (1) : 상태 가치 함수와 Bellman 방정식 이제 들리지 않는 강화 학습 (2) : 상태 가치 함수 구현 이제 들리지 않는 강화 학습(3): 행동 가치 함수와 Bellman 방정식
이번에는 제3회에서 도출한 행동 가치 함수를 프로그래밍하여 값을 구해 보겠습니다.
문제 설정은 제2회 참조.
코드는 github 에 공개하고 있습니다.
이번에 할 수 있었던 것, 알았던 것
마지막 요약
상태와 행동에 대한 가치 $Q^\pi$를 정의했다.
상태, 행동 다이어그램
Q와 V의 관계
Q^\pi(s,a) = \sum_{s'}P_{ss'}^a[R_{ss'}^a + \gamma V^{\pi}(s')]
V와 Q의 관계
V^\pi(s) = \sum_{a}\pi(s,a)Q^{\pi}(s,a)
Q와 Q의 관계
Q^\pi(s,a) = \sum_{s'}P_{ss'}^a[R_{ss'}^a + \gamma\sum_{a}\pi(s',a')Q^{\pi}(s',a')]
행동 가치 함수 구현
act_val_func.pydef Q_pi(self, state, action, n, out, iter_num):
#print('\nnow entering Q_pi at n=%d, state=%s, action:%s' %(n, str(state), action))
# state:関数呼び出し時の状態
# n:再帰関数の呼び出し回数。関数実行時は1を指定
# out:返り値用の変数。関数実行時は0を指定
if n==iter_num: # 終端状態
out += self.pi(state, action) * self.reward(state,action)
#print("terminal condition")
return out
else:
#out += agent.reward(agent.get_pos(),action) # 報酬
out += agent.reward(state,action) # 報酬
self.set_pos(state)
#print("before move, pos:%s" % str(agent.get_pos()))
self.move(action) # 移動してself.get_pos()の値が更新
#print("after move, pos:%s" % str(agent.get_pos()))
state_before_recursion = agent.get_pos()
## 価値関数を再帰呼び出し
for next_action in ACTIONS:
out += self.pi(state_before_recursion, next_action) * \
self.Q_pi(state_before_recursion, next_action, n+1, 0, iter_num) * GAMMA
agent.set_pos(state) # 再帰先から戻ったらエージェントを元の地点に初期化
#print("agent pos set to %s, at n:%d" % (str(state), n))
return out
상태가치 함수와 마찬가지로 Q의 정의에 따라 재귀적으로 Q_pi를 구합니다.
결과
행동 가치 함수
재귀 횟수를 9회로 설정했을 때의 행동 가치 함수입니다.
적자로 나타낸 부분이 각 상태에서 가장 가치가 높았던 행동입니다. 이해하기 어렵기 때문에 화살표로 해 봅시다.
최적 행동
무작위로 움직이는 방안 $\pi$일 때, 각 상태에서 제일 가치가 높은 행동을 요구할 수 있었습니다.
미래
행동 가치 함수를 사용하여 가장 가치있는 행동을 찾을 수있었습니다. 즉, 정책에 따라 상태에 대한 최선의 행동을 알 수 있습니다. 그렇다고 하는 것은, 베스트인 행동을 새로운 방책으로 해 버리면, 보다 좋은 행동을 취할 수 있는 것이 아닐까요. 랜덤한 방책에 대해서, 행동가치를 요구하는 것으로 방책을 개선할 수 있을 것 같습니다.
다음 회부터는 방책을 개선해 최적의 행동을 요구해 갑니다. 드디어 강화 학습에 들어갑니다.
다음글
이제 들리지 않는 강화 학습 (5) : 상태 가치 함수 근사와 정책 평가
Reference
이 문제에 관하여(이제 들리지 않는 강화 학습(4): 행동 가치 함수 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/triwave33/items/669a975b74461559addc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def Q_pi(self, state, action, n, out, iter_num):
#print('\nnow entering Q_pi at n=%d, state=%s, action:%s' %(n, str(state), action))
# state:関数呼び出し時の状態
# n:再帰関数の呼び出し回数。関数実行時は1を指定
# out:返り値用の変数。関数実行時は0を指定
if n==iter_num: # 終端状態
out += self.pi(state, action) * self.reward(state,action)
#print("terminal condition")
return out
else:
#out += agent.reward(agent.get_pos(),action) # 報酬
out += agent.reward(state,action) # 報酬
self.set_pos(state)
#print("before move, pos:%s" % str(agent.get_pos()))
self.move(action) # 移動してself.get_pos()の値が更新
#print("after move, pos:%s" % str(agent.get_pos()))
state_before_recursion = agent.get_pos()
## 価値関数を再帰呼び出し
for next_action in ACTIONS:
out += self.pi(state_before_recursion, next_action) * \
self.Q_pi(state_before_recursion, next_action, n+1, 0, iter_num) * GAMMA
agent.set_pos(state) # 再帰先から戻ったらエージェントを元の地点に初期化
#print("agent pos set to %s, at n:%d" % (str(state), n))
return out
행동 가치 함수를 사용하여 가장 가치있는 행동을 찾을 수있었습니다. 즉, 정책에 따라 상태에 대한 최선의 행동을 알 수 있습니다. 그렇다고 하는 것은, 베스트인 행동을 새로운 방책으로 해 버리면, 보다 좋은 행동을 취할 수 있는 것이 아닐까요. 랜덤한 방책에 대해서, 행동가치를 요구하는 것으로 방책을 개선할 수 있을 것 같습니다.
다음 회부터는 방책을 개선해 최적의 행동을 요구해 갑니다. 드디어 강화 학습에 들어갑니다.
다음글
이제 들리지 않는 강화 학습 (5) : 상태 가치 함수 근사와 정책 평가
Reference
이 문제에 관하여(이제 들리지 않는 강화 학습(4): 행동 가치 함수 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/triwave33/items/669a975b74461559addc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)