Hello world!

Natural Language Processing

NLP 기초 다지기

xyz1 2023. 4. 3. 16:34

NLP 연구원분들이 기초 다지기 좋은 문서를 추천해주었다.

출처: https://wikidocs.net/21667

 

01. 자연어 처리(natural language processing) 준비하기

자연어(natural language)란 우리가 일상 생활에서 사용하는 언어를 말합니다. 자연어 처리(natural language processing)란 이러한 자연어의 의미를…

wikidocs.net

 

 

필자가 나중에 보기 편하게 요약한 것이다.

 

목차는 다음과 같다.

- 텍스트 전처리

- 언어 모델

- 카운트 기반 단어 표현

- 벡터의 유사도 

- 머신 러닝 개요

- 딥러닝 개요

- 순환 신경망

- 워드 임베딩

- RNN을 이용한 텍스트 분류

- NLP를 위한 합성곱 신경망

- 태깅 작업

- 서브워드 토크나이저

- RNN을 이용한 인코더-디코더

- 어텐션 메커니즘

- 트랜스포머

- BERT

- 실전! BERT 실습하기

- 토픽 모델링

- 텍스트 요약

- 질의 응답

- GPT

 


텍스트 전처리(Text preprocessing)

전처리: 토큰화 & 정제 & 정규화

1. 토큰화: 단어 토큰화, 문장 토큰화, ...

2. 정제:갖고 있는 코퍼스로부터 노이즈 데이터를 제거

3. 정규화: 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어줌: 표제어 추출, 어간 추출

4. 불용어 제거: 큰 의미가 없는 단어 제거

5. 정규 표현식: 규칙으로 텍스트 데이터 빠르게 정제

6. 정수 인코딩: 단어를 인덱싱

7. 패딩: 병렬 연산을 위해 길이 맞춰야함.

8. 원-핫 인코딩: 텍스트를 벡터화(정수 인코딩 -> (0,1)처리)

9. 데이터의 분리: 머신러닝 학습/평가 하기 위해 데이터 분리

10. 한국어 전처리 패키지 소개


언어 모델(Language Model)

언어 모델이란 문장에 "확률" 값을 계산하는 모델이다. ex. 이 문장은 87% 확률로 적절해, 이 문장은 99%확률로 말이 안돼

- 단어 시퀀스의 확률 할당: 기계 번역/ 오타 교정 / 음성 인식

- 주어진 이전 단어들로부터 다음 단어 예측: 단어 시퀀스의 확률/ 다음 단어 등장 확률

- SLM(Statistical Language Model, 전통적인 접근방법): 조건부 확률, 문장에 대한 확률, 카운트 기반의 접근, 희소 문제

- N-gram: n개의 연속적인 단어 나열

- 한국어에서의 언어 모델은 어렵다: 한국어는 어순이 중요하지 않다. 한국어는 교착어이다. 한국어는 띄어쓰기가 제대로 지켜지지 않는다.

- 펄플렉서티(PPL): 모델의 성능 비교/평가 방법, PPL 수치가 낮으면 좋은 모델, PPL 수치는 "선택할 수 있는 가능한 경우의 수"를 의미. ex. PPL(10): 예측 시 평균 10개의 단어를 가지고 어떤 것이 정답인지 고민.

- 조건부 확률: 언어모델과 n-gram의 근간이 되는 확률 이론


카운트 기반의 단어 표현

단어 표현 방식

- Bag of Words(BoW): 단어들의 순서 고려하지 않고, 단어 빈도를 통해 수치화

- Document-Term Matrix(DTM): 다수의 문서에서 등장하는 각 단어들의 빈도를 행렬로 표현, (Bow 기반)

- Term Frequency-Inverse Document Frequency (TF-IDF): 여러 문서들을 기반으로 단어의 중요도 판단, (Bow 기반)


벡터의 유사도(Vector Similarity)

- 코사인 유사도: -1 ~ 1, 1에 가까울 수록 유사도 높다.

