본문으로 건너뛰기

관통 예제: 하나의 지식 베이스, 다섯 권

📍 현재 위치: 4부 · 뉴로-심볼릭 아이디어 — 14장. 카우츠 분류법은 신경망 학습기를 심볼릭 추론기에 연결하는 모든 방식을 여섯 개의 이름 붙은 패턴으로 방금 정리했습니다; 이번 장은 그 여섯 가지 패턴 전부 — 그리고 이 시리즈의 다섯 권 전부 — 가 가늠되는 하나의 작은 세계를 소개합니다.

우리는 이 권 내내 같은 작은 학계 세계(academic world)를 증명의 장으로 써 왔지만, 언제나 파편으로만 그러했습니다: 여기서는 규칙 하나, 저기서는 질의 하나, 끝에 가서는 흩뿌려진 임베딩 점들의 무리였습니다. 이 장은 그 전체를 한꺼번에 탁자 위에 올려놓습니다 — 모든 개체(individual), 모든 기본 사실, 모든 규칙 — 그런 다음 훤히 드러나 있으면서도 숨어 있던 더 깊은 구조를 보여줍니다: 규칙 속에 접혀 들어간 온톨로지(ontology), 여러 링크를 가로질러 홉(hop)하는 질문들, 그리고 이후의 권들이 켜게 될 두 가지 차원의 주석(annotation)입니다. 이 장의 성과는 세계 그 자체에 있지 않습니다 — 그 세계는 일부러 작게 만들어졌기 때문입니다. 성과는 다섯 개의 서로 다른 렌즈를 통해 다시 읽히는 하나의 세계가, 이 시리즈 전체가 자신의 방법들을 정직하게 비교할 수 있게 해 준다는 데 있습니다. 그리고 세계가 작기 때문에, 우리는 이 책의 나머지 부분이 고집하는 바로 그것을 여기서도 해낼 수 있습니다: 스물세 개의 사실이 마흔일곱 개로 자라난다고 그저 진술하는 데 그치지 않고, 파동 하나하나를 따라 그것을 직접 유도하며, 유도된 원자 하나하나를 동반 코드가 실제로 출력하는 숫자와 대조해 확인하는 것입니다.

쉽게 말하면

다섯 개의 다큐멘터리 제작진이 저마다 촬영하는 작은 마을 하나를 상상해 보십시오. 첫 번째 제작진은 서류를 촬영합니다 — 누가 공식적으로 무엇이고, 규칙이 무엇을 따른다고 말하는지입니다. 두 번째는 마을의 범주 가계도를 그립니다. 세 번째는 친구들이 서로 가까이 사는 지도를 만듭니다. 네 번째는 "내 조부모님의 이웃은 누구인가"와 같은 두 단계짜리 질문을 뒤쫓습니다. 다섯 번째는 누구든 무엇에 대해서든 얼마나 확신하는지를 묻습니다. 다섯 개의 매우 다른 영화지만 — 같은 마을, 같은 사람들, 같은 거리입니다. 마을이 결코 변하지 않기 때문에, 여러분은 그 영화들을 나란히 놓고 각 바라보는 방식이 정확히 무엇을 더해 주는지 볼 수 있습니다. 이 장이 바로 그 마을입니다.

이 장에서 다루는 내용

  • 한꺼번에 보는 지식 베이스 전체kb.py에 있는 개체들, 일곱 개의 기본 술어, 일곱 개의 혼 규칙(Horn rule), 그리고 47개 원자 모델을 파동 단위로 손수 유도하는 과정을 다룹니다.
  • 즉각귀결 연산자(immediate-consequence operator) — 되풀이해서 적용하는 것이 곧 전방 연쇄인 단 하나의 함수를 정확히 정의하고, 그 크기 [23, 41, 47, 47]을 따라가며 추적합니다.
  • 규칙 속에 숨어 있는 온톨로지(ontology) — professor ⊑ researcher ⊑ person이라는 암묵적 클래스 위계(class hierarchy)와 advises ∘ advises ⊑ grandAdvisor라는 역할 사슬(role chain)을 다루며, 모든 기호를 하나하나 풀어 설명하고, 2권의 기술 논리(description logic)를 미리 살짝 보여줍니다.
  • (hop)하는 질문들 — "alice는 누구를 grand-advise하는가"와 같은 다중 홉 질의(multi-hop query)를 SLD 리졸루션으로 답하며, 링크 하나하나를 따라 읽는 증명 트리를 살펴보고, 4권의 복합 질의 응답(complex query answering)을 미리 살짝 보여줍니다.
  • 아직 쓰이지 않은 주석들 — 소속 관계 위에 놓이는 재직 구간(시간적)과 인용에 매겨지는 신뢰 가중치(불확실성)를 다루며, 전이적 인용의 확률을 직접 계산해 보고, 2권과 5권을 미리 살짝 보여줍니다.
  • 하나의 세계를 보는 다섯 개의 렌즈 — 같은 지식 베이스를 논리, 온톨로지, 기하학, 미분 가능한 질의, 그리고 보정된(calibrated) 신뢰로 읽어 내는 표 하나와, 손실이 떨어지는 모습을 직접 지켜보는 처음부터 만든 TransE를 다룹니다.
  • 하나의 예제가 중요한 이유 — 시리즈 전체에 걸친 일관성과 비교 가능성, 그리고 SATORI 캡스톤(capstone)이 자신의 결합된 주장을 가늠하는 공유된 무대를 다룹니다.

하나의 지식 베이스, 온전히 펼쳐 놓다

학계 세계의 등장인물은 고정되어 있고 작습니다. 동반 파일 kb.py는 32–35행에서 모든 개체의 이름을 맨 앞에 밝힙니다:

PEOPLE = ["alice", "bob", "carol", "dave", "erin"]
PAPERS = ["p1", "p2", "p3"]
INSTITUTIONS = ["mit", "cmu"]
TOPICS = ["logic", "ml", "nesy"]

네 가지 종류에 걸쳐 열세 개의 개체입니다: 다섯 명의 사람, 세 편의 논문, 두 개의 기관, 세 개의 주제입니다. 이들 각각은 하나의 상수(constant)입니다: 하나의 특정한 사물을 가리키는 고정된 이름입니다. 이 파일의 is_var 함수(25–28행)는 앞으로의 추론에서 중요한 유일한 경계선을 긋습니다: 대문자로 시작하는 문자열("X", "Who")은 어떤 개체든 대신할 수 있는 자리표시자인 변수(variable)이며, 소문자로 시작하는 모든 것("alice", "p1")은 자기 자신을 가리키는 상수입니다. 이 관례를 잘 기억해 두십시오: 이것이야말로 사실과 규칙을 가르는 전부입니다.

개체들 위에 이 파일은 기본 사실(base fact)들을 단언합니다 — kb.pyABox(단언 상자, assertion box)라고 이름 붙인 것으로, 유도하는 대신 직접 진술하는 것들입니다.

