강화 학습(reinforcement learning, RL)은 최근 머신러닝에서 가장 흥미진진한 분야이자 가장 오래된 분야
강화 학습 분야에 강력한 딥러닝을 적용하면 상상 이상의 성능을 기대할 수 있음
강화 학습에서 소프트웨어 에이전트는 관측(observation)을 하고 주어진 환경에서 행동을 함. 결과에 따라 환경으로부터 보상을 획득
에이전트는 환경 안에서 행동하고 시행착오를 겪으며 양의 보상을 최대 / 음의 보상을 최소가 되도록 학습
미로 속을 움직이는 것과 같이 양의 보상이 전혀 없을 수도 있음. 미로에서는 매 타임 스텝마다 음의 보상을 받기 때문에 가능한 한 빨리 탈출구를 찾아야 함.
정책(policy) : 소프트웨어 에이전트가 행동을 결정하기 위해 사용하는 알고리즘
확률적 정책(stochastic policy) : 무작위 성이 포함되어 있는 정책
정책 탐색(policy search) : 변경이 가능한 정책 파라미터에 많은 다른 값을 시도해보고 가장 성능이 좋은 조합을 고르는 학습 알고리즘
→ 정책 공간(policy space)이 매우 크면 이 방법으로 좋은 파라미터 조합을 찾는 것은 매우 어려움
유전 알고리즘(genetic algorithm)
예시)
정책 그레이디언트(policy gradient, PG)
강화 학습에서 어려운 점은 에이전트를 훈련하기 위해 시뮬레이션 환경이 필요하다는 것
OpenAI Gym(https://gym.openai.com)은 다양한 종류의 시뮬레이션 환경을 제공하는 툴킷. 코랩에 설치되어 있음.
환경을 만든 후 reset() 메서드로 꼭 초기화 해야함.
신경망 정책에서 신경망은 관측을 입력으로 받고 실행할 행동을 출력함. (각 행동에 대한 확률 추정)
→ 추정된 확률에 따라 랜덤하게 행동 선택
왜 가장 높은 점수의 행동을 선택하지 않고, 신경망이 만든 확률을 기반으로 행동을 선택하는가?
→ 에이전트가 새로운 행동을 탐험하는 것과 잘할 수 있는 행동을 활용(exploiting)하는 것 사이에서 균형을 맞추게 함
탐험과 활용의 딜레마는 강화 학습의 핵심
각 관측이 환경에 대한 완전한 상태를 담고 있기 때문에 과거의 행동과 관측은 무시해도 괜찮음.
만약 어떤 상태가 숨겨져 있다면 과거의 행동과 관측도 고려해야 함.
각 스텝에서 가장 좋은 행동이 무엇인지 알고 있다면 추정된 확률과 타깃 확률 사이의 크로스 엔트로피를 최소화하도록 신경망을 훈련할 수 있음.
하지만 강화 학습에서 에이전트가 얻을 수 있는 가이드는 보상뿐. 보상은 일반적으로 드물고, 지연되어 나타남.
→ 에이전트가 보상을 받았을 때 어떤 행독 덕분(탓)인지 알기 어려운 신용 할당 문제(credit assignment problem) 발생
행동이 일어난 후 각 단계마다 할인 계수(discount factor) 를 적용한 보상을 모두 합하여 행동을 평가하는 방법으로 해당 문제를 해결. 할인된 보상의 합을 행동의 대가(return)이라 함.

좋은 행동 뒤에 나쁜 행동이 몇 번 뒤따르면 좋은 행동이 낮은 대가를 받음. 충분히 많은 횟수만큼 반복하면 평균적으로 좋은 행동이 나쁜 행동보다 더 높은 대가를 받음.
추정해야하는 것은 '평균적으로' 다른 행동과 비교해서 각 행동이 얼마나 좋은지/나쁜지를 추정해야 함.
→ 이것을 행동 이익(action advantage)라고 함.
많은 에피소드를 실행하고, 모든 행동의 대가를 정규화하면, 행동 이익이 음수인 행동은 나쁘고, 양수인 행동은 좋다고 가정할 수 있음.
REINFORCE 알고리즘
샘플 효율성(sample efficiency)이 매우 좋지 못하기 때문에, 아주 긴 시간 동안 게임을 플레이해야 정책을 많이 개선할 수 있음
→ 크고 복잡한 문제에는 적용하기 어려움
PG 알고리즘은 보상을 증가시키기 위해 정책을 직접적으로 최적화하지만 이번에 살펴볼 알고리즘은 덜 직접적임. 알고리즘을 이해하려면 먼저 마르코프 결정 과정(Markov Decision Process, MDP)에 대한 이해가 우선.
마르코프 연쇄(Markov chain)
정해진 개수의 상태를 가지고 있으며, 각 스텝마다 한 상태에서 다른 상태로 랜덤하게 전이
상태 s에서 상태 s'으로 전이하기 위한 확률은 고정되어 있으며, 시스템에 메모리가 없으므로 과거 상태에 상관없이 (s, s') 쌍에 의존

