Skip to content

alpha-geometry

Alpha geometry

Problem

  • 현재의 기계 학습 접근 방식은 인간의 증명을 기계 검증 형식으로 번역하는 데 높은 비용이 들기 때문에 대부분의 수학적 영역에 적용할 수 없음.
  • 특히 기하학은 고유한 번역 (= 사람의 풀이를 기계가 검증할 수 있는 형태로의 변환 ) 문제 로 인해 이 문제가 더욱 심각하며, 그로 인해 훈련 데이터가 매우 부족함

Contribution

  • AlphaGeometry는 인간의 시범을 필요로 하지 않음
  • 다양한 복잡성 수준에서 수백만 개의 정리와 증명을 합성
  • 기하학 문제를 Deduction Database 과 Algebraic Reasoning 을 사용하여 생성한 데이터 셋을 학습 시키고, 이를 이용하여 기하학 문제를 풀어내는 방법을 제안
  • 최신 올림피아드 수준의 문제 30개로 구성된 테스트 세트에서 AlphaGeometry는 25개의 문제를 해결하여 10개의 문제만 해결하는 이전 최고의 방법을 능가하며 평균 국제 수학 올림피아드 (IMO) 금메달리스트의 성과에 접근했음

Solving Strategy

  • 그림은 AlphaGeometry의 개요와 간단한 문제와 IMO 2015 문제 3을 해결하는 방법을 보여준다.
    1. 문제가 주어진다
    2. Symbolic Deduce 를 적용한다
    3. Solve 되었는지 확인한다
    4. Solve 되지 않은 경우 Language Model 을 사용하여 보조 점을 구성한다.
    5. 다시 Symbolic Deduce 를 적용한다.
    6. 문제가 해결될 때까지 4, 5를 반복한다.

Data Generation

  • 합성 데이터 생성 방법

    • 합성 데이터 생성 과정은 무작위로 정리 전제 (Premise) 를 샘플링하여 상징적 추론 엔진 (Symbolic Deduction Engine) 에 입력하는 것에서 시작했음.
    • 샘플링된 전제는 전방 추론 규칙을 사용하여 새로운 참 진술을 연역하며, 결과는 방향성 비순환 그래프로 반환됨.
    • 방향성 비순환 그래프의 노드들은 도달 가능한 결론을 나타내며, 이로부터 합성 훈련 예제 (전제, 결론, 증명)을 생성했음.
  • 기하학적 합성 데이터 생성

    • 기하학에서는 상징적 추론 엔진이 기하학적 규칙을 통해 전제로부터 새로운 진술을 연역하는 역할을 함.
    • 연역 규칙은 확정형 호른 절의 형태로, 점 객체에 대한 기하학적 술어를 포함하고 있음.
    • 대수적 규칙(AR)을 도입하여 각도, 비율, 거리 추적이 가능한 추가적인 기하학적 연역을 수행함.
    • DD와 AR의 를 재귀적으로 수행하여 비순환 방향그래프를 통한 증명을 생성하고, 이를 통해 합성 훈련세트 (전제, 결론, 증명) = (P, N, G(N))을 얻었음
  • 합성 데이터의 결과와 발견
    • 합성 데이터 생성 과정에서 기하학 문헌에 알려진 복잡한 정리와 보조정리를 재발견할 수 있었음.
    • 합성 증명의 길이는 짧은 쪽으로 치우쳐 있지만, 일부는 IMO 테스트 세트의 가장 어려운 문제보다 30% 더 긴 증명을 포함하고 있음.
    • 합성 정리는 인간의 미적 편견에 구속되지 않으며, 유클리드 기하학의 더 넓은 시나리오 집합을 다루고 있음.
    • 중복 제거 후, 1억 개 이상의 고유한 정리와 증명을 얻었으며, 이 과정에서 IMO-AG-30 ( 테스트에 사용 ) 정리는 발견되지 않았음.

Deduction Database (DD)

  • Deduction Database(DD)는 기하학적 정리와 증명을 연역하기 위한 규칙들을 포함한 데이터베이스임.
  • DD는 기하학적 술어와 그 관계를 나타내며, 전제와 결론을 형식적으로 표현해 증명 과정을 구성함.
  • DD에서 사용되는 기하학적 술어에는 점이 동일한 선상에 있는지, 평행한지, 수직인지를 나타내는 술어들이 있음.
  • 이러한 기하학적 술어와 연역 규칙을 조합하여 문제를 풀 수 있음.
Toy Example for Explanation

