시퀀스 투 시퀀스 -> 시퀀스 투 시퀀스 위드 어텐션 -> 트랜스포머(인코터 + 디코더) -> BERT/GPT

1. 시퀀스-투-시퀀스(Sequence-to-Sequence)


seq2seq = 인코더 + CONTEXT VECTOR + 디코더
- 인코더
입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에 마지막에 이 모든 단어 정보들을 압축
- 디코더
컨텍스트 벡터를 받아서 번역된 단어를 한 개씩(시퀀스) 순차적으로 출력
- CONTEXT VECTOR

문장의 길이 상관없이 고정 -> 입력 문장이 길 수록 정보 손실 문제
자연어 처리에서 텍스트를 벡터로 바꾸는 방법으로 주로 워드 임베딩이 사용

인코더 아키텍처(입력 문장을 받는 RNN 셀), 디코더 아키텍처(출력 문장을 출력하는 RNN 셀) = RNN 아키텍처
-입력 문장은 단어 토큰화를 통해서 단어 단위로 쪼개지고 단어 토큰 각각은 RNN 셀의 각 시점의 입력
-인코더 RNN 셀은 모든 단어를 입력받은 뒤에 인코더 RNN 셀의 마지막 시점의 은닉 상태를 디코더 RNN 셀로
-컨텍스트 벡터는 디코더 RNN 셀의 첫번째 은닉 상태에 사용

훈련 과정과 테스트 과정(또는 실제 번역기를 사람이 쓸 때)의 작동 방식 다름.
- 훈련 과정
디코더에게 인코더가 보낸 컨텍스트 벡터와 실제 정답인 상황인 <sos> je suis étudiant를 입력 받았을 때, je suis étudiant <eos>가 나와야 된다고 정답을 알려주면서 훈련
=> 교사 강요(teacher forcing)
학습할 때 출력이 잘 못 나오면 다음 예측 결과에 영향을 미치기 때문에
잘 못 예측 된다면 우리가 가지고있는 정답을 입력으로 삼아서 다음 입력으로 전달해서 학습
- 테스트 과정
앞서 설명한 과정과 같이 디코더는 오직 컨텍스트 벡터와 <sos>만을 입력으로 받은 후에 다음에 올 단어를 예측하고, 그 단어를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복
💡LSTM vs seq2seq
LSTM : 입력 문장 단어 개수 = 출력 문장 단어 개수
seq2seq : 입출력 문장의 단어 개수가 다르다. -> 번역기 만들 수 있음.
💡매커니즘이 rnn이라 한계점이 있음
(1)컨텍스트 벡터 크기 고정
-> 매우 긴 문장이 입력으로 들어오면 컨텍스트 벡터(문장의 의미를 담은 벡터)는 긴문장 상관없이 4차원으로 표현되어 정보의 손실이 큼. 번역기를 만들어도 제대로 번역이 될 가능성 낮음
(2)LSTM 기반이라 RNN의 단점 -> 층이 깊어질 수 록 기울기가 사라지는 문제점
💡해결방법 -> 문장이 길어져도 출력되는 문장의 정확성이 떨어지는 것을 방지
= 어텐션(attention)
2.seq2seq + 어텐션(attention)
참고: https://lena-voita.github.io/nlp_course/seq2seq_and_attention.html

어텐션(attention)

번역시 어떤 특정 단어에 집중해 번역 정확도를 올리는 방법
입력 시퀀스가 길어져도 출력 시퀀스의 정확도를 올릴 수 있음.
->번역 과정에서 출력단어를 예측할 때 단순히 컨텍스트 벡터에서 전달된 것을 바탕으로 예측, 출력하는 것이아니라
인코더 쪽에서 전체 문장을 한번더 확인한다.
전체 구성 문장을 동일한 어텐션으로 보는 것이 아니라 시점마다 예측 해야할 단어와 관련 깊은 입력단어에 어텐션한다.
어텐션 스코어(Attention Score) -> 내적(dot product) = 닷-프로덕트 어텐션(Dot-Product Attention)
(1)어텐션 스코어(Attention Score)
현재 디코더의 시점 t에서 단어를 예측하기 위해, 인코더의 모든 은닉 상태 각각이 디코더의 현 시점의 은닉 상태와 얼마나 유사한지를 판단하는 스코어값

(2)소프트맥스(softmax) 함수를 통해 어텐션 분포(Attention Distribution) 구하기
어텐션 스코어에 소프트맥스 함수를 적용하여, 모든 값을 합하면 1이 되는 확률 분포
어텐션 가중치(Attention Weight) 모음 = 어텐션 분포(Attention Distribution)
(3)각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값(Attention Value) 구하기
각 인코더의 은닉 상태와 어텐션 가중치값들을 곱하고, 최종적으로 모두 더하기
(4)어텐션 값과 디코더의 t 시점의 은닉 상태를 연결

