#09. 정책 기반 에이전트

0

가치 기반 에이전트는 가치 함수를 통해 액션을 선택하기 때문에
정책 함수가 없었지만, 정책 기반 에이전트는 정책 함수를 가진다.

9.1 Policy Gradient

가치 기반 에이전트가 액션을 선택하는 방식은
학습이 완벽하게 끝났다고 가정하면, 각 상태와 액션이 가지는 가치들을
특정한 값으로 수렴하기 때문에, 결정론적(deterministic)이 된다.
이 경우 액션이 너무나 정해져 있어 유연성이 떨어질 수 있는 문제를 가진다. 때문에 유연한 확률적 정책(stochastic policy)을 채택할 수 있는
정책 기반 에이전트가 사용된다.

또한 많은 경우 액션이 무한해서 그에 대한 가치함수는 연속적인 함수가 될 가능성이 높고, 이 경우에는 Q(s,a) 에이전트가 작동하기 힘드므로, 뉴럴넷을 사용해 정책 네트워크 π(a|s)를 잘 설명하는 함수를 찾는 것이 주가 된다.

목적 함수 정하기

정책 네트워크 π_θ(s, a)[θ는 정책 네트워크의 파라미터]는 환경에서 정책에 맞춰 움직이는 에이전트가 경험을 쌓게 해서 강화해나간다.
때문에 일반적인 뉴럴넷에서 손실함수를 통해 파라미터를 업데이트하는 것처럼 정책 네트워크에도 손실 함수(목적 함수)가 정의되어야 업데이트가 가능한데, 정책의 정답은 곧 최적 정책이기 때문에, 이를 숫자로 나타내는 것은 쉽지 않다.

때문에 파라미터 θ들을 통해 결정되는 정책네트워크를 평가하는 함수 J(θ)를 정의해서, 이 함수가 증가하는 방향으로 그라디언트 어센트를 할 수 있다.
정책은 보상의 총합으로 평가할 수 있으므로,

리턴의 기댓값 혹은 시작 상태 s_0의 밸류를 통해 J(θ)를 계산할 수 있다.

어떤 경우 시작상태가 s_0로 고정되어 있을 수 있으나,
시작상태가 고정되지 않고 일정 분포를 가지게 된다면,
특정 상태 s에서 시작할 확률 d(s)에 대하여

의 식으로 표시할 수 있다. 이는 확률과 밸류의 곱이므로 기댓값에 정의에 부합하며, 가질수 있는 s의 종류가 무한하다면 적분으로 고쳐 쓸 수 있다.

우리는 정책의 평가지표인 J(θ)가 큰 값이길 원하므로, J(θ)의 미소값인

을 통해 최적정책의 파라미터 θ*를 찾을 수 있고, 값이 증가하는 이유로
그라디언트 디센트가 아닌 그라디언트 어센트(ascent)를 구하게 된다.

1-Step MDP

1-Step MDP는 딱 한 스텝이 하나의 에피소드를 가지는 MDP로
리턴은 보상과 같은 상태이다. 전이확률과 리턴을 모르는 상황에서 시작 state가 정해져 있지 않다면, J(θ)는

위 식과 같이 정리된다.
다시말해 모든 상태 S에 대해 s로 시작될 확률과 모든 A에 대해 액션이 a일 확률
그리고 a를 선택했을 때, 모든 경우의 수의 곱을 알 수 있다면,
J(θ)를 구할 수 있게 된다.

S, A가 무한대라고 가정하면 위 식은 S, A에 대한 이중적분임에도
결과적으로 관측을 통해서 J(θ)를 근사적으로 정의 가능할 꺼라고 생각되지만, 
책에서는 '상태의 개수가 너무 많아'서 불가능 하다고 한다. (어째서?)
아마도 확률에 대한 차원은 2개고, 시행으로 무한대로 보낼 수 있는 차원은 1개라
그런 것으로 예상되지만 잘은 이해가 되지 않는다.

아무튼 양변을 미분한다면

를 알 수 있고, 기대값 -> '샘플 기반 방법론'을 통해,
R(s,a)를 관측한다면 ∇_θJ(θ)를 알 수 있게 된다.

일반적 MDP에서의 Policy Gradient

1-step MDP에서 단순히 R_(s,a)를 구했던 것처럼
step이 늘어난 정상적인 MDP에서는 1행동의 보상 대신
행동가치함수의 리턴을 구하면 그라디언트를 구할 수 있다.
수식으로 정리하면 다음과 같다.

9.2 REINFORCE 알고리즘

policy gradient 알고리즘의 기초! 라고 한다.
위에서 사용한 기본 수식에서 액션가치함수 Qπθ(s,a)대신 Gt를 사용하는
차이가 있다. G_t의 샘플을 여러개로 평균을 내는 값이 Q
π_θ(s,a)이고

기대값 내부의 값이므로 리턴을 사용하는 것도 큰 문제 없음을 알 수 있다.

pseudo-code
1. θ(정책 네트워크의 파라미터)를 초기화해준다.
2. s의 상태를 s_0로 초기화해준다
3. while π_θ를 사용해 에피소드를 끝까지 진행해 G_t를 얻음
4. 위의 식에 따라 θ'을 업데이트 해줌
5. for 에피소드가 끝나면 2번으로 돌아가 반복
6. θ가 수렴하거나, task가 잘 학습될때까지 반복

