투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)
바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)
오늘 강의는 policy gradient를 critic과 함께 향상시키는 법을 배울 것이다.
(lower variance?)
머 등등 배운다
배우다 보면 알겠지
지난 시간에 reinforce algorithm 에 대해 배움.
빨간박스에서 샘플 만들구
초록 박스에 대해서는 리워드를 정의했었고 결론적으로 Q function을 도입했었다.
Q hat은 Q function을 예측하는 함수이다. (저기 x랑 u를 인풋으로 받는거는 s랑 a 인풋 받는거랑 같은 말이다. 다른 표현. ㅋㅋㅋㅋ 첨보고 뭐지 싶었는데 lecture 2에서 배웠던 내용) 이 Q hat function을 reward to go 라고 한다.
이번 수업에서는 더 나은 방법으로 reward to go를 예측하는 방법에 대해 배운다.
이걸 샘플링하는 과정으로 바꿨고
파란박스에서 업데이트 했다.
Q hat은 state s 에서 action a를 했을 때의 기대되는 리워드.
더 나은 리워드를 추정할 수 있을까?
저 초록 점으로부터의 꼬부랑 길이 우리가 추정한거라고 하자.
그치만 다시 뒤로와서 다시 실행을 하면 다른 결과가 나올 수 있다.
우리는 저 가능한 outcome에 대해서 기댓값을 구하고 싶은거다.
여기에서 샘플링한 하나의 estimate gradient말고 true expected reward-to-go 를 안다면, 그걸 그냥 싹 넣으면 되고 우리는 우리의 분산을 much 줄일 수 있다. (single sample보다 average는 분산이 낮지 당연)
그러면 더 빨리 배울 수 있어.
베이스라인을 끼얹자
b = average reward인 상태.
무엇을 average하냐면 당연히 Q.
근데 이거 사실
이전 강의에서 배운 state dependent한 V함수를 baseline으로 쓰면 댐.
지난주에 배운 내용을 보자.
Q 함수는 토탈 리워드의 기대값이고
정책함수 파이에 연관되어 있기 때문에 파이를 위에다 붙여서 그걸 표시한다.
value function은 같은 방법인데, state만 가지고 예측하는 것을 value function으로 정의했었다.
Advantage(A)는 Q - V 를 통해 어떤 action이 가지는 이득을 표시한다.
그리고 이를 바탕으로 J(세타)의 미분을 구했다. 이때 A라는 함수를 썼다. (기존의 Q라는 리워드 대신)
저 빨간줄은 unbised되어있지만, single sample을 뽑아서 측정하기 떄문에 높은 분산을 가지고 있다.
우리는 저 green box에서 더욱 좋은 방법으로 예측하도록 변경 할 것이다.
어케 이걸 할 수 있냐?
fit what to what? 머에서 뭘로 fitting 할거야?
Q파이 V파이 A파이 등등을 예측하도록 모델을 설계할 수 있구 그중에 뭘 선택할거야?
오늘은 classic actor critic 알고리즘(ACA) 에 대해 말할 것.
기존 큐는 리워드의 기댓값인데,
이 중에 첫 리워드는 그냥 구할 수가 있다. (정확하게)
그리고 미래의 기댓값은
이므로
일케 표현 가능.
글고 이걸 확실한 expectation이 아닌 approximate하는 함수 V로 바꾸어 좀더 간단하게
일케 표현하도록 해보자. V함수는 이제 expectation을 approximate 하는 값을 가지게 한다.
s_t+1에서 수많은 가능성들이 있을텐데 그 기댓값을 return 하는 함수가 되는 것.
위 식은 Q function에 대한 꽤나 괜찮은 추정이다.
이걸 통해서 어드벤티지를 표현해보자면 위와 같이 approximate 할 수 있게 된다.
어드벤티지는 리워드 + 다음 Value - 지금 Value 로 표현할 수 있다. (즉 V만 가지고 다 표현 가능)
단순히 두번 함수를 실행하면 충분하다.
classic ACA는 V함수를 통해서 모든것을 표현하지만, 실제로는 다양한 방법의 ACA가 존재한다고 알아만 두자.
오늘은 V함수를 통한걸 알아볼거고
나중엔 Q러닝이나 off-policy 알고리즘 등등을 알아볼것.
여튼 일단 V^파이(s)만을 fitting 해 보자!
우리는 뉴럴넷이 있는데 s를 입력받아서 V^파이(s) 는 state 의 리워드를 표시하고, 이 때의 파라미터들을 파이(아침먹고땡 기호 ^_^...)로 표시하도록 하자. 이미 세타는 policy의 파라미터를 표시하는데 쓰였으니까.
value function 파라미터는 파이로 표시.
이제 무엇을 fit 할지는 정했으니 어디다가 (어떤것을 목적값으로) fit 할지를 정해야 한다.
어디에다가 value를 fit 할지를 결정 하는 것은 policy evaluation에 대한 문제이다.
policy 평가는 fixed policy 파이를 주면 얼마나 좋은지(다른말로는 어떤 value function의 결과가 나오는지) 알려주는 것.
Value function을 갖고 있으면 policy가 얼마나 좋은지 알고 저번에 다룬 J를 바로 V에 대해 표현이 가능.
어떻게 policy를 평가할까?
Monte Carlo Policy evaluation 이라는 방법이 있다. (policy gradient 가 하는 방법)
몬테카를로 방법을 해보자. 어떤 state의 value는 너가 그 state부터 끝까지 모은 리워드의 총 합과 '근사'하다.
물론 어떤 state로부터 여~러 action을 통해 여~러 reward을 찍어보는 것 보다야 못하긴 하다.
우리가 이런 추정을 이용할 수 있다면 먼가 웃긴게 된다.
높은 variance를 피할라고 V를 썼는데 V 자체가 sample해서 추정을 해버리면 여전히 다시 분산이 커져버린다.
-_-?
이게 왜 실질적으로 도움이 될까?
저 오른쪽 그림을 보자
우리는 같은 뉴럴넷을 통해 여러 state로부터의 sample한 결과를 동시에 학습하기 때문에 (단 하나의 state로부터 하나의 결과만 추정한다며는 value function은 전혀 성능의 향상이 없을 것) 나름 분산을 줄이는 데에 도움이 되는 것이다.
여전히 state로 부터 여~러 가능한 reward들을 시도해 보는 것 보다는 못하지만 still, 나름 괜찮기는 하다.
그러면 트레이닝 셋은 ( s , reward 총합 = y ) 들의 묶음이 되고 이것들을 batch뭉치로 싹싹 돌리면 분산을 줄이는데에 도움이 된다.
그럼 그냥 supervised regression problem이 된다.
위 방법보다 좀 더 잘할 수 있을까?
이상적인 타겟은
실제로 실행을 해서 싹 더한것의 기댓값이 될 것이다.
그거는 불가능하니까 어떤 임의의 i 샘플을 통해서 오른쪽 식과 같이 근사한 것이다. (r() + Expection)
그리고, 사실 이건... 우리가 근사하려고 하는 함수 V^파이 를 통해 표현하고자 하는 것과 일치한다.
뭐,, V를 근사하기 위해 V를 사용한다는 것이 맘에 걸리긴 하지만.. 그냥 비슷하겠거니 하고 넘어가도록 한다 ㅎㅋ
그래서 결국 파라미터 파이로 근사된 V hat 머시기 저시기를 갖다 붙여서 표현한다.
이제 트레이닝 데이터가 바꼈따.
y = r(s_i,t , a_i,t) + V(s_i,t+1)
가 되는 것.
여전히 supervised regression으로 학습시키며 이걸 "bootstrapped" estimate라고 표현하기도 한다.
그래서
booststrapped estimate 한다 하면 r + v 방식으로 학습시키는 것이고
monte carlo estimate 한다 하면 리워드를 전부 합치는 방식을 쓰는것
와 레빈 겨스님의 띵 정리 나왔다. ㄷ ㄷ
예시.
TD-Gammon.
reward : game outcome
value function V : expected outcome given board state
Go
reward : game outcome
value function V : expected outcome given board state
자 이제 다 합쳐서 최종 actor-critic algorithm을 만들어 보자.
이전에 policy eveluation step만 했자나.
method의 구조는 reinforcement algorithm과 비슷하다.
step 2가 추가된 것이 보인다.
evaluate A를 하는 것으로 바뀌었구
step 4때 A를 이용한 gradient를 사용하는 것으로 바뀌었다.
Value function의 종류는 아래에서
그리고 부트스트랩 활용하려며는 supervised learning을 사용해야 한다.
근데!
만약에 time을 통해서 제한이 된다면 이게 좋겠지만 time 제한이 없다면value가 계속 커질 것이다.
그래서 discount factor이라는걸 도입할 수 있다. (시간이 지날수록 reward의 보상을 줄이는 것.)
이건 리워드가 무한이 될 경우를 방지하고 싶은 것이다.
episodic task는 바로 언젠가 끝나지만 continuous task는 안끝나.
저 감마라는 할인factor을 도입해서 시간이 지날수록 리워드의 가치를 떨어뜨릴 것이다.
오른쪽 MDP(markov decision process)를 보면 영원히 무한으로 돌아다닐 수 있는데, reward가 0에 수렴하면 death state로 빠질 수 있는 state를 추가했다. (death state의 reward는 0이다)
말 되는 것 같다
우리는 policy gradient에 이게 어떻게 적용되는지 보자. (몬테 카를로 알고리즘 포함해서)
우선 option 1처럼 할 수 있음.
그리고 option 2 처럼 할 수 있음.
근데 option 1 이랑 2가 같지 않다.
Actor-critic에 적용된 discount factor와 같은 것은 option 1이다.
그치만 option 2를 좀 더 보자. 맨 아래 보면 감마의 t-1승을 왼쪽으로 뺐다.
이걸 보면 option 1과 2의 차이가 분명해진다.
근데 사실 100년후에 내가 죽을게 걱정되는걸 적용하는게 discount factor라면 option2가 올바른 접근법이다.
그래서 보면 위와 같은 이런... 현상이 발생한다.
option 1의 감마가 하는 일은
결국 미래에 대한 불확실한 가치를 줄이고 그로 인해 분산을 줄이고
현재에 대한 가치를 늘려주는 것이 된다.
이제 우리는 actor-critic algorithm을 정리할 수 있게 된다.
batch actor-critic algorithm:
1. 샘플링한다.
2. 샘플된 보상으로부터 V^파이_파이(s)를 fitting한다. (다만 이때는 분산이 높고 !!! V^파이_파이(s`)으로 놓기도 함.
3. 평가 A(s,a) = r(s,a)+감마V(s`) - V(s) // s`은 미래
4. J(세타) 프라임을 샘플링 머시기로 구하기.
5. 업데이트
이젠 온라인 버전도 해볼 수 있다.
이전까지만 해도 올바른 샘플링을 위해 multiple trajectory를 샘플해야했고, 처음부터 끝까지 무조건 해봐야했는데 (리워드 계산 해야했으니까)
근데 이제는 전부 볼 필요가 없기 때문에 policy에서 중간의 어떤 상태에서 action을 취해보고 그에 대한 평가로 gradient를 구할 수 있게 된다.
online actor-critic algorithm
1. policy에서 sample된 action a를 (s,a,s`,r)을 얻기 위해 사용하기.
2. V hat = r + 감마 V hat 으로서 업데이트 가능
3. 부터 5. 는 머 똑같다
근데 이러면 딱 바로 동작하지는 않는다.
왜그런지 알아보자.
몇몇 aca의 특성 에 대해서 생각해보자.
어떤 네트워크를 골라야 할지 고민해야 한다.
- value function
- policy function
두개를 추정하게 된다. 만약 이 상황에서 state가 너무 클 경우에는 파라미터 쉐어링도 가능하다.
실질적으로 ACA 실행하는법
online actor-critic algorithm을 사용하고 싶으면 병렬 처리를 해야 좋다. (batch 단위로 돌린다)
sync parallel actor-critic 이 있고 이거는 그냥 기존 방법과 같음
asynchronous parallel actor-critic 은 하나의 파라미터를 가지고 여러 워커가 동시에 상호작용하면서 그 하나의 파라미터를 업데이트 함.
파라미터 서버를 가지고 있고 워커들이 싹 업데이트 주기적으로 해주는 식.
액터크리틱의 좋은 점은 variance가 낮다는 것.
안좋은 점은 unbiased라는 것. (기존 크리틱이 완벽하지 않으니까 한쪽으로 편향되기가 쉽다.)
몬테카를로 방식은 bias(편향)되지 않았는데 높은 분산이라 그게 안좋다.
그래서 이걸 더 잘 수행하는 baseline을 그 아래에서 보인다.
baseline은 state에 의존할 수 있으며 그 기댓값은 0으로 수렴하게 하려는 것이 목표이다.
일단 우리는 b를 원하는 어떤 함수로든 대체할 수 있다.
그리고 우리가 value function으로 그것을 대체한다면 참 괜찮은 방법이 될 것이다.
아래의 기댓값은 편향되지도 않았고(sampling 하니까) V 함수를 도입하기 전 보다는 lower variance를 가지고 있다.(variance가 reward와 가깝기 때문)
아마도 위와 같이 예측한다면 괜찮겠지만 한군데에서 sampling된 리워드라 variance가 높다.
Q function 은 action , state value 다 입력받아 variance자체는 낮아지겠지만 action을 평가하려는 상황인데 저런식의 방법은 올바르지 않다.
근데 실제로 이 방법을 사용하기도 하는데 action 관련된 Q값 자체를 빼고 나서
나중에 뒤에서 action 관련된 Q function의 기댓값을 다시 더해준다.
근데 그 맨 아래에 대해서 뭐라뭐라 설명하는데 못알아듣겠어...
Q함수의 action은 control variants 라고 하나보다..
여태까지 critic 기반 추정기 montecarlo 기반 추정기에 대해 다뤗다.
(다만 몬테카를로 방식 또한 critic 을 baseline으로 쓰는 것)
그러나 우리가 고려할수있는건 둘다 쓰까무그면안대나?
우리가 어떤 파라미터를 도입해서 하나만 쓰는거 말고 어떤 비율로 해당 행위를 할 것인지 정할 수 있다.
직관적으로(intuition) 더 미래로 갈수록 variance가 커질것이다.
특히 single sample estimator일 수록.
그래서 중간까지만 sampling해놓고 거기에서 V 함수를 사용하는 것 또한 방법일 것이다.
(오;; 짱짱)
그래서 결국 n timestep까지만 열심히 sampling해 보고 그 이후는 예측을 토스하는게 좋을 것 같다.
그 n은 variance와 bias에 대한 기준에 달려있다.
혹은 우리가 걍 하나만 선택해야 되냐?
그래서 나온게 Generalized advantage estimation(GAE ㅋㅋ 오토인코더약자인줄) 이다.
우리가 할 수 있는거는 A_GAE라는 친구를 만든다.
그리고 n step estimator을 어떤 n에 대해서 1~무한대까지 싹 다 더한다음 weight에 따라 분배하는 것이다.
근데 이거를 시간에 따라 decay 하는 식으로 정책을 잡으면 variance도 잘 줄이구 scale도 잘 할 수 있어.
게다가 식을 정리 해 보면 이 decay 파라미터는 discount factor을 적용했던 actor critic시의 bootstrapped 식과 매우 유사한 것을 볼 수 있게 된다.
그럼 결국 우리가 예전에 봤었던 discount를 미래에 죽을거를 예상해서 머시기 저시기 했던 슬라이드의 그 option 1부분과 같이 된 것을 볼 수 있다.
예시
미로찾으면서 사과먹는거 예시
읽을거리