독학 연구소
공부한 내용을 정리합니다.
함수 근사(Function Approximation)

배경

강화학습의 환경에는 크게 두 가지의 상태 공간으로 나눌 수 있습니다.

 

어떤 환경에서 0~20의 상태를 가진다고 하면 이를 이산적 상태 공간(discrete state space) 이라고 하며 모든 상태를 테이블에 기록할 수 있습니다.

 

하지만 실수 범위 내에서 연속적인 값을 가질 수도 있는데 이를 연속적인 상태 공간(continuous state space) 이라고 하며 상태의 개수가 무한히 혹은 무수히 많으면 테이블에 모든 상태를 기록할 수 없습니다.

 

이와 같은 문제를 해결하기 위해 다른 접근법이 필요합니다.

 

 

함수(Function)

다음과 같은 함수가 있습니다.

 

$f(x) = x + 3$

 

이 함수에 입력으로 1을 넣으면 4, 3을 넣으면 6을 출력합니다.

 

$f(1) = 4$

 

$f(3) = 6$

 

상태별 가치를 테이블에 기록한다고 보면 $s_1$ 의 가치는 4, $s_3$ 의 가치는 6이 기록되어 있는 것이라고 볼 수 있습니다.

 

 

이번에는 $a, b$ 변수를 가지는 함수가 있습니다.

 

$f(x) = ax + b$

 

 

이 함수에 $s_{10} = 20, s_{20} = 30$ 을 기록한다면 다음과 같이 $a, b$ 를 구할 수 있습니다.

 

$f(10) = 10a + b = 20$

 

$f(20) = 20a + b = 30$

 

$a=1, b=10$

 

 

$s_{20} = 30$ 을 $s_{20} = 40$ 로 수정하고 싶다면 $a, b$ 를 다음과 같이 업데이트하면 됩니다.

 

$f(10) = 10a + b = 20$


$f(20) = 20a + b = 40$

 

$a=2, b=0$

 

 

또한 입력으로 넣은 10, 20 외에는 모르는 상황이라고 가정해봅니다. 이런 상황에서도 함수에 30을 넣으면 60이라는 값이 나오게 될 것입니다. 즉 모르는 입력에 대해서도 값을 출력하는데 이것을 일반화(generalization) 이라고 합니다.

 

강화 학습의 관점에서 보면 가보지 않은 상태에 대해서도 어떤 일반화된 가치를 반환하는 것입니다. 가보지 않은 상태의 가치는 알 수 없는 테이블룩업 방식과 비교하면 굉장히 효율적인 방법론이라고 할 수 있습니다.

 

 

함수 근사(Function Approximation)

이러한 함수의 개념을 이용해서 실제 가치 함수에 근사하고자 하는 것입니다.

 

다음과 같이 빨간색으로 표시된 함수에 상태 $s$ 를 넣으면 가치 함수 $\hat v(s,w)$ 를 출력하거나 행동 가치 함수 $\hat q(s,a,w)$ 를 출력하게 한다는 것입니다.

 

 

그리고 이 추정된 가치 함수는 실제 가치 함수에 근사한 것입니다.

 

$\hat v(s, w) \approx v_\pi(s)$


$\hat q(s, a, w) \approx q_\pi(s,a)$

 

또한 $w$ 는 함수의 파라미터이며 학습해야할 대상으로 추정된 가치 함수와 실제 가치 함수의 오차를 최소화하기 위해서는 최적의 파라미터를 구해야할 것입니다.

 

어떤 방법으로 최적의 파라미터를 구할 수 있을까요?

 

대표적인 function approximator 로는 신경망(neural network)이 있으며 경사 하강법을 통해 파라미터를 업데이트하는 과정을 알아보겠습니다.

 

 

경사 하강법(Gradient Descent)

신경망을 학습하는 것은 목적 함수를 최소로 하는 방향으로 파라미터를 업데이트하는 것이라고 할 수 있습니다.

 

먼저 목적 함수를 정의해야 합니다.

 

실제 가치 $v_\pi(S)$ 와 추정 가치 $\hat v(S, w)$ 의 차이로 나타낼 수 있습니다.

 

$J(w) = \mathbb{E}_\pi[(v_\pi(S) - \hat v(S, w))^2]$

 

신경망에는 파라미터 벡터 $w_1, w_2, \dots$ 가 있으며 각 파라미터가 $J(w)$ 에 대한 기여율을 알아보기 위해 편미분을 합니다.

 

$\nabla_wJ(w) = ({\partial J(w) \over \partial w_1}, {\partial J(w) \over \partial w_2}, \cdots, {\partial J(w) \over \partial w_n})$

 

각 파라미터에 대해 편미분하여 벡터로 나타낸 것이고 이를 각 파라미터에 대한 그래디언트(gradient) 라고 합니다.

 

이 그래디언트를 조금씩 업데이트하기 위해 learning rate 혹은 step size 라고 하는 작은 상수 $\alpha$ 를 곱하여 업데이트의 변화를 조절하며 각 파라미터에 대해 계산해보면 다음과 같습니다.

 

$w'_1 = w_1 - a * {\partial J(w) \over \partial w_1}$

 

$w'_2 = w_2 - a * {\partial J(w) \over \partial w_2}$

 

$\dots$

 

$w'_n = w_n - a * {\partial J(w) \over \partial w_n}$

 

이를 하나의 식으로 나타내면 다음과 같습니다.

 

$w' = w - a * \nabla_w J(w)$

 

이처럼 그라디언트를 계산해 파라미터를 업데이트하여 목적 함수를 최소화하는 과정을 경사 하강법이라고 합니다.

 

텐서플로(TensorFlow)파이토치(PyTorch) 같은 자동 미분 라이브러리를 이용하면 이러한 계산 과정은 옵티마이저(optimizer)를 통해 자동으로 계산되어 업데이트됩니다.

 

 

'머신러닝 > 강화학습' 카테고리의 다른 글

DQN(Deep Q-Networks) (2)  (0) 2020.11.24
DQN(Deep Q-Networks) (1)  (0) 2020.11.20
Model-Free Control  (0) 2020.11.13
소프트맥스 회귀(Softmax Regression) (2)  (0) 2020.11.12
Model-Free Prediction  (0) 2020.11.09
  Comments,     Trackbacks