부트캠프 프로젝트

S4 PJT - Day(3)

Atypical 2023. 2. 4. 18:05

으 서울 결혼식에 갔다가 부산 내려가는 중. 프로젝트 발표까지 남은 날짜는 단 이틀..!

한 것은...? 응 없어~ 복습~

Note 03: Language Modeling with RNN

  • 언어 모델에 대해 이해하고, 통계 기반 언어모델의 한계점을 설명할 수 있습니다.
    • 언어 모델이란 문장과 같은 단어 시퀀스에서 각 단어의 확률을 계산하는 모델
    • 통계적 언어 모델에서는 단어의 등장 횟수를 바탕으로 조건부 확률을 계산
    • 통계적 언어 모델은 횟수 기반으로 확률을 계산하기 때문에 희소성(Sparsity) 문제 가짐(실제로 사용되는 표현임에도 말뭉치에 등장하지 않았다는 이유로 많은 문장이 등장하지 못하게 되는 문제)
    • 이런 문제를 개선하기 위해서 N-gram 이나 스무딩(smoothing), 백오프(back-off)와 같은 방법이 고안
  • 순환 신경망(Recurrent Neural Network, RNN)의 구조, 작동 방식 및 한계점에 대해 설명할 수 있습니다.
    • 신경망 언어 모델에서는 횟수 기반 대신 Word2Vec이나 fastText 등의 출력값인 임베딩 벡터를 사용합니다.
      그렇기 때문에 말뭉치에 등장하지 않더라도 의미적, 문법적으로 유사한 단어라면 선택
    • 특정 시점에서의 은닉 벡터가 다음 시점의 입력 벡터로 다시 들어가는 과정을 나타내고 있습니다.
      출력 벡터가 다시 입력되는 특성 때문에 '순환(Recurrent) 신경망'
      1. one-to-many : 1개의 벡터를 받아 Sequential한 벡터를 반환합니다. 이미지를 입력받아 이를 설명하는 문장을 만들어내는 이미지 캡셔닝(Image captioning)에 사용됩니다.
      2. many-to-one : Sequential 벡터를 받아 1개의 벡터를 반환합니다. 문장이 긍정인지 부정인지를 판단하는 감성 분석(Sentiment analysis)에 사용됩니다.
      3. many-to-many(1) : Sequential 벡터를 모두 입력받은 뒤 Sequential 벡터를 출력합니다. 시퀀스-투-시퀀스(Sequence-to-Sequence, Seq2Seq) 구조라고도 부릅니다. 번역할 문장을 입력받아 번역된 문장을 내놓는 기계 번역(Machine translation)에 사용됩니다.
      4. many-to-many(2) : Sequential 벡터를 입력받는 즉시 Sequential 벡터를 출력합니다. 비디오를 프레임별로 분류(Video classification per frame)하는 곳에 사용됩니다.
    • RNN의 단점 1 : 벡터의 순차입력으로 인한 병렬화(parallelization) 불가능
    • RNN의 단점 2: 기울기 폭발(Exploding Gradient), 기울기 소실(Vanishing Gradient) - 역전파로 전달되는 tanh의 도함수가 최대값 1이고 그마저도 좁은 범위이다.
  • LSTM과 GRU가 고안된 배경과 구조를 연관지어 설명할 수 있으며, 두 모델의 차이에 대해서도 간략히 설명할 수 있습니다.
    • RNN에 기울기 정보 크기를 조절하기 위한 Gate를 추가한 모델을 LSTM
    • cell-state는 역전파 과정에서 활성화 함수를 거치지 않아 정보 손실이 없기 때문에
      뒷쪽 시퀀스의 정보에 비중을 결정할 수 있으면서 동시에 앞쪽 시퀀스의 정보를 완전히 잃지 않을 수 있습니다.
    • 간소화된 GRU : LSTM에서 있었던 cell-state, output gate가 사라짐.
    • Code : Keras를 이용한 RNN/LSTM 텍스트 감정 분류(Sentiment classification)
    • 파라미터 설정, data load/split, Sequence padding, Model build/fit/evaluate
    • Code2 : Keras를 이용한 LSTM 텍스트 생성기(니체의 글을 학습하여 비슷한 글을 생성)
    • Text load, corpus length, total chars 구함, sentences []에 패딩한 문장을 넣음.
    • Build LSTM model, 문장생성함수, Epoch마다 샘플 출력
  • Attention의 장점과 Attention 으로도 해결할 수 없는 RNN의 구조적 단점에 대해서 설명할 수 있습니다.
    • 아무리 LSTM, GRU가 장기 의존성 문제를 개선하였더라도 문장이 매우 길어지면(30-50 단어) 모든 단어 정보를 고정 길이의 hidden-state 벡터에 담기 어렵습니다.
    • Attention은 각 인코더의 Time-step 마다 생성되는 hidden-state 벡터를 간직합니다.
      입력 단어가 N개라면 N개의 hidden-state 벡터를 모두 간직하게 됩니다.
      모든 단어가 입력되면 생성된 hidden-state 벡터를 모두 디코더에 넘겨줍니다.
    • 디코더의 각 time-step 마다의 hidden-state 벡터는 쿼리(query)로 작용합니다.
      인코더에서 넘어온 N개의 hidden-state 벡터를 키(key)로 여기고 이들과의 연관성을 계산합니다.
      이 때 계산은 내적(dot-product)을 사용하고 내적의 결과를 Attention 가중치로 사용합니다.
    • 이 값에 소프트맥스(softmax) 함수를 취해줍니다.
    • 소프트맥스를 취하여 나온 값에 밸류(Value)에 해당하는 인코더에서 넘어온 hidden-state 벡터를 곱해줍니다.
    • 이 벡터를 모두 더해줍니다. 이 벡터의 성분 중에는 쿼리-키 연관성이 높은 밸류 벡터의 성분이 더 많이 들어있게 됩니다.
    • (그림에는 나와있지 않지만) 최종적으로 5에서 생성된 벡터와 디코더의 hidden-state 벡터를 사용하여 출력 단어를 결정하게 됩니다.
    • 디코더는 인코더에서 넘어온 모든 Hidden state 벡터에 대해 위와 같은 계산을 실시합니다.
      그렇기 때문에 Time-step마다 출력할 단어가 어떤 인코더의 어떤 단어 정보와 연관되어 있는지, 즉 어떤 단어에 집중(Attention)할 지를 알 수 있습니다.
    • Attention을 활용하면 디코더가 인코더에 입력되는 모든 단어의 정보를 활용할 수 있기 때문에 장기 의존성 문제를 해결할 수 있습니다.
    • 하지만 어텐션도 순차입력으로 인한 병렬화 불가능이라는 단점 존재.
  • RNN(LSTM) with Attention 코드 실습
    • 영어 - 스페인어 번역 예시모델 
    • seq2seq에서 decoder의 예측값이 아닌 실제 정답인 target을 다음 타임 스텝의 입력으로 넣어주는 방법을 Teacher Forcing이라고 합니다.
    • 장점
      • 만약 decoder가 엉뚱한 대답을 내놓더라도, 학습 시 실제 정답을 넣어주기 때문에 seq2seq 학습에 안정성을 더해줍니다.
    • 단점
      • 실제 학습과 추론 코드를 각각 구성해야 합니다.
      • 학습과 추론 사이의 괴리가 존재합니다.
  • 과제 : 캐글 데이터셋인 Women's E-Commerce Clothing Reviews 를 분류 (코드이용 : LSTM을 사용하여 Spam 메시지 분류를 수행한 캐글 노트북입니다. => Link)
    • 작업중..

