본문으로 건너뛰기

GQE에서 BetaE로: 점, 박스, 분포

📍 현재 위치: 5부 · 복합 논리 질의 응답 — 16장. 질의 임베딩: 계산 DAG는 계측기를 만들었습니다: DAG, 정확한 실행기, 쉬움/어려움 프로토콜, 그리고 두 개의 기준 열(오라클 1.0000, 순회 0.1491)입니다. 이 장은 그 앞에 첫 세 신경망 선수를 세웁니다.

앞 장은 빈 열 하나로 끝났습니다: 홀드아웃된 엣지를 추론하여 순회의 0.1491을 이기는 모델입니다. 질의 임베딩(query embedding)은 이 분야의 답이며, 그 움직임은 한 가지 점에서 급진적입니다. 질의 DAG(유향 비순환 그래프, directed acyclic graph)를 개체 집합 위에서 실행하는 대신 그것을 임베딩합니다: 기호 실행기가 하듯이 DAG를 잎에서부터 위로 걷되, 각 노드가 집합이 아니라 벡터 공간 안의 기하학적 대상을 출력하게 하고, 뿌리에서는 모든 개체를 최종 대상까지의 거리로 순위 매깁니다. 실행기의 네 집합 연산자는 학습된 기하학적 연산자가 되고, 모델이 표현할 수 있는 것에 관한 전체 질문은 하나의 설계 결정으로 무너져 내립니다: 질의 노드는 어떤 종류의 대상인가? 세 세대가 세 가지 답을 내놓았습니다. GQE(Graph Query Embedding, 그래프 질의 임베딩)는 점이라고 말하며, "또는"이나 "아니다"를 증명 가능하게 말할 수 없는 빠른 논리곱 실행기를 물려받습니다 [1]. Query2Box는 박스라고 말하며, 이는 합집합을 사 오지만 오직 질의를 임베딩 공간 바깥에서 다시 씀으로써만 그렇게 합니다 [2]. BetaE는 베타 분포의 벡터라고 말하며, 이는 부정을 포함해 전체 조각 아래 닫힌 첫 번째 기하학입니다 [3]. 동반 모듈 clqa_models.py는 이 셋 모두를 하나의 공유 인터페이스 뒤에서 축소판으로 구현하고, 같은 질의 은행 위에서 손으로 쓴 그래디언트로 훈련하며, 앞 장 자신의 filtered_mrr로 채점합니다. 그 커밋된 14행 표가 이 장의 결론입니다.

쉽게 말하면

세 명의 지도 제작자가 도시 지도 위에 "정답이 사는 곳"을 표시해 달라는 부탁을 받았다고 상상해 보십시오. 첫 번째는 압정을 씁니다: 단일 주소에는 완벽하고, "이 두 거리의 교차로 근처"에는 그럭저럭 쓸 만하지만, "이 두 동네 중 아무 곳이나"에는 속수무책이고(압정 하나는 두 곳에 동시에 꽂힐 수 없습니다) "시내를 제외한 모든 곳"에는 터무니없습니다(압정이 없다는 것은 바깥을 뜻하지 않습니다). 두 번째는 직사각형을 씁니다: 동네 하나는 직사각형이고, 두 직사각형이 겹치면 다시 직사각형이지만, 서로 떨어진 두 동네는 여전히 나란히 그려진 두 개의 직사각형이 필요하며, 직사각형의 바깥은 직사각형이 아니므로 "제외하고"는 여전히 말할 수 없습니다. 세 번째는 모서리를 가진 모양을 아예 버리고 열지도(heat map)를 그립니다: 두 지도를 겹치거나, 섞거나, 뜨거움과 차가움을 뒤집는 모든 연산이 또 다른 열지도를 만들어 내므로, 말할 수 없는 것이 없습니다. 뒤집기는 앞의 둘이 결코 할 수 없었던 요령입니다. 압정에서 직사각형으로, 다시 열지도로 이어지는 그 사다리가 바로 GQE에서 Query2Box를 거쳐 BetaE로 가는 길입니다.

이 장에서 다루는 내용

  • 공유된 골격: DAG 위를 걷는 하나의 embed_query, 각 모델이 채워야 하는 여섯 개의 연산자 슬롯(앵커, 사영, 교집합, 합집합, 부정, 거리), 그리고 3권에서 물려받은 통제된 실험 규율: 같은 그래프, 같은 은행, 같은 프로토콜이므로 모델은 오직 실제로 다른 지점에서만 다릅니다.
  • GQE, 점 기준선: 이동으로서의 사영, 순열 불변 DeepSets 풀링으로서의 교집합, 그리고 정직하게 유도된 두 개의 부재 정리: 어떤 점도 합집합을 표현할 수 없는 이유, 그리고 부정이 근사조차 될 수 없는 이유입니다.
  • 확장되었을 뿐 다시 유도되지 않은 Query2Box: 박스 기하학은 3권이 지었습니다; 여기서 새로운 것은 공간 바깥에서 합집합을 사 오는 논리합 표준형 정리이며, 그 대가는 가지의 증식입니다.
  • BetaE의 닫힘: 정확한 대합으로서의 상호 부정, 가중 매개변수 보간으로서의 교집합(베타가 왜 베타로 남는지에 대한 지수-덧셈 유도와 함께), 그리고 매개변수 공간에서 유도되는 드모르간 합집합입니다.
  • 통제된 비교: 동일한 훈련 질의, 동일한 필터링된 음성, 그리고 유한 차분에 맞서 1.8e-09까지 인증된 손으로 쓴 그래디언트를 가진 마진 손실입니다.
  • 세 번의 훑음으로 읽는 커밋된 14행 표: 구조적 이론에 맞선 대시 패턴, 토이 규모에서 정직하게 읽은 공유 행들, 그리고 구성적 일반화 탐침으로서의 제로샷 행들입니다.
  • 해석 가능성이라는 청구서: "질의가 곧 기하학이다"라는 접근이 기호 실행기에 비해 소리 없이 포기하는 것이 무엇인지, 그리고 그것이 어떻게 퍼지 집합 대안을 준비하는지입니다.

하나의 인터페이스, 세 가지 기하학

모델 세 개를 비교하는 실험은 비교 대상 이외의 것에서도 모델들이 다르게 놓아둔다면 무가치합니다. 그래서 동반 모듈은 그 밖의 모든 것을 고정합니다. 세 모델 모두 같은 두 메서드 계약을 구현합니다: embed_query(q)는 앞 장의 은행에서 가져온 질의 DAG를 잎에서부터 위로 걸으며 기하학적 대상들의 리스트를 반환하거나(Query2Box 절이 유도하는 이유로, 논리합 항마다 하나씩입니다), 질의의 연결사 중 하나에 대해 그 기하학이 연산자를 갖지 않으면 예외를 일으킵니다; score(e, q)는 스칼라를 반환하며, 값이 높을수록 "개체 ee가 더 그럴듯한 정답이다"라는 뜻이고, ee의 임베딩에서 반환된 대상 중 가장 가까운 것까지의 거리에 부호를 뒤집어 계산됩니다. 그 아래의 모든 것은 공유되고 기호적입니다: 36개 질의 은행, 쉬움/어려움 분할, 그리고 query_dag.filtered_mrr(query_dag.py 391–408행)가 세 모델 모두를 동일하게 채점합니다. 이는 3권의 임베딩 장들이 세운 규율을 한 단계 위에서 그대로 적용한 것입니다: 표가 차이를 보일 때, 유일하게 가능한 설명은 기하학뿐입니다.

계약을 채운다는 것은 여섯 개의 슬롯을 채운다는 뜻이며, 이 장 전체는 바로 이 표를 풀어놓은 것입니다:

슬롯GQE(점)Query2Box(박스)BetaE(베타 벡터)
질의 대상qR16\mathbf{q} \in \mathbb{R}^{16}(c,o)(\mathbf{c}, \mathbf{o}), 오프셋 o0\mathbf{o} \ge \mathbf{0}, R8\mathbb{R}^{8}2K2K개의 로그 매개변수, K=4K = 4개의 베타
앵커 개체그 점퇴화된 박스, 오프셋 0그 매개변수 벡터
사영 PrP_r이동: q+tr\mathbf{q} + \mathbf{t}_r이동하고 넓히기로그 매개변수 위의 아핀 사상
교집합 I\mathcal{I}성분별 최솟값(DeepSets)어텐션 중심, 축소된 오프셋가중 매개변수 합
합집합 \vee없음(예외 발생)공간 바깥의 DNFDNF(드모르간도 가능)
부정 ¬\neg없음(예외 발생)없음(예외 발생)(α,β)(1/α,1/β)(\alpha, \beta) \mapsto (1/\alpha, 1/\beta)
거리qv2\lVert \mathbf{q} - \mathbf{v} \rVert_2바깥 +  0.2+\; 0.2 \cdot 안쪽kKL\sum_k \mathrm{KL}