Example Deduction Engine

  • http://www.mmrc.iss.ac.cn/~xgao/paper/jar-gdbase.pdf
  • predicates 로 다음과 같은 것들이 소개된다

    • points (A, B, C) - 세 점 A, B, C 가 존재한다.
    • coll (E, A, C) - 점 E, A, C 가 같은 선상에 존재한다.
    • para (A, B, C, D) - AB 와 CD 가 평행하다.
    • perp (A, B, C, D) - AB 와 CD 가 수직이다.
    • midp (M, A, B) - M 은 A와 B의 중점이다.
  • premise 는 전제를 의미한다. 문제에서 주어진 조건들을 형식적으로 변환한 것을 의미한다.

    • 다음과 같은 예시를 생각해볼 수 있다.
    premises = [
        ("triangle", "A", "B", "C"),
        ("interior_angle", "angle_ABC", "C")
    ]
    
    • triangle 은 세 점이 삼각형을 이룬다는 것을 의미한다.
    • interior_angle 은 내각을 의미한다. ABC 의 내각이 C 라는 것을 의미한다.
  • conclusion 은 결론을 의미한다. 문제에서 구해야 하는 것을 형식적으로 표현한 것을 의미한다.

    • 다음과 같은 예시를 생각해볼 수 있다.
    goal = ("exterior_angle", "angle_ABC", "angle_BCA", "angle_CAB")
    
    • exterior_angle 은 외각을 의미한다. ABC 의 외각이 BCA 와 CAB 의 합이라는 것을 의미한다.
  • deduction rule 은 추론 규칙을 의미한다.

    • 전제로부터 결론을 도출하는 방법을 의미한다.
    • 아래와 같이, 어떤 전제가 주어질 때 도출할 수 있는 연역적 규칙들을 의미한다.
    • Modus_ponens 와 같은 추론 규칙을 생각해볼 수 있다.
    def exterior_angle_of_triangle(premises):
    new_conclusions = []
    for premise1 in premises:
        if premise1[0] == "triangle":
            A, B, C = premise1[1], premise1[2], premise1[3]
            # 추가적인 전제를 검사합니다.
            for premise2 in premises:
                if premise2[0] == "interior_angle":
                    interior_angle, vertex = premise2[1], premise2[2]
                    if vertex == C and interior_angle == f"angle_{A}{B}{C}":
                        new_conclusions.append(
                            (
                                "exterior_angle",
                                f"angle_{B}{A}{C}",
                                f"angle_{A}{B}{C}",
                                f"angle_{B}{C}{A}",
                            )
                        )
    return new_conclusions
    
  • solver 는 주어진 premisesdeduction rule 을 반복적으로 적용하여 goal 을 도출하는 과정을 의미

    # Solver
    def apply_deduction_rules(premises, goal=None, max_iterations=10000):
        conclusions = []
        seen_premises = set(premises)
        iterations = 0
    
        while True:
            new_conclusions = []
            iterations += 1
    
            # Apply each deduction strategy
            for strategy in [
                sum_of_angles_in_triangle,
                exterior_angle_of_triangle,
            ]:
                strategy_conclusions = strategy(premises)
                for conclusion in strategy_conclusions:
                    if conclusion not in seen_premises:
                        new_conclusions.append(conclusion)
                        seen_premises.add(conclusion)
                        # Check if the goal has been achieved
                        if goal and conclusion == goal:
                            conclusions.append(conclusion)
                            return conclusions
    
            # If no new conclusions, break the loop
            if not new_conclusions:
                break
    
            # If maximum iterations reached, break the loop
            if iterations >= max_iterations:
                print("Max iterations reached, stopping deduction")
                break
    
            conclusions.extend(new_conclusions)
            premises.extend(new_conclusions)  # Update premises with new conclusions
    
        return conclusions
    
    def traceback(conclusions, premises):
        proof = premises.copy()
        for conclusion in conclusions:
            if conclusion not in proof:
                proof.append(conclusion)
        return proof
    
  • 종합적으로 Deduction Engine 을 이용해 문제를 푸는 과정은 다음과 같이 생각해볼 수 있다.

    # 예시: 다양한 전제와 추론 규칙 적용
    premises = [
        ("triangle", "A", "B", "C"),
        ("interior_angle", "angle_ABC", "C")  # 내각의 전제를 추가합니다.
    ]
    goal = ("exterior_angle", "angle_ABC", "angle_BCA", "angle_CAB")
    conclusions = apply_deduction_rules(premises, goal)
    proof = traceback(conclusions, premises)
    
    print(f"Proof:")
    for step in proof:
        print(step)
    
Example
  • M 이 AB 의 중점이고, O 가 AB 에 수직이라면, OA 와 OB 는 같다는 것을 도출하는 deduction rule 을 도출하는 코드이다.
  • 해당 코드는 여기 에서 확인할 수 있다.