# --- Base facts (the ABox: what we assert directly) ------------------------
# Class memberships. alice and bob are professors; carol/dave/erin are students.
FACTS: list[tuple] = [
("professor", "alice"),
("professor", "bob"),
("student", "carol"),
("student", "dave"),
("student", "erin"),
# Advising (a professor advises a student). Note the chain alice→bob→carol,
# which lets a *grandAdvisor* be derived by composing advises with itself.
("advises", "alice", "bob"),
("advises", "bob", "carol"),
("advises", "bob", "dave"),
("advises", "carol", "erin"),

전부 합쳐 일곱 개의 술어가 단언됩니다: 누군가가 무엇인지를 나타내는 두 개 — professorstudent — 와 두 사물을 연결하는 다섯 개 — advises, authored, cites, affiliated, about입니다. 술어가 취하는 인자의 개수가 그 항수(arity)입니다: professor는 단항(항수 1)이고, advises는 이항(항수 2)입니다. 이 파일은 위 발췌 이후로도 저자 관계(authored), 인용 사슬(cites, p3 → p2 → p1로 이어지는), 소속 관계(affiliated, 각 사람은 정확히 하나의 기관에 소속됩니다), 그리고 주제(about)로 이어집니다. FACTS 목록(39–69행)의 모든 줄을 세어 보면 정확히 23개의 기본 사실입니다. 이들 각각은 하나의 원자(atom)입니다: 술어 뒤에 그 인자들이 따라오는 것으로, ("advises", "alice", "bob")처럼 평범한 튜플로 적힙니다. 이들 모두가 그렇듯 변수를 전혀 담고 있지 않은 원자를 접지된(ground) 원자라고 부릅니다.

그다음에는 규칙(rule)들이 옵니다 — kb.py내포적(intensional) 술어들로, 진술되는 대신 계산되는 것들입니다(73–89행). 모든 규칙은 하나의 혼 규칙(Horn rule)입니다: 조건들의 논리곱(몸체, body)이 모두 성립할 때마다 성립하는 단 하나의 긍정 결론(머리, head)입니다. 이런 관점에서 보면 사실이란 그저 몸체가 비어 있는 규칙일 뿐입니다.

# --- Rules (the intensional/derived predicates) ----------------------------
# Every rule is Horn: one positive head, a conjunction of positive body atoms.
RULES: list[tuple] = [
# A professor or a student is a researcher; a researcher is a person.
(("researcher", "X"), [("professor", "X")]),
(("researcher", "X"), [("student", "X")]),
(("person", "X"), [("researcher", "X")]),
# Grand-advising = advising composed with advising (a role chain).
(("grandAdvisor", "X", "Z"), [("advises", "X", "Y"), ("advises", "Y", "Z")]),
# Colleagues share an institution (the X != Y guard is applied by the engine
# via the built-in `neq` check; see forward_chain.py / sld.py).
(("colleague", "X", "Y"),
[("affiliated", "X", "I"), ("affiliated", "Y", "I"), ("neq", "X", "Y")]),
# Transitive closure of citation — the rule that *needs* a fixpoint, because
# its own head feeds its own body.
(("citesTransitively", "A", "B"), [("cites", "A", "B")]),
(("citesTransitively", "A", "C"),
[("cites", "A", "B"), ("citesTransitively", "B", "C")]),
]

일곱 개의 규칙이 다섯 개의 유도된 술어를 정의합니다: researcher, person, grandAdvisor, colleague, citesTransitively입니다. 각 규칙을 오른쪽에서 왼쪽으로 읽으십시오: (("researcher", "X"), [("professor", "X")])는 "어떤 X에 대해서든, professor(X)가 성립하면 researcher(X)가 성립한다"라고 말합니다. 마지막 두 개가 미묘한 경우입니다. colleague는 내장된 neq(부등, not-equal) 가드(guard)를 지니고 있어 어떤 사람도 결코 자기 자신의 동료로 세지 않도록 하며, citesTransitively는 자기 자신의 머리를 다시 자기 자신의 몸체로 되먹입니다. 그래서 이것은 오직 고정점(fixpoint) — 규칙을 다시 적용해도 더 이상 바뀌지 않는 집합 — 을 계산해야만 정착합니다.

즉각귀결 연산자, 그리고 프로그램의 의미

이 규칙들이 정확히 무엇을 의미하는지 말하려면, 함수 하나가 필요합니다. 프로그램(사실들과 규칙들을 합친 것)을 PP로, 우리가 현재 믿고 있는 접지 원자들의 집합(하나의 해석, interpretation)을 II로 씁니다. 즉각귀결 연산자(immediate-consequence operator) TPT_PII를 받아, 한 번의 단계로 발화시킬 수 있는 모든 머리를 II에 더해 돌려줍니다:

TP(I)  =  I{hσ  :  (hb1bm)P,  every biσ is satisfied in I}.T_P(I) \;=\; I \,\cup\, \bigl\{\, h\sigma \;:\; (h \leftarrow b_1 \wedge \cdots \wedge b_m)\in P,\ \ \text{every } b_i\sigma \text{ is satisfied in } I \,\bigr\}.

여기 등장하는 모든 기호에는 제 몫이 있습니다. 합집합 기호 \cup는 "두 집합을 합쳐 놓는다"를 뜻합니다. 중괄호 {:}\{\,\cdot : \cdot\,\}는 집합 구성 표기법(set-builder notation)으로, "이 조건이 성립하는, 이런 형태를 갖는 모든 것의 집합"이라고 읽습니다. 화살표 hb1bmh \leftarrow b_1 \wedge \cdots \wedge b_m는 규칙 하나를 나타내며, 왼쪽에 머리 hh가, 오른쪽에는 \wedge("그리고")로 이어진 몸체 원자 b1,,bmb_1,\ldots,b_m가 있습니다; bib_i의 아래첨자 ii는 그저 몸체 원자들에 11부터 mm까지 번호를 매길 뿐입니다. 그리스 문자 σ\sigma(시그마)는 치환(substitution)으로, 각 변수를 상수로 바꿔 주는 대응표이며, hσh\sigma는 "그 교체를 hh에 적용한다"를 뜻합니다. 소속 기호 \in는 "…의 원소이다"라고 읽습니다. 몸체 원자 biσb_i\sigmaII 안에서 성립한다(satisfied in II)는 것이 무엇을 뜻하는지는, 정확히 코드가 그렇게 하듯 두 가지 경우로 갈립니다. 평범한 원자는 그것이 말 그대로 존재할 때 성립합니다: biσIb_i\sigma \in I. 내장 가드(built-in guard) — 우리에게는 neq(s,t)\text{neq}(s, t)("부등", not equal) 하나뿐입니다 — 는 애초에 II 안에 저장되지 않습니다; 이는 그 두 인자 sσs\sigmatσt\sigma가 서로 다른 상수가 되었을 때 성립합니다. 이 두 번째 절은 장식이 아닙니다: colleague 규칙의 몸체는 neq(X, Y)로 끝나므로, 이것이 없다면 그 규칙은 결코 발화할 수 없고 아래에서 우리가 셀 여덟 개의 colleague 원자도 결코 유도될 수 없습니다. 그러므로 이 줄 전체는 평이한 말로 이렇게 말하는 것입니다: 이미 II 안에 있는 모든 것을 남겨 두고, 변수를 상수로 일관되게 다시 이름 붙인 뒤 그 몸체 원자들이 모두 II 안에서 성립하는 — 각 평범한 원자는 사실로서 존재하고, 각 가드는 이제 접지된 그 인자들 위에서 참으로 확인되는 — 어떤 규칙의 머리든 더한다. 이것이 바로 전방 연쇄의 한 번의 훑기(sweep)입니다.

이 연산자는 은유가 아닙니다; 그것은 코드 안의 함수입니다. forward_chain.py에서 t_p(42–49행)는 모든 규칙을 순회하며, _match_body(19–39행)에게 현재 사실들 안에서 몸체를 참으로 만드는 모든 치환을 요청하고, apply_sub(head, sub) — 정확히 hσh\sigma — 를 출력에 더합니다. neq 가드는 _match_body(30–34행) 안에서 처리됩니다: 그것은 사실로서 조회되는 것이 아니라 검사(check)되며, 그 두 인자가 서로 다른 상수가 되었을 때만 성공합니다.

프로그램 전체의 의미는 기본 사실들에서 시작해 TPT_P를 되풀이해서 적용함으로써 도달하는 것입니다. 해석들의 사슬 I0,I1,I2,I_0, I_1, I_2, \ldots를 다음과 같이 정의합니다.

I0=FACTS,Ik+1=TP(Ik).I_0 = \text{FACTS}, \qquad I_{k+1} = T_P(I_k).

각 단계는 원자를 더하기만 하고(IkIk+1I_k \subseteq I_{k+1}, 여기서 \subseteq는 "…의 부분집합이거나 같다"라고 읽습니다), 열세 개의 상수와 열두 개의 술어(단언된 일곱 개에 규칙이 도입하는 유도된 다섯 개 — researcher, person, grandAdvisor, colleague, citesTransitively — 를 더한 것)로부터 만들 수 있는 접지 원자는 유한하게만 있으므로, 이 사슬은 영원히 자라날 수 없습니다. 반드시 아무것도 새로 나타나지 않는 단계, 즉 Ik+1=IkI_{k+1} = I_k에 이르게 됩니다. 그 안정된 집합이 최소 고정점(least fixpoint) lfp(TP)\mathrm{lfp}(T_P)이며, 이는 정확히 최소 허브랜드 모델(least Herbrand model)입니다: 그 프로그램이 함의하는, 참인 원자들의 단 하나의 표준적인 집합입니다. least_fixpoint(52–64행)에서 이것은 while True 루프이며, 정지 판정은 단 한 줄 if nxt == current(61행)입니다: 한 번의 훑기가 아무것도 바꾸지 않았을 때 멈춥니다.

파동을 따라 모델을 유도하기

이제 그 연산자를 손으로 직접 돌려 보며, 그것이 출력하는 크기들 [23, 41, 47, 47]이 하나씩 나타나는 모습을 지켜봅니다. 이는 이 장의 중심이 되는 손수 짚어 보는 자취(worked trace)입니다: "사실들이 47개의 원자로 자라난다"고 그저 주장하는 것이 아니라, 어떤 원자가 어떤 훑기에서 들어오는지, 그리고 왜 그런지를 낱낱이 적은 장부입니다.

파동 0. I0I_0는 23개의 기본 사실입니다. 크기 =23= 23.

파동 1은 그 23개의 사실에 TPT_P를 적용합니다. 우리는 I0I_0에 대해 각 규칙을 확인합니다:

규칙 (머리 ← 몸체)I0I_0에서 성립하는 몸체새로 더해지는 머리
researcher(X) ← professor(X)professor(alice), professor(bob)researcher(alice), researcher(bob)
researcher(X) ← student(X)student(carol), student(dave), student(erin)researcher(carol), researcher(dave), researcher(erin)
person(X) ← researcher(X)없음 — 아직 researcher 원자가 존재하지 않습니다
grandAdvisor(X,Z) ← advises(X,Y) ∧ advises(Y,Z)alice→bob→carol, alice→bob→dave, bob→carol→eringrandAdvisor(alice,carol), grandAdvisor(alice,dave), grandAdvisor(bob,erin)
colleague(X,Y) ← affiliated(X,I) ∧ affiliated(Y,I) ∧ neq(X,Y)mit: {alice,bob}\{\text{alice}, \text{bob}\}; cmu: {carol,dave,erin}\{\text{carol}, \text{dave}, \text{erin}\}순서쌍 8개 (아래 참고)
citesTransitively(A,B) ← cites(A,B)cites(p2,p1), cites(p3,p2)citesTransitively(p2,p1), citesTransitively(p3,p2)
citesTransitively(A,C) ← cites(A,B) ∧ citesTransitively(B,C)없음 — 아직 citesTransitively 원자가 존재하지 않습니다

두 개의 규칙이 파동 1에서 아무것도 발화시키지 않으며, 이것이 바로 이 사슬이 한 단계 이상을 필요로 하는 이유 전부입니다. person은 그 몸체에 researcher 원자를 필요로 하지만, 연구자들은 바로 이번 훑기에서 만들어지는 중이었을 뿐 I0I_0 안에는 없었습니다. 재귀적인 인용 규칙은 그 몸체에 citesTransitively 원자를 필요로 하는데, 이 또한 I0I_0 안에 존재하지 않았습니다. 둘 다 다음 파동을 기다려야 합니다.

동료(colleague) 개수는 그 자체로 셈해 볼 가치가 있습니다. neq 가드가 그것을 정확하게 만들어 주기 때문입니다. 하나의 기관을 공유하는 사람들의 집합 SS에 대해, 이 규칙은 서로 다른 사람들의 순서 쌍마다 한 번씩 발화하며, 그런 쌍의 개수는 S(S1)|S|\,(|S|-1)입니다(세로 막대 S|S|는 "SS의 원소 개수"를 뜻합니다). mit에서는 S={alice,bob}S = \{\text{alice}, \text{bob}\}이므로 2×1=22 \times 1 = 2쌍이 나오고, cmu에서는 S={carol,dave,erin}S = \{\text{carol}, \text{dave}, \text{erin}\}이므로 3×2=63 \times 2 = 6쌍이 나옵니다. 합계 2+6=82 + 6 = 8이며, 그 여덟 개의 순서쌍은 (alice,bob), (bob,alice), (carol,dave), (dave,carol), (carol,erin), (erin,carol), (dave,erin), (erin,dave)입니다. (alice,alice)와 같은 있을 법한 자기 자신과의 쌍을 제거하는 것이 바로 neq 가드이며, 이것이 colleague가 대칭적이지만 결코 반사적이지는 않은 이유입니다.

파동 1의 새 원자들을 더하면: researcher 5개 ++ grandAdvisor 3개 ++ colleague 8개 ++ citesTransitively 2개 =18= 18입니다. 따라서 I1=23+18=41|I_1| = 23 + 18 = 41이며, 이는 코드가 출력하는 두 번째 숫자입니다.

파동 2는 그 41개의 원자에 TPT_P를 적용합니다. 파동 1에서 발화했던 모든 규칙이 다시 발화하여 같은 머리들을 재차 유도하지만(새로운 것은 아무것도 더하지 않습니다), 이제 멈춰 있던 두 규칙이 마침내 그 몸체를 갖추게 됩니다:

규칙I1I_1에서 새로 성립하는 몸체새로 더해지는 머리
person(X) ← researcher(X)researcher(alice), …, researcher(erin)person(alice), person(bob), person(carol), person(dave), person(erin)
citesTransitively(A,C) ← cites(A,B) ∧ citesTransitively(B,C)cites(p3,p2) ∧ citesTransitively(p2,p1)citesTransitively(p3,p1)

이는 person 원자 5개에다, 그 누구도 지름길로 얻을 수 없었던 단 하나의 원자인 전이적 엣지 citesTransitively(p3,p1)를 더한 것입니다: 이 원자는 오직 유도된 원자 citesTransitively(p2,p1)가 그것을 만들어 낸 바로 그 규칙에 다시 되먹여졌기 때문에 존재합니다. 새 원자 =6= 6이므로, I2=41+6=47|I_2| = 41 + 6 = 47이며, 이는 세 번째로 출력되는 숫자입니다.

파동 3은 그 47개의 원자에 TPT_P를 적용하지만 이미 존재하지 않는 머리는 하나도 만들어 내지 않습니다 — 특히 citesTransitively(p3,p1)는 새로 발견되는 것이 아니라 다시 유도될 뿐입니다. 그래서 I3=I2I_3 = I_2이고, 61행의 동등성 검사가 성공하여 반복이 멈춥니다. 출력되는 크기 목록은 I0,I1,I2,I3=[23,41,47,47]|I_0|, |I_1|, |I_2|, |I_3| = [23, 41, 47, 47]이고, 보고되는 라운드 수는 len(sizes)1=3\text{len(sizes)} - 1 = 3입니다. 이 파일을 실행하면 이 장부가 정확히 확인됩니다:

least fixpoint reached in 3 rounds; sizes per round: [23, 41, 47, 47]
47 atoms total, 24 derived.
('citesTransitively', 'p2', 'p1')
('citesTransitively', 'p3', 'p1')
('citesTransitively', 'p3', 'p2')

24개의 유도된 원자는 정확히 우리의 자취가 예측한 대로 나뉩니다: researcher 5개, person 5개, grandAdvisor 3개, colleague 8개, citesTransitively 3개로, 이를 더하면 5+5+3+8+3=245+5+3+8+3 = 24이고 23+24=4723 + 24 = 47입니다. 그 47개 원자 모델이 바로 이후의 모든 권이 다시 읽어 내는 고정된 대상입니다. 그것에 관해서는 원래의 23줄을 넘어서는 어떤 것도 손으로 단언되지 않습니다; 나머지 24개의 원자는 규칙에 의해 강제된 것이며, 우리는 이제 그 하나하나가 도착하는 모습을 직접 지켜보았습니다.

규칙 속에 숨어 있는 온톨로지

처음 세 규칙을 다시 살펴보십시오. 이들은 실제로는 개체에 관한 것이 아니라 종류(kind)에 관한 것입니다. 모든 교수는 연구자이고, 모든 학생은 연구자이며, 모든 연구자는 사람입니다. 기술 논리(description logic)의 표기법으로 적으면 — 여기서 포섭 기호 ⊑는 "~의 한 종류이다"라고 읽습니다(더 정확히는, "왼쪽 클래스의 모든 인스턴스는 오른쪽 클래스의 인스턴스이기도 하다") — 이 규칙들은 하나의 클래스 위계(class hierarchy)입니다:

professorresearcherperson,\text{professor} \sqsubseteq \text{researcher} \sqsubseteq \text{person},

여기에 형제 가지로 student ⊑ researcher가 딸려 있습니다. 포섭은 사슬을 이루므로, professor ⊑ researcher와 researcher ⊑ person으로부터 우리는 professor ⊑ person을 결론지을 수 있고, 따라서 professor(alice)가 person(alice)를 함의한다는 것도 결론지을 수 있습니다. 이는 새로운 공리가 아닙니다; 이는 전방 연쇄가 파동 1에서 규칙 R1(professor에서 researcher로)을, 파동 2에서 규칙 R3(researcher에서 person으로)을 발화시켜 도달했던 것과 같은 결론입니다. 우리가 위에서 짚어 본 한 파동의 간극은, 두 링크로 이루어진 포섭 사슬이 실행 위에 드리운 그림자인 셈입니다.

grandAdvisor 규칙은 평범한 위계로는 말할 수 없는 것을 말합니다: 그것은 하나의 관계를 그 자신과 합성합니다. X가 Y를 advise하고 Y가 Z를 advise하면, X는 Z를 grand-advise합니다 — 다음과 같이 적는 역할 사슬(role chain)입니다:

advisesadvisesgrandAdvisor,\text{advises} \circ \text{advises} \sqsubseteq \text{grandAdvisor},

여기서 고리 연산자 ∘는 "…과 합성된"(composed with), 또는 "…에 뒤이은"(followed by)이라고 읽습니다: advises 엣지 하나를 거친 다음 또 하나를 거치면, 그 두 단계짜리 여정을 하나의 grandAdvisor 엣지라고 부를 수 있습니다. 클래스 위계는 특징적인 구성자(constructor)가 논리곱(⊓, "그리고"라고 읽으며, 클래스 모두에 동시에 속하는 것들의 클래스)과 존재 제한(∃r.C, "클래스 C의 어떤 구성원과 r 관계를 갖는다"라고 읽으며, ∃는 "존재한다"이고 점은 역할 r과 클래스 C를 구분합니다)인 경량 기술 논리 EL 안에 편안하게 들어맞습니다. 역할 사슬은 평범한 EL을 넘어섭니다: 어떤 역할을 그 자신과 합성하는 것은 복합 역할 포함(complex role inclusion)이며, 이는 확장인 EL++의 일부입니다 — 바로 이 때문에 EL++ 위에 구축된 온톨로지 언어 프로파일(ontology-language profile)인 OWL 2 EL이 클래스 위계와 역할 사슬을 모두 지원합니다. 위계와 사슬이 함께, 우리의 사실-및-규칙 파일을 그 ABox 위에 조용히 놓여 있는 암묵적인 TBox(용어 상자, terminology box: 개체에 대한 ABox의 단언과 달리 종류에 관한 스키마 수준의 공리)로도 만듭니다 [1]. 이것이 바로 kb.py가 스스로를 서술하는 방식입니다 — 2권을 기다리는 하나의 EL++ 온톨로지입니다. 2권은 이 TBox를 명시적으로 만들어 추론기(reasoner), 즉 세계를 분류(classify)하는 프로그램에 건넵니다 — 전방 연쇄가 찾아냈던 것과 같은 persongrandAdvisor 원자를 유도하지만, 이제는 데이터로그(Datalog) 프로그램이 아니라 온톨로지의 논리적 귀결로서 그렇게 합니다. 결론은 같지만, 근거는 더 풍부해집니다.

홉(hop)하는 질문들

전방 연쇄는 모든 것을 유도합니다; 질의 엔진은 여러분이 물은 것만을 유도합니다. sld.py 안의 후방 연쇄(backward-chaining) 증명기는 질의(query)에 답합니다: 변수가 들어 있는 목표를 건네주면 그 목표를 증명 가능하게 만드는 모든 바인딩(binding)을 열거합니다. 전방 연쇄가 TPT_P를 맹목적으로 바깥으로 실행하는 데 반해, 후방 연쇄는 목표에서 시작해 안쪽으로 작업해 나가며, 매 단계마다 "어떤 규칙이 이것을 결론지을 수 있으며, 그러면 그 몸체는 무엇을 요구하게 되는가?"라고 묻습니다. 그 엔진은 _solve(37–60행)입니다: 목표를 증명하기 위해, 이 함수는 규칙의 변수들에 새로 이름을 다시 붙이고(53행, 그래서 재귀적인 인용 규칙을 재사용하더라도 변수가 뒤섞이는(capture) 일이 없습니다), 규칙의 머리를 목표와 단일화(unify)하려 시도한 다음(54행, 즉 둘을 동일하게 만드는 치환을 찾는다는 뜻입니다), 성공하면 그 치환 아래에서 몸체 원자들을 재귀적으로 증명합니다. 기본 사실은 몸체가 비어 있는 규칙으로 저장되므로, 자식 없이 즉시 증명됩니다.

"alice는 누구를 grand-advise하는가?"라고 묻는 것이 그런 질의 하나이며, 이를 답하려면 두 번 홉(hop)해야 합니다 — 한 번은 advises를 따라 alice에서 bob으로, 또 한 번은 advises를 따라 bob에서 bob의 학생들 각각으로 갑니다:

>>> from sld import answers
>>> answers(("grandAdvisor", "alice", "Who"))
[('grandAdvisor', 'alice', 'carol'), ('grandAdvisor', 'alice', 'dave')]

_solve가 이것으로 무엇을 하는지 따라가 봅시다. 목표 grandAdvisor(alice, Who)는 치환 {Xalice,ZWho}\{X \mapsto \text{alice},\, Z \mapsto \text{Who}\} 아래에서 머리 grandAdvisor(X, Z)와 단일화됩니다(맵릿 \mapsto는 "…로 치환된다"라고 읽습니다). 그러면 몸체는 advises(alice, Y) ∧ advises(Y, Z)를 요구합니다. 사실들에 대해 advises(alice, Y)를 증명하면 YbobY \mapsto \text{bob}으로 묶이며, 이것이 유일한 일치입니다. 그러면 advises(bob, Z)가 남는데, 이는 두 개의 사실과 일치하여, ZcarolZ \mapsto \text{carol}ZdaveZ \mapsto \text{dave}로 각각 묶입니다. 각 성공은 apply_sub(goal, sub)(92행)에 의해 접지된 답으로 바뀌며, answers는 이들을 모아 정렬하여 정확히 grandAdvisor(alice, carol)grandAdvisor(alice, dave)를 내놓습니다. 이는 전방 연쇄가 파동 1에서 만들어 냈던 것과 같은 두 원자입니다 — 건전하고 완전한 데이터로그 추론기라면 반드시 그래야 하듯, 두 엔진은 서로 일치하며, 다만 모든 것을 계산하는지(전방) 아니면 목표만을 계산하는지(후방)에서만 다를 뿐입니다.

SLD 리졸루션(SLD resolution, 프롤로그(Prolog) 뒤에 있는 후방 연쇄 전략)이 하나의 증명 트리(proof tree)를 돌려주기 때문에, 각 답은 그저 단언되는 것이 아니라 감사 가능(auditable)합니다 — 정확히 어떤 사실들이 사슬로 엮였는지를 그대로 읽어 낼 수 있습니다. Proof 클래스(19–34행)는 증명된 목표와 그것을 확립한 몸체의 하위 증명들을 담고 있으며, 그 render 메서드는 들여쓴 트리를 출력합니다:

proof of grandAdvisor(alice, carol):
grandAdvisor(alice, carol)
advises(alice, bob)
advises(bob, carol)
colleagues of alice: [('colleague', 'alice', 'bob')]

뿌리는 결론이며, 그 두 개의 잎은 역할 사슬을 한 홉씩 해소해 주는 두 개의 기본 사실입니다. 두 홉짜리 질의는 가장 단순한 다중 홉 질의(multi-hop query)입니다: 그 답이 어디에도 저장되어 있지 않고 여러 엣지를 차례로 따라감으로써 합성(compose)되어야만 하는 질문입니다. 4권은 학습된 모델에게 바로 이 같은 질문들을 던지며, 증명이 불가능할 때는 기하학으로 답합니다 — 이는 Query2box와 같은 박스 임베딩(box-embedding) 질의 엔진이 널리 퍼뜨린 접근법으로, 이런 엔진들은 다중 홉 존재 질의(existential query)에 벡터 공간(vector space) 안에서 곧바로 답합니다 [2]. 질의는 동일합니다; 그것에 답하는 기계장치만이 — 감사 가능한 증명 트리에서 학습된 공간 속의 점으로 — 달라질 뿐입니다.

아직 쓰이지 않은 주석들

kb.py의 사실들은 명확(crisp)하고 시간을 타지 않습니다: affiliated(bob, mit)은 그냥 참이며, 그것으로 끝입니다. 실제 학계 세계는 명확하지도 시간을 타지도 않으며, 바로 그 동일한 개체들 위에 두 개의 잠재적 주석(latent annotation)이 조용히 얹혀, 이후의 권들이 그것을 켜 주기를 기다리고 있습니다.

첫 번째는 시간(time)입니다. affiliated를 맨 엣지가 아니라 재직 구간(employment interval)으로 읽어 보십시오 — bob은 2019년부터 2024년까지 mit에 있었습니다 — 그러면 모든 동료(colleague) 질의는 "언제"라는 물음을 얻게 됩니다: 두 사람은 오직 그들의 구간이 겹치는 해 동안에만 동료입니다. alice가 [2015, 2020] 동안 mit에 있었고 bob이 [2019, 2024] 동안 있었다면, 이들은 오직 겹치는 구간 [2019, 2020] 동안에만 동료이며, 우리가 위에서 유도한 여덟 쌍의 colleague 개수는 시간이 찍힌 쌍들의 집합이 되어, 그중 일부는 비어 있을 수도 있습니다. 관계 위에 구간을 층층이 쌓아 올리는 것은 온톨로지의 시간적 확장이며, 평이한 TBox를 손에 넣고 나면 2권이 다루게 될 종류의 더 풍부한 공리입니다.

두 번째는 불확실성(uncertainty)입니다. 각 cites 엣지에 신뢰도(confidence) 하나를 붙여 보십시오 — 이를테면 p2가 p1을 인용하는 데는 가중치 0.9를, p3가 p2를 인용하는 데는 가중치 0.6을 붙입니다 — 그러면 citesTransitively는 더 이상 명확한 폐쇄(closure)가 아니라, 매 홉마다 곱이 줄어드는 확률의 사슬이 됩니다. 우리의 자취에서 어렵사리 얻어 낸 그 전이적 엣지 citesTransitively(p3, p1)는 p3 → p2 → p1을 사슬로 이어 만들어진 것이었습니다; 표준적인 독립성 가정 아래에서 그 신뢰도는 경로를 따라간 곱이 됩니다,

Pr[p3p1]  =  0.6×0.9  =  0.54,\Pr[\text{p3} \to \text{p1}] \;=\; 0.6 \times 0.9 \;=\; 0.54,

이는 이미 그것을 만들어 낸 두 링크 중 어느 쪽보다도 낮으며, 홉이 하나씩 늘어날 때마다 더 낮아집니다. 진술된 0.9가 열 번 중 아홉 번 맞도록 그 가중치들을 보정(calibrate)하는 일은 정확히 5권이 다루는 신뢰의 관심사입니다. 두 주석 모두 등장인물을 바꾸지는 않습니다; 다만 그 위에서 어떤 질문이 의미하는 바를 바꿀 뿐입니다. 그것이 하나의 공유된 세계가 지닌 조용한 이점입니다: 여러분은 그 아래에 있는 개체들을 다시 만들지 않고도 완전히 새로운 차원을 더할 수 있습니다.

하나의 세계를 보는 다섯 개의 렌즈

다섯 가지 방식으로 읽히는 같은 지식 베이스가 이 시리즈 전체의 척추입니다. 각 권은 개체와 엣지를 고정된 채로 두고 오직 표현(representation)만을 바꿔치기합니다 — 바로 이것이 이 권들을 애초에 서로 견줄 수 있게(commensurable) 만들어 주는 것입니다 [3].

중심에 학계 세계 지식 그래프가 있고 그 둘레에 다섯 개의 해석적 렌즈가 배치된 허브-스포크(hub-and-spoke) 다이어그램입니다. 중심 허브는 이름표가 붙은 열세 개의 노드를 보여줍니다 — 사람인 alice, bob, carol, dave, erin, 논문인 p1, p2, p3, 기관인 mit와 cmu, 주제인 logic, ml, nesy이며, advises, authored, cites, affiliated, about 엣지로 연결되어 있고, alice에서 bob, carol, erin으로 이어지는 지도(advising) 사슬이 강조되어 있습니다. 허브 둘레에는 다섯 개의 패널이 둘러싸고 있으며, 각각은 동일한 그래프를 서로 다른 방식으로 읽어 냅니다. 1권, 논리와 학습은 스물세 개의 기본 사실이 마흔일곱 개의 원자로 전방 연쇄되는 모습과 증명 트리를 보여줍니다. 2권, 온톨로지와 추론기는 professor가 researcher 아래에, researcher가 person 아래에 있는 클래스 위계와 advises를 advises에 뒤이은 것이 grandAdvisor 아래에 있는 역할 사슬을 보여줍니다. 3권, 임베딩은 같은 개체들을 평면 위의 점들로, 재사용 가능한 advises 화살표와 함께 보여줍니다. 4권, 미분 가능한 질의 응답은 두 홉짜리 grand-advise 질의가 벡터 박스들을 거쳐 추적되는 모습을 보여줍니다. 5권, 신뢰와 프런티어는 신뢰 가중치가 붙은 인용 엣지와 보정 곡선을 보여줍니다. 아래쪽의 캡션 띠에는 하나의 지식 베이스, 다섯 개의 렌즈라고 적혀 있으며, 세계가 고정된 채로 오직 방법만이 달라진다는 설명이 붙어 있습니다. 허브에 놓인 하나의 학계 세계를 다섯 개의 렌즈 — 논리와 학습, 온톨로지와 추론기, 임베딩, 미분 가능한 질의 응답, 그리고 신뢰 — 로 차례차례 읽어 내어, 다섯 권 전부에 걸쳐 오직 방법만이 달라지고 세계는 고정된 채로 남도록 합니다. 저자가 AI의 도움을 받아 직접 제작한 원본 도해.

렌즈학계 세계에서 그것이 읽어 내는 것
1권 — 기초논리와 학습23개의 사실을 47개의 원자로 전방 연쇄하고, SLD로 목표를 증명하며, 처음부터 만든 TransE로 기호들을 배치합니다
2권 — 온톨로지와 추론기기술 논리(description logic)같은 사실들을 EL++ TBox와 ABox로 — professor ⊑ researcher ⊑ person, advises ∘ advises ⊑ grandAdvisor — 추론기가 분류합니다
3권 — 임베딩대규모 기하학13개의 개체와 5개의 관계를 영역 임베딩(region embedding, 박스, 볼)으로 학습하여 포섭(subsumption)이 포함(containment)이 되게 합니다
4권 — 미분 가능한 질의 응답벡터 공간 속의 복합 질의"alice는 누구를 grand-advise하는가"와 같은 다중 홉 질문에 증명뿐 아니라 기하학으로도 답합니다
5권 — 신뢰와 프런티어보정과 증명불확실한 인용과 충실한 증명 자취를 다루며, 여기서 SATORI 캡스톤이 결합된 주장을 가늠합니다

증명에서 기하학으로: 학습하는 모습을 직접 지켜볼 수 있는 TransE

동반 파일 embeddings.py는 바로 이 동일한 세계 위에서 첫 번째 렌즈(논리)에서 세 번째 렌즈(기하학)로의 도약을 이미 몸으로 느끼게 해 줍니다. 이 파일은 2차원 TransE 모델을 훈련시키는데, 그 단 하나의 발상은 관계란 하나의 이동(translation)이다라는 것입니다: 모든 개체와 모든 관계를 하나의 벡터로 배치하고, 참인 트리플 (h,r,t)(h, r, t) — 머리(head), 관계(relation), 꼬리(tail) — 에 대해 머리 더하기 관계가 꼬리 가까이에 떨어지도록 요구합니다, eh+erete_h + e_r \approx e_t(기호 ≈는 "거의 같다"라고 읽고, exR2e_x \in \mathbb{R}^2는 기호 xx에 대해 모델이 학습하는 두 숫자짜리 벡터입니다). 그렇다면 한 트리플의 그럴듯함(plausibility)은 그저 그 이동이 얼마나 어긋나는지이며, 이는 점수(score)로 측정됩니다.

s(h,r,t)  =  eh+eret  =  i=12(eh,i+er,iet,i)2,s(h, r, t) \;=\; \lVert e_h + e_r - e_t \rVert \;=\; \sqrt{\textstyle\sum_{i=1}^{2} \bigl(e_{h,i} + e_{r,i} - e_{t,i}\bigr)^2},

여기서 이중 막대 \lVert \cdot \rVert는 벡터의 길이(length, 유클리드 노름)를 나타내고, Σ\Sigmaii로 색인되는 d=2d = 2개의 좌표에 걸쳐 합을 구하며, 낮을수록 더 그럴듯함을 뜻합니다. 이는 파일 안의 score(101–104행)이며, 제곱 거리 보조 함수 _dist2(32–33행) 위에 세워져 있습니다. 이름 붙여 둘 만한 미묘한 점이 하나 있습니다: _dist2는 훈련 손실이 사용하는 제곱 거리 2\lVert\cdot\rVert^2를 돌려주는 반면, score는 정직한 거리를 보고하기 위해 제곱근을 취합니다; 제곱근이 증가 함수이므로 둘은 트리플의 순위를 똑같이 매깁니다.

훈련은 마진 랭킹 손실(margin-ranking loss)을 통해 참인 트리플을 오염된 트리플보다 아래로 밀어냅니다. 참인 트리플과, 꼬리를 무작위로 고른 잘못된 개체로 바꾸어 만든 오염된 사본 (h,r,t)(h, r, t')에 대해, 손실은 다음과 같습니다.

  =  max ⁣(0,  γ+d(eh+er,et)d(eh+er,et)),\ell \;=\; \max\!\bigl(0,\; \gamma + d(e_h{+}e_r,\, e_t) - d(e_h{+}e_r,\, e_{t'})\bigr),

여기서 d(a,b)=ab2d(a,b) = \lVert a - b\rVert^2는 제곱 거리이고, 마진 γ=1.0\gamma = 1.0(파일 안의 margin)입니다. 이를 하나의 요구로 읽으십시오: 참인 꼬리는 거짓 꼬리보다 적어도 γ\gamma만큼은 더 가까워야 하며, 그렇지 않으면 대가를 치릅니다. 이는 eval_loss(67–72행)이며, 87행의 훈련 검사(if margin + d_pos - d_neg <= 0: continue는 이미 올바르게 순위 매겨진 트리플을 건너뜁니다)이기도 합니다. 손실이 활성일 때, 머리 벡터의 한 좌표에 대한 그 그레이디언트(gradient)는 dd를 미분하여 얻어지며(기호 \partial편미분(partial derivative)으로, 경사 하강법 장에서 소개되었습니다: 다른 모든 좌표를 고정한 채 한 좌표를 따라가는 손실 \ell의 기울기입니다),

eh,i  =  2(eh,i+er,iet,i)2(eh,i+er,iet,i),\frac{\partial \ell}{\partial e_{h,i}} \;=\; 2\bigl(e_{h,i}+e_{r,i}-e_{t,i}\bigr) - 2\bigl(e_{h,i}+e_{r,i}-e_{t',i}\bigr),

이는 93행 그대로입니다: gh = 2 * diff_pos - 2 * diff_neg이며, diff_posdiff_neg가 괄호로 묶인 두 차이입니다. 뒤이어 나오는 네 개의 갱신 줄(94–97행)은 머리, 관계, 참인 꼬리, 오염된 꼬리를 각각의 그레이디언트를 따라 한 걸음씩 옮깁니다 — 경사 하강법 장에서 유도했던 것과 같은 θθηθL\theta \leftarrow \theta - \eta\,\nabla_\theta L 하강 걸음을, 여기서는 트리플 하나씩에 적용한 것입니다. 훈련이 진행되는 동안 평균 힌지 손실(hinge loss)이 떨어지는 모습을 지켜보면 그 하강이 눈에 보입니다:

에포크015201005002000
힌지 손실1.5221.3190.8020.2240.1320.0620.089

손실은 백 에포크 이내에 한 자릿수 이상 떨어진 다음 거의 0 근처를 맴돕니다; 500 에포크에서의 0.062에서 2000 에포크에서의 0.089로의 그 작은 상승은, 매 훑기마다 단위원(unit circle)으로 재정규화되는 벡터들 위에서 확률적 경사 하강(stochastic gradient descent)이 남기는 잔여 흔들림(jitter)일 뿐, 학습의 실패가 아닙니다. 전체 실행이 끝나고 나면 그 기하학은 참과 거짓을 깔끔하게 갈라놓습니다:

mean score true triples = 1.609 corrupted = 2.737
score advises(alice, bob) = 0.399 (true)
score advises(alice, erin) = 0.929 (false)

학습된 지도는 실제 엣지 advises(alice, bob)에 0.399점을, 지어낸 advises(alice, erin)에 0.929점을 매깁니다 — 두 배 넘게 먼 거리입니다 — 그리고 모든 트리플에 걸쳐 참인 집합은 평균 1.609점을, 오염된 집합은 평균 2.737점을 받습니다. 그 누구도 모델에게 advises(alice, erin)이 거짓이라고 알려 준 적이 없습니다; 이 격차는 참인 엣지들에 맞추는 과정의 결과이며, 이는 24개의 유도된 원자가 규칙들의 결과였던 것과 같은 방식입니다. 그것은 논리 엔진이 전방 연쇄했던 것과 같은 세계이며, 이제는 논리가 손대기를 거부했던 질문에 답하고 있습니다: "이것이 증명 가능한가?"가 아니라 "이것이 얼마나 그럴듯한가?"라는 질문입니다.

하나의 공유된 예제가 중요한 이유

하나의 예제를 재사용하는 것은 문체상의 버릇이 아닙니다; 그것은 이 시리즈를 비교 가능하게 만들어 주는 것입니다. 1권이 47개의 원자를 전방 연쇄하고, 3권이 같은 13개의 개체를 임베딩하며, 4권이 바로 그 같은 grand-advising 질의에 답할 때, 독자는 세 가지 방법을 서로 견줄 수 있습니다 — 왜냐하면 오직 방법만이 달라졌을 뿐, 세계는 달라지지 않았기 때문입니다. 이 작은 학계 세계는 시리즈 전체의 통제 변수(control variable)입니다: 데이터를 마지막 원자 하나까지 고정해 두면, 그 뒤로 여러분이 보게 되는 어떤 차이든 방법의 차이일 수밖에 없습니다. 지식 그래프는 바로 이를 위한 알맞은 공유 기반(substrate)입니다. 노드와 엣지로 이루어진 그 형태가 논리, 온톨로지, 임베딩, 질의 엔진이 이미 다 함께 읽어 낼 수 있는 공통분모이기 때문입니다 [3].

바로 그 통제 변수 위에서 이 시리즈의 캡스톤(capstone)이 제 값을 합니다. 5권이 쌓아 올려 가는 결합 시스템인 SATORI는 바로 이 지식 베이스 위에서 자신의 주장을 가늠합니다: 온톨로지를 더하는 것이 학습된 모델의 다중 홉 질의 응답을 개선하는가, 그리고 그렇게 하면서도 모델의 보정(calibration)을 망가뜨리지 않는가? 무대가 결코 움직이지 않기 때문에, 그 질문은 교란 변수(confound) 대신 깔끔한 답을 가집니다: 점수의 어떤 변화든 데이터가 아니라 방법의 변화입니다. 우리가 방금 TransE가 학습하는 모습을 지켜본 0.399 대 0.929라는 그 격차야말로, SATORI가 온톨로지를 이용해 넓히려 시도하면서도 그 신뢰도만큼은 정직하게 지키고자 하는 바로 그런 종류의 양입니다.

아직 풀리지 않은 부분

여기 이 시리즈가 겨냥하는 정직한 간극이 있습니다. 각 렌즈는 저마다 성숙한 공개 벤치마크를 가지고 있습니다: 온톨로지 추론기는 표준 OWL 테스트 스위트로, 임베딩 모델은 링크 예측(link-prediction) 분할로, 복합 질의 시스템은 Query2box 스타일의 다중 홉 데이터셋으로 채점됩니다 [2]. 하지만 이들 전부를 한꺼번에 묻는 공개 벤치마크는 없습니다. 어떤 벤치마크도 한 시스템에게 온톨로지 그리고 다중 홉 질의 뭉치 그리고 보정된 불확실성에 대한 요구를 함께 건네고, 하나의 모델이 이 셋 모두를 함께 지켜낼 수 있는지 — 위계가 지켜지고, 홉이 올바르게 합성되며, 신뢰도가 말한 그대로를 의미하는지 — 채점하지 않습니다. 기존의 모든 벤치마크는 렌즈 하나만을 떼어 내고 나머지는 조용히 있는 셈 칩니다. 우리의 학계 세계는 아직 존재하지 않는 그 결합 벤치마크를 위한 손수 만든 대역(stand-in)입니다 — 이것이야말로 마지막 권이 이름 붙이는 바로 그 빠진 조각이며, 각각의 개별 능력은 그 자체로는 해결되었음에도 프런티어가 여전히 정착되지 않은 것처럼 느껴지는 이유입니다.

왜 중요한가

뉴로-심볼릭(neuro-symbolic) AI는, 밑바탕에서는, 같은 세계를 나타내는 두 가지 방식 — 정확한 심볼릭 논리와 근사적인 학습된 기하학 — 이 경쟁하는 대신 협력하도록 만들 수 있다는 주장입니다. 이는 강한 주장이며, 강한 주장에는 그것을 견줄 구체적인 무언가가 필요합니다. 앞으로 나올 모든 장이 "논리는 보장을 주고, 학습은 커버리지를 주며, 그 융합은 둘 다를 준다"고 약속할 때, 여러분은 이제 그 약속을, 여러분이 파동을 거듭하며 그 유도된 사실 하나하나가 도착하는 것을 지켜본 구체적인 47개 원자 모델에, 그리고 손실이 떨어지는 것을 직접 지켜본 구체적인 학습된 기하학에 견주어 저울질할 수 있습니다. 이후의 어떤 권이 온톨로지에 이끌린 모델이 평범한 임베딩이 놓친 질의에 답했다고 보고할 때, 여러분은 이미 그 질의와 그 온톨로지와 그 임베딩을 알고 있을 것입니다 — 이 셋 모두가 이 작은 마을 하나 안에 살고 있기 때문입니다. 바로 그것이 협력에 대한 슬로건을 답을 가진 실험으로 바꾸어 놓는 것입니다.

핵심 용어

  • 관통 예제(Running example, 학계 세계) — 13개의 개체, 23개의 기본 사실, 7개의 규칙으로 이루어진 하나의 지식 베이스로, 고정된 통제 변수로서 다섯 권 전체를 관통합니다.
  • ABox / TBox — 단언 상자(개체에 관한 사실, 예를 들어 professor(alice))와 용어 상자(종류에 관한 공리, 예를 들어 professor ⊑ researcher)입니다; kb.py의 FACTS가 ABox이고, 그 RULES가 하나의 TBox를 함의합니다.
  • 원자 / 접지 / 항수(Atom / ground / arity) — 원자는 인자에 적용된 술어로, ("advises", "alice", "bob")처럼 적힙니다; 변수를 전혀 담고 있지 않으면 접지되어(ground) 있다고 합니다; 술어의 항수(arity)는 그것이 취하는 인자의 개수입니다.
  • 혼 규칙(Horn rule) — 하나의 긍정 머리와 긍정 조건들의 논리곱으로 이루어진 몸체를 갖는 규칙입니다; 사실은 몸체가 비어 있는 혼 규칙입니다.
  • 즉각귀결 연산자(Immediate-consequence operator) TPT_P — 몸체가 이미 성립하는 모든 규칙의 머리를 더하는 함수입니다; 전방 연쇄란 더 이상 아무것도 바뀌지 않을 때까지 TPT_P를 되풀이해서 적용하는 것입니다.
  • 최소 고정점(Least fixpoint) — TPT_P 아래에서 안정적인 가장 작은 원자 집합입니다; 여기서는 크기 [23, 41, 47, 47]을 거쳐 세 번의 파동 만에 도달하며, 47개 원자 모델과 같습니다.
  • 클래스 위계(Class hierarchy) — professor ⊑ researcher ⊑ person과 같은 포섭의 사슬로, ⊑는 "~의 한 종류이다"라고 읽습니다.
  • 역할 사슬(Role chain) — advises ∘ advises ⊑ grandAdvisor처럼 어떤 관계를 그 자신 또는 다른 관계와 합성한 것으로, ∘는 "다음에 이어서"라고 읽습니다; 형식적으로는 복합 역할 포함(complex role inclusion)입니다.
  • EL / EL++ — EL은 핵심 구성자가 논리곱(⊓)과 존재 제한(∃r.C)인 경량 기술 논리입니다; EL++는 그 확장으로, 복합 역할 포함(역할 사슬)과 같은 기능을 더하며, OWL 2 EL의 기반입니다 — 이 둘을 합친 것이 바로 우리의 규칙들이 암묵적으로 살고 있는 논리입니다.
  • SLD 리졸루션 / 증명 트리(SLD resolution / proof tree) — 목표를 규칙의 머리와 단일화하고 몸체를 재귀적으로 증명함으로써 그 목표를 증명하며, 감사 가능한 증명 트리를 돌려주는, 프롤로그 뒤에 있는 후방 연쇄 전략입니다.
  • 다중 홉 질의(Multi-hop query) — "alice는 누구를 grand-advise하는가"처럼, 여러 엣지를 차례로 따라감으로써 답이 합성되는 질문입니다.
  • TransE / 마진 랭킹 손실(margin-ranking loss) — 관계를 하나의 이동(eh+erete_h + e_r \approx e_t)으로 다루며, 참인 트리플이 오염된 트리플보다 마진만큼 낮은 점수를 받도록 훈련시키는 임베딩 모델입니다.
  • 영역 임베딩(Region embedding) — 클래스를 박스나 볼로 표현하는 3권의 기하학으로, 위계가 문자 그대로의 포함(containment) 관계가 되게 합니다.
  • 보정(Calibration) — 진술된 신뢰도가 실제와 들어맞는 성질로, 0.9로 단언된 엣지가 열 번 중 아홉 번 맞다는 것입니다; 5권의 관심사입니다.
  • SATORI 캡스톤(capstone) — 이 시리즈가 쌓아 올려 가는 결합 뉴로-심볼릭 시스템으로, 이 같은 지식 베이스 위에서 가늠됩니다.

이 다음으로 이어지는 것

이제 우리에게는 하나의 자리에 세계 전체가 있습니다: 그 개체들, 그 23개의 사실, 그 7개의 규칙, 파동을 거듭하며 그것들이 자라나는 47개 원자 모델, 그 규칙들 속에 접혀 들어간 온톨로지, 감사 가능한 증명으로 그것들이 답하는 다중 홉 질문들, 그리고 아직 쓰이지 않은 시간과 불확실성의 층 — 이 모두가 다섯 개의 렌즈로 다시 읽힐 준비가 되어 있습니다. 이 권의 다음이자 마지막 장인 솔직한 평결은 이 모든 기계장치에서 한 걸음 물러나, 이 분야 전체가 반드시 마주해야 할 단도직입적인 질문을 던집니다: 논리와 학습이 각자 잘 해내는 모든 것 이후에, 뉴로-심볼릭 AI가 오늘날 실제로 내놓는 것은 무엇이고, 그저 약속만 하는 것은 무엇이며, 정확히 이 공유된 세계 위에서 진짜 프런티어는 여전히 어디에 놓여 있는가.