Note 04: Transformer

  • 기존 RNN과 비교하여 Transformer가 가지는 장점에 대해서 설명할 수 있다.
    • RNN : 단어가 순차적으로 들어오면 연산 시간이 길어짐
    • TF : 모든 토큰을 동시에 입력받아 병렬 처리하기 때문에 GPU 연산에 최적화
    • 인코더 6블록과 디코더 6블록이 있는 구조
    • 인코더 블록은 크게 2개의 sub-layer ▶️ [Multi-Head (Self) Attention, Feed Forward] 로 나눌 수 있습니다.
    • 디코더 블록은 3개의 sub-layer ▶️ [Masked Multi-Head (Self) Attention, Multi-Head (Encoder-Decoder) Attention, Feed Forward] 
  • Positional Encoding을 적용하는 이유에 대해서 설명할 수 있다.
    • 병렬화를 위해 모든 단어 벡터를 동시에 입력받습니다.
      그렇게 되면 컴퓨터는 어떤 단어가 어디에 위치하는지 알 수 없는데요.
    • 컴퓨터가 단어의 위치를 알 수 있도록 위치 정보를 담은 벡터를 만드는 과정(sin, cos활용)
  • Self-attention Mechanism에 대해 이해하고 설명할 수 있다.
    • 번역하려는 문장 내부 요소의 관계를 잘 파악하기 위해서, 문장 자신에 대해 어텐션 메커니즘을 적용
    • 쿼리(q)는 분석하고자 하는 단어에 대한 가중치 벡터입니다.
      키(k)는 각 단어가 쿼리에 해당하는 단어와 얼마나 연관있는지를 비교하기 위한 가중치 벡터입니다.
      밸류(v)는 각 단어의 의미를 살려주기 위한 가중치 벡터입니다.
    • Self-Attention은 세 가지 가중치 벡터를 대상으로 어텐션을 적용합니다.(기존 Attention과 거의 동일)
    • 먼저, 특정 단어의 쿼리(q) 벡터와 모든 단어의 키(k) 벡터 내적 = Attention 스코어(Score)
    • 트랜스포머에서는 이 가중치를 q,k,v 벡터 차원 dk의 제곱근으로 나누어줍니다.
      계산값을 안정적으로 만들어주기 위한 계산 보정으로 생각해주시면 됩니다.
    • 다음으로 Softmax를 취해줍니다.
      이를 통해 쿼리에 해당하는 단어와 문장 내 다른 단어가 가지는 관계의 비율을 구할 수 있습니다.
    • 마지막으로 밸류(v) 각 단어의 벡터를 곱해준 후 모두 더하면 Self-Attention 과정이 마무리됩니다.