여기서 R16\mathbb{R}^{16}은 16개의 실수로 된 목록들의 공간입니다(16은 GQE의 임베딩 차원, 곧 각 개체와 질의가 지니는 좌표의 수입니다; Query2Box는 3권의 boxes.py와 맞추어 8을 씁니다); 기호 \in은 "…의 원소이다"라고 읽으므로, 첫 행은 질의가 그런 목록 하나라는 뜻이 되고, 부정 행의 \mapsto는 "…로 사상된다"라고 읽습니다: 왼쪽의 대상이 오른쪽의 대상으로 보내진다는 뜻입니다. v\mathbf{v}는 후보 개체의 임베딩이고, 2\lVert \cdot \rVert_2는 유클리드 노름이며, DNF는 논리합 표준형(disjunctive normal form)의 약자입니다(Query2Box 절이 유도하는, 합집합을 마지막에 두는 재작성입니다), KL\mathrm{KL}은 확률분포 사이의 쿨백–라이블러 발산으로, BetaE에 이르면 정의됩니다. 표의 기호 셋은 각자의 절에 이르기 전에 지금 이름을 붙여 둘 가치가 있습니다: 박스 열의 c\mathbf{c}는 박스의 중심이고 o\mathbf{o}는 차원별 오프셋(각 좌표에서의 반너비)이며, 부정 행의 (α,β)(\alpha, \beta)는 BetaE 절에서 정의되는 베타 분포의 두 형상 매개변수이고, 거리 행의 합 kKL\sum_k \mathrm{KL}은 베타 슬롯마다 KL 항을 하나씩 더하며 지표 kkK=4K = 4개의 슬롯 위를 달립니다. 두 개의 없음 항목은 구현이 게을러서가 아닙니다; 이들은 이 모듈이 보여 주기 위해 존재하는 구조적 이론이며, 코드는 이들을 장식이 아니라 하중을 지탱하는 것으로 만듭니다. 어떤 연결사에 대해서도 연산자가 없는 모델은 예외를 일으키며, 실험의 대시 패턴은 미리 선언되고 단언됩니다(clqa_models.py 524–532행):

# The structural theory this module exists to demonstrate: which of the 14
# types each geometry can express AT ALL. GQE (conjunctive only) dashes the
# 2 union and 5 negation types; Q2B's DNF buys back the unions; BetaE's
# closed-form complement leaves nothing inexpressible.
DASHES: dict[str, frozenset[str]] = {
"GQE": frozenset({"2u", "up", "2in", "3in", "inp", "pin", "pni"}),
"Q2B": frozenset({"2in", "3in", "inp", "pin", "pni"}),
"BetaE": frozenset(),
}

하네스는 이 패턴을 양방향으로 검증합니다: 대시가 붙은 유형에서는 embed_query가 반드시 StructuralGap을 일으켜야 하고(소리 없이 추측하는 것은 버그일 것입니다), 지원되는 유형에서는 그러지 않아야 합니다(clqa_models.py 633–643행, 681–683행에서 다시 단언됩니다). 따라서 최종 표의 대시는 빠진 숫자가 아니라 기하학에 관해 검사된 수학적 주장입니다.

동일한 교집합 질의 위에서 세 가지 질의 임베딩 기하학을 비교하는 3패널 사다리 도해. 왼쪽 패널은 GQE라는 라벨이 붙어 있고, 개체를 평면 위의 작은 점들로 보여 주며, 질의는 t_r이라는 라벨이 붙은 두 개의 이동 화살표로 도달하는 하나의 점이고, 성분별 최솟값 교집합이 두 개의 후보 점을 하나로 접는다; 그 아래 회색 띠는 합집합과 부정을 사용할 수 없다고 표시하며, 하나의 점은 서로 떨어진 두 개의 정답 군집을 덮을 수 없다는 설명이 붙어 있다. 가운데 패널은 Query2Box라는 라벨이 붙어 있고, 질의를 중심점과 오프셋 화살표를 가진 축에 정렬된 박스로 보여 주며, 박스를 이동시키는 동시에 넓히는 사영 화살표, 두 피연산자 박스의 겹침 안쪽에 엄격히 들어가는 더 작은 박스로 그려진 교집합(피연산자 중심에 0.729와 0.271이라는 어텐션 가중치가 주석으로 달려 있다), 그리고 합집합을 두 개의 별도 박스로 처리하고 점수를 두 거리 중 최솟값으로 취하는 모습을 보여 주는 곁다리 삽화가 있다; 그 아래 회색 띠는 박스의 여집합이 박스가 아니기 때문에 부정을 사용할 수 없다고 표시한다. 오른쪽 패널은 BetaE라는 라벨이 붙어 있고, 단위 구간 위의 종 모양에 가까운 두 베타 밀도 곡선이 섞여 하나의 교집합 밀도가 되는 모습과, 알파와 베타 매개변수를 가진 베타의 곡선이 역수 매개변수 곡선으로 뒤집히는 부정 패널을 보여 주며(정확한 대합이라고 주석이 달려 있다), 그 띠는 열네 가지 질의 유형 모두가 가능함을 보여 준다. 세 패널을 가로지르는 맨 아래 띠는 열네 가지 질의 유형의 대시 패턴을 보여 준다: GQE는 대시 일곱 개, Query2Box는 다섯 개, BetaE는 0개이다. "질의 노드는 어떤 대상인가"에 대한 세 가지 답: 이동하고 풀링할 수만 있는 점, 넓히고 교집합할 수 있지만 합집합은 공간 바깥에서 처리해야 하는 박스, 그리고 교집합과 부정 아래 닫힌 베타 밀도 벡터입니다; 맨 아래 띠는 커밋된 표가 검증하는 7/5/0 대시 패턴입니다. 저자가 AI의 도움을 받아 직접 제작한 원본 도해.

GQE: 점의 정직한 빈곤

GQE(Graph Query Embedding, 그래프 질의 임베딩)는 모든 개체와 모든 질의 노드를 하나의 점으로 임베딩합니다 [1]. 동반 모듈은 이동 변형을 구현합니다: 관계 rr을 한 홉 따라가는 연산자인 사영(projection)은 관계별 벡터 tr\mathbf{t}_r을 더하는 것이며, 이는 정확히 3권의 TransE 움직임을 질의 노드에 그대로 가져온 것입니다; 교집합(intersection)은 가지 임베딩들을 성분별로 풀링합니다(clqa_models.py 222–232행):

def _embed(self, q) -> np.ndarray:
if isinstance(q, str):
return self.ent[E_ID[q]].copy()
if _chain(q):
v = self._embed(q[0])
for r in q[1]:
# P(q, r) = q + t_r (projection = translation)
v = v + self.rel[R_ID[r]]
return v
# I({q_1..q_n}) = elementwise min over the branch embeddings
return np.min(np.stack([self._embed(s) for s in q]), axis=0)

이 최솟값은 잠시 멈추어 볼 가치가 있는데, 그 형태가 취향이 아니라 논리에 의해 강제되기 때문입니다. 교집합은 가지 임베딩들의 집합을 소비하고, 집합에는 피연산자 순서가 없습니다: S1S2=S2S1S_1 \cap S_2 = S_2 \cap S_1이므로, 연산자 I\mathcal{I}는 지표 11부터 nn까지의 모든 재배열 ρ\rho에 대해 I(q1,,qn)=I(qρ(1),,qρ(n))\mathcal{I}(\mathbf{q}_1, \ldots, \mathbf{q}_n) = \mathcal{I}(\mathbf{q}_{\rho(1)}, \ldots, \mathbf{q}_{\rho(n)})를 만족해야 합니다(여기서 nn은 그 노드에서 만나는 가지의 수입니다; 이 재배열이 σ\sigma가 아니라 ρ\rho라는 글자를 받은 것은, σ\sigma가 이 장 뒤쪽에서 시그모이드를 위해 예약되어 있기 때문입니다). 이 성질을 가진 함수를 순열 불변(permutation-invariant)이라고 부르며, 훈련 가능한 것을 짓는 표준 레시피가 DeepSets 형태, 곧 순전파 층으로 감싼 입력들의 대칭 풀링입니다 [4]; GQE가 발표한 교집합은 정확히 그것으로, 풀링으로 성분별 평균 또는 최솟값을 쓰며 그 선택은 검증 데이터에서 이루어집니다 [1]. 동반 모듈은 최솟값으로 고정하고 감싸는 층은 버립니다(그 헤더 39–58행에 분명히 밝혀져 있습니다): 성분별 최솟값은 그 자체로 순열 불변인데, 숫자들의 최솟값은 그 숫자들이 어떤 순서로 도착하는지 신경 쓰지 않기 때문입니다. 채점은 부호를 뒤집은 유클리드 거리, s(v,q)=qv2s(v, q) = -\lVert \mathbf{q} - \mathbf{v} \rVert_2입니다(234–237행; 발표된 모델은 코사인 유사도로 채점하며, 같은 헤더가 이 대체 역시 밝히고 있습니다).

