본문으로 건너뛰기

링크 예측: 그래프 완성하기

📍 현재 위치: I부 · 지식 그래프 임베딩 — 1장. 2권 — 솔직한 평결은 증명할 수 없는 모든 사실 앞에서 기권하는 기호들로 마무리되었습니다; 이 장은 그 기권을 하나의 통계적 질문으로 바꾸고, 이 권의 모든 답을 잴 잣대를 세웁니다.

2권은 일부러 불편한 음으로 마무리되었습니다. 2권의 추론기들은 건전(sound)하고 완전(complete)하며 빨랐지만, 설계상 공리가 함의하지 않는 그 무엇에 대해서도 침묵했습니다. 2권은 개방 세계 가정(open-world assumption)을 원칙에 입각한 기권이라고 불렀습니다: 빠진 사실은 "함의되지 않음"을 낳을 뿐, 결코 "거짓"도 "아마도"도 낳지 않습니다. 이 장은 거기서 그냥 멈추기를 거부합니다. 우리는 똑같은 학계 세계를 가져와, 참임을 알고 있는 사실 하나를 지우고, 아무리 많은 논리를 동원해도 그것을 되살려 낼 수 없음을 확인한 다음, 그것을 되짚어 추측해 내는 기계 장치를 만듭니다: 모든 후보 사실에 대한 점수, 정렬된 목록, 그리고 진실이 얼마나 꼭대기 가까이에 떨어졌는지를 말해 주는 두 숫자, 즉 평균 역순위(Mean Reciprocal Rank, MRR)와 Hits@k입니다. 이 장에서는 어떤 모델도 훈련되지 않습니다. 프로토콜이 먼저 오는 이유는, 그것이 I부의 이동(translation) 모델부터 IV부의 관계형 그래프 신경망(relational graph neural network)에 이르기까지, 이 권의 모든 링크 예측 모델을 위한 채점판이기 때문입니다.

쉽게 말하면

여러분이 몇 편의 영화를 평가한 적이 있는 스트리밍 서비스를 상상해 보십시오. 그 서비스는 여러분이 한 번도 평가한 적 없는 영화를 좋아하리라는 것을 증명할 수 없습니다; "이 두 편을 좋아했다"에서 "저 한 편도 좋아할 것이다"로 가는 논리적 도출은 존재하지 않습니다. 그 서비스가 할 수 있는 일은, 여러분이 아직 보지 않은 모든 영화를 줄 세워 놓고, 각각에 그럴듯함 점수를 매긴 다음, 그 줄을 정렬하는 것입니다. 만약 여러분이 진짜로 좋아했을 영화가 상위 세 편 안에 든다면 그 추측기는 훌륭한 것이고, 열세 편 중 열한 번째 자리에 있다면 쓸모없는 것입니다. 링크 예측(link prediction)은 지식 그래프의 빠진 사실들을 정확히 이런 식으로 다룹니다: 제외해 둔 참인 사실은 여러분이 좋아했을 그 영화이고, 점수 매김기는 모델이며, 이 장의 기예는 진실이 정렬된 목록의 어디에 떨어지는지를 공정하게 재는 일입니다.

이 장에서 다루는 내용

  • 어떤 증명도 닿을 수 없는 빠진 엣지 — 모든 공리가 주어져도 2권의 추론기들이 왜 bob이 단언된 것 이상으로 누구를 지도하는지 이름 붙일 수 없는지, 그리고 그 실패가 왜 구조적인지를 다룹니다.
  • 점수 함수 — 완성을 순위 매김으로 다시 짠 것입니다: 임의의 후보 트리플을 하나의 실수로 사상하는 함수 s(h,r,t)s(h, r, t)이며, 오직 순서만이 중요합니다.
  • 정확한 데이터kg.py의 18개 트리플로, 다시 타이핑된 것이 아니라 1권의 사실들로부터 임포트되며, 그 결정론적 15/3 분할의 불변식은 assert로 강제됩니다.
  • 필터링된 순위 매김 프로토콜, 유도하기 — 원(raw) 순위와 필터링된 순위, 다른 참으로 알려진 답들이 왜 후보 목록을 떠나는지, 동점은 어떻게 셈해지는지, 그리고 MRR과 Hits@k의 정확한 정의를 다룹니다.
  • 우연이 벌어들이는 것 — 조화수(harmonic number)로부터 무작위 기준선의 기대 MRR을 완전히 유도하고, "아무것도 안 하는 것보다는 낫다"를 잴 수 있게 해 주는 커밋된 고정 무작위 숫자들을 다룹니다.
  • 첫 번째 훈련 결과transe.py의 커밋된 출력을 예고편으로 삼습니다: 모델을 정의하기도 전에, 학습이 이 지표를 0.1062에서 0.7778로 옮겨 놓습니다.
  • 방법론의 정직함 — 음성 샘플러(negative sampler)를 통한 누출, 동점 처리의 병리, 그리고 왜 6개의 질의는 하나의 시연일 뿐이고 FB15k-237과 WN18RR이 이 분야의 규모인지를 다룹니다.

어떤 증명도 닿을 수 없는 빠진 엣지

이 시리즈의 모든 권은 똑같이 작디작은 학계 세계를 읽지만, 각 권은 그것을 서로 다르게 읽습니다: 1권은 사실과 혼 규칙(Horn rule)으로, 2권은 EL++ 온톨로지로 읽습니다. 두 독법 모두 하나의 규율을 공유합니다: 사실은 단언되거나, 도출되거나, 아니면 알 수 없거나 셋 중 하나이며, "알 수 없음"은 하나의 최종적인 답입니다. advises(bob, carol)을 지워 보십시오, 그러면 추론기는 "아마도 여전히 지도하고 있을 것"으로 성능이 저하되지 않습니다; 그것은 그저 그 이후에 이어지는 모든 것을 함의하기를 멈추고, 아무 오류도 보고하지 않습니다.

이제 그 실패를 구체적으로 만들어 봅시다. 큐레이터가 bob이 dave를 지도한다는 사실을 기록하는 것을 잊었다고 해 봅시다. 2권의 TBox는 관련된 무언가를 실제로 함의합니다: 공리 Professoradvises.Student\text{Professor} \sqsubseteq \exists \text{advises}.\text{Student}로부터, 모든 교수는 어떤 학생을 지도하므로, 추론기는 bob이 누군가를, 즉 익명의 어떤 학생을 지도한다는 것을 증명할 수 있습니다. 추론기가 결코 할 수 없는 일은 그 학생의 이름을 대는 것입니다. advises(bob, dave)는 따라 나오지만 advises(bob, erin)은 따라 나오지 않게 만드는 공리는 존재하지 않으며, 그런 건전한 공리는 존재할 수도 없습니다; 둘 다 그 밖에 적혀 있는 모든 것과 일관됩니다. 도출은 증인이 없는 존재 한정(existential)에서 끝나 버립니다. dave로 가는 엣지는 그저 연역적 폐포(deductive closure) 안에 들어 있지 않으며, 아무리 완전한 추론기라도 폐포 바깥의 사실을 도출하지는 못합니다. 완전성(completeness)이란 "함의되는 모든 것을 도출한다"는 뜻이지, "참인 모든 것을 되찾는다"는 뜻이 아닙니다.

