-
Source-Aware Training Enables Knowledge Attribution in Language Models카테고리 없음 2024. 5. 23. 21:45반응형
ChatGPT 요약
더보기서론
대형 언어 모델(LLM)은 사전 학습 중에 방대한 양의 지식을 습득하지만, 종종 해당 지식의 출처를 인식하지 못합니다. 본 논문에서는 LLM이 생성한 응답을 뒷받침하는 사전 학습 소스를 인용하는 '내재적 출처 인용' 문제를 조사합니다. 내재적 출처 인용은 LLM의 투명성, 해석 가능성 및 검증 가능성을 향상시킬 수 있습니다. 이러한 능력을 LLM에 부여하기 위해, 각 문서의 지식을 고유한 출처 문서 식별자와 연결하는 교육을 포함하는 '출처 인식 교육' 방법을 제안합니다. 이 방법은 기존의 사전 학습 및 미세 조정 프레임워크에서 크게 벗어나지 않으며, 실험을 통해 모델 품질에 큰 영향을 미치지 않으면서도 사전 학습 데이터에 대한 신뢰할 수 있는 인용이 가능함을 입증합니다.
관련 연구
언어 모델 출처 인용과 관련된 연구는 최근 들어 더욱 주목받고 있습니다. 일반적으로 출처 인용 접근법은 검색 기반 및 모델 기반으로 분류할 수 있습니다. 검색 기반 접근법은 검색 증강(RAG) 및 사후 인용을 포함하며, 모델 기반 접근법은 모델 자체에 인용 메커니즘을 통합하는 방법입니다. 본 연구에서는 모델 기반 접근법을 채택하여 LLM이 사전 학습 데이터를 인용하도록 하는 교육 절차를 탐구합니다.
출처 인식 교육
출처 인식 교육은 사전 학습 후의 레시피로, LLM이 사전 학습 데이터에서 자신의 응답을 뒷받침하는 문서를 인용할 수 있도록 합니다. 이 교육 절차는 다음과 같은 단계를 포함합니다:
- 고유한 문서 식별자를 문서에 연결하여 모델을 훈련.
- 훈련된 모델을 질문에 답하고 출처를 제공하도록 미세 조정.
데이터
실험 설정을 제어하기 위해, 우리는 합성 사실 형태의 사전 학습 지식을 기반으로 한 BIOCITE 데이터셋을 사용합니다. 이 데이터셋은 가짜 인물들의 전기 정보를 포함하며, 각 전기는 생일, 출생 도시, 전공, 대학, 고용주 및 근무 도시와 같은 여섯 가지 다른 사실을 나열합니다.
실험 및 결과
실험은 80%의 도메인 내(in-domain) 질문과 20%의 도메인 외(out-of-domain) 질문으로 구성된 데이터를 사용하여 진행됩니다. 결과는 다음과 같습니다:
- 문서 ID 삽입 전략에 따라 도메인 외 질문에 대한 답변 일치율이 다릅니다.
- 반복 삽입(REPEAT) 전략이 도메인 외 인용에서 가장 높은 성능을 보였습니다.
- 체인 오브 사고(Chain-of-thought) 인용 설정이 적절한 도메인 외 인용을 달성하면서도 문서 ID를 한 번만 삽입하는 전략보다 더 나은 성능을 보였습니다.
추가 분석
- 문서 ID 삽입 전략이 언어 모델 품질에 미치는 영향을 분석한 결과, DOC-END + CoT 전략이 품질과 도메인 외 인용의 균형을 가장 잘 맞추는 것으로 나타났습니다.
- 문서 복잡성이 증가할수록 도메인 외 인용 성능이 저하되는 경향이 있습니다.
- 문서 수준의 데이터 증강이 도메인 외 인용에 필요하며, 사실 수준의 증강은 큰 효과가 없는 것으로 나타났습니다.
한계점
- 합성 데이터를 사용하였기 때문에 현실 세계 데이터에 대한 일반화 가능성이 제한됩니다.
- 상대적으로 작은 사전 학습 코퍼스와 모델 크기로 실험이 진행되었습니다.
- 출처 인식 교육의 비용 문제도 존재합니다.
결론
본 연구는 모델이 사전 학습 데이터의 출처를 인용할 수 있도록 하는 내재적 출처 인용 문제를 탐구하고, 이를 가능하게 하는 출처 인식 교육 방법을 제안합니다. 본 연구의 결과는 신뢰할 수 있는 언어 모델을 훈련하는 데 유용한 정보를 제공할 것입니다.
구현하기
더보기1단계: 방법 이해하기
이 방법은 두 가지 주요 단계를 포함합니다:
- 문서 ID 주입을 통한 지속적 사전 학습: 각 지식을 고유한 문서 식별자와 연관시키도록 LLM을 학습시킵니다.
- 명령어 조정을 통한 미세 조정: 모델을 질문에 답하고 적절한 문서 식별자를 인용하도록 미세 조정합니다.
2단계: 환경 설정
필요한 도구와 라이브러리를 설치합니다. 일반적으로 Python과 PyTorch 또는 TensorFlow와 같은 딥러닝 라이브러리가 필요합니다. 또한 GPU가 있는 고성능 컴퓨팅 환경이 필요할 수 있습니다.
3단계: 데이터 준비
- 사전 학습 코퍼스 생성:
- BIOCITE와 유사한 데이터셋을 구성합니다. 이 데이터셋은 가짜 인물들의 전기 정보를 포함해야 합니다.
- 각 전기는 생일, 출생 도시, 전공, 대학, 고용주 및 근무 도시와 같은 여섯 가지 다른 사실을 나열합니다.
- 문서 식별자 할당:
- 각 문서에 고유한 식별자를 할당합니다. 이 식별자는 모델이 문서의 내용을 학습하여 연관시킬 수 있는 토큰 시퀀스여야 합니다.
- 데이터 증강:
- 각 문서의 문장을 여러 번 셔플하여 문서 수준의 증강을 수행합니다.
4단계: 문서 ID 주입을 통한 지속적 사전 학습
- 문서 ID 주입 전략:
- 문서 ID를 텍스트에 삽입하는 다양한 전략을 실험합니다 (예: 문서 시작, 끝, 또는 매 문장마다 삽입).
- 사전 학습 절차 수정:
- 문서 ID를 포함하는 사전 학습 과정을 조정합니다. 모델이 콘텐츠와 해당 문서 ID를 연관시키도록 합니다.
- 훈련:
- 이 증강된 데이터셋을 사용하여 모델을 훈련시킵니다. GPT-2 또는 GPT-3와 같은 언어 모델 아키텍처를 사용합니다. 학습 설정에는 다음 단어 예측 작업 중에 문서 ID를 포함해야 합니다.
5단계: 명령어 조정을 통한 미세 조정
- 명령어 조정 데이터 준비:
- 질문과 해당 답변, 그리고 답변을 뒷받침하는 문서 ID를 포함하는 명령어 조정 예제를 만듭니다.
- 미세 조정:
- 이러한 예제를 사용하여 사전 학습된 모델을 미세 조정합니다. 목표는 모델이 올바른 답변과 함께 문서 ID를 생성하도록 학습시키는 것입니다.
6단계: 평가 및 테스트
- 평가 설정:
- 데이터를 도메인 내(in-domain)와 도메인 외(out-of-domain) 하위 집합으로 나눕니다. 도메인 내 데이터는 명령어 조정에 사용하고, 도메인 외 데이터는 평가에 사용합니다.
- 성능 측정:
- 모델이 올바른 답변을 생성하고 올바른 문서 ID를 인용하는 능력을 평가합니다. Hits@k와 같은 지표를 사용하여 문서 ID의 정확성을 평가합니다.
7단계: 최적화 및 반복
- 훈련 전략 최적화:
- 성능을 개선하기 위해 다양한 문서 ID 주입 전략과 증강 기법을 실험합니다.
- 하이퍼파라미터 튜닝:
- 최적의 구성을 찾기 위해 학습률, 배치 크기 및 훈련 에폭 수와 같은 하이퍼파라미터를 튜닝합니다.
예제 구현
import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer # 사전 학습된 모델과 토크나이저 로드 model = GPT2LMHeadModel.from_pretrained('gpt2') tokenizer = GPT2Tokenizer.from_pretrained('gpt2') # 문서 ID를 위한 특수 토큰 추가 special_tokens_dict = {'additional_special_tokens': ['<id>', '</id>']} num_added_toks = tokenizer.add_special_tokens(special_tokens_dict) model.resize_token_embeddings(len(tokenizer)) # 데이터 준비 # documents는 (text, doc_id) 튜플의 리스트라고 가정 documents = [("John Doe was born in New York. He studied at MIT.", "doc-123")] # 문서 ID 주입 함수 def inject_doc_id(text, doc_id, position='end'): if position == 'begin': return f"<id>{doc_id}</id> {text}" elif position == 'end': return f"{text} <id>{doc_id}</id>" elif position == 'repeat': sentences = text.split('. ') return ' '.join([f"{sentence} <id>{doc_id}</id>" for sentence in sentences]) else: return text # 주입된 ID로 학습 데이터 준비 train_data = [inject_doc_id(text, doc_id) for text, doc_id in documents] # 학습 데이터 토크나이즈 inputs = tokenizer(train_data, return_tensors='pt', truncation=True, padding=True) # 학습 루프 (간단히) optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5) model.train() for epoch in range(3): # 학습 에폭 수 optimizer.zero_grad() outputs = model(**inputs, labels=inputs['input_ids']) loss = outputs.loss loss.backward() optimizer.step() print(f"Epoch {epoch+1}, Loss: {loss.item()}") # 학습된 모델 저장 model.save_pretrained('./source_aware_model') tokenizer.save_pretrained('./source_aware_model')
반응형