이제 빈곤을, 빠진 기능이 아니라 두 개의 부재 정리로 진술합니다. 어떤 점 연산도 합집합을 표현할 수 없습니다. 임의의 질의점 q\mathbf{q}를 고정하고, 잘 분리된 두 군집에 놓인 두 정답 a\mathbf{a}b\mathbf{b}를 생각합시다. 그 둘 사이의 비정답인 중점은 m=12(a+b)\mathbf{m} = \tfrac{1}{2}(\mathbf{a} + \mathbf{b})입니다. 중점에서 질의로 가는 벡터를 평균으로 씁니다, qm=12(qa)+12(qb)\mathbf{q} - \mathbf{m} = \tfrac{1}{2}(\mathbf{q} - \mathbf{a}) + \tfrac{1}{2}(\mathbf{q} - \mathbf{b}), 그리고 삼각 부등식(합의 노름은 많아야 노름들의 합입니다)을 적용합니다:

qm    12qa+12qb    max(qa,  qb),\lVert \mathbf{q} - \mathbf{m} \rVert \;\le\; \tfrac{1}{2}\lVert \mathbf{q} - \mathbf{a} \rVert + \tfrac{1}{2}\lVert \mathbf{q} - \mathbf{b} \rVert \;\le\; \max\big(\lVert \mathbf{q} - \mathbf{a} \rVert,\; \lVert \mathbf{q} - \mathbf{b} \rVert\big),

마지막 단계는 두 수의 평균이 결코 더 큰 쪽을 넘지 않기 때문입니다. 그래서 중점은 q\mathbf{q}를 어디에 놓든 두 정답 중 더 나쁜 쪽만큼은 좋은 점수를 받습니다. 따라서 서로 떨어진 두 군집을 가진 논리합적 정답 집합은 충실한 단일 점 표현을 가질 수 없습니다: 어떤 점을 고르든 가운데의 어떤 비정답이 적어도 참인 정답만큼 높은 순위를 받고, 프로토콜의 기댓값 순위 동점 규칙 아래에서는 그 동점조차 정답의 순위를 깎아 먹습니다. 부정은 더 나쁩니다: 근사조차 되지 않습니다. 거리 채점 아래에서, "어떤 점이 받아들이는 개체들"은 항상 공(ball)입니다. 즉 어떤 문턱값 τ\tau에 대해 vqτ\lVert \mathbf{v} - \mathbf{q} \rVert \le \tau를 만족하는 집합이며, 공은 유계이고 볼록(convex)합니다(어떤 집합이 그 안의 임의의 두 점 사이의 직선 구간 전체를 담을 때 볼록하다고 부릅니다). 점에 가까운 집합의 여집합은 무계이고 공간의 거의 모든 것이며, 어떤 공도 공의 여집합이 될 수 없습니다; 이것이 정확한 표현을 죽입니다. 볼록성은 근사의 탈출구도 막아 버리는데, 반드시 진술해야 할 가정 하나 아래에서입니다: 부정이 배제해야 하는 개체들(원래의 정답들)이 부정이 포함해야 하는 개체들(여집합)의 볼록 껍질(convex hull) 안에 놓인다는 가정입니다. 여기서 점들의 볼록 껍질이란 그 점들을 담는 가장 작은 볼록 집합이므로, 그 점들을 담는 어떤 볼록 집합이든 그 껍질까지 담습니다. 이는 정확히 여집합 개체들이 사방을 둘러싼, 점에 가까운 정답 집합의 배치이며, 공에게는 치명적입니다: 볼록한 공은 그 껍질의 내부까지 담지 않고서는 둘러싸는 그 외피를 담을 수 없으므로, 여집합을 받아들이는 q\mathbf{q}의 어떤 배치든 원래 거부해야 했던 것도 받아들이게 됩니다. 동반 모듈은 앞서 인용한 예외 발생으로 두 부재를 모두 강제하며, 그 커밋된 실행은 이를 소리 내어 진술합니다:

[3] structural gaps, enforced (embed_query raises, never guesses)
GQE on 2u: StructuralGap — GQE has no union operator (one point cannot cover two disjoint answer regions)
GQE on 2in: StructuralGap — GQE has no negation operator (the complement of a neighborhood is not a neighborhood)
Q2B on 2in: StructuralGap — Q2B has no negation operator (the complement of a box is not a box)
BetaE embeds all 36 bank queries (42 DNF disjuncts) — nothing raises

GQE가 실제로 경쟁하는 곳에서는 진정으로 유능합니다: (아래에서 전체를 인용하는) 커밋된 표에서 1p에 0.6667을, 2i에 완벽한 1.0000을, 그리고 한 번도 훈련되지 않은 pi 유형에 0.4167을 기록합니다. 원래 시스템은 수백만 개의 엣지를 가진 그래프 위에서 부분그래프를 열거하는 비용의 일부만으로 논리곱 질의에 답했으며, 그 자신의 범위 진술은 솔직합니다: 실존 논리곱 질의이며, 논리합과 부정은 범위 밖입니다 [1]. 이후의 두 세대는 한 번에 연결사 하나씩, 점이 말할 수 없었던 것에 대한 값을 치르는 것으로 가장 잘 읽힙니다. ip와 pi조차 GQE에게는 오직 합성을 통해서만 존재합니다: 이 모델은 오직 1p와 2i 형태로만 훈련되었고, 자신의 두 연산자를 사슬로 이음으로써만 더 깊은 유형에 답하며, 이는 표의 제로샷 훑음이 다시 돌아오는 지점입니다.

Query2Box: 박스는 바깥에서 합집합을 사 온다

3권의 박스 임베딩 장은 이미 이 기하학을 완전하게 지었습니다: 질의는 축에 정렬된 박스이고, 중심 c\mathbf{c}에 음이 아닌 차원별 오프셋 o\mathbf{o}를 더한 것입니다; 사영은 중심을 이동시키고 오프셋을 넓히며(홉을 따르는 것은 오직 정답 영역을 키울 수만 있습니다), 점-박스 거리는 바깥쪽 부분과 할인된 안쪽 부분으로 나뉘고, 모든 하위그래디언트가 boxes.py 122–141행에서 꺾인 지점마다 유도되어 있습니다. 그중 어느 것도 여기서 다시 유도되지 않습니다; 이 스위트는 말 그대로 그것을 임포트하며, 할인율을 assert로 고정합니다(clqa_models.py 78행과 84행):

from boxes import ALPHA, box_dist, box_dist_grads, sigmoid, softplus # noqa: E402
assert ALPHA == 0.2 # the Query2Box inside-distance down-weight this suite uses

그래서 표의 모든 Query2Box 셀이 계산에 쓰는 거리는 3권의 것 그대로입니다(boxes.py 105–119행): 후보 개체에서 중심까지의 차원별 간격을 a=vc\mathbf{a} = \lvert \mathbf{v} - \mathbf{c} \rvert로 쓰면,

dbox(v;c,o)  =  max(0,ao)1  +  0.2min(a,o)1,d_{\text{box}}(\mathbf{v};\, \mathbf{c}, \mathbf{o}) \;=\; \big\lVert \max(\mathbf{0},\, \mathbf{a} - \mathbf{o}) \big\rVert_1 \;+\; 0.2 \cdot \big\lVert \min(\mathbf{a},\, \mathbf{o}) \big\rVert_1,

여기서 1\lVert \cdot \rVert_1은 차원에 걸쳐 절댓값을 더합니다: 첫째 항은 점에서 박스 표면까지의 L1 경로(안쪽에서는 0)이고, 둘째 항은 α=0.2\alpha = 0.2로 할인되어 이미 안쪽에 있는 점들을 부드럽게 중심 쪽으로 순위 매깁니다 [2]. 질의-DAG 수준에서 새로운 것이 둘 있습니다. 첫째는 학습된 교집합입니다(clqa_models.py 326–334행):

def _intersect(self, boxes):
"""Cen_∩ = Σ_i a_i c_i with a = softmax(w·c_i);
Off_∩ = min_i(o_i) ⊙ σ(g) — strictly inside the smallest branch."""
Cm = np.stack([c for c, _ in boxes])
Om = np.stack([o for _, o in boxes])
s = Cm @ self.att
a = np.exp(s - s.max())
a /= a.sum()
return a @ Cm, Om.min(axis=0) * sigmoid(self.gate), a