4개의 상태가 있는 마르코프 연쇄의 예시
마르코프 연쇄는 다양한 역학 관계를 모델링 할 수 있어서 많은 분야에서 사용
마르코프 연쇄와 비슷하지만 약간 다른 점이 있음

상태 s0 : 행동 a0 이 최선
상태 s2 : a1 외에는 선택 불가능
상태 s1 : a0 / a2 중에서 확실하지 않음
에이전트가 최적으로 행동하면 적용되는 방정식
어떤 상태 s의 최적의 상태 가치(optimal state value) 를 추정하는 방법
에이전트가 상태 s에 도달한 후 최적으로 행동한다고 가정하고 평균적으로 기대할 수 있는 할인된 미래 보상의 합
알고리즘이 가능한 모든 상태에 대한 최적의 상태 가치를 정확히 추정할 수 있도록 돕는 방정식
최적의 상태 가치를 아는 것은 정책을 평가할 때 매우 유용
최적의 상태-행동 가치(state-action value)를 추정할 수 있는 알고리즘
상태-행동(s, a) 쌍에 대한 최적의 Q-가치인 는 에이전트가 상태 s에 도달해서 행동 a를 선택한 후 이 행동의 결과를 얻기 전에 평균적으로 기대할 수 있는 할인된 미래 보상의 합
알고리즘 작동 방식
독립적인 행동으로 이루어진 강화 학습 문제는 보통 마르코프 결정 과정으로 모델링될 수 있지만, 초기에 에이전트는 전이 확률에 대해 알지 못하며 보상이 얼마나 되는지도 알지 못함.
보상에 대해 알기 위해서는 적어도 한 번은 각 상태와 전이를 경험해야 하고, 전이 확률에 대해 신뢰할 만한 추정을 얻으려면 여러 번 경험해야 함.
시간차 학습(temporal difference learning, TD학습)
TD 학습 알고리즘
또는 다음과도 같이 표현할 수 있음
전이 확률과 보상을 초기에 알지 못한 상황에서 Q-가치 반복 알고리즘을 적용한 것
Q-러닝은 점진적으로 Q-가치 추정을 향상하는 방식으로 작동. 정확한 Q-가치 추정을 얻게 되면 최적의 정책은 가장 높은 Q-가치를 가지는 행동을 선택.
각 상태-행동 (s, a) 쌍마다 알고리즘이 행동 a를 선택해 상태 s를 떠났을 때 에이전트가 받을 수 있는 보상 r과 기대할 수 있는 할인된 미래 보상의 합을 더한 이동 평균을 저장
미래 보상의 합을 추정하기 위해서는 타깃 정책이 이후로 최적으로 행동한다고 가정하고 다음 상태 s'에 대한 Q-가치 추정의 최댓값을 선택
완전한 랜덤 정책은 모든 상태와 전이를 여러 번 경험하도록 보장하지만, 극단적으로 오랜 시간이 걸릴 수 있음
𝜺-그리디 정책(𝜺-greedy policy)는 각 스텝에서 𝜺 확률로 랜덤하게 행동하거나 1-𝜺 확률로 그 순간 가장 최선인 것으로 행동
Q-가치 추정이 점점 더 향상되기 때문에 환경에서 관심 있는 부분을 살피는 데 점점 더 많은 시간을 사용한다는 장점이 있고, 𝜺 값은 높게 시작해서 점점 감소되는 것이 일반적
Q-러닝의 주요 문제는 많은 상태와 행동을 가진 대규모 MDP에 적용하기 어렵다는 것
근사 Q-러닝(approximate Q-learning)
해결책은 어떤 상태-행동 (s,a) 쌍의 Q-가치를 근사하는 함수 를 적절한 개수의 파라미터를 사용하여 찾는 것(는 파라미터 벡터)
2013년 딥마인드는 심층 신경망을 사용해 복잡한 문제에서 더 좋은 결과를 보임
DQN 훈련 방법
주어진 상태-행동 쌍(s,a)에 대해 DQN이 계산한 근사 Q-가치
input_shape = [4]
n_outputs = 2
model = tf.keras.Sequential([
tf.keras.layers.Dense(32, activation="elu", input_shape=input_shape),
tf.keras.layers.Dense(32, activation="elu"),
tf.keras.layers.Dense(n_outputs)
])
첫 번째로 필요한 것은 심층 Q-네트워크
이론적으로는 상태-행동 쌍을 입력으로 받고 근사 Q-가치를 출력하는 신경망이 필요하지만, 실전에서는 상태만 입력으로 받고 가능한 모든 행동에 대한 근사 Q-가치를 각각 출력하는 것이 훨씬 효율적
def epsilon_greedy_policy(state, epsilon=0):
if np.random.rand() < epsilon:
return np.random.randint(n_outputs) # 랜덤 행동
else:
Q_values = model.predict(state[np.newaxis], verbose=0)[0]
return Q_values.argmax() # DQN으로 계산한 최적의 행동
from collections import deque
replay_buffer = deque(maxlen=2000)
def sample_experiences(batch_size):
indices = np.random.randint(len(replay_buffer), size=batch_size)
batch = [replay_buffer[index] for index in indices]
return [
np.array([experience[field_index] for experience in batch])
for field_index in range(6)
] # [states, actions, rewards, next_states, dones, truncateds]
def play_one_step(env, state, epsilon):
action = epsilon_greedy_policy(state, epsilon)
next_state, reward, done, truncated, info = env.step(action)
replay_buffer.append((state, action, reward, next_state, done, truncated))
return next_state, reward, done, truncated, info
𝜺-그리디 정책으로 하나의 스텝을 실행하고 반환된 경험을 재생 버퍼에 저장하는 함수
batch_size = 32
discount_factor = 0.95
optimizer = tf.keras.optimizers.Nadam(learning_rate = 1e-2)
loss_fn = tf.keras.losses.mean_squared_error
def training_step(batch_size):
experiences = sample_experiences(batch_size)
states, actions, rewards, next_states, dones, truncateds = experiences
next_Q_values = model.predict(next_states, verbose=0)
max_next_Q_values = next_Q_values.max(axis=1)
runs = 1.0 - (dones | truncateds)
target_Q_values = rewards + runs * discount_factor * max_next_Q_values
target_Q_values = target_Q_values.reshape(-1, 1)
mask = tf.one_hot(actions, n_outputs)
with tf.GradientTape() as tape:
all_Q_values = model(states)
Q_values = tf.reduce_sum(all_Q_values * mask, axis=1, keepdims=True)
loss = tf.reduce_mean(loss_fn(target_Q_values, Q_values))
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
재생 버퍼에서 경험 배치를 샘플링하고 경사 하강법 한 스텝을 수행하여 DQN을 훈련하는 함수
for episode in range(600):
obs, info = env.reset()
for step in range(200):
epsilon = max(1-episode /500, 0.01)
obs, reward, done, truncated, info = play_one_step(env, obs, epsilon)
if done or truncated:
break
if episode > 50:
training_step(batch_size)
최대 보상에 도달하지만 곧바로 떨어지고, 몇 번 오르내리다가 안정되는 것처럼 보였으나 다시 점수가 급격히 떨어지는 경향
→ 최악의 망각(catastrophic forgetting)
훈련을 안정적이고 빠르게 만드는 심층 Q-러닝 알고리즘의 몇 가지 변형
기본 심층 Q-러닝 알고리즘에서 모델은 예측을 만들고 타깃을 설정하는 데 모두 사용
→ 자신의 꼬리를 쫓는 강아지에 비유할 만한 상황을 만들 수 있음(피드백 순환)
→ 네트워크를 불안정하게 만들어 발산, 진동, 동결 등의 문제 발생
문제를 해결하기 위해 2013년 논문에서 딥마인드의 연구자들은 한 개가 아닌 두 개의 DQN 사용
첫 번째 DQN : 각 스텝에서 학습하고 에이전트를 움직이는 데 사용하는 온라인 모델
두 번째 DQN : 타깃을 정의하기 위해서만 사용하는 타깃 모델. 타깃 모델은 온라인 모델의 단순한 복사본
타깃 모델은 온라인 모델보다 자주 업데이트 X → Q-가치 타깃이 더 안정적, 피드백 반복 완화
연구자들은 0.00025라는 작은 학습률과 10,000 스텝마다 타깃 모델을 업데이트, 매우 큰 재생 버퍼 사용하는 방법 사용
epsilon을 100만 스텝 동안 1에서 0.1까지 매우 천천히 감소시키고 5천만 스텝 동안 알고리즘 실행
더블 DQN(double DQN)
중요도 샘플링(importance sampling, IS) 또는 우선 순위 기반 경험 재생(prioritized experience replay, PER)
어떤 경험이 학습 진행을 빠르게 만들면 '중요한' 것으로 간주
경험은 재생 버퍼에 기록될 때 적어도 한 번 샘플링 되기 위해 매우 높은 우선 순위 값으로 설정
샘플링된 후 TD 오차를 계산하여 경험 우선 순위를 로 설정
우선 순위 p의 경험을 샘플링할 확률 P는 에 비례
샘플이 중요한 경험에 편향되어 있으므로 훈련하는 동안 중요도에 따라 경험의 가중치를 낮춰서 이 편향을 보상해줘야 함. 중요한 경험이 더 자주 샘플링되기를 원하지만, 훈련 과정에서 이 샘플에 낮은 가중치를 주어야 한다는 의미
→ 각 경험의 훈련 가중치 를 정의
듀얼링 DQN(dueling DQN)
알고리즘의 작동 방식을 이해하려면 상태-행동 (s,a) 쌍의 Q-가치가
처럼 표현될 수 있다는 것을 이해해야 함
듀얼링 DQN에서는 모델이 상태의 가치와 가능한 각 행동의 이익을 모두 추정함
최선의 행동은 이익이 0이기 때문에 모델이 예측한 모든 이익에서 모든 최대 이익을 뺌
더블 듀얼링 DQN을 만들고 우선 순위 기반 경험 재생과 연결할 수 있음.
일반적으로 많은 강화 학습 기법은 합칠 수 있고, 2017년 딥마인드가 소개한 논문의 저자들은 6개의 기법을 Rainbow라는 하나의 에이전트에 적용하여 최고 수준의 성능을 보임.
심층 신경망에 기반한 몬테 카를로 트리 검색의 변형을 사용
몬테 카를로 트리 검색(Monte Carlo tree search, MCTS)
알파고는 동일한 원리를 기반으로하지만, 랜덤하게 수를 두는 대신 정책 네트워크를 사용하여 수를 선택하고, 정책 네트워크는 정책 그레이디언트를 사용하여 훈련
DQN은 보통과 같이 훈련, 정책 네트워크는 일반적인 정책 그레이디언트와 다르게 훈련
여러 에피소드를 진행해서 각 행동의 가치를 추정하고 각 행동의 할인된 미래 보상을 합하여 정규화하는 대신 에이전트는 DQN이 추정한 행동 가치에 의존
A3C(asynchronous advantage actor-critic)
A2C(advantage actor-critic)
SAC(soft actor-critic)
PPO(proximal policy optimization)
호기심 기반 탐색(curiosity-based exploration)
개방형 학습(Open-ended learning, OEL)
POET 알고리즘