728x90

TL;DR

  • Chain of X 시리즈 중 Document를 보고 Multi-step Reasoning을 시도하였다.
  • CoD 방식은 정보 정확성이 낮은 문서와 모르는 질문에 대해서도 Robust하게 답변한다.
  • 리트리빙 이후 질문에 대한 passage 정제가 매우 필요해 보인다.

Intro

요즘 Retrieval-augmented language models (RALMs)들은 다음과 같은 문제가 있다.

  1. 관련 없는 데이터에 대한 검색을 할 경우 고유한 지식을 간과하여 질문과 관계없는 답변을 배출한다.
  2. 정보에 대한 평가가 이루어지지 않기 때문에 정확한 답변을 제공하기 위해 내재적 지식과 검색된 지식 모두에서 적절한 지식을 보유하고 있는지 평가하는 데 어려움을 겪는 경우가 많습니다.

따라서 우리는 정보를 제공할 수 없을 시, "제공할 수 없음"으로 배출하는 과정을 겪어야한다.

이러한 과정을 겪을 수 있도록 우리는 Chain-of-Noting(CoN)을 제안. 따라서 Noise와 관련성 없는 문서 확인 그리고 unknown 시나리오에 대해 Facing할 수 있도록 방법을 제안.

  1. Noise Robustness: The ability of a RALM to discern and disregard noisy information present in irrelevant retrieved documents, while appropriately leveraging its intrinsic knowledge.
  2. Unknown Robustness: The capacity of a RALM to acknowledge its limitations by responding with “unknown” when given a query it does not have the corresponding knowledge to answer, and the relevant information is not found within the retrieved documents.

따라서 평가를 3가지 방향으로 잡고 진행하는데, 데이터는 ODQA(TriviaQA), WebQ, RealTimeQA를 사용

  1. overall QA performance using DPR-retrieved documents
  2. noise robustness, assessed by introducing noisy information to the system
  3. unknown robustness, evaluated through queries not covered in the LLaMa-2 pre-training data, i.e., real-time questions.

Method

  1. Note Design
      1. Retrieved document(RD)에 정답에 대한 다이렉트 정보가 있는 경우
      2. RD에 정답에 대한 정보가 애매하게 있는 경우
      3. RD에 정답에 대한 정보가 아예 없거나 관련이 없는 경우3가지 format에 대한 데이터 생성

  • Data generate
    • ChatGPT를 활용하여 생성
    • NQ 에서 1만개 랜덤샘플링하여 지정 프롬프트를 사용하여 note 생성
  • Training
    • LLaMa-2 7B을 사용
    • 일반적인 Loss를 사용할 시 input size가 너무 길어 수렴이 안됌 => Weighted Loss on Notes and Answers전략을 사용
      • 시간을 기준으로 (?) 실제 정답 y에 대한 NTP수행 50%, 나머지 50%는 모든 document가 들어간 input에 대한 y의 NTP 수행

실험

Unknown성능을 제외하고 NQ, TriviaQA, WebQ 세가지 Benchmark dataset을 활용하여 측정, Unknown은 RealTimeQA를 사용한다.

그리곤 전체 QA에 대해서 한번, noise와 unknown에 대해서 한번 실험을 통해 결과를 보여준다.
noise와 unknown 측정 시, 관련 없는 문서를 추출하기 위해 노이즈의 비율을 r이라고 notation하자면
$k \cdot r$ 이 관련없는 문서의 비율이다. 이 갯수를 채울때 까지 iter돌려서 list로 받는다.

  1. QA 성능
    • NQ, TriviaQA, WebQ 3가지 task의 EM, F1스코어로 측정
  2. Noise 성능
    • 리트리빙 된 문서를 하나 제거한 후, 관련없는 top k 1개 문서와 완전 랜덤 wiki 문서 하나를 추가한 성능을 비교한다.
    • 노이즈가 많으면 할루시네이션이 엄청나다는 것을 알 수 있지만, CoN으로 학습된 모델은 비교적 덜 영향을 받는 것으로 보여진다.
    • ![[Pasted image 20231121142801.png]]

  1. Unknown 성능

728x90

What is ICL

정확한 정의: ICL은 사전 학습과 미세 조정을 결합하면서도 작업별 지침이나 프롬프트를 학습 프로세스 중에 통합하는 새로운 접근 방식입니다. 모델은 주어진 지침에 따라 상황에 맞는 응답 또는 출력을 생성하는 방법을 학습하여 특정 작업에 대한 성능을 향상시킵니다.