이것은 특수한 사례가 아닙니다; 이것은 실제 지식 그래프의 정상적인 상태입니다. 관계형 기계학습(relational machine learning)에 관한 서베이 논문들은 가장 큰 공개 지식 그래프조차 자신이 담고 있는 개체들에 관한 기본적인 사실 가운데 엄청난 비율을 빠뜨리고 있다고 보고합니다 [1]. 그 빠진 사실들은 애초에 도출 가능한 적이 없었는데, 왜냐하면 그것들은 세계에 관한 우연적인 사실이지, 다른 사실들의 논리적 귀결이 아니기 때문입니다. 그것들을 원한다면 우리는 질문 자체를 바꾸어야 합니다. "이 사실은 함의되는가?"(답: 아니오, 그리고 앞으로도 영영 아닐 것이다)라고 묻는 대신, 우리는 통계적인 질문을 던집니다: 그래프가 담고 있지 않은 모든 엣지 가운데, 어느 것이 참일 가능성이 높은가? 이 질문에는 증명론적인 답이 없습니다. 이 질문에는 학습 가능한 답이 있습니다.

도출에서 순위 매김으로: 점수 함수

이 재구성에는 정의 하나면 충분합니다. 개체(entity, 그래프의 노드; 여기서는 13개)의 집합을 E\mathcal{E}로, 관계(relation, 엣지의 유형; 여기서는 5개)의 집합을 R\mathcal{R}로 씁니다. 트리플(triple) (h,r,t)(h, r, t)란 방향이 있고 이름이 붙은 엣지입니다: 머리(head) 개체 hh, 관계 rr, 꼬리(tail) 개체 tt로 이루어지며, 그래서 advises(bob, dave)(bob,advises,dave)(\text{bob}, \text{advises}, \text{dave})가 됩니다. 점수 함수(score function)란 다음과 같은 임의의 사상입니다

s:E×R×E    R,s : \mathcal{E} \times \mathcal{R} \times \mathcal{E} \;\to\; \mathbb{R},

풀어 읽으면: ss는 후보 트리플, 즉 임의의 머리, 임의의 관계, 임의의 꼬리를 받아 하나의 실수(R\mathbb{R}은 실수 전체의 집합입니다)를 돌려주며, 이때 점수가 높을수록 모델이 그 트리플을 더 그럴듯하다고 여긴다는 관례를 따릅니다. ss에 관해 그 밖에 고정된 것은 아직 아무것도 없습니다. 그것은 기하학에서 올 수도, 쌍선형 형식(bilinear form)에서 올 수도, 신경망에서 올 수도 있습니다; 이 권의 모든 링크 예측 모델은, I부의 이동(translation) 모델부터 IV부의 관계형 그래프 신경망에 이르기까지, 정확히 ss를 고르는 하나의 선택과 그것을 훈련하는 하나의 방법입니다 [2], [1]. (II부와 III부는 개념과 공리를 영역으로 임베딩하고 자신만의 소속(membership) 및 포섭(subsumption) 검증으로 그것을 판정합니다; 이 권의 어떤 모델이든 후보 엣지에 순위를 매길 때마다, 이 장의 프로토콜이 그 심판입니다.)

링크 예측(link prediction, 지식 그래프 완성(knowledge graph completion)이라고도 불립니다)은 다음과 같은 과제입니다. 질의(query)란 하나의 개체가 가려진 트리플입니다: 꼬리 질의 (h,r,?)(h, r, ?)는 "hh가 관계 rr로 어떤 개체와 이어지는가?"를 묻고, 머리 질의 (?,r,t)(?, r, t)는 그 역을 묻습니다. 꼬리 질의에 답하려면, 모든 개체 eEe \in \mathcal{E}(풀어 읽으면: 개체 집합의 각 원소 ee)를 후보 꼬리로 점수 매겨 13개의 숫자 s(h,r,e)s(h, r, e)를 얻고, 이를 내림차순으로 정렬합니다. 모델의 답은 하나의 개체가 아닙니다; 그것은 정렬된 순서 전체입니다.

무엇이 대가로 치러졌는지 주목하십시오. 2권에서 하나의 질의에 대한 답에는 도출 과정이 딸려 왔습니다: 규칙 발동의 유한하고 감사 가능한 사슬이며, 그 결론이 공리의 모든 모델에서 성립한다는 보장이었습니다. 정렬된 목록에는 이 둘 중 어느 것도 딸려 오지 않습니다. 점수 s(bob,advises,dave)s(\text{bob}, \text{advises}, \text{dave})는 진리값이 아니고, 확률도 아니며(아직 그 무엇도 그것을 [0,1][0,1] 안으로 밀어 넣거나 보정하지 않았습니다), 어떤 논증의 결론도 아닙니다. 그것은 하나의 선호이며, 오직 다른 후보들의 점수와 견주었을 때만 의미가 있습니다. 우리는 확실성을 포기했고, 그 대가로 연역적 폐포 바깥의 사실에 관해 무언가를 말할 수 있는 능력을 얻었습니다. 이 장의 평가 문제는 하나의 순서를 정직하게 재는 방법이고, 이어지는 여러 장의 모델링 문제는 그 순서를 좋게 만드는 방법입니다.

