본문 바로가기
개발/AI

[Day3] LLM 스터디 1기 - 멀티헤드 어텐션 & 피드포워드

by 가리봉맨 2025. 1. 10.
반응형
한 권으로 끝내는 실전 LLM 파인튜닝 - 10점
강다솔 지음/위키북스

스터디 3일 차다. 지난 시간에 셀프 어텐션까지 마쳤고 오늘은 이를 더 발전시켜서 '멀티헤드 어텐션'부터 시작한다.

02. GPT

멀티헤드 어텐션과 피드포워드

멀티헤드 어텐션은 말 그대로 여러 개의 어텐션 메커니즘을 병렬로 사용하는 것이라고 한다. 여기서 병렬 처리란 하나의 데이터를 여러 관점에서 동시에 처리하는 것을 말한다. 코드는 아래와 같다.

class MultiHeadAttention(nn.Module):
    def __init__(self, num_heads, head_size):
        super().__init__()
        self.heads = nn.ModuleList([Head(head_size) for _ in range(num_heads)])

    def forward(self,inputs):
        return torch.cat([head(inputs) for head in self.heads], dim=-1)

__init__ 메서드에서 head_size만큼 Head 인스턴스를 생성하고, forward 메서드에서 실제 연산을 수행한다. 반환되는 텐서는 [batch_size, sequence_length, num_heads * head_size] 형태로 원래 입력보다 더 높은 차원의 데이터를 포함한다. 다음으로 모델의 표현력을 더 높여주는 FeedFoward 클래스를 작성한다. 해당 클래스에는 nn.Sequential을 이용해서 입력 차원 확장 -> ReLU 함수로 비선형 도입 -> 다시 원래 차원으로 축소하는 피드포워드 네트워크 로직이 들어간다.

추가로 각 레이어 입력을 레이어 출력에 더해주는 '잔차 연결', RNN 같은 동적 네트워크 학습의 안정화 및 가속화에 도움을 주는 '레이어 정규화(LayerNorm)에 대해 공부했다.

Blocks 만들기

출처: https://commons.wikimedia.org/wiki/File:Gpt-transformer-block.png

GPT 같은 복잡한 신경망 모델은 설계와 구현에 있어 중요한 구조적 단위인 블록(Block)을 사용한다. 블록 구조는 위의 그림과 같이 모듈화, 재사용성, 확장성 향상 목적으로 모델 내 다양한 계층과 구성 요소를 하나로 묶은 것을 말한다.

토크나이저 만들기

토크나이저는 텍스트의 의미를 잘 보전하면서도 데이터를 효율적으로 처리할 수 있어야 한다. 이 챕터에서는 사용자 정의 토크나이저를 만들고 학습시키고 저장하고 다시 불러와 테스트하는 과정을 진행했다. 코드는 생략하고 실행 결과만 첨부한다.

완벽한 문장은 아니지만 '세계적인', '싱가포르 에너지 반도 요건', '2차전지', '주담대' 등등.. 제대로 된 단어도 꽤 보인다. 신기하구먼. 3일 차 스터디는 여기까지. 4일 차부터는 드디어 파인튜닝을 시작한다.

반응형