def scaled_dot_product_attention(q, k, v, mask):
    """
    Attention 가중치를 구하는 함수입니다.
    q, k, v 의 leading dimension은 동일해야 합니다.
    k, v의 penultimate dimension이 동일해야 합니다, i.e.: seq_len_k = seq_len_v.

    Mask는 타입(padding or look ahead)에 따라 다른 차원을 가질 수 있습니다.
    덧셈시에는 브로드캐스팅 될 수 있어야합니다.
    
    Args:
        q: query shape == (..., seq_len_q, depth)
        k: key shape == (..., seq_len_k, depth)
        v: value shape == (..., seq_len_v, depth_v)
        mask: Float tensor with shape broadcastable 
            to (..., seq_len_q, seq_len_k). Defaults to None.
        
    Returns:
        output, attention_weights
    """

    matmul_qk = tf.matmul(q, k, transpose_b=True)  # (..., seq_len_q, seq_len_k)
    
    # matmul_qk(쿼리와 키의 내적)을 dk의 제곱근으로 scaling 합니다.
    dk = tf.cast(tf.shape(k)[-1], tf.float32)
    scaled_attention_logits = matmul_qk / tf.math.sqrt(dk)

    # 마스킹을 진행합니다.
    if mask is not None:
        scaled_attention_logits += (mask * -1e9)  

    # 소프트맥스(softmax) 함수를 통해서 attention weight 를 구해봅시다.
    attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1)  # (..., seq_len_q, seq_len_k)

    output = tf.matmul(attention_weights, v)  # (..., seq_len_q, depth_v)

    return output, attention_weights
  • Multi-Head Attention 을 적용하면 여러 개의 Attention 메커니즘을 동시에 병렬적으로 실행합니다.
    각 Head 마다 다른 Attention 결과를 내어주기 때문에 앙상블과 유사한 효과를 얻을 수 있으며, 병렬화 효과를 극대화
  • 트랜스포머의 모든 sub-layer에서 출력된 벡터는 Layer normalization Skip connection을 거치게 됩니다. 
    • Layer normalization의 효과는 Batch normalization과 유사합니다. 학습이 훨씬 빠르고 잘 되도록 합니다.
      Skip connection(혹은 Residual connection)은 역전파 과정에서 정보가 소실되지 않도록 합니다.
  • 마지막으로 FFNN(Feed forward neural network) 로 들어갑니다.
    은닉층의 차원이 늘어났다가 다시 원래 차원으로 줄어드는 단순한 2층 신경망입니다.
  • Masked Self-Attention은 디코더 블록에서 사용하기 위해서 마스킹 과정이 포함된 Self-Attention
    • RNN과 달리 트랜스포머에서는 타깃 문장 역시 한 번에 입력되기 때문에
      해당 위치 타깃 단어 뒤에 위치한 단어는 Self-Attention에 영향을 주지 않도록 마스킹(Masking)을 해주게 됩니다.
    • Masked Self-Attention 에서는 Softmax를 취해주기 전, 가려주고자 하는 요소에만 −∞ 에 해당하는 매우 작은 수를 더해줍니다.
  • 디코더에서 Masked Self-Attention 층을 지난 벡터는 Encoder-Decoder Attention 층으로 들어갑니다.
    좋은 번역을 위해서는 번역할 문장과 번역된 문장 간의 관계 역시 중요합니다.
    번역할 문장과 번역되는 문장의 정보 관계를 엮어주는 부분이 바로 이 부분입니다.
    • 이 층에서는 디코더 블록의 Masked Self-Attention으로부터 출력된 벡터를 쿼리(Q) 벡터로 사용합니다.
      키(K)와 밸류(V) 벡터는 최상위(=6번째) 인코더 블록에서 사용했던 값을 그대로 가져와서 사용합니다.
      Encoder-Decoder Attention 층의 계산 과정은 Self-Attention 했던 것과 동일합니다.
  • 노트 code(1) : 스페인어와 영어 번역 Transformer model
  • 노트 code(2) : 리뷰 분류 TR model

