티스토리 뷰

반응형

로직 모듈

 

1. 질문하기

2. 질문에 해당하는 문서 검색

3. 질문과 검색된 문서를 기반으로 LLM에게 질문할 프롬프트 구성

4. 프롬프트를 이용해서 LLM에게 질문하기

5. LLM 답변을 사용자에게 전달한다.

 

LLM이란? 언어의 특징 벡터

 

언어는 우리 머리속에 있는 개념을 나타내는 심볼이다.

글자에는 아무런 정보도 없다. 따라서 딥러닝에서 이러한 심볼을 인식할 수 있는 정보가 필요한데, 이게 특징 벡터이다.

 

단어 임베딩 : 단어를 대표하는 특징 벡터

문장 임베딩 : 문장을 대표하는 특징 벡터

특징 벡터 공간에서 거리, 유사도 등으로 벡터간 정보를 비교 가능하다.

 

자연어 처리의 역사

~2014년까지

Word2vec 사용. 단어의 특징 벡터를 처리

문장 분류 / 토큰 분류를 해 내었다.

10M 파라미터.

 

2015~2107년까지

기계번역.

Seq2Seq와 Transformer의 등장

encoder, decoder 개념으로 조건부 문장을 생성할 수 있게 되었다.

~100M 파라미터

 

2018~2020년까지

PLM.

BERT, 사전학습, 미세조정.

문맥을 이해하는 특징 벡터를 가지게 되었다.

문장 분류 / 토큰 분류

많은 데이터를 이용해 사전학습해서 인공지능이 문맥을 이해 하는 능력을 학습하고, 미세 조정에서 좋은 성능을 획득

~1B 파라미터

 

2021년~

LLM의 시대.

GPT-3, 

별도의 학습 없이 더 많은 인간의 언어를 이해하고, 답변 문장을 생성하는 경지에 이르렀다.

~1T 파라미터

 

Seq2Seq

Neural Machine Translation

sequence to sequence

Encoder, Decoder와도 같은 의미이다.

 

원문을 입력해서 특징 벡터를 뽑는 부분 -> Encoder

번역문을 해석해서 번역문을 생성하는 부분 -> decoder

 

BOS가 들어간다.

교육은은 가장

가장은 강력한

강력한은 무기 ..

무기는 입니다

입니다 EOS로 된다.

 

자신의 다음 단어를 예측하도록, 자기 자신을 Input을 넣는다.

 

Sequence to Sequence + Attention

seq2seq의 문제는 통과할 때마다 정보가 소실

원문의 정보를 압축한 벡터가 너무 작다.

Decoder에 필요한 정보를 Encoder에서 직접 가져오자는 것이 Attention 메커니즘이다.

 

이때 필요한 정보를 파악하는 능력이 필요한데, 이게 유사도이다.

이러면 필요한 정보를 잘 가져올 수 있게 된다.

 

이때 유사도의 비교 방법은 dot-product를 쓴다.

해당 비율만큼 가져오기 때문에, 벡터가 작더라도 우리는 정보를 가져올 수 있다.

 

Transformer

Attention만으로 구성, 기계번역의 성능을 한 단계 끌어올렸다.

자연어 처리, 비전, 음성 등 다양한 곳에 사용되는 사실상의 표준이다.

 

Attention 성능이 좋으니까, Attention 만으로 네트워크를 구성해보자는 원리였다.

 

Transfer Learning

구하기 쉬운 데이터를 많이 사용하여 인공지능 모델을 사전학습

사전학습 과정에서 모델은 데이터의 특성을 파악하고 이해하는 능력을 획득한다.

라벨이 있는 데이터를 학습할 때, 사전학습을 통해 획득한 능력을 활용하여 미세조정한다.

 

Self-Supervised Learning

라벨이 없는 데이터는 인터넷을 통해서 구하기 쉽다.

데이터의 일부에 노이즈를 주입하고, 원본을 복원하는 방식으로 학습한다.

이와 같은 방법으로 많은 데이터를 이용해서 사전학습한다.

 

LLM - GPT-1

Generative Pre-Training

이전 단어들을 보고 다음 단어를 예측하는 방식으로 사전 학습

미세 조정을 위해서 마지막 layer만 추가하고, 나머지는 모두 사전학습 된 파라미터를 사용했다.

 

task prediction은 사전학습으로, task classifier는 레이어만 추가했다.

 

