ai theory
강화학습 기초 (13) - Policy를 직접 미분한다는 것
Junyoung Park · 2024-06-07 · 5 min
들어가며...
DQN은 각 Action의 Q값을 예측하고 가장 큰 Action을 선택했다.
즉, Policy는 Value function 뒤에 숨어 있었다. Q값을 잘 배우면 Policy가 따라 나오는 구조다.
Policy Gradient는 순서를 바꾼다. Parameter 를 가진 Policy 자체를 만들고, 좋은 Return을 만든 Action의 확률이 높아지는 방향으로 를 움직인다.
처음 보면 “환경은 미분할 수 없는데 Action 확률을 어떻게 미분하지?”라는 의문이 생긴다. 이번 글에서는 이 문제를 풀어주는 Log-derivative trick과 가장 기본적인 Policy Gradient Algorithm인 REINFORCE를 살펴본다.
Policy를 직접 표현하는 이유
Discrete action에서는 Softmax policy를 사용할 수 있다.
는 Action의 선호도를 나타내는 Score다.
Continuous action에서는 평균과 표준편차를 출력하는 Gaussian policy를 사용할 수 있다.
이 경우 모든 Action의 Q값을 나열하거나 를 계산할 필요 없이 Policy가 연속값 Action을 직접 Sample한다.
Policy를 직접 학습하면 다음 장점이 있다.
- Continuous action을 자연스럽게 다룬다.
- Stochastic policy가 필요한 문제를 표현할 수 있다.
- Action 확률을 부드럽게 바꿀 수 있다.
반면 Value-based method보다 Gradient의 Variance가 클 수 있고, 한 번 모은 On-policy 경험을 오래 재사용하기 어렵다는 단점이 있다.
무엇을 최대화할까?
Policy의 목표를 기대 Return으로 둔다.
는 Policy가 만든 Trajectory다.
우리가 원하는 것은 가 커지는 방향,
이다.
좋은 결과를 만든 Action을 더 자주
REINFORCE의 Update는 다음과 같다.
식은 문장처럼 읽을 수 있다.
- 이면 실제로 선택한 의 Log probability를 높인다.
- 이면 그 Action의 Log probability를 낮춘다.
- 가 클수록 Update를 크게 한다.
Action이 LEFT, RIGHT 두 개이고 현재,
이라고 하자. RIGHT를 Sample해 좋은 Return을 얻었다면 가 커지는 방향으로 움직인다. 확률 합은 이어야 하므로 RIGHT의 확률이 올라가면 LEFT의 확률은 내려간다.
여기서 중요한 점은 “가장 큰 확률의 Action”만 학습하는 것이 아니라 실제로 Sample한 Action을 그 결과에 따라 평가한다는 것이다.
왜 Log를 사용할까?
확률 에 대한 기대값을 생각해보자.
미분하면,
이다. 다음 항등식을 사용한다.
왜냐하면,
이기 때문이다.
이를 대입하면,
이고 기대값으로 쓰면,
가 된다.
전체 가능한 결과를 합하지 않아도 현재 Policy에서 Sample한 와 관찰한 만으로 Gradient를 추정할 수 있다.
환경을 미분하지 않아도 되는 이유
Action을 고른 뒤 환경이 어떻게 움직이는지는 미분할 수 없을 수 있다. 충돌, Game rule, 사람의 반응처럼 불연속적인 과정도 많다.
Policy Gradient는 환경을 통과해 Gradient를 역전파하지 않는다. 환경에서 받은 Return을 Weight로 사용하고, 미분 가능한 Policy의 Log probability만 미분한다.
환경은 결과를 알려주고, Policy는 그 결과를 만든 선택의 확률을 바꾼다.
Policy Gradient Theorem
State를 여러 번 거치는 MDP에서는 Policy Gradient Theorem이 다음 형태를 준다.
State 방문 확률을 직접 미분하지 않고도 현재 Policy의 Trajectory Sample로 Gradient를 구할 수 있다는 것이 핵심이다.
REINFORCE는 알 수 없는 대신 실제 Return 를 사용한다.
왜 Episode 전체 Return 대신 를 쓸까?
시간 의 Action은 이미 지나간 Reward에 영향을 줄 수 없다. 따라서 를 평가할 때는 그 시점 이후의 Return만 사용한다.
이전에 받은 Reward까지 곱하면 Action과 무관한 Noise를 더하는 셈이다. 이 Causality를 반영하면 Gradient의 Variance를 줄일 수 있다.
REINFORCE 전체 과정
- 현재 Policy 로 Episode 하나를 생성한다.
- 각 시간 에서 Return 를 계산한다.
- 를 더한다.
- Episode가 끝난 뒤 Parameter를 Update한다.
구현은 단순하지만 Episode Return이 크게 흔들리면 Gradient도 크게 흔들린다.
REINFORCE의 높은 Variance
같은 State에서 같은 Action을 골라도 환경의 Randomness와 이후 Action에 따라 가 달라질 수 있다. 한 번은 , 다음에는 이 나올 수 있다.
REINFORCE는 이 Return을 그대로 곱하므로 Update의 Variance가 크다. 많은 Trajectory를 평균내야 안정적인 방향이 보일 수 있다.
다음 글에서는 “평소 이 State에서 기대하던 값”을 Baseline으로 빼고, 그 Baseline을 학습하는 Critic을 추가한다. 이것이 Actor-Critic의 출발점이다.
이번 글에서 기억할 것
Policy Gradient는 좋은 Return을 만든 Action의 Log probability를 높이는 방향으로 Policy Parameter를 직접 Update한다.
- Policy 는 Action의 확률 분포를 직접 표현한다.
- Log-derivative trick 덕분에 환경을 미분하지 않고 Sample로 Gradient를 추정한다.
- REINFORCE는 를 사용한다.
- 의 부호는 확률을 올릴지 내릴지, 크기는 Update 강도를 정한다.
- 단순하지만 Monte Carlo Return 때문에 Variance가 크다.