일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 피어슨상관계수
- 연속확률변수
- 이변량자료
- 이산형
- 균일분포
- 수학적확률
- Anaconda
- 모평균
- 통계학입문
- 절삭평균
- 모수
- 베르누이분포
- jupyter notebook
- 이산확률질량함수
- 사조사
- 이항분포
- 범주형자료
- 포아송분포
- 기본행연산
- pmf
- 통계학개론
- 누적분포함수
- 조건부확률
- 첨가행렬
- 표본공간
- 표본평균
- 기댓값과 분산
- 수치형자료
- 행사다리꼴
- 확률밀도함수
- Today
- Total
Syeonny의 블로그
[언어] 기초 (5) PLM LLM RAG 본문
241108
자연어 처리의 역사
tf-idf → w2v → seq2seq → PLM → LLM
https://ddevkingsy.tistory.com/113
* 참조
seq2seq
seq2seq
RNN 기반의 many-to-many 구조로 챗봇과 기계 번역에 자주 사용함.
이 모델은 입력 문장을 처리하는 인코더(encoder)와 출력 문장을 생성하는 디코더(decoder)로 구성된다.
- Encoder (인코더): 입력 문장을 받아 context vector로 압축
- Context Vector: 모든 입력 문장의 정보를 하나로 압축하여 디코더로 전달. 이 벡터는 디코더의 첫 번째 히든 상태로 사용
- Decoder (디코더): context vector를 기반으로 단어를 예측하여 순차적으로 출력 디코더는 <sos>(문장 시작) 토큰을 입력받아 다음 단어를 예측하며, <eos>(문장 종료) 토큰이 생성되면 예측을 멈춤
단점: 마지막 디코더 시점의 히든 상태 벡터가 입력 문장의 초반부 정보를 잘 유지하지 못해 정보 손실이 발생함
이를 보완하기 위해 입력 문장의 순서를 뒤집어 넣는 방법을 사용하기도 했음
* bottleneck 병목현상: 인코더에 들어가는 원문에 상관없이 고정된 컨텍스트 벡터를 생성해 디코더에 전달하기 때문에 정보 손실, 아웃풋 문장을 재구성할 때 성능 저하가 발생되는 것
해결책: 이러한 정보 손실 문제를 해결하기 위해 Attention 메커니즘이 등장
attention
Seq2Seq 모델에서 발생하는 병목 현상을 해결하기 위해 도입, 디코더가 출력 단어를 예측할 때 인코더의 모든 은닉 상태를 다시 참조
Attention 메커니즘의 작동 원리
- 디코더의 Time Step마다 작동: 디코더는 각 시점(time step)마다 출력 단어를 예측하기 위해 인코더의 전체 은닉 상태를 참조한다. 이를 통해 예측해야 할 단어와 관련이 높은 입력 단어에 가중치를 부여
개념
- Attention Score:
- 디코더의 현재 시점 에서 단어를 예측하기 위해 인코더의 모든 은닉 상태가 디코더의 현재 은닉 상태 s_t와 얼마나 유사한지를 판단하는 값
- 디코더의 각 time step마다 인코더의 hidden state 벡터와 내적을 계산해 유사도를 구함
- Attention Vector:
- Attention score를 softmax 함수에 통과시켜 생성되며, 각 time step의 hidden state에 대한 가중치를 나타냄
- 가중치의 합은 1로 정규화
- Attention Output Vector:
- Attention vector와 인코더의 hidden state 벡터를 곱해 가중평균을 계산한 벡터
- 이 벡터는 디코더의 다음 예측에 중요한 정보를 전달함
- Output Layer:
- 디코더의 hidden state 벡터와 attention output vector를 concatenate하여 다음 단어 예측의 입력으로 사용함
- 이를 통해 디코더는 인코더의 모든 시점의 정보를 활용해 예측을 수행할 수 있음
작동 방식 요약
- 디코더의 현재 hidden state와 인코더의 모든 hidden state 간의 유사도를 계산하여 attention score를 구함
- Attention score를 softmax로 정규화해 attention vector를 생성
- Attention vector를 이용해 인코더의 hidden state 벡터와 곱하여 attention output vector를 생성
- Attention output vector와 디코더의 hidden state를 합쳐서 다음 단어를 예측하는 input으로 사용
인코더의 고정된 context vector에 의존하지 않음
디코더가 예측 시 필요한 시점마다 중요한 인코더 정보를 직접 참조할 수 있어 정보 손실을 줄이고 성능을 향상시킴
원문이 길어도 성능 감소가 없음
PLM
transformer
attention 으로만 구성됨. 병렬처리 가능
transfer learning
전이학습
self-supervised learning
: 데이터에 일부러 노이즈를 삽입하고 원본을 복사하는 방식으로 학습을 진행함
bert : 주변 단어를 보고 중심 단어를 예측하는 방식으로 사전 학습을 진행
마지막 layer만 파인튜닝을 위해 수정하고 나머지는 모두 사전 학습된 파라미터를 사용함
sota 달성
LLM
Large Language Model
과연 large 라고 붙이는게 맞는가? 에 대한 정의도 필요함. 원래는 그냥 단순한 '언어 모델' 개념이었다.
bert 도 '거대언어'라는 단어가 나오기 전에 출시된 모델임
LLM은 일반 언어 모델보다 더 많은 파라미터, 훈련 데이터 수를 가짐
언어 모델
- 주어진 단어나 문장에 확률을 할당하는 것.
- 총 문장 중 특정한 문장이 나올 확률 / 단어가 주어진 단어 순서대로 나올 확률을 예측함
- 앞의 단어를 갖고 뒤의 단어를 예측하는 것 = 순차적인 단어 예측
베이즈 정리와 어텐션을 기반으로 한 트랜스포머 구조를 활용하여 단어나 문장을 예측, 생성함
* 베이즈 정리
: 조건부 확률과 사전 사후 확률을 갖고 문장에 존재하는 단어에 대한 확률을 갖고 이 각각의 단어의 확률을 더하여 총 문장이 나올 확률을 알아내는 방법. 초기 언어 모델에 사용
GPT
이전 단어들을 보고 다음 단어를 예측하는 방식으로 사전학습을 진행함
인컨텍스트 러닝
: 추가적인 파라미터나 모델 학습 없이 입력 정보만을 바탕으로 학습하는 것
few shot 예제 n개 + 질문
zero shot 예제 0개 + 질문
LoRA
LLM finetuning
PEFT
Bits and Bytes
QLoRA
SLLM finetuning
RAG
retrieval augemented generation
chat-gpt의 문제점
- 할루시네이션: 가짜정보를 (그럴듯하게) 생성하는 것
- 극복방안: 분야의 제한없이 광범위한 주제의 질문을 받고 답변하는 질의응답 시스템을 응용해서 RAG
- 세션을 저장하지 못함
- 보편적인 얘기를 할 수 밖에 없음
- 최신 정보의 부재
- 거대언어 이전: Q&A쌍을 만들어 둠.
- 쿼리 들어오면 제일 유사한 쿼리를 찾아냄. ex) 코사인 유사도이용 후 tf-idf를 이용한 벡터형으로 변환하여 저장.
이를 보완하기 위해 RAG 등장
ODQA 정답이 있는 문서를 함께 보내줌
ODQA(Open Domain Query Answering)
- 1단계: 위키피디어와 같은 대량의 문서들을 수집하고 인덱싱해서 지식베이스에 저장. 최근에는 딥러닝기법을 이용해 각 문서를 벡터로 임베딩. 문서간 유사도가 잘 표현할 수 있도록 임베딩 방법을 학습
- 2단계: 질의가 들어오면 임베딩하고 지식베이스에 임베딩된 문서들과 유사도를 비교해서 응답이 있을만한 문서를 검색
- 3단계: 질의와 검색된 문서를 학습된 언어모델에 입력하고 문서로부터 응답을 추출.
RAG
* 이전 교수님과 진행했던 세미나 jupyter notebook을 참고함
* 추후 블로그 업데이트 예정
(Retrieval-Augmented Generation): 검색된 정보를 바탕으로 언어 모델이 텍스트를 생성하는 방식으로 작동
- 수집한 데이터를 일정 단위(문서 혹은 그보다 작은단위)로 임베딩(Document Indexing).
- 쿼리가 들어오면 임베딩하고 수집된 데이터 임베딩과 유사도를 비교해 가장 유사한 데이터 검색(Retriever).
- 쿼리 + 데이터(문서)로 프롬프트를 작성해 LLM으로부터 결과를 받음(Generator).
RAG 구성 요소
- Document loaders: 대상 문서 읽어오기
- Text Splitting: 문서를 chunk 단위로 splitting
- Text Embedding: 벡터로 임베딩
- Vector Stores: 벡터(+원본) 저장
- Retrievers: 쿼리에 대해 유사벡터 / 문서검색 및 반환
모형을 키워 이전 대화를 반영가능하게 함
문서를 미리 임베딩해놓고 벡터 스토어에 넣어둠. 이후 작은 문서끼리 코사인 유사도를 계산하여 챗봇처럼 사용가능
text splitting 종류
- Character Splitting: 문서를 n개의 문자 단위로 split.
- Recursive Character Text Splitting: chunk size를 넘지 않는 범위에서 separator 기준으로 분리.
- Document Specific Splitting: Level 2를 기반으로 하여, 문서의 종류에 따라 특성에 맞게 각기 다른 separator 적용.
- Semantic Splitting: 하나의 Chunk가 의미적으로 최대한 유사하도록 split. 유사도를 계산함.
- Agentic Splitting: 첫 문장의 주제 파악 후 현재 문장의 주제를 파악. 이전 문장의 주제와 비교해서 동일하면 chunk 유지하며 진행. 주제가 달라지면 새로운 chunk 생성. 2로 돌아가서 마지막 문장까지 반복
- 보통 2를 제일 많이 사용함
Text Embedding
- 텍스트 데이터를 숫자 벡터로 변환
Vector Store
- 임베딩 벡터 저장
- query에 대해 가장 유사한 벡터를 반환하는 retrieve 기능을 함께 제공
- ids: 쿼리된 문서들의 고유 ID를 포함하는 리스트
- distances: 쿼리된 문서들과 입력 쿼리 문서 간의 유사도 점수(거리). 거리 값이 작을수록 두 문서가 유사함
- metadatas: 쿼리된 문서들의 메타데이터
- embeddings: 쿼리된 문서들의 임베딩 벡터를 포함하는 리스트
- documents: 쿼리된 문서들의 실제 텍스트 내용을 포함하는 리스트
- uris: 문서들의 URI(Uniform Resource Identifier)를 포함하는 리스트
- data: 추가적인 데이터를 포함하는 리스트
- included: 쿼리 결과에 포함된 필드를 나타내는 리스트
- query와 유사한 문서의 내용을 store에 검색해서 이를 바탕으로 답변을 생성
- Chroma와 같은 벡터 스토어를 사용할 때, 데이터를 로드할 때 임베딩 함수를 지정해야 한다는 것은,텍스트 데이터를 벡터로 변환하는 함수가 필요하다는 의미
Retriever를 이용한 Q&A 구현
- Retriever
- 주어진 query를 벡터로 변환하고 vector store에서 유사도가 높은 벡터들을 반환.
- 일반적으로 vector store가 기능을 함께 제공.
- Q&A 구현
- Retriever가 반환한 Context와 원래 query로 프롬프트를 생성하고 이를 LLM에 입력하여 답변을 생성.
- Context의 내용만 이용해 답변하도록 하는 프롬프트 템플릿이 필요함.
'딥러닝' 카테고리의 다른 글
[언어] 기초 (4-2) (0) | 2024.11.09 |
---|---|
[언어] 기초 (4) GAN (0) | 2024.11.08 |
[언어] 기초 (3) 모델 셋업 (0) | 2024.11.08 |
[언어] 기초 (2) CF CBF (0) | 2024.11.08 |
[언어] 기초 (1) TF-IDF Word Embedding (0) | 2024.11.08 |