NLU 기술의 발전 과정을 살펴 보면 현재까지 다양한 기술의 변화가 이뤄지고 있다.
워드 임베딩은 Neural Probabilistic Language Model(NPLM)이 발표된 이후부터 Word2Vec > FastText > ELMO > BERT 기법으로 발전하고 있다.
자연어 처리 언어 모델 중 구글이 공개한 언어모델인 BERT 에 대해서 포스팅 해보려고 한다.
| BERT란?
'BERT' 는 Bidirectional Encoder Representations from Transformers 의 약어로,
원어에서 말하고 있는 것처럼 transformer의 양방향 encoder 라는 것을 알 수 있다.
여기서 encoder는 입력 값을 숫자의 형태로 바꾸는 모듈을 의미한다.
따라서 BERT는 문맥을 양방향으로 이해해서 숫자의 형태로 바꾸는 딥러닝 모델이라고 할 수 있다.
| Transformer
그렇다면 BERT에서 말하는 Transformer는 무엇일까?
Transformer는 2017년에 구글에서 공개한 encoder, decoder 구조를 지닌 딥러닝 모델이다.
"Attention is All you Need" 라는 논문을 통해 공개 되었고, 기계 번역에서 우수한 성적을 보여준 모델이다.
transformer 에서 인코더는 입력값을 양방향으로 처리하고, 디코더는 왼쪽에서 오른쪽으로 입력을 단방향으로 처리한다는 큰 차이점을 가지고 있다.
- 트랜스포머의 작동방식
입력값이 인코딩 입력되며, 입력 시 각 토큰들은 포지셔너 인코딩과 더해지고 이 값들을 행렬 계산을 통해서 한번에 어텐션 벡터를 생성한다. 어텐션 벡터는 토큰의 의미를 구하기 위해서 사용된다.
한 단어만 보면 그 단어의 의미가 모호할 때가 많다.
예를 들어 문장의 전체를 보지 않고 'text' 라는 단어만 보면 신문의 text인지, 문자를 보내는 행위를 의미하는지 알기 어렵다. 마찬가지로 'message'라는 단어만 봤을 경우에 이게 누가 말로 전한 소식인지, 문자인지 헷갈린다.
어텐션 벡터를 이해하기 위해 간단히 설명하자면,
각각의 토큰들은 문장 속의 모든 토큰을 봄으로써 각 토큰의 의미를 정확히 모델에 전달하게 된다.
즉 'text message' 가 함께 있으므로 "문자를 전송하다" 라는 의미 임을 어텐션 벡터를 통해 전달하게 되고,
'message'의 의미를 text와 함께 있는 것을 어텐션 벡터를 통해 알게 되면서 문자메세지라는 의미로 인식하고 다음 레이어에 전송하게 됩니다.
어텐션 벡터는 Fully connected layer 로 전송이 되는데, 이런 동일한 과정이 6번 진행되어 그 최종 출력값이 디코더
의 입력값으로 사용된다.
* 인코더는 모든 토큰을 한번에 계산한다는 점! 왼쪽에서 오른쪽으로 한번에 계산하는 과정은 없다.
디코더는 인코더의 출력값과 최초 스타트 스페셜 토큰으로 작업을 시작한다.
디코더는 왼쪽에서 오른쪽으로 순차적으로 출력값을 생성한다.
이전 생성된 디코더의 출력값과 인코더의 출력값을 사용해서 현재 출력값을 생성한다.
디코더도 어텐션 벡터를 만들어서 fully connect layer로 전송하는 작업을 6번 진행한다.
디코더는 end 토큰이라는 특별한 토큰이 출력될때까지 반복된다.
| BERT가 양방향 인코더를 채택한 이유
이 설명은 GPT-1에서부터 시작해야하는데,
GPT-1 은 2018년에 openAI에서 Transformer의 디코더 구조를 사용해서 만든 자연어 처리 모델이다.
이것은 Generative Training 으로 학습된 언어모델이 얼마나 자연어 처리 능력이 우수한지 보여주는 우수한 모델이다.
기본적으로 문장을 데이터로 사용하여 단어를 하나씩 읽어가면서 다음 단어를 예측하는 방법으로 모델이 학습되며,
이런 방식은 별도의 레벨링 작업이 필요 없어서 비지도 학습이라고 하며 한 문장만 가지고도 여러 학습 데이터를 만드는게 가능하다.
문장에서 현재 위치의 단어 다음에 위치한 단어를 예측하는 방식으로 학습 되기 때문에 사람이 직접 레이블링할 필요가 없다.
이 때문에 GPT 모델 학습시 가장 필요한 데이터는 엄청난 양의 데이터이다.
(질적으로 좋은 데이터를 선별하는 능력도 엄청나게 중요하다)
BERT는 GPT의 발표 이후 얼마 지나지 않아 구글에서 발표한 언어 모델이다.
https://arxiv.org/abs/1810.04805
| BERT의 특징
구글은 BERT를 공개하는 논문에서 GPT-1 이 Transformer 코드를 사용한 자연어 처리 능력은 문장을 처리하는데 부족함이 있을 수 있고, 질의 및 응답 영역은 문맥을 이해하는 능력이 상당히 중요한데, 단순히 왼쪽에서 오른쪽으로 읽어나가는 방식으로는 이해에 약점이 있을 수 있다고 말했다.
이 때문에 한쪽방향으로 읽어나가는 디코더보다 양방향으로 문맥을 이해할 수 있는 인코더를 활용한 언어모델인 BERT를 발표하였다.
BERT는 입력 값으로 두 문장도 가능하다.
보통 한 문장으로는 주요 업무로는 스팸여부, 긍정인지 부정인지 분류 업무를 수행할 수 있으며
두 문장을 입력값으로 이용하면 질의 응답 같은 것들인데, 질문과 정답이 들어있는 문맥을 받아서 정답을 출력해주는 업무 정도를 수행할 수 있다.
BERT는 한 문장 또는 두 문장의 학습데이터를 통해 토큰 간의 상관관계뿐 아니라 문장 간의 상관관계도 학습하게 된다.
CLS는 분류Task에 사용되기 위한 벡터로, 문장 전체가 하나의 벡터로 표현된 스페셜 토큰으로 이해하면 된다.
두문장으로 구성된 입력값은 SEP라는 스페셜 토큰으로 두 문장이 구별된다.
입력값을 조금 깊게 살펴보면, 입력 토큰들이 포지셔닝 인코딩과 세그먼트 임베딩 등과 더해지는것을 볼 수 있다.
word piece embedding을 이용해서 문장을 토큰 단계로 분리하는데, 이를 이용하면 띄어쓰기 단위로 나누는것보다 효과적으로 토큰을 구분할 수 있다.
playing은 하나의 단어임에도 play + ing로 나눠진 것을 확인 할 수 있다.
이 방법은 두가지 장점이 있다.
- play(놀다) 의 의미와 ing(~를 하는중이다) 가 명확한 의미가 있기 때문에 딥러닝 모델에 두가지에 대한 의미를 명확하게 전달할 수 있다.
- 쪼개서 입력할 경우 신조어나 오탈자가 있는 입력값에서도 사전에 없는 단어가 있더라도 딥러닝 모델이 학습단계에서 봤을만한 단어들로 쪼개서 입력되기 때문에 흔치 않은 단어들에 대한 예측도 향상된다.
segment Embeddings : 두개의 문장이 입력될 경우에 각각의 문장의 서로다른 숫자를 더해주는 것으로, 딥러닝 모델에게 두문장이 입력되었다는 것을 알려주기 위해 사용되는 임베딩이다.
position Embeddings : 토큰의 상대적 위치 정보를 알려준다.
딥러닝은 포지셔닝 임베딩을 이용하여 E1 -> E2 -> E3 순서로 토큰이 위치하는 것을 알 수 있다.
sin / cos 출력값을 이용하여 포지셔닝을 확인할 수 있는데 이 값을 이용하는 이유가 세가지 정도 있다.
- 입력값에 따라 출력값이 달라지기때문에 상대적인 위치를 알 수 있는 수로 사용이 가능하다
- sin / cos 출력값은 규칙적으로 증가하거나 감소하기에 딥러닝 모델이 이 규칙을 활용하여 쉽게 위치정보 파악이 가능
- sin / cos 무한대의 길이의 입력값도 상대적인 위치를 출력할 수 있다. 어떤 위치의 입력값도 출력할 수 있다.
상대적 위치를 사용하면 최장길이 문장을 세팅할 필요가 없기때문에 포지셔닝 임베딩에서 더 선호된다.
| BERT 와 GPT 의 차이
BERT | GPT |
양방향 언어모델 | 단방향 언어모델 |
Fine Tuning 하기 위해 생성 | Fine Tuning 필요 없도록 생성 |
학습에는 상대적으로 시간과 비용이 적게들지만, 개발자가 파인튜닝을 하는 시간과 비용이 소모된다. |
한번 학습시키는데 어마한 시간과 비용 소모 |
| Fine Tuning
BERT는 구글이 오픈소스로 공개해두었기 때문에 쉽게 다운로드 할 수 있다.
개발자는 이 모델을 어떻게 Fine Tuning 할지를 고민해야한다.
- Fine Tuning 방법
1. 두 문장의 관계를 예측하기 위해 모델을 만드는 방법.
두 문장을 SEP 토큰으로 구분해서 BERT에 입력해서 출력값의 첫번째 CLS 토큰을 두 문장의 관계를 나타내도록 학습
2. 문장을 분류하는 모델
문장 1개를 입력받아 CLS 토큰이 분류값 중 하나가 되도록 학습
3. 질의 및 응답 예제
입력값으로 질의와 응답이 담긴 작문을 SEP 토큰으로 구분하여 전달하고 BERT에 출력값의 마지막 토큰들이 해당 작문 속에 위치 한 정답의 시작 인덱스와 마지막 인덱스를 출력하도록 학습
4. 문장속 단어를 태깅
각 입력 토큰에 대한 출력값이 있기 때문에 출력값이 원하는 태깅으로 출력되도록 학습
| 정리
BERT는 구글이 공개한 트랜스포머 인코딩 방식의 언어 모델로, 가장 최신의 언어분석 기법이며 다른 언어 분석 기법들에 비해 임베딩 결과에서 우수한 성능을 보이고 있다.
BERT가 기존 언어 모델들에 비해 우수한 성능을 낼 수 있는 것은,
기존의 임베딩은 문장에서 단어를 순차적으로 입력받고 다음 단어를 예측하는 단방향(uni-directional)이지만,
BERT는 문장 전체를 입력받고 단어를 예측하고 양방향(bi- directional) 학습이 가능하기 때문이다.
이러한 Neural Network 구조의 유연성과 풍부한 표현력으로 문맥을 다양하게 학습할 수 있고 정확도가 높아지고 있는 것을 볼 수 있다.
문장 수준의 임베딩은 2018년 초에 ELMo(Embedding from Language Models)가 발표된 이후 주목받기 시작했다.
이는 개별 단어가 아닌 단어 Sequence 전체의 문맥적 의미를 함축하기 때문에 단어 임베딩 기법보다 Transfer Learning 효과가 좋은 것으로 알려져 있다. 또한, 단어 수준 임베딩의 단점인 동음이의어도 문장수준 임베딩 기법을 사용하면 분리해서 이해할 수 있다. 문장 수준의 임베딩 기법에는 BERT, GPT 등이 있다
BERT는 사전학습(pre-trained) 모델로서, 특정 과제(task)를 하기 전 사전훈련 임베딩을 실시하므로 기존의 임베딩 기술보다 과제의 성능을 더욱 향상시킬 수 있는 모델로 관심받고 있다. BERT를 적용한 모델링 과정을 살펴보면 Pre-trained는 비지도 학습(Unsupervised Learning) 방식으로 진행되고 대량의 코퍼스(말뭉치)를 인코드(Encoder)가 임베딩하고, 이를 트렌스퍼(Transfer)하여 Fine-tuning을 통해 목적에 맞는 학습을 수행하여 과업을 수행하는 것이 특징이다.
또 다른 BERT의 특징은 양방향 모델을 적용하여 문장의 앞과 뒤의 문맥을 고려하는 것으로 이전보다 더 높은 정확도를 나타낸다. BERT의 활용은 대량의 텍스트 데이터와 다양한 언어를 적용할 수 있다는 장점 때문에, 연구자들 사이에서 가장 각광 받는 기술 중 하나이다.
참고문헌 : 인공지능과 자연어 처리 기술 동향, 유승의
참고영상 : https://youtu.be/30SvdoA6ApE
'Study Log > AI Tech' 카테고리의 다른 글
[Kubernetes] 컨테이너 오케스트레이션부터 알자! (0) | 2021.12.05 |
---|---|
[AI기술] 자연 언어 처리 (NLP) 란? 자연어 처리가 필요한 이유. (0) | 2021.12.04 |