베타·확률 임베딩: 밀도로 사는 부정
📍 현재 위치: II부 · 영역과 기하 임베딩 — 6장. 박스 임베딩은 직사각형을 교집합하여 논리곱을 정확하게 만들었습니다. 이 장은 딱딱한 경계를 가진 어떤 영역 계열도 살아남지 못한 단 하나의 연결사, 곧 부정을 요구하고, 경계 자체를 확률 밀도로 녹여 냄으로써 그 답을 찾습니다.
지난 두 장은 도형에 관한 연구였습니다. 공(ball)은 개념에게 내부를 주었지만 논리곱 하나를 담지 못했고, 박스는 직사각형끼리 겹치면 다시 직사각형이 되기에 논리곱을 고쳤습니다. 두 승리는 하나의 조용한 가정을 공유합니다: "질의에 속한다"는 것이 경계 안에 있느냐 없느냐의 예/아니오 문제라는 가정입니다. 질의가 아니다(not)라고 말하는 순간 그 가정은 무너집니다. bob에게 지도받지 않는 사람들의 집합은 어떤 영역의 바깥 전부인데, "바깥 전부"는 우리의 어느 계열에도 들어 있지 않은 모양입니다. 이 장은 BetaE [1]가 도입한 수리법을 따라갑니다: 경계 그리기를 아예 멈추고, 모든 개체와 모든 질의를 단위 구간 위의 확률 밀도인 베타 분포(Beta distribution)들의 작은 벡터로 표현하는 것입니다. 이 표현에서 교집합은 지수가 더해지는 밀도들의 곱이 되고, 부정은 닫힌 형식의 매개변수 사상 (화살표 는 "…로 보내진다"라고 읽습니다)이 되며, 이를 두 번 적용하면 원래 매개변수가 정확히 되돌아옵니다. 우리는 밀도를 영에서부터 세우고, 적합도를 재는 닫힌 형식의 쿨백–라이블러 발산을(그것이 필요로 하는, 동반 파일에 밑바닥부터 구현된 디감마 함수까지 포함하여) 유도하고, 학계 그래프 위에서 손으로 쓴 그래디언트로 모델을 훈련한 다음, 이 장 전체가 존재하는 이유인 질의를 실행할 것입니다: cmu에 소속되어 있고 bob에게 지도받지 않는 사람. 그 기호적 답은 erin이고, 학습된 답 역시 erin입니다.
학과의 모든 사람이 지도 위의 핀이 아니라 한 줄의 사진 필름으로 묘사된다고 상상해 보십시오: 몇 개의 프레임이 있고, 각 프레임은 완전한 어둠과 완전한 밝음 사이 어딘가에서 그 사람이 어떤 잠재 특성을 얼마나 강하게 드러내는지를 기록합니다. 질의는 자기만의 기준 필름을 현상하고, 개체의 필름이 그 기준과 가깝게 일치할 때 그 개체는 질의에 답합니다. 이제 마법이 나옵니다: NOT은 사진의 음화(negative)입니다. 모든 프레임을 뒤집어 밝음이 어둠이 되고 어둠이 밝음이 되면, "일치하지 않는 모든 사람"의 기준 필름을 얻습니다. 음화의 음화를 다시 뜨면 입자 하나까지 똑같은 원본 인화를 손에 쥐게 됩니다. 박스와 공에는 음화가 없습니다: 직사각형의 "바깥"은 직사각형이 아닙니다. 필름에는 있습니다. 이것이 이 장이 선명한 영역을 등급이 매겨진 밀도와 맞바꾸는 이유의 전부입니다.
이 장에서 다루는 내용
- 닫힘의 실패로서의 부정: 박스나 공의 여집합은 유계가 아니며 계열 바깥에 있고, 이는 이미 1차원에서 그렇습니다; 이 사실이 어떤 질의 부류를 잠가 버리는지(EPFO, 곧 실존 긍정 1차(existential positive first-order) 조각 대 부정을 포함한 실존 1차)를 다룹니다.
- 영에서부터 세우는 베타 분포: 단위 구간 위의 밀도, 두 형상 매개변수 와 가 각각 하는 일, 표 하나에 담은 다섯 가지 모양 영역, 각 객체가 왜 개의 독립 베타로 이루어진 벡터를 지니는지, 그리고 경사 하강 아래에서 두 매개변수를 모두 양수로 유지하는 매개변수화를 다룹니다.
- 닫힌 형식의 KL 발산: 두 베타 벡터 사이의 정확한 공식을 모든 항을 유도하고(기댓값 포함) 이름 붙이며, 밑바닥부터 만든 디감마도 다룹니다: 점화식 와 점근 급수를
beta.py에서 그대로 인용하고, 커밋된 자기 검증을 함께 봅니다. - 두 개의 정직한 층으로 말하는 연산자 대수: BetaE의 매개변수 수준 연산자들(지수가 더해지는 밀도 곱으로서의 교집합, 정확히 스스로를 되돌림이 증명되는 대합 로서의 부정)과, 동반 코드가 실제로 실행하는 점수 수준 합성, 그리고 그 이유를 설명하는 코드 주석을 다룹니다.
- 수동 그래디언트로 하는 훈련: 로그 매개변수 위의 관계별 아핀 변환, 마진 손실 , 디감마 상쇄를 거쳐 하나하나 유도한 각 편미분, 그리고 커밋된 손실 추이와 필터링된 평균 역순위(Mean Reciprocal Rank, MRR)를 다룹니다.
- 중심 질의를 처음부터 끝까지: affiliated⁻(cmu) ⊓ ¬advises(bob): 폐쇄 세계의 기호적 정답, erin이 0.5864로 1위인 커밋된 top-3 표, 그리고 dave의 근소한 2위에 대한 정직한 읽기(그의 advises 엣지는 홀드아웃되어 있고, 일반화는 양날의 검입니다)를 다룹니다.
- 확률이 사 준 것과 치른 값: 등급이 매겨진 소속과 닫힌 형식의 부정을 얻었지만 보정 보장은 없습니다: 이 수치들은 학습된 점수이지 사후 확률이 아니며, 이 빚은 5권이 받아 낼 것입니다.
부정은 닫힘의 실패다
II부는 한 단어로 계속 되돌아옵니다: 닫힘(closure)입니다. 영역들의 계열은 어떤 연산을 계열의 원소에 적용한 결과가 다시 계열의 원소일 때 그 연산에 대해 닫혀 있다고 합니다. 5장이 박스를 고른 것은 정확히 박스가 교집합, 곧 그리고(and)의 기하에 대해 닫혀 있기 때문이었습니다. 부정은 다른 연산인 여집합(complement)에 대한 닫힘을 요구합니다: 질의 의 영역이 주어졌을 때, 에 답하지 않는 모든 것의 집합인 의 영역을 만들어 내라는 것입니다.
우리가 만난 어떤 계열도 이를 견뎌 내지 못하며, 그 실패는 이미 1차원에서 눈에 보입니다. 1차원 박스는 닫힌 구간 , 즉 를 만족하는 점 들의 집합입니다. 실직선 안에서 그 여집합은 차집합(set difference) ( 기호는 "집합으로서 빼기"라고 읽습니다: 에 속하되 구간에는 속하지 않는 모든 것)이고, 이를 풀어 쓰면 합집합(union) 기호 로 이어진 두 조각으로 갈라집니다:
서로 떨어진 두 개의 무한 반직선입니다. 구간은 연결된 유계의 한 조각인데, 여집합은 연결이 끊긴 무계의 두 조각이므로, 어떤 과 를 골라도 가 그것과 같아질 수 없습니다. 차원 박스는 개 구간의 곱이므로 단 하나의 좌표에서의 실패만으로도 이미 침몰하며, (개의 좌표를 가진 실수 벡터들의 공간) 안에서 유계 박스의 여집합은 직사각형 구멍이 뚫린 무계 영역이고, 그런 박스는 없습니다. 공도 같은 방식으로 실패합니다: 공의 여집합은 구면 바깥의 모든 것, 즉 무계이고 공이 아닙니다. 이 계열은 여집합에 대해 전혀 닫혀 있지 않으며, 우리의 관계 연산자들이 아는 유일한 움직임인 평행 이동과 확장을 아무리 반복해도 계열 바깥에는 닿을 수 없습니다.
이 닫힘의 실패는 질의 언어에서 정확한 대가를 치릅니다. Query2Box가 답하는 질의들은 EPFO, 곧 existential positive first-order(실존 긍정 1차) 조각에 속합니다: 존재 한정사(, "어떤 것이 존재한다"), 논리곱(, "그리고"), 논리합(, "또는")으로 지어지며, 긍정(positive)이라는 단어가 부정을 배제하는 조각입니다 [2]. 부정을 더하면 엄격하게 더 큰 조각이 생기고, 지극히 자연스러운 질문들이 오직 그곳에만 삽니다. 우리의 학계 세계는 이미 하나를 던지고 있습니다: cmu에 소속되어 있고 bob에게 지도받지 않는 사람은 누구인가? 긍정 부분은 박스에 친화적인 교집합이지만, 않는(NOT)은 그렇지 않습니다.
탈출로는 둘입니다. 첫째는 날카로운 경계를 유지하되 계열이 여집합에 닫힐 때까지 모양을 바꾸는 길입니다; ConE는 각도 좌표 위의 부채꼴 원뿔로 이를 해내는데, 부채꼴의 여집합은 다시 부채꼴이기 때문입니다 [3]. 둘째, 이 장의 길은 날카로운 경계를 아예 버립니다. 질의가 집합이 아니라 확률 밀도라면 소속은 등급이 매겨지고, 부정은 높은 밀도를 낮은 밀도로, 또 그 반대로 뒤집기만 하면 되는데, 이는 밀도가 정확하게 지원할 수 있는 연산입니다 [1]. 이 발상의 사촌은 평범한 수치 점수를 그대로 두고 퍼지 논리(fuzzy logic) 연결사로 합성합니다 [4]; 동반 코드가 합성에 바로 그 방식을 쓰기 때문에 이 아이디어는 장의 끝에서 다시 만납니다. 먼저, 밀도부터 봅시다.
베타 분포, 영에서부터 해독하기
베타 분포는 단위 구간 , 곧 0에서 1까지의 실수 구간 위의 확률 밀도입니다. 이 분포는 와 (알파와 베타)라고 쓰는 두 개의 양수 형상 매개변수(shape parameter)를 가지며, 구간의 점 에서의 밀도는
먼저 분자를 읽으십시오: 두 거듭제곱 함수의 곱, 곧 지수 로 거듭제곱한 와 지수 로 거듭제곱한 입니다. 분모 는 베타 함수(Beta function)로, 곡선 아래 전체 넓이가 정확히 1이 되도록 고른 상수(에 의존하지 않습니다)이며, 바로 이것이 를 확률 밀도로 만듭니다. 베타 함수는 분자의 적분으로 정의되고, 팩토리얼의 매끄러운 확장인 감마 함수(Gamma function) (정수 에 대해 , 곧 곱 )를 통해 닫힌 형식으로 계산됩니다:
밀도의 모양에 관한 모든 것은 각 지수가 양수인지 음수인지, 다시 말해 각 매개변수가 1보다 위에 있는지 아래에 있는지가 결정합니다. 구간의 양 끝을 보십시오. 근처에서는 인수 이 지배합니다: 이면 지수가 양수이므로 밀도는 0에서 사라지고(질량이 0에서 밀려납니다), 이면 지수가 음수이므로 밀도는 0에서 발산합니다(질량이 0에 쌓입니다). 매개변수 는 인수 을 통해 에서 거울상의 역할을 합니다. 평균은 이므로 는 1에, 는 0에 투표하고, 합 는 집중도로 작동합니다: 이 값이 클수록 밀도는 평균을 더 촘촘히 감쌉니다. 다섯 가지 영역이 모든 일반적 모양을 포괄합니다(정확히 한 매개변수가 1인 경계 사례에서는 밀도가 단조이며 매개변수가 1인 쪽 끝점에서 유한합니다):
| 밀도의 모양 | 믿음으로 읽기 | ||
|---|---|---|---|
| 1 초과 | 1 초과 | 내부에 봉우리 하나 | 확신에 찬, 등급이 있는 "얼마나" |
| 1 초과 | 1 미만 | 질량이 에 쌓임 | 강하게 안 |
| 1 미만 | 1 초과 | 질량이 에 쌓임 | 강하게 밖 |
| 1 미만 | 1 미만 | U자형 그릇, 양 끝에 질량 | 양극화: 극단이지 중간이 아님 |
| 평평(균등 밀도) | 완전한 무지 |
하나의 구간 위 하나의 밀도로 13개 개체를 구별하기는 턱없이 거칠어서, BetaE는 모든 객체에 그 벡터를 줍니다 [1]. 동반 모듈에서 각 개체와 각 질의는 잠재 차원마다 하나씩, 개의 독립 베타 분포입니다(beta.py 32행이 K = 4를 설정합니다). 독립이라는 것은 4차원 단위 정육면체 위의 결합 밀도가 차원별 밀도들의 곱이라는 뜻이고, 앞으로 반복해서 쓰겠지만, 그런 곱들 사이의 발산은 차원별 발산의 합입니다.
하나의 공학적 제약이 구현 전체의 모양을 정합니다: 두 매개변수는 엄격히 양수로 유지되어야 하는데, 평범한 그래디언트 스텝은 양수성 제약을 존중하지 않습니다. 표준적인 해결책은 로그를 저장하는 것입니다. 각 개체는 를 담은 의 벡터이고, 실제 매개변수는 임의의 실수를 양수로 보내는 지수 함수로 복원됩니다(beta.py 128–130행):
def params_of(logp: np.ndarray) -> tuple[np.ndarray, np.ndarray]:
"""Split log-parameters into (α, β) = (exp of first K, exp of last K)."""
return np.exp(logp[:K]), np.exp(logp[K:])
그러면 경사 하강법(gradient descent)은 안에서 자유롭게 움직이고, 분포 매개변수는 구성상 항상 합법으로 남습니다. 이 로그 공간 그림을 기억해 두십시오; 곧 부정을 한 글자짜리 연산으로 만들어 줄 것입니다.
발산으로서의 적합도: 두 베타 사이의 KL, 닫힌 형식으로
영역 모델은 "개체 가 질의 에 답하는가?"를 포함 여부 검사로 물었습니다. 밀도 모델은 대신 "개체의 밀도가 질의의 밀도에서 얼마나 먼가?"를 물으며, 확률 밀도 사이의 표준적인 비대칭 거리가 쿨백–라이블러 발산(Kullback–Leibler divergence, KL)입니다. 같은 공간 위의 밀도 과 에 대해 이는 두 밀도의 로그 비를 아래에서 취한 평균입니다:
여기서 은 를 에서 뽑았을 때의 기댓값(확률 가중 평균)을 뜻하고, 은 자연로그입니다. 두 밀도가 일치할 때 정확히 0이고, 멀어질수록 커집니다. 두 베타에 대해 이 적분은 닫힌 형식을 가지며, 그것을 유도하는 일은 적분을 미분하는 즐거운 연습입니다. 정의에 을 취해 로그 밀도를 쓰면:
매개변수 버전에서 버전을 빼면 지수들의 차 안에서 ""들이 상쇄되고, 아래에서 기댓값을 취하면
남은 것은 두 개의 기댓값인데, 둘 다 하나의 요령에서 나옵니다: 베타 함수를 적분 기호 아래에서 미분하는 것입니다. (지수에 대한 지수 함수의 미분은 밑의 로그를 끌어내립니다)이므로,
피적분 함수를 로 나눈 것이 정확히 밀도이기 때문입니다. 따라서 입니다. 이제 를 쓰고, 의 도함수에 이름을 줍시다: 디감마 함수(digamma function) (프사이)입니다. 항별로 미분하면,
둘째는 에 대한 대칭 논증에서 나옵니다. 둘을 대입하고 두 개의 항을 하나로 모으면:
조각들에 이름을 붙입시다: 두 개의 항은 두 밀도의 정규화 상수를 비교하고, 세 개의 항은 기대 충분 통계량 와 를 대응하는 매개변수 사이의 간격으로 가중한 것입니다. 이 상자 안의 공식을 개의 독립 성분에 걸쳐 합한 것이 kl_beta 그대로입니다(beta.py 86–97행):
def kl_beta(a1, b1, a2, b2) -> float:
"""Σ_i KL(Beta(a1ᵢ, b1ᵢ) ‖ Beta(a2ᵢ, b2ᵢ)) with the standard closed form
KL = ln B(a2,b2) − ln B(a1,b1) + (a1−a2)ψ(a1) + (b1−b2)ψ(b1)
+ (a2−a1+b2−b1)ψ(a1+b1)."""
total = 0.0
for i in range(K):
s1 = a1[i] + b1[i]
total += (_ln_beta(a2[i], b2[i]) - _ln_beta(a1[i], b1[i])
+ (a1[i] - a2[i]) * digamma(a1[i])
+ (b1[i] - b2[i]) * digamma(b1[i])
+ (a2[i] - a1[i] + b2[i] - b1[i]) * digamma(s1))
return total
항들은 _ln_beta(beta.py 79–81행)에서 오는데, 이는 표준 라이브러리의 math.lgamma를 통한 그 자체입니다. 그러나 디감마는 표준 라이브러리가 제공하지 않고, 이 모듈은 그것 때문에 SciPy를 불러오기를 거부합니다. 대신 두 개의 고전적 사실로 를 세웁니다. 첫째, 점화식(recurrence)입니다: 감마 함수의 정의 성질 에 로그를 취해 를 얻고, 양변을 미분하면
둘째, 인수가 커지면 매우 정확해지는 점근 급수(asymptotic series)입니다: . 구현은 작은 인수를 점화식으로 6을 넘을 때까지 위로 걸어 올리며 빼 준 항들을 누적한 다음 급수를 적용합니다(beta.py 54–64행):
def digamma(x: float) -> float:
"""ψ(x) = d/dx ln Γ(x). Push x above 6 with the recurrence
ψ(x+1) = ψ(x) + 1/x, then use the asymptotic series
ψ(x) ≈ ln x − 1/(2x) − 1/(12x²) + 1/(120x⁴) − 1/(252x⁶)."""
acc = 0.0
while x < 6.0:
acc -= 1.0 / x
x += 1.0
inv, inv2 = 1.0 / x, 1.0 / (x * x)
return acc + (math.log(x) - 0.5 * inv
- inv2 * (1.0 / 12 - inv2 * (1.0 / 120 - inv2 / 252)))
점화식은 믿음으로 받아들여지지 않습니다: 데모가 돌기 전에 run()이 이를 직접 단언하며, 세 개의 까다로운 인수에서 를 검사합니다(beta.py 217–219행). 이 검사가 무엇을 보증하는지는 정확히 해 둡시다. 와 은 모두 같은 큰 인수까지 걸어 올라가 같은 급수를 그곳에서 평가하므로, 이 검사는 점화식 기계 장치를 검증합니다; 점근 급수의 계수 자체는 고전 문헌에 발표된 값이며 그 자격으로 신뢰됩니다. 동반 함수 trigamma(beta.py 67–76행)는 도함수 를 같은 방식, 곧 점화식 더하기 급수로 구현합니다; 아래의 훈련 그래디언트가 그것을 필요로 할 것입니다.
연산자 대수: 밀도가 하고 박스는 못 하는 일
표현과 거리를 손에 넣었으니 논리 연산자를 세울 수 있고, 바로 여기서 밀도가 제값을 합니다. 모든 일은 매개변수 위에서 일어납니다.
교집합: 밀도의 곱은 지수를 더한다. 확률에서, 같은 양에 관한 독립적인 두 증거의 자연스러운 그리고(and)는 두 밀도의 (재정규화된) 곱입니다. 두 베타 분자를 곱하고 지수를 지켜보십시오:
가운데 단계는 같은 밑의 지수들을 더할 뿐이고, 마지막 단계는 각 지수를 베타 밀도의 "매개변수 빼기 1" 꼴로 다시 씁니다. 따라서 곱은 매개변수 을 가진 또 하나의 베타 밀도에 비례하는데, 그 새 매개변수들이 합법일 때에 한합니다: 베타 매개변수는 양수여야 하므로 이 항등식은 과 을 요구합니다. 평범하게 봉우리진 피연산자(두 매개변수 모두 1 초과)에서는 조건이 자동으로 성립하고, 곱은 계열 안에 머무르며, 공이 갖지 못했던 논리곱에 대한 닫힘을 정확히 얻습니다: 증거를 결합하면 지수가 쌓이므로 합의는 밀도를 날카롭게 만듭니다. 그러나 조건은 깨질 수 있고, 정확히 이 장의 부정이 만들어 내는 영역에서 깨집니다. 예컨대 인 두 U자형 밀도를 곱하면 에 비례하는 무언가가 나오는데, 이는 0에서 적분 가능하지 않습니다: 재정규화된 베타는 존재하지 않고, "매개변수" 는 애초에 베타 매개변수가 아닙니다. 그래서 BetaE는 원시 합을 쓰지 않습니다. 대신 이를 어텐션 가중(attention-weighted) 버전으로 바꿉니다: 합이 1인 학습된 음이 아닌 가중치 를 써서 와 로 결합합니다 [1]. 양수들의 볼록 결합은 항상 양수이므로 결합된 매개변수는 부정된 가지들의 교집합을 포함한 모든 경우에 합법이고, 피연산자들의 스케일에도 머물며, 질의의 신뢰도 낮은 가지는 가중치를 낮출 수 있습니다. 어느 쪽이든 교집합은 매개변수 위의 산술입니다; 어떤 적분도 계산되지 않습니다.
부정: 대합. BetaE는 베타 벡터의 부정을 모든 매개변수를 역수로 뒤집는 것으로 정의합니다 [1]:
이 사상이 올바른 사상인 이유는 두 가지 성질에 있습니다. 첫째, 이 사상은 밀도의 충성을 뒤집습니다. 모양 표에서 모든 것이 매개변수가 1보다 위인가 아래인가에 달려 있었음을 떠올리십시오. 그것이 의 지수의 부호이기 때문입니다. 역수 사상은 1보다 큰 모든 수를 1보다 작은 수로, 또 그 반대로 보냅니다(그리고 정확히 1, 곧 균등 밀도를 고정합니다: 균등 밀도는 자기 자신의 부정이며, 완전한 무지는 아무것도 부인하지 않습니다). 두 매개변수 모두 1 초과인 밀도, 곧 확신에 찬 내부 봉우리는 두 매개변수 모두 1 미만인 밀도, 곧 원래 밀도에 질량이 전혀 없던 바로 그곳에 질량을 쌓는 U자형 그릇으로 사상됩니다. 원래 밀도가 사라지던 곳에서 부정은 발산하고, 원래 밀도가 크던 곳에서 부정은 굶주립니다. 둘째, 그리고 이것이 박스가 결코 제공할 수 없었던 성질인데, 은 대합(involution)입니다: 두 번 적용하면 근사적으로가 아니라 정확하게 항등 사상입니다. 증명은 좌표마다 한 줄의 대수입니다:
이중 부정 제거, 곧 논리 법칙 가 기하 안에서 정확한 대수 항등식으로 성립합니다. 로그 매개변수화에서 이 사상은 더욱 깔끔합니다: 이므로 부정은 로그 매개변수 벡터의 부호 뒤집기이고, 대합은 교과서의 사실 입니다(beta.py 138–141행):
def negate(logp: np.ndarray) -> np.ndarray:
"""BetaE negation (α, β) → (1/α, 1/β): a sign flip of the LOG parameters.
Applying it twice is exactly the identity — the involution the demo checks."""
return -logp
커밋된 실행은 두 성질을 장난감 입력이 아니라 훈련된 모델 위에서 검증합니다. 대합 검사는 실제 질의 임베딩을 두 번 부정하고 비트 스케일의 동일성을 단언합니다: np.allclose(negate(negate(p0)), p0, atol=1e-12)(beta.py 239–241행); 부동소수점의 부호 뒤집기는 정확하므로 검사는 여유 있게 통과합니다. 그리고 밀도 뒤집기는 실제 학습된 숫자로 출력됩니다: 부정 전과 후의 alice의 첫 번째 베타 성분입니다:
negation flips the density: alice's first component Beta(2.194, 0.411) → Beta(0.456, 2.431); 1/α check: 0.456
double negation returns the original parameters exactly; KL(alice ‖ ¬alice) = 9.6436
숫자를 읽어 봅시다. alice의 학습된 성분은 가 1 초과이고 이 1 미만입니다: 질량이 에 쌓인, 강한 안입니다. 부정은 과 을 내놓는데, 질량이 에 쌓인 강한 밖이며, 은 출력된 자릿수에서 역수를 확인해 줍니다. 마지막 수치는 이빨이 있는 온전성 검사입니다: alice와 그녀 자신의 부정 사이의 KL 발산은 9.6436으로, 아래에서 보게 될 질의 거리들(모두 3 미만)의 스케일에서 보면 거대합니다. 개체는 자신의 부인으로부터 최대한 멀리 있으며, 이것이 정확히 부정 연산자가 우리에게 빚진 것입니다.
베타 임베딩 연산자 대수: 교집합은 밀도를 곱해 지수가 더해지고, 부정은 매개변수를 역수로 뒤집어 봉우리진 밀도를 그릇으로 바꾸며(정확한 대합), 합성 점수는 부정 질의에 erin을 1위로 올려 답합니다.
저자가 AI의 도움을 받아 직접 제작한 원본 도해.
훈련: 1홉 질의와 수동 그래디언트
연산자들은 고정된 공식입니다; 훈련이 배워야 하는 것은 개체들이 어디에 앉는가와 관계들이 무엇을 하는가입니다. 10개의 관계(학계 그래프의 기본 관계 5개에, 질의가 엣지를 거꾸로 걸을 수 있도록 역관계 5개를 더한 것; beta.py 38–40행) 각각은 로그 매개변수 위의 아핀 사상(affine map)입니다: 학습된 행렬 (8 곱하기 8 격자의 숫자들)와 학습된 이동 벡터 을 머리 개체의 로그 매개변수 벡터 에 적용하여 질의의 로그 매개변수를 만듭니다:
이는 project(beta.py 133–135행)에 구현되어 있고, 은 항등 행렬 근처에서 초기화됩니다(beta.py 121–125행). 전체 매개변수 장부는 작습니다: 8개 숫자짜리 개체 13개(104개)에, 개 숫자짜리 관계 10개(720개)를 더해, 총 824개의 훈련 가능한 매개변수입니다.
훈련 데이터는 kg.py의 훈련 트리플 15개로부터 지은 30개의 1홉 질의로, 각 트리플은 정방향으로 "는 에 답해야 한다"로, 그리고 역관계를 통해 역방향으로도 쓰입니다(beta.py 43–46행). 한 질의의 손실은 KL 발산 위의 마진 순위 손실(margin ranking loss)입니다: 참 답 는 균등 표집된 거짓 답 (알려진 참 트리플과 충돌하는 동안 다시 뽑습니다)보다 적어도 마진 만큼 질의에 더 잘 맞아야 합니다,
여기서 이고 는 에 대한 같은 양입니다(beta.py 185–211행). 힌지가 활성일 때 그 그래디언트는 각 항이 건드리는 모든 매개변수 위에서 입니다.
그래디언트는 손으로 쓰였고, 유도의 보람이 있습니다. 상자 안의 닫힌 형식을 (개체 쪽 매개변수)에 대해 미분합시다. 세 항이 에 의존하는데, 항은 디감마의 차로 미분되고, 두 항에 곱의 법칙을 적용하면
여기서 KL 유도에서 얻은 을 사용했습니다. 세 줄을 더하면 이 을 상쇄하고 이 을 상쇄하여, 디감마의 도함수 항들만 남습니다,
여기서 은 트라이감마 함수(trigamma function)입니다. 질의 쪽 편미분은 더 간단합니다. 매개변수 는 상자 안 공식의 세 항에 나타나는데, 가 곱해지는 인수들, 곧 과 이 에 대해 상수이므로 곱의 법칙이 살아남지 않고 각 항이 한 줄로 미분됩니다:
세 줄을 합하면 트라이감마는 하나도 살아남지 않습니다:
편미분들은 그 거울상입니다. 넷 모두 kl_grads와 한 줄 한 줄 일치합니다(beta.py 100–115행). 이어서 두 개의 연쇄 법칙 고리가 이 밀도 공간의 그래디언트를 실제 훈련 대상 숫자들로 나릅니다(beta.py 171–182행). 로그 매개변수화의 지수 함수를 통해서는, 로부터 (코드의 ga1 * a1)를 얻습니다; 그리고 아핀 사상 을 통해서는, 질의에서의 그래디언트 가 다음과 같이 되돌아옵니다:
여기서 은 전치(행과 열을 맞바꾼 것)이고 는 외적, 곧 성분이 인 행렬입니다. 스텝 크기 0.02의 확률적 경사 하강법이 30개 질의 위로 2000 에폭을 돕니다(beta.py 33–35행). 커밋된 손실 추이는 힌지가 비어 가는 모습을 보여 줍니다:
training: mean active margin loss L = max(0, γ + KL_pos − KL_neg)
epoch 1 : 1.0078
epoch 100 : 0.0193
epoch 500 : 0.0000
epoch 1000 : 0.0000
epoch 2000 : 0.0000
filtered link prediction (6 queries): MRR 0.5794 Hits@1 0.3333 Hits@3 0.8333 ranks [3, 7, 1, 1, 2, 2]
에폭 500에 이르면 모든 훈련 질의가 표집된 모든 오염 후보를 전체 마진만큼 이깁니다. 둘째 줄은 이 권의 공유 채점판인 kg.evaluate(kg.py 110–122행)를, 홀드아웃된 세 트리플로부터 지은 여섯 개의 필터링된 순위 질의 위에서 점수 로 실행한 결과입니다: 평균 역순위 0.5794, 그리고 여섯 참 답 중 넷이 상위 2위 안에 듭니다. 훈련 손실은 0인데 테스트 MRR이 완벽하지 않은 것은 15개 트리플 위에서 암기와 일반화 사이에 늘 존재하는 정직한 간극입니다; 다음에 중요한 것은, 그 홀드아웃된 사실 중 하나가 더 어려운 질의 안에서 기하에 의해 되찾아지려 한다는 점입니다.
점수 수준에서 합성하기, 그리고 그 이유
BetaE는 다중 홉 질의를 매개변수 수준에서 합성합니다: 벡터들을 어텐션으로 가중해 교집합하고 대합으로 부정하여, 각 후보 개체와 비교되는 하나의 최종 베타 벡터를 만듭니다 [1]. 이것이 작동하는 이유는 BetaE가 다중 홉 질의 구조 위에서 끝에서 끝까지(end-to-end) 훈련되기 때문입니다: 훈련 중에 그래디언트가 교집합과 부정 연산자 자체를 관통해 흐르므로, 개체 임베딩들이 매개변수 산술을 의미 있게 만드는 방향으로 빚어집니다. 우리의 동반 모델은 1홉 질의로만 훈련되었고, 그렇지 않은 척하는 것은 부정직할 것입니다. 그래서 합성에서는 한 단계 아래로, 매개변수에서 점수로 내려가며, 그 사실을 자신의 주석에서 스스로 밝힙니다(beta.py 157–166행):
def and_not(t: int, q_pos: np.ndarray, q_neg: np.ndarray) -> float:
"""Score of the query q_pos ⊓ ¬q_neg for entity t, composed at the
SCORE level with the product t-norm and the standard fuzzy complement:
f(t) = membership(t, q_pos) · (1 − membership(t, q_neg)).
BetaE itself composes at the PARAMETER level (attention-weighted sums of
(α, β), with the involution ``negate`` above), which works when entities
are trained end-to-end on multihop query structures; with this suite's
1-hop-only training the score-level composition is the honest,
well-behaved reading (it is also how CQD composes 1-hop predictors)."""
return membership(t, q_pos) * (1.0 - membership(t, q_neg))
재료는 작은 퍼지 논리입니다. membership(beta.py 151–154행)은 발산을 등급이 매겨진 진리값 로 눌러 담는데, 이 값은 반열린 구간 에 살고 개체의 네 밀도가 질의의 밀도와 일치할 때 정확히 1이 됩니다. 논리곱은 곱 t-노름(product t-norm; t는 triangular, 퍼지 논리의 논리곱 연산자 계열의 이름)입니다: 진리값들을 곱합니다. 부정은 표준 퍼지 여집합(standard fuzzy complement), 곧 입니다. 다중 홉 기계를 훈련하는 대신 보정된 1홉 점수들을 t-노름으로 합성하는 것은 그 자체로 존중받을 만한 설계이지 양보가 아닙니다: CQD(Continuous Query Decomposition)가 사전 훈련된 1홉 모델로 복잡한 질의에 답하는 방식이 바로 이것이고 [5], FuzzQE는 정확히 이 연결사 집합 위에 어떤 t-노름이 잘 행동하는지에 관한 이론과 함께 질의 응답기 전체를 세웁니다 [4]. 지형 조사 논문은 두 합성 스타일을 나란히 목록화합니다 [2]. 점수 수준이 우리에게서 앗아 가는 것은 재사용 가능한 단일 질의 임베딩입니다: 답은 개체별 점수이지, 또 다른 연산자에 먹일 수 있는 새로운 객체가 아닙니다.
중심 질의: affiliated⁻(cmu) ⊓ ¬advises(bob)
이제 이 장이 내내 쌓아 올려 온 질의를, 2권의 표기법으로 봅시다: , 읽으면 "cmu에 소속된 개체들에서 bob이 지도하는 개체들을 뺀 것"입니다. 학계 세계가 아주 작기 때문에 폐쇄 세계(closed-world) 정답은 18개 트리플 전부를 훑어 기호적으로 계산할 수 있습니다(beta.py 229–231행): cmu에 소속된 개체는 , bob이 지도하는 개체는 , 그리고 차집합은 정확히 을 남깁니다. 한 가지 미묘함이 이것을 단순 조회가 아닌 진짜 시험으로 만듭니다: 트리플 (erin, affiliated, cmu)는 세 개의 홀드아웃 테스트 트리플 중 하나입니다(kg.py 65–69행). 모델은 erin의 소속을 긍정 사례로 본 적이 없고, 이 스위트의 부정 표집기는 오염 후보를 홀드아웃 포함 18개 트리플 전부와 대조해 걸러 내므로(beta.py 47–49행) 그 사실이 부정 사례로 제시된 적도 없습니다. 이 필터링이 표준 관행이 아니라 의도적인 선택임은 분명히 해 둡시다: 통상의 "필터링" 프로토콜은 평가 시점의 순위 매김을 다스리는 것(그것이 kg.py가 구현하는 바입니다)이고, 훈련 시점의 오염 후보를 홀드아웃 트리플과 대조하는 것은 표준적인 지식 그래프 임베딩 훈련이 하지 않는, 테스트 정보의 가벼운 사용입니다. 그 대가로 얻는 것은 실험의 깨끗한 읽기입니다: erin의 소속에 관한 신호는 부인이 아니라 순수한 침묵이므로, 그녀를 1위에 올리는 것은 암기가 아니라 훈련된 기하로부터의 일반화입니다.
학습된 쪽은 투영으로 두 피연산 질의를 짓습니다: 와 . 그런 다음 13개 개체 전부를 합성 점수로 순위 매깁니다(beta.py 232–237행). 커밋된 출력:
negation query: affiliated_inv(cmu) ⊓ ¬ advises(bob)
closed-world ground truth: affiliated_inv(cmu) = ['carol', 'dave', 'erin'] minus advises(bob) = ['carol', 'dave'] → ['erin']
top-3 by the composed score f_A · (1 − f_B), f = exp(−KL):
entity KL_A KL_B score
1. erin 0.3925 2.0269 0.5864 * gold
2. dave 0.5663 2.6270 0.5266
3. carol 0.1868 0.6634 0.4023
두 발산으로부터 erin의 점수를 손으로 추적해 봅시다: ("cmu에 소속"에 대한 좋은 적합, 그녀의 소속이 훈련된 적이 없는데도 그렇습니다), ("bob에게 지도받음"에 대한 나쁜 적합, 올바르게도), 따라서 합성 점수는 , 출력된 바로 그 숫자입니다. 세 개체 전부의 전체 산술:
| 순위 | 개체 | 점수 | 기호적 판정 | ||||
|---|---|---|---|---|---|---|---|
| 1 | erin | 0.3925 | 0.6754 | 2.0269 | 0.8683 | 0.5864 | 골드: 정답 |
| 2 | dave | 0.5663 | 0.5676 | 2.6270 | 0.9277 | 0.5266 | 제외됨 (bob이 그를 지도함) |
| 3 | carol | 0.1868 | 0.8296 | 0.6634 | 0.4849 | 0.4023 | 제외됨 (bob이 그녀를 지도함) |
erin이 1위이며, 모듈은 어떤 결과가 출력되기 전에 기호적 골드 집합과 함께 이를 단언합니다(beta.py 244–246행). 그러나 아깝게 놓친 사례를 정직하게 읽으십시오. 승리보다 더 많은 것을 가르쳐 주기 때문입니다. carol은 아름답게 처리됩니다: bob에게서 그녀로 가는 advises 엣지는 훈련 트리플이므로 모델은 그것을 굳게 믿고(가 작으므로 여집합 가 그녀의 점수를 거의 반으로 자릅니다). dave가 흥미로운 사례입니다: 트리플 (bob, advises, dave) 역시 테스트 분할에 홀드아웃되어 있습니다. 모델은 그것을 약하게 의심할 뿐이어서(, 표에서 가장 큰 값) 부정이 그를 거의 깎아내지 못하고, 그는 골드 정답에 겨우 0.06 뒤진 0.5266으로 근소한 2위를 차지합니다. 일반화가 하나의 질의 안에서 양쪽으로 작동한 것입니다: 보지 못한 소속을 추론하여 erin을 끌어올렸고, 보지 못한 지도 엣지를 추론하지 못하여 dave를 충분히 억누르지 못했습니다. 전체 사실 집합을 가진 선명한 기호 엔진이라면 dave를 결코 2위에 올리지 않을 것입니다; 그 사실을 정말로 본 적이 없는 학습된 기하는 의심하는 것 이상을 할 수 없습니다. 기호가 침묵하는 곳에서의 추론을, 어디서나 확실성을 내주는 값으로 사는 그 양날의 거래가, 표 하나에 담긴 II부 전체의 거래입니다.
확률이 사 준 것과 치른 값
산 것은 진짜입니다. 밀도는 이 권에서 처음으로 정확한 대수 법칙(대합)이 뒷받침하는 부정 연산자를 주었고, 계열 안에 머무르는 논리곱(지수가 더해지며, 가중 형태가 모든 영역에서 매개변수를 합법으로 유지합니다)을 주었으며, 등급이 매겨진 소속을 공짜로 주었습니다: 0.5864의 erin 대 0.4023의 carol은 중간 정도들을 가진 순위이며, 딱딱한 경계는 이를 흉내 낼 수만 있습니다. 이 틀은 불확실성이라는 고유한 개념도 지니고 있습니다. 가 작은 베타는 퍼져 있고 큰 베타는 집중되어 있으므로, BetaE는 질의 밀도의 미분 엔트로피를 그 질의에 대한 모델의 불확실성으로 읽습니다 [1].
사지 못한 것은 이것입니다: 보정(calibration)입니다. 소속 값 은 에 살고 기분 좋게 곱해지지만, 훈련 목적 함수의 어떤 것도 0.5864가 "erin이 질의에 답할 확률 58.64퍼센트"를 뜻하게 만들지 않습니다. 마진 손실은 참 답을 거짓 답보다 발산에서 고정된 거리만큼 아래로 밀었을 뿐이고, 절대 점수의 모양은 , 학습률, 초기화가 정하는 것이지 세계의 어떤 빈도가 정하는 것이 아닙니다. 이것들은 확률의 옷을 입은 학습된 점수이며, 그 옷은 위험할 만큼 그럴듯합니다. 같은 경고가 BetaE 자체와 모든 확률적 질의 임베딩에 적용됩니다: 확률 계산법은 그 닫힘 성질 때문에 선택된 표현 대수로 쓰이고 있는 것이지, 답에 대한 보정된 사후 확률로 쓰이고 있는 것이 아닙니다. 그런 점수가 자신의 숫자를 정말로 의미하게 만들 수 있는지, 그리고 어떻게(보정 곡선, 적절한 채점 규칙, 등각 보장) 그렇게 하는지는 5권의 질문이며, 우아한 대수를 측정된 믿음으로 오해하는 독자가 없도록 지금 그 빚을 표시해 둡니다.
풀리지 않은 부분
이 부정 연산자는 대수로서는 정확하지만, 논리로서는 무엇일까요? 대합 은 구성상 이중 부정 제거를 만족하고, 높은 밀도를 낮은 밀도로 뒤집는다는 것도 입증 가능합니다. 아무도 증명하지 못한 것은 이 연산자가 어떤 정밀한 의미론 아래에서든 질의의 답들의 집합 여집합을 구현한다는 사실입니다: 개체 가 소속 로 에 답하면 에는 특정한 무언가로 답한다고 말해 주는 정리가 없습니다. 이 연산자는 올바른 대칭성을 지녔고 잘 훈련되기 때문에 선택되었으며, 어텐션 가중 교집합도 마찬가지입니다. 그것은 자신에게 동기를 준 밀도 곱을 근사할 뿐입니다. 이를 2권과 대조해 보십시오. 그곳의 완성 규칙들은 유도된 모든 사실을 모형 이론에 묶는 건전성과 완전성 정리를 갖추고 있었습니다. 확률적 질의 임베딩은 닫힘과 미분 가능성을 갖지만, 현재의 지형에서 부정을 다룰 수 있는 어떤 질의 임베딩도 자신의 연산자 대수를 1차 의미론에 잇는 건전성 보장을 지니고 있지 않습니다 [2]. 둘째로, 더 국소적인 정직함이 있습니다: 이 장의 모델이 점수 수준에서 합성하는 이유는 정확히, 끝에서 끝까지의 다중 홉 훈련 없는 매개변수 수준 합성이 검증되지 않았기 때문입니다; 대수는 존재하지만, 이 훈련 식단 위에서는 무엇도 그것을 보증하지 않습니다. 학습된 연산자가 자신의 논리적 이름을 증명 가능하게 의미하도록 만드는 것은 열린 문제이며, 4권이 신경-기호 다리에 내걸 중심 요구 중 하나입니다.
왜 중요한가
이 시리즈의 서사에서, 이 장은 신경 쪽이 처음으로 불리언 연결사의 완전한 집합을 내놓는 순간입니다. 논리곱(5장)에 잘 행동하는 부정이 더해지면 원리상 질의 임베딩 위의 전체 명제 논리 레퍼토리가 나오는데, 이는 4권이 논리를 미분 가능한 목적 함수로 컴파일하기 시작할 때 필요한 원재료입니다: 의미 손실(semantic loss), t-노름 완화, 가중 모형 계수(weighted model counting)는 모두 신뢰할 만한 대수 법칙을 갖춘 부드러운 연결사를 전제하며, and_not이 쓰는 곱 t-노름과 여집합 는 정확히 그 장들이 형식화할 어휘입니다 [4]. 대합은 또한 프론티어 권이 확대할 주제의 작고 완벽한 표본입니다: 논리 법칙(이중 부정 제거)이 학습된 시스템 안에서, 훈련에 의해 근사적으로가 아니라 아키텍처 구성에 의해 정확히 성립하는 것입니다. 법칙을 지어 넣을 수 있는 곳에서는 그것을 배울 필요가 없고, 실패할 일도 없습니다. 마지막으로, 위의 보정 경고는 5권 전체가 다루는 신뢰 질문의 첫 등장입니다: 자신 있어 보이는 숫자로 답하는 시스템은 언젠가 그 숫자가 무엇을 뜻하는지 말해야 합니다.
핵심 용어
- 베타 분포(Beta distribution) — 단위 구간 위의 2매개변수 확률 밀도 ; 여기서 각 개체와 질의는 이것 개의 벡터입니다.
- 형상 매개변수 (shape parameters) — 밀도의 지수 더하기 1; 각 매개변수는 1 초과이면 질량을 자기 쪽 구간 끝에서 밀어내고, 1 미만이면 그 끝에 쌓습니다.
- 로그 매개변수화(log-parameterization) — 를 저장하여 매개변수가 양수로 유지되는 동안 경사 하강법이 에서 움직이게 하는 것; 부정을 부호 뒤집기로 바꿉니다.
- KL 발산 (베타 닫힌 형식)(KL divergence) — 을 성분에 걸쳐 합한 것; 모델 전체의 적합도 척도입니다.
- 디감마 / 트라이감마(digamma / trigamma) — 과 ; 점화식 와 점근 급수로 밑바닥부터 계산되며 까지 자기 검증됩니다.
- 대합(involution) — 자기 자신이 역인 사상; BetaE의 부정 이 그것이므로 이중 부정은 정확히 항등입니다.
- 곱 t-노름 / 퍼지 여집합(product t-norm / fuzzy complement) — 등급이 매겨진 소속 위에서
and_not이 쓰는 점수 수준 연결사 와 입니다. - EPFO — 실존 긍정 1차 질의 조각(); 영역들이 다루는 범위이며, 부정은 정확히 그 너머에 있는 것입니다.
- 여집합에 대한 닫힘(closure under complement) — 박스와 공에는 없고(그 여집합은 무계이며 계열을 벗어납니다) 밀도가 제공하는 성질입니다.
- 보정(calibration) — 빠져 있는 보장: 0.5864라는 점수는 학습된 순위 값이지 58.64퍼센트의 확률이 아닙니다.
여기서 어디로 가는가
II부는 이제 경쟁하는 세 기하를 쥐고 있습니다: 손으로 배치한 공, 경로 위에서 훈련된 박스, 그리고 부정할 수 있는 밀도. 이 부가 닫히기 전에 앞의 둘은 오래된 셈을 치러야 합니다. 4장은 지나가는 말로 두 공의 교집합은 렌즈이고 렌즈는 공이 아니라고 주장했습니다; 5장은 박스의 교집합에 대한 닫힘 위에 제국을 세웠습니다. 다음 장 박스 대 공은 그 지나가는 주장을 측정된 판결로 바꿉니다: 렌즈의 최소 포함 공을 세 줄의 대수로 유도하고, 좌표로 증명 가능한 거짓 양성을 내보이며, 조밀한 격자 위에서 거짓 양성 넓이를 측정합니다. 훈련도 손실도 없이, 오직 기하가 III부의 온톨로지 임베딩 장들을 맡을 자격이 어느 계열에 있는지를 판정합니다.
동반 코드: examples/neural/beta.py는 NumPy 외의 어떤 의존성도 없이 이 장의 모든 것을 구현합니다: 밑바닥부터 만든 디감마와 트라이감마, 닫힌 형식의 베타 KL과 손으로 유도한 네 편미분, 이중 부정 검사를 갖춘 부호 뒤집기 부정, 마진 손실 훈련 루프, 그리고 어떤 결과가 출력되기 전에 기호적 정답이 단언되는 부정 질의까지. python3 examples/neural/beta.py(시드 고정, 결정적)를 실행하면 위에 인용된 모든 숫자가 재현됩니다; examples/neural/kg.py는 18개 트리플, 15/3 분할, 그리고 공유되는 필터링 순위 평가를 제공합니다.