EL 임베딩: 기하와 논리의 만남
📍 현재 위치: 3부 · 온톨로지 임베딩 — 8장. 박스 대 공은 영역을 손으로 배치하고 각 도형이 무엇을 조각해 낼 수 있는지 증명했습니다; 이 장은 그 배치를 경사 하강에 넘기고, 2권의 실제 TBox에 맞서 공을 훈련시킨 다음, 훈련된 기하를 2권 자신의 추론기에 대조하여 감사합니다.
2부는 하나의 예측으로 마무리되었습니다: 공은 논리곱을 정확히 표현할 수 없으므로, 온톨로지를 공으로 그려 낸 그림은 어딘가에서 반드시 휘어야 합니다. 이 장은 그 예측이 걸려 있던 실험을 실제로 실행합니다. 방법의 이름은 ELEm(EL Embeddings)으로, EL++ TBox(용어 상자: 2권이 세운 추론기가 다루는 경량 서술 논리인 EL++로 작성된, 온톨로지의 스키마 수준 공리들)의 모든 개념을 8차원 공에, 모든 역할을 이동 벡터에 사상한 다음, 정규화된 각 공리를 미분 가능한 벌점(penalty)으로 바꾸어, 경사 하강이 말 그대로 온톨로지의 기하학적 모델을 구축하려 시도하게 만드는 구성입니다 [1]. 여기서 벌어지는 모든 일은 학술 세계 위에서 이루어지는 통제된 실험입니다: 2권이 분류한 것과 똑같은 14개의 공리를 똑같은 normalize() 함수에 통과시키고, 손으로 쓴 그래디언트로 훈련시킨 다음, 완성 알고리즘 자신의 판정에 대조하여 채점합니다. 끝에 나오는 점수는 인상이 아니라 혼동 표입니다.
원형 구역제로 나뉜 어느 도시의 법전을 상상해 보세요. 법 하나하나가 도형에 대한 제약입니다. "교수 구역은 연구자 구역 안에 완전히 들어 있어야 한다", "교수 구역과 학생 구역은 겹칠 수 없다", "교수 구역을 동쪽으로 두 블록 옮기면 반드시 학생 구역 안에 들어와야 한다"처럼요. 도시 계획가는 원들을 아무렇게나 던져 놓은 다음, 날마다 그 하나하나를, 모든 법을 동시에 어기는 정도의 총합이 줄어드는 방향으로 조금씩 밀어냅니다. 삼천 일이 지나면 지도는 법을 잘 지키는 것처럼 보이지만, "그렇게 보인다"는 것은 증명서가 아닙니다. 그래서 감독관이 자를 들고 지도를 돌아다니며 모든 구역 쌍을 검사합니다. 법전이 요구한 적 없는 포함 관계를 단언하지는 않는지, 법전이 함의하는 것을 놓치지는 않는지를요. 계획가는 경사 하강이고, 지도는 임베딩이며, 감독관은 2권의 추론기입니다. 이 장은 그 감독관의 보고서입니다.
이 장에서 다루는 내용
- 통제된 설정: 같은 TBox, 같은 정규화(공리 14개 → 정규형 16개, 2권 자신의 코드를 import하여 다시 계산), 그리고 금본위 기준으로 삼은 2권의 분류 결과. 다시 타이핑한 것도, 지어낸 것도 없습니다.
- 개념은 공으로, 역할은 이동으로: 파라미터 블록 , , , 그리고 이후 모든 것이 딛고 서는 포함 기준 의 완전한 유도.
- 네 개의 정규형과 서로소 관계에서 나온 다섯 개의 경첩: 각 손실을 공리의 형태로부터 유도하고 그 하위그래디언트를 끝까지 구하며, 존재 제한이 어느 변에 있는지에 따라 반지름의 부호가 왜 뒤집히는지, 논리곱 손실이 왜 까다로운지, 서로소 관계에서 왜 공이 자연스러운지를 다룹니다.
- 손실 0이 뜻하는 것: NF1과 NF3 경첩은 자신의 공리가 성립할 때 정확히 사라지고, 서로소 경첩은 두 공이 여분의 안전 여유까지 확보해야 비로소 사라지지만(그 값이 0이면 공리는 여전히 보장됩니다), NF4와 NF2 경첩은 자신의 공리보다 엄격히 더 약해서, 손실 0조차 모델임을 증명하지 못하며, 모델이라 해도 재현율만 보장할 뿐 정밀도는 결코 보장하지 않습니다; 세 줄짜리 삼각 부등식 논증이 그럼에도 우리 TBox가 손실 0을 금지함을 증명합니다.
- 커밋된 훈련 트레이스: 손실이 15.3500 → 0.8361 → 0.6078로 떨어졌다가 0.6848로 다시 올라가는 과정, 건너뛴 역할 사슬을 소리 내어 출력하는 대목, 그리고 훈련된 반지름이 크기순으로 개념 위계를 복원하는 모습.
- 건전성 탐침: 허용 오차 을 갖는 기하학적 포섭 검사를 충족 가능한 이름 붙은 개념들의 56개 순서쌍 전부에 대해 채점합니다: 참 양성 8, 거짓 양성 0, 거짓 음성 0, 이 작은 TBox에서 정밀도와 재현율 1.0000. 그리고 규모가 커지면 이 그림이 왜 달라지는지도 다룹니다.
- 비유가 해지는 지점: 2권이 충족 불가능하다고 증명한 두 개념을, ⊥를 위한 공이 아예 없는 공간에서 기하가 어떻게 다루는지.
통제된 실험: 같은 공리, 같은 정규형, 같은 금본위
기하가 논리를 존중하는지를 묻는 실험은, 기하와 논리가 공리가 무엇인지에 대해 조용히 어긋나 버리면 아무 가치가 없습니다. 그래서 동반 모듈 el_embed.py는 무엇 하나 다시 타이핑하기를 거부합니다. 그 첫 작동 줄들은 2권의 온톨로지와 추론기를 곧바로 import합니다(el_embed.py 37–40행):
import kg # noqa: F401 — wires sys.path to ../logic and ../symbolic
import ontology as onto
from ontology import BOT, TOP
from el_completion import normalize, classify
재사용되는 세 가지 산출물이 실험을 고정합니다. 첫째, 공리입니다: onto.TBOX는 2권의 모든 장이 추적했던 것과 똑같은, 14개 공리로 이루어진 EL++ TBox입니다(ontology.py 125–174행). 둘째, 정규형입니다: NORMALIZED, FRESH_NAMES = normalize(onto.TBOX) 호출(el_embed.py 62행)이 2권 자신의 정규화(el_completion.py 69–154행)를 실행하며, 이는 EL++ 기계 장치가 딛고 선 네 개의 평평한 형태로 된 16개의 정규형 공리를 돌려줍니다 [2]. 그 과정에서 고안된 두 개의 새 이름 _N1, _N2도 함께 딸려 옵니다. 16개 가운데 정확히 하나는 역할 사슬 advises ∘ advises ⊑ grandAdvisor이고, 나머지 15개는 TRAINABLE로 갈라져(el_embed.py 63–64행) 각각 하나의 손실 항이 됩니다. 셋째, 금본위입니다: classify()(el_completion.py 302–319행)가 완성 알고리즘을 고정점까지 다시 실행하고, el_embed.py 121–126행이 그 답을 읽어 옵니다. 8개의 충족 가능한 이름 붙은 개념들 사이의 포섭 관계 8개와, 충족 불가능한 개념 2개입니다. 커밋된 실행은 이 계약 전체를 출력합니다:
normalization — Volume 2's normalize(), recomputed, never retyped
14 TBox axioms → 16 normal-form axioms
trained : 6 nf1 + 1 nf2 (⊓) + 3 nf3 + 4 nf4 + 1 disjointness (⊑ ⊥) = 15 loss terms
SKIPPED : advises ∘ advises ⊑ grandAdvisor — ELEm's loss vocabulary has no
term for a role chain: the axiom is dropped, not approximated.
⊥ gets no ball: Professor ⊓ Student ⊑ ⊥ trains only the
disjointness hinge that pushes the two balls apart.
gold standard — Volume 2's classify(), recomputed
8 subsumptions between the 8 satisfiable named concepts:
Dean ⊑ Person, Professor, Researcher
Professor ⊑ Person, Researcher
Researcher ⊑ Person
Student ⊑ Person, Researcher
2 unsatisfiable concepts (no consistent ball exists —
excluded from the probe): TenuredStudent, TenuredStudentAdvisor
훈련이 시작되기도 전에 SKIPPED 줄이 무엇을 시인하고 있는지 눈여겨보십시오. 이 공백은 정의상의 것입니다: ELEm의 손실 어휘는 정확히 네 개의 정규형과 서로소 관계만을 컴파일하며, 역할 사슬을 위한 항은 하나도 담고 있지 않으므로, "advises 엣지 다음에 또 advises 엣지가 오면 grandAdvisor 엣지를 함의한다"는 근사되는 것이 아니라 그냥 버려집니다. 이동 읽기는 원리상 이 사슬을 수용할 수도 있었습니다. advises 두 단계를 합성하면 점을 만큼 이동시키므로, 로 두면(이를테면 에 대한 경첩으로) 부호화할 수 있었을 것입니다. 다만 발표된 레시피가 그것을 애초에 묻지 않을 뿐입니다. 그래서 grandAdvisor는 벡터를 얻지 못하고, 그 공리는 기하 위에 아무 흔적도 남기지 않으며, 모듈은 그 사실을 소리 내어 밝히고 그 개수를 assert합니다(el_embed.py 350–354행): 정규형 16개가 들어와, 사슬 정확히 1개가 배제되고, 정확히 15개가 손실로 컴파일됩니다. 이 표현력 공백이 이 장이 지켜 나가는 정직한 장부의 첫 항목입니다. 다른 온톨로지 임베딩 시스템들은 공리를 텍스트로 다룸으로써 이런 질문을 피해 갑니다: Onto2Vec은 공리 문자열을 단어 임베딩 모델에 먹이고 [3], OWL2Vec*는 온톨로지의 그래프 투영을 순회합니다 [4]; 둘 다 공리가 성립한다는 어떤 기하학적 진술도 내놓지 못합니다. ELEm의 요점 전체는 바로 기하가 그런 진술을 한다는 데 있으며, 그것이 정확히 그 진술을 검사 가능하게 만드는 이유입니다 [1].
개념은 공으로, 역할은 이동으로
이제 형식적 설정입니다. 표기부터 시작합니다. 임베딩 차원(embedding dimension) 는 각 점이 지니는 좌표의 개수입니다; 여기서는 입니다(el_embed.py 44행). 훈련 가능한 공리 안에 살아남는 개념 마다 두 개의 파라미터를 받습니다: 공간 속에서 그 개념의 위치를 정하는 여덟 개의 실수 목록인 중심(center) 과, 그 크기를 나타내는 하나의 양수인 반지름(radius) 입니다. 그 개념의 영역은 다음 공입니다.
여기서 는 유클리드 노름(Euclidean norm), 곧 성분들의 제곱합의 제곱근입니다. 반지름은 로그 반지름(log-radius) 로 저장되며 를 만족합니다. 그래서 경사 하강이 에 무슨 짓을 하든 는 항상 양수로 남습니다; 연쇄 법칙에 의해, 에 대한 어떤 도함수든 를 통해 에 대한 도함수로 변환됩니다(el_embed.py 137–142행). 훈련 가능한 공리가 사용하는 모든 역할 은 이동 벡터(translation vector) 을 받는데, 이는 TransE가 지식 그래프 관계에 썼던 것과 같은 장치를 존재 제한을 위해 다시 동원한 것입니다. 열세 개의 개념이 공을 받습니다: 선언된 10개의 이름, 새로 만들어진 _N1과 _N2, 그리고 모든 개체를 포함하는 최상위 개념 ⊤(2권의 공리 ∃advises.⊤ ⊑ Researcher에서 채움말(filler), 곧 점 뒤에 쓰인 개념으로 등장합니다; 기호 는 "존재한다"로 읽고, 존재 제한 는 의 적어도 한 원소로 향하는 -엣지를 가진 모든 것을 가리키며, 이 공리는 무엇이든 조언하는 이는 누구나 연구자라는 뜻입니다)입니다. ⊥는 의도적으로 아무것도 받지 않으며, 오직 advises와 authored라는 두 역할만이 벡터를 받습니다; grandAdvisor의 유일한 공리는 건너뛴 사슬이므로 아무것도 받지 못합니다(el_embed.py 84–90행).
이 장의 모든 것은 하나의 기하학적 사실 위에 놓여 있으므로, 이를 처음부터 끝까지 유도합니다: 공의 포함 관계에는 닫힌 형태의 기준이 있습니다,
기준은 포함 관계를 함의합니다. 공 의 임의의 점 를 취하면 입니다. 삼각 부등식(두 점 사이의 직행 거리는 셋째 점을 거치는 거리를 넘지 않는다는 것)은 다음을 줍니다.
마지막 단계는 기준에 의한 것입니다. 그러므로 는 공 안에 놓이고, 가 임의였으므로 공 전체가 그렇습니다.
포함 관계는 기준을 함의합니다. 공 가 공 안에 들어 있다고 하고, 에서 가장 먼 공 의 점을 생각해 봅시다: 에서 출발해 로부터 곧장 멀어지는 방향으로 거리 만큼 걸어갑니다. 형식적으로, 를 에서 를 향하는 단위 벡터라 하고(중심이 일치하면 어떤 단위 벡터를 써도 됩니다), 로 둡니다. 이 점은 이므로 공 에 속합니다. 까지의 거리는 정확히 계산됩니다: 는 와 같으므로,
두 항 모두 같은 단위 벡터 를 따라 향하고, 평행한 벡터들의 길이는 서로 더해지기 때문입니다. 포함 관계는 를 공 안으로 밀어 넣으므로, 입니다. ∎
이것은 공과 원뿔 장이 손으로 배치한 영역들에 사용했던 것과 같은 공 포함 조건입니다; ELEm 구성 전체는 이 부등식에 경첩을 두르고 그래디언트를 관통시킨 것에 지나지 않습니다. "는 공 가 공 안에 있음을 뜻한다"는 읽기 아래에서, 이 기준은 논리적 함의를 하나의 스칼라 비교로 바꾸어 주며, 이것이 바로 훈련 손실과 최종 탐침 모두를 가능하게 만드는 것입니다.
처음부터 끝까지 이어지는 실험: 2권의 공리들은 15개의 경첩 손실이 되고(역할 사슬 하나는 소리 내어 건너뜁니다), 경사 하강은 13개의 공과 2개의 이동을 배치하며, 건전성 탐침은 훈련된 기하를 추론기의 금본위 포섭 8개에 대조하여 채점합니다.
저자가 AI의 도움을 받아 직접 제작한 원본 도해.
네 개의 정규형에서 나온 다섯 개의 경첩
훈련 가능한 공리마다 형태의 벌점 하나, 곧 경첩(hinge)을 냅니다: 양 는 공리의 기하학적 제약이 얼마나 어겨졌는지를 재고, 제약이 성립할 때는() 경첩이 아무것도 물리지 않으며 성립하지 않을 때는 위반량 그 자체를 물립니다. 경첩은 꺾인 지점 에서 미분 가능하지 않으므로, 코드는 표준적인 하위그래디언트(subgradient) 관례를 씁니다: 의 그래디언트는 인 곳 어디서나 이고 인 곳 어디서나 영벡터입니다(el_embed.py 140–142행). 모든 손실이 재사용하는, 한 번만 유도해 두면 되는 사실이 하나 더 있습니다: 노름의 그래디언트입니다. 로 쓰면, 좌표 에 대한 편미분은 제곱근에 연쇄 법칙을 적용해 다음과 같습니다.
그러므로 이며, 이는 를 따라 향하는 단위 벡터이고, 원점에서는 하위그래디언트로 을 택합니다(el_embed.py 154–158행). 다음은 손실 동물원 전체를 한눈에 본 것입니다. 은 경첩 여유, 은 서로소 여유입니다(el_embed.py 45–46행); 유도는 그 뒤에 이어집니다.
| 형태 | 공리 형태 | 기하학적 읽기 | 경첩 논항 | 개수 |
|---|---|---|---|---|
| NF1 | 공 가 공 안에 | 6 | ||
| NF2 | 공들이 겹치고, 중점 영역이 안에 | 와 | 1 | |
| NF3 | 공 를 만큼 옮기면 공 안에 | 3 | ||
| NF4 | 공 를 만큼 되돌려 옮기면 공 와 만난다 | 4 | ||
| 서로소 | 공들이 적어도 만큼 떨어지도록 밀림 | 1 |
NF1: 경첩을 두른 포함 관계
NF1 손실은 앞 절의 포함 기준에 경첩을 두른 것입니다:
경첩이 활성일 때, 로 씁니다. 중심에 대한 그래디언트는 (항등: 를 조금 밀면 도 그만큼 밀립니다)와 를 갖는 노름 규칙에서 나옵니다: 이고 입니다. 반지름은 선형으로 들어가서 이고 이며, 로그 반지름의 연쇄 법칙이 이를 와 로 바꾸어 줍니다. 코드는 이 유도를 그대로 옮겨 적은 것입니다(el_embed.py 160–172행):
# NF1 A ⊑ B : ball A inside ball B.
# L = max(0, ‖c_A − c_B‖ + r_A − r_B − γ)
# ∂L/∂c_A = u/‖u‖, ∂L/∂c_B = −u/‖u‖ (u = c_A − c_B);
# ∂L/∂r_A = +1, ∂L/∂r_B = −1 (so ∂L/∂ρ_A = +r_A, ∂L/∂ρ_B = −r_B).
for a, b in NF1:
n, u = unit(cent[a] - cent[b])
g = n + rad[a] - rad[b] - GAMMA
if g > 0.0:
parts["nf1"] += g
g_cent[a] += u
g_cent[b] -= u
g_rho[a] += rad[a]
g_rho[b] -= rad[b]
갱신의 방향을 읽어 봅시다: 어겨진 포함 관계는 를 쪽으로 끌어당기고(스텝은 그래디언트를 빼므로 는 에 거슬러, 곧 쪽으로 움직입니다), 를 쪽으로 밀어내며, 를 줄이고 를 키웁니다. 네 움직임 모두 위반을 줄입니다; 경사 하강은 집합 포함 관계를 하나의 쥐어짜는 운동으로서 발견해 냅니다.
NF3와 NF4: 역할 이동, 그리고 어느 변이냐에 따라 부호가 뒤집히는 이유
존재 제한에는 역할이 필요합니다. ELEm은 "점 의 -후속자"를 이동된 점 로 읽으므로, 공리 (모든 는 안에 -후속자를 갖는다)는 "공 를 만큼 옮기면 공 안에 놓인다"가 됩니다:
다시 하나의 포함 관계이며, 이고, 그래디언트는 입니다(이동이 계수 로 안에 나타나므로 와 같은 그래디언트를 받습니다), 이고, 반지름에 대한 도함수는 NF1에서와 같이 입니다(el_embed.py 210–223행).
NF4는 존재 제한을 왼쪽에 둡니다: 는 로 향하는 -엣지를 가진 것은 무엇이든 라고 말합니다. 이제 제약되는 영역은 원상(pre-image), 곧 이동시키면 공 에 떨어지는 점들의 집합인데, 이동 읽기 아래에서 이는 을 중심으로 하는, 뒤로 옮겨진 공 입니다. ELEm의 경첩은 "그 영역이 안에 놓인다"를 "그 영역이 의 손이 닿는 곳에 있다"로 완화하는데, 이는 겹침 조건입니다(el_embed.py 225–239행):
표가 보여주는 부호 뒤집힘을 풀어 봅시다. 포함 관계(NF1, NF3)에서는 안쪽 반지름과 바깥쪽 반지름이 서로 다투는데, 안쪽 공을 키우면 포함이 더 어려워지고(), 바깥쪽 공을 키우면 더 쉬워집니다(). 겹침(NF4)에서는 두 반지름 모두 도움이 됩니다: 어느 공을 키우든 둘이 맞닿기가 더 쉬워지므로 둘 다 음의 부호로 들어가며, 경첩은 뒤로 이동된 공이 공 로부터 두 반지름의 합보다 더 멀리 떨어져 있을 때만 발화합니다. 하위그래디언트는 를 가지고 같은 노름 규칙을 따릅니다: , , 그리고 이며, 로그 반지름 변환 후에는 와 가 됩니다.
NF2: 까다로운 녀석
논리곱 공리 는 기하에게 영역 를 요구하는데, 앞 장은 그 영역이 공이 아니라 렌즈임을 증명했습니다: 이 계열은 교집합에 대해 닫혀 있지 않으므로, 공으로 정확히 그려 낼 방법은 존재하지 않으며 어떤 NF2 손실이든 대역(surrogate)일 수밖에 없습니다. 동반 모듈이 구현하는 단순화된 중점 형태의 ELEm 대역은 두 개의 경첩을 부과합니다(el_embed.py 174–208행): 피연산자 공들이 겹쳐야 하고,
그리고 두 중심의 중점 이, 둘 중 더 작은 반지름을 지닌 채 안에 들어맞아야 합니다:
(발표된 손실은 와 를 두 개의 별도 경첩으로 제약합니다 [1]; 중점 형태는 같은 기하학적 의도를 하나로 구현하며, 174–180행의 주석이 밝히듯 이것이 바로 코드가 미분하는 대상입니다.) 겹침 경첩은 NF4와 같은 방식으로 미분되며, 반지름은 음수입니다: , , . 중점 경첩에는 새로운 주름이 두 개 있는데, 둘 다 연쇄 법칙으로 다룹니다. 이므로, 두 피연산자 중심 어느 쪽으로 흘러드는 그래디언트든 절반이 됩니다: 로 쓰면 이고 입니다. 그리고 자체가 꺾여 있습니다; 그 하위그래디언트는 을 현재 더 작은 쪽 반지름에 온전히 보내며, 동점일 때는 로 보냅니다(el_embed.py 199–208행). 이 손실을 눈여겨보십시오: 기하가 논리가 말하는 바를 구조적으로 말할 수 없는 유일한 자리이기 때문입니다.
서로소 관계: 공이 자연스러운 곳
서로소 공리 Professor ⊓ Student ⊑ ⊥는 우변이 ⊥인 NF2이며, 컴파일러는 이를 자신만의 버킷으로 보냅니다(el_embed.py 103–108행). ⊥에는 공이 없으므로, 이 공리는 로 가중된(51행의 DISJ_WEIGHT로, 전체 레시피가 쓰는 음성 샘플링을 대신합니다) 단 하나의 분리 경첩을 훈련합니다:
이 경첩은 두 공이 겹치거나 여유 보다 가까워지는 동안 발화합니다; 이제 거리는 음의 부호로, 두 반지름 모두 양의 부호로 에 들어가므로, 일 때 하위그래디언트는 , , 이며, 이 스텝은 중심들을 서로 밀어내고 두 반지름을 모두 줄입니다(el_embed.py 241–255행). NF2와의 대조를 눈여겨보십시오: 논리곱은 공이 만들어 낼 수 없는 도형을 요구했지만, 서로소 관계는 오직 두 공이 닿지 않기만을 요구하며, "두 공이 닿지 않는다"는 정확히 하나의 부등식입니다. 이것은 공 계열이 태생적으로 표현하는 제약이며, 훈련된 기하는 여유를 남기고서 이를 통과할 것입니다. 부드러운 정칙화 항이 손실을 완성하는데, 인 가 모든 중심을 단위 구 쪽으로 끌어당기며, 이는 원래 레시피가 적용하는 엄격한 정규화를 대신하는 미분 가능한 대역입니다; 그 그래디언트는 같은 노름 규칙에 의해 입니다(el_embed.py 257–263행).
손실 0이 뜻하는 것, 그리고 우리가 그것을 가질 수 없는 이유
경첩마다 자기 공리의 기하학적 제약이 어겨진 정도를 정확히 물리므로, "총 손실이 0이다"는 정밀한 진술입니다: 15개의 제약 모두가 성립한다는 것입니다. 그것이 얼마만큼의 논리를 사 주는지는 경첩에 따라 다르며, 여기서 다섯 개의 경첩은 갈라집니다. NF1과 NF3에서는 그 제약이 기하학적 읽기 아래에서 공리 자체입니다(포함 관계, 이동된 포함 관계이므로), 그래서 손실이 0이면 그 공리들은 정확히 성립할 것입니다. 서로소 경첩은 자신의 공리보다 조금 더 많이 요구합니다: 두 공이 여분의 여유 만큼 떨어져야 비로소 사라지므로 이미 서로소인 공들에 대해서도 양수로 남을 수 있지만, 그 값이 0이면 분리가, 따라서 공리가 여전히 강제됩니다. 나머지 두 경첩은 자신의 공리보다 엄격히 더 약합니다. NF4 경첩은 "뒤로 이동된 공이 안에 놓인다"를 단순한 겹침으로 완화했고, NF2 중점 대역은 렌즈 전체가 아니라 점 하나와 더 작은 반지름만을 제약합니다: 두 피연산자 공 모두에 속하는 점 는 오직 만을 만족시키며, 두 반지름이 다를 때마다 는 를 넘어서므로, 손실이 0인 기하도 의 일부를 바깥에 남겨 둘 수 있습니다. 그러므로 손실 0은 모델임을 증명하지 않습니다: 이 구성 자신의 제목은 "모델의 기하학적 구성"[1]을 약속하지만, 그 영점 집합에는 NF4나 NF2 공리가 거짓인 기하들도 들어 있습니다. "손실이 0이다"와 "모델이다" 사이의 이 간극이 바로 박스 기반 후속 모델들이 문을 여는 충실성(faithfulness) 비판이며 [5], 이를 메우는 것이 3부 나머지 부분의 흐름입니다.
게다가 진정한 모델이라 하더라도 오직 한 방향으로만 신뢰를 사 줄 것입니다. 함의된 포섭 관계는 공리들의 모든 모델에서 성립하므로, 훈련 가능한 조각을 정말로 모델링하는 기하라면 어떤 함의도 놓치지 않을 것입니다: 완벽한 재현율입니다. 그러나 하나의 모델에서 참인 것이 함의는 아닙니다. 어떤 단일 모델은 어떤 공리도 관계 짓지 않은 두 공을 포개어 둘 수 있고, 그 포갬은 논리에 대해 아무것도 단언하지 않습니다; 거짓 양성은 손실이 0일 때조차 살아남을 수 있습니다. 이 비대칭성이 바로 아래의 탐침이 재현율만이 아니라 정밀도도 채점해야 하는 이유입니다.
우리 TBox는 손실 0이라는 출발점조차 금지하며, 그 증명은 삼각 부등식 세 줄입니다. 손실이 0이라고 가정해 봅시다. TenuredStudent의 두 NF1 경첩은 정확한 포함 관계 와 를 줄 것이고(아래첨자 , , 는 각각 TenuredStudent, Professor, Student입니다), 서로소 경첩은 분리 를 줄 것입니다. 삼각 부등식을 를 거쳐 연쇄시키고, 각각 중심 사이 거리를 한계 짓도록 재배열한 두 포함 관계를 대입합니다:
분리 부등식과 결합하면 이므로, 입니다. 그런데 는 구성상 양수입니다. 모순입니다. 손실이 0이라고 가정하지 않고 같은 대수를 돌리면 정량적인 바닥이 나옵니다: TenuredStudent의 두 경첩과 서로소 경첩을 더한 값은 항상 적어도 이어야 하므로, 출력되는 손실은 결코 그 아래로 떨어질 수 없습니다. 충족 불가능한 개념은 옵티마이저의 신발 속에 박힌 돌처럼, 영원히 남습니다.
이것이 바로 이 장이 손실 곡선을 넘어서는 도구를 필요로 하는 이유입니다. 훈련은 낮지만 0은 아닌 어떤 손실에서 멈출 것입니다; 그러면 모든 제약은 오직 근사적으로만 성립하므로, 보장의 재현율 절반조차 해지고, 정밀도 절반은 애초부터 존재한 적이 없습니다. 훈련된 기하가 실제로 무엇을 단언하는지, 그리고 논리가 그중 얼마만큼을 허가하는지는 경험적 물음이며, 이를 정직하게 답하는 방법은 측정하는 것입니다: 기하를 얼려 놓고, 기하학적 포섭 검사를 정의한 다음, 추론기에 대조하여 채점합니다. 그것이 바로 건전성 탐침입니다.
커밋된 훈련 트레이스
훈련은 합산된 손실에 대한 순수한 전체 배치 경사 하강으로, 1권의 갱신 규칙을 세 파라미터 블록 모두에 동시에 적용한 것입니다(el_embed.py 288–295행):
for epoch in range(1, epochs + 1):
loss, g_cent, g_rho, g_vrel, parts = loss_and_grads(cent, rho, vrel)
if epoch in SNAPSHOTS:
losses[epoch] = (loss, parts)
# Gradient descent, θ ← θ − η ∂L/∂θ, on all three parameter blocks.
cent -= LR * g_cent
rho -= LR * g_rho
vrel -= LR * g_vrel
초기화는 시드가 고정되어 있고(default_rng(0), 281행), 중심들은 단위 구 위에, 모든 반지름은 에서, 이동들은 작은 가우스 값으로 시작하므로, 재실행해도 바이트 단위로 동일합니다. 학습률 로 3000 에폭을 돌리는 커밋된 실행은 손실을 정규형별 조각으로 나누어 네 개의 스냅숏에서 기록합니다(각 스냅숏 에폭의 갱신 이전 손실이므로, 에폭 1은 훈련되지 않은 기하를 보여줍니다):
training: full-batch loss (per-form pieces; epoch 1 = untrained)
epoch : total nf1 nf2 nf3 nf4 disj reg
1 : 15.3500 7.4906 1.7265 3.7316 2.4013 0.0000 0.0000
100 : 0.8361 0.3984 0.0000 0.3518 0.0000 0.0461 0.0398
1000 : 0.6078 0.1239 0.0000 0.0659 0.0000 0.4168 0.0011
3000 : 0.6848 0.1286 0.0000 0.0615 0.0000 0.4943 0.0004
(the loss cannot reach 0: no geometry satisfies TenuredStudent ⊑
Professor and ⊑ Student while the two stay γ_d apart — the
unsatisfiable concepts keep an irreducible residual.)
이 표에서 세 가지는 천천히 읽을 가치가 있습니다. 첫째, 쉬운 제약들은 빨리 죽습니다: 단 하나의 NF2 공리(공리 14를 정규화해서 나온 Person ⊓ _N1 ⊑ Researcher)와 네 개의 NF4 공리 전부가 에폭 100 무렵 0.0000이 되어 그대로 머뭅니다. 둘째, 총합은 단조롭지 않습니다: 에폭 1000까지 0.6078로 떨어졌다가 에폭 3000에 이르러 0.6848로 올라가며, 서로소 조각은 0.4168에서 0.4943으로 치솟습니다. 이것이 바로 불가능성 증명에서 나온, 좌절된 삼각형이 실제로 움직이는 모습입니다: TenuredStudent 경첩들은 Professor와 Student를 서로 끌어당기고, 가중된 서로소 경첩은 그 둘을 밀어내며, 고정 스텝 경사 하강은 도달할 수 없는 최적점 주위를 안착하지 못한 채 맴돌 뿐, 대수가 예측한 바닥 아래로는 결코 떨어지지 못합니다. 셋째, 출력된 훈련된 공들의 반지름은 개념 위계를 크기순으로 복원합니다:
the trained balls (named concepts, largest radius first)
concept ‖c_A‖ r_A
Person 1.0000 1.1454
Researcher 1.0000 0.9984
Paper 1.0000 0.5860
Institution 1.0000 0.5000
Topic 1.0000 0.5000
Student 1.0410 0.2615
Professor 0.9980 0.1865
TenuredStudent 0.9799 0.0270 (unsatisfiable)
TenuredStudentAdvisor 0.9635 0.0069 (unsatisfiable)
Dean 1.0253 0.0059
Person이 가장 큰 공이고, 그다음이 Researcher이며, 그다음이 형제 사이인 Student와 Professor, 그다음이 Dean으로, 세 겹의 포함 관계 깊숙이 포개진 아주 작은 공입니다; 이 순서를 모델에게 알려 준 사람은 아무도 없습니다. 포함 제약들이 층층이 쌓이면서 저절로 나온 것입니다. Institution과 Topic은 정확히 반지름 에, 인 채로 있습니다: 이 둘은 어떤 TBox 공리에도 등장하지 않으므로 어떤 경첩도 이들을 건드린 적이 없고, 그 파라미터는 여전히 훈련되지 않은 초기화 상태입니다. 이는 표의 다른 모든 숫자가 실제로 벌어들인 것임을 우연히 증명해 줍니다. 그리고 충족 불가능한 두 개념은 반지름 0을 향해 짓눌려 있습니다; 이 생각은 두 절 뒤에 다시 다룹니다.
건전성 탐침
이 도구는 부등식 하나입니다. 기하학적 포섭 검사(geometric subsumption test)를, 동결된 허용 오차 를 갖는 포함 기준으로 정의합니다(el_embed.py 301–305행):
def sub_geo(a: str, b: str, cent: np.ndarray, rad: np.ndarray) -> bool:
"""The geometric subsumption test: does ball A sit inside ball B, up to
the frozen slack ε? sub_geo(A, B) := ‖c_A − c_B‖ + r_A ≤ r_B + ε."""
ia, ib = C_ID[a], C_ID[b]
return float(np.linalg.norm(cent[ia] - cent[ib])) + rad[ia] <= rad[ib] + EPS
이 허용 오차는 훈련이 0이 아닌 손실에서 멈추었음을 인정하는 장치입니다: 보다 작은 잔여까지는 포함 관계가 성립하는 것으로 쳐 줍니다. 이 허용치는 이 스위트를 위해 한 번 조정된 뒤 동결되었습니다(55행); 결과를 본 뒤에 을 조정한다면 탐침이 순환 논리가 되어 버릴 것입니다. 이 탐침(el_embed.py 308–324행)은 충족 가능한 이름 붙은 개념들의 모든 순서쌍, 곧 개 쌍에 대해 sub_geo를 평가하고, 각각을 2권의 금본위 집합에 대조하여 채점합니다: 단언되었고 함의도 되면 참 양성(TP); 단언되었지만 함의되지 않으면 거짓 양성(FP); 함의되지만 단언되지 않으면 거짓 음성(FN); 둘 다 아니면 참 음성(TN)입니다. 정밀도는 TP/(TP+FP)로, 기하의 단언 가운데 논리적으로 건전한 것의 비율입니다; 재현율은 TP/(TP+FN)으로, 논리의 함의 가운데 기하가 복원해 낸 것의 비율입니다. 커밋된 실행은 다음과 같습니다:
soundness probe: sub_geo(A,B) := ‖c_A − c_B‖ + r_A ≤ r_B + ε, ε=0.15
all 8·7 = 56 ordered pairs of satisfiable named concepts vs the 8 gold subsumptions
gold ⊑ not entailed
geometry says ⊑ TP 8 FP 0
geometry says no FN 0 TN 48
precision = 1.0000 recall = 1.0000
false positives: none
false negatives: none
| 금본위가 함의 ⊑ | 금본위가 함의하지 않음 | |
|---|---|---|
| 기하가 단언 ⊑ | TP = 8 | FP = 0 |
| 기하가 부인 | FN = 0 | TN = 48 |
이 TBox 위에서 훈련된 공들은 금본위를 깨끗하게 복원합니다: 함의된 포섭 관계 8개가 모두 단언되었고, 함의되지 않는 48개 가운데 단언된 것은 하나도 없습니다. 이를 정직하게 말한 다음 해부해 봅시다. 이 완벽함의 두 절반 모두 규모가 커지면 살아남지 못하는 구조적 설명을 갖고 있기 때문입니다.
완벽한 재현율은 부분적으로 기하가 논리의 일을 공짜로 대신해 준 결과입니다. 8개의 금본위 쌍 가운데 단 4개만이 이름 붙은 개념들 사이에서 단언된 NF1 공리입니다(Dean ⊑ Professor, Professor ⊑ Researcher, Student ⊑ Researcher, Researcher ⊑ Person); 나머지 4개는 완성 알고리즘이 추이성(transitivity)으로 도출한 함의입니다. 정확한 공 포함 관계는 이전과 같은 삼각 부등식 패턴에 의해 그 자체로 추이적입니다: 이고 이면,
그래서 단언된 포함 관계만 훈련해도 기하는 도출된 것들을 자동으로 함께 넘겨받습니다. 정직한 단서 하나: 허용 오차가 있으면 이 논증은 약해집니다. 각각 까지 성립하는 두 포함 관계를 합성하면 까지 성립하는 하나가 되는데, 탐침은 오직 만을 허용하기 때문입니다; 훈련된 모델은 우연히도 네 개의 도출된 쌍 모두가 통과할 만큼 충분한 여지를 남겨 두었습니다. 한편 완벽한 정밀도는 안의 14개 공리짜리 TBox가 사 주는 것입니다: 제약이 이렇게 적고 공간이 이렇게 넉넉하면, 어떤 공리로도 서로 관계되지 않은 공들은 안에서 그냥 서로 멀어져 떠다니게 되고, 48개의 무고한 쌍 가운데 그 무엇도 우연히 포개지지 않았습니다. 모듈 자신의 역량 검사가 오직 TP ≥ 6만을 요구하는 것은(el_embed.py 358–360행) 바로 이 깨끗함이 방법 자체가 아니라 이번 실행의 성질이기 때문입니다; 그 독스트링은 엉뚱한 포함 관계를 예상되는 실패 양상으로 표시해 둡니다. 규모가 커지면 그림은 뒤집힙니다. ELEm 자신은 Gene Ontology를 위해 만들어졌고, 그 자신이 보고한 평가도 포섭 예측이 아니라 단백질-단백질 상호작용 링크 예측이었습니다 [1]. 그 뒤에 나온, GALEN과 Gene Ontology와 해부학 온톨로지에 대한 포섭 예측 연구들이야말로 공 임베딩이 정확히 이 장의 분석이 가리키는 지점, 곧 NF2 대역들을 모두 함께 만족시킬 수 없는 논리곱이 가득한 공리 집합에서 무너지는 모습을 보여 주는 곳입니다. 함의된 포섭 관계의 재현율은 떨어지고, 허가받지 않은 포함 관계는 새어 들어옵니다 [5][6]. 이 작은 TBox는 이 방법에게 최선의 사례를 내주는 것이고, 전이되는 것은 1.0000이라는 숫자가 아니라 탐침의 방법론입니다.
자로 검증한 서로소 관계
공 계열이 태생적으로 표현하는 그 하나의 공리는 자신만의 판정을 받을 자격이 있습니다. 커밋된 실행은 훈련된 Professor 공과 Student 공을 직접 측정합니다:
disjointness check: Professor ⊓ Student ⊑ ⊥, geometrically
‖c_Prof − c_Stud‖ = 0.5597 vs r_Prof + r_Stud = 0.4480 → gap +0.1117 (balls disjoint)
중심들은 떨어져 있는 반면 반지름의 합은 에 불과합니다: 두 공은 의 간격을 두고 서로소이며, 이는 요구된 여유 보다 조금 더 큽니다. 모듈은 이 간격이 양수임을 assert합니다(el_embed.py 361–364행). 어떤 공간의 점도 두 공 모두에 속하지 않으므로, "누구도 교수이면서 동시에 학생일 수 없다"는 기하학적 읽기는 훈련된 모델 안에서 정확히 성립합니다. 논리곱이 이 계열의 구조적 약점이었던 곳에서, 서로소 관계는 그 구조적 강점입니다: 태생적으로 표현 가능한 부등식 하나가, 자로 검증됩니다.
두 개의 불가능한 개념, 혹은 비유가 해지는 지점
2권의 완성 알고리즘은 TenuredStudent ⊑ ⊥를 증명했고, 바닥 규칙이 advises를 따라 거꾸로 기어간 끝에 TenuredStudentAdvisor ⊑ ⊥도 증명했습니다: TBox의 어떤 진정한 모델에서도, 두 개념 모두 공집합을 나타냅니다. 이제 기하가 이들을 가지고 무엇을 했는지 봅시다. 기하는 이들을 비울 수 없습니다. 반지름이 인 공은 언제나 점들을 담고 있으며, 파라미터화 자체가 반지름이 결코 0에 이를 수 없도록 선택되었습니다; ⊥를 위한 공은 없고, "아무것도 아님"을 뜻하는 기하학적 대상도 없습니다. 옵티마이저의 최선의 타협은 반지름 표에서 눈에 보입니다: TenuredStudent는 까지, TenuredStudentAdvisor는 까지 짓눌려 있으며, 각각은 모두 함께 만족될 수 없는 제약들 사이에 끼인 티끌입니다. 그 티끌은 여전히 모델 이론적 읽기 아래에서 거짓인 무언가를 단언합니다: 그것은 공집합이 아닌 영역이고, 어떤 가능한 개체가 종신 재직 학생이라는 주장인데, 논리는 이를 정면으로 반박합니다. 탐침은 56개 쌍에서 충족 불가능한 개념들을 제외하는데(충족 불가능한 개념은 공허하게 모든 것에 포섭되므로, 비교 자체가 무의미할 것입니다), 정직하게 말하자면 ELEm에는 충족 불가능성을 나타낼 방법이 아예 없습니다: "불가능"을 "아주 작음"으로 그려 내는데, 이는 근사 오류가 아니라 범주 오류입니다. 이것은 두 번째 표현력 공백으로, 건너뛴 역할 사슬보다는 미묘하지만 같은 종류의 것이며, 박스 기반 후속 모델들이 고치는 구체적인 결함 가운데 하나입니다. 공과 달리 박스는 아래쪽 모서리가 위쪽 모서리를 넘어서면 진정으로 텅 빌 수 있기 때문입니다.
아직 풀리지 않은 부분
정직한 장부를 결산해 봅시다. 16개의 정규형 가운데 하나(역할 사슬)는 손실을 아예 받지 못했습니다; 하나(논리곱)는 수학적 필연에 의해 대역일 수밖에 없는 손실을 받았습니다. 앞 장이 참된 영역은 어떤 공도 될 수 없는 렌즈임을 증명했기 때문입니다; 하나의 의미(⊥, 공집합임)는 아무런 기하학적 표현도 갖지 못해서, 충족 불가능성이 작음으로 둔갑합니다. 이 TBox 위에서는 그 피해가 눈에 띄지 않은 채로 남았습니다: 단 하나뿐인 NF2 경첩은 에폭 100 무렵 0에 도달했고 탐침은 완벽하게 되돌아왔습니다. 그러나 이 약점은 규모가 커지면 하중을 짊어지게 됩니다. 수천 개의 NF2 공리가 서로 얽히고, 중점 대역이 자신과 공존할 수 없는 포함 관계에 맞서 위반들을 서로 맞바꾸어야 하는 곳에서 말입니다. 열린 질문은 "벤치마크에서 더 잘하라"보다 더 날카롭습니다. 논리곱을 가진 EL TBox의 모델들을 그 영점 집합이 정확히 특징짓는 공에 대한 훈련 목적함수가 어떤 것이든 존재할까요, 아니면 이 닫힘 실패가 견고한 천장이어서, 모든 공 목적함수가 반드시 과소 단언(함의를 놓침)하거나 과다 단언(함의를 지어냄)할 수밖에 없을까요? 렌즈 장의 60.56퍼센트 면적 판정은 그 천장이 실재하며, 고쳐야 할 것은 손실이 아니라 도형이라고 말합니다. 이는 반증 가능한 주장이며, 다음 장은 이 실험 전체를 그대로 다시 실행함으로써, 곧 같은 TBox, 같은 정규화, 같은 금본위, 같은 탐침을 공 대신 박스로, 교집합이 정확한 모서리 산술이 되는 곳에서 다시 돌림으로써 이를 검증합니다. 두 개의 혼동 표가 나란히 놓이게 될 것입니다.
왜 중요한가
이 장은 신경-기호 프로그램 전체가 의지하는 패턴을 이 권에서 처음으로 완전하게 구현한 사례입니다: 정확한 의미론을 가진 기호적 산출물을 가져와, 미분 가능한 목적함수로 컴파일하고, 훈련한 다음, 그 결과를 어렴풋한 인상이 아니라 기호적 근거에 대조하여 감사하는 것입니다. 2권의 normalize()와 classify()를 재사용한 것이 이 실험을 통제되게 만들었습니다; 손실 0 논증은 "이 기하는 모델이다"를 은유가 아니라 정밀한 주장으로 만들었고, 정확히 어떤 경첩들이 그 주장에 미치지 못하는지를 보여 주었습니다; 불가능성 증명은 완벽함이 애초에 선택지에 없음을 미리 말해 주었고, 바로 그 때문에 정량적인 탐침이 필요해졌습니다; 그리고 그 탐침은 "이 임베딩은 온톨로지를 존중한다"는 주장이 책임져야 할 숫자들을 돌려주었습니다. 4권은 손실이 곧 논리인 시스템(의미론적 손실, 미분 가능한 증명)을 구축할 것이고, 5권은 학습된 추론기의 출력을 언제 신뢰할 수 있는지를 물을 것입니다; 둘 다 이 장의 규율과 어휘를 물려받습니다. 누군가 임베딩이 온톨로지를 "포착한다"고 말할 때, 이 장이 영구히 설치해 두는 질문은 이것입니다: 그 탐침은 무엇이고, 금본위는 무엇이며, 거짓 양성은 무엇이었는가?
핵심 용어
- EL++ TBox(용어 상자, terminological box) — 온톨로지의 스키마 수준 절반입니다: 2권이 분류했던 경량 서술 논리인 EL++로 작성된 개념 및 역할 공리들이며, 여기서는 학술 세계의 같은 14개 공리가 16개의 정규형으로 정규화되어 있습니다.
- ELEm(EL Embeddings) — EL++ TBox의 각 개념을 안의 공에, 각 역할을 이동 벡터에 사상하고, 각 정규형 공리의 기하학적 제약이 성립하도록 훈련하는 구성입니다; 모델의 기하학적 구성으로 소개되었습니다 [1].
- 공 포함 기준(Ball containment criterion) — 인 것은 정확히 일 때입니다; 삼각 부등식으로부터 양방향 모두 유도되며, 모든 손실과 탐침의 씨앗입니다.
- 경첩 / 하위그래디언트(Hinge / subgradient) — 제약 위반량을 정확히 물리는 벌점 입니다; 그 그래디언트는 인 곳에서는 이고 그 밖에서는 0이며, 라는 관례를 따릅니다.
- 로그 반지름(Log-radius) — 반지름을 항상 양수로 유지하는 파라미터화 입니다; 반지름에 대한 그래디언트를 로 변환합니다.
- 역할 이동(Role translation) — "의 -후속자"를 로 읽는 벡터입니다; NF3은 이동된 포함 관계로, NF4는 뒤로 이동된 겹침으로 이끕니다.
- 기하학적 모델 / 충실성(Geometric model / faithfulness) — 훈련 가능한 모든 공리가 기하학적 읽기 아래에서 참이 되는 기하입니다; ELEm의 손실 0은 그런 모델임을 증명하지 않습니다(NF4와 NF2 경첩이 자신의 공리보다 약하며, 이는 박스 방법들이 겨냥하는 충실성 공백입니다 [5]). 하나의 모델에서 참인 것이 함의는 아니므로 모델이라 해도 재현율만 보장할 것입니다; 어차피 충족 불가능한 개념들 때문에 손실 0은 여기서 증명 가능하게 도달 불가능합니다.
- 건전성 탐침(Soundness probe) — 충족 가능한 이름 붙은 개념들의 모든 순서쌍에 대해 추론기의 분류 결과에 대조하여 채점하는, 동결된 검사 입니다; 여기서는 56개 쌍에 대해 참 양성 8, 거짓 양성 0, 거짓 음성 0입니다.
- 표현력 공백(Expressive gap) — 이 구성이 표현하지 못한 채 남겨 두는 의미입니다: 역할 사슬 는 아무 손실 항도 받지 못하고(소리 내어 건너뛰었습니다), 충족 불가능성은 아예 기하학적으로 표현되지 못합니다(⊥를 위한 공이 없고, "불가능"이 "아주 작음"으로 표현됩니다).
이 장이 이끄는 곳
논리곱은 스스로 시인한 약점이었고, 앞 장은 그 약점이 옵티마이저가 아니라 도형의 것임을 증명했습니다. 다음 장인 BoxEL과 Box²EL은 도형 자체를 바꿉니다: 개념은 축 정렬 박스가 되고, 그 교집합은 모서리 산술로 정확히 계산되는 박스이므로, NF2 제약은 마침내 공리가 말하는 바를 그대로 말할 수 있게 됩니다; 박스는 또한 진정으로 텅 빌 수 있어서, ⊥에게 실제 지시체를 부여합니다. 실험은 그대로 다시 실행됩니다. 같은 14개의 공리를 같은 normalize()에 통과시키고, 같은 금본위 분류를 쓰고, 같은 56개 쌍짜리 탐침을 씁니다. 그리고 그 결과인 혼동 표가 이 장의 것 옆에 놓입니다. 그것이 답하는 질문은 바로 이 장이 물을 자격을 벌어들인 질문입니다: 도형 하나가 사 주는 건전성은 얼마만큼인가?
짝이 되는 코드: examples/neural/el_embed.py는 이 장 전체를 구현합니다: 2권의 정규화와 분류 결과 재사용(37–40행과 59–126행), 코드 바로 위 주석에 손으로 유도한 하위그래디언트를 담은 다섯 개의 경첩 손실 전부(129–266행), 전체 배치 훈련(271–296행), 기하학적 포섭 검사와 탐침(299–324행), 그리고 여기서 만든 모든 주장을 지켜 주는 역량 assert들(346–364행)입니다. python3 examples/neural/el_embed.py를 실행하면 이 장의 모든 숫자를 바이트 단위까지 재현할 수 있습니다; 그 실행은 SUMMARY el_embed: trained_axioms=15 skipped_chains=1 gold=8 tp=8 fp=0 fn=0 precision=1.0000 recall=1.0000 final_loss=0.6848 disjoint_gap=0.1117로 끝납니다.