이제 들리지 않는 강화 학습(4): 행동 가치 함수 구현

소개



강화 학습을 해설하는 제4탄입니다.

이제 들리지 않는 강화 학습 (1) : 상태 가치 함수와 Bellman 방정식 이제 들리지 않는 강화 학습 (2) : 상태 가치 함수 구현 이제 들리지 않는 강화 학습(3): 행동 가치 함수와 Bellman 방정식

이번에는 제3회에서 도출한 행동 가치 함수를 프로그래밍하여 값을 구해 보겠습니다.

문제 설정은 제2회 참조.
코드는 github 에 공개하고 있습니다.

이번에 할 수 있었던 것, 알았던 것


  • 특정 정책에 따라 각 상태, 행동에 대한 행동 가치 함수 $ Q ^\pi (s, a) $를 찾는다
  • $ Q ^\pi (s, a) $를 기반으로 상태 $ s $에서 가장 가치있는 행동 $ a $를 찾습니다

  • 마지막 요약



    상태와 행동에 대한 가치 $Q^\pi$를 정의했다.
  • $Q^\pi$는 정책 $\pi$에 의존하는 함수
  • 상태 $ s $에서 정책 $\pi $를 따르지 않고 행동 $ a $를 취하고 그 후 정책을 따랐을 때 기대 수익

  • 상태, 행동 다이어그램


  • $V^\pi(s)$: 상태 $s$ 때의 가치 함수
  • $Q^\pi$(s,a)$: 상태 $s$에서 행동 $a$를 취할 때의 가치 함수
  • $\pi(s,a)$: 정책. 상태 $ s $에서 행동 $ a $를 취할 확률
  • $P^a_{ss'}$: 상태 전이 확률. 상태 $ s $에서 행동 $ a $를 취할 때 $ s '$로 전환 할 확률
  • $ R ^ a_ {ss '} $ : 상태 $ s $에서 행동 $ a $를 취하고 $ s '$로 전환 할 때 보상



  • 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.py
    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
    

    상태가치 함수와 마찬가지로 Q의 정의에 따라 재귀적으로 Q_pi를 구합니다.

    결과



    행동 가치 함수





    재귀 횟수를 9회로 설정했을 때의 행동 가치 함수입니다.
    적자로 나타낸 부분이 각 상태에서 가장 가치가 높았던 행동입니다. 이해하기 어렵기 때문에 화살표로 해 봅시다.

    최적 행동





    무작위로 움직이는 방안 $\pi$일 때, 각 상태에서 제일 가치가 높은 행동을 요구할 수 있었습니다.

    미래



    행동 가치 함수를 사용하여 가장 가치있는 행동을 찾을 수있었습니다. 즉, 정책에 따라 상태에 대한 최선의 행동을 알 수 있습니다. 그렇다고 하는 것은, 베스트인 행동을 새로운 방책으로 해 버리면, 보다 좋은 행동을 취할 수 있는 것이 아닐까요. 랜덤한 방책에 대해서, 행동가치를 요구하는 것으로 방책을 개선할 수 있을 것 같습니다.

      다음 회부터는 방책을 개선해 최적의 행동을 요구해 갑니다. 드디어 강화 학습에 들어갑니다.

    다음글



    이제 들리지 않는 강화 학습 (5) : 상태 가치 함수 근사와 정책 평가

    좋은 웹페이지 즐겨찾기