이번에 중간고사를 지나면서 시간이 상당히 오래되었지만 A2C에 대해 리뷰하려고 합니다.
먼저 앞에서 배웠던 DQN과 Policy gradient의 차이를 먼저 짚고 넘어가면 좋을거 같네요.
강화학습에서 최종 목표는 항상
Agent가 Reward를 최대한 많이 받도록 하는 것입니다.
DQN은 여기서 Q-function, 즉, 행동가치함수를 추정해서 이를 통해 최대해 행동가치를 가질 수 있는 행동을 선택하도록 한다.
하지만 만약 우리의 action이 continuous하다면? 즉, 선택지가 너무 많아서 이를 가치함수의 가짓수로 나타내기 힘들다면 어떻게 해야할까? 물론 DQN과 AC계열의 차이는 이 한가지 문장으로 표현하기 어렵겠지만 제가 느끼기로는 이게 AC로 진입하게 되는 진입문을 잘 표현한 것 같습니다.
Policy Gradient의 가장 큰 의미는 정책을 parameterized화 했다는 것이다. 우리는 결국에는 최적의 정책을 찾는 것이 목표이기 때문에 이를 parameterized하고 이를 gradient를 이용하여 업데이트를 할 수 있다면 우리는 최적의 정책을 찾을 수 있을 것이다. 이런 의미로 시작된게 AC계열이라고 생가이 든다.
즉, 우리는 이걸 찾고자 하는거다. 현재 state에서 cumulated Rewad를 최대화 할 수 있게 하는 정책.
그럼 어떻게 이 정책을 parameterized해서 업데이트를 할까?
이건 score function이다. 이게 뭐냐? 단순히 생각하면 우리의 목적함수인것이다. 중앙에 있는 항을 보면 해당 parameter로 구성된 정책을 따라간 궤적을 통해 얻은 reward의 평균이 score function으로 정의되는 것을 볼 수 있다. 그럼 당연히 우리는 이 함수를 높여야 한다는 걸로 생각이 귀결될 것이다.
자 여기까지 오면 우리의 목적은 분명하다. 저걸 미분해서 gradient ascending을 해주면 정책이 반환값을 잘 받겠구나라고 이해 할 수 있습니다.
자 미분을 해보면
요렇게 되는데 오른쪽의 reward는 우리가 많이 본 부분인거 같습니다. 행동가치 함수죠. 그래서 우리는 다음과 같이 식을 바꿀 수 있습니다.
사실 바꿀 수 있다? 라고 하기 보다는 그냥 우리는 즉각적인 reward를 쓰는게 아니라 long-term에서 보자는adient의 차이를 먼저 짚고 넘어가면 좋을거 같네요.
강화학습에서 최종 목표는 항상
Agent가 Reward를 최대한 많이 받도록 하는 것입니다.
DQN은 여기서 Q-function, 즉, 행동가치함수를 추정해서 이를 통해 최대해 행동가치를 가질 수 있는 행동을 선택하도록 한다.
하지만 만약 우리의 action이 continuous하다면? 즉, 선택지가 너무 많아서 이를 가치함수의 가짓수로 나타내기 힘들다면 어떻게 해야할까? 물론 DQN과 AC계열의 차이는 이 한가지 문장으로 표현하기 어렵겠지만 제가 느끼기로는 이게 AC로 진입하게 되는 진입문을 잘 표현한 것 같습니다.
Policy Gradient의 가장 큰 의미는 정책을 parameterized화 했다는 것이다. 우리는 결국에는 최적의 정책을 찾는 것이 목표이기 때문에 이를 parameterized하고 이를 gradient를 이용하여 업데이트를 할 수 있다면 우리는 최적의 정책을 찾을 수 있을 것이다. 이런 의미로 시작된게 AC계열이라고 생가이 든다.
즉, 우리는 이걸 찾고자 하는거다. 현재 state에서 cumulated Rewad를 최대화 할 수 있게 하는 정책.
그럼 어떻게 이 정책을 parameterized해서 업데이트를 할까?
이건 score function이다. 이게 뭐냐? 단순히 생각하면 우리의 목적함수인것이다. 중앙에 있는 항을 보면 해당 parameter로 구성된 정책을 따라간 궤적을 통해 얻은 reward의 평균이 score function으로 정의되는 것을 볼 수 있다. 그럼 당연히 우리는 이 함수를 높여야 한다는 걸로 생각이 귀결될 것이다.
자 여기까지 오면 우리의 목적은 분명하다. 저걸 미분해서 gradient ascending을 해주면 정책이 반환값을 잘 받겠구나라고 이해 할 수 있습니다.
자 미분을 해보면
요렇게 되는데 오른쪽의 reward는 우리가 많이 본 부분인거 같습니다. 행동가치 함수죠. 그래서 우리는 다음과 같이 식을 바꿀 수 있습니다.
사실 바꿀 수 있다? 라고 하기 보다는 그냥 우리는 즉각적인 reward를 쓰는게 아니라 long-term에서 보자는 의미가 조금 더 강합니다.
근데 여기 식을 보면 문제가 있죠. 저 식이 평균값이라는거에요. 즉, 내가 저 평균값을 구하려면 모든 state와 action을 모두다 구해서 그걸 평균 때려야 한다는 거죠. 아니 이게 무슨 말방구도 아니고 어느 세월에 모든 state를 겪어 봐요. 그래서 우리가 옛날에 배웠던 Monte-Carlo 방법을 가져오는거에요.
그니깐 저 평균 대신 내가 에피소드 내에서 얻은 데이터를 결과를 바탕으로 경험적인 평균적인 return을 바탕으로 학습하겠다는 거에요. 즉,
요렇게 학습한다는거죠.
여기까지가 Vanila actor critic에 대한 이야기고여 이제부터 A2C이야기입니다.
앞써 말한 Policy Gradient의 문제는 무엇이냐, High Variance 문제가 있다는 겁니다. MC방식을 사용하기 때문에 업데이트 되는 정도가 내가 경험한 환경에 따라 많이 변한다는 거죠. 즉, Gradient가 너무 중구난방한다는 소리에요. 그럼 당연히 수렴을 하기도 어렵겠죠? 그래서 A2C는 Q대신 아래와 같은 Advantage를 사용합니다.
이걸 사용함으로써 Q대신 좀 더 내가 한 행동에 대한 결과를 반영함으로써 그전에 state들로 인해서 중구난방되는 value값을 조절해준 것이죠. 근데 여기서 눈치채셔야하는 점이 상태 가치 함수가 있다는 겁니다.
그래서 저희는 이러한 상태가치함수를 근사해주는 network를 하나 더 추가해주는 것이죠.
요렇게요.
Value funciton은 TD error로 구하고 Actor는
아래와 같은 식으로 학습을 진행하는 것이 A2C입니다.
다만 여기서 중요한 점은 우리가 Monte-Carlo로 기반으로 학습을 진행시키기 때문에 데이터를 이용해서 네트워크를 학습 시키면 해당 데이터를 다시 사용하지 않고 새로운 데이터를 모아서 또 학습 시켜야한다는 것이죠. 이를 On-policy알고리즘이라고 합니다.
참고자료
dnddnjs.gitbooks.io/rl/content/actor-critic_policy_gradient.html