본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

47일차. 자연어 딥러닝 - Transformer & 자연어-이미지 멀티모달 - OCR(CRNN) & Vision - Generative Model

더보기

 

47일 차 회고.

 

 이번 주는 수업 내용도 어렵고 피곤하기도 해서 많이 힘들 것 같다. 그래도 이제 앞으로 2일만 더 나오면 주말이라서 더 힘을 내봐야 할 것 같다.

 

 

 

 

1. Transformer

 

 

1-1. Transformer

 

Seq2Seq vs Transformer

  • Seq2Seq
    • RNN을 사용한 Encoder(NLU)와 Decoder(NLG) 형태로 이루어져 있다.
      • 순서를 학습하기 때문에 RNN을 사용한다.
      • Attention을 사용하기 때문에 RNN을 사용한다.
    • Encoder 연산이 끝난 후에 Decoder 연산이 시작된다.
      • 학습이 오래 걸린다.
  • Transformer
    • Encoder(NLU)와 Decoder(NLG) 형태로 이루어져 있다.
      • Self-Attention을 사용하기 때문에 RNN을 사용하지 않는다.
    • Encoder와 Decoder 연산이 같이 일어난다.

 

Transformer 구조

  • Input
    • 입력되는 각 단어는 One-Hot Encoding 벡터로 표현한다.
      • Row: 단어의 개수
      • Column: Sequence의 길이
  • Word Embedding
    • One-Hot Embedding 벡터를 실수 형태로 변환하여 차원을 축소한다.
      • 의미 있는 단어의 벡터로 표현된다.
  • Positional Encoding
    • 단어의 순서 정보를 제공하기 위해 주기적인 $\sin$, $\cos$ 함수를 사용하여 각 단어의 위치를 벡터로 변환한다. 
      • $f(p) = \begin{cases} \sin \frac {p} {10000^{i/d}}, & \mbox {i = 2k} \\ \cos \frac {p} {10000^{(i-1)/d}}, & \mbox {i = 2k + 1} \end{cases}$
        • $p$: 단어의 위치
        • $i$: 차원의 인덱스
        • $d$: 임베딩 차원
  • Self-Attention
    • 시퀀스 내 단어 간의 관계(의존성)를 학습한다. 
    • Query Vector
      • 특정 단어가 중요하게 여길 정보를 결정하는 벡터
    • Key Vector
      • Query Vector와의 유사도를 계산하기 위한 벡터
    • Value Vector
      • 유사도(Attention Score)를 반영하여 실제 정보를 전달하는 벡터
  • Multi-Head Attention
    • 여러 개의 Head로 Self-Attention을 병렬로 수행하여, 다양한 관점에서 관계를 학습한다.
    • 여러 Attention Head의 결과를 결합한다.
  • Masked Multi-Head Attention(Decoder)
    • 현재 단어를 인코딩할 때, 이후 단어에 대한 정보를 참조하지 못하도록 마스킹한다.
    • Attention Score가 $-\infty$로 설정되어 마스킹된 단어는 Softmax를 통해 0으로 만든다.
  • Multi-Head Cross Attention
    • Encoder의 출력값을 Key, Value Vector로 사용하고, Decoder의 현재 단어를 Query Vector로 사용하여 Encoder와 Decoder 간의 관계를 학습한다.
  • Position-wise Feed-Forward Network
    • 각 단어 위치별로 동일한 Feed Forward 네트워크를 적용한다.
      • FC Layer → ReLU → FC Layer
    • 각 단어를 독립적으로 처리한다.
  • Add, Norm
    • Add(Skip Connection)
      • 기울기 소실 및 폭발 문제를 방지한다.
      • 덧셈 연산의 역전파 시 기울기를 변경하지 않도록 한다.
    • Norm(Layer Normalization)
      • 출력값들의 분포를 표준화한다.
  • Output Softmax
    • Decoder의 최종 출력을 Linear Layer를 통해 Vocabulary Size 차원으로 변환한다.
    • Softmax 함수를 통해 다음 단어의 확률 분포를 예측한다.

 

Transformer 문제점

  • Feature를 가지고 하나의 Sequence로 만드는 것이 어려운 경우
  • Feature와 Label의 수가 데이터에 비해 너무 많은 경우
  • Sequence 길이가 너무 긴 경우

 

 

1-2. Transformer Layers

 

nn.TransformerEncoderLayer

  • Transformer 모델의 단일 인코더 레이어를 정의하는 클래스
  • 입력 시퀀스를 처리하고, 각 단어 간의 관계를 학습한다.

 

nn.TransformerEncoder

  • 여러 개의 TransformerEncoderLayer를 쌓아 Transformer의 인코더를 구성하는 모듈
  • 입력 시퀀스에서 중요한 특징을 추출한다.

 

nn.Transformer

  • 전체 Transformer 모델을 구현한 클래스

 

 

 

2. Transfer Learning

 

 

2-1. GPT

 

GPT

  • 문장 생성과 관련된 Task에 유리하다.

 

