Transformer 구조를 코드적으로 이해해 보고자 구현 분석을 하였으며, 실제로 현업에서는 이렇게 일일이 구현해서 쓰지 않는다.
(HuggingFace_Transformers)
https://github.com/huggingface/transformers
import tensorflow as tf
from tensorflow.keras import layers
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)
def init(self, embed_dim, num_heads, ff__dim, rate = 0.1):
임베딩 차원은 입력 데이터를 저차원 벡터로 표현하는 데 사용되는 차원이다.
자연어 처리에서는 주로 단어를 밀집 벡터로 표현하기 위해 사용되는데 임베딩 차원이 클수록 단어의 풍부한 특성을 포함할 수 있다.
ex) 300차원의 단어 임베딩은 각 단어를 300개의 숫자로 표현한다.
멀티헤드 어텐션은 어텐션 메커니즘을 여러개의 헤드로 나눠서 병렬로 계산 할 수 있도록 하는방식이다. 이때 num_heads의 수를 늘리면 모델이 입력의 다양한 특징에 주의를 기울일 수 있고 표현능력이 향상 된다.
Q: 멀티헤드 어텐션의 head의 수를 엄청 증가시키면?
A: 일반적으로 head수의 증가는 모델의 표현 능력을 향상시키겠지만 연산이 증가하기 때문에 특히 대규모 모델이나 데이터셋 많을때에는 고려 해봐야함. 또한 head수를 증가시키면 모델이 입력 데이터에 더 많이 주의를 기울이게 되는데 이거때문에 과적합 날 수 도 있음.
Q: 멀티헤드 어텐션??
A: 멀티헤드 어텐션은 Transformer 아키텍처에서 사용되는 어텐션 메커니즘의 한 변형이다. 어텐션은 입력 시퀀스의 각 위치에 대해 가중치를 계산하여 다른 위치에 대한 정보를 참조하는 메커니즘인데, 멀티헤드 어텐션은 이를 여러 개의 헤드로 나눠서 병렬로 계산하는 아이디어를 적용한 것이다.
Attention 더보기
https://velog.io/@qkddnf0981/Attention)
트랜스포머 기본 구조 (다시 그릴 것) :

피드포워드 신경망은 어텐션 이후에 적용되는 일반적인 전결합(feedforward) 신경망을 의미한다. 이 신경망은 비선형성을 추가하고 입력 특성을 변환해서 모델이 다양한 비선형 관계를 학습할 수 있게 한다.
이 때, ff_dim은 피드포워드 신경망의 은닉층(hidden layer)의 차원을 나타내는데, 이는 신경망이 얼마나 많은 특성(feature)을 학습할 수 있는지를 결정한다. 더 큰 차원은 당연히 더 많은 파라미터를 가진 신경망이고 이는 훈련 데이터에서 미세한 패턴이나 비선형성을 더 잘 학습할 수 있게 한다.
일반적으로 ff_dim은 트랜스포머 모델의 하이퍼파라미터 중 하나로 조정된다. 너무 작으면 모델의 표현 능력이 제한될 수 있고, 너무 크면 모델이 훈련 데이터에 과적합될 수 있다. 적절한 ff_dim 값을 찾아야함..
드롭아웃(dropout) 이란 신경망에서 과적합을 방지하기 위해 사용되는 정규화(regularization) 기법 중 하나이다. 드롭아웃을 적용하면 훈련 중에 신경망의 일부 뉴런을 랜덤하게 비활성화시켜 모델이 특정 뉴런에 과도하게 의존하는 것을 방지하고, 일반화 성능을 향상시킬 수 있다.
여기서는 0.1로 주었다. 이는 각 뉴런이 10%의 확률로 dropout된다는 것 을 의미한다. 다시말해서 훈련 중에 각 뉴런이 비활성될 확률이 10%라는 것. 드롭아웃 또한 하이퍼파라미터중 하나도 이 비율은 주로 실험을 통해 최적의 값으로 조정된다. 일반적으로 0.2에서 0.5 사이의 값이 많이 사용된다.
모델 관련 코드, 데이터 전처리 코드, 훈련 및 실행 코드를 각각 분리
train.py, data_processing, transformer.py
이 파일은 트랜스포머 모델의 구조를 정의하는 클래스를 담고 있다.
이 파일은 데이터를 불러오고 전처리하는 함수들을 정의한다.
이 파일은 전체 트랜스포머 모델을 정의하고 학습시키는 역할을 한다.
fit 또는 train 함수를 통해 모델을 훈련시키고 학습한 결과를 저장한다.
훈련 과정의 하이퍼파라미터, 옵티마이저, 손실 함수 등이 주로 이 파일에 포함된다.