(5) 출력층 연산의 입력 구하기


(6)출력층의 입력으로 사용하기

Self Attention(인코더에서 하는 어텐션)
Self Attention 참고: https://jalammar.github.io/illustrated-transformer/
현재 단어와 주변단어들의 관계를 알 수 있는 기법 -> 각 단어의 중요도 계산
추상적 요약 등에서 좋은 성과
ex) 한국어 번역

쿼리와 키를 행렬 곱셈
-> 해당행렬의 모든 요소 값을 키에 대한 차원의 제곱근을 취한 값으로 나눠주기
-> 행 단위로 softmax(확률 값으로 변환해주는 함수, 0과 1사이)하고 스코어 행렬을 계산
ex)입력 문장과 it의 단어 유사도를 알고 animal이라는 확률을 표현

it 과 관련이 깊은 단어는?
다양한 각도에서 it의 의미를 살펴보자
it 단어의 관련이 되는 주요 단어가 무엇인가를 알고 있음
다각도로 보면 it이 animal, street 등 과 관련이 있다.
다양한 각도를 표현하는 것 -> self attention

3.트랜스포머(Transformer)
transfomer 동작방식: 인코더와 디코터 입력시 정답에 해당하는 단어의 확률을 최대로 높이는 것

어텐션을 RNN의 보정을 위한 용도로서 사용하는 것이 아니라 기존의 seq2seq의 구조인 인코더-디코더를 따르면서도, 논문의 이름처럼 어텐션(Attention)만으로 구현한 모델, LSTM간의 연결을 끊고 위로 올라가는 출력만 있음.
트랜스포머에서는 어텐션을 사용할 때, 한 번 하는 것 보다 여러 개로 분할해서 병렬로 어텐션을 수행하고 결과값을 다시 하나로 합치는 방식 -> 빠르게 수행가능
포지셔널 인코딩 값 -> 사인, 코사인 -> 각각 단어 위치 표현 가능 (단어의 순서 정보 + 단어의 위치 정보)


💡seq2seq vs 트랜스포머
seq2seq : 인코더와 디코더에서 각각 하나의 RNN이 t개의 시점(time step)을 가지는 구조였다면
트랜스포머 : 인코더와 디코더라는 단위가 N개로 구성되는 구조
인코더/디코더의 개수가 모델의 층처럼 작용 ex) 인코더/디코더 6개 -> 층 6개
4.BERT / GPT
딥러닝 기반 자연어 처리 모델
문서분류, 감정분류, 질의응답(챗봇), 개체명 인식(NER) 등
+) 개체명 인식(NER): “삼성” 단어를 보고 기업이름인지 무엇인지 인식시키는 것을 말함.
(1)BERT (Bidirectional Encoder Representations From Transformer)
(2)GPT(Generative kPre-trained Transformer)
BERT / GPT는 Transfer Learning
특정 용도에 맞춰 이미 학습된(upstream task) 모델을 다른 용도로 재사용(downstream task)할 수 있는 기법
학습 속도 단축, 비용 단축, 정확도 높음
업스트림 태스크(upstream task)
다음 단어 예측(GPT), 빈칸 채우기(BERT). 코퍼스의 문맥을 이해하는 문제
upstream task를 바탕으로 학습하는 것을 -> pre-trained model
pre-trained model을 사용하는 이유: 사전 학습된 모델을 재사용하여 성능을 극대화(downstream task를 잘하기 위해)
ex)
GPT(문장 생성에 적합) : 앞에 있는 문맥이 주어지고 코퍼스상의 구문을 학습한다. 학습을 토대로 우리땅이라는 단어가 나오도록 학습한다.
반복적으로 학습하면 이전 문맥을 고려하여 다음 문장이 무엇이 나와야하는지 자연스럽게 알 수 있음. -> 문맥을 풍부하게 이해 가능
독도는 우리땅. -> 독도는 경상북도에 속한다.
BERT(문서 분류에 적합): 빈칸에 무엇이 들어가야하는 지를 중심으로 학습한다.
독도는 _____땅
빈칸 채우기로 만들어진 모델 -> Masked 언어 모델
- 업스트림 태스크를 학습하는 과정
(1) pre-trained
다운스트림 태스크(downstream task)
문서 분류, 개체명 인식 등 구체적인 자연어 문제
- 다운스트림 태스크를 학습하는 과정
(1)파인튜닝(fine-tuning)
pre-trained model의 가중치를 task에 맞춰 모델 전체가 업데이트 하는 것