ICL의 핵심은 weight를 업데이트하지 않고도 별도의 모델 학습 단계 없이 프롬프트의 맥락적 의미(in-context)를 활용하여 답변을 생성하는 것입니다. 다시 말해, Fine-tuning 대신 예시와 함께 상황에 맞는 프롬프트를 사용하여 추론 과정에서 문제를 해결합니다.

더보기

In-context-Learning?
"In-context Learning"은 "Meta Learning"의 한 형태로, 모델이 학습 과정에서 다양한 스킬과 패턴 인식 능력을 개발하여 Inference 단계에서 원하는 작업에 신속하게 적응할 수 있도록 학습하는 것입니다.

Why ICL?

현재 NLP 모델은 다양한 작업을 수행하는 데 뛰어난 성능을 보이며 모델의 파라미터 크기를 증가시키면 성능도 증가하는 연구 결과가 있습니다. 이런 연구 결과로 인해 "스케일 업!"이 강조되고 있습니다. 그러나 한 작업에 특화된 Fine-tuning 과정은 데이터, GPU, 손실 등에서 많은 비용이 듭니다. 따라서 학습된 모델을 활용하여 추론 단계에서 문제를 해결할 수 있다면 비용이 줄어들고 실제 서비스에서 사용할 수 있는 가능성이 큽니다.

 

또한, 예시에 따라 문제를 zero-shot, one-shot, few-shot으로 나눌 수 있는 장점이 있습니다.

Difference With

  1.  사전 학습 (Pre-training): 사전 학습은 라벨이 없는 대규모 데이터에서 모델의 일반적인 언어 이해 능력을 향상시키는 것에 중점을 두며, 반면에 In-context Learning은 적은 데이터셋으로도 작동하지만 작업을 명시하는 프롬프트나 예시를 제공하여 모델의 범용적 문제 해결 능력을 향상시킵니다.
  2. 파인튜닝 (Fine-Tuning): 파인튜닝은 사전 학습된 모델을 기반으로 라벨이 있는 데이터셋에 대한 특정 작업에 맞게 모델을 조정하는 방법입니다. 예를 들어, 분류 모델을 파인튜닝하면 Question Answering 작업에는 성능이 나오지 않을 수 있습니다. 그러나 In-context Learning은 "어떤 작업을 수행할 것인가"라는 프롬프트를 문맥에 제공하기 때문에 라벨이 지정된 데이터셋에 대한 특수한 파인튜닝을 수행하지 않습니다. 이것이 "In-context Learning"이라 불리는 이유입니다.
더보기

Notice!

학습 중에 잘못된 부분이나 오해한 부분이 있다면 언제든지 지적해주시면 감사하겠습니다!


Reference

728x90

What is Pre-training

사전 훈련은 자연어 처리나 컴퓨터 비전 등 다양한 분야에서 사용되는 기계 학습 기술입니다. 이는 큰 데이터셋에서 모델을 훈련하여 데이터의 기반 구조를 포착하는 일반적인 패턴과 표현을 학습하는 과정입니다. 사전 훈련된 모델은 입력 데이터로부터 의미 있는 특징이나 임베딩을 추출하는 방법을 배우며, 이후 이를 작은 작업 특화 데이터셋에 맞게 미세 조정하거나 적용할 수 있습니다. 사전 훈련은 모델이 유용한 지식을 습득하고 작은 데이터셋에 대한 훈련을 줄여줌으로써, 하위 작업에서 더 나은 성능과 빠른 수렴을 이끌어냅니다.


 따라서 대규모 데이터를 통해 언어에 대한 사전 지식을 쌓는 과정으로 BERT에선 Unsupervised Task인 Masked Language model(MLM)과 Next Sentence Prediction(NSP)를 수행하게 된다. (흔히 풀고자하는 분류나 회귀문제가 아니라는 뜻이다.)

