Abstract:
- 디코딩 (Decoding) 에 대해 먼저 알아야한다:
- 디코딩은 언어 모델이 텍스트를 생성하는 과정에서 답변과 출력을 선택하는 과정을 말함. 즉 디코딩은 모델이 학습된 확률 분포에 기반해 다음에 나올 단어를 선택하는 방식임.
- 디코딩을 하는데는 여러가지 전략들이 있음.
- 그리디 디코딩(Greedy Decoding): 각 단계에서 가장 높은 확률을 가진 단어를 선택하는 방식임. 빠르고 간단하지만, 항상 최선의 답이 아닐 수 있다는 것을 알아야 함. 해당 단어가 가장 적합한 단어임을 나타내는 건 아닐 수 있음.
- Beam Search: 여러 개의 가능한 경로를 동시에 추적하면서 가장 가능성이 높은 답을 찾는 방식임. 그리디 디코딩보다 더 나은 성능을 내지만, 여전히 복잡한 문제에서는 완벽하지 않을 수 있음.
- 빔(beam) 크기를 설정함으로써 탐색을 함. 이 크기는 탐색하는 경로의 수를 정하는 설정임. 최적의 값은 알기 어려움.
- 짧은 경로가 종종 더 높은 확률을 갖는 경향이 있음.
- 확률 분포에서 가장 가능성이 높은 경로들만을 탐색하기 때문에, 다양한 가능성을 고려하지 못하는 경우가 있음.
- 샘플링(Sampling): 확률 분포에서 단어를 무작위로 샘플링하여 출력을 생성하는 방법. 다양한 결과를 내볼 수 있음.
- 이 논문은 Self-Consistency라는 새로운 디코딩 전략을 제안하는 방법임. 기존의 단순한 그리디 디코딩을 대체하는 방법
- 기존의 CoT 방식은 주로 그리디 디코딩을 사용하여 한 번의 추론 경로만 따름, 반면 Self-Consistency는 여러 가지 다양한 추론 경로를 생성한 뒤, 그 중 가장 일관된 답을 선택하는 방식을 사용하는 방법임.
- 이러한 아이디어를 생각한 이유는 복잡한 문제는 여러 경로를 통해 생각할 수 있으며, 다양한 경로가 한 가지 일관된 답으로 수렴할 때 올바른 답에 가까워진다는 직관을 사용하는 것.
- 하나의 방법으로만 풀어서 이걸 정답이라고 선택하는 것보다는 여러가지 방법으로 풀었을 때 일관된 답이 나오는 걸 정답으로 사용하는게 더 높은 정확도를 보여줄 것이라는 것.
- 즉 정답의 일관성을 높이는 방법이다. 한 가지 방법으로만 정답을 맞추는 것보다 여러 방향으로 사고를 해보는게 더 도움이 됨. 어려운 방법으로 풀었다면 정답이 안나올 확률이 높고, 여러 쉬운 방법으로 풀었을 때 정답이 나올 확률이 더 높으니까.
- Self-Consistency 전략이 다양한 문제에서 기존 방식보다 큰 성능 향상을 보였다고 함. 특히 수리 추론 및 상식 추론에서.
Introduction:
- 기존의 Chain-of-Thought (CoT) prompting 방식이 대형 언어 모델의 추론 능력을 향상시킬 수 있지만 여기서 사용하고 있는 그리디 디코딩 방식은 한계가 있다고 함. 그리고 이를 극복하기 위해 Self-Consistency라는 새로운 디코딩 전략을 제안한 것.
- CoT 프롬프팅은 언어 모델이 복잡한 문제를 해결할 때, 사람이 문제를 푸는 과정처럼 단계별로 추론을 진행하도록 유도하는 방법임.
- CoT 프롬프팅은 복잡한 다단계 추론 작업에서 모델의 성능을 크게 향상시키는 것이 밝혀짐.
- 하지만 CoT 프롬프팅은 이 과정에서 그리디 디코딩 방식은 제한적인 경로를 탐색하기 때문에, 최적의 답을 항상 보장하지는 못함.
- Self-Consistency는 CoT 프롬프팅에서 그리디 디코딩을 대체할 수 있는 새로운 디코딩 전략임.
- 이 방법은 샘플링(sample) 과 마지날라이즈(marginalize) 를 이용해서 구현된다:
- sample:
- 모델이 하나의 최적 경로만 선택하는 대신, 다양한 경로를 생성하여 각기 다른 방식으로 문제를 해결함.
- 복잡한 문제일수록 분명 하나의 경로만 있지는 않다는 가정. 여러 문제 해결 과정이 있을 것이라는 가정을 이용함.
- marginalize:
- 여러 추론 경로가 나온 후, 그 중에서 가장 일관된 답을 선택하는 것.
- 이 과정은 사람이 여러 경로로 생각했을 때, 여기서 동일한 답이 나오는 경우 더 높은 확신을 가지고, 정답으로 이어질 확률이 높다는 걸 이용.
- sample:
- Self-Consistency의 특징:
- 추가 모델이나 파인튜닝 불필요: 기존의 학습된 모델 위에서 바로 적용할 수 있음.
- Self-Consistency는 다중 모델을 사용하는 앙상블(ensemble) 방식과 다르게, 하나의 언어 모델 위에서만 동작하는 자체 앙상블(self-ensemble) 방식임.
- Self-Consistency는 샘플링 후 랭킹(sample-and-rank), 빔 서치(beam search), 앙상블 기반 접근법보다도 뛰어난 성능을 발휘함.
Self-Consistency 방법:
Self Consistency 의 올바른 추론의 일관성 가설:
- 다양한 경로를 거치더라도 올바른 추론 과정은 최종 답에서 더 큰 일치도를 보일 것.
- 반면, 잘못된 추론 과정은 다양한 답으로 분산될 가능성이 높을 것.
- 따라서, 여러 추론 경로에서 동일한 답이 반복되면 그 답이 올바를 가능성이 높다는 것
Self-Consistency 방법의 적용:
- a) Chain-of-Thought 프롬프트 제공
- 먼저, 수동으로 작성된 Chain-of-Thought 예시를 언어 모델에 제공
- 이는 모델이 문제 해결에 필요한 추론 과정을 따라가도록 유도
- b) 다양한 후보 출력 샘플링:
- 언어 모델의 디코더에서 샘플링을 통해 여러 개의 후보 출력을 생성하도록 함.
- 이로써 다양한 추론 경로를 얻을 수 있음.
- Self-Consistency는 다음과 같은 기존의 샘플링 알고리즘과 호환됨:
- Temperature Sampling
- Top-k Sampling
- Nucleus Sampling
- c) 답변의 집계 및 최종 답 선택:
- 샘플링된 추론 경로에서 나온 최종 답변들을 집계함.
- 마지날라이징(marginalizing) 과정을 통해 가장 일관된 답변을 선택한다.
- 일관된 답변 선택은 다수결을 이용함.
- 답변 선택 방법은 다수결 말고도 여러가지 방법이 있었음. 확률 가중치 사용 (각 답변에 모델이 해당 답을 생성한 확률을 가중치로 부여하여, 그 확률에 따라 답변을 선택), 길이로 정규화된 확률 가중치 (출력의 길이에 따른 불공정을 보정하기 위해, 확률을 출력 길이로 나누어 정규화 하는 것), 가중 평균 (Weighted Average) (각 답변의 가중치를 그 답변이 등장한 횟수로 나눠 평균을 내는 방법)
- 실험 결과, 다수결 방법이 다른 복잡한 방법들과 비교했을 때 성능이 비슷하거나 더 좋았다고 함.
Self-Consistency의 샘플링 전략과 파라미터에 대한 견고성:
- Self-Consistency가 다양한 샘플링 전략과 파라미터 변화에 얼마나 견고한지를 확인할 수 있었다고 함.
- Temperature Sampling에서 온도 T 를 변화시켜봄
- Top-k Sampling에서 k 값을 조절해봄
- Nucleus Sampling에서 누클리어스 확률 p를 변경해봄
- Self-Consistency는 다양한 샘플링 전략과 파라미터 변화에도 일관된 성능 향상을 보여줬다고 함.
- 작은 규모의 모델에서는 성능 향상이 상대적으로 적었음. 이는 산술 능력과 같은 특정 능력이 모델이 충분한 규모에 도달해야만 나타나기 때문이라고 함.
Self-Consistency가 불완전한 프롬프트에 대한 견고성 향상:
- 수동으로 작성된 프롬프트를 사용하는 few-shot 방법은, 인간 주석자가 프롬프트를 만들 때 사소한 실수를 저지를 수 있음.
- Self-Consistency가 이러한 불완전한 프롬프트에 대해 모델의 견고성을 향상시킬 수 있는지 조사해봄.
- 그리디 디코딩에서는 불완전한 프롬프트로 인해 정확도가 17.1%에서 14.9%로 감소했음.
- 그러나 Self-Consistency를 적용하면 이러한 성능 저하를 보완하고 견고하게 결과를 향상시켰다고 함.
Self-Consistency 특징과 한계 그리고 결론:
- Chain-of-Thought 프롬프팅이 few-shot in-context learning 보다 프롬프팅에서 성능이 떨어지는 경우가 있다고 함.
- Self-Consistency는 CoT 프롬프팅이 성능을 저하시킬 수 있는 상황에서도 안정적으로 성능을 향상시킬 수 있었다고 함.
- Self-Consistency는 일반적인 NLP 작업에서도 신뢰할 수 있는 방법임. 여러 곳에서 활용할 수 있음.
- 단순히 정확도를 높이는 것뿐만 아니라, 추론 작업을 수행할 때 모델의 추론 과정(rationale)을 수집하고, 출력에 대한 불확실성 추정과 모델 출력의 보정(calibration) 개선에도 유용함.
- 계산 비용 증가가 주요 한계로 지적됨. 여러 경로를 샘플링하여 추론해야 하기 때문에, 추론 시간과 자원 소모가 증가함.
- 실제로는 5개 또는 10개의 추론 경로를 샘플링하여 대부분의 성능 향상을 얻을 수 있으며, 이는 과도한 비용 증가를 피할 수 있는 방법이라고 함.
- Self-Consistency를 활용하여 더 나은 지도 학습 데이터(supervised data) 를 생성하고, 이를 통해 모델을 파인튜닝(fine-tuning) 할 수 있다고 함. 파인튜닝 후에는 단일 추론(inference)으로도 더 정확한 예측을 할 수 있을거니.
- 최종 집계에서 일관성(최종 집계된 답변과 일치하는 디코딩의 비율)이 정확도와 높은 상관 관계를 보여줬다고 함:
- 즉, 낮은 일관성은 모델이 해당 답변에 대해 자신감이 낮음을 나타냄.
- 이는 Self-Consistency를 활용하여 모델이 생성한 솔루션에 대한 불확실성 추정치를 제공할 수 있기도 함.
- 이는 Self-Consistency가 모델이 “모르겠을 때 모른다고 인식” 하도록 도와주는 능력을 부여한다는 것을 시사하기도 함.
- 제로샷 CoT에서도 Self-Consistency 는 성능적인 향상을 이끌었다고도 함.
Self-Consistency 방법도 LLM (like OpenAI GPT-4o) 에서 사용할 수 있을까?:
- 다양한 응답을 얻어올 수 있는 설정이 있는지 보면 된다. OpenAI 에서 GPT API 를 쓸 때 적용할 수 있는 파라미터는 다음과 같다:
- messages (array, Required):
- 현재까지의 대화 내용을 담은 메시지의 리스트
- model (string, Required):
- 사용할 모델의 ID. 예를 들어, "gpt-3.5-turbo" 또는 "gpt-4"
- frequency_penalty (number or null, Optional, 기본값: 0):
- 생성된 텍스트에서의 반복 빈도를 제어
- -2.0에서 2.0 사이의 숫자
- 양수 값: 이미 등장한 토큰의 확률을 감소시켜 반복을 줄임
- 음수 값: 이미 등장한 토큰의 확률을 증가시켜 반복을 늘림
- logit_bias (map, Optional, 기본값: null):
- 특정 토큰의 등장 확률을 수정.
- 토큰 ID를 키로, -100에서 100 사이의 값을 값으로 갖는 JSON 객체를 전달
- 예시: { "50256": -100 } // 토큰 ID 50256을 배제
- 양수 값: 해당 토큰의 선택 확률을 증가
- 음수 값: 해당 토큰의 선택 확률을 감소
- logprobs (boolean or null, Optional, 기본값: false):
- 출력 토큰의 로그 확률을 반환할지 여부를 결정
- true로 설정하면 각 출력 토큰의 로그 확률이 메시지의 콘텐츠에 포함되어 반환
- top_logprobs (integer or null, Optional):
- 각 토큰 위치에서 가장 가능성 높은 토큰들을 반환
- 값 범위: 0에서 20 사이의 정수.
- logprobs를 true로 설정해야 함.
- 지정한 수만큼의 상위 토큰과 그에 대한 로그 확률을 반환
- max_tokens (Deprecated, integer or null, Optional)
- 더 이상 사용되지 않는 파라미터로, 생성할 최대 토큰 수를 지정
- max_completion_tokens (integer or null, Optional)
- 생성될 응답의 최대 토큰 수를 설정
- 생성된 출력과 추론 토큰을 포함한 토큰 수의 상한을 지정
- n (integer or null, Optional, 기본값: 1):
- 각 입력 메시지에 대해 생성할 응답의 수를 지정
- n 값을 늘리면 다양한 응답을 얻을 수 있지만, 생성된 모든 토큰에 대해 비용이 발생함.
- presence_penalty (number or null, Optional, 기본값: 0):
- 새로운 주제에 대해 이야기하도록 모델을 유도
- 값 범위: -2.0에서 2.0 사이의 숫자.
- 양수 값: 이전에 등장하지 않은 토픽의 토큰 확률을 높임.
- 음수 값: 이미 등장한 토픽의 토큰 확률을 높임.
- 대화에서 새로운 아이디어나 주제를 도입하고 싶을 때 양수 값을 설정
- response_format (object, Optional):
- 모델이 출력해야 하는 응답 형식을 지정
- 호환 모델: GPT-4o, GPT-4o mini, GPT-4 Turbo, gpt-3.5-turbo-1106 이후 버전
- JSON 스키마를 적용해서 전달해야함.
- seed (integer or null, Optional):
- 결정론적 샘플링을 위한 시드 값을 설정
- 동일한 입력과 시드 값을 사용하면 가능한 한 동일한 출력을 생성하도록 시도
- 완전한 결정론을 보장하지는 않으며, 백엔드 변경 사항은 system_fingerprint 응답 파라미터를 통해 모니터링할 수 있음.
- service_tier (string or null, Optional, 기본값: null):
- 요청 처리에 사용할 지연 시간 등급을 지정
- stop (string / array / null, Optional, 기본값: null):
- API가 생성 중단을 할 토큰 또는 시퀀스를 지정할 수 있음.
- 최대 4개의 시퀀스를 지정할 수 있다.
- 모델은 지정된 시퀀스 중 하나를 생성하면 추가 생성을 중단함.
- stream (boolean or null, Optional, 기본값: false):
- 스트리밍 모드를 활성화함.
- true로 설정하면 ChatGPT와 유사하게 부분적인 메시지 델타를 실시간으로 전송함.
- 각 토큰이 생성될 때마다 Server-Sent Events(SSE)로 전송되며, 데이터 스트림은 data: [DONE] 메시지로 종료된다.
- stream_options (object or null, Optional, 기본값: null):
- 스트리밍 응답에 대한 추가 옵션을 설정하는 것
- 세부적인 스트리밍 동작을 제어할 수 있음.
- temperature (number or null, Optional, 기본값: 1):
- 샘플링 온도를 설정하여 출력의 무작위성을 조절할 수 있음.
- 높은 값 (예: 0.8): 출력이 더 다양하고 창의적이됨.
- 낮은 값 (예: 0.2): 출력이 더 집중되고 결정적이됨.
- 권장 사항: 일반적으로 temperature나 top_p 중 하나만 조절하는 걸 권장.
- top_p (number or null, Optional, 기본값: 1):
- nucleus sampling 를 사용해서 출력의 다양성을 조절
- 값 범위: 0에서 1 사이의 숫자.
- top_p = 0.1: 상위 10% 확률 질량을 가진 토큰만 고려
- 특정 확률 질량 내에서 토큰을 샘플링하여 응답의 품질을 제어
- tools (array, Optional):
- 모델이 호출할 수 있는 도구 목록을 제공하는 것
- 현재 지원: 함수만 도구로 지원됨.
- tool_choice (string or object, Optional):
- 모델이 어떤 도구를 호출할지 제어할 수 있음.
- “none”: 모델이 도구를 호출하지 않고 메시지를 생성
- “auto”: 모델이 메시지를 생성하거나 도구를 호출할 수 있음.
- “required”: 모델이 반드시 하나 이상의 도구를 호출해야함.
- parallel_tool_calls (boolean, Optional, 기본값: true):
- 도구 사용 시 병렬 함수 호출을 활성화할지 여부를 결정
- true로 설정하면 모델이 여러 도구를 병렬로 호출할 수 있음.
- false로 설정하면 도구를 순차적으로 호출함.
- user (string, Optional):
- 최종 사용자를 나타내는 고유 식별자임
- OpenAI가 남용을 모니터링하고 감지하는 데 도움이 됨.
- 개인정보 보호를 위해 식별자는 사용자별로 고유하지만 익명성을 유지해야한다.
- messages (array, Required):
'Generative AI > Prompt Engineering' 카테고리의 다른 글
Fantastically Ordered Prompts and Where to Find Them:Overcoming Few-Shot Prompt Order Sensitivity (0) | 2024.09.30 |
---|---|
What Makes Good In-Context Examples for GPT-3? (0) | 2024.09.30 |
Least-to-Most Prompting enables complex reasoning in LLM (0) | 2024.09.29 |
Automatic Chain of Thought Prompting In LLM (0) | 2024.09.28 |
Better Zero-Shot Reasoning with Role-Play Prompting (0) | 2024.09.23 |