새 중심은 가지 중심들의 어텐션 가중 평균입니다(소프트맥스(softmax), ai=esi/jesja_i = e^{s_i} / \sum_j e^{s_j}는 원시 점수 si=wcis_i = \mathbf{w} \cdot \mathbf{c}_i를 합이 1인 양의 가중치로 바꾸며, 여기서 w\mathbf{w}는 모든 가지가 공유하는 단일한 학습된 점수 벡터, 곧 동반 모듈의 self.att(303행)이므로, 결과는 다시 순열 불변입니다); 새 오프셋은 가지 오프셋들의 성분별 최솟값이며, 학습된 게이트 σ(g)\sigma(\mathbf{g})로 축소됩니다. 여기서 σ\sigma로지스틱 시그모이드(logistic sigmoid) σ(x)=1/(1+ex)\sigma(x) = 1/(1 + e^{-x})로, 그 출력은 엄격히 0과 1 사이에 놓입니다. 그러므로 결과는 결코 가장 작은 가지 박스보다 더 넓어질 수 없습니다: 교집합에 들어오는 모든 가지는 softplus 확장이 엄격히 양수인 투영으로 끝나므로 그 오프셋도 항상 양수이며(boxes.py 92–96행), 결과 오프셋은 모든 차원에서 엄격히 더 작습니다. 이는 집합 의미론(ABAA \cap B \subseteq A)을 반향하는 귀납적 편향이고, 하네스는 훈련된 모델 위에서 정확히 이 엄격한 오프셋 축소를 검사합니다(clqa_models.py 702–708행). 박스 자체의 포함은 보장되지 않는데, 어텐션 가중 중심이 가지 중심들의 볼록 결합이어서 가장 작은 가지 바깥으로 벗어날 수 있기 때문입니다. 풀이된 2i 질의에서 커밋된 내부 값은 다음과 같이 읽힙니다: 어텐션 a=(0.729,0.271)a = (0.729, 0.271), L1 질량이 2.3232.3232.3232.323인 가지 오프셋, 둘 다보다 엄격히 더 작은 교집합 오프셋 1.1541.154입니다.

둘째 새로운 것은 합집합이며, 이는 이 장에서 가장 교훈적인, 부정적인 것이 긍정적인 것으로 뒤집히는 결과입니다. 박스는 점과 같은 중점 논거로 합집합에 실패합니다: 박스는 볼록하므로, 서로 떨어진 두 정답 군집을 담는 어떤 박스든 그 사이의 비정답도 담습니다. Query2Box의 응답은 임시방편이 아니라 정리입니다: 부정 없이 ∃("존재한다"라고 읽습니다), ∧("그리고"), ∨("또는")로 지어지는 조각인 실존 긍정 1차(existential positive first-order, EPFO) 질의는 모두, 합집합이 없는 논리곱 질의들의 합집합인 논리합 표준형(disjunctive normal form, DNF)으로 다시 쓸 수 있으며, 합집합은 맨 마지막 단계로만 적용됩니다 [2]. 이 재작성에는 두 개의 항등식만 필요합니다. 사영은 합집합에 분배됩니다, Pr(AB)=Pr(A)Pr(B)P_r(A \cup B) = P_r(A) \cup P_r(B), 왜냐하면 "ABA \cup B의 어떤 머리가 tt로 가는 rr-엣지를 가진다"는 것은 정확히 AA의 어떤 머리가 그렇거나 BB의 어떤 머리가 그럴 때 성립하기 때문입니다. 그리고 교집합은 합집합에 분배됩니다, (AB)C=(AC)(BC)(A \cup B) \cap C = (A \cap C) \cup (B \cap C). 이 둘을 잎에서부터 위로 적용하면 내부의 모든 \cup가 위로 밀려나 모든 합집합이 뿌리에 놓일 때까지 계속됩니다. 동반 모듈의 dnf(175–191행)가 바로 이 재작성이며, 그 재귀는 두 항등식을 한 줄 한 줄 그대로 반영합니다; 같은 함수는 또한 이 재작성이 할 수 없는 단 한 가지(여집합은 합집합에 분배되지 않습니다)를 거부하는데, 이는 이 은행이 결코 요구하지 않는 것입니다.

합집합이 없는 각 논리합 항은 그 후 자기만의 박스를 받고, 합집합은 점수 수준에서 일어납니다: s(v,q)=maxj(dbox(v;boxj))s(v, q) = \max_j \big( -d_{\text{box}}(\mathbf{v};\, \text{box}_j) \big), 곧 논리합 항 거리들 중 최솟값입니다(336–339행). 그 마지막 집계 단계에서 이 처리는 정확한데, 합집합에 속함은 정확히 논리합 항에 대한 존재이기 때문입니다: 질의의 정답 집합을 (앞 장의 표시 대괄호로) q\llbracket q \rrbracket라고 쓰면, vjqjv \in \bigcup_j \llbracket q_j \rrbracket인 것은 정확히 어떤 jj에 대해 vqjv \in \llbracket q_j \rrbracket일 때이며, 가장 좋은 논리합 항 점수를 취하는 것은 손실 없이 그 "어떤"을 반영합니다. 남아 있는 어떤 오차든 합집합 자체가 아니라 각 논리곱 가지의 임베딩 안에 삽니다. 그 대가는 증식입니다: 재작성은 가지를 곱하며(교집합 피연산자에 대한 코드의 product(*...)), 최악의 경우 합집합 노드 수에 대해 지수적입니다. 커밋된 실행은 우리 은행 위에서 그 비용을 셉니다: 전체 36개 질의 은행은 42개의 논리합 항으로 다시 쓰입니다(구조적 결손 블록의 BetaE 줄에 출력되는데, BetaE가 그 전부를 임베딩하는 유일한 모델이기 때문입니다; Query2Box 자신은 그 은행의 합집합-논리곱 질의 25개, 곧 31개의 논리합 항을 임베딩합니다). 이 임베딩 공간으로부터의 추방이 게을러서가 아니라 필연적인 이유를 설명하는 정리도 있습니다: 합집합을 공간 안에 유지하고 질의마다 하나의 영역이라는 거리-문턱값 읽기를 쓰면, 임베딩 차원이 공간이 구별해야 하는 쌍끼리 서로소인 정답 집합의 수에 비례해 커지도록 강제되며, 이는 지식 그래프 규모에서 개체 수와 같은 자릿수의 차원을 뜻합니다 [2]. 커밋된 표의 2u와 up 행(0.6000과 0.2250)은 오직 이 DNF 경로를 통해서만 Query2Box에게 존재합니다; GQE의 대시가 그 옆에 놓입니다. 그러나 부정은 여전히 손이 닿지 않는 곳에 있습니다: 박스의 여집합은 박스가 아니며, 앞 절에서 인용한 예외 발생이 이를 강제합니다.

BetaE: 밀도로 사 온 닫힘

BetaE는 대상을 경계가 아예 없는 무언가로 바꿈으로써 이 군비 경쟁을 끝냅니다: 각 개체와 각 질의 노드는 KK개의 독립적인 베타 분포(Beta distribution)로 이루어진 벡터가 됩니다 [3]. 베타 분포 Beta(α,β)\mathrm{Beta}(\alpha, \beta)는 단위 구간 위의 확률 밀도로, 0과 1 사이의 xx에 대해 p(x)=xα1(1x)β1/B(α,β)p(x) = x^{\alpha - 1}(1 - x)^{\beta - 1} / B(\alpha, \beta)이며, 여기서 두 개의 양수 형상 매개변수 α\alphaβ\beta는 질량이 어디에 쌓이는지를 제어하고 B(α,β)B(\alpha, \beta)는 밀도의 적분이 1이 되도록 만드는 정규화 상수입니다. 동반 모듈은 대상마다 K=4K = 4개의 베타를 쓰므로, 임베딩은 2K=82K = 8개의 숫자이며, 경사 하강법이 무엇을 하든 매개변수가 양수로 남도록 로그 (lnα,lnβ)(\ln \alpha, \ln \beta)로 저장됩니다; 이 모든 것은 3권의 베타·확률 임베딩 기계 장치(beta.py)이며, 다시 짓지 않고 임포트됩니다.