학계 지식 그래프 위에서 이루어지는 링크 예측을 보여 주는 두 패널짜리 다이어그램입니다. 왼쪽 패널은 그래프 자체를 보여 줍니다: 사람 alice, bob, carol, dave, erin, 논문 p1, p2, p3, 기관 mit와 cmu, 주제 logic, ml, nesy를 나타내는 13개의 이름 붙은 노드가, 훈련 분할에서 그려진 15개의 실선 방향 엣지로 연결되어 관계별로 색이 칠해져 있고, 제외해 둔 시험 트리플인 bob이 dave를 지도한다, bob이 p1을 저술했다, erin이 cmu에 소속되어 있다를 나타내는 3개의 점선 엣지가 있으며, 각 점선 엣지에는 물음표가 붙어 있습니다. 오른쪽 패널은 bob이 지도하는 이는 물음표라는 단일 질의에 대한 순위 매김 기계 장치를 보여 줍니다: 후보 꼬리 개체들을 점수에 따라 최상단이 최선, 최하단이 최악이 되도록 정렬한 세로 열이 있으며, 참으로 알려진 훈련 답인 carol에는 취소선이 그어져 필터링되어 제외됨이라고 표시되어 있고, 제외해 둔 참인 답 dave는 필터링된 순위 자리에서 초록색으로 강조되어 있으며, 주제나 기관 같은 그럴듯하지 않은 후보들은 열의 맨 아래쪽에 자리 잡고 있습니다. 그 열 아래에는 작은 수식 칩들이 MRR에 기여하는 순위 분의 1과 Hits@k에 기여하는 지시함수를 보여 주고, 왼쪽 패널의 점선 엣지에서 오른쪽 패널의 열로 향하는 화살표는 이 질의에 답하는 것이 도출이 아니라 순위 매김임을 보여 줍니다. 학계 세계 위의 링크 예측: 훈련 그래프(실선 엣지)는 제외해 둔 점선 엣지를 도출할 수 없으므로, 각각은 하나의 순위 질의가 되며, 후보 목록은 점수에 따라 정렬되고, 다른 참으로 알려진 답들은 필터링되어 제외되며, 참인 답의 순위가 MRR과 Hits@k에 반영됩니다. 저자가 AI의 도움을 받아 직접 제작한 원본 도해.

정확한 데이터: 18개 트리플, 15/3 분할

이 권의 모든 것은 하나의 고정된 데이터셋 위에서 훈련되며, 이는 examples/neural/kg.py에 단 한 번 정의되어 모든 모델이 이를 임포트합니다. 트리플은 기억에 의존해 다시 타이핑된 것이 아닙니다; 그것들은 1권의 kb.FACTS로부터 계산되므로, 세 권이 하나의 세계를 공유한다는 것이 증명 가능합니다(kg.py 41–50번째 줄):

def _binary_triples() -> list[tuple[str, str, str]]:
"""Every binary fact ``(pred, a, b)`` in ``kb.FACTS`` as an (h, r, t)
triple. Unary facts (``professor(alice)``) become *types*, not triples."""
return [(f[1], f[0], f[2]) for f in FACTS if len(f) == 3]


TRIPLES: list[tuple[str, str, str]] = _binary_triples()

ENTITIES: list[str] = sorted({h for h, _, _ in TRIPLES} | {t for _, _, t in TRIPLES})
RELATIONS: list[str] = sorted({r for _, r, _ in TRIPLES})

두 가지 읽기 노트가 있습니다. 1권은 이항 사실을 (predicate, arg1, arg2)로 저장했으므로, 위 컴프리헨션은 각 사실을 머리-관계-꼬리 형태로 다시 정렬합니다. 그리고 단항 사실들, 즉 professor(alice)와 그 동류는 전혀 트리플이 되지 않습니다: 지식 그래프의 독법에서 그것들은 노드 유형이며, (2권의 개념 단언에서 온) TYPE_OF 딕셔너리에 보관되어 IV부의 그래프 신경망 장들에서 쓰입니다. 파생된 관계 grandAdvisor는 의도적으로 빠져 있습니다: 그것은 advises를 자기 자신과 합성함으로써 함의되는 것이므로, 이를 데이터로 단언하는 것은 도출 가능한 사실을 훈련 집합에 몰래 밀어 넣는 셈이 됩니다. python3 kg.py를 실행하면 목록이 출력되며, 이는 실제로 커밋된 출력입니다:

the academic world as a knowledge graph
entities (13): ['alice', 'bob', 'carol', 'cmu', 'dave', 'erin', 'logic', 'mit', 'ml', 'nesy', 'p1', 'p2', 'p3']
relations (5): ['about', 'advises', 'affiliated', 'authored', 'cites']
triples : 18 (train 15 / test 3)
test : [('bob', 'advises', 'dave'), ('bob', 'authored', 'p1'), ('erin', 'affiliated', 'cmu')]
types : Institution = ['cmu', 'mit'], Paper = ['p1', 'p2', 'p3'], Professor = ['alice', 'bob'], Student = ['carol', 'dave', 'erin'], Topic = ['logic', 'ml', 'nesy']

그러므로 이 그래프는 13개의 개체(교수 2명, 학생 3명, 논문 3편, 기관 2곳, 주제 3개), 5개의 관계, 18개의 엣지를 가지며, 다음과 같이 분포되어 있습니다:

관계훈련 엣지 (15)시험용으로 제외 (3)
advisesalice→bob, bob→carol, carol→erinbob→dave
authoredalice→p1, carol→p2, dave→p3bob→p1
affiliatedalice→mit, bob→mit, carol→cmu, dave→cmuerin→cmu
citesp2→p1, p3→p2
aboutp1→logic, p2→nesy, p3→ml

분할 자체는 표본으로 뽑힌 것이 아니라 그대로 문자 그대로 적혀 있으며, 그 정확성은 모듈이 임포트되는 바로 그 순간 강제됩니다(kg.py 65–74번째 줄):

TEST: list[tuple[str, str, str]] = [
("bob", "advises", "dave"),
("bob", "authored", "p1"),
("erin", "affiliated", "cmu"),
]
TRAIN: list[tuple[str, str, str]] = [t for t in TRIPLES if t not in TEST]

assert len(TRIPLES) == 18 and len(TRAIN) == 15 and len(TEST) == 3
assert {h for h, _, _ in TRAIN} | {t for _, _, t in TRAIN} == set(ENTITIES)
assert {r for _, r, _ in TRAIN} == set(RELATIONS)

마지막 두 assert 줄이 바로 이 분할의 설계 제약이며, 크기 자체보다 더 중요합니다. 두 번째 줄은 13개 개체 전부가 15개 훈련 트리플 어딘가에 여전히 나타난다고 단언하고, 세 번째 줄은 5개 관계 전부에 대해 똑같이 단언합니다. 그 이유는 파일 자체의 주석에 적혀 있습니다: 임베딩 모델은 한 번도 본 적 없는 개체의 순위를 매길 수 없다는 것입니다. 이 권의 모델들은 변환적(transductive)입니다: 알려진 개체마다 하나씩의 벡터(또는 박스, 또는 공)를 학습하므로, 훈련에서 빠진 개체는 훈련되지 않은 임의의 표현을 그대로 유지하게 되고, 그것에 순위를 매기는 것은 잡음을 재는 것과 다름없습니다. 그래서 제외해 둔 트리플 각각은 자신의 개체들과 관계를 다른 훈련 발생 사례와 함께 남겨 둡니다: bob은 여전히 carol의 지도교수이자 mit의 직원이고, dave는 여전히 p3의 저자이자 cmu의 소속이며, authored는 세 개의 훈련 엣지를 그대로 유지합니다. 시험 트리플은 빠진 엣지이지, 결코 빠진 노드가 아닙니다.

