새소식

자연어 NLP

[NLP] 자연어처리 - 한국어 임베딩

  • -

 

 

 

 

이전글

한국어 데이터 전처리

 

이전 포스팅에서 텍스트 데이터의 전처리에 관한 내용을 살펴보았는데요. 그 다음 스텝은 자연어 처리를 위한 필수 코스 바로 '임베딩'입니다. 오늘은 임베딩에 대해서 정리해 볼거에요.

 

 

임베딩(embedding) 이란?

자연어를 컴퓨터가 이해할 수 있으려면 자연어를 수치화 해야합니다. 자연어(영어, 한국어, 중국어...)를 수치화 한 것으로 벡터로 표현하는 것을 말하고 '임베딩'은 그 과정까지 모두 포함하는 단어이다. 'embed'는 한국어로 '끼워 넣는다'라는 의미이고, 자연어를 벡터 공간에 끼워 넣는다는 취지로 embedding이라는 용어가 생겨났다고 합니다. 

 

 

 

 

사진 출처

 

자연어를 왜 벡터로 바꾸어야 할까요? 컴퓨터는 '언어'를 이해하지 못합니다. 우리가 프로그래밍 언어로 코드를 짜긴 하지만, 컴파일러가 기계어로 바꾸어주고 컴퓨터는 기계어로 된 것들을 연산해주는 것 뿐입니다. 따라서 자연어를 벡터로 바꾸어서 어떤 단어들이 유사한지(relevance), 유사하지 않은지 등을 벡터로 표현할 수 있는 것이죠. 벡터의 연산을 통해서요.

 

자연어 처리의 성능은 '임베딩 성능'이다라는 말처럼, 아무리 task 모델을 잘 만들었다 하더라도 자연어를 벡터로 바꾼 수치가 단어의 특징이나 유사성 등을 제대로 반영하지 못하면 무용지물이 됩니다.

 

 


 

 

전이학습(Transfer Learning) 이란?

 

 

특정 문제(텍스트 분류, 요약 등등)를 풀기 위해 학습한 모델을 다른 문제를 푸는데 재사용하는 기법을 의미한다. 전이학습은 다른 말로 Pretrain-FineTuning 매커니즘이라고도 하는데, pretrain은 미리 코퍼스를 학습하여 의미있는 임베딩을 생성하는 것을 의미하고, fine-tuning은 특정 task에 맞도록 수정을 가하는 작업을 의미합니다.

 

 

 

임베딩의 품질이 좋으면 task의 성능이 올라가고, 정확도의 수렴(converge)가 빨라집니다.

 

 

예) 많은 양의 코퍼스를 미리 사전학습(pretrain)한 임베딩을 문서 분류 모델의 입력값으로 쓰고, 해당 임베딩을 포함한 모델 전체를 문서 분류 과제에 잘 적용할 수 있도록 업데이트(fine-tuning)하는 것

 

25 NLP tasks at a glance

 

 


 

임베딩 기법 종류

 

단어의 의미나 문법 정보가 녹아있는 임베딩을 생성하는 임베딩 기법에는,

 

  • FastText
  • Word2Vec, Doc2Vec
  • NPLM(Neural Probabilistic Language Model)
  • LSA(잠재의미분석), LDA(잠재디리클레할당)
  • GloVe
  • Swivel
  • BERT
  • XLNet
  • ELMo(Embeddings from Language Models)
  • GPT(Generative Pre-training)

등이 있습니다. 여기서 NPLM, Word2Vec, FastText, LSA, GloVe, Swivel 은 단어 수준의 임베딩 기법이고, LSA, Doc2Vec, LDA, ELMo, BERT는 문장 수준의 임베딩 기법입니다.

 

 

 

