본문 바로가기

Programming Project/cs285 (cs294-112)

CS 285 강의 노트 Lecture 5 (at UC Berkeley) (also cs294-112)


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

대충 오늘 배울 내용

Policy gradient 알고리즘은 강화학습을 학습하기 위해서 gradient ascent / descent 를 진행하는 방법에 대한 것이다.

 

저번주엔 reinforcement learning을 위한 object function을 만드는 방법에 대해 다뤄보았다.

 

partially observed 된 정책함수 $\pi _{\theta}$는 추후 다뤄보자. (지금은 fully observed만 다뤄보자)

 

이 $\pi _{\theta}$ 에는 state가 input으로 들어가고, action이 output으로 나온다.

 

state는 unknown transition distribution으로부터 나오게 된다. (저 위의 globe 를 transition distribution으로 생각하면 될 것 같다)

 

이 수식들은 수학적으로 표현될 수 있다 $p_{\theta}(\tau)$ = p(s_1)파이(파이_세타(a_t | s_t) * p(s_t+1|s_t,a_t))

 

세타에 의한 궤적 확률은 시작확률 * policy로 발생하는 action에 대해 전이 확률들의 누적 곱이다.

 

그리고 이 모든것은 아직 알지 못한다.

 

최적의

세타* = arg max_세타 E_궤적 [리워드의 총합]

결국 가능한 궤적 케이스에 대한 리워드들의 총합으로 표현 된다.

 

induce : 유도하다

어케하면 궤적의 분포에서 리워드를 최대화 할 지 생각 해 보자.

 

어떻게 이 주제를 평가할까?

아무런 근거가 없는데 (전이확률이나 올바른 policy도 모르는데)

 

그래서 오늘 저 기댓값을 추정하는 방법에 대해서 배운다.

 

기댓값이 취해지는 곳의 분포로부터 sample들을 만들어서 그 sample들을 average해주면 될 것 같다.

그 분포는 p_세타(tau)일 것이고 그 sample을 취하는 방법은 policy를 real world에서 acting 하게 함으로써 얻을 수 있게 된다.

 

예를 들어 차 운전을 50번 하게 하고 그 후 리워드를 평균내면 구할 수 있다.

(참고 : 몬테카를로 기법 / 우연 현상에 대한 통계 이용법. 난수() 랜덤(random) 실험을 통하여 수학적인 문제의 근삿값을 얻는 방법으로, 몬테카를로의 카지노에서 행하여지는 도박의 승패 확률 계산에서 유래하였다.)

 

저 식의 아랫첨자 i는 indeices over the samples 이다. 1~N까지로 sum 된다.

 

 

 

 

daunting : 벅찬, 주늑이 들게 하는

 

이제 이 목적함수를 최대화 해 보자.

우리가 maximize나 minimize하고싶은 어떤 것이 있다면 그것을 위해서 최대한 노력하는 방향으로 gradient step을 할 수 있기 때문에 쵝오야.

 

 notation의 편의를 위해서 r(tau)로 (두번째줄) 간소화 했다.

**슬라이드에서 혼용하는데, p_세타(tau) 는 파이_세타(tau)와 같은 것이다.

 

그런 후에 expectation을 오른쪽 인테그랄 처럼 쓸 수 있다. 모든 경로에 대한 행동확률 * 리워드의 형태로.

 

이제 이것을 미분하고 자 한다면, 우리는 파란색 밑줄 있는 저 인테그랄 식 처럼 식을 변형할 수 있게 된다.

 

그치만 파이_세타(tau)는 알지 못하는 초기 상태의 분포와 알지 못하는 전이 분포를 모두 포함하고 있는 식이기 때문.

 

(또한 tau에 대해서 적분을 해야 하는데 모든 tau에 대해서 적분하는 것이 불가능 하다.)

 

우리는 이 문제를 해결하기 위해서 파란 박스 안의 식을 이용한다.

 

log(f(x)) 미분은 f(x)미분 / f(x) 이기 때문이다.

 

