date: 2021-10-16 22:00:00



지금까지 설명한 내용들을 이제 계산 가능한 식의 형태로 나타내 볼테다.


벨만 기대 방정식(Bellman Expectation Equation)

우리는 "value-function을 벨만 기대 방정식(Bellman Expectation Equation)이다." 라고 value-function을 설명하던 중 언급 한 적이 있다.

말 그대로

Vπ(s) = Eπ[Rt+1 + γVπ(St+1) | St = s]

이것이 벨만 기대 방정식(Bellman Expectation Equation)이라고 한다.

이 벨만 기대 방정식은 현재 state의 value function과 다음 state의 가치함수 사이의 관계를 식으로 나타낸 것이다.

이 식을 계산을 할 때 한 에피소드를 끝까지 다 따라간다(모든 timestep을 고려)면 계산이 복잡해질 수 밖에 없다.

나중에 dynamic programming 을 이용할건데, 이 dynamic programming을 이용하여 벨만 기대 방정식을 풀면 효율적이다.

지금 조금만 말하자면 "한 에피소드를 끝까지 다 따라간다(모든 timestep을 고려)"를 하지 않고 모든 state에 대해 한 timestep에 대해서만 계산을 진행을 한다.

벨만 기대 방정식의 E (기댓값)를 계산 가능하게 바꾸게 된다면 아래와 같은 수식이 성립하게 된다.

Vπ(s) = Σa∈A π(At | St = s) (r(St = s, At = a) + γΣs'∈St+1 P(St+1 = s' | St = s, At = a)Vπ(s'))

위 수식을 해석하자면,

각 action에 대해 그 action을 할 확률을 고려하고 action을 했을떄 받을 reward과 상태 변환확률을 고려한 다음 state의 가치함수를 고려한다.

쉽게 말하면, 현재 timestep에서의 state transition probabilty 와 모든 action에 대한 policy 확률을 고려해서 다음 timestep의 가치함수를 구했다고 하면 된다.


Grid-world 예제

현재 state A의 value 를 구한다,

statet tarnsition probability 를 1로 최초 policy는 0.25(random)로 두고 γ는 0.9이다.

그럼 다음과 같은 식이 나올 것이다.

Vπ(s) = Σa∈A π(At | St = s) (r(St = s, At = a) + γVπ(s'))

ActionValue
up(Q)0.25 (0 + 0.9 0) = 0
down(Q)0.25 (0 + 0.9 0.5) = 0.1125
left(Q)0.25 (0 + 0.9 1) = 0.225
right(Q)0.25 (1 + 0.9 0) = 0.25
Value0 + 0.1125 + 0.225 + 0.25 = 0.5875

아까도 말했듯이, 위의 예제도 마찬가지로 현재 timestep 에 대해서 계산을 한 값들이다. (현재 timestep의 value값, policy를 고려)

맨 밑의 Value값은 timestep = 현재 + 1인 Value값이다.

dynamic programming 을 사용하여 모든 state의 현재의 value 값들을 업데이트 시켜주게되면 현재 policy에 대한 참값에 수렴을 하게 될것이다.

그런데 우리의 목표는 최적의 action을 구하는 것이다 그러려면 action에도 변화를 주어야한다.

따라서 policy도 update해주어야 하는데...

어떻게 policy를 바꿀까??




벨만 최적 방정식(Bellman Optimality Equation)

policy update

위에서 value를 통해 어떻게 policy를 업데이트 해줘야 하는지에 대해서 궁금해 했었는데 설명을 하겠다.

Vπ(s) = E[Rt+1 + γVπ(St+1) | St = s]

이것은 벨만 기대 방정식이다.

우리는 이 벨만 기대방정식을 통해 현재 policy에 대한 value의 참값을 얻을 수 있다.

value를 얻는 이유는 최적의 action을 선택하기 위해선데 그것은 또 policy가 결정을 하게 된다.

그래서 value값을 통해서 policy를 얻기도 함에 동시에 policy를 얻기 위해 value 값을 찾는 형태가 되어버린다.

(처음에는 조금 햇갈릴 수 있다. 다음 포스트에 자세히 설명을 해놓았으니 걱정하지마라)

따라서 우리는 value가 update되었으면 그것을 바탕으로 policy를 조금 update를 하고,

그 update된 policy를 통해 다시 value를 업데이트 시키는 과정을 계속해서 반복을 해서 최적 action을 선택할 수 있게 된다.

계속 반복하다 보면 최적의 가치함수가 나오고 마찬가지로 최적 정책도 나올 것이다.

이것들을 식으로 설명을 하면...


최적의 가치함수

모든 가능한 정책에 따른 Vπ 값 중에서 최대를 반환함

V*(s) = maxπ[Vπ(s)]


최적의 큐함수

모든 가능한 정책에 따른 qπ 값 중에서 최대를 반환함

q* (s, a) = maxπ [qπ (s, a)]


최적 정책

최적 정책은 위의 최적 큐함수를 이용을 하는데, 최적 큐함수가 최대가 되는 행동을 반환함

π (s, a) = 1 if a = argmax a∈A q (s, a)

= 0 otherwise


벨만 최적 방정식

V(s) = maxaE[Rt+1 + γV (St+1) | St = s, At = a]




벨만 기대방정식 vs 벨만 최적 방정식

우리는 value function을 통해 벨만 기대방정식과 벨만 최적 방정식을 공부해 보았다.

그럼 우리가 왜 이런 방정식들을 정의를 해놓았을까?

그것은 실제로 계산을 해보기 위해서인데,

실제로 계산을 하는 방법이 2가지가 있다.

하나는 policy iteration(정책 이터레이션)이고

또 하나는 value iteration(가치 이터레이션)이다.

벨만 기대 방정식 같은 경우

Vπ(s) = E[Rt+1 + γVπ(St+1) | St = s]

우리가 action과 state 모두 고려를 하는 policy를 기준으로 가치를 계산한다.

그걸 우리는 state-action value function 이라고도 하는데,

벨만 기대방정식을 계산하는 방법이 바로 policy iteration이다.

벨만 최적 방정식 같은 경우

V(s) = maxaE[Rt+1 + γV (St+1) | St = s, At = a]

우리가 state-only value function이라고도 하는데,

벨만 최적 방정식을 계산하는 방법이 바로 value iteration이다.

다음 포스트에 더 자세하게 다룰것이다.



제가 올린 글에서 잘못된 부분이 있으면 제 메일로 연락주세요!

Reference : 파이썬과 케라스로 배우는 강화학습


이승수의 저작물인 이 저작물은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

0개의 댓글