2019년 기준, Yang et al은 임베딩 모델의 최근 흐름을 크게 두 가지로 볼 수 있다고 하였습니다. 첫번째는 오토리그레시브(AR, Auto Regressive)이고, 두번째는 오토인코딩(AE, AutoEncoding)입니다. AR, AE 모두 이전 문맥을 바탕으로 다음 단어를 예측하는 과정에서 학습합니다.

 

먼저, 1. AR : AutoRegressive

데이터를 순차적으로 처리하는 기법을 뜻하는데, ELMo, GPT가 AR에 속합니다. 

 

 

2. AE : AutoEncoding

입력값을 복원하는 기법을 뜻합니다. 대표적인 모델은 BERT가 있습니다.

 

 

 

BERT는 문장 일부에 노이즈(마스킹)을 주고, 문장을 원래대로 복원하는 과정에서 학습을 하기 때문입니다. 

 

 


 

AE, AR 모델의 문제점

AE, AR 모델 모두 문제가 있다고 Yang et al은 주장했는데요.

 

먼저, AR의 경우 문맥을 양방향(bidirectional)로 볼 수 없는 태생적인 한계를 지니고 있습니다. 그렇다면 "나는 오늘 배가 너무 아팠고 그래서 병원을 예약했어" 라는 문장이 있다고 했을때 "병원을"이라는 단어를 맞춰야 한다고 가정해보겠습니다. 배가 아팠으니 병원에 갈수도 있고 화장실에 갈 수도 있고 집에 갈 수도 있는 상황인데, "예약했어"라는 뒷 문장을 보면 더 맞추기가 쉬워집니다. 하지만 AR은 순차적인 방법을 사용하므로 맞춰야할 단어를 포함한 이후 문맥 정보를 알려줄 수가 없습니다. 

ELMo의 경우 마지막 레이어에서 forward, backward LSTM 레이어의 계산 결과를 모두 사용하기는 하나, 사전학습을 할 때 forward, backward 레이어를 각각 독립적으로 학습하기 때문에 진정한 양방향 모델이라고 말하기는 어렵습니다.

 

 

 

그리고 AE는 양방향 모델입니다. MASK 앞 뒤 문맥을 고려하기 때문입니다. BERT가 이러한 방식을 사용하고 때문에 오랜기간동안 가장 성능이 좋은 임베딩 모델로 알려져 있었습니다. AE는 양방향 모델이지만, 사실 양방향 모델이 아닙니다. 이유는 "마스킹 처리한 토큰들 사이"의 문맥과 의존관계를 따지지 않기 때문입니다.

예를 들어, "전라남도 여수가 나의 고향이다"라는 문장이 있을 때, "전라남도"와 "여수가"라는 단어를 MASK 처리했다고 해봅시다.("MASK MASK 나의 고향이다")  "나의 고향이다"라는 문맥만을 가지고 "여수"를 예측하기 어려운 부분이 있는데 만약 "전라남도"까지 고려를 한다면, "여수"라는 단어를 맞추기 훨씬 쉬워지겠죠. 하지만 BERT는 각각의 마스킹단어가 독립적이라고 가능하고 예측합니다.

그리고 또 BERT는 사전학습 시 사용하는 마스크 토큰을 파인 튜닝과정에서 쓰지 않기때문에 파인튜닝과 다른 사전학습 환경을 구성하면 모델의 일반화 성능이 떨어질 수 있습니다. 또 BERT는 긴 문맥을 학습하기 어렵습니다.

 

 


 

 

퍼뮤테이션 모델(Permutation Language Model)

 

위의 단점들, 특히 문맥을 양방향으로 고려할 수 없는 한계를 극복하기 위해 Yang et al은 퍼뮤테이션 모델을 제안하였습니다. 토큰을 랜덤으로 셔플한 뒤, 그 뒤바뀐 순서가 마치 원래 그랬던 것 처럼 언어모델을 학습하는 기법입니다. 이게 무슨말이냐면, 예를 들어

"한국에서 가장 높은 산은 백두산 이다"

라는 문장이 있을 때, 토큰을 랜덤으로 셔플하여