필터링된 순위 매김 프로토콜, 유도하기

이제 측정입니다. 하나의 채점된 질의를 고정해 봅시다, 예컨대 꼬리 질의 (bob,advises,?)(\text{bob}, \text{advises}, ?)이며 그 제외해 둔 참인 답은 dave입니다. 모델은 13개의 점수를 내놓으며, 자연스러운 통계량은 참인 답의 순위(rank)입니다: 내림차순 정렬에서 dave의 자리입니다. 두 가지 세부 사항이 소박한 정의를 정직하지 않게 만들며, 이를 고치면 표준 프로토콜이 나옵니다 [2].

세부 사항 하나: 다른 참인 답들. 그래프는 이미 이 질의에 대한 두 번째 참인 꼬리를 알고 있습니다: (bob,advises,carol)(\text{bob}, \text{advises}, \text{carol})은 훈련 트리플입니다. 모델이 잘 학습되어 carol을 1위에, dave를 2위에 놓았다고 해 봅시다. 원 순위(raw rank) 아래에서는 dave의 순위가 2가 됩니다: 모델은 carol에 관해 옳았다는 이유로 한 자리 전체를 벌점 받으며, carol에 관해 덜 알았던 모델이 오히려 dave에서 더 좋은 점수를 받게 되는데, 이는 도착적입니다. 필터링된 순위는 후보 목록에서 다른 참으로 알려진 트리플을 이루는 모든 후보를 제거함으로써 이를 고칩니다: carol은 건너뛰어지고 그 밖의 모든 것은 남으며, dave의 필터링된 순위는 1이 됩니다. 필터링은 결코 질의 자신의 답을 제거하지 않으며, 오직 그 참인 형제들만을 제거합니다. 필터링에 쓰이는 참으로 알려진 집합은 훈련과 시험을 통틀어 18개 트리플 전부이며, KNOWN(kg.py 107번째 줄)에 담겨 있습니다.

세부 사항 둘: 동점. 두 후보가 정확히 같은 점수를 받을 수 있습니다. 이 스위트는 순위를 "엄격하게 더 높은 점수를 받은 후보의 수에 1을 더한 것"으로 정의하므로, 동점은 참인 개체에게 유리하게 셈해집니다. 형식적으로, C(h,r)C(h, r)을 그 질의의 살아남은 후보 집합(참인 답 자체와 필터링된 형제들을 뺀 모든 개체)이라 쓰고, \lvert \cdot \rvert를 어떤 집합의 원소 개수라 쓰면,

rank(th,r)  =  1  +    {eC(h,r)  :  s(h,r,e)>s(h,r,t)}  .\mathrm{rank}(t \mid h, r) \;=\; 1 \;+\; \bigl|\; \lbrace\, e \in C(h, r) \;:\; s(h, r, e) \gt s(h, r, t) \,\rbrace \;\bigr|.

이를 이렇게 읽으십시오: 순위 1(완벽한 답)에서 시작해, 살아남은 경쟁자가 진실을 엄격하게 앞지를 때마다 한 자리씩 잃습니다. 이 구현은 직접적인 그대로의 옮김입니다(kg.py 91–104번째 줄, rank_of의 본문입니다):

known = KNOWN if known is None else known
h, r, t = triple
true_score = score_fn(h, r, t)
rank = 1
for e in ENTITIES:
if corrupt == "tail":
cand = (h, r, e)
else:
cand = (e, r, t)
if cand == triple or (cand in known and cand != triple):
continue
if score_fn(*cand) > true_score:
rank += 1
return rank

continue 줄이 바로 그 필터입니다: 그것은 참인 트리플 자신(진실은 결코 자기 자신과 경쟁하지 않습니다)과 그 밖의 모든 참으로 알려진 후보를 건너뜁니다. 마지막의 if는 동점을 낙관적으로 해소하는 엄격한 비교입니다. 꼬리 대신 머리를 오염시키면(corrupt="head") 후보 (e,r,t)(e, r, t)가 만들어지며, 같은 것을 반대편에서 잽니다.

3개의 시험 트리플 각각은 두 개의 질의를 낳으며(방향마다 하나씩), 그래서 이 스위트는 6개의 순위 질의를 가지고, 각각은 하나의 순위를 냅니다. 두 개의 요약 통계량이 여섯 순위를 압축하며, evaluate에서 계산됩니다(kg.py 110–122번째 줄):

def evaluate(score_fn, test: list[tuple[str, str, str]] | None = None) -> dict:
"""Filtered MRR and Hits@k over head- and tail-corruption of ``test``
(default: the 3 held-out triples, i.e. 6 ranking queries)."""
test = TEST if test is None else test
ranks: list[int] = []
for triple in test:
ranks.append(rank_of(score_fn, triple, "tail"))
ranks.append(rank_of(score_fn, triple, "head"))
mrr = sum(1.0 / r for r in ranks) / len(ranks)
hits = {k: sum(1 for r in ranks if r <= k) / len(ranks) for k in (1, 3, 10)}
return {"ranks": ranks, "mrr": round(mrr, 4),
"hits@1": round(hits[1], 4), "hits@3": round(hits[3], 4),
"hits@10": round(hits[10], 4)}

기호로 쓰면, QQ를 질의들의 집합(여기서는 Q=6\lvert Q \rvert = 6)이라 하고 rankq\mathrm{rank}_q를 질의 qq의 참인 답의 필터링된 순위라 할 때,

MRR  =  1QqQ1rankq,Hits@k  =  1QqQ1[rankqk].\mathrm{MRR} \;=\; \frac{1}{\lvert Q \rvert} \sum_{q \in Q} \frac{1}{\mathrm{rank}_q}, \qquad \mathrm{Hits@}k \;=\; \frac{1}{\lvert Q \rvert} \sum_{q \in Q} \mathbf{1}\bigl[\mathrm{rank}_q \le k\bigr].

둘 다 풀어 읽어 봅시다. 평균 역순위(Mean Reciprocal Rank)는 순위 자체가 아니라 그 역수들을 평균합니다: 순위 1은 11을 기여하고, 순위 2는 0.50.5를, 순위 10은 0.10.1을 기여합니다. 이 역수는 의도적으로 그 지표를 상위권에 무겁게 만듭니다: 답을 순위 2에서 순위 1로 개선하면 0.50.5를 얻지만, 순위 10에서 순위 9로 개선하면 겨우 0.0110.011 정도밖에 얻지 못하므로, MRR은 진실을 꼭대기에 또는 그 근처에 두는 것을 보상하며, 이는 완성 시스템의 사용자가 실제로 체감하는 것과 같습니다. MRR은 00보다 조금 위에서 살고 최대 11이며, 11은 모든 질의가 완벽하게 답해졌다는 뜻입니다. Hits@k는 더 무디게 잽니다: 1[]\mathbf{1}[\cdot]지시함수(indicator function)로, 괄호 안의 조건이 성립하면 11이고 아니면 00이므로, Hits@k는 참인 답이 상위 kk개 안에 든 질의들의 비율입니다. 이 스위트는 k=1,3,10k = 1, 3, 10을 보고하는데, 이는 이 분야의 관례가 된 세 값입니다 [3].

