https://openreview.net/pdf?id=YfZ4ZPt8zd


Abstract:

  • CoT 라는 방법 이외에도 추론 능력을 향상 시키기 위한 PoT (Program of Thought) 를 여기서 제안함.
  • 이는 CoT 와 같이 텍스트 기반으로 추론 단계를 표현해서 처리하는게 아닌 문제를 해결하기 위해 프로그래밍 코드를 생성하도록 하고 그 후 코드를 프로그램 해석기(컴파일러나 인터프리터) 가 실행해서 처리하도록 하는 방법을 제안함.
  • 기존의 CoT 는 추론과 계산을 모두 텍스트에서만 이뤄지는 반면에 PoT 는 추론의 영역으로 코드를 작성하고, 계산은 작성된 코드를 통해 실행하는 것이니 계산 능력에서의 정확도를 더 올리는 방법이다. (LLM 은 계산에 약하니까, 계산에서 요구하는 정확한 논리적 규칙을 따르는 것과 언어 모델이 가지는 통계적 기반을 바탕으로 다음 단어를 예측하는 건 서로 이질적이다. 본질적으로 다름.)
  • 그리고 PoT는 Self-Consistency Decoding 기법과 결합하면 매우 우수한 성능을 달성할 수 있다고도 한다. Self-Consistency는 CoT에서도 사용되는 기법으로, 언어 모델이 여러 번 답을 생성할 때 다양한 추론 경로를 탐색하고, 그 결과 중 가장 빈번하게 나타나는 답을 최종 답으로 선택하는 방식임.

 

Introduction:

  • 복잡한 추론 문제를 해결하기 위해서 CoT 가 등장했지만, CoT 에서는 언어 모델이 추론과 계산 모두를 수행해야 하고, 계산 문제에서는 약할 수 있다는 문제점이 있음:
    • LLM의 산술 계산 오류: 특히 큰 숫자를 다룰 때 LLM은 계산 오류에 취약
    • 복잡한 수학적 표현 해결의 한계: 다항식 방정식이나 미분 방정식과 같은 복잡한 수학적 표현을 해결할 수 없음.
    • 반복 표현의 비효율성: 반복 계산 횟수가 많을 때 정확도가 떨어짐.
  • 이러한 문제를 해결하기 위해, 논문에서는 ‘생각의 프로그램(PoT, Program of Thoughts)’ 프롬프트 방식을 제안한다.
  • PoT에서는 계산 단계를 외부 언어 인터프리터에 위임함. 언어 모델은 추론 단계를 파이썬 프로그램 코드로 표현하고, 실제 계산은 파이썬 인터프리터를 통해 수행하는 것
  • PoT 는 LLM 의 수치적 산술 계산 능력을 향상시키기 위한 프롬프트 기법임.
  • PoT 프롬프트 방식을 다섯 개의 MWP 데이터셋(GSM8K, AQuA, SVAMP, TabMWP, MultiArith)과 세 개의 금융 데이터셋(FinQA, ConvFinQA, TATQA)에 대해 평가해보니 CoT보다 모든 데이터셋에서 성능이 크게 향상되었다고 함.

 

PoT vs CoT and PoT PrompT example:

  • CoT는 50번의 반복을 직접 수행해야 하므로 정확도가 매우 낮아짐.

 

 

Program of Thoughts 자세하게:

  • PoT 에서 코드를 생성해나가는 과정 또한 중간 단계를 포함한 다단계 논리적인 사고 과정임.
  • 위의 PoT vs CoT 이미지를 보면 의미있는 이름을 가진 변수명을 생성해내고 (의미적 바인딩), 이런 변수들간의 관계를 정의해내고, 이를 바탕으로 방정식을 만들어나가는 순으로 처리해나간다. 이런 과정을 거쳐서 코드를 작성하기 때문에 한번에 모든 걸 해결하는 방정식을 만든느 것보다 훨씬 수월하게 작업을 처리해나갈거임.

PoT: Few-shot vs Zero-shot:

  • Few-shot 으로 제공해주면 어떻게 코드를 만들어나가면 되는지 이해할거임.
  • Zero-shot 을 보면 주석으로 설명을 제공해주기 때문에 주석을 생성할 가능성이 있음. 그래서 이 경우에는 주석 생성을 억제하도록 해야함. 예를 들면 # 이라는 문자를 생성하지 않도록 하거나.

 