Why Pre-training?

  1. 데이터 희소성 보완
    작은 데이터셋에서는 모델을 충분히 훈련시키기 어려운 경우가 많습니다. 사전 훈련을 통해 모델이 데이터 희소성 문제를 극복하고 효과적인 표현을 습득할 수 있습니다.
  2. 자원 절약
    사전 훈련을 통해 모델의 초기 학습을 단축시키고 성능을 향상시킬 수 있으므로, 시간과 자원을 절약할 수 있습니다.
  3. 전이 학습
    사전 훈련된 모델을 다른 작업에 적용하는 것을 전이 학습이라고 합니다. 이는 초기 훈련 단계에서도 빠르게 수렴하게 하며, 새로운 작업에 적합한 표현을 만들어 줍니다. (ex. 리뷰 긍/부정 분류)
  4. 일반적인 특징 학습
    사전 훈련은 모델이 대규모 데이터에서 일반적인 언어 또는 패턴의 특징을 학습하도록 도와줍니다. 이는 다양한 작업에 유용한 범용 표현을 제공합니다.

How Pre-training?

  1. MLM (Masked Language model)
    기존의 RNN같은 방식들은 Unidirectional하게 훈련을 했으므로 Bidirectional하게 훈련하고자 하는 의미에서 수행되는 Task이다. Input이 주어지면 해당 문장의 일부분을 $[MASK]$ 토큰으로 바꾸고, 다른 단어들을 보며 해당 Mask토큰이 무엇일지 마지막 hidden vector를 거쳐 softmax로 들어가 어떤 단어를 출력하는 방식입니다(전체 단어들의 15%이며 이중 80%는 $[MASK]$토큰이며 10%는 랜덤한 단어 그리고 10%는 원본). 이때, Label은 원본 Token이지만 여느 Downstram Task처럼 Label data가 따로 필요없기 때문에 Unsupervised training이다.
  2. NSP (Next Sentence Prediction)
    NLP의 Question Answering (QA) and Natural Language Inference(NLI)와 같은 task에서 두 문장 간의 relationship을 파악하는 것이 매우 중요합니다. BERT는 두 문장이 연결되어 있던 문장인지 예측하는 next sentence prediction을 학습하여 문장 간의 relationship을 파악할 수 있도록 pre-training합니다. 학습을 위해 50%는 연결된 문장, 50%는 랜덤하게 뽑힌 문장으로 학습합니다.

Which point relate to Init_weight?

Hugging Face의 Transformer 라이브러리를 사용하게 되면 사람들의 다양한 사전훈련 모델을 불러올 수 있다. 하지만 우리는 NN(Neural Network)를 훈련하다 보면 모든 파라미터를 Initialize 해야한다. transformers.AutoModel.from_pretrained("bert-base-uncased")를 불러오게 되면 자동으로 init을 해주는데 (말도안되는 의문일지 모르겟지만?) "사전 학습이 된 Weight를 불러오는데 Init을 하게되면 무슨의미가 있나?"라는 생각이 들었다.

 

결론부터 말하면, 원하는 모델 구조를 만들어 두고 weight init을 한 후에 사전학습 weight를 맞는 각 레이어에 overwrite(?)합니다. 예를 들어 분류모델을 하고 싶을 때 transformers.AutoModelForClassfication.from_pretrained("bert-base-uncased")로 모델을 불러온다 하면 BERT Model(output dim = 768) + Pooler Layer (output = 분류 갯수)이 될 것입니다. 따라서 BERT Model에는 사전학습 가중치가 덮어씌워지고 Pooler Layer에는 init_weight에 의한 모델 가중치 초기화가 이루어져 있습니다.


Reference

728x90

Main Idea

Large Language Model(LLM)의 퍼포먼스가 높아지면서 Small Language Model(SLM)가 할 수 없는 Task들이 점차 생겨나고 있다. 특히 Multi-step reasoning(복잡 논리 추론) in math problem by Chain-of-Thought(CoT) prompting에 대해서 SLM은 전혀 학습을 하지 못한다.
 
Model Specializing을 통해 본 논문에선 다음과 같은 가설을 증명한다.

H0 : LLM은 엄청난 모델 파워가 있지만 수행능력이 너무 퍼졌다. 그에 반에 SLM은 제한적인 모델 파워(Capacity)가 있지만, 이 모델 파워를 Task수행능력에 집중시킬 수 있다.

(Capacity란 전반적인 Task들을 수행할 수 있는 능력을 말하며, 이를 줄이고 특정 Task에만 집중하면 그 Task만은 좋은 성능을 보일 수 있다는 가설이다. 즉, Capacity와 Target task performace의 trade-off가 생길 것)

Method