이를 통해 노란 줄 쳐진 인테그랄 식으로 식을 변형하게 되면, 이 왼쪽에 파이_세타(tau)가 곱해져 있기 때문에 기댓값으로 표현할 수 있어지기 때문이다.

 

(E(f(x))는 sum ( p(x)f(x) ) 이기 때문.)

 

이를 통해 tau가 나오는 기댓값으로 식이 정리가 되는 모습을 볼 수 있다.

 

 

 

 

log pi의 gradient가 무엇인지 아직 모르기 때문에 조금 더 식을 전개해야 한다.

오른쪽 위의 식이 파이_세타(tau)가 무엇과 같은지에 대한 식이다.

 

이걸 양변에 log를 취하면 sum으로 표현이 가능하다.

저 오른쪽 세 terms로 결국 표현이 된다.

log(초기 분포 확률), log(변이 확률), log(정책 확률)

 

이제 초록 밑줄이 서로 같은거니까 왼쪽에 대입해보면 우리는 저 gradient가 실질적으로 궁금한 것이기 때문에 미분까지 적용 해 줘 보자.

sum이니까 gradient를 sum 안에 분배해줄 수 있다.

세타에 대한 미분인데 그렇기 때문에 log p(s_1) 이나 log p (s_t+1 | s_t, a_t) 는 사라진다.

 

그럼 가운데 남은거만 미분 해 보자.

(저 sum 둘이 괄호로 묶일 수 있는 것은 애초에 괄호로 묶인 상태였기 때문이다. 어떤 경로 한개가 주어졌을 때 리워드 따로, 그 경로가 나올 확률 따로 이기 때문; 순간 갑자기 괄호 나와서 헷갈려서 적어봤읍니다)

 

이제 이전과 같이 어떠한 policy를 가지고 sample 한 친구들을 가지고 열심히 기댓값을 때려맞춰보자.

 

 

 

 

 

 

 

 

recall 부분을 보자.

J(세타)도 정확히 계산이 안되기 때문에 r(s_i,t , a_i,t) 를 N번 sample해서 평균을 내는 것으로 그 값을 추정했다.

 

마찬가지로 저 J(세타)를 미분한 부분도  기댓값으로 표현해놓았기 때문에 N번 샘플하여 평균을 내면 그 결과를 구할 수 있을 것이다.

 

N은 좀 크게 잡으라고 한다.

 

 

Reinforce 알고리즘은 결국

1. sample {tau i}(set of trajectories) from 파이_세타(a_t|s_t) / 그니까 policy를 동작시켜서 나온 어떤 순간의 state를 샘플 한다.

2. J(세타)의 세타에 대한 미분은 아까 도출한 식의 sum의 평균과 같으므로 (state i를 t때 만났을 때 action i를 t때 뽑는 것에 대해 gradient descent를 n번 한거의 평균)*(리워드) 의 평균으로 조져준다.

3. 업데이트

 

동작 잘 하지 않는 이유 : 분산이 넘 커서

 

 

 

grad log(파이(a|s)) 이게 뭘까?

뉴럴넷 그림 같은 느낌일것이다.

 

 

 

 

supervised learning은 maximum likelihood를 사용하여 학습 시킬 것.

-> 좋은 샘플은 증가, 나쁜 샘플은 감소.

 

 

 

이 연속적인 action을 생각 해 보자.

policy gradient를 통해서 저 시뮬레이팅 하는 로봇을 학습시킨다고 생각 했을 때, 이 행동은 continuous action이다. (not discrete 하다) 그렇기 때문에 우리는 파이_세타(a|s)를 통해 연속적인 값에서 어떤 분포를 찾아내야 한다. 