GPT-1

  • 12개의 Transfomer Block을 사용했으며, Encoder 없이 Decoder만을 가진다.
  • Transformer Block의 Masked Multi Self-Attention Block에서는 12개의 Head를 사용하고, 인코딩 벡터의 차원을 768로 만들어 사용한다.
  • 활성 함수로 GeLU를 사용한다.

 

 

2-2. BERT

 

BERT

  • Transformer의 Encoder만 사용한다.
  • 문장 의미 및 감정 분석 추출과 관련된 Task에 유리하다.
  • MLM(Masked Language Model)
    • 입력 문장에서 임의로 토큰을 버리고, 그 토큰을 맞추는 방식으로 학습을 진행한다.
    • 단어 단위로 학습한다.
  • NSP(Next Sentence Prediction)
    • 두 문장이 주어졌을 때, 두 문장의 순서를 예측한다.
    • 문장 단위로 학습한다.

 

 

2-3. Transformers

 

!pip install transformers
from transformers import pipeline

 

BERT

classifier = pipeline(
    task='sentiment-analysis',
    model='sangrimlee/bert-base-multilingual-cased-nsmc'
)
classifier('액션이 없는데도 재미 있는 몇안되는 영화')
# [{'label': 'positive', 'score': 0.9970554113388062}]

classifier('흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나.')
# [{'label': 'negative', 'score': 0.9642567038536072}]
  • 저장
classifier.save_pretrained('sentiment_pipeline')
  • 불러오기
classifier = pipeline(
    task='sentiment-analysis',
    model='sentiment_pipeline'
)
fill_mask = pipeline(
    task='fill-mask',
    model='klue/bert-base'
)
fill_mask('오늘 저녁은 [MASK] 먹자', top_k=5)
"""
[{'score': 0.07854175567626953,
  'token': 677,
  'token_str': '꼭',
  'sequence': '오늘 저녁은 꼭 먹자'},
 {'score': 0.06891678273677826,
  'token': 1521,
  'token_str': '잘',
  'sequence': '오늘 저녁은 잘 먹자'},
 {'score': 0.06734120100736618,
  'token': 23698,
  'token_str': '이걸로',
  'sequence': '오늘 저녁은 이걸로 먹자'},
 {'score': 0.04928615316748619,
  'token': 1,
  'token_str': '[UNK]',
  'sequence': '오늘 저녁은 먹자'},
 {'score': 0.037069305777549744,
  'token': 1097,
  'token_str': '뭐',
  'sequence': '오늘 저녁은 뭐 먹자'}]
"""
question_answering = pipiline(
    task='question-answering',
    model='ainize/klue-bert-base-mrc'
)
question = '대한민국의 수도는?'
context = """
서울특별시는 대한민국의 수도, 최고(最古) 도시, 최대 도시다.[19]

지방자치법의 특별법[20]으로 법률상 대한민국 제1의 도시로 규정되어 있다. 현재 대한민국 유일 특별시이며, 수장인 서울특별시장은 대한민국의 광역자치단체장 중 유일하게 장관급 대우를 받으며 국무회의 참여권 및 발언권이 있다.[21][22] 서울은 한국 제2의 도시인 부산보다도 인구가 약 3배 더 많은 명실상부한 한반도의 종주도시이다.

역사적으로도 백제, 조선, 대한제국의 고도이자 현 대한민국의 수도로서 중요성이 높다. 기원전 18년 백제가 현 송파·강동 지역에 도읍을 정한 후 492년간 한성백제 시대가 이어졌다. 이후 475년 고구려가 한성을 함락하였는데, 북쪽에 기반을 둔 국가인 고구려는 기존 백제의 한성에서 북쪽으로 한강을 건너 현 광진·성동·구리 일대를 거점으로 삼아 고구려의 북한산군 남평양으로 지정했고, 이후 서울은 강북 지역을 중심으로 발전하였다. 이후 553년 신라가 이 지역을 차지하여 신라의 한산주 한양군이 되었다. 이후 고려시대에는 약 250년간[23] 개경 이남의 남경이었다. 조선시대에는 510년 동안[24] 조선 및 대한제국의 수도 한성부였고, 이어 70여년간[25] 대한민국의 수도인 서울로서 지위를 차지하는 도시로 한국사에서 도합 1070여년간 수도로서 기능을 하였고 부수도 기간까지 합치면 1300년이 넘는 유구한 역사의 고도이다.[26]
"""

question_answering(question, context)
# {'score': 0.6418945789337158, 'start': 1, 'end': 7, 'answer': '서울특별시는'}

 

GPT

text_generation = pipeline(
    task='text-generation',
    model='skt/kogpt2-base-v2'
)
text_generation('딥러닝')
# [{'generated_text': '딥러닝 알고리즘, 딥러닝 컴퓨팅, 머신러닝 알고리즘에 따른 다양한 시나리오, 응용프로그램 개발 등의 기술을 적용한다.\n마이크로소프트(사장 제프 베이조스)는 차세대 인공지능(AI'}]

 

 

 