< Level 2 >

  • 사전 학습된 언어 모델(Pre-trained LM)의 Pre-training과 Fine-tuning은 무엇이고 각각 어떤 종류의 데이터셋을 사용하는 지 설명할 수 있다.
    • 전이 학습(Transfer Learning)이라고도 함 = Pre-training + Fine-tuning
    • Pre-training : 책을 많이 읽는 것처럼 레이블링 되지 않은 데이터를 모델이 학습
    • Fine Tuning : 사전학습이 끝난 모델에 하고자하는 태스크에 특화된 데이터(레이블링된)를 학습
  • GPT, BERT는 Transformer를 어떻게 변형한 것인지와 두 구조의 차이가 무엇인지 설명할 수 있다.
    • GPT : 트랜스포머의 디코더 블록만 12개 사용. 그래서 Encoder-Decoder Attention층이 빠지고 Masked Self-Attention, Feed-Forward층만 존재
      • Pre-training : 레이블링 되지않은 대량의 말뭉치에 대해 로그 우도(?)를 최대화 하는 방향으로 학습
      • Fine-Tuning : Task가 달라져도 입력데이터만 바뀌고 모델 구조는 동일하다. 라벨을 맞추는 방향으로 로그우도 최대화
      • NLI / QA / 분류 등에서 높은 성능 달성. = 사전학습 모델에 트랜스포머 구조가 좋은 성능 증명 
    •  BERT : (Bidirectional Encoder Representation by Transformer) 2018년 10월 구글에서 발표한 모델
      • BERT는 트랜스포머의 인코더만을 사용하여 문맥을 양방향(Bidirectional)으로 읽어냅니다.
      • [CLS] : Classification
        [CLS] 토큰은 입력의 맨 앞에 위치하는 토큰입니다.
        아래에서 등장할 NSP(Next Sentence Prediction)이라는 학습을 위해 존재
      • [SEP] : Separation
        BERT는 사전 학습 시에 텍스트를 2부분으로 나누어 넣게 됩니다.
        [SEP] 토큰은 첫 번째 부분의 끝자리와 두 번째 부분의 끝자리에 위치합니다.
      • Input Vector : Token Embeddings, Segment Embeddings, Position Embeddings
        BERT는 3종류의 임베딩 벡터를 모두 더하여 모델에 입력합니다.
        • Token Embeddings : 단어를 나타내는 임베딩입니다. Word2Vec, GloVe, FastText 등으로 사전 학습된 임베딩 벡터를 사용합니다.
        • Segment Embeddings : 첫 번째 부분과 두 번째 부분을 구분하기 위한 임베딩입니다.
          [CLS] 부터 첫 번째 [SEP] 까지 동일한 벡터를 적용하고, 다음 토큰부터 두 번째 [SEP] 까지 동일한 벡터를 적용합니다.
        • Positional Embeddings : 단어의 위치를 나타내기 위한 임베딩입니다.
  • BERT 사전 학습 방법인 MLM(Masked Language Model) 과 NSP(Next Sentence Prediction)에 대해 설명할 수 있다.
    • MLM : 빈칸 채우기를 하면서 단어를 학습합니다.
      BERT는 사전 학습 과정에서 레이블링 되지 않은 말뭉치 중에서 랜덤으로 15%가량의 단어를 마스킹합니다.
      그리고 마스킹된 위치에 원래 있던 단어를 예측하는 방식으로 학습을 진행합니다.
    • NSP : 모델이 문맥에 맞는 이야기를 하는지 아니면 동문서답을 하는지를 판단하며 학습하는 방식입니다.
      위에서 알아본 [SEP] 토큰 왼쪽의 문장과 오른쪽의 문장이 바로 이어지는 문장일 경우 [CLS] 토큰의 출력이 IsNext 로 되도록 학습합니다.
      두 문장이 이어지지 않는 쌍일 경우에는 출력 벡터가 NotNext 로 나오도록 학습합니다.
      • NSP 역시 간단한 아이디어입니다.
        모델이 문장과 문장 사이의 관계를 학습할 수 있도록 함으로써 질의응답(QA), 자연어 추론(NLI) 등,
        문장 관계를 이해해야만 하는 복잡한 태스크에서 좋은 성능을 나타내는 역할을 하였습니다.
    • BERT Fine-Tuning : GPT처럼 모델의 구조는 그대로 유지한테 데이터만 다르게 주입.