세 연산자를, DAG가 그들을 만나는 순서대로 봅시다. 사영은 로그 매개변수 위의 관계별 아핀 사상입니다, lWrl+cr\mathbf{l} \mapsto W_r \mathbf{l} + \mathbf{c}_r, 여기서 WrW_r은 학습된 8×88 \times 8 행렬이고 cr\mathbf{c}_r은 학습된 이동입니다(발표된 모델은 여기서 작은 관계별 다층 퍼셉트론을 씁니다; 동반 모듈은 이를 아핀 사상으로 선형화하는데, 아래의 고정된 어텐션 가중치와 같은 단순화 정신입니다). 교집합은 매개변수의 가중 보간이며, 여기서 작은 유도 하나가 공과 박스는 닫혀 있지 않았던 곳에서 이 계열이 왜 닫혀 있는지를 보여 줍니다. 가지 밀도 pi(x)xαi1(1x)βi1p_i(x) \propto x^{\alpha_i - 1}(1 - x)^{\beta_i - 1}(기호 \propto는 "…에 비례한다"라고 읽습니다: 정규화 상수까지는 같다는 뜻입니다)와 합이 1인 음이 아닌 가중치 wiw_i를 취합니다. 자연스러운 전문가 곱(product-of-experts) 결합은 밀도들의 가중 기하평균이며, 그 지수는 단순히 더해집니다:

i=1npi(x)wi    i=1nxwi(αi1)(1x)wi(βi1)  =  xiwiαiiwi(1x)iwiβiiwi,\prod_{i=1}^{n} p_i(x)^{w_i} \;\propto\; \prod_{i=1}^{n} x^{w_i(\alpha_i - 1)} (1 - x)^{w_i(\beta_i - 1)} \;=\; x^{\sum_i w_i \alpha_i \,-\, \sum_i w_i} \,(1 - x)^{\sum_i w_i \beta_i \,-\, \sum_i w_i},

그리고 iwi=1\sum_i w_i = 1이므로 지수는 (iwiαi)1\big(\sum_i w_i \alpha_i\big) - 1(iwiβi)1\big(\sum_i w_i \beta_i\big) - 1입니다: 정규화되지 않은 Beta(iwiαi,  iwiβi)\mathrm{Beta}\big(\sum_i w_i \alpha_i,\; \sum_i w_i \beta_i\big)입니다. 이렇게 베타 밀도를 섞으면 다시 그 계열 안으로 떨어지므로, 교집합은 대체물이 필요 없는 하나의 매개변수 평균입니다. BetaE는 어텐션 네트워크로 가중치를 학습합니다; 동반 모듈은 그것을 균등하게 wi=1/nw_i = 1/n으로 고정합니다(그 헤더가 분명히 그렇게 밝힙니다), 이는 어텐션을 평균으로 대체한 것과 같은 공식입니다(clqa_models.py 455행).

부정은 이 모델이 이 부의 대수적 사다리를 끝내는 이유입니다. 사상

¬Beta(α,β)  =  Beta ⁣(1α,1β)\neg\,\mathrm{Beta}(\alpha, \beta) \;=\; \mathrm{Beta}\!\left(\tfrac{1}{\alpha},\, \tfrac{1}{\beta}\right)

은 밀도가 높은 영역과 낮은 영역을 맞바꿉니다(1보다 큰 매개변수는 질량을 중심에 쌓고, 그 역수인 1보다 작은 매개변수는 그것을 가장자리에 쌓습니다), 그리고 로그 매개변수 공간에서 이는 부호 뒤집기에 불과합니다: ln(1/α)=lnα\ln(1/\alpha) = -\ln \alpha이므로 ll\mathbf{l} \mapsto -\mathbf{l}입니다(clqa_models.py 451행). 이를 두 번 적용하면 (l)=l-(-\mathbf{l}) = \mathbf{l}, 정확히 항등 사상을 줍니다: 부정은 고전적 여집합이 그러하듯이(¬¬A=A\neg\neg A = A) 대합(involution)입니다. 3권은 이를 원시 매개변수 위에서 검증했습니다; 여기서는 하네스가 이를 DAG 수준에서, 훈련된 모델 위에서, 비트 하나까지 다시 검증합니다(clqa_models.py 698–701행):

# -- operator sanity: BetaE's ¬ is an involution at the DAG level (a
# chain r·¬·¬ embeds bit-for-bit as the chain r) ...
assert np.array_equal(models["BetaE"]._embed(("bob", ("advises",))),
models["BetaE"]._embed(("bob", ("advises", N, N))))

교집합과 부정이 모두 닫혀 있으므로, 합집합은 드모르간에 의해 공짜로 따라옵니다: AB=¬(¬A¬B)A \vee B = \neg(\neg A \wedge \neg B). 균등 가중치를 가진 두 가지에 대해 매개변수 공간에서 이를 계산해 봅시다. 각 피연산자를 부정합니다, (αA,βA)(1/αA,1/βA)(\alpha_A, \beta_A) \mapsto (1/\alpha_A, 1/\beta_A); 교집합하면 슬롯마다 평균 12(1/αA+1/αB)\tfrac{1}{2}(1/\alpha_A + 1/\alpha_B)을 줍니다; 다시 부정하면 그 평균의 역수를 줍니다:

αAB  =  21αA+1αB,\alpha_{A \vee B} \;=\; \frac{2}{\dfrac{1}{\alpha_A} + \dfrac{1}{\alpha_B}},

곧 피연산자 매개변수의 조화평균(harmonic mean)이며, β\beta에 대해서도 마찬가지입니다. 그래서 BetaE는 여기서 DNF가 필요 없는, 공간 안에서의 합집합을 가진 첫 번째 기하학입니다. 정직함은 다음 문장을 요구합니다: 실제로는 DNF 경로가 더 정확하며, 원래의 평가는 DNF를 기본값으로 보고하면서 드모르간을 대안 모드로 제공합니다 [3]; 동반 모듈도 이 분야를 따라 합집합을 dnf를 통해 처리합니다(441행). 닫힘은 대수적 성취이지, 자동으로 경험적 성취인 것은 아닙니다.

거리는 슬롯 표의 약속을 현금화합니다. 두 밀도 ppqq 사이의 쿨백–라이블러 발산(Kullback–Leibler divergence, KL)은 KL(pq)=p(x)lnp(x)q(x)dx\mathrm{KL}(p \,\Vert\, q) = \int p(x) \ln \tfrac{p(x)}{q(x)}\, dx이며, 이렇게 읽습니다: 실제로는 pp를 따르는 데이터를 마치 qq를 따르는 것처럼 모형화할 때 겪는 평균적인 추가 놀라움입니다; 두 밀도가 일치할 때 정확히 0이고, ppqq에 질량이 거의 없는 곳에 질량을 쌓을수록 커집니다. 인자를 맞바꾸면 값이 달라지므로 KL은 비대칭이고, BetaE는 그 비대칭성을 활용합니다. 그 거리는 KK개의 슬롯에 걸쳐 합산된 KL입니다, Dist(v;q)=k=1KKL(Beta(αv,k,βv,k)Beta(αq,k,βq,k))\mathrm{Dist}(v; q) = \sum_{k=1}^{K} \mathrm{KL}\big(\mathrm{Beta}(\alpha_{v,k}, \beta_{v,k}) \,\big\Vert\, \mathrm{Beta}(\alpha_{q,k}, \beta_{q,k})\big), 개체를 첫 번째 인자로 두어 질의에 질량이 없는 곳에 집중된 개체가 무겁게 벌점을 받도록 합니다 [3]. 그 닫힌 형식과 그 디감마/트라이감마 편미분은 3권에서 밑바닥부터 지어졌습니다(beta.py 86–97행과 100–115행); 이 모듈은 kl_betakl_grads를 임포트할 뿐 결코 다시 유도하지 않습니다. 경주에 앞서 설계 공간에 관한 메모 하나: 베타만이 유일하게 닫힌 기하학은 아닙니다. 원뿔 임베딩(cone embedding)은 다른 대상, 곧 여집합이 다시 원뿔이 되는 부채꼴 모양의 원뿔로 부정을 되찾으며, 이는 전체 조각 아래에서의 닫힘이 밀도만의 고유한 요령이 아니라 여러 기하학에 설계해 넣을 수 있는 성질임을 보여 줍니다 [5].

동일하게 훈련되다: 통제된 비교

