# 들어가며

이번 장에서는 방대한 영역의 강화학습에 대해 간단하게 이야기하고, 그 방대한 영역의 일부분인 폴리시 그래디언트policy gradient를 활용하여 자연어 생성의 성능을 끌어올리는 방법을 다룹니다. 본격적으로 강화학습에 대해 소개하기에 앞서, 왜 강화학습이 자연어 생성에 필요한지 좀 더 이야기하고자 합니다.

## 생성적 적대 신경망(GAN)

2016년부터 주목받기 시작해 2017년 가장 큰 화제였던 분야는 단연 생성적 적대 신경망generative adversarial network(GAN)이라고 할 수 있습니다. 변분 오토인코더(VAE)와 함께 생성 모델 학습을 대표하는 방법 중 하나입니다. GAN을 통해서 우리는 마치 사실과 같은 이미지를 생성하고 합성하는 작업을 딥러닝 기반으로 실현할 수 있게 되었습니다. 이처럼 합성·생성된 이미지들을 통해, 자율주행처럼 실생활에 중요하지만 훈련 데이터셋을 얻기 어려운 문제들의 해결에 큰 도움을 얻을 수 있으리라 기대됩니다. 실제로 GTA 게임을 통해 자율주행을 훈련 하려는 시도는 이미 유명합니다.

![GAN의 전형적인 구조](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LdlamVyc3unrynApN4U%2F-LX4NFaxngdAiAtat82p%2F12-01-01.png?generation=1556684175910304\&alt=media)

그림과 같이 생성자generator $G$ 와 판별자discriminator $D$ 라는 2개의 모델을 각기 다른 목표를 가지고 동시 훈련시킵니다. $D$ 는 임의의 이미지를 입력으로 받아 이것이 실제 존재하는 이미지인지 아니면 합성된 이미지인지 탐지하는 역할을 합니다. $G$ 는 어떤 이미지를 생성하되 $D$ 를 속이는 이미지를 만들어내는 것이 목표입니다.

이렇게 두 모델이 균형을 이루며 min/max 게임을 펼치게 되면, $G$ 는 결국 훌륭한 이미지를 합성하는 생성자generator 가 됩니다.

$$\min_{G}\max_{D}\mathcal{L}(D,G)=\mathbb{E}_{\text{x}\sim p_r(\text{x})}\Big[\log{D(\text{x})}\Big]+\mathbb{E}_{\text{z}\sim p_z(\text{z})}\Big[\log{\big(1-D(G(\text{z}))\big)}\Big]$$

### 왜 GAN이 중요할까?

![L1 손실함수와 GAN 생성 결과 비교\[24\]](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NFazi4QWyNhL8eTR%2F12-01-02.png?generation=1548425965083123\&alt=media)

마찬가지 이유로 GAN 또한 주목받게 됩니다. 예를 들어, 생성된 이미지와 정답 이미지 간의 차이를 비교하는데 평균제곱오차mean squared error(MSE) 방식을 사용하면, 결국 이미지는 MSE를 최소화 하기 위해 자신의 학습했던 확률 분포의 중간으로 출력을 낼 수밖에 없습니다. 만약 사람의 얼굴을 일부 가리고 가려진 부분을 채워 넣도록 훈련한다면, MSE 손실 함수 아래에서는 각 픽셀마다 가능한 확률 분포의 평균값으로 채워질 겁니다. 이것이 MSE(또는 L1 손실)를 최소화하는 길이기 때문입니다. 하지만 우리는 그런 흐려진 이미지를 잘 생성된 이미지라고 하지 않습니다. 따라서 사실적인 표현을 위해서는 MSE보다 정교한 목적 함수를 쓸 수 밖에 없습니다. GAN에서는 그러한 복잡한 함수를 $D$ 가 근사하여 해결합니다.

## GAN을 자연어 생성에 적용해보기

지금까지 살펴본 아이디어를 번역 또는 자연어 생성에 적용해보는 것도 매우 멋진 일이 될 것 같습니다. 예를 들어 교차 엔트로피를 사용해 바로 학습하기보다는, 실제 코퍼스에서 나온 문장인지 seq2seq에서 나온 문장인지 판별하는 판별자discriminator $D$ 를 두어서 seq2seq에서 나온 문장이 진짜 문장과 같아지도록 훈련하면 정말 멋질 것입니다.

![GAN을 seq2seq에 적용?](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NFb0RbFnc5SCyB8G%2F12-01-03.png?generation=1548425965262835\&alt=media)

하지만 아쉽게도 이 멋진 아이디어는 곧바로 적용할 수 없습니다. Seq2seq의 결과는 이산 확률 분포입니다. 여기서 샘플링 또는 argmax 함수를 통해 얻어지는 결과물은 불연속적인 값일 것이고, 따라서 원핫 벡터로 표현되어야 할 것입니다. 하지만 이 과정은 확률적인stochastic 프로세스로 기울기를 역전파할 수 없거나 미분 결괏값이 0 또는 불연속적인 경우가 됩니다. 따라서 판별자 $D$ 가 맞추거나 속은 여부가 seq2seq $G$ 로 역전파를 통해 전달될 수 없고, 따라서 학습이 불가능합니다.

![미분 결괏값 전달이 어려운 샘플링 과정](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NFb2P42eMGR8bh2s%2F12-01-04.png?generation=1548425966188657\&alt=media)

## GAN과 자연어 생성

이처럼 GAN은 영상 처리 분야에서 대성공을 이루었지만 자연어 생성(NLG)에서는 적용이 어려웠습니다. 자연어 자체의 특징 때문입니다. 이미지란 어떤 연속적인 값들로 채워진 행렬입니다. 하지만 그와 달리 단어 또는 문장은 불연속적인 값으로, 결국 언어란 어떠한 불연속적인 값들의 순차적인 배열입니다. 우리는 신경망 언어 모델이나 seq2seq를 통해 잠재 공간latent space 에서는 연속적인 변수로 그 값들을 치환하여 다루지만, 결국 외부적으로 언어를 표현하려면 이산 확률 분포와 변수로 나타냅니다. 그리고 분포가 아닌 어떤 샘플로 표현하려면 이산 확률 분포에서 샘플링하는 과정을 거쳐야 합니다.

$$y\sim P(\text{y}|x;\theta)$$

이러한 이유 때문에 $D$ 의 손실loss을 생성자 $G$ 에 전달할 수 없고, 따라서 적대적 학습 방법을 자연어 생성에는 적용할 수 없다는 인식이 지배적이었습니다. 하지만 강화학습을 통해 적대적 학습 방식을 우회적으로 사용할 수 있게 되었습니다.

> Gumbel Softmax과 같이 재매개변수화(reparameterization) 트릭을 이용해 이 문제를 해결하려는 시도\[25]들도 있습니다.

## 강화학습을 사용하는 이유

이처럼 GAN을 사용하기 위해서뿐만 아니라 다른 여러 가지 이유로도 강화학습은 매우 중요합니다. 어떠한 문제를 해결할 때, 교차 엔트로피를 쓸 수 있는 분류 문제나 연속적인 변수를 다루는 MSE 등으로는 정의할 수 없는 복잡한 목적 함수가 많기 때문입니다. 그동안 교차 엔트로피나 MSE로 문제를 해결했다 하더라도 사실은 문제를 단순화하여 접근했던 것일 수 있습니다. 이러한 문제들은 강화학습을 통해 해결하거나 성능을 더욱 극대화할 수 있습니다. 이를 위해 잘 설계된 보상reward을 사용해 더 복잡하고 정교한 문제를 해결할 수 있습니다.
