LLaMA: 개방적이고 효율적인 기본 언어 모델

2023. 9. 30. 21:09AI/NLP

1. 서론

 

대규모 언어 모델(LLMs)은 텍스트 말뭉치에서 훈련되어 텍스트 지침이나 몇 가지 예제를 통해 새로운 작업을 수행하는 능력을 보여왔습니다. 이러한 능력은 모델의 크기를 확장함에 따라 더욱 명확해졌습니다. 주요 목표는 다양한 추론 예산에서 최상의 성능을 달성하기 위해 일반적으로 사용되는 것보다 더 많은 토큰에서 언어 모델을 훈련하는 것입니다. 이를 위해, 공개적으로 사용 가능한 데이터만을 사용하여 LLaMA라는 새로운 언어 모델을 개발되었습니다. 이 모델은 기존의 모델들과 비교하여 더 나은 성능을 보여주며, 동시에 훈련 및 추론 속도도 향상되었습니다.

 

2. 접근 방식

 

2.1 사전 훈련 데이터

 

훈련 데이터셋은 여러 출처의 혼합물로 구성되어 있으며, 대부분의 데이터는 훈련 중에 한 번만 사용됩니다. Wikipedia와 Books 도메인은 예외로, 약 두 번의 epoch를 수행합니다. 이러한 다양한 데이터 소스의 사용은 모델의 다양성과 범용성을 향상하는 데 중요하며, 공개적으로 사용 가능한 데이터만을 사용하는 것은 연구의 투명성과 재현성을 보장하기 위한 중요한 접근 방식입니다.

 

2.2 아키텍처

 

최근의 대규모 언어 모델 연구를 따라, 네트워크는 트랜스포머 아키텍처를 기반으로 하며, 주요 변경 사항은 다음과 같습니다.

 

  • Pre-normalization: 훈련의 안정성을 향상시키기 위해 각 트랜스포머 하위 계층의 입력을 정규화합니다. 이는 모델의 학습 속도와 성능에 긍정적인 영향을 미칩니다.
  • SwiGLU 활성화 함수: ReLU 비선형성을 SwiGLU 활성화 함수로 대체합니다. 이는 모델의 표현력을 향상하는 데 도움이 됩니다.
  • Rotary Embeddings: 절대 위치 임베딩을 제거하고 대신 각 네트워크 계층에 회전 위치 임베딩(RoPE)을 추가합니다. 이는 시퀀스 내의 각 토큰의 위치 정보를 더 정확하게 인코딩하는 데 도움이 됩니다.

 

2.3 최적화기

 

모델은 AdamW 최적화기를 사용하여 훈련되며, 코사인 학습률 일정을 사용합니다. 가중치 감소는 0.1, 그래디언트 클리핑은 1.0으로 설정됩니다. 이러한 하이퍼파라미터 설정은 모델의 안정적인 학습을 보장하며, 과적합을 방지하는 데 도움이 됩니다.

 

2.4 효율적인 구현

 

모델의 훈련 속도를 향상시키기 위해 여러 최적화를 수행합니다. 원인성 다중 헤드 주의의 효율적인 구현을 사용하여 메모리 사용량과 런타임을 줄입니다. 이 구현은 xformers 라이브러리에서 사용할 수 있으며, Rabe와 Staats (2021)에서 영감을 받았습니다. 체크포인트를 사용하여 역방향 패스 동안 재계산되는 활성화의 양을 줄였습니다. 이러한 최적화 기법들은 모델의 훈련 시간을 크게 단축시키는 데 기여합니다.

 

3. 실습 코드

 

3-1. 모델 정의

 

class LLaMAModel(nn.Module):
    def __init__(self, vocab_size, d_model, nhead, num_encoder_layers, num_decoder_layers):
        super(LLaMAModel, self).__init__()
        self.transformer = Transformer(d_model, nhead, num_encoder_layers, num_decoder_layers)
        self.embedding = nn.Embedding(vocab_size, d_model)
        self.fc = nn.Linear(d_model, vocab_size)
  • LLaMAModel은 PyTorch의 nn.Module을 상속받아 사용자 정의 모델을 정의합니다.
  • Transformer는 PyTorch에서 제공하는 트랜스포머 아키텍처를 나타냅니다.
  • nn.Embedding은 단어를 벡터로 변환하는 임베딩 레이어입니다.
  • nn.Linear는 출력을 어휘 크기로 변환하는 완전 연결 레이어입니다.

 

    def forward(self, src, tgt):
        src, tgt = self.embedding(src), self.embedding(tgt)
        output = self.transformer(src, tgt)
        return self.fc(output)
  • forward 메서드는 모델의 순전파를 정의합니다.
  • 입력 src와 tgt는 각각 임베딩 레이어를 통과합니다.
  • 그다음, 트랜스포머 레이어를 통과하고, 마지막으로 완전 연결 레이어를 통과하여 결과를 반환합니다.

 

반응형

 

3-2. 하이퍼파라미터 및 모델 초기화

 

vocab_size = 10000
d_model = 512
nhead = 8
num_encoder_layers = 6
num_decoder_layers = 6
learning_rate = 0.001
epochs = 10

model = LLaMAModel(vocab_size, d_model, nhead, num_encoder_layers, num_decoder_layers)
optimizer = optim.AdamW(model.parameters(), lr=learning_rate)
criterion = nn.CrossEntropyLoss()
  • 여기서는 모델 학습에 필요한 하이퍼파라미터를 설정합니다.
  • LLaMAModel을 초기화하여 모델 인스턴스를 생성합니다.
  • AdamW는 모델의 파라미터를 최적화하기 위한 옵티마이저입니다.
  • nn.CrossEntropyLoss는 분류 작업의 손실 함수로 사용됩니다.

LLaMAⓒGETTY

 

3-3. 학습 데이터 생성

 

src = torch.randint(0, vocab_size, (10, 32))
tgt = torch.randint(0, vocab_size, (10, 32))
tgt_output = torch.randint(0, vocab_size, (10, 32))
  • 임의의 학습 데이터를 생성합니다실제 환경에서는 실제 데이터셋을 사용해야 합니다.

 

3-4. 학습 루프

 

for epoch in range(epochs):
    optimizer.zero_grad()
    output = model(src, tgt)
    loss = criterion(output.view(-1, vocab_size), tgt_output.view(-1))
    loss.backward()
    optimizer.step()
    print(f"Epoch {epoch+1}/{epochs}, Loss: {loss.item():.4f}")
  • 각 epoch에서 모델은 입력 데이터에 대해 순전파를 수행하고, 손실을 계산한 후 역전파를 통해 그래디언트를 계산합니다.
  • optimizer.step()을 호출하여 모델의 파라미터를 업데이트합니다.

 

3-5. 결과 출력

 

print("Sample output:", torch.argmax(output[0], dim=1))
  • 학습된 모델을 사용하여 얻은 결과의 첫 번째 샘플을 출력합니다.

 

4. 결론

 

LLaMA는 공개적으로 사용 가능한 데이터만을 사용하여 훈련된 대규모 언어 모델입니다. LLaMA의 주요 아키텍처와 훈련 방법론을 소개하였습니다. 또한, 간단한 실습 코드를 통해 LLaMA 모델의 기본 구조를 구현하는 방법을 제시하였으며, LLaMA는 기존의 대규모 언어 모델과 비교하여 뛰어난 성능을 보여주었습니다. 이는 훈련 데이터와 아키텍처의 최적화 덕분이라고 생각됩니다.