def match_midp_perp_cong(
    g: gh.Graph,
    g_matcher: Callable[str, list[tuple[gm.Point, ...]]],
    theorem: pr.Theorem,
) -> Generator[dict[str, gm.Point], None, None]:
  """Match midp M A B, perp O M A B => cong O A O B."""
  for m, a, b in g.all_midps():
    ab = g._get_line(a, b)
    for l in m.neighbors(gm.Line):
      if g.check_perpl(l, ab):
        for o in l.neighbors(gm.Point):
          if o != m:
            yield dict(zip('ABMO', [a, b, m, o]))

Algebraic Reasoning Engine ( AR )

  • Algebraic Reasoning Engine(AR)은 대수적 관계와 기하학적 상수를 처리해 기하학 문제를 해결하는 역할을 함.
  • 기하학에서의 대수적 연역을 수행하기 위해 Gaussian 소거법을 사용함.
  • 기하학적 상수나 거리, 각도와 같은 대수적 관계를 처리하여 새로운 결론을 도출할 수 있음.
  • AR은 복잡한 대수적 조작과 연역을 다룰 수 있어, 기존의 기하학적 증명 방법을 확장함.
Example
class GeometricTable(Table):
  """Abstract class representing the coefficient matrix (table) A."""
  # ... 생략
  def get_all_eqs_and_why(
      self, return_quads: bool
  ) -> Generator[Any, None, None]:
    for out in super().get_all_eqs_and_why(return_quads):
      if len(out) == 3:
        x, y, why = out
        x, y = self.map2obj([x, y])
        yield x, y, why
      if len(out) == 4:
        x, y, f, why = out
        x, y = self.map2obj([x, y])
        yield x, y, f, why
      if len(out) == 5:
        a, b, x, y, why = out
        a, b, x, y = self.map2obj([a, b, x, y])
        yield a, b, x, y, why
  • 아래 예시를 보면 add_eq, add_const_ratio, add_eqratio 를 통해서 전제를 추가하고, get_all_eqs_and_why 를 통해 새롭게 결론을 도출하는 AR 과정을 확인할 수 있다.
  • 실제 코드 예시는 여기 있다.
class RatioTable(GeometricTable):
  """Coefficient matrix A for log(distance)."""

  def __init__(self, name: str = ''):
    name = name or '1'
    super().__init__(name)
    self.one = self.const

  def add_eq(self, l1: gm.Length, l2: gm.Length, dep: pr.Dependency) -> None:
    l1, l2 = self.get_name([l1, l2])
    return super().add_eq3(l1, l2, 0.0, dep)

  def add_const_ratio(
      self, l1: gm.Length, l2: gm.Length, m: float, n: float, dep: pr.Dependency
  ) -> None:
    l1, l2 = self.get_name([l1, l2])
    return super().add_eq2(l1, l2, m, n, dep)

  def add_eqratio(
      self,
      l1: gm.Length,
      l2: gm.Length,
      l3: gm.Length,
      l4: gm.Length,
      dep: pr.Dependency,
  ) -> None:
    l1, l2, l3, l4 = self.get_name([l1, l2, l3, l4])
    return self.add_eq4(l1, l2, l3, l4, dep)

  def get_all_eqs_and_why(self) -> Generator[Any, None, None]:
    return super().get_all_eqs_and_why(True)
  • 실제로 AR 이 적용되는 코드는 여기 에서 확인할 수 있다.

Training LM

  • Transformer 언어 모델은 텍스트 시퀀스를 생성하는 강력한 딥러닝 모델
  • (P, N, G(N))을 '<전제> <결론> <증명>' 구조의 텍스트 문자열로 직렬화하여 언어 모델을 훈련시켰음.
  • 1억 개의 합성 증명 데이터로 사전 훈련된 모델을 기반으로, 특정 작업에 더 잘 맞추기 위해 900만 개의 증명으로 미세 조정을 수행했음.

Why LM is needed ?

  • 상징적 추론 엔진(DD + AR)은 순수한 연역 단계로 문제를 해결하지만, 올림피아드 수준의 문제를 해결하기 위해서는 새로운 증명 용어를 생성하는 것이 필수적.
  • 이러한 증명 단계는 상징적 추론 엔진이 설계되지 않은 보조 구성을 필요로 함.
  • 이전 방법들은 수작업으로 제작된 템플릿과 도메인 특화 휴리스틱을 기반으로 했기 때문에, 하드코딩된 규칙에 의해 인간 경험의 일부만 다룰 수 있었음.
  • 반면, 합성 데이터로 훈련된 신경 해결사는 인간의 시범 없이 처음부터 보조 구성을 수행하는 방법을 학습했음.

Example

  • 실제 예시에서 주어진 전제로부터 AlphaGeometry 는 새로운 보조점(회색)을 생성하고,
  • 지속적으로 Deduction Engine 과 AR 을 통해서 증명을 생성하는 과정을 확인할 수 있다.