- 유클리드 거리

- 자카드 유사도


머신 러닝 / 딥러닝 개요

- 이건 그냥 스킵하겠다. 


순환 신경망(Recurrent Neural Network) 기초 모델

- RNN

**입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델이다.

RNN 구조

 

- LSTM(Long Short-Term Memory)

메모리 셀에 입력 게이트, 망각 게이트, 출력 게이트를 추가하여 불필요한 기억을 지우고, 기억해야할 것들을 정한다.

즉, 셀 상태 값을 추가한 것이다. Ct-1

 

- GRU(Gated Recurrent Unit)

보완된 모델 (LSTM의 장기 의존성 문제 해결책 유지, 은닉 상태 업데이트 계산 줄임)

게이트 2개만 존재(업데이트 게이트, 리셋 게이트)

 

- RNN 언어 모델(Recurrent Neural Network Language Model, RNNLM)

*시점(time step)이라는 개념이 도입된 RNN으로 언어 모델을 만들면 입력의 길이를 고정하지 않을 수 있습니다.

*RNNLM은 기본적으로 예측 과정에서 이전 시점의 출력을 현재 시점의 입력으로 합니다. 

*교사 강요(teacher forcing): 테스트 과정에서 t 시점의 출력이 t+1 시점의 입력으로 사용되는 RNN 모델을 훈련시킬 때 사용하는 훈련 기법입니다. 훈련할 때 교사 강요를 사용할 경우, 모델이 t 시점에서 예측한 값을 t+1 시점에 입력으로 사용하지 않고, t 시점의 레이블. 즉, 실제 알고있는 정답을 t+1 시점의 입력으로 사용합니다.

훈련과정 중 I/O

- RNN을 이용한 텍스트 생성(Text Generation using RNN)

print(sentence_generation(model, tokenizer, '경마장에', 4))
경마장에 있는 말이 뛰고 있다

print(sentence_generation(model, tokenizer, '그의', 2))
그의 말이 법이다

print(sentence_generation(model, tokenizer, '가는', 5))
가는 말이 고와야 오는 말이 곱다

- 문자 단위 RNN(Char RNN)


워드 임베딩(Word Embedding)

단어를 수치화(벡터화)

- 원-핫 인코딩의 값은 대부분이 0으로 표현되어 sparse representation 문제를 일으킨다. 또한 단어 개수 늘어나면 벡터의 차원이 한없이 커진다.

- Dense representation 방법

- 워드 임베딩 방법론: LSA, Word2Vec, FastText, Glove, .. etcs.

- Word2Vec: 단어 벡터 간 유의미한 유사도를 수치화할 수 있는 방법, CBOW, Skip-Gram 두 가지 방식 존재. CBOW(주변에 있는 단어들을 입력으로 중간에 있는 단어들을 예측), Skip-Gram(중간에 있는 단어들을 입력으로 주변 단어들을 예측하는 방법)

- 네거티브 샘플링 Skip-Gram(SGNS): Word2Vec이 학습 과정에서 전체 단어 집합이 아니라 일부 단어 집합에만 집중할 수 있도록 하는 방법입니다.

Negative Sampling Skip-Gram

중심 단어와 주변 단어가 모두 입력이 되고, 이 두 단어가 실제로 윈도우 크기 내에 존재하는 이웃 관계인지 그 확률을 예측합니다.

- Glove: 임베딩 된 중심 단어와 주변 단어 벡터의 내적이 전체 코퍼스에서의 동시 등장 확률이 되도록 만드는 것

- FastText: 서브워드(subword)를 고려하여 학습. ex)apple -> <ap, app, ppl, ple, le>, <apple>. 모르는 단어에 대한 대응이 가능. FastText에서 birthplace란 단어를 학습하지 않은 상태에서도 벡터를 얻어낼 수 있다.

- 사전훈련된 워드임베딩: pretrained 된 워드임베딩 사용