PoT 를 중간 단계 (Intermediate Step) 으로 활용하는 방법:

  • PoT 를 활용하는 하나의 응용 방법이다. 계산 부분 이후에 추가적인 텍스트 추론 과정이 필요하다면 PoT 를 중간 단계로 이용하고 이후에 CoT 를 한번 더 쓰는 식으로 활용할 수 있다.
  • 정리하자면 PoT가 생성한 프로그램은 실행되어 중간 결과를 도출하고, 이 중간 결과는 추가적인 CoT 추론과 결합하여 문제를 해결하는 방식임.
  • 이를 활용하는 방법은 LLM 에게 언제 CoT를 추가적으로 사용해야 하는지를 예시를 통해 가르쳐줘야한다. LLM 이 PoT 로 코드를 생성하고, 코드가 실행되고 난 이후 직접적으로 최종 답이 될 수 있는지 판단해보고 최종 답이 될 수 없다면 "keep prompting" 이란는 문구를 출력해서 CoT 과정을 한번 더 거치도록 하는거임.

 

Ablation Studies(제거 연구):

  • 대표적인 데이터셋인 GSM8K, SVAMP, FinQA에서 비교한 결과, gpt-3.5-turbo가 code-davinci-002보다 더 높은 성능을 보였다고 함. 이건 언어 모델의 코드 생성 능력이 중요하다는 뜻. 언어 모델의 크기가 작거나 코드 생성과 관련된 사전 학습 능력이 적다면 PoT 의 효과는 적을 것.
  • PoT 와 PaL 과의 차이점:
    • PoT는 프로그램 기반 사고 과정을 더 명확하게 설명하고, 이를 통해 단계별로 문제를 해결하려는 접근 방식인 반면 PaL은 더 일반적으로 언어 모델이 문제 해결 과정에서 코드를 생성해 복잡한 계산을 처리하려는 목적을 가지고 있음.
  • PoT 가 CoT 와 비교해서 가장 큰 성능 향상을 보인 문제 유형은 선형/다항식 방정식, 반복, 상징적 연산, 조합론이었음. 반면, 산술, 확률, 기하학 문제에서는 PoT와 CoT의 성능 차이가 크지 않았다고 함. 복잡한 계산이 담길수록 PoT 가 유의미하다.
  • PoT 의 가장 큰 오류 유형은 다음과 같음:
    • 값 연결 오류(Value Grounding Error): 변수에 올바른 값을 할당하지 못한 경우. 즉, 문제에서 주어진 데이터를 올바르게 해석하지 못한 경우임.
    • 논리 생성 오류(Logic Generation Error): 정의된 변수를 기반으로 올바른 계산 과정을 생성하지 못한 경우.
    • 값 연결 오류가 전체 오류의 47%를 차지한다고 한다.

 

PoT 기반의 추가적인 연구들:

  • self-critic(Gou et al., 2023), self-eval(Xie et al., 2023): 자기 평가 방식을 도입해서 견고함을 올리는 방법
  • plan-and-solve(Wang et al., 2023a): 더 세부적인 계획 수립을 통해 LLM이 고차원적인 추론 계획을 수립

 

Discussion, Conclusions, Limitations:

  • PoT는 상징적(symbolic) 추론이 필요한 문제에 적합함. 복잡한 수학 문제나 구조화된 계산 과제에
  • 일반적인 의미 추론(semantic reasoning) 에서는 PoT보다 CoT가 더 효과적일 것으로 추측. 예를 들면 상식적 추론(StrategyQA)과 같은 문제에 대해서는
  • PoT 접근 방식 (계산과 추론을 분리함으로써 LLM의 성능을 향상시키는 방법) 은 수학적 데이터셋에서 LLM의 성능을 크게 향상시켰으며, 상징적 추론(symbolic reasoning) 과제에서도 성과를 보였음.
  • PoT는 LLM이 생성한 코드를 실행해야 하기 때문에, LLM이 위험한 코드를 생성할 가능성이 있긴함. 예를 들어, import os; os.rmdir()와 같은 코드를 생성할 수 있는데, 이는 시스템 파일을 삭제할 수 있어 위험할 수 있다. 이를 방지하기 위해, LLM이 추가 모듈을 가져오지 못하게 차단하고, 사전 정의된 모듈만 사용하도록 제한해야함.
  • PoT는 AQuA 데이터셋의 복잡한 대수학 문제에서 성능이 좋지않았다고 함. 정확도가 58% 정도. (특정 수학 문제에서는 약하기도 하다고 함)

+ Recent posts