독학 연구소
공부한 내용을 정리합니다.
머신러닝/강화학습 (16)
Model-Free Prediction

모델-프리(Model-Free)

동적 프로그래밍(Dynamic Programming, DP)은 MDP 모델을 아는 상황에서의 계획입니다. 이와 반대로 보상 함수와 전이 확률과 같은 정보를 모르는 상황을 model-free 라고 하며 이는 경험(experience)을 통해야하며 에이전트와 환경의 상호작용을 통해 학습해야 하는 것입니다.

 

이러한 model-free 에서 정책 평가(policy evaluation) 혹은 예측(prediction) 방법으로는 몬테카를로 예측(MC prediction)과 시간차 예측(TD prediction)이 있습니다. 또한 여기서는 다루는 정책은 고정된 임의의 정책 $\pi$ 이라고 가정합니다.

 

 

몬테카를로 방법(Monte Carlo Method)

무작위로 샘플링을 반복하면 실제값에 근사한다는 방법론으로 계산하려는 값이 닫힌 형식으로 표현되지 않거나 복잡한 경우에 근사적으로 계산할 때 사용합니다. 몬테카를로 방법은 샘플이 많을 수록 대수의 법칙(law of large numbers)에 의해 실제 가치에 더 가까워진다는 것입니다.

 

아래 예제는 100번 던진 주사위와 1000번 던진 주사위의 차이를 보여줍니다.

import matplotlib.pyplot as plt
import numpy as np

dice = [1,2,3,4,5,6]

def roll_dice():
    return np.random.choice(dice)

num_episode = 100
r = [roll_dice() for _ in range(num_episode)]
r = np.unique(r, return_counts=True)[1]
plt.bar(dice, r)
plt.title(str(num_episode) + ' episode')
plt.show()

num_episode = 1000
r = [roll_dice() for _ in range(num_episode)]
r = np.unique(r, return_counts=True)[1]
plt.bar(dice, r, color='red')
plt.title(str(num_episode) + ' episode')
plt.show()

 

 

MC 예측(Monte Carlo Prediction)

MC 예측은 샘플 리턴의 평균값을 기반으로 가치 함수를 추정하는 것을 말합니다.

 

상태 가치 함수의 정의는 다음과 같습니다.

 

$v_\pi(s) \doteq \mathbb{E}_\pi[G_t|S_t=s]$

 

상태 $s$ 의 가치는 리턴의 기대값입니다. 따라서 $G_t$ 를 계속 샘플링하면 그 평균은 $v_\pi(s)$ 의 기댓값인 실제 가치(true value)에 수렴하게 된다는 것을 의미합니다. 이를 $G_t$ 는 $v_\pi(s)$ 의 불평 추정량(unbiased estimate)이라고 합니다.

 

각 상태에 대한 리턴을 구하면 다음과 같습니다.

 

 

각 상태마다 이러한 리턴 샘플을 모아서 평균을 구하면 각 상태의 가치는 실제 가치에 근사한다는 것입니다.

 

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

 

$v_\pi(s)={1 \over N} \displaystyle \sum_{i=1}^{N} G_i(s)$ 

 

여기서 문제는 1000번의 에피소드를 진행한다면 에피소드가 1000번 진행 후에 계산될 것이며 이는 매우 비효율적일 것입니다.

 

위의 식과 본질적으로 같으며 한 에피소드가 끝날 때마다 업데이트할 수 있는 식은 다음과 같습니다.

 

$V(S_t) \leftarrow (1-\alpha) * V(S_t) + \alpha * G_t$

 

$\alpha$ 의 값을 기준으로 기존의 값과 새로운 값을 섞어주는 것입니다. $\alpha$ 값을 작게 한다면 기존의 값을 크게 새로운 값을 작게하여 변화에 천천히 적용하는 것이라고 할 수 있습니다. 

 

위 식을 정리하면 다음과 같습니다.

 

$V(S_t) \leftarrow V(S_t) + \alpha(G_t - V(S_t))$

 

 

또한 이러한 업데이트 방식을 샘플 업데이트(sample update)라고 합니다. 이는 샘플을 기반으로 한 것으로 DP 의 기댓값 업데이트(expected update)와는 다른 것입니다

 

 

구현

MC prediction 을 구현합니다.

# mc prediction(policy evaluation)

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import gym

env = gym.make('FrozenLake-v0', is_slippery=False)

gamma = 0.99
alpha = 0.1

v_table = np.zeros(env.observation_space.n)

num_episode = 10000
for i in range(num_episode):
    memory = []
    
    state = env.reset()
    done = False
    while not done:
        action = env.action_space.sample()
        next_state, reward, done, _ = env.step(action)
        memory.append((state, reward))
        state = next_state
    
    g = 0
    for s, r in reversed(memory):
        g = r + gamma*g
        v_table[s] = v_table[s] + alpha*(g-v_table[s])
        
# print(v_table.reshape(4,4))

sns.heatmap(np.around(v_table.reshape(4, 4), 3), annot=True)
plt.title('MC Prediction', fontsize=18)
plt.show()

 

 

시간차 방법(Temporal Difference Method)

MC 는 단점이 있는데 에피소드가 끝날 때까지 기다려야 한다는 점입니다. 업데이트하기 위해서는 리턴이 필요한데 리턴은 에피소드가 끝나기 전까지는 알 수 없습니다. 즉 MC 는 종료되는 환경에서만 사용할 수 있는 것입니다. 이번에는 종료되지 않는 환경에도 온라인 학습이 가능한 TD 방법을 알아보겠습니다.

 

 

TD 예측(Temporal Difference Prediction)

TD 도 model-free 환경에서 경험을 통해 학습하는 방법이며 MC 와 DP 방법을 결합한 것입니다. 

 

상태 가치 함수의 정의로부터 각 유도된 식은 다음과 같습니다.

 