경주는 차선이 공평할 때만 공평합니다. 세 모델 모두 관측된 그래프만으로 지어진 같은 질의 은행 위에서 훈련합니다: 훈련 엣지마다 하나의 1p 질의(15개, clqa_models.py 105행), 그리고 꼬리를 공유하는 관측된 다리들의 순서 없는 모든 쌍을 2i 질의로(4개, 109–112행). BetaE만이 추가로 15개의 2in 질의를 훈련하는데, 엣지마다 하나씩 표본으로 뽑힌 부정된 다리를 가지며(115–130행), 훈련할 ¬\neg를 가진 유일한 모델이기 때문입니다. 세 모델 모두 같은 필터링된 풀에서 음성을 뽑습니다: 각 훈련 질의 qq에 대해 음성은 VALL(q)V - \mathrm{ALL}(q), 곧 전체 개체 집합에서 전체 그래프 위 그 질의의 완전한 정답 집합을 뺀 것에서 옵니다(136–138행), 그래서 홀드아웃된 하드 정답이 거짓 음성으로 밀려나는 일은 결코 없습니다; 3권에서와 마찬가지로, 이 필터가 바로 하드 정답에 대한 일반화가 나오는 지점입니다. 손실을 이야기하기에 앞서 "동일하다"는 말에 정직하게 붙여야 할 단서가 하나 있습니다: 차선들은 은행과 풀과 프로토콜은 공유하지만, 튜닝은 공유하지 않습니다. 각 모델은 자신만의, 3권에서 조정된 마진, 스텝 크기, 에폭 수, 차원을 유지하며(GAMMA, LR, EPOCHS, 그리고 clqa_models.py 88–92행의 두 차원입니다), BetaE만이 추가로 2in 질의를 훈련하기 때문에, 풀 자체는 동일하더라도 그 음성 추출은 첫 에폭이 지나면 다른 두 모델의 것과 갈라집니다. 대시 패턴은 이 선택들 중 어느 것과도 무관하지만 수치 셀들은 그렇지 않으며, 이것이 바로 아래 표 읽기 절이 그 둘을 다르게 신뢰하는 이유입니다. 세 모델 모두 (질의, 정답, 음성) 삼중항마다 같은 마진 순위 손실(margin ranking loss) 형태를 최소화하되, 각자 자신의 마진 γ\gamma를 갖습니다,

L  =  max(0,  γ+d(v+;q)    d(v;q)),L \;=\; \max\big(0,\; \gamma + d(\mathbf{v}^{+};\, q) \;-\; d(\mathbf{v}^{-};\, q)\big),

이렇게 읽습니다: 참 정답은 표본으로 뽑힌 음성보다 적어도 마진 γ\gamma만큼 질의 대상에 더 가까이 있어야 하며, 그렇지 않으면 위반이 청구됩니다. 힌지가 활성일 때, 질의가 건드리는 모든 매개변수 θ\theta에 대해 L/θ=dpos/θdneg/θ\partial L / \partial \theta = \partial d_{\text{pos}} / \partial \theta - \partial d_{\text{neg}} / \partial \theta이고(기호 \partial는 편미분을 나타내므로, L/θ\partial L / \partial \theta는 "매개변수 θ\theta 혼자 움직일 때 손실 LL이 얼마나 빨리 변하는가"라고 읽습니다), 이 편미분들은 하나하나 손으로 쓰입니다: GQE의 노름 하위그래디언트와 최솟값-마스크 라우팅(마스크는 _embed_train, clqa_models.py 240–254행에서 만들어지고 256–273행에서 적용됩니다), Query2Box의 어텐션 소프트맥스, 오프셋 최솟값, σ\sigma, 그리고 소프트플러스(softplus)를 관통하는 연쇄 법칙입니다. 여기서 softplus(x)=ln(1+ex)\mathrm{softplus}(x) = \ln(1 + e^{x})는 사영의 너비 증가분을 음이 아닌 채로 유지하는 매끄러운 양의 경사면이고, 시그모이드 σ\sigma는 정확히 그 도함수입니다(342–409행, 소프트맥스 야코비안은 380–390행의 주석에 풀이되어 있습니다), 그리고 BetaE의 지수 함수들과 아핀 사상들을 관통하는 연쇄입니다(467–513행). 박스 거리 하위그래디언트와 베타-KL 편미분 그 자체는 3권의 것으로, 박스 임베딩베타·확률 임베딩 장에서 유도되어 여기로 임포트되었습니다; 이 장은 그 작업을 반복하지 않습니다.

손으로 쓴 그래디언트는 검사될 때에만 제 몫을 하며, 여기서의 검사는 다시 유도하는 것보다 더 강력합니다: 하네스는 갓 만든 모델의 모든 매개변수 좌표±106\pm 10^{-6}만큼 흔들고, 그 스텝 자신의 손실을 다시 계산하며, 중심 유한 차분을 그 스텝이 실제로 적용한 갱신 (θbeforeθafter)/η(\theta_{\text{before}} - \theta_{\text{after}})/\eta과 비교합니다(여기서 η\eta는 그 스텝이 쓴 학습률이므로, 이 몫은 그 스텝이 함의한 그래디언트를 되찾아 줍니다)(_fd_audit, 549–578행). 반환된 공식이 아니라 실제로 적용된 갱신을 감사하는 것은 미묘한 종류의 버그를 잡아냅니다: 두 다리가 관계를 공유하는 2i 질의에서, 루프 안에서 공유 매개변수를 갱신하면 둘째 다리의 그래디언트를 이미 움직인 점에서 평가하게 될 것입니다. 커밋된 결론은 다음과 같습니다:

[5] gradient audit: each model's APPLIED step vs central finite differences
...
GQE max |implied − FD| = 5.98e-10 (tolerance 1e-05)
Q2B max |implied − FD| = 3.29e-10 (tolerance 1e-05)
BetaE max |implied − FD| = 1.80e-09 (tolerance 1e-05)

훈련 그 자체는 설계상 특별할 것이 없으며, 이것이 바로 통제된 비교의 요점입니다. 커밋된 손실 추이(에폭당 평균 마진 손실, 1, 100, 500, 그리고 마지막 에폭에서의 스냅숏)는 다음과 같습니다:

[1] training: mean margin loss per epoch snapshot
GQE [1] 1.1849 [100] 0.1173 [500] 0.1853 [1000] 0.1372
Q2B [1] 1.8404 [100] 0.0209 [500] 0.0000 [1500] 0.0000
BetaE [1] 1.0130 [100] 0.0000 [500] 0.0000 [1000] 0.0000

Query2Box와 BetaE는 힌지를 0까지 몰아붙입니다; GQE는 0.14 근처에 정착해 그곳에 머무르며 떨립니다(개체를 단위 구에 매 에폭 재정규화하는 것이 마진 손실을 정직하게 유지하지만 동시에 그것이 사라지지 못하게 막습니다, 275–279행). 풀이된 질의 하나가 세 모델 모두 암기가 아니라 일반화하고 있음을 보여 줍니다. 2i 질의 authored(alice, x) ∧ authored(bob, x)는 단일 정답 p1을 가지며, 엣지 (bob, authored, p1)이 홀드아웃되어 있어 훈련 그래프의 순회는 공집합을 돌려줍니다; 커밋된 실행은 세 모델 모두에서 p1을 1위에 둡니다:

[2] one worked 2i query: authored(alice, x) ∧ authored(bob, x) — hard answer p1
((bob, authored, p1) is held out: traversal of G_train finds NOTHING here)
GQE top-3: p1=-0.475 p2=-1.178 alice=-1.471 (p1 at rank 1 of 13)
Q2B top-3: p1=-1.760 p2=-4.052 alice=-4.586 (p1 at rank 1 of 13)
BetaE top-3: p1=-0.746 alice=-2.029 p3=-4.703 (p1 at rank 1 of 13)

각 모델은 p1을 교집합 대상 안에 두었는데, 그 alice 다리가 훈련 중에 p1을 끌어당겼고 bob 다리가 더해졌을 때 교집합의 기하학이 그것을 그 자리에 붙들어 두었기 때문입니다: 앞 장이 요구했던 그 대체 추론이, 세 가지 다른 방식으로 수행된 것입니다.

14행의 결론

여기 이 장의 중심, 커밋된 성과표가 있습니다: 각 유형의 하드 정답에 대한 필터링된 MRR(Mean Reciprocal Rank, 평균 역순위, 곧 각 하드 정답의 순위에 대한 1의 평균이며, 알려진 모든 정답은 후보 목록에서 걸러집니다)을 앞 장의 정확한 프로토콜 아래 나타내며, 그 기하학이 그 유형을 표현할 수 없는 곳에는 대시가 붙습니다. 유형 코드에 대한 앞 장의 명명 문법을 떠올려 봅시다: 맨 앞의 숫자는 반복 횟수를 세고, p는 사영 한 홉, i는 교집합, u는 합집합, n은 교집합의 한 피연산자에 붙는 부정이며, 글자는 합성 순서로 읽습니다(그래서 pni는 교집합의 사영 사슬 피연산자를 부정하고, pin은 한 홉 피연산자를 부정합니다):

