프로그래밍/LLM

[Day2] 한 권으로 LLM 온라인 스터디 1기 - 언어 모델 구조 및 셀프 어텐션 메커니즘 이해

31weeks 2025. 1. 24. 21:02
728x90
반응형

 

2.3 언어 모델 만들기

2.3.1 라이브러리 설명

  • torch : 텐서 연산과 자동 미분기능 등을 제공해 딥러닝 모델 구현에 필수적인 기능 제공
  • torch.nn : 신경망 구축에 필요한 다양한 레이어와 매개변수 관리 기능 제공
  • 이를 통해 모델 아키텍처를 정의하고 매개변수를 초기화하며, 순전파(forward pass)를 구현할 수 있다

 

2.3.2 __init__ 함수

  • __init__
    - 클래스 인스턴스가생성될 때 자동으로 호출되는 메서드
    - 신경망 모델에서는 모델 구조와 필요한 초기설정을 정의함

  • super().__init__()
    - 부모 클래스의 __init__ 메서드를 호출 → nn.Module의 생성자 호출

  • super()
    - 여러 클래스를 동시에 상속받을 때 생길 수 있는 복잡한 상황을 관리하기 위함

  • num_embedding
    - 임베딩할 단어의 총 수 → 임베딩 테이블에 있는 고유한 토큰들의 총 수
       → 임베딩을 수행할 수 있는 최대 인덱스 값
    - 인덱스는 0 ~ (num_embeddings  - 1) 값을 가질 수 있음
  • embedding
    - 각 단어를 표현할 벡터의 차원
    - 각 토큰의 임베딩 벡터 차원을 나타냄
    - 각 토큰은 설정한 차원 수 만큼의 요소를 가진 벡터로 표현됨

 

2.3.3 forward 메서드

  • 모델에 데이터가 전달될 때 호출되어 실제 계산 과정을 담당함
  • __init__에서 설정한 레이어와 연산을 사용해 입력 데이터를 출력 데이터로 변환함
  • 모델의 실행부분을 정의하며, 모델 객체가 함수처럼 호출될 때 자동으로 실행됨

 

2.3.4 generate 메서드

  • 모델이 학습한 패턴을 바탕으로 새로운 텍스트를 생성
  • 입력된 시작 문자열에 기반해 연속으로 다음 글자를 예측하고 텍스트를 생성함

 

 

 

2.4 Optimizer 추가하기

  • 모델 훈련 시, 손실 함수를 이용해 모델의 예측값과 실제 정답 데이터 사이의 차이(손실) 계산
  • 손실을 최소화 하기 위해 모델의 매개변수 조정

 

2.4.1 데이터 GPU로 전달하기

  • device = "cuda" if torch.cuda.is_available() else "cpu"

 

2.4.2 Loss 함수 만들기

  • def compute_loss:
  • 모델이 제대로 학습하고 있는지 확인

 

2.4.3  전체 코드 복습

  • max_iteration
    - 모델이 수행할 최대 반복 횟수

  • eval_interval
    - 평가를 수행할 간격

 

 

 

 

2.5 셀프 어텐션 추가하기

  • 문자나 단어 사이의 관계를 파악하고, 특정 정보의 중요성을 인식하는 메커니즘

 

2.5.1 문자들 간에 정보를 주고받는 방식(평균 방식)

2.5.2 행렬곱 연산으로 더 빠르게 정보를 주고받기

https://github.com/wikibook/llm-finetuning/blob/main/chapter2/chapter2_GPT.ipynb

 

llm-finetuning/chapter2/chapter2_GPT.ipynb at main · wikibook/llm-finetuning

《한 권으로 끝내는 실전 LLM 파인튜닝》 예제 코드. Contribute to wikibook/llm-finetuning development by creating an account on GitHub.

github.com

 

 

2.5.3 셀프 어텐션이란?

  • 입력 시퀀스(문장)내 모든 단어간의 관계를 직접 분석하고 처리
  • 각 단어가 다른 모든 단어와 어떻게 상호작용 하는지 계산
  • 단어들 간의 유사도를 측정해 연관성이 높은 단어 쌍을 파악
  • 문단 내 단어들 사이의 복잡한 연관성을 포착하고 이해 

 

2.5.4 왜 (d_k)^(1/2)로 나눠야 하는가?

  • 소프트맥스 함수는 언어 모델이 다음에 올 단어를 결정 데 사용
  • (d_k)^(1/2)로 나눠서 스케일링하면 소프트맥스 함수가 여러 위치의 정보를골고루 반영할 수 있게됨

 

728x90
반응형