$\begin{aligned} 
v_{\pi}(s) & \doteq \mathbb{E}_{\pi}[G_t|S_t=s] & \scriptstyle{\text{MC}} \\ 
&=\mathbb{E}_{\pi}[R_{t+1} + \gamma v_{\pi}(S_{t+1})|S_t = s] & \scriptstyle{\text{TD}} \\
&=\displaystyle \sum_{a \in A} \pi(a|s) \displaystyle \sum_{s' \in S} P_{ss'}^a \left[ r + \gamma v_{\pi}(s') \right] & \scriptstyle{\text{DP}}
\end{aligned}$

 

MC 방법은 실제 리턴의 기댓값 대신에 샘플 리턴의 평균으로 기댓값에 근사하는 것입니다. DP 는 기댓값이 MDP 모델로부터 완전히 제공받는다고 볼 수 있으며 $v_{\pi}(S_{t+1})$ 대신 현재 추정된 가치 함수 $V(S_{t+1})$ 로부터 계산합니다. TD 는 두 방법을 모두 포함하는 것으로 샘플을 이용하며 실제 $v_{\pi}$ 대신 추정 $V$ 로 계산하는 것이라고 할 수 있으며 이를 부트스트랩(bootstrap)이라고 합니다. 

 

업데이트 식은 다음과 같습니다.

 

$V(S_t) \leftarrow V(S_t) + \alpha(r_{t+1}+\gamma V(S_{t+1}) - V(S_t))$

 

 

 

구현

TD prediction 을 구현합니다.

# td prediction(policy evaluation)

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import gym

env = gym.make('FrozenLake-v0', is_slippery=False)

gamma = 0.99
alpha = 0.1

v_table = np.zeros(env.observation_space.n)

num_episode = 10000
for i in range(num_episode):
    state = env.reset()
    done = False
    while not done:
        action = env.action_space.sample()
        next_state, reward, done, _ = env.step(action)
        
        td_target = reward + gamma * v_table[next_state]
        v_table[state] = v_table[state] + alpha * (td_target - v_table[state])
        
        state = next_state
    
# print(v_table.reshape(4,4))

sns.heatmap(np.around(v_table.reshape(4, 4), 3), annot=True)
plt.title('TD Prediction', fontsize=18)
plt.show()

 

 

편향(Bias)

MC 와 TD 에서 사용하는 식을 비교합니다.

 

$\begin{aligned}   
v_{\pi}(s) & \doteq \mathbb{E}_{\pi}[G_t|S_t=s] & \scriptstyle{\text{MC}} \\   
&=\mathbb{E}_{\pi}[R_{t+1} + \gamma v_{\pi}(S_{t+1})|S_t = s] & \scriptstyle{\text{TD}} \\   
\end{aligned}$

 

MC 방법은 리턴의 평균을 기반으로 리턴의 기댓값에 근사하고자하는 방법론으로 모든 상태를 방문하고 충분히 반복한다면 실제 가치에 수렴하게 될 것입니다. 즉 $G_t$ 는 $v_{\pi}(s)$ 의 불평 추정량으로 편향되지 않는 것입니다.

 

TD 방법의 경우에는 추정을 추정으로 계산하여 식 $r_{t+1} + \gamma v(S_{t+1})$ 에서 $v(S_{t+1})$ 에 대한 계산은 추정된 $V$ 를 이용합니다. $r_{t+1} + \gamma v_\pi(s_{t+1})$ 는 $v_{\pi}(s)$ 의 불편 추정량이지만 $r_{t+1} + \gamma V(S_{t+1})$ 은 편향되었다는 것입니다.

 

 

분산(Variance)

MC 방법은 한 에피소드동안 발생된 샘플의 리턴을 이용해 업데이트가 이루어집니다.

 

 

방문한 상태의 많은 샘플에 대해 계산하기 때문에 분산 혹은 변동성이 크다는 것입니다. 즉 현재 상태에서 다음 상태로 가는데 한 번에 갈 수도 있지만 다른 상태를 거쳐서 갈 수도 있기 때문입니다.

 

반면 TD 방법은 현재 상태 $S_t$ 는 단일 샘플 $r_{t+1}$ 과 $V(S_{t+1})$ 로 업데이트가 가능하기 때문에 분산이 적다고 할 수 있습니다. 또한 단일 샘플을 이용하는 계산을 TD(0) 혹은 1-스텝 TD 라고합니다.

 

 

 

n-스텝 예측(n-Step Prediction)

n-스텝 TD 는 1-스텝 TD 와 MC 양극단의 중간쯤 되는 방법으로 n-스텝 리턴을 통해 업데이트합니다.

 

 

상태 $S_t$ 의 가치 추정값 $V(S_t)$ 에 대해 한 에피소드의 궤적 $S_t, R_{t+1}, S_{t+1}, R_{t+2}, \dots, R_T, S_T$ 을 이용해서 업데이트한다고 가정합니다.

 

이에 대한 리턴은 다음과 같습니다.

 

$G_t \doteq R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots + \gamma ^{T-t-1} R_T$

 

n-스텝 리턴을 나타내면 다음과 같습니다.

 

$G_{t:t+1} \doteq R_{t+1} + \gamma V_t(S_{t+1})$

 

$G_{t:t+2} \doteq R_{t+1} + \gamma R_{t+2} + \gamma^2 V_{t+1}(S_{t+2})$

 

$\dots$

 

$G_{t:t+n} \doteq R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1} R_{t+n} + \gamma^n V_{t+n-1}(S_{t+n})$

 

스텝 n 값을 1로하면 1-스텝 TD이며 무한히 크게하면 그냥 리턴이 됩니다. 즉 n 값에 따라 미래가 과거에 영향을 주는 정도를 조절할 수 있으며 n 값을 크게하면 MC 방법의 성질과 가까워지므로 분산이 커지게 됩니다. 적당한 n 값을 사용하면 MC 와 TD 의 장점을 모두 살려 편향과 분산을 조절할 수 있습니다.

 

다음은 어떤 환경의 10번의 에피소드에 대하며 100번 반복한 실험의 결과로 실제값과 예측값의 평균제곱오차를 나타냅니다.

 

n 의 중간 값을 사용한 방법이 좋은 결과를 나타내고 있습니다.

 

 

n-스텝 리턴을 이용한 업데이트식은 다음과 같습니다.

 

$V(S_t) \leftarrow V(S_t) + \alpha(G_{t:t+n} - V(S_t))$

 

 

참고로 A3C 알고리즘에서 사용된 n-스텝 TD 입니다.

 

에피소드 종료 혹은 n 값에 해당하는 $t_{max}$ 에 도달하면 그 이전까지 모았던 샘플 궤적 $s_t$, $a_t$, $r_t$, ..., $s_n$, $a_n$, $r_n$ 을 역방향으로 계산하여 각 상태의 리턴과 상태의 추정 가치의 오차를 줄여나가는 과정입니다.

 

 

구현

n-스텝 TD prediction 을 구현합니다.

# n-step td prediction(policy evaluation)

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import gym

env = gym.make('FrozenLake-v0', is_slippery=False)

n = 8

gamma = 0.99
alpha = 0.1

v_table = np.zeros(env.observation_space.n)

num_episode = 10000
for i in range(num_episode):
    memory = []
    
    state = env.reset()
    done = False
    while not done:
        action = env.action_space.sample()
        next_state, reward, done, _ = env.step(action)
        
        memory.append((state, reward))
        
        if done or len(memory) == n:
            if done:
                g = 0
            else: 
                next_action = get_action(e, next_state)
                g = v_table[next_state]
                
            for s, r in reversed(memory):
                g = r + gamma * g
                v_table[s] += alpha * (g - v_table[s])
                
            memory.clear()
        
        state = next_state
    
# print(v_table.reshape(4,4))

sns.heatmap(np.around(v_table.reshape(4, 4), 3), annot=True)
plt.title('n-Step TD Prediction', fontsize=18)
plt.show()

 

 

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

Model-Free Control  (0) 2020.11.13
소프트맥스 회귀(Softmax Regression) (2)  (0) 2020.11.12
OpenAI Gym  (0) 2020.11.09
동적 프로그래밍(Dynamic Programming)  (0) 2020.11.06
벨만 방정식(Bellman Equation)  (0) 2020.11.04
  Comments,     Trackbacks
OpenAI Gym

OpenAI Gym 

강화학습 알고리즘 테스트를 위한 환경을 제공해주는 라이브러리입니다.

 

 

 

 

설치

파이썬 환경은 pip 를 이용하면 간단하게 설치할 수 있습니다. 

pip install gym

 

 

예제

환경을 불러올 때는 gym.make() 함수를 이용합니다.

 

그리드월드 환경FrozenLake 불러와 상태와 행동 크기를 확인합니다.

import gym

env = gym.make('FrozenLake-v0', is_slippery=False)

print(env.observation_space.n)
print(env.action_space.n)

 

16개의 상태를 가지고 4개의 행동을 취할 수 있습니다.

16
4

 

다음과 같이 에피소드를 반복할 수 있습니다.

for i in range(5):
    state = env.reset()
    done = False
    while not done:
        env.render()
        action = env.action_space.sample()
        state, reward, done, info = env.step(action)
        print(state, reward, done, info)

 

매 에피소드마다 env.reset() 함수를 통해 환경을 초기화하고 해당 에피소드가 종료될 때까지 타임 스텝을 반복합니다. env.action_space.sample() 함수는 해당 환경에서 취할 수 있는 랜덤한 행동을 반환합니다. env.step() 함수는 행동을 받아 다음 스텝의 정보들을 반환합니다.

 

환경으로부터 받는 상태, 보상, 종료 여부, 기타 정보는 다음과 같습니다.

0 0.0 False {'prob': 1.0} 
1 0.0 False {'prob': 1.0} 
2 0.0 False {'prob': 1.0} 
1 0.0 False {'prob': 1.0} 
2 0.0 False {'prob': 1.0} 
2 0.0 False {'prob': 1.0} 
2 0.0 False {'prob': 1.0} 
3 0.0 False {'prob': 1.0} 
7 0.0 True {'prob': 1.0}

 

env.render() 함수를 호출하면 현재 상태를 렌더링합니다.

 

 

 

다음은 CarRacing 이라는 환경입니다.

import gym

env = gym.make("CarRacing-v0")
state = env.reset()

done = False
while not done:
    env.render()
    action = env.action_space.sample()
    state, reward, done, _ = env.step(action)
    print(action, state.shape, reward, done)

env.close()

 

다음과 같은 형태의 연속적인 행동 공간과 이미지에 해당하는 상태 정보를 반환합니다.

[0.81338143 0.07590234 0.50560546] (96, 96, 3) 7.1463768115942035 False 
[-0.46199107 0.23878533 0.3978563 ] (96, 96, 3) -0.09999999999999964 False 
[-0.1199649 0.10941219 0.68902004] (96, 96, 3) -0.09999999999999964 False

 

 

 

  Comments,     Trackbacks
동적 프로그래밍(Dynamic Programming)

동적 프로그래밍(Dynamic Programming, DP)

동적 프로그래밍은 MDP 와 같은 환경의 모델이 완벽히 주어졌을 때 푸는 방법론입니다. 즉 보상 함수와 전이 확률과 같은 정보를 알 때 시뮬레이션을 통해 계획(planning) 을 세우는 것이라고 할 수 있습니다.

 

MDP 를 푼다는 것은 크게 예측(prediction)제어(control) 문제로 나누어집니다.

 

prediction 은 주어진 정책 $\pi$ 에 대해 가치 함수를 계산하여 정책을 평가하는 것이라고 할 수 있으며 control 은 정책 평가를 통해 얻은 가치 함수를 이용해 정책을 개선하는 것이라고 할 수 있습니다.

 

 

정책 평가(Policy Evaluation)

정책이 좋은 정책인지 나쁜 정책인지 평가하는 것은 정책 $\pi$ 에 대한 가치 함수 $v_{\pi}$ 를 구하는 것과 같습니다. (아래에서 다루는 policy iteration 을 통해 직관적으로 이해할 수 있습니다.)

 

정책 $\pi$ 에 대한 $v_{\pi}$ 계산은 벨만 기대 방정식을 이용합니다.

 

$v_{\pi}(s) = \displaystyle \sum_{a \in A} \pi(a|s) \displaystyle \sum_{s' \in S} P_{ss'}^a \left[ r + \gamma v_{\pi}(s') \right]$

 

 

다음과 같은 episodic MDP 로 정의된 4x4 그리드월드 환경이 있습니다.

 

양쪽 끝의 종료 상태가 두 개있고 이를 제외한 나머지 상태는 4개의 행동을 취할 수 있습니다. 4개의 행동에 대해 동일한 확률을 가지는 정책이며 행동에 대한 보상은 모두 -1입니다. 가장자리 상태에서 주어진 환경을 벗어나는 행동을 하면 제자리로 돌아오며 상태 전이는 확정적으로 100% 확률로 전이됩니다. 또한 에피소딕 문제이므로 $\gamma=1$ 로 합니다.

 

초기에는 종료 상태 포함 모든 상태의 가치는 0으로 초기화했다고 가정합니다.

 

 

첫 번째 스텝에서 1번 상태의 가치를 계산하면 다음과 같습니다.

 

$4 * 0.25(-1 + 1 * 0) = -1$

 

2번에서 14번 또한 동일하게 계산되며 업데이트된 모든 상태는 다음과 같습니다.

 

 

이처럼 새로운 가치는 이전 가치와 즉각적인 보상의 기댓값을 이용하여 구하는데 이것을 기댓값 업데이트(expected update)라고 합니다. 이 업데이트는 샘플이 아닌 가능한 전체 상태에 대한 기댓값에 기반하여 이루어 지는 것입니다.

 

두 번째 스텝에서는 1번 상태의 가치를 계산하면 다음과 같습니다.

 

$0.25(-1 + 1 * 0) + 3 * 0.25(-1 + 1 * -1) = -1.75$

 

왼쪽으로 가는 행동에 대한 계산은 종료 상태의 가치는 0이므로 $0.25(-1 + 1 * 0)$ 으로 계산한 것이고 위로 가는 행동은 제자리로 돌아오기 때문에 자기 상태의 가치를 이용합니다. 따라서 위, 아래, 오른쪽 모두 동일하게 $0.25(-1 + 1 * -1)$ 으로 계산한 것입니다.

 

2번 상태의 가치의 계산은 다음과 같습니다.

 

$4 * 0.25(-1 + 1 * -1) = -2$

 

계산된 전체 가치는 다음과 같습니다.

 

 

이 과정을 반복하다 보면 각 상태의 값은 수렴하게 되는데 이를 실제 가치(true value) 라고 합니다.

 

 

 

정책 개선(Policy Improvement)

정책 개선 단계는 정책 평가에서 구한 가치 함수를 이용해 그리디 정책(greedy policy)을 생성합니다. 이는 각 상태에서 다음 상태가 최대 가치를 가지는 행동을 선택하게 정책을 수정하는 과정인 것입니다.

 

$\pi'=\text{greedy}(v_\pi)$

 

 

정책 평가의 첫 번째 스텝의 가치 함수를 이용해서 그리디 정책을 생성하면 다음과 같습니다.

 

모든 상태가 동일한 가치이기 때문에 여전히 랜덤한 정책을 갖게 됩니다.

 

 

두 번째 스텝의 가치 함수를 이용해보면 다음과 같습니다.

 

종료 상태와 근접한 상태의 행동 선택이 수정되었습니다.

 

 

실제 가치 함수에 수렴하면 최종적으로 다음과 같은 정책으로 수정됩니다.

 

 

 

정책 반복(Policy Iteration)

정책 평가와 정책 개선을 번갈아 수행하여 최적 정책 $\pi_*$ 및 최적 가치 함수 $v_*$ 로 수렴할 때까지 반복하는 것을 말합니다.

 

 

policy iteration 의 사이클은 다음과 같이 나타낼 수 있습니다.

 

$\pi_0 \overset {E} \longrightarrow v_{\pi_0} \overset {I} \longrightarrow \pi_1 \overset {E} \longrightarrow v_{\pi_1} \overset {I} \longrightarrow \pi_2 \overset {E} \longrightarrow \cdots \overset {I} \longrightarrow \pi_* \overset {E} \longrightarrow v_*$

 

정책 $\pi_0$ 으로 시작해서 정책 평가를 통해 $v_{\pi_0}$ 를 계산하고 이를 이용해서 정책 개선을 하면  $\pi_0$ 보다 향상된 $\pi_1$ 가 될 것입니다. 이 과정을 반복하면 최적 정책 $\pi_*$ 에 수렴할 것이고 이를 통해 계산된 가치 함수는 최적 가치 함수 $v_*$ 가 될 것입니다.

 

 

policy iteration 알고리즘은 다음과 같습니다.

 

 

 

구현

policy iteration 을 구현합니다.

import numpy as np

SIZE = 4
# SIZE = 3

T = [(0, 0), (3, 3)]
# T = [(3, 2), (1, 1)]

K = 3
R = -1
P = 0.25
GAMMA = 1

ACTION = ['left', 'up', 'down', 'right']

def get_value(table, row, col, action):
    if action == 'up':
        if row != 0:
            row -= 1
    elif action == 'down':
        if row != SIZE-1:
            row += 1
    
    if action == 'left':
        if col != 0:
            col -= 1
    elif action == 'right':
        if col != SIZE-1:
            col += 1
        
    return table[row][col]

def view_policy(policy):
    for row in range(SIZE):
        line = []
        for col in range(SIZE):
            if (row, col) in T:
                line.append('T')
            else:
                idx = policy[row][col]
                line.append(ACTION[idx])
        print(' | '.join(line))

def policy_evaluation(policy):
    table = np.zeros((SIZE, SIZE))
    for _ in range(100):
        pre_table = table.copy()
        for row in range(SIZE):
            for col in range(SIZE):
                if (row, col) in T:
                    continue
                update_value = 0
                for idx, prob in enumerate(policy[row][col]):
                    update_value += prob * (R + GAMMA*get_value(pre_table, row, col, ACTION[idx]))
                table[row][col] = update_value
    return table

def policy_improvement(table):
    policy = np.zeros((SIZE, SIZE, len(ACTION)))
    
    for row in range(SIZE):
        for col in range(SIZE):
            q = []
            for action in ACTION:
                q.append(R + GAMMA*get_value(table, row, col, action))
            idx = np.argmax(q)
            policy[row, col, idx] = 1.
            
    return policy

def policy_iteration():
    policy = np.ones((SIZE, SIZE, len(ACTION))) * P

    for k in range(K):
        print('\n\nk=',k)
        print('-'*50)
        table = policy_evaluation(policy)
        print(table)
        print('-'*50)
        policy = policy_improvement(table)
        view_policy(np.argmax(policy, axis=2))

print('Gridworld size : {} x {}'.format(SIZE, SIZE))
print('Terminate state:', *T)

policy_iteration()
Gridworld size : 4 x 4
Terminate state: (0, 0) (3, 3)


k= 0
--------------------------------------------------
[[  0.         -13.94260509 -19.91495107 -21.90482522]
 [-13.94260509 -17.92507693 -19.91551999 -19.91495107]
 [-19.91495107 -19.91551999 -17.92507693 -13.94260509]
 [-21.90482522 -19.91495107 -13.94260509   0.        ]]
--------------------------------------------------
T | left | left | left
up | left | left | down
up | up | right | down
up | right | right | T


k= 1
--------------------------------------------------
[[ 0. -1. -2. -3.]
 [-1. -2. -3. -2.]
 [-2. -3. -2. -1.]
 [-3. -2. -1.  0.]]
--------------------------------------------------
T | left | left | left
up | left | left | down
up | left | down | down
up | right | right | T


k= 2
--------------------------------------------------
[[ 0. -1. -2. -3.]
 [-1. -2. -3. -2.]
 [-2. -3. -2. -1.]
 [-3. -2. -1.  0.]]
--------------------------------------------------
T | left | left | left
up | left | left | down
up | left | down | down
up | right | right | T

 

 

가치 반복(Value Iteration)

policy iteration 은 최적 정책을 찾기 위해 정책 평가와 개선의 과정을 반복하는 것이었습니다. 하지만 정책 평가는 많은 비용이 발생하는 계산으로 $v_{\pi}$ 가 수렴하기 위해서는 많은 반복을 통해야만 하며 정책 이터레이션의 각 단계마다 계산해야하는 과정입니다. 이와 같은 정책 평가의 반복되는 과정은 중간에 중단된다 하더라도 정책 이터레이션의 수렴성이 보장되는데 이 같은 성질을 이용하여 적은 수의 반복으로 최적의 정책을 찾고자하는 것이 value iteration 입니다.

 

value iteration 은 벨만 최적 방정식을 이용합니다.

 

$\begin{aligned}
v_{k+1}(s) & \doteq {\underset {a} {\text{max}} } \, \mathbb{E}[R_{t+1} + \gamma v_k(S_{t+1}) \, | \, S_t=s, A_t=a] \\  
& = {\underset {a} {\text{max}} } \displaystyle \sum_{s',r} p(s',r \, | \, s,a)\Big[ r + \gamma v_k(s') \Big]  
\end{aligned}$

 

모든 상태 $s \in \mathcal{S}$ 에 대해 성립하며 임의의 $v_0$ 에 대해 $v_*$ 를 보장하는 조건하에 수열 ${v_k}$ 는 $v_*$ 로 수렴하는 것입니다.

 

벨만 최적 방정식은 $\underset {a} {\text{max}}$ 이 붙어 최적의 행동만을 고려한 계산입니다. 이것은 정책 개선과 유사하다고 할 수 있습니다. 따라서 value iteration 은 중단된 정책 평가와 정책 개선을 결합하는 것으로 적은 수의 반복으로도 policy iteration 과 같은 기능을 하게 되는 것입니다.

 

 

value iteration 알고리즘은 다음과 같습니다.

 

 

 

구현

value iteration 을 구현합니다.

# value iteration

import numpy as np

SIZE = 4

T = [(0, 0), (3, 3)]

K = 4
R = -1
GAMMA = 1

ACTION = ['left', 'up', 'down', 'right']

def get_value(table, row, col, action):
    if action == 'up':
        if row != 0:
            row -= 1
    elif action == 'down':
        if row != SIZE-1:
            row += 1
    
    if action == 'left':
        if col != 0:
            col -= 1
    elif action == 'right':
        if col != SIZE-1:
            col += 1
        
    return table[row][col]

def get_policy(table):
    policy = np.zeros((SIZE, SIZE, len(ACTION)))
    for row in range(SIZE):
        for col in range(SIZE):
            q = []
            for action in ACTION:
                q.append(R + GAMMA*get_value(table, row, col, action))
            idx = np.argmax(q)
            policy[row, col, idx] = 1.
            
    return policy

def view_policy(policy):
    for row in range(SIZE):
        line = []
        for col in range(SIZE):
            if (row, col) in T:
                line.append('T')
            else:
                idx = policy[row][col]
                line.append(ACTION[idx])
        print(' | '.join(line))


def value_iteration():
    table = np.zeros((SIZE, SIZE))
    for k in range(K):
        pre_table = table.copy()
        for row in range(SIZE):
            for col in range(SIZE):
                if (row, col) in T:
                    continue
                next_values = []
                for action in ACTION:
                    value = R + GAMMA*get_value(pre_table, row, col, action)
                    next_values.append(value)
                table[row][col] = np.max(next_values)
        print('\n\nk=', k)
        print('-'*20)
        print(table)
    print('\n\n')
    policy = get_policy(table)
    view_policy(np.argmax(policy, axis=2))
        
value_iteration()
k= 0
--------------------
[[ 0. -1. -1. -1.]
 [-1. -1. -1. -1.]
 [-1. -1. -1. -1.]
 [-1. -1. -1.  0.]]


k= 1
--------------------
[[ 0. -1. -2. -2.]
 [-1. -2. -2. -2.]
 [-2. -2. -2. -1.]
 [-2. -2. -1.  0.]]


k= 2
--------------------
[[ 0. -1. -2. -3.]
 [-1. -2. -3. -2.]
 [-2. -3. -2. -1.]
 [-3. -2. -1.  0.]]


k= 3
--------------------
[[ 0. -1. -2. -3.]
 [-1. -2. -3. -2.]
 [-2. -3. -2. -1.]
 [-3. -2. -1.  0.]]



T | left | left | left
up | left | left | down
up | left | down | down
up | right | right | T

 

 

 

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

Model-Free Prediction  (0) 2020.11.09
OpenAI Gym  (0) 2020.11.09
벨만 방정식(Bellman Equation)  (0) 2020.11.04
마르코프 결정 프로세스(Markov Decision Process)  (0) 2020.11.04
강화 학습(Reinforcement Learning)  (0) 2020.11.04
  Comments,     Trackbacks
벨만 방정식(Bellman Equation)

벨만 방정식(Bellman Equation)

MDP 로 정의된 모델에서 누적 보상을 최대화 하기 위해서는 각 상태에서 최선의 행동을 선택하는 최적의 정책을 찾아야하며 이러한 최적의 정책은 즉각적인 현재 보상이 아닌 미래에 대한 평가를 나타내는 가치를 기준으로 행동을 선택해야 합니다. 따라서 가치를 계산하는 것은 강화 학습에서 중요한 문제이며 벨만 방정식을 통해 가치를 계산하는 방법을 알아보겠습니다.

 

벨만 방정식은 최적화 문제에서 가치 함수에 대해 이산 시간 $t$ 와 $t+1$ 간에 재귀적인 관계를 나타냅니다. 이러한 벨만 방정식은 벨만 기대 방정식과 벨만 최적 방정식으로 나누어집니다.

 

 

벨만 기대 방정식(Bellman Expectation Equation)

정책 $\pi$ 을 따르는 상태 가치 함수를 $v_\pi(s_t)$ 를 벨만 방정식의 형태로 풀어보면 다음과 같습니다.

 

$\begin{aligned}   

v_\pi(s) &\doteq \mathbb{E}_\pi[G_t|S_t=s] \\

&= \mathbb{E}_\pi[r_{t+1}+\gamma r_{t+2}+\gamma^2r_{t+3}+\cdots|S_t=s] \\   

&= \mathbb{E}_\pi[r_{t+1}+\gamma(r_{t+2}+\gamma r_{t+3}+\cdots)|S_t=s] \\  

&= \mathbb{E}_\pi[r_{t+1}+\gamma G_{t+1}|S_t=s] \\  

&= \mathbb{E}_\pi[r_{t+1}+\gamma v_{\pi}(S_{t+1})|S_t=s] \\  

\end{aligned}$

 

행동 가치 함수 $q_{\pi(s,a)}$ 또한 비슷한 형태로 전개할 수 있습니다.

 

$\begin{aligned}    
q_\pi(s, a) &\doteq \mathbb{E}_\pi[G_t|S_t=s, A_t=a] \\ 

&= \mathbb{E}_\pi[r_{t+1}+\gamma r_{t+2}+\gamma^2r_{t+3}+\cdots|S_t=s, A_t=a] \\    

&= \mathbb{E}_\pi[r_{t+1}+\gamma(r_{t+2}+\gamma r_{t+3}+\cdots)|S_t=s, A_t=a] \\   

&= \mathbb{E}_\pi[r_{t+1}+\gamma G_{t+1}|S_t=s, A_t=a] \\   

&= \mathbb{E}_\pi[r_{t+1}+\gamma q_{\pi}(S_{t+1}, A_{t+1})|S_t=s, A_t=a] \\   
\end{aligned}$ 

 

 

가치 함수에 대해 기댓값 연산자를 포함하는 벨만 기대 방정식은 다음과 같습니다.

 

$v_{\pi}(s) \doteq \mathbb{E}_{\pi}[ r_{t+1} + \gamma v_{\pi}(S_{t+1}) | S_t=s ]$

 

$q_{\pi}(s,a) \doteq \mathbb{E}_{\pi}[ r_{t+1} + \gamma q_{\pi}(S_{t+1}, A_{t+1}) | S_t=s, A_t=a ]$

 

 

또한 MDP 모델을 확실히 아는 상황에서는 계산하기 위한 형태의 식으로 변형할 수 있습니다. 

 

 

먼저 상태 가치를 행동 가치와의 관계로도 풀어낼 수 있습니다.

 

 

상태 $s$ 의 가치 $v_\pi(s)$ 는 취할 수 있는 행동에 대한 행동 가치 $q_{\pi}(s,a)$ 들의 합으로 구할 수 있습니다. 또한 정책을 고려하기 때문에 행동을 취할 확률을 곱하여 다음과 같이 나타낼 수 있습니다.

 

$v_{\pi}(s) = \displaystyle \sum_{a \in A} \pi(a|s) q_{\pi}(s,a)$

 

 

반대로 행동 가치 $q_{\pi}(s,a)$ 를 기준으로 풀어낼 수 있습니다.

 

 

상태 $s$ 에서 취한 행동에 대한 보상과 다음 상태의 가치로 나타낼 수 있습니다. 여기서는 다음 상태에 대한 전이 확률을 고려해야하며 다음과 같이 나타낼 수 있습니다.

 

$q_{\pi}(s,a) = \displaystyle \sum_{s' \in S} P_{ss'}^a \left[ r + \gamma v_{\pi}(s') \right] $

 

 

조금 더 뒤의 관계를 나타낼 수 있습니다.

 

 

위에서 얻은 식을 이용해서 순차적으로 전개하면 최종적으로 다음 형태가 됩니다.

 

$v_{\pi}(s) = \displaystyle \sum_{a \in A} \pi(a|s) \displaystyle \sum_{s' \in S} P_{ss'}^a \left[ r + \gamma v_{\pi}(s') \right]$

 

 

 

동일한 방식으로 행동 가치 함수도 다음 형태의 식을 얻을 수 있습니다.

 

$q_{\pi}(s,a) = \displaystyle \sum_{s' \in S} P_{ss'}^a \left[ r + \gamma \displaystyle \sum_{a' \in A} \pi(s'|a') q_{\pi}(s',a') \right]$

 

 

벨만 최적 방정식(Bellman Optimality Equation)

벨만 기대 방정식이 $v_{\pi}(s)$ 와 $q_{\pi}(s,a)$ 에 대한 수식이라면 벨만 최적 방정식은 $v_*(s)$ 와 $q_*(s,a)$ 에 대한 수식입니다.  다시 말하면 $v_\pi(s)$ 와 $q_\pi(s,a)$ 는 정책 $\pi$ 을 따르는 가치 함수이지만 $v_*(s)$ 와 $q_*(s,a)$ 는 최적 정책 $\pi_*$ 를 따르는 가치 함수인 것이고 최적 정책을 통해 계산된 가치 함수는 최적 가치 함수(optimal value function)인 것입니다.

 

최적 가치 함수는 다음과 같이 나타낼 수 있습니다.

 

$v_*(s) \doteq {\underset {\pi} {\text{max}} } \, v_{\pi}(s)$

 

$q_*(s,a) \doteq {\underset {\pi} {\text{max}} } \, q_{\pi}(s,a)$

 

많은 정책 중 최고의 정책을 따르는 가치 함수가 바로 최적 가치 함수라는 것입니다.

 

 

벨만 기대 방정식과는 무슨 차이가 있을까요?

 

 

벨만 기대 방정식에서는 정책 $\pi$ 를 따르기 때문에 취할 수 있는 행동들에 대해 기댓값을 계산한 것입니다. 하지만 벨만 최적 방정식은 최적 정책 $\pi_*$ 를 따르기 때문에 최적의 행동만을 고려하여 계산합니다.

 

 

따라서 상태 가치 함수와 행동 가치 함수의 관계는 다음이 성립하게 됩니다.

 

$\begin{aligned}  
v_*(s) & = {\underset {a \in \mathcal{A}(s)} {\text{max}} } \, q_{\pi_*}(s,a) \\  
& = {\underset {a} {\text{max}} } \, \mathbb{E}_{\pi_*}[G_t | S_t=s, A_t=a] \\ 
& = {\underset {a} {\text{max}} } \, \mathbb{E}_{\pi_*}[R_{t+1} + \gamma G_{t+1} | S_t=s, A_t=a] \\

& = {\underset {a} {\text {max}} } \, \mathbb{E}[R_{t+1} + \gamma v_*(S_{t+1})| S_t=s, A_t=a] \\
& = {\underset {a} {\text {max}} } \displaystyle \sum_{s',r} p(s',r|s,a)[r + \gamma v_*(s')]
\end{aligned}$

 

최적 정책을 따르는 상태의 가치는 그 상태에서 최선의 선택으로 얻는 기댓값과 같다는 것입니다.

 

행동 가치 함수에 대한 벨만 최적 방정식은 다음과 같습니다.

 

$\begin{aligned}
q_*(s,a) & = \mathbb{E} \left[ R_{t+1} + \gamma {\underset {a'} {\text{max}} } \, q_*(S_{t+1},a') | S_t=s A_t=a \right] \\
& = \displaystyle \sum_{s',r} p(s',r|s,a) \left[ r + \gamma {\underset {a'} {\text{max}} } \, q_*(s',a') \right]
\end{aligned}$

 

 

마치며

벨만 방정식은 MDP 로 정의된 환경에서 가치를 계산하기 위한 것으로 가치 함수 $v_{\pi}$ 의 정의에서 유도했습니다. 이러한 벨만 방정식을 이용하면 $t$ 와 $t+1$ 의 시점에서 바로 계산할 수 있으며 이를 무한히 반복하면 기댓값에 수렴하는 것입니다.

 

또한 벨만 방정식은 벨만 기대 방정식과 벨만 최적 방정식으로 나누어집니다. 정책 $\pi$ 에 대한 가치 함수 $v_{\pi}$ 를 계산할 때는 벨만 기대 방정식을 이용하고 이는 정책 $\pi$ 를 평가하는 것과 같습니다. 최적 정책 $\pi_*$ 에 대한 최적 가치 함수 $v_*$ 를 계산할 때는 벨만 최적 방정식을 사용합니다.

 

 

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

Model-Free Prediction  (0) 2020.11.09
OpenAI Gym  (0) 2020.11.09
동적 프로그래밍(Dynamic Programming)  (0) 2020.11.06
마르코프 결정 프로세스(Markov Decision Process)  (0) 2020.11.04
강화 학습(Reinforcement Learning)  (0) 2020.11.04
  Comments,     Trackbacks
마르코프 결정 프로세스(Markov Decision Process)

마르코프 프로세스(Markov Process, MP)

마르코프 프로세스는 마르코프 특성(markov property)을 지니는 이산 시간 확률 과정입니다.

 

 

위의 마르코프 프로세스 모델은 6개의 상태와 각 상태에서 다음 상태로 전이될 확률을 가지고 있습니다. 또한 시간의 흐름에 따라 상태가 전이됩니다. 그 과정을 살펴보면 Pause 에서 시작하여 Stage 1 로 상태가 전이될 확률은 0.7, 가만히 있을 확률은 0.3입니다. 여러 과정을 거쳐 Stage 2 에서 0.7의 확률로 Win 으로 전이되고 1.0의 확률로 종료 상태(terminal state)인 Stop 에 도달하여 프로세스는 종료됩니다.

 

마르코프 프로세스는 상태의 집합 $S$ 와 전이 확률 행렬 $P$ 로 정의할 수 있습니다.

 

$MP \equiv (S,P)$

 

상태의 집합 $S$ 는 유한한 상태들의 집합입니다.

 

$S = \{s_0, s_1, s_2, \dots\}$ 

 

전이 확률 행렬 $P$ 는 다음과 같습니다.

 

$P_{ss'} = \mathbb{P}[S_{t+1} = s' | S_t = s]$

 

어떤 상태 $s$ 에서 다음 상태 $s'$ 로 변화하는 것을 상태 전이(state transition)라고 하며 그 확률을 전이 확률(transition probability)이라고 합니다. 또한 어떤 상태에서 다음 상태 전이 확률들의 합은 100% 입니다.

 

마르코프 프로세스의 상태 집합 $S$ 에 대한 전이 확률 행렬(transition probability maxtrix)다음과 같습니다. 

 

 

 

마르코프 특성(Markov Property)

마르코프 특성은 다음과 같이 정의됩니다.

 

$\mathbb{P}[s_{t+1}|s_t]=\mathbb{P}[s_{t+1}|s_1, s_2, ..., s_t]$

 

미래는 현재에 의해서만 결정된다는 의미로 마르코프 프로세스에서 다음 상태가 $s_{t+1}$ 이 될 확률은 현재 상태 $s_t$ 로 충분하며 $s_t$ 이전에 방문했던 상태 $s_1, s_2, ...$ 에 대한 정보는 다음 상태 $s_{t+1}$ 에 도달하는 데 영향을 주지 못한다는 것입니다.

 

동전 던지기를 예로 들어보면 동전을 던져 앞면이 5번 연속으로 나왔다고 가정합니다. 다음에 동전을 던지면 뒷면이 나올 확률이 높을 것 같지만 항상 뒷면이 나올 확률은 50% 입니다.

 

이것과 같이 마르코프 특성을 만족하는 상태를 마르코프한 상태라고 합니다.

 

이번에는 반대의 예를 들어봅니다. 운전을 하는 환경에서 운전자 시점의 사진 한장이 주어집니다. 그런데 현재 상태에서 사진 한장의 정보로는 차가 앞으로 가는지 뒤로 가는지 알 수 없습니다. 이 같은 상황은 마르코프하지 않은 상태로 볼 수 있습니다. 이전 사진들의 정보도 같이 주어진다면 조금 더 마르코프한 상태로 만들 수 있을 것입니다.

 

 

마르코프 보상 프로세스(Markov Reward Process, MRP)

마르코프 프로세스에 보상 함수 $R$ 과 감쇠 $\gamma$ 라는 개념이 추가되면 마르코프 보상 프로세스를 정의 할 수 있습니다. 

 

$MRP \equiv (S,P,R,\gamma)$

 

 

마르코프 보상 프로세스 모델은 각 상태에 도달하게되면 보상을 받습니다.

 

보상 함수 $R$ 은 어떤 상태 $s$ 에 도달했을 때 받는 보상으로 정의합니다.

 

$R=\mathbb{E}[R_t|S_t=s]$

 

MRP 에서는 연속된 상태 전이 과정을 통해 다음과 같은 궤적(trajectory)이 만들어 질 것입니다.

 

$s_t, R_t, s_{t+1}, R_{t+1}, s_{t+2}, R_{t+2}, \dots, s_T, R_T $

 

이러한 시점 $t, \dots, T$ 의 과정을 에피소드(episode)라고 하며 환경에 따라 종료되는 에피소드를 다루는 작업을 에피소딕 작업(episodic task), 주식과 같이 에피소드가 종료되지 않는 경우는 연속적인 작업(continuous task)이라고 합니다.

 

시점 $t$ 이후에 연속된 보상을 $R_{t+1}, R_{t+2}, R_{t+3}, \dots$ 으로 나열하고 이를 이용해서 누적 보상을 나타내는 리턴(return)을 정의하면 다음과 같습니다.

 

$G_t \doteq R_{t+1} + R_{t+2} + R_{t+3} + \cdots + R_T $ 

 

위의 식은 그대로 사용하기에는 무리가 있습니다. continuous task 인 경우 값이 계속 더해지면 무한히 커지는 문제도 있고 미래에 대한 불확실성과 같은 요소를 표현할 수 있는 감쇠(discounting)라는 개념이 나오게 됩니다. 이를 이용하여 다시 한번 정의하면 다음과 같습니다.

 

$G_t \doteq R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots = \displaystyle \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}$

 

감쇠 인자는 $0<\gamma<1$ 의 범위를 가지며 보상은 1로 하여 식을 전개하면 감쇠된 리턴값은 유한하다는 것을 알 수 있습니다.

 

$G_t = \displaystyle \sum_{k=0}^\infty \gamma^k = { 1 \over 1-\gamma }$

 

 

감쇠 인자 $\gamma$ 는 $0<\gamma<1$ 범위를 가지며 현재 상태에서 미래에 얻을 보상에 대해 얼마나 더 중요하게 여길 것인지를 나타내는 파라미터입니다.

 

또한 리턴을 이용해 상태에 대한 가치(state value)를 정의할 수 있으며 이를 함수로 표현한 것을 상태 가치 함수(state value function)라고 합니다. 상태 가치 함수는 입력으로 상태를 넣으면 가치를 출력해주는 함수이며 상태 $s$ 에서 시점 $t$ 이후로 얻는 리턴의 기댓값으로 정의됩니다.

 

$v(s)=\mathbb{E}[G_t|S_t=s]$

 

상태 $s$ 의 가치는 상태 $s$ 에서부터 여러 경로의 에피소드를 통해 나온 리턴들의 합으로 구할 수 있는 것입니다.

 

 

마르코프 결정 프로세스(Markov Decision Process)

앞에서 알아본 MP 와 MRP 에서는 시간의 흐름에 따라 상태 전이가 자동으로 이루어 집니다.

 

MRP 에서 행동의 집합 $A$ 의 개념이 추가되면 MDP 를 정의할 수 있습니다.

 

$MDP \equiv (S,A,P,R,\gamma)$

 

 

MDP 모델은 행동이 추가되었기 때문에 행동을 선택하며 학습을 하는 주체인 에이전트를 포함할 수 있게 됩니다. 에이전트는 각 상태마다 행동을 취하고 그 행동에 의해 상태가 전이되며 보상을 받습니다.

 

MRP 와 비교하여 추가된 행동으로 인해 전이 확률은 $P_{ss'}^a$ 로 나타내며 현재 상태 $s$ 에서 에이전트가 행동 $a$ 를 취하여 다음 상태 $s'$ 로 전이될 확률을 나타냅니다. 또한 보상 함수는 $R_s^a$ 로 나타내어 상태 $s$ 에서 행동 $a$ 를 취해서 받는 보상으로 정의합니다. 

 

$P_{ss'}^a = \mathbb{P}[S_{t+1} = s' | S_t = s, A_t = a]$

 

$R_s^a = \mathbb{E}[R_{t+1} | S_t = s, A_t = a]$

 

강화 학습의 목적은 누적 보상을 최대화하는 것이고 각 상태마다 누적 보상이 최대가 되는 방향으로 행동을 선택해야 할 것입니다. 각 상태에 따라 행동을 선택하는 것을 정책(policy)이라는 개념을 통해 나타낼 수 있습니다. 

 

$\pi(a|s)=\mathbb{P}[A_t=a|S_t=s]$

 

이는 입력으로 상태 $s$ 와 행동 $a$ 를 넣으면 $a$ 를 선택할 확률을 출력하는 함수입니다.

 

상태와 행동은 MDP 모델에 정의되어 있는 정보지만 정책은 에이전트에 정의되어 있는 것으로 학습을 통해 개선되어야 하는 것입니다. 

 

정책을 개선(improvement)하기 위해서는 먼저 평가(evaluation)를 해야합니다.

 

그렇다면 정책을 어떻게 평가할 수 있을까요? 

 

 

바로 상태 가치 함수를 통해 정책을 평가할 수 있습니다.

 

$v_\pi(s)=\mathbb{E}_\pi[G_t|S_t=s]$

 

상태 $s$ 에서 정책 $\pi$ 에 의해 얻는 리턴의 기댓값입니다. MRP 에서 알아본 가치 함수 $v(s)$ 와는 다른 것입니다. $v(s)$ 는 MRP 에 정의되어 있는 전이 확률에 의해 발생되는 여러 에피소드의 리턴을 이용하여 기댓값을 구하지만 $v_\pi(s)$ 는 행동 정책 $\pi$ 에 의해서 얻은 리턴들의 기댓값을 구하는 것입니다. 따라서 가치 함수 $v_\pi(s)$ 는 정책 $\pi$ 에 의존적인 것으로 $v_\pi(s)$ 를 구하는 것으로 정책을 평가할 수 있는 것입니다. 단순하게 상태 $s$ 에서 상태 가치가 $v_{\pi_1}(s) < v_{\pi_2}(s)$ 라면 정책을 $\pi_2$ 로 수정하는 것으로 정책이 개선되었다고 할 수 있는 것입니다.

 

 

또한 행동에 대한 가치 함수인 상태 행동 가치 함수(state action value function)를 정의할 수 있습니다.

 

$q_\pi(s,a)=\mathbb{E}[G_t|S_t=s,A_t=a]$

 

이는 정책 $\pi$ 에 의한 상태 $s$ 에서 행동 $a$ 에 대한 리턴의 기댓값으로 각 상태에서 취할 수 있는 행동에 대한 가치를 계산하는 것입니다. 이를 통해 얻을 수 있는 이점은 특정 상태 $s$ 에서 행동 가치가 높은 행동 $a$ 를 선택한다면 최선의 선택일 것입니다.

 

 

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

Model-Free Prediction  (0) 2020.11.09
OpenAI Gym  (0) 2020.11.09
동적 프로그래밍(Dynamic Programming)  (0) 2020.11.06
벨만 방정식(Bellman Equation)  (0) 2020.11.04
강화 학습(Reinforcement Learning)  (0) 2020.11.04
  Comments,     Trackbacks
강화 학습(Reinforcement Learning)

강화 학습(Reinforcement Learning)

순차적 의사 결정(squential decision making) 문제에서 누적 보상을 최대화하기 위해 시행착오(trial-and-error)를 통해 행동을 교정하는 과정을 말합니다.

 

기계 학습은 크게 지도 학습, 비지도 학습, 강화 학습으로 나눌 수 있습니다.

 

 

지도학습은 정답(label)이 있는 데이터셋을 이용하여 학습하는 것이며 반대로 비지도 학습은 정답이 존재하지 않으며 데이터가 가진 특성(feature)을 기반으로 데이터의 구조를 찾는 것이라고 할 수 있습니다.

 

그에 반해 강화 학습은 지도 학습처럼 정답이 있지 않으며 비지도 학습처럼 데이터만을 기반으로 하지 않습니다. 강화 학습은 의사 결정을 하며 학습하는 주체인 에이전트(Agent)가 있고 풀고자하는 문제 혹은 대상에 해당하는 환경(Environment)의 상호작용을 통해 누적 보상을 최대화하는 방향으로 학습합니다.

 

 

이에 따라 강화 학습이 갖을 수 있는 어려운 점은 행동을 선택하는 에이전트는 탐색(exploration)활용(exploitation) 사이를 절충하는 것입니다. 에이전트는 보상을 얻기 위해 이미 경험한 행동들에 대해 활용해야 하지만 미래에 더 좋은 행동을 선택하기 위해 탐색을 해야하는 것입니다.

 

 

구성 요소

환경과 에이전트 외에도 강화 학습의 구성 요소에는 정책(policy), 보상(reward), 가치(value), 모델(model)이 있습니다.

 

보상은 에이전트의 행동에 대해 좋고 나쁨을 평가하는 지표로서 환경으로부터 그 수치를 전달받습니다. 또한 가치라는 개념이 나오게 되는데 보상은 환경으로부터 즉각적으로 받는 단기적인 관점의 수치라면 가치는 장기적인 관점의 수치입니다. 특정 상태의 가치는 그 상태의 시작점에서부터 에이전트가 기대할 수 있는 누적 보상의 합이라고 할 수 있습니다. 다시말해 보상은 주된 것이고 가치는 보상에 대한 예측이기 때문에 부수적이라고 할 수 있습니다. 보상없이 가치가 있을 수 없고 가치를 평가하는 것도 더 많은 보상을 얻기 위해라고 할 수 있습니다. 또한 행동의 선택은 가치를 기준으로 이루어집니다. 장기적으로 최대한 많은 보상을 얻을 수 있기 때문입니다. 즉 강화 학습의 핵심은 가치를 추정(estimate)하는 것이라고 할 수 있습니다.

 

정책은 특정 상태에서 에이전트가 취해야할 행동을 정의합니다.  강화 학습의 목적은 최적 정책(optimal policy)을 찾는 것입니다. 최적 정책이란 어떤 상태에서 누적 보상의 합이 최대가 되는 행동을 선택하는 정책을 의미합니다. 또한 정책은 확률적(stochastic) 혹은 확정적(deterministic)인 성격을 갖을 수 있습니다.

 

마지막으로 환경에 대한 모델은 두 가지로 나누어지는데 먼저 모델-프리(model-free)는 모르는 환경에 대해 에이전트가 시행착오를 겪으며 경험을 통해 학습하는 것을 말하며 모델-기반(model-based)는 환경을 알고 계획(planning) 하는 것으로 경험하지 않고 환경이 변화하는 것을 추정하는 것입니다.

 

 

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

Model-Free Prediction  (0) 2020.11.09
OpenAI Gym  (0) 2020.11.09
동적 프로그래밍(Dynamic Programming)  (0) 2020.11.06
벨만 방정식(Bellman Equation)  (0) 2020.11.04
마르코프 결정 프로세스(Markov Decision Process)  (0) 2020.11.04
  Comments,     Trackbacks