오랜만이라고 생각한다면 그건 오해다. 아무튼 그렇다...
이번에 다룰 논문은 NIPS 2017에 기재된 Adversarial Ranking for Language Generation이다.
친구가 추천해줘서 읽게 되었는데 상당히 흥미로웠다.
GAN은 두 가지로 구성되어 있다. Discriminator(ranker; R)와 generator(G)이다. Disctiminator는 machine-written sentence와 hunan-written sentence를 구분하고, generator는 discriminator를 이용해 높은 퀄리티의 문장이 생성될 수 있도록 한다. 기존의 GAN에는 두 가지 한계가 있었다. 먼저 첫 번째는 discriminator가 binary classifier이란 점이다. 이것은 문장들의 다양함을 제한시킨다는 문제가 있다. 두 번째는 text sequence에 사용되는 discrete token이 미분 가능하지 않아 최적화를 방해한다. 그래서 이 논문에서 제안하는 RankGAN은 문장을 두 가지로 분류하는 대신 점수를 부여하는 ranker와 미분 가능하게 하는 policy gradient 기술을 사용했다.
아래는 Rank GAN의 ranker에서 사용되는 objective function이다. s~P_h는 사람이 쓴 문장, G_theta는 인공적으로 생성된 문장을 의미한다. C+는 human-written sentence, C-는 mahcine-written sentence의 집합이다. 이 함수는 사람이 쓴 문장이 machine이 생성한 문장보다 더 높은 점수를 가질 수 있도록 한다.
위에서 학습된 ranker를 이용해 generator를 만든다. Generator는 RankGAN이 만드는 문장이 사람이 작성한 문장보다 더 높은 점수를 만들도록 한다. Back-propagation의 구현을 위해서 reinforcement learning에서 사용되는 Policy Gradient 방법을 적용시켰다. 아래의 방법으로 리워드 V를 계산한다. 수식 이해는 너무 어렵다..
아래의 그래프에서 볼 수 있듯이 학습이 굉장히 잘 되는 편이다.
아래의 두 표는 performance를 여러 방법으로 측정한 결과이다. BLEU는 평가지표 중 하나로, 사람이 작성한 문장과 생성된 문장 간 유사도를 이용해 점수를 계산한다. 이 BLEU 점수를 기반으로 gradient를 업데이트한다. 아래에서 볼 수 있듯이 RankGAN이 가장 높은 성능을 보였다. 사람이 문장들을 판단했을 때 사람이 작성한 문장과 차이는 드러났지만 기존의 모델에 비해 뛰어난 것을 확인할 수 있다.
RankGAN의 성능은 아래의 예시를 통해 가늠할 수 있다. SeqGAN의 경우 이상한 수식어와 단어들이 보이지만, RankGAN의 경우 이러한 점들이 개선되었다.
앞으로 GAN 모델을 몇 개 더 읽어보고 싶어졌다.
다음에는 수식도 열심히 읽어봐야지!!