Transformers_Implementaion

Eunjin Ko (Jinny) ·2023년 12월 19일

Transformer 구조를 코드적으로 이해해 보고자 구현 분석을 하였으며, 실제로 현업에서는 이렇게 일일이 구현해서 쓰지 않는다.

(HuggingFace_Transformers)
https://github.com/huggingface/transformers

1. Libraries

  • layers 안에 Densem,Conv2, LSTM class 등등 있음.
import tensorflow as tf
from tensorflow.keras import layers

TransformerBlock Class

  • layers.Layer을 상속받아 사용자 정의에 맞는 층으로 재 구현 해보려 한다.
class TransformerBlock(layers.Layer)

def __init__(self, embed_dim, num_heads, ff__dim, rate = 0.1):
      super(TransformerBlock, self).__init__()
      #super().__init__() 가능 
      self.att = layers.MultiHeadAttention(num_heads = num_heads, key_dim = embed_dim)
      self.ffn = keras.Sequential(
          [layers.Dense(ff_dim, activation = "relu"), layters.Dense(embed_dim),]
      )
      self.layernorm1 = layers.LayerNormalization(epsilon=1e-6)
      self.layernorm2 = layers.LayerNormalization(epsilon=1e-6)
      self.dropout1 = layers.Dropout(rate)
      self.dropout2 = layers.Dropout(rate)

  def call(self, inputs, training): # Equal to forward in Pytorch
        attn_output = self.att(inputs, inputs)
        attn_output = self.dropout1(attn_output, training=training)
        out1 = self.layernorm1(inputs + attn_output)
        ffn_output = self.ffn(out1)
        ffn_output = self.dropout2(ffn_output, training=training)
        return self.layernorm2(out1 + ffn_output)

2. class initialization method parameters

def init(self, embed_dim, num_heads, ff__dim, rate = 0.1):

2-1. embed_dim: 임베딩 차원

임베딩 차원은 입력 데이터를 저차원 벡터로 표현하는 데 사용되는 차원이다.
자연어 처리에서는 주로 단어를 밀집 벡터로 표현하기 위해 사용되는데 임베딩 차원이 클수록 단어의 풍부한 특성을 포함할 수 있다.

ex) 300차원의 단어 임베딩은 각 단어를 300개의 숫자로 표현한다.

2-2. num_heads: 멀티헤드 어텐션에서 사용될 헤드(head)의 수

멀티헤드 어텐션은 어텐션 메커니즘을 여러개의 헤드로 나눠서 병렬로 계산 할 수 있도록 하는방식이다. 이때 num_heads의 수를 늘리면 모델이 입력의 다양한 특징에 주의를 기울일 수 있고 표현능력이 향상 된다.

Q: 멀티헤드 어텐션의 head의 수를 엄청 증가시키면?
A: 일반적으로 head수의 증가는 모델의 표현 능력을 향상시키겠지만 연산이 증가하기 때문에 특히 대규모 모델이나 데이터셋 많을때에는 고려 해봐야함. 또한 head수를 증가시키면 모델이 입력 데이터에 더 많이 주의를 기울이게 되는데 이거때문에 과적합 날 수 도 있음.

Q: 멀티헤드 어텐션??
A: 멀티헤드 어텐션은 Transformer 아키텍처에서 사용되는 어텐션 메커니즘의 한 변형이다. 어텐션은 입력 시퀀스의 각 위치에 대해 가중치를 계산하여 다른 위치에 대한 정보를 참조하는 메커니즘인데, 멀티헤드 어텐션은 이를 여러 개의 헤드로 나눠서 병렬로 계산하는 아이디어를 적용한 것이다.

Attention 더보기
https://velog.io/@qkddnf0981/Attention)

2-3. ff_dim: 피드포워드 신경망(feedforward neural network)의 은닉층 차원

트랜스포머 기본 구조 (다시 그릴 것) :

피드포워드 신경망은 어텐션 이후에 적용되는 일반적인 전결합(feedforward) 신경망을 의미한다. 이 신경망은 비선형성을 추가하고 입력 특성을 변환해서 모델이 다양한 비선형 관계를 학습할 수 있게 한다.

이 때, ff_dim은 피드포워드 신경망의 은닉층(hidden layer)의 차원을 나타내는데, 이는 신경망이 얼마나 많은 특성(feature)을 학습할 수 있는지를 결정한다. 더 큰 차원은 당연히 더 많은 파라미터를 가진 신경망이고 이는 훈련 데이터에서 미세한 패턴이나 비선형성을 더 잘 학습할 수 있게 한다.

일반적으로 ff_dim은 트랜스포머 모델의 하이퍼파라미터 중 하나로 조정된다. 너무 작으면 모델의 표현 능력이 제한될 수 있고, 너무 크면 모델이 훈련 데이터에 과적합될 수 있다. 적절한 ff_dim 값을 찾아야함..

2-4. rate: 드롭아웃 비율

드롭아웃(dropout) 이란 신경망에서 과적합을 방지하기 위해 사용되는 정규화(regularization) 기법 중 하나이다. 드롭아웃을 적용하면 훈련 중에 신경망의 일부 뉴런을 랜덤하게 비활성화시켜 모델이 특정 뉴런에 과도하게 의존하는 것을 방지하고, 일반화 성능을 향상시킬 수 있다.

여기서는 0.1로 주었다. 이는 각 뉴런이 10%의 확률로 dropout된다는 것 을 의미한다. 다시말해서 훈련 중에 각 뉴런이 비활성될 확률이 10%라는 것. 드롭아웃 또한 하이퍼파라미터중 하나도 이 비율은 주로 실험을 통해 최적의 값으로 조정된다. 일반적으로 0.2에서 0.5 사이의 값이 많이 사용된다.

3. Modularize code

모델 관련 코드, 데이터 전처리 코드, 훈련 및 실행 코드를 각각 분리
train.py, data_processing, transformer.py

3-1. transformer.py

이 파일은 트랜스포머 모델의 구조를 정의하는 클래스를 담고 있다.

  • TransformerBlock 클래스: 트랜스포머의 기본 빌딩 블록인 어텐션과 피드포워드 네트워크(FFN)를 구현합니다.
  • PositionsEmbedding 클래스: 입력 토큰의 위치 정보를 임베딩하는 역할을 합니다.

3-2. data_processing.py

이 파일은 데이터를 불러오고 전처리하는 함수들을 정의한다.

  • load_data 함수: 데이터셋을 불러오고 나누는 역할을 한다. => tf.keras.datasets.imdb.load_data
    주로 훈련 데이터와 검증 데이터를 로드한다.
  • preprocess_data 함수: 데이터 전처리 작업을 담당한다. 주로 시퀀스 패딩 및 기타 전처리 과정을 수행합니다.

3-3. train.py

이 파일은 전체 트랜스포머 모델을 정의하고 학습시키는 역할을 한다.
fit 또는 train 함수를 통해 모델을 훈련시키고 학습한 결과를 저장한다.
훈련 과정의 하이퍼파라미터, 옵티마이저, 손실 함수 등이 주로 이 파일에 포함된다.

0개의 댓글