본문 바로가기

개발일지/도서추천서비스

koBERT 모델이란 / BERT

반응형

목차

  1. koBERT 모델에 대해서
  2. BERT 모델의 아키텍처
  3. Transformer 인코더 구조 코드로 살펴보기

1.  koBERT 모델에 대해서

먼저 BERT 모델은 단반향으로 학습하던 기존 모델인 GPT-1과 다르게

Bidirectional Transformer 모델로서 양방향으로 학습하는 모델이다.

 

단어 앞 뒤의 양방향으로 학습하기 때문에 문맥 파악에 좀 더 유리하고

자연어 이해에 강력한 성능을 보인다.

 

BERT는 질의응답이나, NER 등 다양한 NLP 작업에 적용이 가능하다.

koBERT는 korean BERT로 한국어 자연어 처리를 위해 사전 학습된 BERT모델을 말한다.

 

 

2.  BERT 모델의 아키텍처

koBERT모델의 아키텍처를 이해한다는 것은 곧 BERT의 아키텍처를 이해한다는 것이다.

인코더 블록 구조

 

BERT는 Transformer의 Encoder 블록만 사용한 구조이며

각 레이어(Encoder 블록)는 Multi-Head Attention과 Feed-Forward 라는 두 개의 서브층으로 구성되어 있다.

 

Multi-Head Attention은 트렌스포머 모델이 수행하던 어텐션 메커니즘을 여러 번의 병렬로 사용하는 것이다.

여러 head가 독자적으로 self attention을 수행하기 때문에 다양한 관점에서의 벡터 해석이 가능하다.

 

Feed-Forward 신경망에서는 가중치(w)의 반복적인 업데이트를 통해 출력값의 에러를 최소화하는 작업을 한다.

 

 

3.  Transformer 인코더 구조 코드로 살펴보기

아래 코드는 Tensorflow와 Keras를 사용하여 Transformer 인코더 레이어를 구현한 예시코드이다.

import tensorflow as tf
from tensorflow.keras.layers import MultiHeadAttention, Input, Dense, Dropout, LayerNormalization
from tensorflow.keras.models import Model

 

1. 인코더 레이어 함수 정의 (encoder_layer)

def encoder_layer(dff, d_model, num_heads, dropout, name="encoder_layer"):
    
    inputs = Input(shape=(None, d_model), name="inputs")
    padding_mask = Input(shape=(1, 1, None), name="padding_mask")

    # 멀티-헤드 어텐션 (첫번째 서브층 / 셀프 어텐션)
    attention = MultiHeadAttention(
        num_heads=num_heads, 
        key_dim=d_model,
        name="attention")(
        query=inputs, key=inputs, value=inputs, 
        attention_mask=padding_mask
    )

    # 드롭아웃 + 잔차 연결과 층 정규화
    attention = Dropout(rate=dropout)(attention)
    attention = LayerNormalization(epsilon=1e-6)(inputs + attention)

    # 포지션 와이즈 피드 포워드 신경망 (두번째 서브층)
    outputs = Dense(units=dff, activation='relu')(attention)
    outputs = Dense(units=d_model)(outputs)

    outputs = Dropout(rate=dropout)(outputs)
    outputs = LayerNormalization(epsilon=1e-6)(attention + outputs)

    return Model(
        inputs=[inputs, padding_mask], outputs=outputs, name=name)

 

→ Transformer의 인코더 레이어를 정의하는 함수이다.

  • dff : 피드 포워드 신경망 내부 차원
  • d_model : 입력 및 출력 벡터 차원
  • num_heads : 멀티 헤드 어텐션에서 사용할 헤드 수
  • dropout : 드롭아웃 비율, 과적합 방지를 위한 일부 뉴런을 무작위로 제거
  • name : 모델의 이름

 

2. 하이퍼파라미터 / 모델 / 데이터 설정

# 하이퍼파라미터 설정
dff = 2048
d_model = 512
num_heads = 8
dropout = 0.1

# 모델 생성
sample_encoder = encoder_layer(dff=dff, d_model=d_model, num_heads=num_heads, dropout=dropout)

# 테스트 데이터 생성
test_seq_len = 10
test_input = tf.random.uniform((1, test_seq_len, d_model))  
test_mask = tf.random.uniform((1, 1, 1, test_seq_len), maxval=2, dtype=tf.int32)

 

  • 하이퍼파라미터 값은 Transformer 모델의 기본 설정 값.
  • 시퀀스 길이(test_seq_len) : 10
  • test_input 데이터 : 배치사이즈(1) X 시퀀스길이(10) X d_models(512)
  • test_mask 데이터 : 배치사이즈(1) X 멀티헤드어텐션 쿼리 차원수(1) X 멀티헤드어텐션 키 차원수(1) X 시퀀스길이(10)

3. 결과 출력

print("Output shape:", output.shape)

→ Output shape : (1, 10, 512)

 

  • (1, 10, 512) : 배치사이즈, 시퀀스 길이, 임베딩 차원
  • 각 시퀀스 요소의 차원을 유지하면서 입력 데이터를 처리했음을 결과값으로 확인함.

 

 

 

 

https://wikidocs.net/31379