[4] the payoff table: filtered MRR on HARD answers, per query type
(protocol = query_dag.filtered_mrr: rank vs the non-answers V − ALL, ties at
expected rank; — marks a type the geometry cannot express)
type #hard GQE Q2B BetaE random(0)
1p 2 0.6667 0.3333 0.5500 0.2250
2p 2 0.2381 0.3500 0.3000 0.1010
3p 2 0.1339 0.3333 0.1500 0.4167
2i 2 1.0000 1.0000 1.0000 0.1125
3i 2 1.0000 1.0000 1.0000 0.0909
pi 2 0.4167 0.5833 0.3000 0.5625
ip 1 1.0000 1.0000 0.5000 0.1000
2u 2 — 0.6000 0.1500 0.1056
up 2 — 0.2250 0.1339 0.2917
2in 2 — — 0.1214 0.1964
3in 1 — — 1.0000 0.2500
inp 1 — — 0.5000 0.0909
pin 1 — — 0.1000 0.1250
pni 1 — — 0.1429 0.1250
pooled 0.6085 0.5794 0.4197 0.2128
(13) (17) (23) (23) ← hard answers each pool covers

이를 신뢰도가 감소하는 순서로 세 번 훑어 읽어 봅시다.

첫 번째 훑음: 대시들, 곧 정리들. GQE는 정확히 두 개의 합집합 유형과 다섯 개의 부정 유형, 곧 일곱 개의 셀에 대시를 답니다; Query2Box는 정확히 다섯 개의 부정 유형에 대시를 답니다; BetaE는 아무것도 대시를 달지 않습니다. 이는 DASHES가 강제된 예외 발생에 맞서 셀 하나하나 검증된 것이며(633–643행과 681–683행), 표에서 어떤 규모로도 변하지 않고 그대로 옮겨지는 유일한 부분입니다. 왜냐하면 이는 이 그래프에 관한 진술이 아니라 기하학에 관한 진술이기 때문입니다: 볼록한 대상은 공간 안에서 합집합을 담을 수 없고, 유계인 대상은 여집합을 담을 수 없으며, 상호적인 베타는 둘 다 담습니다. 이 대시 패턴이 이 장의 논지이며, 실험에 의해 인쇄된 것입니다.

두 번째 훑음: 공유된 행들, 정직하게 읽기. 모델들이 경쟁하는 행들 안에서, 모든 모델이 1p에서 고정된 무작위 채점기를 이깁니다(단언됨, 685–688행), 세 모델 모두 2i와 3i에서 완벽하며, 순위는 흔들립니다: GQE가 1p에서 이기고, Query2Box가 2p, 3p, pi에서 이기며, BetaE는 모든 사영 행에서 2위를 하지만 pi와 ip에서는 꼴찌입니다. 각 행은 하나 또는 두 개의 하드 정답을 모으므로, 단 한 번의 순위 요동이 항목을 십분의 몇씩 움직입니다; 무작위조차 3p에서는 세 모델 모두를, pi에서는 셋 중 둘을 이기는데, 이는 어떤 행에 두 개의 정답과 열세 개의 후보가 있을 때 정보가 없는 기준선이 할 수 있는 일입니다. 이 셀들은 기계 장치가 처음부터 끝까지 작동한다는 시연이지, 벤치마크가 아닙니다. 수백만 개의 질의와 수천 개의 개체를 가진 이 분야 규모에서 발표된 기준점은 안정적이며 그 자체로 인용할 가치가 있습니다: 표준 벤치마크 위에서 EPFO 유형들에 걸친 평균 MRR로 BetaE가 Query2Box를, Query2Box가 GQE를 앞섭니다 [3]. 우리의 부정 행들에 대해 토이 규모에서도 정말로 공평한 유일한 읽기는 존재 대 부재입니다: BetaE는 다섯 개 모두에서 숫자를 기록하고, 3in, inp, pni에서 무작위를 이기며(실행에 의해 계산되고 인쇄됩니다; 하네스는 그런 승리가 적어도 하나 존재한다는 것만 단언합니다, 690–696행), 2in과 pin에서는 무작위에게 집니다; 표의 그 밖의 어느 것도 거기서는 아예 할 말이 없습니다.

세 번째 훑음: 제로샷 행들, 진짜 탐침. 모델들은 오직 1p와 2i 형태로만 훈련되었습니다(BetaE는 2in도). 그 밖의 모든 행, 특히 훈련된 두 연산자를 한 번도 본 적 없는 순서로 합성하는 ip와 pi는, 모델들이 연산자를 배웠는지 아니면 템플릿을 배웠는지를 검사합니다: 추론 시에 embed_query는 DAG가 지시하는 대로 사영을 교집합에, 다시 사영에 단순히 사슬로 이을 뿐이며, 이는 어떤 훈련 예제도 보인 적 없는 구조 위에서입니다. GQE와 Query2Box 둘 다 ip에서 1.0000을 기록하고 pi에서 각각 0.4167과 0.5833을 기록합니다. 그러한 구성적 전이, 곧 한 구조 안에서 학습된 연산자가 다른 구조 안에서 작동하는 것은, 질의 임베딩을 단순한 질의 암기와 구분해 주는 성질이며, 이는 이 분야의 훈련/평가 분할이 의도한 설계입니다 [2].

이 합산 행에는 소리 내어 말해야 할 각주가 필요하며, 커밋된 출력이 그것을 말해 줍니다: 세 개의 풀은 서로 다른 유형 집합을 다룹니다(GQE, Query2Box, BetaE에 대해 각각 13, 17, 23개의 하드 정답입니다), 그래서 합산된 수치는 모델 사이에서 비교할 수 없습니다; GQE의 0.6085는 오직 점이 표현할 수 있는 유형들에 대한 평균일 뿐입니다. 행을 비교하십시오, 결코 합산 행을 비교하지 마십시오.

"질의가 곧 기하학이다"가 감추는 것

5부가 축하하기 전에, 비용 하나를 기록에 남겨 두어야 합니다. 다음 장의 방법들이 바로 그것을 다르게 치르기 위해 존재하기 때문입니다. 앞 장의 기호 실행기는 모든 내부 노드에서 개체들의 집합을 실체화합니다: advises(alice, y)를 평가하면, 그 노드의 출력은 말 그대로 bob을 담은 집합이고, 살펴볼 수 있고, 감사할 수 있으며, 틀렸다면 어디가 틀렸는지 손으로 짚을 수 있습니다. 질의 임베딩 모델들은 그런 종류의 것을 전혀 실체화하지 않습니다. alice 다리 사영 이후의 중간 대상은 점이거나, 박스이거나, 여덟 개의 베타 매개변수입니다; 그 노드에는 어떤 개체 집합도 존재하지 않으며, 모델 안의 어떤 절차도 그것을 되찾지 못합니다. 중간 기하학이 표류하여, 어떤 지도 학생도 살지 않는 곳에 박스를 놓았다면, 그 오류는 잘못된 최종 순위로 드러날 때까지 보이지 않으며, 어떤 증거도 어떤 홉이 실패했는지 밝혀 주는 감사 기록도 없습니다. 이 실패는 구성상 소리가 없습니다: 거리는 우아하게 저하되므로, 무의미한 중간값도 여전히 자신감 있어 보이는 점수를 냅니다. 이것이 바로 실행을 임베딩으로 대체하는 것의 정확한 해석 가능성 대가이며, 각 노드의 출력이 퍼지 집합, 곧 논리 법칙이 다시 성립하도록 고른 t-노름 대수로 결합되는 벡터가 되는 완전한 대안 노선 전체를 동기 부여합니다 [6]. 그 노선의 가장 강한 형태에서는 퍼지 벡터가 개체 자체로 색인되어, 개체마다 하나의 소속도를 가지므로, 모든 중간 노드가 다시 한번 개체들의 이름을 대고 질의 대수는 다시 논리가 됩니다. 그 노선이 다음 장의 주제입니다.

미해결로 남은 부분

이 스위트는 두 가지 형태(BetaE는 세 가지)로 훈련한 뒤 14개의 질의 구조를 평가합니다; 각 모델은 자신의 기하학이 표현할 수 있는 모든 구조에 답하고, 오직 BetaE만이 14개 전부에 답합니다. 실제 시스템이 무엇으로 훈련하는지 묻기 전까지는 이것이 승리에 찬 일반화처럼 들립니다: 19개나 34개의 질의가 아니라 수백만 개를, 다섯에서 열 개의 구조에 걸쳐 벤치마크 그래프에서 표본으로 뽑아 훈련하는데 [3], 이는 아마도 학습된 연산자들이 노출이 포화되지 않고서는 신뢰성 있게 합성되지 않기 때문일 것입니다. 그 숫자 안에 두 개의 미해결 문제가 숨어 있습니다. 첫째는 표본 효율성입니다: 정확한 실행기는 훈련 질의가 0개 필요하고, 하나를 근사하는 데 수백만 개가 필요한 방법은 그 예산을 무언가에 쓰고 있는데, 그것이 무엇인지 아무도 명확히 설명하지 못합니다. 둘째는 질의 분포 자체입니다: 표본 추출 절차는 연산자들이 어떤 구조, 어떤 앵커, 어떤 관계로 연습하게 될지를 결정하고, 보고되는 모든 MRR은 그 선택들에 소리 없이 조건화되는데, 이는 앞 장이 은행에 대해, 3권이 링크 예측에 대해 지적했던 것과 같은 벤치마크 설계의 교훈입니다. 그리고 이 둘 아래에는 이 부에서 가장 전복적인 질문이 놓여 있습니다. 은행 안의 모든 질의는 1홉 원자로 바닥을 이룹니다; 하드 정답이 존재하는 것은 단일 엣지가 빠져 있기 때문입니다. 만약 배울 가치가 있는 유일한 것이 1홉 링크 예측기이고, 모든 합성은 추론 시에 DAG 위의 탐색으로 이루어지며, 질의 훈련은 전혀 없다면 어떨까요? 만약 그것이 경쟁력 있게라도 작동한다면, 수백만 개의 표본 추출된 질의는 논리가 공짜로 공급해 줄 수 있었던 요소를 훈련시키고 있었던 셈입니다. 다음 장이 정확히 그 도발을 실행합니다.

