강화학습
오프-정책 , 중요도 샘플링
정지홍
2024. 12. 11. 10:26
목표 정책 target policy
- agent가 최종적으로 학습하고자 하는 정책.
- agent가 환경에서 최정의 행동을 결정하기 위해 사용하게 될 정책이다.
- 평가와 개선의 대상인 목표 정책
- 목적
- 목표정책을 agent가 장기적인 보상을 최대로 얻을수 있는 행동을 결정하는데 사용됨
- 학습이 완료되면 agent는 목표정책을 기반으로 행동함
- 쉽게 생각하면 목표 정책이 최종 학습 모델이고, 행동 정책은 학습을 위한 데이터를 어떻게 수집하는지에 대한것
| 특징 | 목표 정책 | 행동 정책 |
| 역할 | 최적의 행동을 학습하는데 초점 | 데이터 수집 및 환경 탐험 |
| 오프정책에서의 관계 | 목표 정책 != 행동 정책 | 행동 정책은 탐험에 초점 |
| 온 정책에서의 관계 | 목표 전책 = 행동 정책 | 학습과 행동이 동일한 정책에 기반 |
| 주요기능 | 최적 정책을 결정 | 다양한 데이터를 제공해서 학습을 지원 |
온-정책 on-policy
- agent가 학습에 사용하는 데이터가, 현재의 정책에 의해서 생성된 data와 일치하는 방식.
즉, agent는 자신의 현재 policy에 따라서 행동하고, 그 행동으로 얻은 data를 학습에 사용함. - 특징...
- 힉습정책과 행동 정책이 동일함.
- 수집된 데이터가 현재 정책에 기반하기 때문에, 정책 변화에 따른 data 갱신이 필요.
- 예시 알고리즘...
- SARSA( state - action - reward - state - action ): 탐험을 하면서도 학습 대상 정책을 동일하게 유지
- A2C( advantage actor-critic): 온정책 기반으로 정책과 가치 함수를 동시에 학습
- 장점
- 학습이 상대적으로 직관적이며 구현이 간단하다.
- 수렴이 안정적일 가능석이 높음
- 단점
- 새로운 데이터만 사용하니 효율성 감소
- 충분히 탐험하지 않으면 지역 최적해에 빠질수 있음.
오프-정책 off-policy
- agent가 행동정책( behavior policy)를 따르면서 수집한 데이터를 통해서, 다른 목표 정책을 학습하는 방식
- 특징
- 행동 정책과 학습 대상인 목표 정책이 다를 수 있음
- 학습 데이터가 기존에 수집된 경험이나, 다른 agent의 data를 포함할수있음
- 예시 알고리즘...
- Q-learning : 행동 정책은 탐험 위주로 설정하며, 학습은 목표 정책을 학습
- DQN : 신경망을 활용한 Q-learning의 확장
- 장점
- 목표 정책과 행동 정책을 분리하는 것이 가능. 이로 인해 다양한 데이터로부터 학습가능
- 경험 재사용이 가능
- 단점
- 학습 복잡 및 수렴 속도 느림
| 구분 | 온-정첵 | 오프-정책 |
| 행동 방식 | "내가 경험한것만 믿고 배운다" | "내 경험 + 다른 사람의 조언도 참고해서 배운다" |
| 데이터 활용 | 현재 정책으로 직접 수집한 데이터만 사용 | 과거 데이터 및 다른 정책에서 나온 데이터도 사용 |
| 효율성 | 새로운 경험이 필요하니 데이터 효율이 낮음 | 과거 데이터를 활용하니 데이터 효율이 높음 |
| 단점 | 데이터가 제한적이며, 학습 속도가 느림 | 내가 직접 경험하지 않은 데이터로 인해, 학습의 정확성이 감소할수있음 |
==>온정책은 대상정책과 행동정책을 거의 같게 보고, 오프정책은 서로 떼어내서 별개로 보는것
중요도 샘플링 importance sampling
- 다른 확률 분포에서 샘플링한 데이터를 가지고, 어떠한 확률 분포의 기대값을 계산하는 기법

- 이제 위의 식을 가지고 x가 다른 확률 분포에서 샘플링 되었다고 가정하자.
즉, pi가 아니라 b라는 확률 분포에서 샘플링 했다고 가정할거임...- 그러면 아래처럼 식이 유도된다.

- 위의 식을 통해서, 각각의 x값에 pi (x) / b (x)가 곱해짐을 볼 수 있다.
즉, 이를 가중치라고 생각할 수 있다.

- 아래는 그 예시이다.
import numpy as np
x = np.array( [1,2,3] ) # 확률 변수
pi = np.array( [0.1 , 0.1 , 0.8 ] ) # 확률 분포
e = np.sum( x*pi ) # 기대값을 계산
print(f'E_pi[x]의 값은 {e}입니다.')
# 몬테카를로 법으로 계산
n = 100
samples = []
for _ in range ( n ):
s = np.random.choice( x , p=pi )
samples.append(s)
mean = np.mean( samples )
var = np.var( samples )
print(f'몬테카를로법으로 구한 E_pi[x]의 기대값은 {mean}이며, 분산은 {var}입니다.')
# 중요도 샘플링 ,
# 확률분포 b를 사용해서 샘플링 함. 샘플링 대상은 b의 인덱스이다.
# 가중치 rho를 계산할떼, 샘플링한 인덱스를 사용함.
b = np.array( [1/3 , 1/3 , 1/3 ] ) # 확률 분포
n=100 # 샘플 갯수
samples = []
for _ in range( n ):
idx = np.arange( len(b) ) # b의 인덱스
i = np.random.choice ( idx , p=b ) # 0,1,2를 각각 1/3의 확률로 랜덤하게 하나 뽑는다.
s = x[i] # s는 확률 변수 값이다.
rho = pi[i] / b[i] # 가중치를 의미. 즉, 위의 E_pi의 확률 분포를 구하기 위함. rho는 식에 따라서 pi[i]/b[i]이다.
samples.append( rho * s ) # samples에 append해줌.
mean = np.mean( samples ) # b의 확률 분포를 이용하여, E_pi의 기대값을 구함.
var = np.var( samples ) # b의 확률 분포를 이용하여, E_pi의 분산을 구함.
print( f'pi(x)에서 직접 샘플링하기 어려운 관계로, b의 확률 분포를 이용한 중요도 샘플링 결과... 기대값은 {mean}이고 분산은 {var}입니다.')