transformer가 성능이 좋으니, transformer decoder를 사용해서 사전 학습 후 미세조정한다.

 

BERT

주변 단어를 보고 중심 단어를 예측하는 방식으로 사전학습했다.

미세 조정을 위해서 마지막 layer만 수정하고, 나머지는 모두 사전학습 된 파라미터를 사용했다.

 

Transformer Encoder를 사용해서 주변 단어를 보고 중심 단어를 예측하는 방식의 사전 학습을 했다.

 

GPT -3

GPT-1,GPT-2,GPT-3 모두 이전 단어들을 보고 다음 단어를 예측하는 방식(언어 모델)으로 사전학습했다.

GPT-3 정도의 파라미터(175B)데이터(570G,300B)로 학습한 결과 IN CONTEXT LEARNING 능력을 확보하게 되었다.

 

In Context Learning(ICL)

Few-shot : 모델이 커지면서 몇 개의 예제와 질문을 함께 입력하면, 인공지능 모델이 문맥을 이해하고,

정답을 예측하는 능력 향상

 

제로 샷 - 예제가 없어도 정답을 예측

원 샷 - 한 개의 예제로 정답을 예측

 

제로샷에서는 성능이 좋지 않지만, one-shot 혹은, 샘플을 10개 정도 넣으면 아주 좋은 성능이 나온다.

 