"가장 이다 높은 한국에서 산은"

과 같은 형태로 만들고 마지막에 나오는 단어인 "백두산"을 예측하는 방식을 사용합니다. 

 

"가장 이다 높은 백두산 한국에서 산은" 이라는 문장에서 "백두산"을 예측하기 위한 입력 시퀀스는 "가장, 이다, 높은"이 됩니다.

여기서 한번 더 퍼뮤테이션 해서 "가장 한국에서 백두산 이다 높은 산은"이라는 시퀀스가 나왔다면 "백두산"을 예측하기 위한 입력 시퀀스는 "가장, 한국에서"가 됩니다. 

이처럼 퍼뮤테이션 방식으로 예측을 수행하면, 문장 전체 문맥을 살필 수 있게 됩니다. 예측해야할 단어를 제외하고 모든 문장의 부분집합 전부를 학습할 수 있다는 뜻입니다. 

이 예시에서 부분집합 전부라는 것은, 예측해야할 단어인 "백두산"이라는 토큰을 제외한 모든 단어들의 조합입니다.

"한국에서"

"한국에서, 가장"

"한국에서, 가장, 높은"

"산은"

"산은, 이다"

........

 

퍼뮤테이션 언어모델은 토큰 시퀀스를 순차적으로 읽어가며 다음 단어를 예측하는 AR모델이기 때문에 BERT같은 AE모델의 단점 또한 극복할 수 있다고 합니다. 일단, MASK를 하지 않기 때문에, 사전학습시 Pretrain-FineTuning간 불일치 문제를 해결할 수 있습니다. 그리고 BERT에서는 마스킹된 토큰(예측해야할 단어) 사이 간 의존관계를 파악하기가 힘든 문제가 있다고 하였는데 퍼뮤테이션 모델은 이를 고려합니다. 예를 들어

"MASK MASK 나의 고향 이다"

라는 문장이 있고 정답은 "전라남도 여수는 나의 고향이다"라고 할 때,

"나의,이다,고향" -> "전라남도"

"나의,이다,고향,전라남도" -> "여수" 이런식으로 

 

 


 

 

어텐션 메커니즘(Attention Mechanism)

퍼뮤테이션 언어모델의 실제 구현은 토큰을 랜덤으로 뒤섞는 것이 아니라 "어텐션 마스크"를 이용합니다. 

어텐션 메커니즘은, SOTA NLP 기법에서 많이 사용하고 있고, 기계번역을 위한 Seq2Seq 모델에 처음 도입되었습니다. 어텐션 메커니즘은 딥러닝 모델이 특정 벡터에 주목하게 만들어 모델의 성능을 높이는 기법으로 NLP말고도 다른 task에도 쓰일 수 있습니다. 

어텐션 메커니즘의 핵심 아이디어는, "특정 부분에 집중"한다는 점입니다. 특정 또는 전체 영역의 입력값을 반영해 어떤 부분에 집중해야 하는지 고려하는 것이고 해당 값을 얼마나 가중시키느냐는 w와 같습니다.

 

예컨대 독일어 “Ich mochte ein bier”를 영어 “I’d like a beer”로 번역하는 S2S 모델을 만든다고 칩시다. 모델이 네번째 단어인 ‘beer’를 예측할 때 ‘bier’에 주목하게 만들고자 합니다. 어텐션 매커니즘의 가정은 인코더가 ‘bier’를 받아서 벡터로 만든 결과(인코더 출력)는 디코더가 ‘beer’를 예측할 때 쓰는 벡터(디코더 입력)와 유사할 것이라는 점입니다.

출처

 

 

트랜스포머에서 사용되는 세 가지의 어텐션에 대해서 간단히 정리해봅시다. 지금은 큰 그림을 이해하는 것에만 집중합니다.

 

 

