안녕하세요 글또 8기 여러분!
AI 연구 채널의 최민주 입니다. 닉네임은 Judy 이고요 🙋🏻♀️
글또를 시작한 첫날, 저는 이렇게 자기소개를 했어요.
이렇게 자기소개를 한 만큼 (?) 저는 글또 8기 첫 글 주제를 일찌감치 정했답니다.
제가 좋아하는 기계번역 이야기 썰을 쭉쭉 풀기 전에
동기분들께 기계번역이 정확이 어떤 개념인지 먼저 소개하면 좋을 것 같아서
글또 첫 활동으로 AI 시대의 기계번역에 대한 소개글을 작성합니다 🤗
(※ 해당 소개글은 약 2년 전 모 세미나에서 발표했던 내용을 바탕으로 작성하였습니다.
따라서 현재 트렌드와 차이가 있을 수 있습니다.)
기계 번역(機械飜譯, 영어: Machine translation)은 인간이 사용하는 자연 언어를컴퓨터를 사용하여 다른 언어로 번역하는 일을 말한다.
(출처 : 위키피디아)
쉽게 말해 네이버 파파고, 구글 번역, 카카오 번역을 생각하시면 됩니다.
PBMT(Phrase Base Machine Translation : 구문 기반) 으로도 불립니다.
https://www.slideshare.net/NaverEngineering/mt-173570380
말 그대로 두 언어의 문법 규칙(Rule)을 기반으로 번역하는 방법입니다.
이 방법의 단점은 문법 규칙(Rule) 을 추출하기 어렵고, 그만큼 번역 언어를 확장하기가 어렵다는 점입니다.
SMT 에서는 통계 정보를 바탕으로 번역을 수행합니다.
https://www.slideshare.net/deview/papagon2mt
한-영 번역으로 예를 들어 보겠습니다.
Source Language 인 한국어 입력 문장이 들어오면 각 단어가 각각의 영어(Target Language) 단어로 번역될 확률이 얼마인지 데이터 테이블에서 읽어와 가장 확률 높은 단어를 찾는 방법 입니다.
인공지능의 발전에 힘입어 새롭게 등장한 방법으로, 기존의 단어-단어 또는 구-구 번역과 달리 문장을 통째로 학습합니다.
번역 문장 쌍(ex : 한 - 영)을 이용해 번역 모델을 학습하는데, 아래 그림과 같이 Encoder 에 Source Language 문장을, Decoder 에 Target Language 문장을 넣어 모델을 학습시킵니다.
https://tutorials.pytorch.kr/_images/seq2seq.png
이 방법은 원문(Source) – 번역 문장 (Target) 으로 이루어진 데이터셋을 이용하므로 구문 분석기나 어휘 사전을 구축할 필요가 없다는 점이 가장 큰 장점입니다.
또한 문장 단위로 번역하므로 전체 문맥을 고려한 번역이 가능합니다.
앞서 기계번역의 역사와 번역 방법에 대해 설명하였는데요.
그렇다면 파파고와 같은 기계번역 시스템을 구축하기 위해서는, 또는 기계번역을 수행하기 위해서는 단순히 모델을 학습시키는 것이 전부일까요?
기계번역 개발에는 반드시 필요한 또다른 요소들이 있는데요,
기계번역 모델 학습뿐만이 아니라 문장 전/후처리도 필요하고
모델이 잘 학습하였는지 학습 결과를 평가할 수 있는 지표도 필요합니다.
아래 그림에서 기계번역의 4요소 (정해진 것은 아닙니다만) 를 간략히 소개합니다.
입력문을 토큰화하는 과정을 말합니다.
자연어처리를 해 본 분들이라면 모두 아시겠지만, 문장을 처리하기 위해서는 우선 문장을 토큰화(tokenization) 하여 토큰, 즉 문장을 구성하는 세부 요소들로 쪼개줘야 합니다.
단어 단위로 쪼갤 수도 있고, 의미를 갖는 최소한의 단위인 형태소 단위로 쪼갤 수도 있지요.
아래는 하나의 문장을 토큰화한 예시입니다.
내용이 정말 거지같다. → 내용/NNG 이/JKS 정말/MAG 거지/NNG 같/VA 다/EF ./SF
토큰화를 수행하려면 Tokenizer 모듈 또는 라이브러리를 사용하면 되는데요,
대표적인 토크나이저로 한국어의 경우 Mecab 을 쓰고, 영어는 NLTK, 중국어는 Jieba 등을 사용합니다.
각 나라의 언어별로 특화된 토크나이저가 존재하는데요,
Spacy 처럼 다국어를 지원하는 토크나이저도 있습니다.
개인적으로 저는 다국어 기계번역 연구를 할 때 Sentence Piece 를 사용했는데
아무래도 다국어를 지원하다 보니 Mecab 등 특정 언어만을 지원하는 토크나이저보다는 다소 성능이 낮을 수 있습니다.
대표적인 Subword 분절 알고리즘입니다.
BPE 알고리즘을 간략하게 설명하면 연속적으로 가장 많이 등장한 글자의 쌍을 찾아서 하나의 글자로 병합해 주는 원리인데요,
이렇게 하면 OOV (Out Of Vocabulary) 문제를 해결할 수 있기 때문입니다.
예를 들어, '국립중앙박물관' 이라는 단어가 단어 사전에 없을 때, BPE 를 적용하여 '국립', '중앙', '_박물관' 으로 분절하여 단어 사전에 있는 단어들의 구성으로 바꾸어 줍니다.
(BPE 참고 : https://github.com/rsennrich/subword-nmt)
모델을 학습하는 과정으로, 모델 학습 속도 및 학습 품질이 좋아지는 방법을 탐색합니다.
앞서 기계번역 모델을 원문(Source) – 번역 문장 (Target) 으로 이루어진 데이터셋으로 학습시킨다고 설명하였는데요,
모델을 충분히 학습시키기 위해서는 충분히 많은 양의 데이터셋이 필요합니다.
기계번역뿐만이 아니라 AI 모델 개발에 있어 데이터셋이 부족하여 많은 연구자들이 연구에 어려움을 겪는데요,
이 때 적은 양의 데이터를 이용해 데이터셋을 확장하곤 합니다.
이를 Data Augmentation 이라 부르고, 기계번역 또는 Style Transfer (ex : 문체 변환) 분야에서 대표적으로 사용하는 기법이 Back-Translation 입니다.
기계번역의 경우 Monolingual(한 개의 언어로 이루어진 데이터) 데이터를 Bilingual 데이터로 만드는 방법 인데요,
쉽게 말해 번역기를 이용하여 인공데이터를 생성하는 방법을 말합니다.
http://dsba.korea.ac.kr/seminar/?mod=document&uid=1328
https://3months.tistory.com/465
이진 분류 문제에서 대부분 Label 은 0 또는 1로 주어집니다.
Label 이 1이라고 하는 것은 그것의 Label 이 1 임을 100 % 확신한다는 뜻이지요.
하지만 데이터 레이블링이 잘못되는 경우가 있을 수 있으므로
잘못된 레이블링의 영향을 줄이기 위해 Label 을 0, 1이 아니라 smooth 하게 부여하는 것이 바로 Label smoothing 입니다.
예를 들어 tensorflow 에서는 원래 0으로 부여되었던 Label 을 1 - 0.9 = 0.1 로 부여합니다.
또한 Label smoothing 은 잘못 레이블링된 데이터를 고려하기 위해 사용되는 것뿐만이 아니라 데이터 정규화(regularization)에도 효과가 있습니다.
일반적으로 사람은 쉬운 것부터 차근차근 배워가면서 난이도를 점점 올려 어려운 것을 배우는 것이 학습 효과가 크지요.
Curriculum learning은 이 학습법을 차용한 것으로 상대적으로 쉬운 것부터 먼저 학습을 한 후 점차 어려운 것을 학습하는 머신 러닝 방법을 말합니다.
모델링 설명에 앞서 기계번역에서 가장 널리 쓰이는 Transformer 모델에 대해 아주 간략하게 설명하겠습니다.
Transformer 이전에 Seq2Seq 이 있었고, Transformer 는 Seq2Seq 의 attention 을 극대화한 모델이므로 Seq2Seq, Transformer 두 가지 모두 짧게 설명합니다.
Seq2Seq (+ Attention) → Transformer (Self-Attention)
https://wikidocs.net/22893
Seq2Seq(Sequence to Sequence) 의 모델 구조는 encoder 와 decoder 로 이루어져 있습니다.
Attention 은 쉽게 말해 이 encoder-decoder 모델에서 중요한 단어에 더 집중해서 보기 위해 고안된 개념으로,
전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 보게 됩니다.
Transformer 는 Seq2Seq 에서 쓰이는 attention 에 주목했습니다.
Attention 만으로도 입력 데이터에서 중요한 정보를 찾아내서 인코딩하는 것이 Transformer 의 핵심 아이디어인데요,
Transformer 를 발표한 논문 제목이 ‘Attention Is All You Need’ 일 정도이니
Transformer 에서 Attention 이 차지하는 비중이 얼마나 큰지 알 수 있겠죠?
https://ratsgo.github.io/generative%20model/2018/01/31/AR/
Auto regressive Model 은 자기 자신을 입력으로 하여 자기 자신을 예측하는 모델을 말합니다.
예를 들어 기계번역 모델로 주로 사용되는 Transformer 의 경우 decoder 측에서 i번째 output을 다시 i+1번째 input으로 사용하는 auto-regressive한 특성을 가지고 있습니다.
최근 NMT 모델은 decoder 의 Auto regressive 한 특징이 있어 속도가 느리다는 단점이 있습니다.
따라서 나이브한 방법으로 encoder-decoder 모델에서 auto-regressive 한 연결을 제거하는 방법이 있지만
이 방법을 이용하면 성능이 떨어지므로 Non-Autoregressive Transformer 라는 새로운 모델이 소개되었습니다.
이 모델은 전체 output 을 parallel 하게 생성 가능하다는 장점이 있습니다.
모델을 학습시켰다면 번역 결과와 실제 정답이 얼마나 유사한지 비교하여 학습이 잘 되었는지 평가합니다.
번역 성능을 평가하는 대표적인 지표는 BLEU 이며 APE Task 에서는 TER 를 주로 이용합니다. (APE 는 나중에 다른 글에서 설명할게요)
N-gram 을 이용한 품질 평가 지표로 번역 task 에서 가장 대표적으로 이용됩니다.
번역뿐만이 아니라 Style Transfer 등 다양한 자연어처리 task 에서 사용되는 평가 지표이기도 합니다.
문장에서 단어를 n개의 단어 뭉치로 끊어서 다음에 나올 단어를 예측하는 원리로, 단어 갯수(count)에 기반한 통계적 접근 방법입니다.
https://donghwa-kim.github.io/BLEU.html
몇년 전에는 Moses multi-bleu perl 을 흔히 사용했는데
https://github.com/moses-smt/mosesdecoder/blob/master/scripts/generic/multi-bleu.perl
최근 EMNLP 의 MT Workshop 에서는 Sacre-BLEU 를 추천하고 있습니다.
https://github.com/mjpost/sacreBLEU
BLEU 뿐만이 아니라 ROUGE, RIBES 들도 종종 이용되며
이외에도 많은 연구자들이 BLEU 보다 더 나은 평가 척도에 대해 연구하고 있습니다.
또한 BLEU 등의 지표를 이용한 품질 평가는 아직까지는 인간의 평가만큼 정확하지 않기 때문에
인간의 품질 평가(Human Evaluation) 를 더 빠르게, 신뢰도 높게 진행할 수 있는 방법에 대한 연구와 논의도 이어지고 있습니다.
딥러닝에서 inference란 학습된 model을 사용해서 입력에 대한 답을 추론하는 것을 말하며, GPU inference, CPU inference 각각 번역 속도를 개선하고 경량화하기 위한 연구가 진행되고 있습니다.
(개인적으로 현업에서 가장 필요했던 부분이었습니다 😂)
가장 나이브한 방법은 NMT 모델의 Encoder 또는 Decoder Layer 수를 줄여 모델의 크기를 줄이는 방법으로, 모델 크기가 줄어든 만큼 연산 속도가 증가합니다.
좀 더 복잡한 방법으로는 모델 구조(알고리즘) 를 압축 및 변경하거나
모델 parameter 를 줄이거나 공유하는 방법이 있습니다.
제가 참고한 논문 및 제가 작성한 논문에서는 Transformer 는 Encoder 보다는 Decoder 구조가 더욱 복잡하기 때문에 Decoder 의 레이어 수를 줄이거나 모델 구조를 수정하는 경우가 많았습니다.
다만 이러한 방법을 이용할 경우 번역 성능이 다소 떨어지는 경우가 있어 (trade-off)
개인적으로 번역 성능을 얼마나 희생할 수 있는지가 관건이라고 생각합니다 😂
Teacher (대형 모델)가 이미 학습한 지식 (softer softmax) 을 student (소형 저용량 모델) 에게 전달하는 방법입니다.
https://light-tree.tistory.com/196
https://intellabs.github.io/distiller/knowledge_distillation.html
http://dmqm.korea.ac.kr/activity/seminar/304
https://blog.lunit.io/2018/03/22/distilling-the-knowledge-in-a-neural-network-nips-2014-workshop/
Distillation (증류) 는 불순물이 섞여 있는 혼합물에서 원하는 특정 성분을 분리시키는 방법을 말합니다.
즉 불필요하게 많은 paramete가 사용되는 (불순물이 많이 섞인) ensemble model로부터,
generalization 성능을 기존 대비 향상시킬 수 있는 knowledge들을 분리해 내는 방법을 말합니다.
Havard NLP Group 과 Systran 이 합작하여 개발한 기계번역 오픈소스 라이브러리입니다.
Tensorflow, pytorch 모두 지원하며 서버 API도 지원하므로 상대적으로 적은 노력을 들여 기계번역 서비스를 구축할 수 있습니다.
이름 그대로 Facebook (현 Meta) 의 AI Research 팀이 개발한 기계번역 오픈소스 라이브러리입니다.
Meta 즉 Facebook 에서 개발하였으므로 pytorch 만을 지원합니다.
우선 번역 쌍 데이터셋을 확보합니다.
한국어 데이터셋의 경우 AI Hub 에서 제공하는 데이터셋을 이용할 수 있고
영어 또는 유럽 언어는 WMT, Europal 등의 데이터셋을 이용할 수 있으며
도메인에 따라 직접 데이터셋을 수집하고 정제하여 데이터셋을 구축할 수도 있습니다.
구축한 데이터셋 중 일부를 Test set 으로 분리해 둡니다.
(개인적인 경험상 Test set 을 균형있게, 노이즈 없이, 정확한 평가가 이루어질 수 있게 잘 구축하는 것도 관건이었습니다)
적합한 tokenizer 를 선택하여 문장을 토큰화합니다.
문장을 토큰화한 후 BPE 를 적용할 수 있는데, SentencePiece 를 이용할 경우 BPE 를 생략합니다.
전처리한 데이터를 이용해 모델을 학습합니다.
모델은 앞에서 언급한 OpenNMT, FairSeq, 또는 기타 번역 모델을 이용할 수 있습니다.
토큰화 적용되어 번역된 결과문을 detokenization, 즉 토큰화를 해제하여 정상적인 문장 형태로 만들어 줍니다.
모델이 잘 학습되었는지 확인하기 위해 BLEU 등의 지표를 이용하여 번역 품질을 평가합니다.
저의 경우 AI Hub 에서 제공하는 한-영 병렬 말뭉치 160만 문장을 이용하였고
OpenNMT 를 이용하여 Transformer 기본 모델을 학습시켰습니다.
결과는 BLEU score 평균 34.22 였습니다.
아래는 간단한 번역 결과 예시입니다.
오랜만에 제가 좋아하는 기계번역 이야기를 실컷 할 수 있어서 즐거웠습니다 🤗
다음 글감으로는 어떤 주제가 좋을지 고민중인데, 생각나지 않으면 그동안 읽은
NMT 논문 리뷰를 하나하나 올릴 예정입니다 😜
기계번역에 대해 궁금한 점이 있으시다면 댓글이나 슬랙 메시지 주세요! 😉
첫 주차 큐레이션에 본 포스팅이 선정되었습니다! 🥳
너무 재밌게 잘 읽었습니다! 덕분에 기계번역이 무엇인지 알게되었고 좀더 흥미가 생긴것 같아요!!