우연은 무엇을 벌어들이는가? 무작위 기준선, 유도하기

어떤 숫자든 그것이 인상적이려면, 아무것도 모르는 점수 매김기가 무엇을 벌어들일지부터 알아야 합니다. 여기서 우리 그래프의 작은 크기는 편리함이기를 멈추고 함정이 됩니다: 13개의 개체만 있을 때, 무작위 추측기는 결코 무시할 만하지 않으며, 우리는 그것이 얼마나 무시할 만하지 않은지를 정확히 계산할 수 있습니다.

아무것도 모르는 점수 매김기를, 각 후보에 연속 분포에서 뽑힌 독립적인 무작위 점수를 배정하는 것으로 모형화해 봅시다. 그러면 어떤 질의의 후보 목록에 대한 모든 정렬 순서가 똑같이 그럴듯해지고 동점의 확률은 0이 됩니다. mm을 그 질의의 필터링된 후보 풀의 크기, 즉 참인 답에 그 살아남은 경쟁자들을 더한 크기라 합시다. 대칭성에 의해, 참인 답의 순위는 위치 1,2,,m1, 2, \ldots, m에 걸쳐 균등하게 분포합니다: 각 위치의 확률은 1/m1/m입니다. 기대 역순위는 두 단계로 따라 나옵니다. 먼저 기댓값(E\mathbb{E}, 확률로 가중된 평균)을 똑같이 그럴듯한 위치 kk에 대한 합으로 쓰고, Pr[]\Pr[\cdot]을 괄호 안의 사건이 일어날 확률이라 쓰면:

E ⁣[1rank]  =  k=1mPr[rank=k]1k  =  k=1m1m1k  =  1mk=1m1k.\mathbb{E}\!\left[\frac{1}{\mathrm{rank}}\right] \;=\; \sum_{k=1}^{m} \Pr[\mathrm{rank} = k]\cdot\frac{1}{k} \;=\; \sum_{k=1}^{m} \frac{1}{m}\cdot\frac{1}{k} \;=\; \frac{1}{m}\sum_{k=1}^{m}\frac{1}{k}.

남은 합은 mm번째 조화수(harmonic number) Hm=1+12+13++1mH_m = 1 + \tfrac12 + \tfrac13 + \cdots + \tfrac1m이므로,

E ⁣[1rank]  =  Hmm,그리고 같은 방식으로Pr[rankk]  =  km(km),\mathbb{E}\!\left[\frac{1}{\mathrm{rank}}\right] \;=\; \frac{H_m}{m}, \qquad\text{그리고 같은 방식으로}\qquad \Pr[\mathrm{rank} \le k] \;=\; \frac{k}{m} \quad (k \le m),

두 번째 등식은, mm개의 똑같이 그럴듯한 위치 가운데 정확히 kk개가 그 조건을 만족하기 때문에 성립합니다. 이제 여섯 개의 질의 각각에 대해 mm을 계산해 봅시다. 그 풀은 참인 답에 살아남은 모든 경쟁자를 더한 것을 담고 있습니다: 13개의 개체에서 필터링된 참으로 알려진 형제들을 뺀 것이므로, m=13m = 13에서 다른 참으로 알려진 답의 수를 뺀 것입니다:

질의필터링된 형제mmE[1/rank]=Hm/m\mathbb{E}[1/\mathrm{rank}] = H_m/mPr[rank10]=10/m\Pr[\mathrm{rank} \le 10] = 10/m
(bob, advises, ?)carol120.25860.8333
(?, advises, dave)130.24460.7692
(bob, authored, ?)130.24460.7692
(?, authored, p1)alice120.25860.8333
(erin, affiliated, ?)130.24460.7692
(?, affiliated, cmu)carol, dave110.27450.9091

네 번째 열을 평균하면, 이 그래프 위에서 순수한 우연의 기대 MRR은 1.5256/6=0.25431.5256 / 6 = 0.2543입니다(이 합은 반올림하지 않은 값들을 더한 것이며, 표에 인쇄된 소수 4자리 값들을 더하면 1.52551.5255가 됩니다). 다섯 번째 열을 평균하면, 기대 Hits@10은 4.8834/6=0.81394.8834/6 = 0.8139이고(반올림된 열의 합은 4.88334.8833입니다), Pr[rank1]=1/m\Pr[\mathrm{rank} \le 1] = 1/m이므로 기대 Hits@1은 0.08140.0814입니다. 이 숫자들을 읽어 보면 "정확도"에 반하는 논거가 저절로 만들어집니다. 아무것도 모르는 점수 매김기조차 이미 전체 시간의 약 81퍼센트에서 진실을 상위 열 안에 안착시키는데, 왜냐하면 13개 개체짜리 풀에서는 상위 열이 대부분을 차지하기 때문입니다; Hits@10은 학습이 시작되기도 전에 거의 포화되며, 우연의 MRR조차 최댓값의 4분의 1입니다. 이 정도로 작은 그래프에서는, 어떤 헤드라인 숫자든 오직 우연의 선 위로 얼마나 떨어져 있는가로서만 의미가 있으며, 이것이 바로 동반 코드가 우연의 선을 0이라고 가정하는 대신 명시적으로 계산하는 이유입니다.

이 스위트의 실제 기준선은 무지의 구체적인 한 번의 뽑기입니다: 모델이 사용할 것과 같은 모양의 임베딩을, 신선한 무작위 생성기에서 뽑아 결코 훈련시키지 않은 채, 같은 evaluate에 통과시킨 것입니다(transe.py 179–186번째 줄):

def random_baseline() -> dict:
"""The "geometry before learning" number: same-shape embeddings from a
fresh rng (seed 1), never trained, run through the same evaluation."""
rng = np.random.default_rng(1)
b = 6.0 / math.sqrt(D)
ent = rng.uniform(-b, b, size=(len(ENTITIES), D))
rel = rng.uniform(-b, b, size=(len(RELATIONS), D))
return kg.evaluate(make_score_fn(ent, rel))