왜 중요한가

이 장은 이 책 전체가 세워 온 하나의 주제, 곧 표현할 수 있는 대수는, 어떤 훈련이 일어나기도 전에, 당신이 고르는 표현이 결정한다는 주제의 4권에서 가장 깨끗한 표본입니다. 점, 박스, 베타는 세 개의 품질 등급이 아닙니다; 이들은 기하학을 입은 1차 논리의 세 가지 다른 조각이며, 커밋된 대시 패턴은 그 진술을 실행 가능하고 단언 가능하게 만든 것입니다. 두 기둥에게, 이는 2권의 표현력 사다리(EL++ 대 더 표현력 있는 서술 논리: 말할 수 있는 것이 결정할 수 있는 것을 결정합니다)의 신경망 거울상입니다; 5권에게, 위에서 이름 붙인 침묵하는 중간자 문제는 축소판 신뢰 문제로, 이 책에서 은 채점될 수 있지만 추론은 검사될 수 없는 시스템의 첫 번째 분명한 사례이며, 대규모 추론기에 대한 충실성 및 검증 연구가 반드시 메워야 할 정확한 그 간극입니다. 미래의 어떤 시스템이 "벡터 공간에서 지식 그래프에 대해 추론한다"고 주장할 때, 이 장이 세워 놓는 질문들은 이렇습니다: 그 기하학은 어떤 연결사를 닫는가, 그 대시는 어디에 떨어지는가, 그리고 그 중간 노드에 대한 감사는 대체 무엇을 살펴볼 것인가?

핵심 용어

  • 질의 임베딩(Query embedding) — 질의 DAG를 잎에서부터 위로 임베딩하여 답하는 것으로, 각 노드의 출력은 기하학적 대상이고, 개체는 뿌리 대상까지의 거리로 순위 매겨집니다; 실행기의 집합 연산자가 학습된 기하학적 연산자로 대체됩니다.
  • GQE(Graph Query Embedding, 그래프 질의 임베딩) — 점 세대: 사영은 관계별 변환(여기서는 이동)이고, 교집합은 순열 불변 DeepSets 풀링이며, 채점은 개체 임베딩과의 유사도로 이루어집니다(논문에서는 코사인이고, 동반 모듈은 음의 유클리드 거리를 씁니다); 논리곱 조각만 가능합니다 [1].
  • 순열 불변성 / DeepSets(Permutation invariance / DeepSets) — 집합 피연산자에 순서가 없기 때문에 모든 재배열 ρ\rho에 대해 교집합에 강제되는 요구 I(q1,,qn)=I(qρ(1),,qρ(n))\mathcal{I}(\mathbf{q}_1, \ldots, \mathbf{q}_n) = \mathcal{I}(\mathbf{q}_{\rho(1)}, \ldots, \mathbf{q}_{\rho(n)})와, 그것을 만족시키는 대칭 풀링 아키텍처 계열입니다.
  • Query2Box 거리(Query2Box distance) — dbox=max(0,ao)1+αmin(a,o)1d_{\text{box}} = \lVert \max(\mathbf{0}, \mathbf{a} - \mathbf{o}) \rVert_1 + \alpha \lVert \min(\mathbf{a}, \mathbf{o}) \rVert_1, α=0.2\alpha = 0.2: 박스 표면까지의 바깥쪽 항에 할인된 안쪽 항을 더한 것이며, 3권의 boxes.py에서 그대로 임포트됩니다.
  • DNF 재작성(DNF rewrite) — 모든 EPFO 질의가 Pr(AB)=Pr(A)Pr(B)P_r(A \cup B) = P_r(A) \cup P_r(B)와 분배 법칙을 통해 합집합이 마지막에 적용되도록 다시 쓰인다는 정리입니다; 각 논리곱 논리합 항은 따로 임베딩되고 가장 좋은 논리합 항 점수가 이기며, 이는 집계 단계에서 정확하고, 그 대가는 가지의 증식입니다(36개의 은행 질의가 42개의 논리합 항이 됩니다) [2].
  • BetaE 부정(BetaE negation) — (α,β)(1/α,1/β)(\alpha, \beta) \mapsto (1/\alpha, 1/\beta), 로그 매개변수의 부호 뒤집기이자 정확한 대합입니다(¬¬=id\neg\neg = \mathrm{id}, 훈련된 모델 위에서 비트 하나까지 단언됩니다); 이 사다리에서 첫 번째로 닫힌 부정입니다 [3].
  • 매개변수-보간 교집합(Parameter-interpolation intersection) — 베타 밀도들의 가중 기하평균은 다시 베타이며, 매개변수는 iwiαi\sum_i w_i \alpha_iiwiβi\sum_i w_i \beta_i입니다(지수-덧셈 유도); 부정과 결합하면 매개변수의 조화평균인, 공간 안에서의 드모르간 합집합을 냅니다.
  • StructuralGap / 대시 패턴(StructuralGap / dash pattern) — 어떤 기하학이 연결사에 대한 연산자를 갖지 않을 때 강제되는 예외 발생입니다; GQE, Query2Box, BetaE에 걸친 커밋된 7/5/0 패턴은 구조적 이론과 셀 하나하나 일치하도록 단언됩니다.
  • 제로샷 구조(Zero-shot structure) — 훈련에서 한 번도 본 적 없는 질의 유형(여기서는 1p, 2i, 2in을 넘어서는 모든 것)으로, DAG를 따라 훈련된 연산자를 합성하는 것만으로 답해집니다; 이는 템플릿 수준이 아니라 연산자 수준의 학습을 검사하는 이 분야의 탐침입니다.

다음으로 이어지는 곳

BetaE는 대수를 닫았지만, 그것을 블랙박스 안에서 닫았습니다: 중간 노드는 개체가 아니라 매개변수이고, 훈련 청구서는 수백만 개의 표본 추출된 질의에 달합니다. 다음 장 퍼지·무학습 CLQA는 이 두 비용을 한꺼번에 공격합니다. 퍼지 집합 방법은 모든 중간 노드를 2부의 t-노름으로 결합되는 개체별 소속도 벡터로 만들어, 실행기의 살펴볼 수 있는 집합이 부드러운 형태로 되돌아오게 합니다; 그리고 위에서 심어 둔 무학습 도발은 그 실험을 얻습니다: 훈련된 1홉 예측기 하나를 가져와, 연속 최적화로 질의 DAG 위에서 기호적으로 합성하고, 단 하나의 다중 홉 질의도 훈련하지 않고서 이 장의 표를 얼마나 아래까지 따라갈 수 있는지 봅니다.


동반 코드: examples/integration/clqa_models.py는 이 장 전체를 하나의 인터페이스 뒤에서 구현합니다: 공유된 은행과 필터링된 음성 풀(97–138행), DNF 재작성(175–191행), 강제된 예외 발생을 갖춘 GQE(197–279행), 3권의 boxes.py 거리를 재사용하는 Query2Box(285–413행), 3권의 beta.py KL 기계 장치를 재사용하는 BetaE(419–517행), 선언되고 단언된 대시 패턴(524–532행, 681–683행), 모든 손으로 쓴 그래디언트에 대한 유한 차분 감사(549–578행), 그리고 성과표(626–651행)입니다. 모든 숫자를 바이트 단위로 재현하려면 python3 examples/integration/clqa_models.py를 실행하십시오; 그 실행은 SUMMARY clqa_models: 1p gqe=0.6667 q2b=0.3333 betae=0.5500 random=0.2250 | dashes gqe=7 q2b=5 betae=0 | betae_neg_wins=3in/inp/pni | pooled gqe=0.6085 q2b=0.5794 betae=0.4197 | fd_max=1.8e-09로 끝납니다.