본문 바로가기

Data Science/4. 딥러닝

[n424]Transformer and BERT, GPT

■ Key words

  ㆍAttention이 결합된 Seq2Seq

     - Teacher Forcing

  ㆍTransformer

     - self-attention

     - Positional Encoding

   ※ 사전 학습 언어 모델(Pre-trained Language Model)

     - Pre-training

     - Fine-tuning

  ㆍGPT(Generative Pre-Training)

     - GPT의 구조

     - 사전 학습 언어 모델(Pre-trained Language Model)

       · Pre-training

       · Fine-tuning

  ㆍBERT(Bidirectional Encoder Representation by Transformer)

     - BERT의 구조

     - 사전 학습 언어 모델(Pre-trained Language Model)

       · MLM(Masked Self-Attention)

       · NSP(Next Sentence Prediction)

 

■ 주요내용

  ㆍAttention이 결합된 Seq2Seq

     - Teacher Forcing

  ㆍTransformer - Attention is all you need 

     - RNN 모델이 순서대로 입력 받기 때문에 처리해야 하는 sequence가 길수록 연산이 길어지는 문제를

       해결하기 위해 등장.

     - 모든 토큰을 행렬로 동시에 입력받아 병렬연산이 가능하기 때문에 GPU 연산에 최적화 되어있음.

     - 각 6개의 encoder와 decoder로 구성. 

       · encoder : Masked Multi-Head(Self) Attention, Feed Forward 2개의 sub-layer로 구성

       · decoder : Masked Multi-Head(Self) Attention, Multi-Head(Encoder-Decoder) Attention, Feed Forward

                      3개의 sub-layer로 구성

     - Positional Encoding(위치 인코딩) : 병렬화를 위해 모든 단어 벡터를 동시에 입력 받으므로 컴퓨터가 각

       단어의 상대적인 위치를 인지할 수 있도록 sin 함수를 이용하여 별도의 벡터를 만드는 과정

     - Self-Attention : 지시대명사가 문장 내에서 어떤 것을 지칭하는지 이해하기 위해 문장 내부 요소 관계 파악을 

                            파악하기 위한 문장 자신에 대해 적용하는 메커니즘

     * Self-Attention의 가중치 벡터 구성

       · Query : 분석하고자 하는 단어에 대한 가중치 벡터

       · Key : 각 단어가 쿼리에 해당하는 단어와 얼마나 연관있는 지 비교를 위한 가중치 벡터

       · Value : 각 단어의 의미(뜻) 연결을 위한 가중치 벡처

     * Self-Attention 작동 방식

       · 특정 단어의 Query(q) 벡터와 모든 단어의 key(k) 벡터를 내적하여 Score 구하기

       · Score를 q, k, v 벡터의 차원인 dk의 제곱근으로 나누어 보정하여 계산값을 안정적으로 만들기

         → 일반화(normalization)와 같이 score가 1이 넘지 않도록 나눠주는 것 

       · Softmax를 취하여 query에 해당하는 단어와 문장 내 다른 단어가 가지는 관계의 비율(확률) 구하기

       · Softmax 결과값에 Value(v) 각 단어의  벡터를 곱한 후 더하여 가중합 구하기

     ▶ Encoder

     - Multi-Head Attention : Self-Attention을 동시에 여러 개 실행하는 것. 각 Head 마다 다른 Attention 결과를

                                     내어주기 때문에 ensemble과 같은 효과를 얻을 수 있음.

       · 각 head에서 출력된 결과물인 행렬 Zn을 이어붙인(concatenate) 후 또 다른 파라미터 행렬인 Wº와의

         내적을 통해 최종 결과물인 행렬 Z 출력(Wº은 학습을 통해 갱신됨)

         ⇒ 행렬 Z는 토큰 벡터(input 행렬)로 이루어진 행렬 X와 동일한 크기(shape)로 변경됨.

     - Layer Normalization & Skip Connection(Residula Connection) : 모든 sub-layer에서 출력 시 거치는 단계

       · Layer Normalization : Batch Normalization과 유사. 학습을 빠르게 하고, 성능을 향상시킴

       · Skip Connection(Residual Connection) : 역전파 과정에서 정보 소실이 일어나지 않도록 함(ResNet 참조)

     - Feed Forward Neural Network(FFNN) : 은닉층의 차원이 늘어났다가 다시 원래 차원으로 줄어드는

                                                          단순한 2층 신경망. 활성화 함수는 ReLu 사용

     ▶ Decoder

     - Masked Self-Attention : Decoder block 소속. 타겟(query) 단어 이후의 단어가 영향을 주지 않도록 masking. 

       Decoder가 Auto Regressive하게 단어를 생성하기 때문에 타겟 이후의 단어는 보지 않고 나올 단어를 예측해야 함.

       · 가려주고자 하는 요소(타겟 이후에 나오는 단어)에 -∞에 가까운 수를 더해 softmax에서 값이 0이 나오도록 함

     - Encoder-Decoder Attention : 번역할 문장과 번역되는 문장의 정보관계를 엮어주는 단계.

       · Query(q) : Decoder의 Masked Self-Attention으로부터 출력된 벡터(번역 결과물 언어)

       · Key(k), Value(v) : Encoder (6번쨰)최상위 블록에서 사용했던 값 사용(번역 대상 언어)

     - Linear & Softmax Layer : Decoder의 (6번쨰)최상층을 통과한 벡터들은 Linear층을 지난 후

                                        Softmax를 통해 예측할 단어의 확률을 구함

  ※ 사전 학습 언어 모델(Pre-trained Language Model) : 대량의 데이터를 사용하여 미리 학습한 후 필요한

     데이터를 추가 학습시켜 모델의 성능을 최적화한 모델

     - 사전학습(Pre-training) : labeling 되지 않은 대량의 데이터를 사용하여 미리 학습하는 것.

                                      전이학습(Tranfer Learning)이라고도 함.

     - Fine-tuning : 업무에 특화된(Task Specific) 필요한 데이터를 추가학습시켜 모델의 성능을 최적화하는 것.

  ㆍGPT(Generative Pre-Training) : 자연어 추론(NLI), 질의응답(QnA), 분류(Classification) task에 높은 성능

     - GPT의 구조 : 12개의 decoder block 사용. encoder가 없어 2개의 sub-layer로 구성(encoder-decoder Attention X)

     - 사전학습 : 레이블링 되지 않은 대량의 말뭉치에 대해 log 우도함수 L1을 최대화하는 방향으로 학습.

                     다음에 올 단어를 계속해서 맞추는 방식으로 학습.

     - Fine-tuning : task가 달라져도 data 입력 방식만을 변경시키고, 모델 구조는 일정하도록 설계

  ㆍBERT(Bidirectional Encoder Representation by Transformer) : Transformer Encoder만 사용, 문맥을 양방향으로 읽음

     - BERT의 구조 : Encoder 12개로 이뤄짐 / 감성분석, 질의응답, 품사태깅, 개체명 인식 등 문맥 확인에 활용함

       * BERT의 Special Token

       · CLS(Classification) : 입력(input)의 맨 앞에 위치. NSP(Next Sentence Prediction) 학습을 위해 존재.

       · SEP(Sepration) : 첫 문장의 끝자리와 두 번째 문장의 끝자리에 위치.

       * BERT의 3가지 Embedding

       · Token Embeddings : 단어를 나타내는 embedding. Word2Vec, GloVe, fastText 등으로 사전학습된

                                    embedding vector 사용.

       · Segment Embeddings : 두 문장의 첫 번째 부분과 두 번째 부분을 구분하기 위한 embedding

       · Positional Embeddings : 단어의 위치를 나타내기 위한 embedding

     - BERT의 사전 학습 방법들

       · MLM(Masked Self-Attention) : Labeling되지 않은 corpus의 15%가량을 masking하여 빈칸 채우기를 통한

                                                단어학습. 양쪽 문맥을 동시에 볼 수 있어서 단어의 문맥적 의미 학습 가능.

       · NSP(Next Sentence Prediction) : 두 문장이 문맥에 맞아 이어지는 문장인지 여부를 판단.

                                                   질의응답(QnA), 자연어 추론(NLI) 등 문장관계 이해가 필요한 task에 성능 발휘.

     - Fine-tuning : BERT 역시 모델의 구조는 그대로 유지한 채 데이터 입력하는 형태만 바꾸어서 fine-tuning함

       ⇒ Sentence 쌍 분류 / 감성분석 / 질의응답 / 품사 태깅(POS tagging), 개체명 인식(Named Entity Recognition,

           NER) 등에 사용

  ㆍPost BERT(최근 NLP 연구방향)

     - 더 큰 모델 : GPT-3

     - 더 좋은 학습방법 적용

       · AE(Auto-Encoder)+AR(Auto-Regressive) : 자연어 이해와 생성, XLNet, BART 등

       · Noising 방법(masking 등)을 어렵게 : SpanBERT, RoBERTa

     - 경량화 모델 : 파라미터 줄이며 성능 보존 / DistillBERT, ALBERT(A Light BERT), ELECTRA 등

     - 다양한 task 수행 : Meta Learning : Finetuning / zero-shot learning / one-shot learning / few-shot learning / 

                               Multilinual model / computer vision / Multi-modal(DALL-E, CLIP / 기계와 소통) 등

 