그 커밋된 결과(아래에 인용된 출력의 첫 번째 행)는 순위 [10,10,12,7,10,9][10, 10, 12, 7, 10, 9]에 대해 MRR =0.1062= 0.1062입니다: 여섯 진실 가운데 다섯이 각자의 풀 바닥 근처에 묻혀 있고, 여섯 번째는 중간보다 약간 아래에 있습니다. 이 관측된 0.10620.1062와 유도된 기댓값 0.25430.2543 사이의 정직한 간극에 주목하십시오. 그 간극의 일부는 표본추출 때문입니다: 이 고정된 뽑기는 무작위 기하학의 단 하나의 표본이지 뽑기들에 대한 평균이 아니며, 이 시드는 낮게 떨어졌습니다(그와 대조적으로 이 시드의 Hits@10 값 0.83330.8333은 유도된 0.81390.8139 위에 거의 정확히 놓입니다). 또 다른 일부는 모형 불일치 때문입니다: 무작위 기하학은 위에서 유도한 독립-점수 모형과 정확히 같지 않은데, 왜냐하면 이 기하학의 여섯 순위는 공유된 개체 벡터를 통해 질의들에 걸쳐 상관되어 있고, 거리 기반 점수는 모든 후보를 대칭적으로 다루지 않기 때문입니다(예컨대 질의 자신의 개체와 같은 후보는, 관련 없는 개체보다 체계적으로 질의 점에 더 가까이 놓입니다). 두 숫자 모두 같은 이야기를 들려줍니다: 우연은 이미 눈에 보이는 점수를 벌어들이며, 오직 그 위의 여백만이 학습의 증거입니다.

첫 번째 훈련 결과

다음 장은 존재하는 가장 단순한 임베딩 모델을 세우고 유도합니다; 이 장은 오직 그 채점판만을 빌려 옵니다. python3 transe.py의 커밋된 출력은, 그 모델을 15개의 훈련 트리플 위에서 1000 에포크 동안 훈련한 뒤, 비교의 두 행 전부와 질의별 여섯 순위 전부를 보고합니다:

filtered ranking over 6 queries (3 test triples × tail/head)
model MRR H@1 H@3 H@10 ranks
random (seed 1) 0.1062 0.0000 0.0000 0.8333 [10, 10, 12, 7, 10, 9]
TransE trained 0.7778 0.6667 1.0000 1.0000 [3, 3, 1, 1, 1, 1]
per query (filtered rank, random → trained):
(bob, advises, ?dave) 10 → 3
(?bob, advises, dave) 10 → 3
(bob, authored, ?p1) 12 → 1
(?bob, authored, p1) 7 → 1
(erin, affiliated, ?cmu) 10 → 1
(?erin, affiliated, cmu) 9 → 1

훈련된 MRR을 그 순위들로부터 손으로 따라가 보겠습니다, evaluate가 계산하는 그대로입니다: 순위 [3,3,1,1,1,1][3, 3, 1, 1, 1, 1]은 역수 13+13+1+1+1+1=1434.6667\tfrac13 + \tfrac13 + 1 + 1 + 1 + 1 = \tfrac{14}{3} \approx 4.6667을 주고, 이를 6개의 질의로 나누면 0.77780.7778이 나옵니다. Hits@1은 4/6=0.66674/6 = 0.6667이고, Hits@3과 Hits@10은 어떤 순위도 3을 넘지 않으므로 6/6=1.06/6 = 1.0입니다. 그래프에 빠져 있던 모든 사실이 이제 그 후보 목록의 상위 세 자리 안에 들어 있으며, 이는 세 시험 트리플 중 어느 것도 한 번도 본 적 없는 모델에서 나온 것입니다.

같은 출력은 필터가 실제 데이터 위에서 작동하는 모습도 보여 줍니다. 다음은 질의 (bob,advises,?)(\text{bob}, \text{advises}, ?)에 대한 커밋된 순위표이며, 모든 개체가 꼬리로 점수 매겨져 있습니다:

rank tail score
1 carol -0.3681 * gold (train), filtered rank 1
2 bob -0.4794
3 erin -0.7101
4 dave -0.7409 * gold (test), filtered rank 3
5 alice -0.8321

모델의 최선의 꼬리는 carol이며, 이는 올바릅니다: 훈련 데이터 안에서 bob은 실제로 carol을 지도합니다. 원(raw) 프로토콜 아래에서는 carol의 존재가 제외해 둔 답 dave를 순위 3에서 순위 4로 밀어내어, 모델 자신이 옳게 알고 있는 지식에 대해 벌점을 매기게 됩니다. 필터링된 프로토콜은 dave의 순위를 매길 때 carol을 건너뛰고(그리고 carol의 순위를 매길 때는 dave를 건너뛰어), 그래서 이 표는 dave가 원 정렬에서는 네 번째에 앉아 있는데도 그의 필터링된 순위를 3으로 보고합니다. 그 출력 한 줄이 바로 실제 숫자로 실행된, 필터링에 대한 논거 전체입니다 [2].

축하는 가볍게 받아들이십시오. 두 개의 "순위 3" 항목이 흥미로운 잔여물입니다: 모델은 dave를 수면 위로 끌어올렸지만 그를 1위에 두지는 못했으며, 이동 기반 기하학이 하나의 관계 벡터로 alice→bob, bob→carol, bob→dave, carol→erin을 한꺼번에 실어 나르는 데 애를 먹는지가 다음 장의 주제입니다. 이 예고편의 요점은 더 좁습니다: 지표가 0.10620.1062에서 0.77780.7778로 옮겨 갔고, 그 두 숫자 사이의 모든 것이 학습이며, 이는 모델이 존재하기도 전에 고정된 프로토콜로 측정된 것입니다.

방법론의 정직함: 누출, 동점, 그리고 규모

순위 매김 프로토콜은 만들기 쉽고, 망가뜨리기는 더 쉽습니다. 이 프로토콜이 보고하는 어떤 숫자든 신뢰하기 전에 이름 붙여 둘 만한 세 가지 실패 양상이 있습니다.

훈련으로의 누출. 이 평가가 일반화를 재는 것은 오직 시험 트리플이 훈련에 어떤 식으로도 영향을 주지 않을 때뿐입니다. 명백한 규칙은 그것들이 양성 예제로 등장해서는 안 된다는 것이며, TRAIN은 구성상 그것들을 제외합니다. 더 미묘한 규칙은 음성 샘플링(negative sampling)에 관한 것입니다. 임베딩 모델은 참인 트리플을 오염된 트리플과 대조함으로써 훈련되며, 오염을 만들어 내는 샘플러는 참으로 알려진 트리플 목록을 반드시 참조해야 참인 사실을 음성 예시로 제시하는 일이 결코 없게 됩니다. 이 스위트의 샘플러는 정확히 이렇게 합니다(transe.py 119–125번째 줄, KNOWN_IDS는 51–52번째 줄에서 18개 트리플 전부로부터 만들어집니다):

