기간 : 2021.09.27 ~ 2021.10.25
멤버 : 이승윤(kerry)
결과 : 18 / 667 - 상위 5%
해당대회는 LG에서 주최한 대회로 정형화된 형태의 회의록이 주어지고, 이를 토대로 적절하게 요약하는 대회였습니다. 요약에는 크게 원본 텍스트에서 주요문장을 추출하는 추출요약(Extractive summarization)과 생성요약(Abstractive summarization)으로 나뉩니다. 대회에서는 원본 텍스트를 기반으로 새로운 형태의 문장을 구성하는 생성요약을 해내는 대회였습니다.
LG측에서 제공한 데이터는 지역별로 작성된 실제 의회나 구청의 회의록으로써 제목, 안건내용, 요약문 등의 요소로 구성되어있습니다. 따라서 안건내용을 토대로 자동화된 요약모델을 개발하는 것이 대회의 목표였으며 이를 평가하기 위한 지표로써는 ROUGE score를 사용했습니다.
최종적으로 대회에서 18위를 기록하였습니다. 이 포스트에서는 대회를 통해 배운점과 과정, 결과 및 후기를 공유하고자 합니다.
Instruction
사실 NLP에 관련해서는 어느정도 익숙하지만, 자연어를 생성해내는 task는 지식이 부족했습니다. 일반적으로 많이 알려진 감정분석이나 스팸탐지와 같은 분류문제는 크게 어렵지 않지만, 이번 대회처럼 주어진 자연어를 이해하고 이를 바탕으로 새로운 문장들을 만든다는 것은 엄연히 다른 문제입니다. 따라서 대회를 진행하면서 저는 다양한 논문들을 찾아보았고 그 과정에서 BART, BigBird, Pegasus 등의 Transformer기반의 Encoder-Decoder 모델에 대한 이해도를 높였습니다. 또한 요약문제와 fine tuning 기법에 관련된 논문들도 많이 찾아본 것 같습니다. 해당 논문들을 읽고 공부한 내용은 추후 Paper review에 정리할 예정입니다.
Main technique
대회를 진행해가면서 발견한 문제점과 이를 해결해나가는 과정들을 순차적으로, 동시에 중점적으로 활요한 전략들을 서술해보고자 합니다.
< Data >
주어진 데이터는 JSON 형식의 파일로 안건내용을 포함한 7개의 정보들을 제공하고있습니다. 눈에띄는 점은 evidence text라고 하여 요약문의 근거가 되는 본문내용의 문장들을 모아놓은 컬럼입니다. 다시말해, 데이터에서는 추출요약문과 생성요약문 두가지를 모두 제공하고 있습니다. 처음에는 생성요약 문제를 다루는 대회인데 왜 이러한 추출요약문을 제공하는지 의아했습니다만 추후에 학습 데이터에 추가하는 식으로 활용해 조금이나마 성능을 개선할 수 있었습니다.
추가적으로, 데이터 부분에서 주목해야할 점은 텍스트의 길이입니다. 각 안건 마다 텍스트의 길이가 정말 다양합니다. 짧은 텍스트는 100 글자도 넘지 않는 경우도 있으나, 긴 경우는 몇천 단위까지 그 편차가 정말 컸습니다. 대체 왜 길이가 중요한가 하면 추후 사용할 Transformer 기반의 pretrained 모델에서 input length가 제한되어있기 때문입니다. 이는 곧 모델이 수용할 수 있는 텍스트의 길이가 정해져있다는 것을 의미하며 초과분만큼은 input으로 사용할 수가 없어 정보의 손실로 이어집니다. 뿐만 아니라, 길이가 길어질수록 distance에 따른 attention이 약해져 텍스트에 대한 이해도가 떨어지게되고 이는 곧 성능에 큰 영향을 미칩니다. 따라서 저는 길이를 고려해 모델을 선정하고 이를 보완할 수 있는 전처리 과정을 우선적으로 생각했습니다.
< Model >
모델은 KoBART(https://github.com/SKT-AI/KoBART)를 사용했습니다. 자연어 생성을 위해서는 일반적으로 알려진 BERT와는 다르게 Decoder 기반의 모델이 필요합니다. 물론 BART 뿐만 아니라 더 좋은 성능을 갖고있거나 현재 SOTA를 기록한 다른 좋은 모델들이 존재하지만, 한국어로 사전학습된 모델은 KoBART나 KoGPT-2가 대표적입니다. KoGPT-2가 범용적으로 생성 task에서 사용되는 모델이긴 하지만, 대회가 요구하는 것이 지도학습이라는 것을 감안했을때 단일 Decoder의 구조보다는 Encoder-Decoder 구조가 더 효과적일 것이라고 판단했습니다(또한 BART는 요약 task에 매우 특화되어있습니다). 두가지 모델외에도 KE-T5라는 모델도 고려해보았지만, 해당 모델은 최대 input 길이가 512 토큰으로 상당히 제한적이어서 사용할 수가 없었습니다.
< Rule-based Preprocessing >
전처리 부분입니다. 일반적인 정규표현식으로 약간의 전처리를 거친뒤, base line 모델을 학습시켜본 결과 위에서 언급한 length의 한계가 치명적이라는 점을 발견했습니다. 일반적으로 짧거나 중간정도 되는 길이의 텍스트에 대해서는 올바른 요약문을 생성했지만, 텍스트가 조금만 길어지면 이를 제대로 수행하지 못했습니다. 이에 기인해서 초반에는 불필요한 텍스트를 제거하는 방식을 통해 정보의 손실을 최소화하면서 텍스트들의 길이를 줄여보고자 했습니다. 데이터를 다시한번 들여다보고 불필요한 문구나 문장들을 선정하고 이를 정규표현식으로 제거했습니다.
예를들어, 안건 내용들을 보면 감사나 수고 등의 예의상으로 사용하는 격식적인 표현이나 안건에 대해 참석자분들의 이의 여부를 물어보는 정형화된 표현이 상당히 자주 나타납니다.
"##팀장 수고하셨습니다. 먼저 의사일정 제#항 제###회 ###의회 ##회 회기 결정의 건을 상정합니다. 제###회 ###의회 ##회 회기 결정의 건에 대하여는 ### 의원님 외 4인의 의원님이 발의한대로 #월 ##일부터 #월 #일까지 ##일간의 회기를 결정하고자 합니다. 의원 여러분 이의 있으십니까? (『없습니다』하는 의원 있음) 이의가 없으므로 가결되었음을 선포합니다."
감사나 수고와 같은 표현들이 나타나는 구문은 안건의 주요한 내용에 해당하지 않아 지워도 정보의 손실을 초래하지 않습니다. 하지만 이의여부를 묻는 질문같은 경우 항상 저 위와 유사한 형식으로 나타나며 이후 뒤따르는 가결여부는 요약에서 상당히 중요한 부분을 차지합니다. 이의가 있는지 없는지의 여부에 따라 가결 또는 부결의 여부가 결정될 수 있기때문에 '이의 없음' 혹은 '이의 있음'의 정보를 모델에게 알려주는 것은 상당히 중요합니다. 따라서 저 문장은 통째로 삭제할수 없으며 반복되어 나타나는 밑줄 친 부분의 양식을 정규표현식으로 제거했습니다.
"먼저 의사일정 제#항 제###회 ###의회 ##회 회기 결정의 건을 상정합니다. 제###회 ###의회 ##회 회기 결정의 건에 대하여는 ### 의원님 외 4인의 의원님이 발의한대로 #월 ##일부터 #월 #일까지 ##일간의 회기를 결정하고자 합니다. 이의가 없으므로 가결되었음을 선포합니다."
그렇게되면 동일한 구문이 위와 같이 길이가 줄어들게됩니다. 이외에도 위와같은 부수적인 문구들을 선정하고 제거해도 문장이 매끄럽게 이어질 수 있도록 전처리를 해주었습니다.
다음으로 case 구분입니다. 이 점은 모델의 최종 성능 개선에서 가장 임팩트가 컸던 부분입니다. 생성한 요약문들을 점검하던 중, 사람에게는 굉장히 쉬운 문제이고 모델에게도 쉬울듯한 내용인데 유난히도 예측을 못하는 경우를 발견했습니다. 이는 특정 내용에서 두드러졌습니다. 바로 '선거'에 관련된 내용과 '예산'에 대한 내용이 나타나는 경우입니다.
데이터를 주의깊게 들여다보면 안건들은 몇가지 테마로 정리될 수 있습니다. 선거, 개회선포, 예산안 가결, 의원 선출 등으로 나뉠 수 있습니다. 이 중에서 모델이 유난히 선거와 예산에 관련된 내용들의 요약문을 제대로 생성해내지 못하는 경우를 확인했습니다. 이유를 확인한 결과, 원문이 요약에 필요하지않은 불필요한 내용들을 지나치게 많이 포함하고있어 텍스트의 길이가 지나치게 길고, 이에 따라 사람의 이름이나 득표수 등을 제대로 잡아내지 못하는 문제였습니다. 따라서 이러한 특수한 케이스들에 대해 모델이 잘 학습할 수 있도록 사전에 정한 규칙을 통한 전처리가 필요해보였습니다.
"의사일정 제#항 제#대 ###의회 전반기 의장 선거의 건을 상정합니다. 의장 선거는 「지방자치법」 제##조 및 「###의회 회의 규칙」 제#조의 규정에 따라 무기명투표로 한 분을 선출하게 되어 있습니다. 재적의원 과반수의 출석과 출석의원 과반수의 득표로 당선되며, 만약 1차 투표에서 출석의원 과반수 득표자가 없을 경우에는 2차 투표를 실시하고
...
명패수를 확인한 결과 39매입니다. 다음은 투표함을 열겠습니다. 투표수를 확인한 결과 39매로 명패수와 같습니다. 집계가 끝날 때까지 잠시 기다려 주시기 바랍니다. 투표결과를 말씀드리겠습니다. 총 투표수 ##표 중에 ### 의원 ##표, ### 의원 #표, ### 의원 #표로 「###의회 회의 규칙」 제#조제#항에 따라 출석의원 과반수를 득표한 ### 의원님이 제#대 ###의회 전반기 의장에 당선되었음을 선포합니다. 의장으로 당선되신 ### 의원님께 진심으로 축하의 말씀을 드립니다.
선거의 경우 '당선되었음' 이라는 문구가 포함되면 선거 케이스로 구분해 '총 투표수', '임기', '투표 결과'라는 문구가 포함된 문장들만 추출하여 원문을 재구성해주었습니다. 마찬가지로 '추가 경정 예산안', '세입.세출' 등의 특수한 단어들이 포함되어있으면서 원문 텍스트의 길이가 지나치게 긴 경우를 정제해주어야할 예산 케이스로 구분하고 '기간','상정', '의원' 등의 단어가 포함된 문장들로 재구성했습니다.
"의사일정 제#항 제#대 ###의회 전반기 의장 선거의 건을 상정합니다. 투표결과를 말씀드리겠습니다. 총 투표수 ##표 중에 ### 의원 #표, ### 의원 #표, ### 의원 #표로 「###의회 회의 규칙」 제#조제#항에 따라 출석의원 과반수를 득표한 ### 의원님이 제#대 ###의회 전반기 의장에 당선되었음을 선포합니다."
위와 같은 방식으로 특수한 케이스에 대해 텍스트를 재구성해서 학습했을때, 이를 적용하지 않은 경우보다 약 0.02 정도의 ROUGE score의 상승이 있었습니다. 우승팀과의 score차이가 약 0.03 정도밖에 차이가 나지 않는다는 점을 고려해 볼때 이 전략은 상당히 유효했다고 생각됩니다.
< Generation >
마지막으로 text generation 부분입니다. 결국, 잘 학습된 모델을 통해 요약문을 생성하기 위해서는 generation module이 필요합니다. 자연어를 생성하는 decoding 전략은 여러가지가 존재합니다. 대표적으로 가장 높은 확률의 단어를 채택하는 greedy search, 숨겨진 높은 확률의 토큰들도 후보로 고려하는 beam search 와 같은 최대확률에 기반을 두는 전략이 있습니다. 이에 반해 좀 더 다양한 토큰의 출현을 장려하기위한 sampling의 전략도 존재합니다.
대회의 결과물 제출에 있어서 이러한 다양한 전략들 중에서 어떠한 전략이 더 좋은 결과를 보여주는지 실험해볼 필요가 있었습니다. 초반에는 beam size를 3개정도로 주어가며 확률 기반의 전략을 취해 고확률의 토큰이 추출되면서도 후보군들을 고려하도록 했습니다. 동시에 동일한 n-gram의 무분별한 반복출현을 막기위해 3개이상의 n-gram이 중복되는 경우에 대해서 n-gram panelty를 적용했습니다. 하지만 거듭된 실험을 통해 beam size의 증가가 오히려 성능의 저하를 일으킨다는 점을 깨달았고, 결국은 greedy search를 사용해 점수를 크게 높였습니다. 이 과정에서 제가 Sampling 전략을 배제한 이유는, 일반적으로 sampling은 지도학습이 아닌 open source generation의 환경에 적합하다고 알려져있기 때문입니다.
What else?
사실 위에서 기술한 내용에는 가장 점수가 높은 최종전략들만 모아서 기술했기 때문에 제가 했던 다양한 시도들이 포함되어있지 않습니다. 여기서는 제가 성능을 끌어올리기위해 시도한 여러가지 시행착오를 공유하고자합니다.
< For longer inputs >
언급했던대로 input으로 주어지는 회의록의 길이가 매우 긴경우는 1024 토큰 이후의 토큰은 사용이 어렵습니다. 그렇기때문에 뒷부분의 정보를 제대로 반영하지 못합니다. 이를 해결하기위해 저는 대략 3가지 정도를 시도했습니다.
가장 단순하게는 input text의 앞부분과 뒷부분의 일정 비율로 투입하는 것입니다. 기존에는 1024를 초과하는 길이를 갖는 텍스트에 대해 앞에서부터 투입했다면, 약 7:3의 비율로 앞에서 717(1024*0.7) 토큰 뒤에서부터 307(1024*0.3) 토큰을 input으로 투입하는 것입니다. 이렇게되면 중간부분의 정보는 손실되지만 뒷부분에 나오는 주요정보들을 반영할 수 있는 장점이 있습니다.
다음으로는 BART의 embedding 차원을 1024에서 더 큰 차원으로 강제로 늘려주는 것입니다. 제가 사용한 pretrained 모델은 1024 차원의 embedding을 가지므로 일반적으로는 차원의 확장이 불가능합니다. 따라서 기존의 embedding을 복사하여 붙이는 식으로 그 차원을 확장해 더 긴 길이의 input을 받도록 조정해 줄 수 있었습니다.
Longformer라는 모델도 고려해보았습니다. Longformer는 다양한 방식의 sparse attention window을 사용해 연산량을 줄여 긴 길이를 가진 input을 학습할 수 있도록한 모델입니다. 이를 BART에 연결해 더 긴 길이의 input을 수용할 수 있도록 했습니다. 이를 통해 최대 2048개의 토큰을 처리할 수 있는 LongformerBART 모델을 구현했습니다.
하지만 이 세가지 방법 모두 기존의 경우보다 성능이 떨어졌습니다. 뒤섞인 앞과 뒷부분의 정보가 오히려 혼선을 일으켰을 가능성이 있으며, embedding의 단순한 복사는 도움이 되지 못했습니다. LongformerBART는 긴 input을 수용할 수는 있지만 distance에 따른 attention의 한계가 드러났다고 생각합니다.
< K-fold network interpolation >
K-fold. 특히 데이터가 적은 경우, 과적합을 방지하기위해 자주 애용하는 전략중 하나입니다. 이전 대회에서도 사용해서 큰 수혜를 받은 적이 있는데 이번에도 사용해보았습니다. 다만 이번대회는 generation task로 일반적인 분류문제처럼 최종 softmax 확률값을 반환받아 이를 평균내는 방식의 적용이 까다롭습니다. 이를 해결하기위해 network interpolation을 도입했습니다. 이는 모델이 학습한 weight을 평균내는 방식으로 이전에 읽었던 ESRGAN 논문에서 사용된 기법입니다. 5-fold를 통해 학습한 여러 모델의 가중치를 평균내어 사용해본 결과, 단일 모델보다 성능이 미약하게나마 증가하는 것을 확인했습니다. 하지만 최종모델의 경우에는 이 전략의 효과가 떨어졌을 뿐더러 자원소모가 심해 사용하지 않았습니다만 추후에 유용하게 사용할 수 있을 것으로 생각됩니다.
< Using extractive summary text >
주최측에서 제공한 데이터에는 생성요약문의 근거가되는 문장을 모아놓은 evidence text라는 정보가 존재합니다. 이 정보를 어떻게 활용해야할지 많이 생각해보았는데, 처음에는 BERTsum과 같은 추출요약 모델을 사용해 추출요약문을 뽑은뒤 이를 통해 BART로 생성요약을 하는 방법을 생각해보았습니다. 하지만 시간관계상 적용해볼 수가 없었고, 대신 evidence text를 학습데이터에 포함시켜서 데이터 양을 증가시키는 방법을 택했습니다. 원본문장에도 포함되어있지만 한번 더 중요한 문장들을 주입함으로써 특정 문구에 대해 강한 train signal을 학습할 수 있을 것이라고 생각했습니다. 다행히 예상대로 성능을 조금이나마 개선할 수 있었고 최종 결과에도 적용했습니다.
End
자연어 생성을 통한 요약. 처음 경험해보는 task인 만큼 대회시작 전부터 많은 논문들을 찾아보며 많은 것들을 공부했습니다. 그 결과 Encoder-Decoder 기반의 다양한 모델들과 fine tuning 기법들을 접할 수 있었고, 아쉽게도 입상을 하지 못했지만 '요약' 이라는 문제가 얼마나 매력적인지를 알게된 대회였습니다. 해보고자 했던 시도들이 워낙 많아서 3주라는 시간이 제게는 지나치게 짧게 느껴졌던 것 같습니다. 마지막으로 대회에서 참고한 논문들을 밝히며 글을 마칩니다. 해당 논문들은 Paper review에 업로드할 예정입니다.
Reference
- BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension - https://arxiv.org/abs/1910.13461
- Better Fine-Tuning by Reducing Representational Collapse - https://arxiv.org/abs/2008.03156
- Longformer: The Long-Document Transformer - https://arxiv.org/abs/2004.05150
- Fine-tune BERT for Extractive Summarization - https://arxiv.org/abs/1903.10318
- Text Summarization with Pretrained Encoders - https://arxiv.org/abs/1908.08345
- PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization - https://arxiv.org/abs/1912.08777
'Competition' 카테고리의 다른 글
< Dacon > 뉴스 토픽 분류 AI 경진대회 - Final 3th (1) | 2021.08.21 |
---|