< Level 3 >

  • GPT, BERT 이후의 NLP 모델 연구 방향과 해당하는 모델의 이름을 나열할 수 있다.
    • 1) 더 큰 모델 만들기 : 2020년 6월에 발표된 GPT-3의 파라미터 개수는 약 1750억 개로 위 그림에 나와있는 T-NLG보다도 10배나 많습니다. 
    • 2) 더 좋은 학습 방법 적용하기
      • 트랜스포머의 디코더 블록만을 사용한 GPT는 상대적으로 자연어 생성과 관련된 태스크에,
        인코더 블록만을 사용한 BERT는 자연어 이해와 관련된 태스크에 특화되어 있습니다.
      • GPT와 같이 순차적으로 자연어를 생성하는 모델에는 AR(Auto-Regressive)한 방법이 적용되었다고 하고,
        BERT와 같이 노이즈를 맞추어가는 방식으로 자연어를 이해하는 모델에는 AE(Auto-Encoder)한 방법 적용
      • 두 모델이 사용했던 방법을 결합(AE+AR)한 모델로 XLNet이나 BART가 있습니다.
        두 모델 모두 자연어 이해와 생성 모두에서 좋은 성능을 보이며 특히 BART는 요약 태스크에서 좋은 성능
      • 다른 방향의 개선으로는 BERT의 Noising 방법을 어렵게 만든 모델들이 있습니다. (마스킹이겠지)
    • 3) 보다 가벼운 모델 만들기
      • GPT와 BERT 기본 모델이라도 크기가 꽤 크다 보니 사이즈를 줄이되 성능은 보전하는 경량화로도 많은 연구가 진행되고 있습니다.
      • DistillBERT, ALBERT(A Light BERT) 나 ELECTRA
    • 다양한 태스크를 수행할 수 있는 모델 (Meta Learning)
    • 다국어(Multilingual) 모델
    • 자연어를 넘어(1) : 컴퓨터 비전(Computer Vision, CV)에서의 트랜스포머
    • 자연어를 넘어(2) : 멀티 모달(Multi-modal) 모델 - OpenAI에서 DALL-E 와 CLIP