h, r, t = pos
side = int(rng.integers(2)) # 0 = corrupt the head, 1 = corrupt the tail
while True:
e = int(rng.integers(len(ENTITIES)))
cand = (e, r, t) if side == 0 else (h, r, e)
if cand not in KNOWN_IDS:
return cand

KNOWN_IDS에 숨어 있는 설계상의 선택은, 그 진실 검사가 시험 트리플까지도 포괄한다는 것입니다. 만약 이것이 훈련 집합만을 포괄했다면, (bob,advises,carol)(\text{bob}, \text{advises}, \text{carol})의 오염이 (bob,advises,dave)(\text{bob}, \text{advises}, \text{dave}), 즉 바로 우리가 제외해 둔 그 사실을 만들어 낼 수 있었을 것이고, 모델은 자신의 시험 답을 낮게 점수 매기도록 명시적으로 훈련되었을 것입니다. 제외해 둔 사실은 훈련 신호의 양쪽 모두에서 부재해야 합니다: 결코 양성이어서도 안 되고(그것은 암기가 될 것입니다) 결코 음성이어서도 안 됩니다(그것은 측정을 파괴할 것입니다). 오염이 시험 트리플과 충돌할 확률이 사라질 만큼 드문 벤치마크 규모에서는, 구현이 흔히 훈련 데이터에 대해서만 검사합니다; 13개 개체 위에서는 충돌 확률이 무시하기에는 너무나 큽니다.

데이터 자체를 통한 누출. 분할은 어떤 모델이 실행되기도 전에 오염될 수 있습니다. 고전적인 사례는 관계 집합이 거의 서로의 역인 것들을 포함하는 벤치마크입니다: 훈련 집합이 (a,r,b)(a, r, b)라고 말하고 시험 집합이 (b,r1,a)(b, r^{-1}, a)에 관해 묻는다면, 사소한 규칙 하나가 아무것도 학습하지 않고도 그 시험에 답합니다. 정확히 이 결함이 원래의 FB15k와 WN18 벤치마크에서 발견되었으며, 거기서는 역관계 쌍들이 단순한 암기기가 최고 수준의 숫자를 내놓게 해 주었습니다; 수선된 FB15k-237은 바로 그 감사 때문에 존재하며 [4], WN18RR은 나중에 WordNet을 위해 같은 방식으로 만들어졌습니다 [3]. 우리의 그래프는 그 특정한 함정을 피해 갑니다(5개 관계 가운데 어느 것도 다른 것의 역이 아니며, 파생된 grandAdvisor는 제외되어 있습니다), 그러나 그 교훈은 일반화됩니다: 이 평가는 모델만큼이나 분할 자체를 재고 있습니다.

동점과 프로토콜 표류. 엄격한 부등식에 기반한 순위는 동점을 진실에 유리하게 셈하는데, 이는 연속적인 점수에 대해서는 무해하지만 퇴화된 극한에서는 악용될 수 있습니다: 모든 트리플에 대해 똑같은 상수를 돌려주는 점수 매김기는 엄격하게 더 높은 경쟁자를 전혀 갖지 않으므로, 모든 순위가 1이 되고 그 MRR은 완벽한 1.01.0이 됩니다. 실제 평가들은 무작위화된 또는 기댓값 기반의 동점 해소로 이를 막아 냅니다; 우리 스위트는 자신의 점수가 무작위로 초기화된 실수 벡터들의 연속 함수라는 데 의존하며, 그런 경우 정확한 동점의 확률은 0입니다. 더 넓게 보면, 훈련 프로토콜 자체(양성마다 음성을 몇 개 쓰는지, 어떤 손실 함수를 쓰는지, 예산을 얼마나 오래 주는지, 하이퍼파라미터 탐색을 얼마나 넓게 하는지)는 보고되는 숫자를 모델링 혁신 전체에 필적하는 여백만큼 옮겨 놓습니다: 정확히 이런 선택들을 동등하게 맞춘 재평가는 몇 해나 오래된 모델들이 훨씬 더 새로운 것들과 맞먹는다는 것을 발견했습니다 [5].

규모. 마지막으로, 이 권의 모든 숫자를 지배하는 단서입니다: 6개의 질의는 하나의 벤치마크가 아니라 하나의 시연입니다. 이렇게 질의가 적을 때는, 순위 하나가 3에서 1로 뒤집히는 것만으로도 MRR이 0.110.11만큼 움직입니다; 진술할 가치가 있는 신뢰구간은 여섯 개짜리 표본 안에는 들어맞지 않습니다. 이 분야의 잣대는 FB15k-237(개체 14,541개, 관계 237개, 시험 트리플 약 2만 개)과 WN18RR(WordNet 개체 약 4만 1천 개)이며 [3], 거기서는 같은 프로토콜이 수만 개의 질의에 걸쳐 실행되고 MRR 한 점이 의미를 가집니다 [4], [5]. 우리의 그래프는 그 벤치마크들이 살 수 없는 무언가를 사 줍니다: 이 권의 모든 순위는 이름 붙은 개체까지 추적될 수 있고, 우리가 완전히 이해하는 온톨로지에 맞서 손으로 검증될 수 있습니다. 그 거래는 통계적 검정력을 투명성과 맞바꾼 것이며, 눈을 뜬 채로 이루어진 것입니다.

아직 풀리지 않은 부분

이 프로토콜은 진실이 어디에 순위 매겨지는지를 잽니다; 그것은 점수가 무엇을 뜻하는지를 말해 주지 않으며, 말해 줄 수도 없습니다. 다음 장의 훈련된 모델이 (bob,advises,dave)(\text{bob}, \text{advises}, \text{dave})에 점수 0.7409-0.7409를 배정할 때, 그 숫자는 아무런 진리 조건도, 아무런 확률도, 감사관이 재현해 볼 수 있는 아무런 도출 과정도 지니지 않으며, 우리가 마침 물어보았던 여섯 개의 질의를 넘어서까지 이어진다는 아무런 보장도 지니지 않습니다. 2권의 평결 장은 모든 주장에 대해 하나의 증명을 가리켜 보일 수 있었습니다; 이 권의 첫 채점판은 정렬된 목록 하나 말고는 아무것도 가리켜 보일 수 없습니다. 이 지표 자체에 내장된 맹점도 있습니다: MRR은 참으로 알려진 답들이 높은 순위를 받는지 검사하지만, 그 정렬이 온톨로지가 아는 것을 존중하는지는 결코 검사하지 않습니다. 모델은 주제 logic을 bob의 그럴듯한 지도 학생으로 순위 매길 수 있는데, 이는 2권의 TBox 아래에서는 터무니없는 일이지만, dave가 더 높은 순위에 있는 한 아무런 지표상의 벌점도 받지 않습니다. 기하학이 엣지를 그저 회상하는 것을 넘어 스키마를 존중하도록 만들어질 수 있는지는 II부와 III부가 잡아당기는 열린 실마리이며, 여기서의 정직한 고백은 우리가 방금 만든 이 잣대가 그것을 전혀 재지 못한다는 것입니다.