3. Huggingface Hub

 

 

3-1. Huggingface 토큰 발급

 

Huggingface Hub - HUGGINGFACEHUB_API_TOKEN

  • Huggingface 회사 내 자원 이용
  • Permissions: Read

 

Huggingface - HF_TOKEN

  • 로컬 자원 이용
  • Permissions: Fine-grained

 

 

3-2. Huggingface Hub 서버를 이용한 추론

 

Setup

!pip install langchain langchain_community huggingface_hub transformers datasets
import os

os.environ['HUGGINGFACEHUB_API_TOKEN'] = ''
from langchain import LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms import HuggingFaceHub

 

PromptTemplate

template = """
Question: {question}

Answer: """
prompt = PromptTempalte(template=template, input_variables=['question'])

 

LLM(사전학습 모델) - 영어

  • 모델에 대한 접근 승인을 받아야 한다.
repo_id = 'mistralai/Mistral-7B-v0.1'

llm = HuggingFaceHub(
    repo_id=repo_id,
    model_kwargs={'temperature': 0.2, 'max_length': 128}

 

Chain 생성(Prompt + LLM)

llm_chain = LLMChain(prompt=prompt, llm=llm)

 

질의응답

my_question = 'Who is King Sejong'
print(llm_chain.run(question=my_question))
"""
Question: Who is King Sejong

Answer: 4th King of the Joseon Dynasty in Korea (1397-1450)
"""

 

LLM(사전학습 모델) - 한글

repo_id = 'beomi/llama-2-ko-7b'

llm = HuggingFaceHub(
    repo_id=repo_id,
    model_kwargs={'temperature': 0.2, 'max_length': 128}
)

 

Chain 생성(Prompt + LLM)

llm_chain = LLMChain(prompt=prompt, llm=llm)

 

질의응답

my_question = '세종대왕에 대해 설명해줘.'
print(llm_chain.run(question=my_question))
"""

Question: 세종대왕에 대해 설명해줘.

Answer: 1418~1450년 조선의 제4대 국왕으로, 조선의 건국자 태조 이성계의 셋째 아들입니다. 본명은 이도(李祹)이고, 세종은 그의 묘호입니다. 그는 조선의 문물제도를 정비하고, 한글을 창제하여 민중의 교육을 장려하고, 불로초를 찾아서 서양으로의 탐험을 시도하는 등, 조선의 문화와 학문, 과학을 크게 진흥시킨 왕으로 평가받습니다. 그의 치세 동안 조선은 안으로는 내치의 정비와 학문, 문화의 발전을 이루고, 밖으로는 외교와 군사력을 통해 주변 국가들과의 관계를 안정시켰으며, 경제적으로도 번영을 이뤄 '세종대왕의 치세'는 조선의 전성기 중 하나로 꼽힙니다.
"""

 

 

 

4. OCR - CRNN

 

 

4-1. OCR

 

OCR(Optical Character Recognition)

  • 이미지 내의 글자를 자동으로 인식하는 인공지능 기술

 

OCR & 딥러닝

  • Text Detection Model
    • 글자의 영역을 탐지하는 모델
  • Text Recognition Model
    • 글자를 인식하는 모델

 

 

4-2. CRNN

 

CRNN(Convolutional Recurrent Neural Network)

  • 네트워크 구조
    • Convolutional Layers
      • 입력 이미지로부터 특징 시퀀스를 추출한다.
      • CNN을 통해 이미지에서 Feature Sequence를 생성한다.
    • Recurrent Layers
      • 추출한 Feature Sequence를 RNN의 입력으로 사용하여 각 프레임마다 라벨을 예측한다.
      • 이미지의 텍스트 시퀀스를 예측한다.
    • Transcription Layers
      • 프레임마다 예측된 값을 최종 텍스트 라벨 시퀀스로 변환한다.
  • CTC Loss
    • 입력 프레임 시퀀스와 타겟 텍스트 시퀀스 간에 명시적인 정렬(Alignment) 정보 없이도 학습이 가능하게 한다.

 

 

 

5. Generative Model

 

 

5-1. Vanilla GAN

 

GAN(Generative Adversarial Networks)

  • 실제 데이터와 흡사한 가짜 데이터를 생성하는 알고리즘
  • 생성자(Generator) 모델과 구분자(Discriminator) 모델로 두 개의 모델이 학습하는 방식으로 동작한다.

 

GAN 학습 과정

  • 구분자(Encoder) 모델이 진짜 데이터를 진짜로 분류하도록 학습시킨다.
  • 생성자(Decoder) 모델이 생성한 데이터를 가짜로 분류하도록 학습시킨다.
  • 학습된 구분자 모델을 속이는 방향으로 생성자 모델을 학습시킨다.

 

Objective Function / Loss Function

  • $ \underset{G} \min \underset{D} \max V(D, G) = \mathbb{E}_{x \sim p_{data}(x)} [\log D(x)] + \mathbb{E}_{z \sim p_{z}(z)} [\log (1 - D(G(z)))] $