Instruction 기학습된 FlanT5모델을 GPT3.5(Large Teacher Model)에서 배출하는 CoT prompt를 distilling하여 파인튜닝을 하도록 방법론을 설계한다. 또한, GSM8K를 활용하여 CoT를 파인튜닝 했기 때문에 다른 데이터에서의 퍼포먼스 체크를 위해 3가지 다른 Math reasoning data로 증명(OOD: out-of-distribution).
 

 
다만, 실험설계의 약간의 미스를 조정하기 위한 4가지 단계가 있다.

  1. Different Tokenizers. Dynamic Programming을 통해 해결(하지만, 필자는 이부분을 이해하지 못하여 5번째 읽는 중입니다...! / 의견 주세요!!! 제발!!!!)
  2. checkpoint마다 distill퍼포먼스가 다르다 (언제나 FlanT5가 더 좋았으며, T5도 specialize이후 성능이 더 좋긴 했다.)
  3. 내부 데이터의 성능과 외부 데이터의 성능의 영향이 일정하지가 않다. 따라서 tuning data에 대해서 모델 선택을 하지 않는다 (이 부분 해석이 잘 안되었습니다 ㅜㅜ)
  4. Trade-off가 양방향으로 일어난다. distill하여 trade-off가 일어난 후 성능 체크를 위해 BigBench Hard 데이터에 대해 튜닝을 하니, CoT Prompting파워를 잃어버렸다.(굉장히 신기했던 부분 어쩌면 trade-off가 아닌 adaptation이 빠른게 아닐까 싶은 생각이 있다.)

 

다른 신기한 실험 결과는 in-context example에서는 in-context learning와 zero-shot 성능 둘다 향상했지만, zero-shot example에서는 zero-shot이 in-context learning성능을 흡수하는 trade-off현상이 일어났다.

Insight

1. 모델의 capacity를 target task 퍼포먼스로 적응시킬 수 있다.
2. 그 과정에서 어떤 걸 얻고 소모되는 지 정확한 실험 설명을 통해 확인할 수 있다.
3. 단순히 오버피팅이 되지 않았음을 OOD를 통해 증명했다.
 

Experiment Setup

- Train Data: GSM8K
- Test Data: MultiArith, ASDiv, SVAMP, BigBench Hard
- BaseModel: Flan-T5
- Teacher Model(generate distillation / specialize data): GPT3.5(code-davinchi-002)


실험 결과 해석해보기!

1.전체적으로 Trade off된 성능 확인하기
 
 

  
우측의 BigBench-Hard가 원래의 Model Capacity를 측정하는 지표라고 생각하면 된다. 따라서 모델의 전체적인 성능이 정말 떨어지며 Math Problems에 대해서 성능이 확실히 향상된 것을 확인할 수 있다..!!!(놀랍다...!!)
SVAMP에 대해서는 FlanT5-XXL모델이 Specialize가 됬음에도 불구하고 성능이 하락했다. FlanT5중에 가장 파라미터가 높은데 이런 성능을 보이는 것은 어쩌면 이런 distillation은 student모델이 작을수록 새로운 데이터에 대한 학습 수용량이 크다는 걸 뜻하는 것인지 실험을 해볼 필요는 있어보인다.
  
2.정말 Specialize가 유의미한 결과를 낳았을까?

 
  좌측부터 SLM이 in-context learning을 아예 못한다는 것을 증명하며, 오른쪽으로 갈수록 SLM이 COT에 대해 올바르게 학습이 가능하다는 것을 보여준다.
  

Reference

  • Fu, Y., Peng, H., Ou, L., Sabharwal, A., & Khot, T. (2023). Specializing Smaller Language Models towards Multi-Step Reasoning. arXiv preprint arXiv:2301.12726.
728x90

HuggingFace

 우리가 우리 입맛에 맞게 변동 시킬 수 있는 부분 3가지 중 가장 처음으로 고려해야할 Tokenizer를 알아보려고 한다.

  1. Tokenizer
  2. Embedding
  3. Classifier Layer

 Bert base모델의 tokenizer를 불러와서 그냥 깡으로 확인을 해보면 다음과 같다.

tokenizer