왜 중요한가

앞으로 이어질 장들의 모든 링크 예측 모델은, I부의 이동과 쌍선형 형식부터 IV부의 관계형 그래프 신경망에 이르기까지, 여기서 정의된 숫자들로, 같은 6개의 질의 위에서, 같은 우연의 선에 맞서 판정될 것입니다; 후보에 점수를 매기고 진실이 어디에 떨어지는지를 재는 순위 매김의 습관 그 자체는 II부와 III부의 소속 및 포섭 검증으로 이어집니다. 첫 모델보다 앞서 프로토콜을 고정하는 것은 현학이 아닙니다; 그것은 이 권의 비교들이 무언가를 뜻하게 만드는 일이며, 이 분야 스스로가 유출된 벤치마크와 표류하는 프로토콜을 거쳐 평가의 규율이 모델링의 통찰만큼이나 중요하다는 것을 배운 방식을 그대로 비춥니다 [4], [5]. 이 시리즈의 신경-기호적 궤적에서, 이 장은 두 전통이 갈라져 결국 다시 이어져야만 하는 바로 그 지점을 표시합니다: 2권은 증명이 있는 곳에서는 답을 주었고 그 밖의 모든 곳에서는 기권했습니다; 이 장은 모든 곳에서 답을 주지만 그 어디에도 증명은 없습니다. 4권의 미분 가능한 질의 응답과 5권의 건전성 검증은, 근본적으로, 추측하는 능력을 포기하지 않으면서 여기서 대가로 치른 보장들을 되사 오려는 시도입니다. 그 화해를 제대로 음미하려면 먼저 이 거래가 적나라하게 이루어지는 것을 보아야 하며, 그것이 바로 15/3 분할이 하는 일입니다.

핵심 용어

  • 지식 그래프(Knowledge graph) — 방향이 있고 이름이 붙은 엣지로 연결된 개체들입니다; 각 엣지는 머리, 관계, 꼬리로 이루어진 트리플 (h,r,t)(h, r, t)입니다.
  • 링크 예측(Link prediction, 지식 그래프 완성) — 학습된 점수에 따라 질의 (h,r,?)(h, r, ?) 또는 (?,r,t)(?, r, t)에 대한 모든 후보 개체에 순위를 매겨, 빠진 엣지를 드러내는 것입니다.
  • 점수 함수(Score function s(h,r,t)s(h, r, t)) — 후보 트리플에서 실수로 가는 임의의 사상으로, 값이 클수록 더 그럴듯하다는 뜻입니다; 이 권의 모든 링크 예측 모델은 ss를 고르는 선택입니다.
  • 오염(Corruption) — 트리플의 머리나 꼬리를 다른 개체로 바꾸어 치환하여, 평가용 후보나 훈련용 음성 예시를 만드는 것입니다.
  • 원 순위 대 필터링된 순위(Raw vs filtered rank) — 모든 후보 사이에서 진실의 자리와, 다른 참으로 알려진 답들이 제거된 뒤의 그 자리입니다; 필터링은 모델이 자신의 올바른 지식 때문에 벌점 받는 일을 막아 줍니다.
  • MRR (평균 역순위, Mean Reciprocal Rank) — 모든 질의에 걸친 1/rank1/\mathrm{rank}의 평균입니다; 설계상 상위권에 무게가 실려 있으며, 1.01.0이 완벽한 값입니다.
  • Hits@k — 참인 답이 상위 kk개 안에 순위 매겨진 질의들의 비율입니다; k=1,3,10k = 1, 3, 10에서 보고됩니다.
  • 우연의 선(Chance line) — 아무것도 모르는 점수 매김기의 기대 지표입니다; mm개의 후보 풀 위에서 기대 역순위는 Hm/mH_m/m이며 HmH_mmm번째 조화수이고, 여기서는 약 0.25430.2543의 MRR입니다.
  • 변환적 분할(Transductive split) — 개체별 임베딩 모델이 한 번도 본 적 없는 것을 나타낼 수 없기 때문에, 모든 개체와 관계가 여전히 훈련에 나타나는 분할입니다.
  • 누출(Leakage) — 시험 정보가 훈련에 도달하는 모든 경로입니다: 양성으로서의 시험 트리플, 표본 추출된 음성으로서의 시험 트리플, 또는 역관계 같은 구조적 실마리입니다.

이 장이 이끄는 곳

채점판은 존재합니다; 선수는 아직 존재하지 않습니다. 의도적으로 열어 둔 간극은 바로 점수 함수 자체입니다: 오직 관측된 15개의 엣지만을 사용해서, 어떤 기하학이 s(bob,advises,dave)s(\text{bob}, \text{advises}, \text{dave})는 크게 만들면서 s(bob,advises,logic)s(\text{bob}, \text{advises}, \text{logic})는 작게 유지할 수 있을까요? 다음 장인 이동 모델은 가능한 가장 단순한 답에 전념합니다: 모든 개체는 R16\mathbb{R}^{16} 안의 한 점이 되고, 모든 관계는 하나의 이동 벡터(translation vector)가 되며, eh+wr\mathbf{e}_h + \mathbf{w}_ret\mathbf{e}_t 가까이에 떨어질 때 트리플이 그럴듯해지므로, s(h,r,t)=eh+wrets(h, r, t) = -\lVert \mathbf{e}_h + \mathbf{w}_r - \mathbf{e}_t \rVert가 되고, 여기서 \lVert \cdot \rVert는 잔차 벡터의 유클리드 길이입니다(다음 장에서 완전히 유도합니다). 그 마진 손실(margin loss)과 손으로 계산한 그래디언트를 유도하고, 공유된 하나의 advises 벡터가 네 개의 서로 다른 지도 엣지를 한꺼번에 실어 나르려고 애쓰는 모습을 지켜보는 것, 그것이 바로 위에서 인용한 순위 [3,3,1,1,1,1][3, 3, 1, 1, 1, 1]이 실제로 나오는 곳입니다.


동반 코드: examples/neural/kg.py는 이 권의 모든 모델이 사용하는 트리플, 분할, 필터링된 순위 평가를 정의합니다; examples/neural/transe.py는 여기서 인용된 기준선 숫자와 훈련된 숫자를 만들어 냈습니다. 이 장의 모든 숫자를 재현하려면 examples/neural/에서 python3 kg.pypython3 transe.py를 실행하십시오.