첫번째 그림인 셀프 어텐션은 인코더에서 이루어지지만, 두번째 그림인 셀프 어텐션과 세번째 그림인 인코더-디코더 어텐션은 디코더에서 이루어집니다. 셀프 어텐션은 본질적으로 Query, Key, Value가 동일한 경우를 말합니다. 반면, 세번째 그림 인코더-디코더 어텐션에서는 Query가 디코더의 벡터인 반면에 Key와 Value가 인코더의 벡터이므로 셀프 어텐션이라고 부르지 않습니다.

 

**주의할 점은 여기서 Query, Key 등이 같다는 것은 벡터의 값이 같다는 것이 아니라 벡터의 출처가 같다는 의미입니다.

정리하면 다음과 같습니다.

** Transformer

: Seq2Seq 구조의 인코더-디코더를 따록, 어텐션만으로 구현한 모델이다. RNN을 사용하지 않은 인코더-디코더 모델임에도 RNN보다 우수하다. 

 

 

인코더의 셀프 어텐션 : Query = Key = Value 디코더의 마스크드 셀프 어텐션 : Query = Key = Value 디코더의 인코더-디코더 어텐션 : Query : 디코더 벡터 / Key = Value : 인코더 벡터

 

 

위 그림은 트랜스포머의 아키텍처에서 세 가지 어텐션이 각각 어디에서 이루어지는지를 보여줍니다. 세 개의 어텐션에 추가적으로 '멀티 헤드'라는 이름이 붙어있습니다. 뒤에서 설명하겠지만, 이는 트랜스포머가 어텐션을 병렬적으로 수행하는 방법을 의미합니다. (출처)

 

 


 

어텐션 마스크(Attention Mask)

 

 |  [1, 2, 3, 4]

 |  [1, 2, 3, 4]

   |  [1, 2, 3, 4]

 ●   |  [1, 2, 3, 4]

 

좌측 행렬은 셀프 어텐션을 수행할 때 SoftMax 확률 값에 적용하는 마스크 행렬입니다. 여기서 마스크란, softmax 확률 값을 0으로 무시하게끔 하는 역할을 하는데, softmax 확률 값이 0이 되면 해당 단어의 정보는 셀프 어텐션에 포함되지 않습니다. 위에서 검은색 동그라미는 확률 값을 0으로 만드는 마스크라는 뜻이며, 붉은색 동그라미는 확률값을 살리는 의미를 지닙니다.

마스크 행렬(왼쪽)의 행(가로)는 쿼리 단어, 열(세로)는 키 단어에 각각 대응하고, 위 그림처럼 토큰 순서대로 예측해야 하는 경우에 1번단어를 예측할 때 1,2,3,4 단어 모두 사용할 수 없습니다. ---->이쪽으로 문맥을 보기 때문이죠. 3번단어를 맞출 때, 1,2 단어를 고려해 맞추고 4번은 1,2,3을 고려해 맞추게 됩니다.

 

 

만약에, 랜덤으로 셔플해서 [3,2,4,1]이라는 시퀀스가 나왔다면,

 

 ● ● ●  |  [3, 2, 4, 1]

     |  [3, 2, 4, 1]

    [3, 2, 4, 1]

 ●   [3, 2, 41]

 

이와 같은 그림이 될 것입니다. 퍼뮤테이션 모델 역시 단점이 있습니다. 단어가 네개인 문장을 셔플한 결과가 위와 같다면 이 경우 모델은 동일한 입력 3,2 를 입력받아 출력을 1을 낼 수도 4를 낼 수도 있게 됩니다. 이를 해결하기 위해 '투 스트림 어텐션'이 등장하였습니다.

 

 

 

 

 

어텐션 마스크의 단점을 보완한 '투 스트림 어텐션', '트랜스포머-XL' 이란 것이 있는데, 다음 포스팅에서 다루도록 하겠습니다..

 

 


 

 

 

References

 

딥러닝을 이용한 자연어처리 입문

어텐션 메커니즘

어텐션 메커니즘과 Transformer

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.