multivariate normal distribution 도 많이 사용한다. ( 참고 : https://blog.naver.com/sw4r/221378314681 )

 

어... 음

그리고 그 아래는 좀 놓쳤다.

 

저걸 샘플링 할 때 가우시안 distribution을 쓴다는 건가?

그리고 오토인코더처럼 평균 분산을 네트워크에서 구하는거고?

 

 

이것은 수학적인 부분이고, 직관적으로 무슨 일이 벌어지고 있는지에 대해서 생각 해 보자.

결과적으로 저 수식들을 통해서 어떤 식으로 policy가 변하는 것인지 함 보자.

 

위 식이 우리 정택 gradient이고 이 식을 보면

저 미분 식이 의미하는 것은 더 좋은 것을 더 자주하도록, 나쁜 것을 더 조금 하도록 하고 있다는 것을 알 수 있다.

 

간단하게 trial and error 개념이라고 말할 수 있다.

 

 

 

 

 

 

이제 다시 부분만 볼 수 있는 곳으로 돌아오자.

policy gradient도 여기서 적용할 수 있을까?

마르코프 특성은 실제로 사용 되지는 않는다.

그치만 정책 자체는 state 자체를 observation으로 변경함으로써 해결되기는 한다.

 

 

allude : 암시하다, 시사하다

왜 아까 policy gradient가 그 자체만으로는 잘 동작하지 않는다고 했었는지에 대해서 설명 하겠다.

우리가 가우시안으로부터 추출되는 정책을 가지고 있다고 하자.

그러면 어떤 샘플들로부터 reward가 어떻게 나오느냐에 따라서 ;

 

머 여튼 분산이 존내 커서 (다양한 값이 나올 가능성이 존내 커서) 그 solution이 이상적이지 않게 수렴할 것이라는 말.

 

 

대충 리뷰한다는 내용

RL 목적 함수에 대한 평가

-> 샘플들을 생성해서.

 

Policy gradient에 대한 평가

-> log-gradient 트릭 후

-> 샘플들을 생성해서

 

Policy gradient에 대한 이해

-> trial - and - error을 통한 형태

 

Partial observability

-> state->observation으로 변경해놓고 걍 돌리면 됨.

 

Policy gradient에 무슨 문제가...?

 

 

 

이제 그 문제를 해결 해 보자.

variance를 줄이는 방법과 policy gradient에 관하여 얘기 해 보자.

 

처음 분산을 줄이기 위해사 사용하는 방법은 과거가 미래에 영향을 미치지만 미래는 과거에 영향을 미치지 않는다는 것이다. (causality를 보자)

그래서 우리는 과거의 리워드가 아니라 지금과 미래의 리워드만을 사용 할 것이다.

 

이게 분산을 줄여주는 이유는 리워드 자체가 줄어들기 때문에 분산이 줄어든다.

 

이제 reward를 위한 새로운 파라미터 t`을 도입해도 상관없다. 왜냐하면 저 괄호 안의 친구들이 원 식에서 서로 독립적으로 계산되기 때문이다.

이 위의 식은 log_파이 들의 합으로 표현될 수 있게 된다.이제 t=1~T까지 움직이는 이 식이랑 t`=1~T까지로 나눴다.

 

이제 리워드 타임의 t`를 바꿔본다. reward에 대한 t`=1에서 t`=t로. 왜냐하면 시간 t일 때 하는 action은 시간 1~t-1까지의 reward와는 전혀 무관하기 때문이다. 이는 여전히 policy gradient를 위한 unbiased 된 측정기라고 생각할 수 있게 된다.

그러면 이제 더 작은 리워드 숫자들을 통해서 분산이 생겨서 도움이 된다.

 

 

이제 이 부분을 Q hat _i,t 라고 줄여서 부르도록 하자. 미래의 리워드 함수이다.

 

그럼 이런 식이 되겠지.

 

 

또한 두번째 도와주는 트릭 baselines가 있다.

 

좋은건 더 하고 나쁜건 덜 한다. 라는 거지만 사실 좋은거는 100만1 나쁜거는 99만9999 일 경우를 생각 해 보자.

 

이거는 좋은거와 나쁜거의 구분이 잘 안된다.

 

그래서 리워드에 평균을 뺀 것을 이용해부리자.

다만, 그게 가능한가? 수학적으로 맞나?

가능하다.

세번째 줄 전개되는걸 쭉 보자.

 

새로 만든 term을 수식적으로 전개해보자. (b가 포함된 식)

이걸 인테그랄로 바꾸고 싹 싹 오른쪽으로 바꿔나가면 결국 0이 되는걸 볼 수 있다.

 

(ㅎㅎ 근데 그냥 값에서 constant 뺀거니 사실상 미분해도 영향이 없는게 당연)

 

 

결론

 

 

gradient는 바꾸지 않지만 variance는 바꾼다 !

 

식 전개 읽으삼.

 

(직관적으로, 제곱의 평균 빼기 평균의 제곱인데, 평균이 100만이면 100만1과 99만9999의 제곱의 차이가 -1과 1의 제곱의 차이보다 크잖!)

 

이론적으로 분산을 최소화하는 baseline은 맨 아래의 b이다.

그러나 average 도 just fine하다.

 

 

policy gradient가 분산이 높은 이유

+ 등등 배웠다.

 

 

 

남은 강의 동안에는 policy gradient가 어떻게 on-policy가 되는지에 대해 다룰 것이며 이것에 대해 무엇을 할 수 있는지 다룰 것이다.

 

on - policy : policy가 변경되면 더이상 예전의 샘플들을 사용할 수 없는 경우를 말한다. gradient update가 진행되고 나면 새로운 샘플링을 해야 함.

 

왜냐면 policy gradient가 세타에 의조나는 Expation of tau 로 부터 나온 것이기 때문이다.

 

reinforce algorithm은 step 1에서 샘플링을 하는데 이걸 건너 뛸 수가 없게 되는 것.

(그렇게 되면 expensive 한 sample들은 학습 시키는데에 답이 없게 된다.)

 

이때 우리가 할 수 있는 것이 있다.

 

우리는 policy gradient 를 어떤 off policy 알고리즘에 끼워넣을 수 있다.

(강사님은 이걸 textbook policy 라고 부른다고 한다)

 

실제로는 우리는 policy가 어떤지에 대해서 논할 수 있지만 원칙적으로 이것은 off-policy 이다.

우리는 이것을 중요한 sampling을 통해 할 것이다.

 

우리가 samples from 파이_세타(tau)가 없다면 어떻게 할까?

-> 다른 policy의 sample을 가져온다. 

(오른쪽 초록 사각형) q(x)를 통해서 p(x)에 디펜던트 되어있던 식을 q(x)에 디펜던트 되게 바꿨다.

이 스킬을 이용하면 J(세타) = 새로운 파이bar을 사용해서 만든 새로운 식이 된다

unpack해 보자. (아랫줄)

그리고 이것 저것 지워보며는, 결국 맨 마지막 식이 된다.

 

 

numerator : 분자 , denominator : 분모 , fraction : 분수

 

우리는 하나의 유도를 강의 시작 부분에 다뤘고, 이제 중요한 샘플링을 다루는  약간 다른 유도를 보여줄 것이다.

일단 우리의 목적 value를 가지고, 새로운 파라미터 세타`를 통해 표현 해 볼 것이다.

J(세타`) = ~~~~ 의 식이 좋은게, 새로운 세타`은 기댓값 안의 분자에만 영향을 끼치고 tau를 샘플링 하는 쪽이라던지 분모에는 영향을 끼치지 않는다. 미분하며는 그 아랫줄의 오른쪽이 되고, 만약 지역적으로 세타 = 세타`같은 곳이 있다면 결국 우리는 예전 우리가 봤던 그 식으로 돌아올 수 있으며 이론적으로는 off policy 된 상태가 된다.

 

 

 

 

 

그치만 당연히 세타와 세타`가 다를 경우에는 다시 다뤄야 겠다.

그리고 실질적인 off-policy policy gradient를 이뤄내야 한다.

 

밑에서 두번 째 줄 식을 보면, 다를 경우의 식을 쭉 전개 한 것이고 이렇게 진행하는게 잘못 된 이유가 뭘까?

T가 클 경우에는 저 확률 곱하는 첫 항이 엄청 커지거나 엄청 작아질 수 있기 때문이다.

 

여기에 더해서 인과관계를 통한 트릭(t` = t 부터 시작하게 하는 것)을 사용할 수 있는데 이래도 근본적인 문제는 벗어나지 못한다. (X표 친 부분의 식이 추가돼서 오히려 더욱 ;;)

 

그렇다면 그냥 저 맨 오른쪽 확률 곱하는 부분을 1로 만들어 버리면.. 동작 자체는 더 잘 할 것이다. 다른 이유로 다른 목적함수를 최적화 하는 것이긴 하겠지만. 이걸 통해서는 policy iteration algorithm을 얻는 것이다. (강의 후반에 다룬다)

여튼 저 세팅을 통하면 다른 목적함수이기는 하지만 policy 를 improve 하는 상황이라는 것 자체는 의심의 여지가 없다.

 

그럼 아직 해결 안된 저 가운데 부분을 보자.

 

우리가 할 수 있는 것은

first-order approximation이다.

 

추후에 왜 이렇게 불리는지는 알려 주겠지만 일단은 실행하려면 아이디어는 알아야 하니 무엇인지부터 알려 주겠다.

 

objective를 조금 다르게 써 보자.

 

on-policy policy gradient의 식을 보자.

이전에 Q hat 으로 표현했었던 리워드 표현 함수 Q를 추정하는 이 친구는 (s_i,t , a_i,t)를 state action marginal(정책함수)에서 뽑은게 필요했었다.

(주변 확률 분포(marginal distribution)설명 링크 https://presidentlee.tistory.com/entry/marginal-probability-distribution%EC%A3%BC%EB%B3%80%ED%99%95%EB%A5%A0%EB%B6%84%ED%8F%AC 쉽게 말해 싹 다 합한거)

 

이를 봤을 떄, 그 아래 세타`에 대한 목적함수는 새로운 파이 세타`에 관한 식이 필요하다.

그렇게 state , action term을 조건부 확률로 일단 바꿔주고, 앞쪽을 무시해버린(!!!!)다. 세타`이 세타와 비슷하다면 1이라는 게 그 이유;;

근데 실제로 거의 비슷해서 그 영향은 미비하고, 이걸 무시하지 않는 연구를 6년전에 했다가 교수가 피봤다고 ;; ㅋㅋㅋ

 

(이 짓을 지금 진행하고 있는 이유가 과거의 샘플들도 갖다 쓰고 싶기 때문이다)

 

 

저 밑줄 부분을 전부 grad log(파이~) 다 계산하고 sum을 계산하는 과정은 굉장히 느리고 비효율적이기 때문에 standard automatic 미분 패키지에서 편리하게 실행할 수 있는 방법이 있다.

 

우리는 우리의 자동 미분 소프트웨어 안에서 그 그래프의 gradient가 policy gradient인 그래프를 만들 것이다.

올바른 강화학습 목표함수는 enviornment와 상호작용 해야 하기 때문에 그 그래프 자체는 올바른 강화학습 목표함수가 아니겠지만 우리는 그 gradient가 올바른 gradient가 되도록 설계 할 것이다.

 

그를 위해서 우리는 maximum likelihood 수식을 살펴 봐야 한다.

위의 maximum likelihood 수식을 실행하는 것을 통해 policy gradient를 실행하는 것으로 변형시켜야 한다.

 

weighted maximum likelihood같은 pseudo-loss를 구현.

 - cross entropy(discrete (이산적인 액션에 대해))

 - squared error(gaussian (연속적인?))

 

수도 코드로 확실하게 알아보자.

 

 

오리지날 maximum likelihood

 

 

 

이제 식의 Q function을 위 줄과 같이 잘 작성해서 곱하면 된다. (리워드 역할)

(baseline 트릭을 추가하고 싶다면 q_values 에다가 빼면 된다)

 

 

 

 

분산 존내 높다. batch 높게 잡아라.

adam 이 ok 아마 도~

 

 

 

대충 리뷰한다는 내용.