반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Windows
- error
- elasticsearch
- MySQL
- JavaScript
- Python
- logstash
- API
- mariadb
- Ai
- ChatGPT
- Linux
- 엘라스틱서치
- 영어
- Es
- unity
- AWS
- build
- docker
- 설정
- Kibana
- MSSQL
- JS
- nodejs
- ssh
- sample
- 구글
- 유니티
- s3
Archives
- Today
- Total
가끔 보자, 하늘.
수식없이 LLM 이해하기 본문
(* 개인적인 이해를 위해 여기저기 돌아다니며 본 내용을 익히려 정리한 내용입니다. 개인적인 추측성 생각도 조금 있으니 참고하세요. 전문가 형님의 지도 미리 감사합니다. :> )
[LLM 이해를 위한 주요 용어 설명]
Vector Space
- 백터 공간은 벡터들의 집합으로, 벡터들 간의 덧셈과 스칼라 곱셈이 정의되어 있다.
- 벡터 공간은 원점을 가지며, 벡터들 간의 합과 스칼라 곱셈에 대한 8가지 공리(axioms)를 만족해야 한다.
- 벡터 공간에서는 원점과 다른 점 사이의 거리와 방향을 측정할 수 있다.
Affine Space
- 아핀 공간은 점들의 집합으로, 벡터들의 집합과 비슷하지만 원점이 정의되어 있지 않다.
- 아핀 공간에서는 점들 간의 차를 벡터로 생각할 수 있다. 즉, 아핀 공간에서는 점들 간의 거리와 방향만을 고려하며, 점들의 위치에 대한 절대적인 참조점은 없다.
- 아핀 공간은 벡터 공간과는 달리 원점이 없으므로, 스칼라 곱셈이나 벡터의 합에 대한 정의가 없다.
요약하면 백터 공간은 원점을 가지며 벡터들 간의 연산이 가능한 공간이고, 아핀 공간은 원점이 없는 점들의 집합으로 구성된 공간이다. LLM에서 Affine 개념을 사용하는 이유는 Token간의 관계를 학습하기 위함이다. LLM은 텍스트 데이터에서 패턴과 유사성을 학습하여 자연어 이해 및 생성 작업을 수행하는데 사용하는데, 이때 Affine 계층은 입력 토큰의 특징을 잘 파악하여 각 토큰 간의 유사성을 찾는 데 도움을 줄 수 있다.
Hyperparameter
- 기계 학습 모델 훈련을 관리하는 데 사용하는 외부 구성 변수로 임의 조정 가능하다.
- 학습률(Learning Rate), 에포크 수(Epoch times, 훈련 반복 횟수), 가중치 초기화 등을 결정하는데 사용하며, 모델에 따라 다양한 값이 존재한다.
Gradient
- 다변수 함수의 기울기를 나타내는 개념
- 딥러닝에서는 역전파 알고리즘을 통해 각각의 가중치에 대한 손실 함수의 그래디언트를 계산하여 가중치를 업데이트하고, 네트워크의 학습에 사용된다.
순전파(Forward Propagation)
- 순전파는 입력 데이터가 신경망을 통과하고 출력까지 전달되는 과정을 의미한다.
- 각 계층에서 입력은 가중치와 활성화 함수를 거쳐 다음 계층으로 전달된다.
- 순전파 과정에서는 신경망의 출력을 계산하여 손실(오차)를 계산하는데 사용한다.
역전파(Backpropagation)
- 역전파는 순전파에서 계산된 출력과 실제 정답과의 차이(손실)를 이용하여 각 파라미터(가중치 및 편향)에 대한 손실 함수의 그래디언트(기울기)를 계산하는 과정이다.
- 이렇게 계산된 그래디언트는 경사 하강법 등의 최적화 알고리즘을 사용하여 신경망의 파라미터를 업데이트하는 데 사용된다.
- 역전파는 손실을 최소화하기 위해 각 파라미터를 조정하는 과정이라고 할 수 있다.
요약하면 순전파는 입력 데이터를 신경망을 통과시켜 출력을 계산하고, 역전파는 신경망이 얼마나 잘 동작하는지를 평가하고 파라미터를 조정하여 최적화하는 데 사용된다.
[자주 나오는 함수들]
Sigmoid 함수
- 출력값은 0과 1사이
- 입력값이 크면 1에 가까워지고 작으면 0에 가까워진다.
- ReLU 함수와 함께 이진 분류 문제의 출력층에서 주로 사용됨.
Tanh(Hyperbolic Tangent, 쌍곡탄젠트) 함수
- 출력값은 -1과 1사이.
- Sigmoid 함수보다 더 많은 정보를 전달할 수 있으며, 학습 과정에서의 표현 능력을 향상시킬 수 있음.
- 입력 값이 양수던 음수던 0 주변에서 대칭적인 형태를 가짐.
- 역전파 과정에서 Gradient 소실 문제를 완화할 수 있음.
- Sigmoid 함수에 비해 입력 값의 범위가 넓고, 더 큰 그래디언트를 가지고 있기 때문에, 학습 속도가 더 빠를 수 있음.
ReLU
- 입력이 양수라면 1, 음수라면 0을 출력하는 함수
- Gradient 소실 문제를 완화할 수 있음.
- 0이 나올 경우 해당 뉴런의 활성화가 없음을 의미하므로 다음 계층으로 전파되어도 가중치 업데이트에 영향을 미치지 않게 되어 학습에 오류가 발생할 수 있음. 이를 보완하기 위해 Leaky ReLU, Parametric ReLU, ELU 와 같은 보완 함수들이 만들어짐.
Leaky ReLU
- f(x)=max(αx,x) (여기서 α는 작은 양수) (*수식이 없다 하였으나 α 를 붙여 0이 되는걸 방지한다는 걸 기록하기 위해 기록했다.)
- 입력이 양수인 경우에는 입력을 그대로 출력하고, 음수인 경우에는 αx로 출력한다.
- ReLU의 문제점인 dying ReLU 현상을 해결하기 위해 도입되었다.
Softmax 함수
- 다중 클래스 분류 문제에서 출력층에서 사용되며, 각 클래스에 대한 확률 분포를 생성
- 출력값을 0과 1 사이의 확률값으로 변환하여 전체 합이 1이 되도록 만듬.
[주요 모델 설명]
LSTM(Long short time memory)
- LSTM은 RNN의 한 종류로 시계열 데이터의 예측, 자연어 처리, 음성 인식, 이미지 분류 등에서 중요한 역할을 하는 모델 중 하나이다.
- RNN(Recurrent Neural Network)의 장기 의존성 문제(long-term dependencies)를 해결하기 위해서 나온 모델이다.
- RNN은 이전의 입력 데이터를 기억해 다음 출력 값을 결정하는 모델인데 입력 데이터의 길이가 길어지면 그래디언트 소실 문제(Gradient Vanishing Problem)가 발생해 이전의 정보를 제대로 기억하지 못하는 문제가 있다.
- 이를 해결하기 위해 LSTM은 이전 정보를 오랫동안 기억할 수 있는 메모리 셀을 가지고 있으며, 이를 통해 긴 시퀀스 데이터를 처리할 수 있다.
- 단점은 계산 비용이 높고 모델 구조가 복잡하다.
- Cell State
- 이전 상태에서 현재 상태까지 유지되는 정보의 흐름을 나타내며, 이를 통해 LSTM은 오래된 정보를 기억하고 새로운 정보를 적절하게 갱신한다. Cell State는 망각 게이트와 입력 게이트에서 두 번의 변화가 발생하며 Output Gate에 적용한다.
- Forget Gate
- 망각 게이트는 이전 셀 상태의 정보를 지울 것인지 말 것인지를 결정한다.
- Sigmoid 함수로 계산하며 값이 0이면 셀 상태 정보는 0이 되어 사라지고 1이면 그대로 전달된다.
- Input Gate
- 입력 게이트는 새로운 정보를 어떻게 반영할 것인가에 대해 결정한다.
- 이를 통해 기존 정보와 새로운 정보를 적절하게 조합하여 더 정확한 예측을 수행한다.
- Sigmoid 함수와 Tanh 함수를 사용한다.
- Sigmoid 함수는 후보값을 얼마나 전달할지 결정한다.
- Tanh 함수로 출력값을 계산한다.
- Output Gate
- 출력 게이트는 셀 상태 값에 Tanh 함수를 사용한 후 출력이 얼마나 중여한지 조절하기 위해 은닉 상태와 현재 입력에 대한 Sigmoid 함수를 적용하여 0 ~ 1 사이 값을 만든 후 출력하고자 하는 신호(Forget Gate와 Input Gate를 거쳐온 값)와 곱해 크기를 조절 후 최종 출력한다.
seq2seq(sequence-to-sequence)
- 한 시퀀스를 다른 시퀀스로 변환하는 작업을 수행하는 딥러닝 모델
- Encoder와 Decoder라는 모듈을 가지고 있다. 그래서 Encoder-Decoder 모델이라고도 부르기도 한다.
- Encoder는 입력 시퀀스의 각 단어를 순차적으로 처리하면서 각 단계에서 Hidden state를 업데이트하고, 최종적으로 전체 입력 시퀀스를 대표하는 고정 길이의 벡터를 생성한다. 이렇게 생성한 인코딩된 정보를 디코더에 전달한다.(* "Encoder가 생성하는 고정 길이의 백터"의 길이는 모델의 설계와 하이퍼파라미터에 의해 결정되며, 일반적으로 모델의 구조를 정의할 때 사전에 결정된다.)
- Decoder는 인코더의 출력인 고정 길이의 벡터를 기반으로 원하는 출력 시퀀스를 생성하는 역할을 수행한다.
- Encoder/Decoder 모두 RNN, LSTM, GRU 등의 순환 신경망 구조를 사용한다.
- Decoder의 예측은 일반적으로 소프트맥스 활성화 함수를 통해 확률 분포로 변환되며, 가장 확률이 높은 단어가 선택되며 이런 과정이 반복되어 최종적으로 출력 시퀀스가 생성된다.
- 입력 시퀀스를 하나의 고정된 길이의 벡터로 압축하므로 입력 시퀀스의 길이가 긴 경우 정보의 손실이 발생할 수 있다. 이를 경사 소실 또는 폭발 문제가 존재한다고 말하며 이를 개선한 Attention Mechanism 이 있다.
Attention Mechanism
- 입력 문장의 모든 단어를 동일한 가중치로 취급하지 않고, 출력 문장에서 특정 위치에 대응하는 입력 단어들에 더 많은 가중치를 부여하여 입력과 출력의 길이가 다른 경우에도 모델이 더 정확하고 유연하게 작동할 수 있다.
- Attention Function은 입력 시퀀스의 각 단어들에 대한 가중치를 계산하는 함수이다.
- 이 함수는 각 단어의 중요도를 측정해 출력 결과에 반영한다.
- Query(현재 출력 단어를 나타내는 벡터)와 Key/Value(입력 시퀀스의 각 단어에 대응하는 벡터) 세 가지로 구성된다.
- Query 벡터와 Key 벡터 간의 유사도를 측정. 유사도는 내적, 외적 등 다양한 방법으로 계산할 수 있다. 이후 유사도를 정규화하여 각 단어의 가중치를 계산 후 Value 벡터와 곱해져 최종 출력 벡터가 생성된다.
- Dot-Product Attention(내적 연산을 사용해 유사도 계산), Multi-Head Attention(여러 개의 Query, Key, Value 벡터를 사용해 각각의 가중치를 계산 후 다시 결합) 등 다양한 방법으로 구현할 수 있다.
- Softmax, sigmoid, ReLU 함수 등과 같은 활성화 함수와 함께 사용하여 입력 시퀀스의 각 단어들에 대한 가중치를 계산하고 모델의 성능을 향상시키는데 활용한다.
Transformer
- 2017년 구글이 발표한 논문 Attention is all you need(https://arxiv.org/abs/1706.03762)에서 나온 모델.
- 논문 제목 그대로 기존의 seq2seq의 Encoder-Decoder를 Attention만으로 구현한 모델이다.
- 트랜스포머는 단어 입력을 순차적으로 받는 방식이 아니라서 각 단어의 임베딩 벡터에 위치 정보들을 더해 모델의 입력으로 사용하며 이를 Positional Encoding이라 한다.
- 주요 파라미터
- d_model , 트랜스포머의 인코더와 디코더에서의 정해진 입력과 출력의 크기를 의미이다. 인코더와 디코더가 다음 층으로 값을 보낼 때에도 이 차원은 유지한다. 일반적으로 512로 사용된다.
- num_layers , 인코더와 디코더의 층을 이야기하는데 이 값이 5일 경우 인코더와 디코더는 각각 5개의 층을 가진다는 의미이다.
- num_heads , 어텐션을 사용할 때, 1번 하는 것보다 여러 개로 분할하여 병렬로 어텐션을 수행하고 결과값을 다시 하나로 합치는데 이때 이 병렬의 개수를 의미한다.
- d_ff , 트랜스포더의 Feed Forward Network(피드 포워드 신경망)의 출력 차원을 의미한다. 이는 모델의 내부 구조를 결정하며, 모델의 표현 능력과 성능에 영향을 미침. 일반적으로 2048로 사용된다.
- d_ff의 값은 d_model의 값의 영향을 받는데 이 값을 충분히 반영하고 더 복잡한 특징을 학습하기 위해 d_ff을 더 크게 설정한다. d_model값에 scaling factor값을 곱해 결정하는데 scaling factor는 일반적으로 3 혹은 4가 경험적으로 성능이 좋은 값이라고 알려져 있다. 그래서 512 x 4 인 2048을 주로 사용한다.
PEFT (Parameter efficient fine-tuning)
- 사전 훈련된 거대 언어 모델을 특정 상황에 적용할 때, 대부분의 파라미터를 freeze하고, 소수의 모델 파라미터만 fine-tuning하는 기법이다.
- 기존 학습된 파라미터를 freeze하기 때문에 catastrophic forgetting(치명적 망각)에 대한 위험도 줄어들며 학습 비용 또한 줄일 수 있다.
- 보통 파인 튜닝을 하려면 기존 모델 + Gradients + Optimizer states를 저장하는 메모리 크기가 필요하지만 PEFT는 이를 획기적으로 줄일 수 있다.
- 매개변수 크기가 7B(70억)인 모델을 fb16(매개변수 당 2bytes)에서 파인튜닝하려면 모델을 로딩하고(fp16, 7x2 = 14GB), Gradients를 저장하고(fp16, 7x2 = 14GB), Optimizer states(fp32, 7x4x2 = 56GB)를 저장해야 한다. (모델 파라미터와 그라디언트는 메모리를 효율적으로 사용하기 위해 2bytes로 저장할 수 있으나 옵티마이저 상태는 더 많은 정보를 포함하므로 4bytes를 사용해야 한다.) 그럼 총 84GB의 메모리가 필요하다.
- PEFT의 한 방법인 LoRA로 학습시킨다면 모델을 로딩하고(int8, 7x1 = 7GB), LoRA parameters를 선택해 로딩하고(fp16, 전체 매개변수의 0.01~1% 정도, ~1GB), Gradients를 저장하고(fp16, ~1GB), Optimizer states(fp32, ~4GB)를 저장한다면 약 13GB 이하로 학습을 시킬 수 있다.
- PEFT의 대표적인 방법론 다음과 같다.
- 지식증류(Knowledge distillation) , 지식을 크고 성과가 좋은 모델(teacher)에서 더 작은 모델(student)로 전달하는 기술이다.
- 모델 가지치기(Pruning) , 불필요한 가중치나 연결을 제거하는 기법이다.
- 양자화(Quantization) , 모델 매개변수(가중치)의 정밀도를 낮춰 메모리 및 계산 유구 사항을 낮추는 기술. 32bit 부동 소수점 숫자를 16 혹은 8비트 정수 등으로 정밀도를 낮춰 메모리 사용량과 연산 속도를 증가시킨다.
- Low Rank Factorization , 사전 학습된 모델의 가중치 행렬을 row-rank 행렬로 근사화하여 매개 변수 수와 계산 복잡도를 줄인 기술이다.
- 지식 주입(Knowledge Injection) , 원래 모델의 파라미터를 수정하지 않고 태스크 별 정보를 주입하여 특정 태스트에 대한 사전 학습된 모델의 성능을 향상시키는 기술이다.
- 어댑터 모듈(Adapter Modules) , 원래의 파라미터를 수정하지 않고 특정 작업을 위해 사전 학습된 모델에 추가하는 경량 모듈을 말한다. 사전 학습된 모델의 아키텍처의 각기 다른 계층에 삽입이 가능하며, 작업 별 정보만 학습함으로써 효율적인 미세 조정이 가능하다.
- LLM 특화 PEFT 방법론
- LoRA (Low Rank Adaptation) , Low Rank Factorization 방법을 활용하여 LLM의 linear layer에 대한 업데이트를 근사화 하는 기술이다. 학습할 파라미터를 아래와 같이 선정하여 학습하고 Adapter Modules 처럼 필요할 때 추가하여 기존 파라미터를 대체해 결과를 도출한다.
- 먼저 Relevance Score(작업에 대해 얼마나 중요한지를 나타내는 지표로 파라미터의 그라디언트 크기나 해당 파라미터가 모델의 출력에 미치는 영향 등을 기반으로 계산)를 계산한다.
- Relevance Score를 기준으로 상위 k개의 파라미터를 선택한다. top k는 사용자가 설정하는 하이퍼파라미터이다.
- 선정된 파라미터를 미세 조정한다. 0.01~1% 정도를 선정하므로 학습 비용이 낮다.
- Prompt Tuning , LLM이 특정 태스크를 수행하도록 하기 위해 해당 태스크를 자연어로 설명한 '프롬프트'를 입력한 후 입력 데이터를 붙여서 넣는 Prompt Engineering 방식이다.
- Prefix Tuning , Prompt Tuning과 유사한 접근 방식인데, 입력 레이어에만 프롬프트 텐서를 추가하는 대신 모든 레이어의 hidden state에 학습 가능한 파라미터를 추가한다는 차이점이 있다.
(* 계속 추가될 예정입니다.)
반응형
'개발 이야기 > DB, 데이터분석, AI' 카테고리의 다른 글
DATABASE 1~3정규화를 가장 쉽게 이해하기 (0) | 2024.07.20 |
---|---|
Chat with RTX 사용기 (32) | 2024.02.19 |
Elasticsearch 에서 특정 날짜 데이터 재구축이 필요할 때 (32) | 2023.12.27 |
MySQL/MariaDB에 TLS 적용하기 (1) | 2023.12.08 |
Elasticsearch x_content_parse_exception 에러 (1) | 2023.12.07 |