강화 학습의 On-Policy와 Off-Policy

On-Policy, Off-Policy의 구체예인 SARSA와 Q학습을 비교해 어쩐지 이 둘이 어떻게 다른지 알 수 있도록 정리해 보았다.

준비한 환경



예로서 온라인으로 볼 수 있는 교과서"Reinforcement Learning: An Introduction By Richard S. Sutton and Andrew G. Barto"의 Example 6.6에서 소개되고 있는 「벼랑 따라 걷기」의 환경하에서 SARSA 에이전트, Q학습 에이전트가 어떻게 행동하는지를 관찰해 본다.



에이전트는 시작(S)에서 시작합니다...
  • 골(G)로 진행하면 +1 의 보상. 스프레이로 돌아갑니다.
  • 매스에서 튀어나오면 -1 의 보상. 스프레이로 돌아갑니다.
  • 절벽(The Cliff)으로 진행하면 -100 의 보상. 스프레이로 돌아갑니다.
  • 그 이외의 장소라면 보상 0 .

  • Safer path는 절벽에서 멀리를 통해 골로. 그러나 최적의 경로는 절벽을 따라 절벽에서 떨어지지 않고 진행하는 것입니다.

    실제 pygame의 화면. 작은 사각형 (왼쪽 아래)은 에이전트. 노란색 사각형이 골. 짙은 회색 사각형이 절벽.



    SARSA(On-Policy) 에이전트


    Q\left(S_t,A_t\right)\leftarrow Q\left(S_t,A_t\right)+\alpha[R_{t+1}+\gamma Q\left(S_{t+1},A_{t+1}\right)-Q\left(S_t,A_t\right)]
    

    미래의 행동(action)이 현 전략(Policy)에 탈취해(On) 선택된다고 상정해 학습한다. 예를 들어 현재 전략이 ε-greedy이면 학습되는 평가 함수 Q는 ε-greedy의 Explore(저확률로 발생하는 랜덤 행동 선택)를 상정하여 갱신된다. 즉, 반드시 최선책(Greedy Action)을 취한다고는 할 수 없는 전제로 학습이 이루어진다.

    Sarsa 에이전트
    def agent_step(self, reward, state):
        # 次の行動(next_action)を現戦略(ε-greedy)に乗っ取って選択
        next_action = 0
        rnd = np.random.random()
        if rnd < self.episilon:
            #   Explore
            next_action = np.random.randint(0,4)
        else:
            #   Exploit(Greedy Action)
            next_action = np.random.choice( np.flatnonzero(self.Q[state[0],state[1]] == np.max(self.Q[state[0],state[1]])) )
    
        #   次の行動の価値をTD学習の方法で計算
        target = reward + self.gamma*self.Q[state[0],state[1],next_action]
    
        #   評価関数の更新
        self.Q[self.last_state[0],self.last_state[1],self.last_action] += self.alpha*(target - self.Q[self.last_state[0],self.last_state[1],self.last_action])
    
        self.last_action = next_action
        self.last_state = state
    
        return next_action
    

    SARSA 에이전트의 결과가 이쪽.


    붉은 부분일수록 Q함수의 값이 높다. 숫자를 보면 알 수 있듯이 요원은 절벽을 피하기 위해 목표에 도달합니다. SARSA는 On-Policy이다. 즉, ε-greedy의 Explore가 발생하여 절벽에서 떨어지는 것을 고려하여 학습이 이루어지기 때문에, 절벽을 따라 가는 길은 선택되기 어려워진다. 특히 이번 설정이라면 골 도달 보상 +1에 비해 절벽에 떨어졌을 때의 페널티가 -100 추락이 발생하더라도 절벽을 따라 최적의 경로를 선택하기에는 위험이 너무 큽니다.

    Q 학습(Off-Policy) 에이전트


    Q\left(S_t,A_t\right)\leftarrow Q\left(S_t,A_t\right)+\alpha[R_{t+1}+\gamma \max_{a} Q\left(S_{t+1},a\right)-Q\left(S_t,A_t\right)]
    

    미래의 행동(action)이 현 전략(Policy)에 관계없이 (Off) 항상 최선의 것이 선택된다고 상정해 학습한다. 예를 들어, 현재 전략이 ε-greedy이더라도, 학습되는 평가 함수는 ε-greedy의 Explore를 상정하지 않고 갱신된다. 즉, 반드시 최선책(Greedy Action)이 취해지는 전제로 학습이 행해진다.

    Q 학습 에이전트
    
    def agent_step(self, reward, state):
    
        # 次の行動はGreedyと言う前提で価値を計算
        target = reward + self.gamma*np.max(self.Q[state[0],state[1]])
    
        #   評価関数の更新
        self.Q[self.last_state[0],self.last_state[1],self.last_action] += self.alpha*(target - self.Q[self.last_state[0],self.last_state[1],self.last_action])
    
        # でも実際に選ぶ行動は現政策(ε-greedy)に基づいて選ばれる。
        rnd = np.random.random()
        if rnd < self.episilon:
            #   Explore
            next_action = np.random.randint(0,4)
        else:
            #   Exploit(Greedy Action)
            next_action = np.random.choice(np.flatnonzero(self.Q[state[0],state[1]] == self.Q[state[0],state[1]].max()))
    
        self.last_action = next_action
        self.last_state = state
    
        return next_action
    

     Q학습 에이전트의 결과가 이쪽.


    가급적 절벽을 지나도록 Q함수가 학습된다. 이것은 Q학습이 Off-Policy이기 때문이다. Off-Policy 때, 에이전트는 자신의 전략에 포함된 ε-greedy의 Explore를 고려하지 않는다. Q학습이라면 최적 행동만을 고려하여 학습한다. 즉, 에이전트가 Explore에 의한 위험( -100의 보수)이 발생하는 것을 무시하고, 절벽을 똑바로 진행하는 행동을 취하는 것을 전제로 학습한다.

    덧붙여서 Q학습의 학습속도를 Planning이라고 하는 방법으로 빨리 하는 Dyna-Q학습을 실시했더니 아래와 같은 더 정확한 결과를 얻을 수 있었다.



    참고문헌



  • Reinforcement Learning: An Introduction: ㅇㅇㅡㅜㅜㅜㅜㅜㅜ 네 t/보오 k/테-보오 k 2 nd d. HTML
  • 코드는 Github 에 공개했다.
  • 좋은 웹페이지 즐겨찾기