RLHF (Reinforcemnet Learning with Human Feedback

  • Instruction 데이터셋을 수집하여 SFT(supervised fine-tuning) 수행
  • 답에 대한 걸 사람이 평가한다. score 부여. 
  • SFT model의 출력을 사람이 평가하여 reward model(수치화하여 리워드를 반영) 학습
  • PPO 알고리즘을 사용하여 reward model을 기반으로 정책(policy) 최적화

질문이 오게 되면, 리워드 모델이 답을 하게 되고, 그걸 보고 PPO 알고리즘을 이용해서 사람들이 좋다고 평가한 답변을 사용자에게 내보낸다.

 

GPT3 -> Instruct GPT -> ChatGPT 순으로 발전

Chatgpt는 데이터의 종류로 조금더 개선한 것

 

RLHF는 사람이 들어가기 떄문에 비싸다. 하지만 성능이 좋다.

SFT는 싸다.

 

Llama : Large Language Model Meta AI

 

2023년 상용 서비스에 사용가능한 Llama-2 공개

2024년 GPT-4와 비슷한 성능의 Liama-3 공개

Supervised fine tuning을 할 수 있는 large language 모델을 연구하기 시작했다.

 

파라미터를 늘렸을 때 데이터가 얼마나 필요한가?

https://velog.io/@wkshin89/Paper-Review-Training-Compute-Optimal-Large-Language-Models-NeurIPS-20224

 

https://heegyukim.medium.com/large-language-model%EC%9D%98-scaling-law%EC%99%80-emergent-ability-6e9d90813a87

 

 

모델의 크기도 중요하지만, 결국 데이터를 많이 넣어야 한다.

학습 토큰 수/ 파라미터 수 = 약 20배 정도가 되어야 한다. 그래야만 원하는 데이터를 얻을 수 있다.

 

모델은 작아지고 있고, 토큰은 늘어나는 추세다.

 

사람처럼 답변할 수 있는 능력이 언제 나타나는가?(ICL 이 언제 되는가)

갑자기 나타난다. 모델이 작을 때는 아예 나타내지 못하다가, 갑자기 나타나게 된다.

 

LLM 리더보드

 

다양한 평가 데이터를 이용해서, LLM의 성능을 비교 평가

Open LLM Leaderboard: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard

주로 LLM의 언어이해(NLU) 성능을 비교 평가

 

Open Ko-LLM Leaderboard: https://huggingface.co/spaces/upstage/open-ko-llm-leaderboard

Open LLM Leaderboard의 한국어 버전 - upstage라는 회사

 

LMSYS Chatbot Arena Leaderboard https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard

주로 언어생성(NLG) 성능을 비교 평가

 

상용화 가능한 라이선스와, 불가능한 라이선스가 있기 때문에 사전에 확인해야 한다.

 

호랑이 리더보드 (http://horangi.ai/)

 

 

chatgpt로 평가하게 될 때 할루시네이션은 어떻게 컨트롤하는가?

근거가 주어지게 되면 할루시네이션 컨트롤이 가능하다.

 

LLM이 어떤 개체 간의 정보, 사건 등을 혼합해서 사실이 아닌 그럴듯한 문장을 완성하는 현상

 

 

NSMC 데이터 소개

네이버 영화리뷰 감정 분류

Train 데이터 : 150k

Test 데이터 : 50k

 

10만개 negative(별점 1~4)

10만개 positive(9~10)

 

Hugging face with SLLM(Small Large Language Model SFT)

SLLM = 10B 이하 모델

 

Transformers

- Tokenizer (text 자르기 기능)

- Accelerate (multi gpu 활용 가능)

- PEFT (T4와 같은 낮은 사양의 gpu에서도 큰 모델을 학습할 수 있다)

• Gradio (데모 페이지 만들기)

• Datasets 

• Models

Spaces

 

Transformers 라이브러리

Tokenizer를 함께 제공, 학습/배포/추론 통합 가능

학습된 모델 파라미터 다운로드 및 활용 가능

다양한 외부 유명 라이브러리와 쉽게 연동 가능 (Wandb, Deepspeed, Bitsandbytes 등)

https://github.com/huggingface/transformers/

 

src / transformers에서 models에 들어가면 해당 모델들을 볼 수 있다.

 

Gradio 라이브러리

Model을 웹으로 손쉽게 사용할 수 있게 해주는 라이브러리이자 플랫폼

빠른 데모 웹사이트 구축 가능

 

Datasets 라이브러리

데이터셋을 공개하고, 다운로드 할 수 있는 공간

API를 이용해 몇 줄의 코드로 다양한 데이터셋 다운로드 및 활용가능

라이센스 필수 확인 (상용화 가능 여부

from datasets import load_dataset
dataset = load_dataset("mmlu")

 

Models

학습된 모델의 파라미터를 공개하고, 다운로드 할 수 있는 공간

API를 이용해 몇 줄의 코드로 다양한 모델의 파라미터를 다운로드 하고 활용 가능

라이센스 필수 확인 (상용화 가능 여부)

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('bert-base-cased')

 

google/gemma-1.1-2b-it

https://huggingface.co/google/gemma-1.1-2b-it

허깅 페이스 로그인 후, 추가로 라이선스 동의 필요

 

LoRA

Residual connection

Residual connection은 hidden(h0)와 hidden의 변화량(델타h)의 합을 계산한다.

 

h = h0 + 델타 h

 

LLM Fine-tuning

Pre-trained LLM의 파라미터 W0(pre)가 있을 때, Fine-tuning의 후 파라미터 W(fine)를 얻게 된다.

 

W = W0 + 델타 W

 

결국 fine-tuning은 파라미터의 W0의 변화량 델타 W를 학습한 것과 같다.

h를 보냈을 때에, fw0(h)를 계산한 값과,

f델타w(h)를 보내서 더한 값이 결국엔 최종적으로 fw(h)가 된다.

 

fw(h) = fw0(h) + f델타w(h)

 

Ax = (A0 + 델타A) x = A0x + 델타(Ax)

그러면 학습을 할 때 W0는 고정하고, 델타 W만 학습해서 더하면 된다.

 

resnet 같은 곳에서, gradient vanishing을 피하기 위한 residual만 따로 떼어내서 학습한다는 개념이다.

 

LoRA의 개념

LLM을 fine-tuning 할 때 기존 LLM 파라미터는 고정하고, 최소한의 변경될 부분만을 별도로 학습한다.

Pre-train 파라미터 W0는 학습되지 않도록 고정한다.

 

Fine-tuning을 위한 파라미터 델타 W만 별도로 학습한다.

파라미터 수를 줄이기 위해 델타 W를 A(- R^rxd 와 B(- R^dxr 분할아여 파라미터 수를 줄인다.

낮은 사양의 GPU에서도 fine-tuning 가능

 

미세조정을 할 것이기 때문에, 델타 W만 AutoEncoder의 구조와 같이 1000 파라미터에서 r 파라미터까지 압축했다가,

r 파라미터에서 1000 파라미터로 다시 복원하여 학습하는 형태로 쓴다.

이게 원래 큰 R 공간을,  R^rxd와 R^dxr을 분할해서 파라미터 수를 줄이는 방법이다.(원래 차원수는 R^dxd)

 

LoRA의 학습방법이 full fine-tuning과 비슷하거나 성능이 좋다.

r의 크기를 줄이더라도 성능이 크게 감소하지 않는다.

 

LoRA(Low-Rank Adaptation)는 사전 학습된 큰 언어 모델을 효율적으로 미세 조정(fine-tuning)하기 위한 기법입니다. LoRA에서 역전파는 다음과 같은 과정을 통해 이루어집니다.

  1. 순전파(Forward Pass): 입력 데이터를 사전 학습된 모델에 통과시켜 출력을 생성합니다. 이때 추가된 LoRA 가중치가 모델 가중치에 더해집니다.
  2. 손실 함수 계산: 모델의 출력과 실제 타깃 간의 차이를 손실 함수로 계산합니다.
  3. 역전파(Backward Pass): 계산된 손실에 대해 LoRA 가중치에 대한 그래디언트를 계산합니다. 이때 사전 학습된 모델 가중치에 대한 그래디언트는 계산하지 않습니다.
  4. 가중치 업데이트: 계산된 그래디언트를 이용하여 LoRA 가중치만 업데이트합니다. 사전 학습된 모델 가중치는 고정됩니다.
  5. 반복: 위 과정을 데이터셋 전체에 대해 반복하며 LoRA 가중치를 계속 업데이트합니다.

LoRA의 핵심 아이디어는 사전 학습된 모델의 가중치는 그대로 두고, 작은 랭크의 가중치 행렬만 추가하여 업데이트하는 것입니다. 이렇게 하면 모델 성능은 유지하면서도 필요한 메모리와 계산 자원이 크게 줄어듭니다. 역전파 시에도 이 작은 LoRA 가중치에 대해서만 그래디언트를 계산하므로 효율적입니다.

 

 

PEFT

hugging face PEFT library를 사용해서 lora를 쉽게 적용이 가능하다.

Lora_config = LoraConfig(
	r=6,
    lora_alpha = 8,
    lora_dropout = 0.05,
    target_modules = ['q_proj", "k_proj", "v_proj", "o_proj",
    task_type = "CAUSAL_LM",
   )

 

Bits And Bytes

FP32 vs FP16 vs BF16

 

FP16 또는 BF16을 사용하면 메모리 및 연산량을 크게 줄일 수 있다.

BF16의 경우에는 FP16에서 소수부를 일부 지수부로 옮겨 온 것이다.

BF16을 쓰려면 3090 이후의 gpu를 써야 한다.

 

INT 8 vs INT4

심지어 FP32를 INT8, INT4와 같은 매우 작은 범위로 양자화를 해도 비슷한 성능으로 적은 메모리에서 빠른 추론 가능하다.

 

QLoRA

pre -trained 파라미터는 4-bit 양자화로 로딩

학습할 부분만 LoRA 학습

 

이는 hugging face library를 이용해 쉽게 적용 가능하다.

#declare 4bits quantize
quantization_config = BitsAndBytesConfig(
	load_in_4bit = True
    bnb_4bit_quant_type='nf4'
    bnb_4bit_comput_dtype=torch.float16
   )
   
#load 4 bits model

model = AutoModelForCausalLM.from_pretrained(MODEL_ID,
	device_map='auto',
	quantization_config=quantization_config) #이 부분이 4-bit로 변환하는 부분. 안쓰면 16 bit로 로딩된다.

 

기본적으로 optimizer는 32비트로 역전파를 수행한다.

그러나 모델을 추론(Base model) 할 때는 16-bit나 4-bit로 해도 상관이 없다.

 

LoRA = 16bit Transformer가 Base Model이고, 계산하고 싶은 부분만 optimizer를 업데이트.

Adapters에서는 16bit으로 dxr, rxd 연산을 수행한다.

 

QLoRA는 Base model을 4-bit Transformer로 바꿔서 LoRA 모델을 쓰는 것이다.

 

그래도 메모리가 부족하면, optimizer에서 일부의 정보를 CPU에 올렸다가 연산할 수 있는 기능이 QLoRA에 들어가 있다.

 

파인튜닝

파인 튜닝 전에는 대화형 답변을 기본으로 제공한다.

 

Fine-tuning 후에는 긍정이나 부정이라는 단어만 나오게 만들 수 있다.

 

 

https://kimjy99.github.io/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0/lora/

 

[논문리뷰] LoRA: Low-Rank Adaptation of Large Language Models

LoRA 논문 리뷰

kimjy99.github.io

로라를 어떤 레이어에 적용하는 게 좋은가에 대한 논문

 

 

반응형