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:
      • 여러 추론 경로가 나온 후, 그 중에서 가장 일관된 답을 선택하는 것.
      • 이 과정은 사람이 여러 경로로 생각했을 때, 여기서 동일한 답이 나오는 경우 더 높은 확신을 가지고, 정답으로 이어질 확률이 높다는 걸 이용. 
  • 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가 남용을 모니터링하고 감지하는 데 도움이 됨.
      • 개인정보 보호를 위해 식별자는 사용자별로 고유하지만 익명성을 유지해야한다.

+ Recent posts