작성자: 성균관대학교 사회학과 박지은
시작하기 전에 자연어 생성이 무엇인지부터 살펴보겠습니다. 자연어 생성은 이름 그대로 주어진 input X가 주어졌을 때, 이를 토대로 새로운 텍스트를 생성하는 작업을 말합니다. 기계 번역, 요약, 대화, 이미지 캡셔닝 등을 예로 들 수 있습니다. 이러한 자연어 생성은 저희가 현재 공부하고 있는 NLP의 한 분야로, 지금까지 배운 NLP 방법론은 인간의 언어인 자연어를 이해하는 NLU와 다르게 시스템 계산 결과를 자연어로 자동으로 생성하는 분야입니다.
다음으로 좋은 자연어 생성의 기준은 다음과 같습니다.
저희가 지금까지 세미나를 하며 다양한 언어 모델을 알아봤었는데, 이렇게 언어 모델을 학습한 후에 텍스트를 생성하는 방법 중 decoding algorithm이 있습니다. 자연어를 생성하기 위해서는 최대한 가능성이 높은 출력 시퀀스를 디코딩해야 합니다. 가장 가능성이 높은 출력 시퀀스를 디코딩하게 되면 vocab의 크기가 커지며 완전 탐색이 어려워집니다. 따라서 greedy decoding, beam search, pure sampling, top-N sampling 등처럼 휴리스틱한 decoding algorithm을 사용해서 자연어를 생성하는 방법을 하나씩 알아보겠습니다.
가장 먼저 간단한 greedy decoding입니다. 이는 각 단계에서 가장 가능성이 높은 단어를 선택하여 다음 단어로 사용하는 알고리즘으로, 이 다음 단어로 선택된 단어는 다음 단계의 입력으로 사용됩니다. 이러한 과정을 <END> 토큰이 생성될 때까지 시행하는데, 한 단계에 한 단어만 선택하면 되기 때문에 매우 빠르다는 장점을 가지고 있습니다.
그러나 greedy decoding은 lack of backtracking 문제를 가지고 있습니다. 따라서 어떤 단계에서 실수를 하는 경우, 해당 실수가 이후 단계에 영향을 연쇄적으로 미쳐 최종 결과가 좋지 않을 수 있습니다.
앞의 문제를 방지하기 위해 k개의 가능한 가설들을 두고 가장 높은 확률을 갖는 문장을 찾는 beam search를 활용할 수 있습니다. 여기서 k는 하이퍼파라미터로, beam size를 가리킵니다. 이렇게 여러 개의 가능한 시퀀스를 고려해서 가장 높은 가능성을 가지는 시퀀스를 찾는 방법이지만 그렇다고 가장 optimal이라는 보장은 할 수 없습니다.
이러한 beam search는 greedy decoding의 확장된 형태로, 만약 k가 1인 경우에는 greedy decoding과 동일하게 됩니다. 아래 그림은 beam size가 2인 경우로, 각 단계에서 가장 확률이 높은 2개만 고려하여 누적확률을 크게하는 단어들을 따라 문장을 생성하는 모습입니다. 파란색 숫자는 0과 1 사이의 확률값에 로그를 취한 형태이므로 음수값을 가지며, 절댓값이 작은 단어를 따라 문장이 생성됩니다.
그럼 beam size는 어떻게 결정할까요? Beam size가 너무 작은 경우에는 위에 있는 문장들처럼 단어 하나하나는 주제와 가까운 듯하지만 성립되지 않는 문장의 형태를 띄고 있습니다. 반대로 beam size가 너무 커지면 아래 있는 문장들처럼 알맞고 안전한 완전한 문장의 형태이지만 지나치게 포괄적이며 관련성이 적습니다.
그렇다면 beam size가 커져도 덜 generic 하도록 만드는 방법은 없을까요? 이를 위해 sampling-based decoding을 제안할 수 있습니다. 여기에는 pure sampling과 top-n sampling의 방식이 있습니다.
먼저 pure sampling은 각 단계마다 확률 분포를 토대로 랜덤으로 골라 다음 단어로 사용하는 방법입니다. Greedy decoding과 비슷하지만 argmax 대신 random으로 뽑은 sample을 사용한다는 차이점이 있습니다.
이를 더 일반화하면 top-N sampling이 될 수 있는데, 이는 pure sampling처럼 완전 random한 샘플링 대신 확률이 큰 top-n개의 단어 중에서 랜덤으로 샘플을 고릅니다. 따라서 n이 클수록 다양하지만 risky 해지고, n이 작을수록 광범위하지만 안전한 결과를 출력합니다. 마찬가지로 n이 1인 경우에는 greed search, n이 V인 경우에는 pure sampling이 됩니다.
두 가지 샘플링 방법 모두 가정이 여러 개가 아니므로 beam search보다 효율적입니다. 또한 softmax temperature를 이후 softmax function에 추가하여 확률 분포를 더 부드럽거나 뾰족하게 조작해서 출력의 다양성을 조절할 수 있습니다.
지금까지는 자연어 생성이 무엇인지, 자연어 생성이 어떠한 알고리즘을 주로하여 이루어지는지 알아보았습니다. 이번에는 자연어 생성 태스크 중 하나인 summarization에 대해 살펴보겠습니다.
앞서 살펴본 것처럼, input text x가 주어졌을 때, x의 주요 정보를 포함하지만 더 짧은 summary인 y를 생성할 수 있습니다. Summarization은 one-to-one이나 one-to-many 등의 다양한 방식도 있지만, 이번에 기반으로 할 구분 기준은 summary의 생성 방식입니다. 먼저 extractive summarization은 형광펜으로 중요한 문장에 밑줄을 치는 것처럼 문서 내에서 핵심이 되는 문장을 추출하는 방식입니다. 다음으로 abstractive summarization은 문서의 요약을 펜으로 직접 쓰는 것처럼 중요한 내용을 담은 새로운 문장을 생성하는 방식으로, 보다 유연한 결과를 낼 수 있지만 extractive summarization에 비해서 어렵습니다.
그럼 neural summarization을 알아보기 전에 그 이전에 사용한 summarization 방식에 대해 알아보겠습니다. Pre-neural Summarization은 대부분 이렇게 3가지 부분으로 구성된 파이프라인으로 구성됩니다. 먼저 content selection은 포함할 주요 문장을 선택합니다. 이를 위한 알고리즘으로 sentence scoring function이나 그래프 기반 알고리즘을 사용할 수 있습니다. 간단하게만 설명드리자면 sentence scoring function은 topic keyword의 유무를 tf-idf로 계산하거나 문서에서 해당 문장이 어느 위치에 나타나는지를 고려하는 방식이고, 그래프 기반 알고리즘은 문장을 노드로 하여 각 문장 쌍들 사이의 edge에 문장 간 유사도를 가중치로 넣어 어떤 문장이 중요한지 찾는 방식입니다.
Neural Summarization은 NMT가 개발되었을 때, 성능이 좋은 것을 보고 문서 요약에도 해당 방법론을 적용해 보며 시작되었습니다. 추상적 문서 요약 태스크를 번역 태스크라고 생각하고 시행을 한 것인데, 이 생각을 토대로 2015년에 처음으로 seq2seq과 attention을 사용한 NMT 방법론으로 문서 요약을 한 결과 오른쪽 그림처럼 유용한 문장을 잘 생성하는 것을 보실 수 있습니다. 그러나 이러한 경우 디테일을 포착하기는 어렵다는 단점이 있는데, 고유명사의 출력 확률이 낮아지며, 희소한 단어들의 경우에는 out-of-vocabulary 문제가 발생합니다.
이러한 문제를 방지하기 위해 모델이 더 쉽게 copy하되, 너무 지나치게 copy하지는 않게 할 필요성이 있었습니다. Copy Mechanism은 Neural Summarization에서 이러한 점을 염두에 두고 디테일을 잡아내고자 했습니다. 따라서 attention을 이용해서 seq2seq이 더 쉽게 단어나 어구를 input에서 output으로 copy할 수 있게 했습니다. 이렇게 copy와 generate를 둘 다 가능하게 하여 hybrid한 extractive/abstractive 접근이 가능하게 됩니다.
구체적으로 살펴보자면, 우선 은 단어를 copy할지 생성할지 결정해주는 generation probability입니다. 그리고 이 attention distribution은 입력된 단어들을 얼마나 copy 할지에 대한 분포를 가지고 있습니다. 따라서 디코더의 각 스텝마다 을 계산하여 다음 단어를 copy하지 않고 생성할 확률을 구하게 되고, 이를 attention distribution으로 구한 context vector와 함께 사용합니다. 그렇게 결과적으로 최종 분포는 generation과 copy 분포를 혼합한 것이 됩니다.
그러나 이러한 방식은 copy를 지나치게 많이하여 abstractive 시스템을 해야하는 부분도 거의 extractive 시스템으로 이루어지게 될 수도 있습니다. 또한 기존의 pre-neural summarization은 중요 문장을 선택하는 content selection과 요약을 하는 surface realization으로 나누어 동작했던 것에 반하여, neural approach는 이 둘을 동시에 하기 때문에 문서를 전체적으로 고려하기 어렵다는 문제가 발생합니다.
이러한 문제를 보완하기 위해 Bottom-up Summarization이 등장했습니다. Bottom-Up Summarization은 이렇게 content selection을 하는 부분과 bottom-up attention을 하는 부분이 나뉘어져 summary를 생성하게 됩니다. 앞의 content selection에서는 neural-sequence tagging model을 이용해서 단어의 포함 여부에 따라 0과 1을 태깅합니다. 그 후 bottom-up attention에서 태그가 불포함인 단어는 mask 처리하여 포함하지 않고 seq2seq + attention 시스템을 사용합니다. 이렇게 selection과 generation을 동시에 하게 되어 copy하는 부분도 줄이고 좋은 성능을 보인다고 합니다.
그럼 이렇게 생성된 문장은 어떻게 평가할 수 있을까요? BLEU와 ROUGE는 모두 생성된 문장과 실제 정답 문장이 얼마나 비슷한지를 계산하는 지표입니다. 그러나 BLEU는 모델이 생성한 문장이 얼마나 실제 정답 문장에 등장했는지를 계산하는 precision 기반이지만, ROUGE는 실제 정답 문장이 얼마나 모델이 생성한 문장에 등장하는지 계산하는 recall을 기반으로 합니다. 또한 BLEU는 모든 n-gram에 대한 경우의 결과를 하나로 합쳐서 하나의 평가 수치를 도출하지만, ROUGE는 각 n-gram에 대해 따로따로 평가 수치를 얻어 출력합니다. 따라서 BLEU는 machine translation에, ROUGE는 summarization에 많이 사용됩니다.
마지막으로 또 다른 자연어 생성 태스크 중 하나인 dialogue에서는 어떻게 자연어를 생성하는지 알아보겠습니다.
우선 dialogue의 형식들은 다음과 같이 있습니다.
Pre-neural dialogue 시스템에서는 open-ended의 자유로운 NLG가 어려웠으므로 미리 정의된 템플릿을 활용하거나, 응답 코퍼스를 미리 지정해놓고 상황에 맞게 적절한 응답을 검색하는 방식을 활용했습니다. 그러다 2015년 NMT가 좋은 성능을 내며 dialogue에도 적용이 되어보았는데, 다음과 같은 문제들이 있었다고 합니다. 주요 문제들을 자세히 살펴보고 마무리하도록 하겠습니다.
먼저 irrelevant response 문제는 seq2seq이 사용자의 발화와 관계가 없는 반응을 생성한다는 점입니다. 이는 너무 광범위한 ‘모르겠어요’와 같은 응답이나 아예 관련없는 주제로 화제를 바꾸는 것도 이유가 된다고 합니다. 이를 해결하기 위해 학습 목적함수로 input S와 response T 간의 Maximum Mutual Information 함수를 이용할 수 있습니다. response T에 대한 input S의 매핑을 최적화하는 대신 상호 정보량을 최대화하는 방식입니다.
다음으로 genericness에 대한 문제점은 어떻게 해결하는지 보겠습니다. 크게 두 종류의 해결방법이 있는데, 나중에 test 할 때 늦게 개입하는 방식으로는 beam search를 할 때 그냥 희소 단어에 가중치를 더 높게 주거나, beam search 말고 sampling decoding algorithm을 사용할 수 있습니다. 이외에 모델을 다르게 학습하는 conditioning 방식으로는 디코더에 추가적인 내용을 고려할 수 있게 조건을 주거나 retrieve and refine 모델을 학습할 수 있습니다.
다음으로는 repetition 문제입니다. 우선 간단한 해결책으로는 beam search를 하는 동안 n-gram의 반복을 원천적으로 차단할 수 있습니다. 이외에도 coverage mechanism을 학습시킬 수 있는데, 이는 seq2seq에서 attention이 같은 단어를 여러 번 보는 것을 차단하는 것을 말합니다.
마지막으로 다룰 문제점은 모델이 일정하지 못한 페르소나를 가진다는 것인데, 이에 대해서는 2016년에 페르소나를 인코딩할 때 임베딩으로 넣는 연구가 진행되었다고 합니다.