강화학습

[강화학습] 살사, 큐러닝

APinCan 2020. 1. 18. 15:43

몬테카를로 예측

다이내믹 프로그래밍 --> 강화학습 넘어가는 아이디어를 제공

에피소드를 진행하고 받은 실제 반환값을 구해 이 반환값들로 각 상태의 가치함수 업데이트

가치함수 업데이트 위해 하나의 에피소드를 다 진행해야 함

다이내믹 프로그래밍은 상태와 차원이 증가할수록 계산복잡도가 증가

계산을 통한 가치함수 업데이트가 아닌 에이전트의 경험으로 참 가치함수를 업데이트 하자!

몬테카를로 예측은 원래 값 모르지만 샘플을 통해 원래의 값을 추정하는 것

 

정책 이터레이션의 정책 평가를 몬테카를로 근사로 가치함수 추정, 가치함수를 추정할 때 에이전트가 한번의 에피소드를 진행한게 샘플링

샘플링으로 얻은 샘플링 평균으로 참 가치함수 추정, 이 때 몬테카를로 근사를 사용하므로 몬테카를로 예측이라 부름

 

가치함수는 이렇게 생겼었음

반환값에 대한 기대값으로 정의 가능

기대값을 계산 가능한 형태로 바꾸면 다음 두식과 같아짐

원래는 마지막 가치함수 식을 반복 계산해 상태의 참 가치함수를 알아낼 수 있는데 현재 환경에 해당하는 P값과 R값을 모르는 상태

샘플링 통해 기대값 E를 계산하지 않고 샘플들의 평균으로 참 가치함수를 예측

 

에이전트가 현재 정책의 에피소드 진행하면 에피소드가 지나친 상태마다 반환값이 존재, 이 반환값들의 평균으로 가치함수를 추정, 현재 정책에서 많은 에피소드를 진행하면 충분한 반환값이 모여 평균내면 꽤 정확한 가치함수 얻음

이전 가치함수(이전까지의 모든 반환값의 합)에 새로운 반환값 Gn을 더하면 새로운 가치함수가 나온다, 이 식을 쭉 정리하면

원래의 가치함수 V(s)를 업데이트하는 새로운 식이 나옴

여기서 G(s) - V(s)는 오차, 1/n은 step size로 이 식을 일반화하면

G(s)는 가치함수의 업데이트목표 즉 G(s)에 도달 해야함, (G(s) - V(s)) = 한번에 업데이트하는 업데이트 크기, 가치함수가 업데이트될 수록 참 가치함수에  수렴하게 됨

 

 

시간차 예측

몬테카를로는 가치함수 업데이트 위해 에피소드 끝날때까지 기다림, 시간차 예측에서는 에피소드가 아닌 타임스텝마다 가치함수 업데이트

State에 t를 붙여 타임스텝임을 명시