위 식을 다시 살펴보면
로그 함수는 단조증가함수이므로, 리턴이 증가하는 방향이라면 해당 행동을 증가시키고 감소하는 방향이라면 행동을 감소시키는 것을 알 수 있다.

REINFORCE 구현

파이토치에서는 손실함수를 미분한 값이 아니라, 그냥 손실함수를 정의해주면
알아서 미분값을 계산해 그라디언트를 업데이트 해준다.
계에서 그라디언트 벡터는 값을 감소시키는 방향으로 작용하므로

를 선언해주면 G_t를 증가시키는 방향으로 θ를 조정해준다.

9.3 액터-크리틱

정책 네트워크와 밸류 네트워크를 함께 학습하는 것을 액터 크리틱이라고 한다.
액터 크리틱에는 Q액터크리틱, 어드밴티지 액터크리틱, TD액터크리틱이 있다.

Q 액터-크리틱

Q 액터크리틱은 기존의 REINFORCE가

의 식에서 Q_π_θ 대신 G_t 를 사용했다는 점을 감안해서
그대로 행동가치함수를 사용하면 된다. 이 경우 π_θ는 학습시키는 파라미터이므로
새로운 파라미터인 w를 부여해서 Q_w와 π_θ 두 뉴럴넷을 동시에 학습시킨다.
여기서 π_θ는 액션을 선택하는 액터에, Q_w는 액션을 평가하는 크리틱에 해당한다. Q_w는 앞서 가치기반 에이전트 업데이트식을 그대로 사용하는데

θ대신 w, α대신 β를 사용해준거 말고는 동일하다.

pseudo-code
1. θ(정책 네트워크의 파라미터), w(Q네트워크의 파라미터)를 초기화해준다.
2. s의 상태를 s_0로 초기화해준다
3. a를 실행해서 r과 s'를 관측
4. θ업데이트 식을 통해 θ'을 업데이트 해줌
5. a'를 실행해서 r'과 s''을 관측
6. w를 업데이트식을 통해 w'를 업데이트 해줌
7. while 에피소드가 끝날때까지, 스텝마다 3-6을 반복
8. for θ와 w가 수렴할때까지 에피소드를 반복

θ는 Q_w에 의존하여 보상 값과 관계없이 업데이트됨을 확인할 수 있다.

어드밴티지 액터-크리틱

액션 가치함수는 기본적으로 상태기반이 아니라 액션기반이기 때문에
액션의 가치가 높지 않더라도 기반상태의 가치가 높다면, 과도하게
액션이 강화되는 경우가 생길 수 있다. 물론 아주 많은 학습을 한다면
올바른 수렴이 일어나겠지만 효율성이 떨어지기 때문에,
액션 a로 인해 얻는 추가적인 가치를 어드밴티지라고 정의하고

위 식을 통해서 액션 a에 대한 알짜 가치로 학습 성능을 향상시킨다.
어드밴티지를 정의 하기 위해 상태가치함수 Vπ를 사용했지만,
실제 값을 모르므로 상태가치함수를 계산하는 뉴럴넷 또한 필요하다.
상태 가치 함수 V
πθ를 VΦ(s)로 근사하고

위 식으로 파라미터를 업데이트 한다.

pseudo-code
1. θ(정책 네트워크의 파라미터), w(Q네트워크의 파라미터), 
   Φ(상태 가치함수의 파라미터)를 초기화해준다.
2. s의 상태를 s_0로 초기화해준다
3. a를 실행해서 r과 s'를 관측
4. θ업데이트 식을 통해 θ'으로 업데이트 해줌
5. a'를 실행해서 r'과 s''을 관측
6. w를 업데이트식을 통해 w'으로 업데이트 해줌
7. Φ를 업데이트식을 통해 Φ'으로 업데이트 해줌
8. while 에피소드가 끝날때까지, 스텝마다 3-7을 반복
9. for θ와 w가 수렴할때까지 에피소드를 반복

TD 액터 크리틱

어드백티지 액터크리틱은 효율성이란 장점에도 불구하고 뉴럴넷을 3쌍이나
사용하는 단점도 가지고 있다. 때문에 뉴럴넷을 줄이기 위해서 TD액터 크리틱을 사용한다.

이 경우 TD에러인 δ의 기댓값이 어드밴티지와 같다는 점에 착안해서

V_Φ에 대한 파라미터Φ만 구해주는 것으로 Q없이도 어드밴티지를 구할 수 있다.

pseudo-code
1. θ(정책 네트워크의 파라미터), Φ(상태 가치함수의 파라미터)를 초기화해준다.
2. s를 초기화
3. a를 실행해서 r과 s'를 관측
4. 위의 δ 계산식을 통해 δ 값을 구해줌
5. θ업데이트 식을 통해 θ'으로 업데이트 해줌
6. Φ를 업데이트식을 통해 Φ'으로 업데이트 해줌
6. while 에피소드가 끝날때까지, 스텝마다 2-6을 반복
7. for θ와 w가 수렴할때까지 에피소드를 반복

0개의 댓글