■ Session note

ㅁ 오전 session
  ㆍRNN의 단점 : 기울기 소실(LSTM, GRU로 해결) / 병렬화 불가(Transformer로 해결)
  ㆍTransformer : 모든 토큰을 행렬로 동시에 입력받아 병렬 연산하여 GPU 연산에 최적화 되어있음
     - SOTA(State-of-the-Art)가 자연어 처리에 혁신을 가져옴
     - encoder(sub-layer 2개) : mulit-Head Attention + Feed Forward
     - Decoder(sub-layer 3개) : 
     - Positional Encoding : 행렬로 한 번에 정보를 입력받으므로 위치정보벡터를 별도로 입력해주어야 함(input embedding + 위치 벡터; transformer는 sine 함수 활용
     - Self-Attention : output vector가 고정되어 있으면 가 힘드므로, 문장 안에 있는 단어들 간의 관계를 확인
     - query : 분석하고자 하는 단어
     - key : 각각의 모든 단어
     - value : key의 의미
* transformer의 작업 단계 / self-attention 확인!!
1. embedding + 위치 벡터 입력
2. 각각의 단어의 query/key/value vector를 가중치를 이용하여 구해줌
3. 첫 번째 단어와 자기자신을 포함하여 내적을 이용하여 모든 단어와의 연관성을 학습(유사도 구하기); 스칼라값 출력 - 유사할 수록 큰 값 출력 → 차원의 제곱근으로 나눠줌(연산을 쉽게 하기 위해 보정 ≒ 정규화)
4. softmax 함수 적용을 통해 확률화
5. value(단어의 의미)와 확률값을 곱한 값들을 합하여 하나의 값으로 출력(zt)
6. 각각의 단어들의 self-attention 값을 구해 행렬로 출력
     ⇒ 모든 단어의 query, key, value를 행렬로 한 번에 연산하기 때문에 각각의 단어를 입력하여 연산할 필요가 없음
     ↔ RNN은 각각 단어를 하나씩 입력받아서 연산 했어야 함
    * Multi-head attention : ensemble 처럼 한 번만 연산을 하면 학습이 부족할 수 있으므로 8번을 한 번에 학습함
      → 단순합은 각각의 학습의 가중치가 다를 수 있기 때문에, 처음에 입력한 값과 같은 차원(모양)으로 만들기 위해 가중치를 조정하여 각각의 학습이 동일한 크기로 만들어줌
     - masked self-attention : 해당 단어의 앞쪽 단어만 연산에 반영되도록 뒤쪽 단어는 (-)로 만들어 가려줌(- value에 softmax를 적용한 확률은 0)
       · 마스킹을 하지 않으면 뒤에 나오는 단어를 참조하므로, leaking과 같이 되어 학습이 잘 안 됨
  ㆍEncoder-Decoder Attention : 입력한 언어 - 번역할 대상의 언어, 두 개 언어(영어-스페인어)의 Query/Key/Value를 연결해주는 작업
  ㆍGPT와 BERT는 transformer 구조를 활용하는 것
  ㆍ현업에서는 transformer의 구조를 가져와 변형하여 활용하는 경우가 많음
  * encoder → decoder에서 (입력언어 query * 번역될 언어 key)  * 번역될 언어 value
  ㆍencoder/decoder는 6개일 때 성능이 제일 좋은 것으로 연구결과 밝혀짐(논문 참조)
  * 과제 노트는 3번 객관식 참조
  ㆍencoder의 input embedding과 decoder의 output embedding은 컴퓨터가 자연어를 모르기 때문에 이해시키기 위함임
  * 학습과 사용은 별개임; 노트의 구조는 모델의 학습 구조임

ㅁ 오후 session
  ㆍRNN의 두 가지 문제
  ㆍTransformer : encoder / decoder
  ㆍencoder : multi-head attention / feed forward neural network(FFNN)
    * FFNN : 학습을 좀 더 잘하기 위해 사용 / ReLu를 활성화 함수로 사용
  ㆍdecoder : masked multi-head attention / encoder-decoder attention / feed forward neural network
  ㆍtransformer는 어떻게 rnn의 단점을 해소했을까 
    - RNN을 없앰
    - 행렬 연산을 통해 한 번에 연산
    - 동시 한 번에 입력 : positional encoding을 통해 위치 입력
  ㆍself attention : 문장 단어 사이의 관계를 파악하기 위함(연관성)
     - query : 분석하고자 하는 단어. 질문을 던지는 주체.
     - key : 각각의 단어들
     - value : key 각 단어들의 의미
  ㆍmulti-head attention : 일종의 ensemble 효과. 여러 관점에서 context를 파악하기 위함.
  ㆍmasked multi-head attention : 뒤에 나오는 단어는 가려서 번역을 원하는 언어 내 문장 단어 관계를 파악하기 위함. masking(- 1b)을 적용하여 softmax가 0이 나오게 함
  ㆍencoder-decoder attention : 번역할 언어(encoder)와 번역될 언어(decoder) 간 관계 파악
     - query : decoder / key, value : encoder
  ㆍGPT : decoder 12개 - 내보낼 것 중심
     - 사전학습 : 레이블링 되지 않은 데이터 학습 / 
                  문장의 다음에 나올 단어의 확률이 높아지도록 학습(한 방향으로 학습)
  ㆍBERT : encoder 12개 - 받아들이는 것 중심; 양쪽 문맥 모두 학습 가능
     * 사전학습 방법
     - MLM : 빈칸 채우기(앞뒤 문맥 확인)
     - NSP : 다음 문장 예측하기(두 문장이 다음에 나올 문장인지 아닌지 파악)
  ㆍ사전학습(전이학습, Pre-trained Model) : 미리 많이 학습시켜 놓고, 필요할 떄 모델을 가져다 쓰기
     - fine tuning : 해결하고자 하는 문제에 따라 가중치를 미세하게 조정
  ㆍ코드 : 시각화를 위해 attention_weight도 return(활용되진 않고, 연산에만 사용됨)

 

■ 주요함수

  ㆍmatmul : 행렬의 곱셈(벡터 내적)

 

■ Reference

  ㆍseq2seq + attention : https://youtu.be/WsQLdu2JMgI

  ㆍtransformer : https://youtu.be/mxGCEWOxfe8

  ㆍGPT : https://youtu.be/FeEmmylAF0o

  ㆍBERT : https://youtu.be/vo3cyr_8eDQ

  ㆍAttention mechanism : https://blog.naver.com/PostView.nhn?blogId=ckdgus1433&logNo=221608376139&parentCategoryNo=&categoryNo=12&viewDate=&isShowPopularPosts=true&from=search 

 

Attention Mechanism(seq2seq)

이번 시간에는 Neural Machine Translation 분야에서 사용되는 Attention Mechanism에 대해 알아보자....

blog.naver.com

  ㆍTransformer 구현하기 : https://paul-hyun.github.io/transformer-02/

 

Transformer (Attention Is All You Need) 구현하기 (2/3)

How to implement the transformer model

paul-hyun.github.io

  ㆍdiscriminate Vs. generative : https://ratsgo.github.io/generative%20model/2017/12/17/compare/

 

discriminative vs generative · ratsgo's blog

이번 글에서는 discriminative model과 generative model을 비교해보도록 하겠습니다. 이 글은 전인수 서울대 박사과정이 2017년 12월에 진행한 패스트캠퍼스 강의를 정리했음을 먼저 밝힙니다. 그럼 시작하

ratsgo.github.io