다이내믹 프로그래밍처럼 기대값을 계산하지 않고 R+V(s')값을 샘플링해 현재 가치함수 업데이트, 몬테카를로와 달리 한번에 하나의 가치함수만 업데이트

현재 상태에서 행동을 하나 선택해 환경에서 보상 R받고 다음 상태 t+1을 알게 됨

시간차 예측에서 가치함수의 업데이트 식, 여기서 업데이트의 목표는 G(s)의 위치에 있던 R+V(s')

여기서 R+V(s') - V(s)는 시간차 에러, 시간차 예측의 업데이트 목표는 반환값(G)와는 다르게 실제 값은 아님, 에이전트는 이 값을 S'의 가치함수라 예측(업데이트 목표가 뭔지 모르는 상태에서 가치함수 업데이트하는 것)

에피소드 끝날 때까지 기다릴 필요 없이 바로 가치함수 업데이트, 에이전트는 현재 상태에서 행동 한번하고 다음 상태를 알게되면 바로 이전 상태의 가치함수를 업데이트하는 방식

 

 

SARSA(살사)

정책 이터레이션과 가치 이터레이션이 살사로 발전

정책 이터레이션은 정책 평가로 현재 정책에 대한 참 가치함수를 구하고 정책발전을 통해 더 좋은 정책으로 발전

시간차 예측방법은 가치함수를 현재 상태에 대해서만 업데이트하고 모든 상태의 정책을 발전시키는게 불가능 --> 가치 이터레이션을 사용해 모든 상태의 정책 발전시킴

가치 이터레이션은 정책 없이 가장 큰 가치를 갖는 행동을 선택했음(탐욕 정책 발전)

 

여기서 사용할 것은 시간차 제어,  시간차 제어는 시간차 예측과 탐욕 정책으로 이루어짐

탐욕정책 발전에서는 현재 정책을 발전시키기 위해 아래와 같은 식을 사용

문제는 환경의 P를 모름

근데 현재 상태의 큐함수를 보고 판단하면 환경을 몰라도 됨, 그래서 큐함수를 사용한 정책을 다음과 같이 표현

큐함수를 사용했으니 에이전트는 가치함수가 아닌 큐함수 정보를 알아야함, 시간차 제어 업데이트하는 것은 가치함수가 아닌 큐함수가 됨 식을 이렇게 쓸 수 있음

시간차 제어에서 큐함수를 업데이트하려면 몬테카를로 예측처럼 샘플이 필요, 이때 샘플로 현재 상태/행동, 그 때의 보상, 다음 상태/행동을 사용 5개로 이루어진 샘플로 큐함수 업데이트 

이 샘플을 보고 바로 SARSA [S, A, R, S', A']라 부름

큐함수를 토대로 샘플들을 탐욕정책으로 모아 샘플을 방문한 큐함수를 차례로 업데이트

 

탐욕 정책의 단점) 학습 초기의 에이전트에게 탐욕 정책은 잘못된 학습으로 갈 가능성이 큼, 에이전트가 더 탐험하게  할 방법이 필요, 탐욕 정책의 대안으로 입실론-탐욕정책나옴, 입실론만큼의 확률로 탐욕적이지 않은 행동 선택(엉뚱한(?) 행동 선택)

 

살사는 최종적으로 시간차 예측과 입실론-탐욕 정책을 사용

정책 평가 --> 탐욕 정책 발전을 하는 정책 이터레이션과 비교해 살사는 시간차 예측 --> 입실론-탐욕 정책을 사용

시간차 예측 : 가치함수에 대한 정책평가를 큐함수를 이용한 시간차 예측으로

입실론 탐욕 정책 : 일반 탐욕 정책에서 입실론 탐욕 정책으로 발전

 

 

큐러닝

살사에는 한계가 존재하는데, 입실론-탐욕정책에 따라 현재 상태에서 다음 상태 s'으로 가고 거기서 다시 입실론-탐욕정책에 의해 탐험을 해 보상이 마이너스가 되는 행동 a'을 했을 때

결과적으로 상태 s, 행동 a에서의 큐함수 값은 낮아짐, 즉 이 행동을 안하는게 좋겠다고 판단을 해 에이전트가 더이상 진행하지 못하고 갖혀버릴 수 있음

 

살사는 온폴리시 시간차 제어(자신이 행동한 대로 학습하는 시간차 제어 방식)이기 때문에 입실론-탐욕정책으로 잘못된 학습을 하게 됨, 살사는 정책 없이 현재 큐함수에 따라 행동을 선택함

하지만 탐욕 정책과 다른 것을  선택하는 탐험은 반드시 필요하기 때문에 오프폴리시 시간차 제어를 사용

오프폴리시는 현재 행동을 하는 정책과 학습하는 정책을 따로 분리시켜 독립적으로 학습하는 방식

 

에이전트가 현재 상태 s에서 행동 a 선택, 다음상태 s'을 알게 되면 그 상태에서 가장 큰 큐함수를 현재 큐함수를 업데이트하는데 사용 <-- 이게 큐러닝

즉, 다음 상태에서 어떤 행동을 했는지에 상관없이 현재 상태의 큐함수 업데이트할 때 다음 상태의 최대 큐함수를 이용

현재 상태 큐함수 업데이트 위해 필요한 샘플은 [s, a, r, s']

큐함수에 대한 벨만 최적 방정식으로 표현, 기대값 E를 빼면 위의 식과 동일

 

 

몬테카를로 예측, 반환값 이용

시간차 예측, 벨만 기대 방정식 이용

살사는 큐함수 업데이트 위해 벨만 기대 방정식 사용, 시간차 제어에서 하나의 샘플로 (s,a,r,s',a')이용

큐러닝은 큐함수 업데이트 위해 벨만 최적 방정식 사용, 큐함수 업데이트에 벨만 최적 방정식 사용

 

 

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

http://www.yes24.com/Product/goods/44136413