#PreTrainedTokenizerFast(name_or_path='bert-base-cased', vocab_size=28996, model_max_len=512, 
#is_fast=True, padding_side='right', truncation_side='right', 
#special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 
#				'cls_token': '[CLS]', 'mask_token': '[MASK]'})

 custom을 하기 전에 BERT만 보고서는 알 수 없는 단어들이 있다. padding과 truncation이다.

Padding

 우선 패딩을 실험해서 결과를 보자면 다음과 같다.

#CLS token은 : 101, PAD token은 : 0, MASK token은:103

 Tokenizer에 문장을 Feeding했을 경우 CLS, MASK 토큰이 자동적으로 치환이 되며, max_length가 문장보다 더 길 경우 PAD 토큰인 0으로 20만큼 채워주는 것으로 확인할 수 있다. 

기본 Tokenizer에서 출력된 값을 확인했을 땐, right이란 뜻은 padding이 되었을 때 문장끝의 오른쪽에 패딩토큰을 넣는 것으로도 확인이 된다.

Truncation

 Truncation같은 경우 해석을 하자면 문장이 짤리는 것이다. 즉, max_length보다 클 경우 자동적으로 잘라 준다는 것이다. 이번 실험엔 max_length를 5로 주면 다음과 같이 출력된다.

 계산대로라면 "France" 단어만 짤려야하는데 the부터 짤린 이유는 padding에서와 같이 cls과 sep토큰을 자동적으로 치환해주기 때문이다. 따라서 max_length-2개만큼 고려를 했다는 뜻이다. 

 그렇다면 "padding은 데이터 손실이 없지만 truncation은 데이터 손실이 일어나지 않는가?"라는 질문이 있을 수 있다. 그걸 고려하여 overflowing_token이라는 함수를 HuggingFace에서 만들어놨다(역시 갓깅페이스;).

 다음과 같이 짤린 갯수만큼 줄줄이 소세지로 반환받는 것을 확인할 수 있다.

'AI > Models' 카테고리의 다른 글

Pre-training과 init_weight  (0) 2023.08.18
HuggingFace 모델 A to Z (1) - 기본 구조와 흐름  (0) 2022.11.29
[NLP] Transformer - self-Attention  (1) 2022.10.06
728x90

HuggingFace

Condition : Model : "bert-base-cased", Sentence : "Paris is the [MASK] of France."

 

다양한 Task와 실험을 하기 위해 기본 BERT모델을 어떻게 사용하는지 내맘대로 무식하게 알아 보았다.

우선 BERT의 기본 구조는 다음과 같다.

 Sentence를 받아 Tokenize하여 Embedding하여 BERT의 Attention모듈에 넣어준다. 그것을 "bert-base-cased"모델 기준으로 12개를 걸쳐 Task에 맞게 Layer로 뽑아내는 것이 전체적인 흐름이다. 

 따라서 우리가 우리 입맛에 맞게 변동 시킬 수 있는 부분은 총 3가지라는 것이다. 

  1. Tokenizer
  2. Embedding
  3. Classifier Layer

위 3가지 모두 차례대로 무식하게 분해해서 분석할 것이지만 지금은 큰 흐름을 파악하고 넘어가기 위해 내일의 나에게 책임을 전가하겠다.

Tokenizer로 Embedding 벡터를 만들어 줄 때 필요한 요소는 다음과 같다.

Token Embeddings, Segment Embeddings, Position Embeddings 총 3가지이다. 하지만 transformer 라이브러리 중 Tokenzier를 통해 나오는 인자들은 다음과 같다.

input_ids, token_type_ids, attention_mask이다. 각각이 무엇을 의미하는 지는 또다시 내일의 내가 책임지겠다. 우선 이렇게 변형 후 모델 인풋값으로 넣어주면 된다.

 

모델 선언은 다음과 같이 하면 모델의 구조를 파악할 수 있다.

뭐가 엄청 많아보이지만 사실 크게 3가지 레이어로 구성되어 있다.

  1. embeddings
  2. encoder(12개)
  3. pooler

임베딩을 거쳐 12개의 BERT Attention Encoder를 지나 Pooler layer를 거치게 되면 어떤 Task인지 간 사용가능한 Last Hidden State 벡터값이 나오게 된다!

'AI > Models' 카테고리의 다른 글

Pre-training과 init_weight  (0) 2023.08.18
HuggingFace 모델 A to Z (2) - Tokenizer  (2) 2023.01.19
[NLP] Transformer - self-Attention  (1) 2022.10.06

+ Recent posts