- 엘모(Embeddings from Language Model, ELMo): 엘모는 같은 표기의 단어라도 문맥에 따라서 다르게 워드 임베딩 할 수 있다. 즉, 문맥을 반영한 워드 임베딩. 사전 훈련된 언어 모델을 사용, biLM(Bidirectional Language Model) -> 양방향 RNN이 아니다. biLM은 순방향 언어모델과 역방향 언어모델이라는 두 개의 언어모델을 별개의 모델로 보고 학습한다.

- 임베딩 벡터의 시각화

- 문서 벡터를 이용한 추천 시스템: 문서들을 고정된 길이의 벡터로 변환한다면 문서들을 서로 비교할 수 있다.

 


RNN을 이용한 텍스트 분류(Text Classification)

<예시들 소개>

Keras Framework

- 스팸 메일 분류: 데이터 정제 -> 토크나이저(토큰화, 정수 인코딩) -> padding -> RNN (Binary cls, sigmoid, cross-entropy loss function)

- 로이터 뉴스 분류하기: 11,258개 뉴스, 46개 뉴스 카테고리, 데이터 정제->토큰화,정수 인코딩 / (이미 데이터에서 완료되어있음) -> padding, 레이블 one-hot encoding -> LSTM(Ouput layer(softmax regression), activation(softmax function), loss function(entropy)

- IMDB 리뷰 감성분류: 데이터 정제->토큰화, 정수 인코딩 /(이미 데이터에서 완료되어있음)  -> padding -> GRU(output layer(logistic regression), activation(sigmoid), loss function(entropy)

- 네이버 영화 리뷰 감성 분류하기: 데이터 정제 -> 토큰화, 정수 인코딩 -> 패딩 -> LSTM

...

 


NLP를 위한 합성곱 신경망 (Convolution Neural Network)

- CNN (Convolution Layer + Pooling Layer) 기본 개념

CNN 관련 용어 (Convolution Layer, Channel, Kernel(Filter), Stride, feature map, pooling)

Convolution Layer, Pooling Layer

다층 퍼셉트론으로 이미지를 학습하게 되면 아래 그림을 input으로 들어올텐데, 이는 어떤 이미지였는지 알아보기 어렵다.

다층 퍼셉트로일 경우 이미지 input

결국엔 이미지를 분석할 시 공간적인 구조 정보(픽셀끼리의 연관)를 보존하면서 학습할 수 있는 방법이 필요해다. 이를 Convolution Layer가 가능케 한다.

 

Convolution layer 연산
Pooling

- 자연어 처리를 위한 1D CNN(1D Convolutional Neural Networks)

문장 -> matrix
1D CNN 연산과정
이진 분류를 위한 1D CNN

- 1D CNN을 이용한 문자 임베딩

* 문자 임베딩: understand <-> misunderstand, underestimate <-> misunderestimate / mis- 의 의미를 추측가능

1D CNN을 이용한 문자 임베딩

 


태깅 작업(Tagging Task)

태깅 작업: 각 단어가 어떤 유형에 속해있는지를 알아내는 작업.

- 개체명 인식(Named Entity Recognition): BIO 표현

- 품사 태깅(Part-of-Speech Tagging)

- LSTM + CRF(Conditional Random Field, BIO 순서 조건을 반영)


서브워드 토크나이저(Subword Tokenizer)

서브워드 분리(Subword segmenation) 작업은 하나의 단어는 더 작은 단위의 의미있는 여러 서브워드들(Ex) birthplace = birth + place)의 조합으로 구성된 경우가 많기 때문에, 하나의 단어를 여러 서브워드로 분리해서 단어를 인코딩 및 임베딩하겠다는 의도를 가진 전처리 작업이다. 이를 통해 OOV나 희귀 단어, 신조어와 같은 문제를 완화시킬 수 있습니다.

- BPE(Byte Pair Encoding): 압출 알고리즘, aaabdaaabac -> ZabdZabac -> XdXac

- 자연어 처리에서의 BPE: 모든 단어 글자(character) 단위로 분리 -> 글자 단위 vocabulary -> 함축

- 센텐스피스(SentencePiece): BPE를 포함하여 기타 서브워드 토크나이징 알고리즘들을 내장한 센텐스피스(SentencePiece)는 일반적으로 실무에서 선택할 수 있는 최선의 선택 중 하나입니다. 내부 단어 분리 알고리즘, 구글에서 만듬.

- 서브워드텍스트인코더(SubwordTextEncoder): Tensorflow에서 제공하는 API

- 허깅페이스 토크나이저: 다양한 서브워드 토크나이저를 제공, BERT에는 WordPiece Tokenizer가 사용, 이를 허깅페이스에서 구현하여 제공해준다. 그 외에도 BertWordPieceTokenizer , CharBPETokenizer , ByteLevelBPETokenizer , SentencePieceBPETokenizer  ... 등

 


RNN을 이용한 인코더-디코더

RNN의 다 대 일 구조로 텍스트 분류문제를 풀 수 있었고, 다 대 다 구조로 개체명 인식, 품사 태깅과 같은 문제를 풀 수 있었다. 이번 인코더-디코더는 2개의 RNN을 연결해서 사용한다.

* 언제 쓰는가?: 주로 입력 문장과 출력 문장의 길이가 다를 경우에 사용한다. 대표적으로 번역기, 텍스트 요약

- Sequence-to-Sequence, seq2seq: 챗봇(입력 시퀀스(질문), 출력 시퀀스(대답)), 번역기(입력 시퀀스(문장), 출력시퀀스(번역 문장)), STT, ... 

인코더: 입력 문장은 단어 토큰화를 통해 단어 단위로 쪼개지고 단어 토큰 각각은 각 시점의 입력이 된다.

디코더: 기본적으로 RNNLM(RNN Language Model)

워드 임베딩 추가

컨텍스트 벡터는 사실 인코더에서의 마지막 RNN 셀의 은닉 상태값을 말하는 것이며, 이는 입력 문장의 모든 단어 토큰들의 정보를 요약해서 담고있다고 할 수 있습니다.

 

- BLEU Score(Bilingual Evaluation Understudy Score): 언어 모델 평가 방법으로 펄플렉서티 존재, 기계번역에는 반영하기 어려움, 따라서 BLEU Score(기계 번역의 성능이 얼마나 뛰어난가). 측정 기준은 n-gram에 기반한다.


어텐션 메커니즘 (Attention Mechanism)

트랜스포머의 기반이 되는 어텐션 메커니즘에 대해서 학습합니다. RNN에 기반한 seq2seq 모델에는 크게 두 가지 문제가 있습니다. 첫째, 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 하니까 정보 손실이 발생합니다.  둘째, RNN의 고질적인 문제인 기울기 소실(vanishing gradient) 문제가 존재합니다. 결국 이는 기계 번역 분야에서 입력 문장이 길면 번역 품질이 떨어지는 현상으로 나타났습니다. 이를 위한 대안으로 입력 시퀀스가 길어지면 출력 시퀀스의 정확도가 떨어지는 것을 보정해주기 위한 등장한 기법인 어텐션(attention)을 소개합니다.

어텐션의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점(time step)마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 점입니다. 단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 보게 됩니다.

Dot-Product Attention

- Attention Score: 현재 디코더의 시점 t에서 단어를 예측하기 위해, 인코더의 모든 은닉 상태 각각이 디코더의 현 시점의 은닉 상태와 얼마나 유사한지를 판단하는 스코어 값

- Attention Distribution: Attention Score에 softmax를 적용하여 얻어낸 확률 분포. 위 그림의 빨간색 네모

- Attention Value: 각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 구함

- Bahdanau Attention

...이외에 다양한 종류의 Attention 방법들이 존재. 

 

** 어텐션 메커니즘을 사용하는 이유는 무엇일까요? RNN의 마지막 은닉 상태는 예측을 위해 사용됩니다. 그런데 이 RNN의 마지막 은닉 상태는 몇 가지 유용한 정보들을 손실한 상태입니다. 그래서 RNN이 time step을 지나며 손실했던 정보들을 다시 참고하고자 합니다.

 


트랜스포머(Transformer)

seq2seq 단점을 개선. 입력 시퀀스를 하나의 벡터로 압축하는 과정에서 입력 시퀀스의 정보가 일부 손실된다는 단점이 있다. 이를 보정하기 위해 어텐션이 사용되었다. 그런데 어텐션을 RNN의 보정을 위한 용도로써 사용하는 것이 아닌, 어텐션만으로 인코더와 디코더를 만들어 버리면 어떨까?

즉, RNN구조가 아닌 어텐션만으로 인코더-디코더 구조.

- Positional Encoding: RNN은 단어를 순차적으로 입력받아서 처리하는 특성으로 각 단어의 위치 정보를 가지고 있었지만, RNN을 안쓰는 경우에 다른 방식으로 알려주어야 한다. 

- Attention: 3가지 Attention이 사용된다. Encoder Self-Attention / Masked Decoder Self-Attention / Encoder-Decoder Attention

트랜스포머에서의 Attention 3가지

Encoder

Transfomer 논문에서는 총 6개의 인코더 층을 사용

인코더 구조

- Multi-head Self-Attention of Encoder: 셀프 어텐션을 병렬적으로 사용

 

[복습: 어텐션 개념]

어텐션 함수는 주어진 '쿼리(Query)'에 대해서 모든 '키(Key)'와의 유사도를 각각 구합니다. 그리고 구해낸 이 유사도를 가중치로 하여 키와 맵핑되어있는 각각의 '값(Value)'에 반영해줍니다. 그리고 유사도가 반영된 '값(Value)'을 모두 가중합하여 리턴합니다.

[셀프 어텐션 개념]

Querys, Keys, Values가 서로 동일한 대상임.

Q : 입력 문장의 모든 단어 벡터들
K : 입력 문장의 모든 단어 벡터들
V : 입력 문장의 모든 단어 벡터들

각 단어별로 Q,K,V 벡터를 얻어냄

 

멀티 헤드 어텐션

W는 훈련과정에 학습됌

Q, K, V 벡터를 얻었다면 지금부터는 기존에 배운 어텐션 메커니즘과 동일합니다. 각 Q벡터는 모든 K벡터에 대해서 어텐션 스코어를 구하고, 어텐션 분포를 구한 뒤에 이를 사용하여 모든 V벡터를 가중합하여 어텐션 값 또는 컨텍스트 벡터를 구하게 됩니다. 그리고 이를 모든 Q벡터에 대해서 반복합니다.

 

 

[셀프 어텐션 효과]

위의 그림은 트랜스포머에 대한 구글 AI 블로그 포스트에서 가져왔습니다. 위의 예시 문장을 번역하면 '그 동물은 길을 건너지 않았다. 왜냐하면 그것은 너무 피곤하였기 때문이다.' 라는 의미가 됩니다. 그런데 여기서 그것(it)에 해당하는 것은 과연 길(street)일까요? 동물(animal)일까요? 우리는 피곤한 주체가 동물이라는 것을 아주 쉽게 알 수 있지만 기계는 그렇지 않습니다. 하지만 셀프 어텐션은 입력 문장 내의 단어들끼리 유사도를 구하므로서 그것(it)이 동물(animal)과 연관되었을 확률이 높다는 것을 찾아냅니다.

 

 

 

- Position-wise Feed Forward Neural Network of Encoder: 일반적인 피드포워드 신경망

FFNN 식을 그림으로 표현

x는 멀티 헤드 어텐션의 결과로 나온 행렬을 말합니다.

인코더 간단한 구성

- 잔차 연결(Residual connection)과 층 정규화(Layer Normalization)

인코더 구성

Decoder

- Look-ahead mask

위 그림과 같이 디코더도 인코더와 동일하게 임베딩 층과 포지셔널 인코딩을 거친 후의 문장 행렬이 입력됩니다. 트랜스포머 또한 seq2seq와 마찬가지로 교사 강요(Teacher Forcing)을 사용하여 훈련되므로 학습 과정에서 디코더는 번역할 문장에 해당되는 <sos> je suis étudiant의 문장 행렬을 한 번에 입력받습니다. 그리고 디코더는 이 문장 행렬로부터 각 시점의 단어를 예측하도록 훈련됩니다.

여기서 문제가 있습니다. seq2seq의 디코더에 사용되는 RNN 계열의 신경망은 입력 단어를 매 시점마다 순차적으로 입력받으므로 다음 단어 예측에 현재 시점을 포함한 이전 시점에 입력된 단어들만 참고할 수 있습니다. 반면, 트랜스포머는 문장 행렬로 입력을 한 번에 받으므로 현재 시점의 단어를 예측하고자 할 때, 입력 문장 행렬로부터 미래 시점의 단어까지도 참고할 수 있는 현상이 발생합니다. 가령, suis를 예측해야 하는 시점이라고 해봅시다. RNN 계열의 seq2seq의 디코더라면 현재까지 디코더에 입력된 단어는 <sos>와 je뿐일 것입니다. 반면, 트랜스포머는 이미 문장 행렬로 <sos> je suis étudiant를 입력받았습니다.

이를 위해 트랜스포머의 디코더에서는 현재 시점의 예측에서 현재 시점보다 미래에 있는 단어들을 참고하지 못하도록 룩-어헤드 마스크(look-ahead mask)를 도입했습니다. 직역하면 '미리보기에 대한 마스크'입니다.

 

룩-어헤드 마스크(look-ahead mask)는 디코더의 첫번째 서브층에서 이루어집니다.

 

- 디코더의 두번째 서브층 : 인코더-디코더 어텐션

인코더의 첫번째 서브층 : Query = Key = Value
디코더의 첫번째 서브층 : Query = Key = Value
디코더의 두번째 서브층 : Query : 디코더 행렬 / Key = Value : 인코더 행렬

BERT(Bidirectional Encoder Representations from Transformers)

트랜스포머 계열이며, 사전 훈련된 언어 모델 중 가장 유명한 BERT

 

[백그라운드]

"사전 훈련된 단어 임베딩이 모든 NLP 실무자의 도구 상자에서 사전 훈련된 언어 모델로 대체되는 것은 시간 문제이다."

 

 한국어에는 '사과'라는 단어가 존재하는데 이 '사과'는 용서를 빈다는 의미로도 쓰이지만, 먹는 과일의 의미로도 사용됩니다. 그러나 임베딩 벡터는 '사과'라는 벡터에 하나의 벡터값을 맵핑하므로 이 두 가지 의미를 구분할 수 없었습니다. 이 한계는 사전 훈련된 언어 모델을 사용하므로서 극복할 수 있었으며 아래에서 언급할 ELMo나 BERT 등이 이러한 문제의 해결책입니다.

Elmo pretrained

ELMo는 순방향 언어 모델과 역방향 언어 모델을 각각 따로 학습시킨 후에, 이렇게 사전 학습된 언어 모델로부터 임베딩 값을 얻는다는 아이디어였습니다. 이러한 임베딩은 문맥에 따라서 임베딩 벡터값이 달라지므로, 기존 워드 임베딩인 Word2Vec이나 GloVe 등이 다의어를 구분할 수 없었던 문제점을 해결할 수 있었습니다. 

Transformer pretrained

언어의 문맥이라는 것은 실제로는 양방향입니다. 기존 언어 모델로는 양방향 구조를 도입할 수 없으므로, 양방향 구조를 도입하기 위해서 2018년에는 새로운 구조의 언어 모델이 탄생했는데 바로 마스크드 언어 모델입니다. 마스크드 언어 모델은 입력 텍스트의 단어 집합의 15%의 단어를 랜덤으로 마스킹(Masking)합니다. 여기서 마스킹이란 원래의 단어가 무엇이었는지 모르게 한다는 뜻입니다. 그리고 인공 신경망에게 이렇게 마스킹 된 단어들을(Masked words) 예측하도록 합니다. 문장 중간에 구멍을 뚫어놓고, 구멍에 들어갈 단어들을 예측하게 하는 식입니다. 

 

[버트 설명]

위의 그림은 BERT의 파인 튜닝 사례를 보여줍니다. 우리가 하고 싶은 태스크가 스팸 메일 분류라고 하였을 때, 이미 위키피디아 등으로 사전 학습된 BERT 위에 분류를 위한 신경망을 한 층 추가합니다. 

이전에 언급한 ELMo나 OpenAI GPT-1 등이 이러한 파인 튜닝 사례의 대표적인 예입니다.

 

- BERT의 기본 구조는 트랜스포머의 인코더를 쌓아올린 구조입니다.

- BERT는 단어보다 더 작은 단위로 쪼개는 서브워드 토크나이저를 사용합니다.

- 포지션 임베딩: 트랜스포머에서는 포지셔널 인코딩(Positional Encoding)이라는 방법을 통해서 단어의 위치 정보를 표현했습니다. 포지셔널 인코딩은 사인 함수와 코사인 함수를 사용하여 위치에 따라 다른 값을 가지는 행렬을 만들어 이를 단어 벡터들과 더하는 방법입니다. BERT에서는 이와 유사하지만, 위치 정보를 사인 함수와 코사인 함수로 만드는 것이 아닌 학습을 통해서 얻는 포지션 임베딩(Position Embedding)이라는 방법을 사용합니다.

실제 BERT에서는 문장의 최대 길이를 512로 하고 있으므로, 총 512개의 포지션 임베딩 벡터가 학습됩니다.

 

- Masked Language Model, MLM

입력 텍스트의 15%의 단어를 랜덤으로 마스킹(Masking)합니다.

15% : 80%의 단어들은 [MASK]로 변경한다., 10%의 단어들은 랜덤으로 단어가 변경된다, 10%의 단어들은 동일하게 둔다.

my dog is cute, he likes playing.

- Next Sentence Prediction, NSP

BERT의 입력으로 넣을 때에는 [SEP]라는 특별 토큰을 사용해서 문장을 구분합니다. 첫번째 문장의 끝에 [SEP] 토큰을 넣고, 두번째 문장이 끝나면 역시 [SEP] 토큰을 붙여줍니다. 그리고 이 두 문장이 실제 이어지는 문장인지 아닌지를 [CLS] 토큰의 위치의 출력층에서 이진 분류 문제를 풀도록 합니다. [CLS] 토큰은 BERT가 분류 문제를 풀기 위해 추가된 특별 토큰입니다. 

MLM, NSP 학습이 동시에 이루어진다.

BERT가 언어 모델 외에도 다음 문장 예측이라는 태스크를 학습하는 이유는 BERT가 풀고자 하는 태스크 중에서는 QA(Question Answering)나 NLI(Natural Language Inference)와 같이 두 문장의 관계를 이해하는 것이 중요한 태스크들이 있기 때문입니다.

 

- Segment Embedding

문장 구분을 위해서 BERT는 세그먼트 임베딩이라는 또 다른 임베딩 층(Embedding layer)을 사용합니다.

결론적으로 BERT는 총 3개 임베딩 층이 사용된다. WordPiece, Position, Segment

 

- 어텐션 마스크

어텐션 마스크는 BERT가 어텐션 연산을 할 때, 불필요하게 패딩 토큰에 대해서 어텐션을 하지 않도록 실제 단어와 패딩 토큰을 구분할 수 있도록 알려주는 입력입니다