데이터를 재설계 -> 목적에 따른 추가 학습 데이터의 구조가 다름
(2)프롬프트 튜닝(prompt tuning)
pre-trained model의 가중치를 task에 맞춰 모델 일부만 업데이트 하는 것
(3)인컨텍스트 러닝(in-context learning)
다운스트림 태스크 데이터의 일부만 사용, 모델을 업데이트 하지 않음.
- few-shot 러닝 : 다운 스트림 테스트 데이터 몇 건만 사용
ex)사진 몇 장으로 나를 학습
- Zero-shot 러닝: 다운 스트림 테스트 데이터 전혀 사용 안함
ex)나를 학습시키고 싶은데 사진 한 장도 없음
- One-shot 러닝: 다운 스트림 테스트 데이터 한 건만 사용
ex)증명사진 하나로 나를 학습
5.서브워드 토크나이저(Subword Tokenizer)
하나의 단어는 더 작은 단위의 의미있는 여러 서브워드들의 조합으로 구성
하나의 단어를 여러 서브워드로 분리해서 단어를 인코딩 및 임베딩
💡OOV나 희귀 단어, 신조어와 같은 문제를 완화
(1) 바이트 페어 인코딩(Byte Pair Encoding, BPE)
가장 많이 등장하는 문장(서브워드)을 압축해서 단어 집합에 추가
ex)
aaabbaabb(a,b,c)
aa 가 가장 많이 등장 -> 다른 문자로 치환 = xabbxbb
bb -> y = xayxy
xayxy(x, a, y)
aaabdaaabac(a,b,c,d)
aa -> X = XabdXabac
ab -> Y = XYdXYac
XY -> Z = ZdZac
OOV(Out Of Voc): 단어가 사전에 없는 경우 -> 다른 값으로 인코딩되도록 설정해야함.
ex)
데이터로 단어 빈도수 조사
low: 5, lower: 2, newest: 6, widest: 3
학습 과정에서 단어 집합 구성
단어 집합 - low: 5, lower: 2, newest: 6, widest: 3
단어 집합에 없는 단어 등장
lowest 입력 -> OOV 문제 발생
글자 단위로 모두 쪼개기 -> l,o,w,e,r,n,s,t,i,d
가장 빈도수가 높은 문자의 쌍 -> ow, es
치환하기 ->
low -> l o w
lower -> l o w e r
newest -> n e w es t
widest -> w i d es t
low -> l o w
lower -> l o w e r
newest -> n e w est
widest -> w i d est
low -> lo w
lower -> lo w e r
newest -> n e w est
widest -> w i d est
...
반복
...
최종 인코딩 결과(사전) = l, o, w, e, r, n, s, t, i, d, es, est, lo, low, ne, new, newest, wi, wid, widest
lowest 입력시 -> OOV -> 글자 단위로 나누기 l,o,w,e,s,t -> low, e, s,t (가장 긴 것부터 참조하기) -> low, est
(2) 서브워드텍스트인코더(SubwordTextEncoder)
바이트쌍 인코딩과 비슷, 코퍼스에서 자주 등장한 문자열을 토큰화
문자열을 합치는 기준이 다름 -> 바이트 쌍 인코딩 = 빈도를 기준
->워드 피스 인코딩 = likelihood가 가장 높은 문자 쌍을 기준으로 합치기
likelihood 결과값이 큰 값에 해당되는 쌍부터 합치기
내가 가지고 있는 코퍼스에서 a, b문자에 대해 계산
(ab 문자열의 빈도수 / 전체 글자수) / ((a 문자열 빈도수 / 전체 글자수)*(b문자열 빈도수 / 전체 글자수))
(ab 문자열의 빈도수 / 전체 글자수)가 높음 -> ab가 자주 등장한다. 자주 동시에 등장을 해야함!!!
((a 문자열 빈도수 / 전체 글자수)*(b문자열 빈도수 / 전체 글자수))
(3) 센텐스피스(SentencePiece)
바이트 단위로 인코딩 + 유니그램
언어의 종류에 상관없이 잘 동작
(4) 허깅페이스 토크나이저(Huggingface Tokenizer)
자주 등장하는 서브 워드들을 하나의 토큰으로 토큰화
'자연어처리(NLP) & CHAT GPT > NLP' 카테고리의 다른 글
| [NLP] BERT (0) | 2023.08.09 |
|---|---|
| [NLP] Seq2Seq - 실습 (0) | 2023.08.08 |
| [NLP] 워드 임베딩(Word Embedding), RNN - 실습 (0) | 2023.08.05 |
| [NLP] 워드 임베딩(Word Embedding) - 개념 (0) | 2023.08.04 |
| [NLP] LSTM (0) | 2023.08.03 |