DeepProbLog: 신경 술어와 경사 반환
📍 현재 위치: 2부 · 확률 논리와 회로 — 7장. 회로는 질의의 논리식을, 단 한 번의 상향 (+, ×) 패스로 정확히 계수하는 매끄러운 d-DNNF(deterministic decomposable negation normal form, 결정론적 분해 가능 부정 정규형)로 컴파일했습니다; 이 장은 회로의 잎 아래에 신경망을 두고, 그 동일한 패스를 거슬러 학습을 역방향으로 흘려보냅니다.
2부는 세 번의 움직임으로 하나의 파이프라인을 조립해 왔습니다. 분포 의미론(distribution semantics)은 확률적 사실을 가진 논리 프로그램을 가능 세계(possible world)들에 대한 분포로 바꾸었고, 가중 모델 계수(WMC, weighted model counting)는 질의 확률을 충족 할당들에 대한 합으로 바꾸었으며, 지식 컴파일(knowledge compilation)은 그 #P-난해(#P-hard)한 합을 회로 위의 값싼 한 번의 패스로 바꾸었습니다. 그 내내 조용히 미뤄져 온 질문이 하나 있습니다. 사실에 붙은 확률은 도대체 어디서 오는가입니다. 0.9::advises(alice, bob)을 손으로 적어 넣는 것은 교과서용 지식 베이스에는 괜찮지만 지각(perception)에는 절망적입니다. "이 사진은 숫자 3을 보여준다"거나 "이 문서는 논리에 관한 것이다"에 확률을 매길 수 있는 손으로 쓴 규칙은 없습니다. DeepProbLog는 신경망이 그 확률을 대신 쓰게 함으로써 답합니다. 신경 술어(neural predicate)란 확률이 네트워크의 출력인 확률적 사실이며, 그 위에 놓인 프로그램은 평범한 ProbLog이고, 전체 스택은 처음부터 끝까지 함께 훈련되는데, 이는 정확한 추론 그 자체가 미분 가능하기 때문입니다 [1]. 이 장은 이 메커니즘을 온전히 구축합니다. 소프트맥스 헤드가 정의하는 주석 논리합(annotated disjunction), 회로를 한 번 지나는 것만으로 질의 확률과 그 정확한 경사를 함께 돌려주게 만드는 경사 세미링(gradient semiring), 그리고 그 보상인 원격 지도(distant supervision), 즉 논리 프로그램이 레이블을 한 번도 보지 못한 분류기를 위한 레이블링 함수 역할을 하는 경우입니다.
동물 사진 쌍을 판단하도록 아이를 가르친다고 상상해 보십시오. 오직 "같은 종류"인지 "다른 종류"인지만 말해 주고, 동물의 이름은 단 하나도 알려 주지 않습니다. "같은 종류"라고 답하려면 아이는 각 사진이 무엇을 보여주는지 마음속으로 은밀히 결정해야 합니다. 여러분의 "같다/다르다" 피드백은 "같은 종류란 내 은밀한 두 레이블이 일치한다는 뜻이다"라는 단 하나의 규칙을 통해 그 은밀한 결정에 가닿습니다. 올바른 "같다"에 대한 칭찬은 그것을 설명해 낸 은밀한 레이블 쌍이 무엇이든 그것을 강화하고, 틀린 "같다"에 대한 정정은 그것을 약화합니다. 쌍이 충분히 쌓이면 아이는 사진들을 완벽하게 종류별로 분류하게 되는데, 여러분은 단 한 번도 "고양이"라고 말한 적이 없습니다. DeepProbLog는 이 순환을 정확하게 만든 것입니다. 은밀한 결정은 소프트맥스이고, 규칙은 논리 프로그램이며, 칭찬은 정확한 확률적 추론을 거슬러 역방향으로 보내지는 경사입니다.
이 장에서 다루는 내용
- 공식화된 아키텍처: 2차원 문서 특징에 대한 선형-소프트맥스 분류기가
topic(D, logic),topic(D, ml),topic(D, nesy)에 대한 신경 주석 논리합이 되는 과정, 관련성을 정의하는 단 하나의 Prolog 규칙, 그리고 2부의 정확한 파이프라인, 즉 접지(ground)-컴파일(compile)-계수(count)에서 나오는 질의 확률입니다. - 세 개의 동전이 아니라 하나의 범주형: 소프트맥스 헤드가 왜 단 하나의 상호 배타적 선택인지, 컴패니언이 그 배타성을 세계들 자체 안에 어떻게 부호화하는지, 그리고 독립 동전으로 잘못 읽는 방식이 확률 질량의 거의 절반을 불가능한 세계로 새어 나가게 한다는 것을 보여주는 커밋된 숫자들입니다.
- 유도된 경사 세미링: 앞 장의 회로 평가를 미분하여, 합의 법칙과 곱의 법칙이 (값, 경사) 쌍 위의 세미링으로 스스로 조립되는 과정을 지켜보고, ⊗의 결합 법칙을 완전히 검증합니다.
- 한 번의 패스, 두 개의 답: 와 모든 를 동시에 돌려주는 상향 패스는 중심 유한차분과 대조해 2.7e-13까지 검증되며, 그런 다음 소프트맥스 야코비안을 거쳐 손으로 선형 가중치까지 연쇄되어 2.0e-11까지 다시 검증됩니다.
- 함의를 통한 훈련: 관련/무관 쌍 레이블만을 상대로 한 질의 확률에 대한 교차 엔트로피가 은닉 주제 분류기를 여섯 문서에서 100%까지 이끌어 냅니다; 커밋된 추적 기록을 읽으며 그 공로가 정확히 왜 올바른 잠재 결정에 돌아가는지를 설명합니다.
- 규모의 장부: 정확한 접지와 컴파일이 정직한 비용이며, 후속 연구들의 평가가 보고하는 한계는 네 자릿수 MNIST 덧셈 부근이고, 정확성을 범위와 맞바꾸는 근사의 노선들(top-k 증명, 유도 의미론)입니다.
아키텍처: 잎 아래의 신경망
전체 구성은 세 개의 층으로 이루어지며, 컴패니언 deepproblog_mini.py는 각 층을 학계 세계 위에 축소하여 구현합니다. 지각 층(perception layer)은 분류기입니다. 여섯 문서 각각은 특징 벡터 (문서 하나당 실수 두 개로, 이미지 픽셀을 대신하는 자리)를 제시하고, 선형 층과 소프트맥스가 이를 개 주제에 대한 확률 벡터로 사상하는데, 여기서 는 주제의 개수입니다. 문서는 진행 중인 예제의 세 논문 p1, p2, p3이며, 이들의 은닉 주제는 3권의 kg 그래프에서 읽어 올 뿐 다시 입력하지 않고, 여기에 각 주제를 두 문서짜리 군집으로 완성해 주는 세 개의 새 원고 m1, m2, m3가 더해집니다(deepproblog_mini.py 89–98행). 논리 층(logic layer)은 모듈이 시작할 때 출력하는 두 줄짜리 ProbLog 프로그램입니다.
nn(m_topic, [D], [logic, ml, nesy]) ::
topic(D, logic) ; topic(D, ml) ; topic(D, nesy).
relevant(D1, D2) :- topic(D1, T), topic(D2, T).
첫 번째 문장은 DeepProbLog의 유일한 새 구성 요소인 신경 주석 논리합(nAD, neural annotated disjunction)입니다 [1]. 이를 조각조각 해독해 봅시다. ProbLog에서 주석 논리합(AD, annotated disjunction)이란 여러 헤드 사이의 확률적 선택입니다. 주석은 각 헤드의 확률을 부여하고, 그 확률들의 합은 많아야 1이며, 남는 질량이 있다면 그것은 나열된 헤드 중 어느 것도 발화하지 않는 결과로 갑니다. 접두어 nn(m_topic, [D], [logic, ml, nesy])는 그 확률들이 손으로 적힌 것이 아니라, 문서 D에 적용된 m_topic이라는 이름의 네트워크가 내놓은 출력이며, 나열된 값 하나당 출력 하나씩이라는 것을 말해 줍니다. 소프트맥스 헤드는 포화된 특수 경우입니다. 정확히 합이 1이 되는 개의 음이 아닌 수를 내놓아 헤드 없음 결과에 남는 질량이 전혀 없으므로, nAD는 그것들을 개의 상호 배타적인 접지 원자(ground atom) topic(D, logic), topic(D, ml), topic(D, nesy)의 확률로 선언하며, 그중 정확히 하나만 성립합니다. 두 번째 문장은 평범한 논리입니다. 두 문서는 어떤 주제 T가 둘 모두의 주제일 때 서로 관련이 있습니다. 추론 층(inference layer)은 2부의 정확한 파이프라인을 그대로 씁니다. 질의를 접지하고, 그 결과로 나온 명제 논리식을 매끄러운 결정론적 분해 가능 회로로 컴파일한 다음, 평가합니다. 정본으로 삼는 저널 원문에서는 이 파이프라인, 즉 세미링 아래에서 평가되는 문장 결정 다이어그램(SDD, sentential decision diagram)을 거치는 접지가 시스템 전체이며, 네트워크는 그저 잎 가중치를 공급하는 또 하나의 공급원일 뿐입니다 [2].
지각 과제는 모든 숫자를 검사할 수 있게 남겨 두려고 일부러 작게 만들어져 있습니다. 각 주제는 특징 평면 위에 자신의 군집 중심을 가지며, 각 문서는 자신의 은닉 주제의 중심에 가우스 산포(Gaussian scatter)를 더한 위치에 놓입니다(deepproblog_mini.py 96–110행). 커밋된 실행은 다음 세계를 출력합니다.
doc x1 x2 hidden topic
m1 0.044 2.154 logic
m2 2.424 -1.163 ml
m3 -2.387 -1.073 nesy
p1 0.456 2.531 logic
p2 -2.446 -1.643 nesy
p3 1.982 -1.186 ml
"hidden topic" 열이 결정적인 허구입니다. 그것은 오직 쌍 레이블을 만들어 내고 최종 분류기를 채점하기 위해서만 파일 안에 존재합니다. 훈련은 그것을 결코 보지 못합니다. 훈련이 보는 것은 여섯 문서의 개 쌍(이항 계수 는 여섯 개 항목의 순서 없는 쌍의 개수를 셉니다) 각각의 레이블입니다. 은닉 주제를 공유하는 3개 쌍에 대해서는 이고, 나머지 12개에 대해서는 입니다(deepproblog_mini.py 118–120행). 이것이 원격 지도(distant supervision)입니다. 관측 가능한 신호(관련성)가 오직 논리 프로그램을 통해서만 잠재 결정(주제)과 연결되어 있습니다.
relevant(A, B)를 어떤 문서 쌍에 대해 접지하면 규칙이 공유된 주제에 대한 논리합으로 펼쳐집니다. 두 문서가 모두 logic을 선택했거나, 모두 ml을 선택했거나, 모두 nesy를 선택했을 때 정확히 성립합니다. 모듈은 그 논리식을 자리표시자 슬롯 A와 B를 두고 단 한 번, 개의 불(Boolean) 지시 변수 topic(A,t), topic(B,t)에 대한 회로로 컴파일하고, 잎 가중치를 다시 묶어 넣음으로써 모든 쌍에 대해 그 컴파일된 회로를 재사용합니다(deepproblog_mini.py 128–166행). 이는 실제 시스템이 자신의 SDD에 대해 쓰는 것과 같은, 한 번 컴파일하고 여러 번 평가하는 패턴입니다 [2]. 컴파일러는 앞 장의 circuit.py이며, 그 구조적 보장은 여기서도 그저 가정되는 것이 아니라 코드로 다시 검사됩니다(deepproblog_mini.py 461–466행):
query terms vars nodes edges pass-throughs
relevant(A,B) 3 6 18 22 0
irrelevant(A,B) 6 6 26 36 0
structure: decomposable + deterministic (structural and all-64-assignment
enumeration) + smooth as compiled — checked as code, PASS
두 번째 행은 훈련 목표가 아니라 대조 검사입니다. irrelevant(A, B)는 그 여집합을 접지하는데(A가 정확히 주제 를, B가 정확히 주제 를 가지며, 인 여섯 개의 순서쌍에 대해; deepproblog_mini.py 147–151행), 하니스는 모든 문서 쌍에 대해 두 회로가 원-핫 세계들을 분할한다는 것, 즉 을 단언합니다. 이 항등식의 경사 쪽 절반은 아래의 기계 장치가 갖춰진 뒤에야 검사되는데, 더 미묘합니다. 잎 슬롯들이 자유 매개변수로 취급되기 때문에, 두 경사는 영벡터가 아니라 모든 성분이 1인 벡터로 합해지며(슬롯이 자유로우면 합 는 두 문서 각각의 잎 질량 총합의 곱이 되고, 그 곱을 어느 한 슬롯으로 편미분한 값은 상대 문서의 질량 총합, 즉 소프트맥스가 각 문서의 세 슬롯 합을 1로 정규화한 뒤에는 정확히 입니다), 그 방향을 정확히 소멸시키는 것은 이 장 뒤에서 유도되는 소프트맥스 야코비안이므로, 상쇄는 로짓(logit) 수준에서 성립합니다(deepproblog_mini.py 483–497행). 마지막 열을 눈여겨보십시오. 잎이 이 장의 범주형 가중치를 실으면, 통과(pass-through) 개수가 0이 아니라는 것은 겉치레의 세부 사항이 아니라 소리 없는 산술 오류일 것이며, 경사 세미링 절이 왜 정확히 0이어야 하는지를 설명합니다.
하나의 구조, 두 방향: 정방향에서는 소프트맥스가 컴파일된 회로의 잎을 채우고 한 번의 패스가 P(relevant)를 계산하며; 역방향에서는 같은 패스의 경사 세미링이 논리를 거쳐 소프트맥스와 그 가중치로 공로를 실어 나른다.
저자가 AI의 도움을 받아 직접 제작한 원본 도해.
세 개의 동전이 아니라 하나의 범주형
경사가 흐르기도 전에 부호화가 올바라야 하며, 이를 그르치는 것은 정말로 쉬운 일입니다. 세 주제에 대한 소프트맥스 헤드는 세 가지 결과를 가진 하나의 무작위 선택, 즉 범주형 분포(categorical distribution)입니다. 그것은 세 개의 독립적인 예/아니오 사실이 아닙니다. 만약 topic(m1, logic), topic(m1, ml), topic(m1, nesy)를 세 개의 독립적인 확률적 사실, 즉 세 개의 동전으로 모델링한다면, 한 문서에 대한 가능 세계는 세 원자의 모든 부분집합인 개가 될 것이고, 여기에는 m1이 두 개의 주제를 갖는 세계와 아무 주제도 갖지 않는 세계까지 포함됩니다. 소프트맥스가 실제로 정의하는 분포는 문서마다 정확히 개의 세계, 즉 주제 하나당 하나씩을 가집니다. 세계는 개의 부분집합이 아니라 개의 선택지에 걸쳐 있어야 합니다.
컴패니언은 이것을 접지 그 자체 안에 부호화합니다. relevant(A, B)의 각 논리합 항은 완전한 원-핫 세계 기술(one-hot world description)로 완성됩니다. 주제 에 대한 항은 topic(A,t)가 참이고 다른 두 지시자는 거짓이라고 단언하며, B에 대해서도 마찬가지이고, 항 하나당 부호 붙은 리터럴 여섯 개입니다(deepproblog_mini.py 132–144행):
def _one_hot(slot: str, t: str) -> dict[str, bool]:
"""The indicator literals saying slot's document has EXACTLY topic t:
topic(slot,t) true, topic(slot,t') false for both other topics. This is
how the nAD's mutual exclusion enters the worlds — a document never
carries two topics or none in any model of the formula."""
return {f"topic({slot},{u})": (u == t) for u in TOPICS}
def relevant_dnf() -> list[dict[str, bool]]:
"""Ground relevant(A,B) = ∨_T (topic(A,T) ∧ topic(B,T)), each disjunct
completed to a full one-hot world description (6 signed literals):
the T-th term says "A has exactly T and B has exactly T"."""
return [{**_one_hot("A", t), **_one_hot("B", t)} for t in TOPICS]
가중치가 부호화를 완성합니다. 양의 지시자 topic(S,t)는 소프트맥스 출력 로 가중되고, 부정된 지시자는 가 아니라 상수 로 가중됩니다(deepproblog_mini.py 195–213행). 이것이 표준적인 범주형 지시자 부호화이며, 상수 이 바로 핵심입니다. "A는 정확히 주제 logic을 가진다"는 세계는 그저 질량 만을 실어야 하며, 그 기술 안의 두 부정 리터럴은 그것에 세금을 매겨서는 안 되는 장부 정리일 뿐입니다. 원-핫 항과 이 가중치들이 있으면, 합법적인 각 세계의 가중치는 그것이 선택한 소프트맥스 항목들의 곱이 되고, 불법적인 모든 세계는 어떤 항도 충족하지 못하며, 회로에 대한 계수는 정확히 다음과 같습니다.
여기서 합 기호 는 세 주제 각각에 대해 두 문서가 그 주제에 부여한 확률의 곱을 만든 다음, 그 세 곱을 모두 더하라는 지시로 읽습니다. 이 합은 하니스가 15개 쌍 전부에 대해 회로와 대조해 까지 단언하는 값입니다(deepproblog_mini.py 483–488행). 회로 장에서 결정성(determinism)이 왜 중요했는지 떠올려 봅시다. 자식들이 함께 참일 수 있는 OR은 아래에서 중복 계산됩니다. 회로 수준의 결정성은 컴파일러가 보장하는 것입니다. 섀넌 전개(Shannon expansion)는 입력 논리식이 무엇이든 모든 OR을 변수 하나에 대한 결정으로 만듭니다. 원-핫 부호화가 사 오는 것은 의미론적인 것입니다. 그것은 논리식의 모델을 정확히 합법적인 원-핫 세계들로 만들어 주므로, relevant의 세 논리합 항은 쌍마다 서로 배타적인 사건이 되고, 그 확률들을 더하는 일은 정직해집니다.
모듈은 coins_dnf()라는 전시물로 잘못된 읽기를 그대로 살려 둡니다. 베르누이 가중치 , 를 쓴 벌거벗은 두 리터럴짜리 항입니다(deepproblog_mini.py 154–160행). 훈련되지 않은 네트워크에서, logic 군집 쌍 (m1, p1)에 대해:
[4] the nAD is ONE categorical, not 3 independent coins (pair m1, p1)
correct (one-hot worlds) P(relevant) = 0.470735 = sum_t pi_A,t pi_B,t
3-coin reading P(relevant) = 0.421794 = 1 - prod_t (1 - pi_A,t pi_B,t)
coin mass on legal exactly-one worlds for one document: 0.501081
(the rest sits on impossible worlds: a document with two topics or none)
두 읽기는 확률 거의 5포인트만큼 어긋나며(), 마지막 줄이 그 진단입니다. 독립 동전 아래에서 m1이 정확히 하나의 주제를 가질 확률은 인데, 여기서 곱 기호 는 나머지 두 주제 각각에 대한 인수 를 곱하라는 뜻이므로, 각 항은 주제 의 동전은 앞면이 나오고 다른 두 동전은 모두 뒷면이 나오는 사건을 읽어 냅니다. 그 총합이 겨우 절반 남짓이므로, 동전 모델 질량의 거의 절반이 소프트맥스가 불가능하다고 말하는 세계 위에 놓여 있는 셈입니다. 동전 공식 는 세 개의 독립적인 사건의 합집합에 대한 확률이며, 어떤 주제도 일치하지 않을 확률을 1에서 뺀 값으로 계산됩니다. 이 합집합 산술이 필요한 것은, 정확히 동전 아래에서는 "둘 다 주제 를 가진다"는 사건들이 겹칠 수 있기 때문이며(문서가 한 번에 두 주제를 가질 수 있으므로), 범주형 공식은 서로 배타적인 세계들에 대한 깔끔한 합인 것과 대조됩니다. 둘 다 올바른 회로로 계산되지만, 동전 버전은 다르고 틀린 질문에 답하고 있는 것입니다. 컴패니언은 그 눈에 보이는 불일치와 질량 누출을 단언합니다(deepproblog_mini.py 508–514행). 온전성을 하나 더 확인해 보면, 원-핫 소프트맥스 출력(정확한 0/1 확률)에서는 세미링 패스가 불(Boolean) 논리로 퇴화하여 두 주제가 일치하면 정확히 을, 그렇지 않으면 정확히 을 돌려주며, 이는 모든 개 조합에 대해 검증됩니다(deepproblog_mini.py 371–387행). 크리스프 논리(crisp logic)는 이 기계 장치 안에 크리스프 극한(crisp limit)으로 자리 잡고 있으며, 이는 이 권 전체에서 되풀이되는 건전성의 닻입니다.
유도된 경사 세미링
이제 이 장의 심장부입니다. 앞 장의 평가자는 회로를 아래에서 위로 훑습니다. 각 잎은 가중치를 실어 나르고, 각 AND 노드는 자식들을 곱하고, 각 OR 노드는 그것들을 더하며, 루트 값이 입니다(circuit.py 336–366행). 훈련에는 한 가지가 더 필요합니다. 그 루트를 모든 네트워크 출력에 대해 미분한 도함수입니다. 잎으로 흘러들어가는 여섯 개의 소프트맥스 출력을 벡터 으로 모읍시다(""은 실수 여섯 개짜리 목록들의 공간이며, 지시 변수 하나당 슬롯 하나입니다). 그리고 경사(gradient) , 즉 여섯 개 편미분 전부로 이루어진 벡터를 구해 봅시다. 가중치를 살짝 흔들어 회로를 여섯 번 더 돌려도 되겠지만, 더 나은 방법이 있습니다. 그 패스 자체를 미분하는 것입니다.
어떤 노드에서 그 노드의 값 과 그 경사 , 즉 그 값을 여섯 개의 잎 매개변수 전부에 대해 미분한 도함수를 둘 다 안다고 합시다. 형제 노드에 대해서도 마찬가지로 를 안다고 합시다. 그렇다면 부모 노드는 무엇을 알게 될까요?
OR 노드에서는 값이 입니다. 미분은 선형이므로, 각 슬롯 에 대해 이고, 따라서 부모의 경사는 입니다. 이것이 합의 법칙(sum rule)입니다.
AND 노드에서는 값이 입니다. 곱의 법칙(product rule)은 슬롯별로 을 주므로, 부모의 경사는 입니다.
두 규칙 모두 오직 두 쌍만을 소비하여 하나의 쌍을 내놓습니다. 그러므로 원소가 이고 인 쌍 인 새로운 수 체계를 정의하고, 그 두 규칙을 이 체계의 연산으로 설치해 봅시다.
이것이 경사 세미링(gradient semiring)이며, 이 장의 주장은 이것이 정말로 교환 세미링(commutative semiring)이라는 것이고, 그렇기 때문에 앞 장의 평가자를 아무것도 바꾸지 않고 그 위에서 돌릴 수 있다는 것입니다. aProbLog(algebraic ProbLog, 대수적 ProbLog) 프레임워크는 회로 기반 추론을 확률에서 임의의 교환 세미링으로 일반화했는데, 이때 잎 레이블에 요구되는 조건들은 정확히 회로의 한 가지(branch)가 변수 하나를 건너뛰는 지점에서만 필요합니다 [3]. 아래의 매끄러움 논의는 이 장의 원-핫 부호화가 통과 노드 0개로 컴파일된다는 것, 즉 어떤 가지도 결코 변수를 건너뛰지 않으므로 그 조건들이 결코 호출되지 않는다는 것을 보여줍니다. 그러므로 이 공리들은 현학이 아니라 이 기계 장치를 재사용해도 좋다는 허가증입니다. 하나씩 확인해 봅시다. 덧셈 는 성분별이므로 결합적이고 교환적이며, 항등원은 인데, 여기서 은 모든 성분이 0인 벡터입니다. 곱셈 는 살펴보면 교환적입니다. 이고 는 두 쌍에 대해 대칭입니다. 그 항등원은 입니다. 실제로 입니다. 소멸원(annihilator)도 성립합니다: .
의 결합 법칙(associativity)은 완전한 계산을 받을 자격이 있습니다. 그럴듯하게 실패할 수 있는 공리이기 때문입니다. 세 쌍 를 잡고 두 묶음 방식을 모두 전개해 봅시다. 먼저 왼쪽 묶음입니다.
그리고 괄호를 거쳐 을 분배하면, 경사 슬롯은 가 됩니다. 오른쪽 묶음은:
이것의 경사 슬롯도 같은 로 분배됩니다. 두 묶음이 일치하며, 이 공통값은 우연이 아닙니다. 이는 세 항 곱에 대한 곱의 법칙 이며, 이는 에 대해 대칭입니다. 결합 법칙이 성립하는 것은 정확히, 곱을 미분하는 일이 그 곱을 어떻게 괄호 쳤는지를 신경 쓰지 않기 때문입니다. 마지막으로, 에 대한 의 분배 법칙(distributivity)입니다.
이는 정확히 입니다. 모든 공리가 통과합니다. 이 쌍 구성은 오래되고 유서 깊은 것입니다. 이것은 확률적 유한 상태 변환기(probabilistic finite-state transducer)의 기댓값 세미링(expectation semiring)으로, 기대 계수를 그 합-곱 재귀식을 통해 밀어 보내려고 고안되었으며 [4], 여기서는 가중 모델 계수의 전진 모드 미분(forward-mode differentiation)으로 재발견된 것입니다. 이제 2부의 세미링 메뉴 전체는 다음과 같이 읽힙니다.
| 세미링 | 원소 | ⊕ | ⊗ | 루트가 계산하는 것 | ||
|---|---|---|---|---|---|---|
| 불(Boolean) | 참/거짓 | ∨ | ∧ | 거짓 | 참 | 충족가능성 |
| 확률 | (WMC) | |||||
| 최댓값-곱(max-product) | max | 최유력 설명(most probable explanation) | ||||
| 경사 | 두 슬롯 모두 더함 | 곱의 법칙 |
잎 레이블이 정의를 완성합니다. 확률 를 가진 상수 확률적 사실은 네트워크에 의존하지 않으므로, 모든 슬롯에서 그 도함수는 0입니다. 레이블은 입니다. 번째 소프트맥스 출력에 대한 지시자는 바로 번째 매개변수 그 자체이므로, 그 도함수는 슬롯 에서 이고 나머지에서는 입니다. 레이블은 이며, 여기서 는 번째 표준기저 벡터(standard basis vector), 즉 위치 에만 이 하나 있는 벡터입니다. 범주형 부호화의 부정된 지시자들은 상수 입니다. 레이블은 입니다. 컴패니언에서 이것은 여섯 줄입니다(deepproblog_mini.py 184–189행):
return Semiring(
f"gradient (p, dp/dx) over R^{n}",
(0.0, np.zeros(n)),
(1.0, np.zeros(n)),
lambda a, b: (a[0] + b[0], a[1] + b[1]),
lambda a, b: (a[0] * b[0], b[0] * a[1] + a[0] * b[1]))
그리고 레이블은 grad_weights에서 부착됩니다(deepproblog_mini.py 207–212행):
for s, pi in (("A", pi_a), ("B", pi_b)):
for t in TOPICS:
var = f"topic({s},{t})"
e = np.zeros(N_SLOTS)
e[SLOT[var]] = 1.0
w[var] = ((float(pi[T_ID[t]]), e), (1.0, np.zeros(N_SLOTS)))
정확성은 회로를 따라 올라가는 구조적 귀납법으로 성립합니다. 모든 잎에서 그 쌍은 구성상 (값, 그 값의 경사)입니다. 어떤 노드의 모든 자식이 올바른 쌍을 실어 나른다면, OR의 경우는 합의 법칙이고 AND의 경우는 곱의 법칙이므로, 부모의 쌍도 올바릅니다. 루트에서는 첫 번째 슬롯이 확률 세미링이 계산하는 것과 정확히 같은 수, 즉 이고, 두 번째 슬롯은 정확히 입니다. 이 귀납법이 무엇을 필요로 했는지 눈여겨보십시오. 결정성과 분해 가능성(앞 장)은 값 슬롯을 참된 확률로 만들어 주며, 범주형 가중치 아래에서는 한 가지 조건이 더 조용히 일을 합니다. 매끄러움 항등식 은 여기서 성립하지 않는데, 이 합을 로 만들기 때문이며, 그래서 컴파일러가 삽입한 매끄러움 통과 노드 가 있다면 그 가지를 로 곱해 두 슬롯 모두를 망가뜨릴 것입니다. 이 부호화가 안전한 것은 오직 완전한 원-핫 항들이 통과 노드 없이 그 자체로 매끄럽게 컴파일되기 때문이며, 이것이 바로 위 구조 보고서의 통과(pass-through) 열이 증명하는 바이고, 컴패니언은 다른 무엇이든 실행되기 전에 이를 단언으로 강제합니다(deepproblog_mini.py 457–466행). 모든 에 대해 값 슬롯이 올바르다면, 경사 슬롯은 공짜로 따라옵니다. 어디서나 올바른 계산을 미분하면 그 도함수의 계산이 나오기 때문입니다. 비용 계산도 마찬가지로 깔끔합니다. 이제 각 또는 는 길이 6짜리 벡터를 다루므로, 이 패스는 회로 엣지 하나당 벡터 연산 하나의 비용이 들고, relevant(A,B)에 대해서는 22개의 엣지이며, 그 한 번의 훑기에서 확률과 여섯 개의 편미분, 총 일곱 개의 숫자 전부를 돌려줍니다. 여섯 번 재평가했다면 회로 비용의 여섯 배가 들었을 것입니다. 전진 모드 쌍은 폭이 여섯 배인 회로 하나의 비용만 듭니다.
한 번의 패스, 두 개의 답
컴패니언은 확률 세미링이 썼던 것과 같은 evaluate 진입점을 통해 이 패스를 실행하며(circuit.py 369–374행), 이는 query_prob_grad로 감싸여 있습니다(deepproblog_mini.py 223–228행):
def query_prob_grad(circ, pi_a: np.ndarray, pi_b: np.ndarray,
) -> tuple[float, np.ndarray]:
"""One gradient-semiring WMC pass over the compiled circuit:
returns (P, ∇P) where ∇P has the 6 slots (A×3 topics, then B×3)."""
p, g = evaluate(circ, grad_weights(pi_a, pi_b), GRAD)
return float(p), g
신뢰하되 검증하십시오. 중심 유한차분(central finite difference)은 도함수의 정의를 수치로 옮긴 것입니다. 한 슬롯을 작은 단계 만큼 위로, 만큼 아래로 흔들고, 의 변화량을 로 나눕니다. 즉 입니다. 회로의 다항식은 잎 가중치에 대해 다중선형(multilinear)이므로(각 세계는 각 변수의 가중치를 많아야 한 번만 곱하므로, 어떤 슬롯도 제곱되어 나타나지 않습니다), 중심 차분은 부동소수점 반올림까지 정확하며, 이는 그것을 무자비한 오라클(oracle)로 만들어 줍니다. 검사 fd_check_circuit은 흔들린 가중치에서의 평범한 확률-세미링 평가를 이용해 모든 세미링 슬롯을 그것과 대조합니다(deepproblog_mini.py 294–315행). 훈련되지 않은 네트워크에서, 쌍 (m1, p1)에 대한 커밋된 실행은:
[3] the gradient semiring, certified against central finite
differences on the untrained net (pair m1, p1)
slot semiring dP/dpi finite diff |diff|
topic(A,logic) 0.563591122 0.563591122 5.1e-14
topic(A,ml) 0.038147531 0.038147531 4.8e-14
topic(A,nesy) 0.398261347 0.398261347 2.7e-13
topic(B,logic) 0.562658408 0.562658408 2.0e-13
topic(B,ml) 0.057065962 0.057065962 2.3e-13
topic(B,nesy) 0.380275630 0.380275630 1.4e-13
max |semiring - FD| on the circuit : 2.67e-13 (tolerance 1e-06)
그리고 하니스는 이 장의 계약을 단언으로 강제합니다(deepproblog_mini.py 503–504행):
assert fd_circ <= FD_TOL, f"semiring vs FD on the circuit: {fd_circ:.2e}"
assert fd_par <= FD_TOL, f"chained param gradient vs FD: {fd_par:.2e}"
표의 숫자들을 닫힌 형태로부터 직접 읽어 하나의 표본 점검으로 삼을 수 있습니다. 이므로, 에 대한 편미분은 그저 다른 문서의 소프트맥스 항목인 입니다. topic(A,logic)에 대해 출력된 슬롯 은 p1의 훈련되지 않은 logic 확률이고, topic(B,logic)에 대한 슬롯 은 m1의 확률입니다. 짝지어진 슬롯들을 곱하고 더하면 이며, 이는 정확히 동전 전시물이 이 쌍에 대해 출력한 와 같습니다. 세미링과 유한차분과 손으로 한 대수 계산이 모두 하나의 이야기를 들려줍니다.
소프트맥스 출력에서 가중치까지, 손으로
회로의 경사는 소프트맥스 출력에서 멈춥니다. 네트워크의 매개변수는 그 뒤에 놓여 있습니다. DeepProbLog는 정확히 이 이음매에서 를 딥러닝 프레임워크의 자동 미분(automatic differentiation)에 넘겨줍니다 [2]. 컴패니언은 아무것도 숨기지 않도록 남은 연쇄를 손으로 적어 둡니다. 세 개의 연결 고리가 남아 있습니다. 첫째, 손실입니다. 목표 과 추론된 를 가진 쌍에 대해, 교차 엔트로피는 이며, 여기서 은 자연로그(밑이 인 로그)입니다. 이를 항별로 미분하면,
둘째, 소프트맥스 야코비안(softmax Jacobian)입니다. 한 문서에 대해 이며, 여기서 는 개의 로짓(logit, 소프트맥스 이전 점수)으로 이루어진 벡터이고, 지수 는 를 로짓만큼 거듭제곱하여 어떤 실수 점수든 양수로 바꾸며, 색인 문자 는 세 주제에 걸쳐 있습니다. 3권의 어텐션 장은 몫의 법칙(quotient rule)으로 를 유도했으며, 여기서 는 크로네커 델타(Kronecker delta)로, 이면 이고 그 외에는 입니다. 모든 에 걸쳐 모으면 이 야코비안은 행렬 입니다. 여기서 는 의 성분들을 나머지가 모두 0인 행렬의 대각선에 놓은 것이고, 위첨자 은 전치(transpose, 열벡터를 옆으로 눕혀 행으로 바꾸는 것)를 표시하며, 외적(outer product) 는 행 열의 성분이 인 행렬입니다. 이를 연쇄 법칙(chain rule)으로 들어오는 행벡터 에 적용하면:
여기서 첫 번째 등식은 델타에서 합을 갈랐습니다( 항에서는 오직 만 살아남습니다). 셋째, 선형 층입니다. 문서 에 대해 이며, 여기서 는 가중치 행렬(주제 하나당 한 행, 특징 하나당 한 열)이고 는 길이 짜리 편향 벡터입니다. 성분별로 적으면, 가 두 특징 열을 가리키는 색인일 때 주제 의 로짓은 입니다. 가중치 성분 는 문서마다 정확히 한 곳, 그 문서의 주제 로짓에만 나타나고 거기서 이므로, 연쇄 법칙은 문서 하나당 기여 하나씩을 더합니다. 즉 입니다. 모든 에 대한 성분들을 행렬로 모으면 외적들의 합인 가 되고, 편향은 을 써서 같은 논증을 거치면 입니다. 이 세 연결 고리 모두 커밋된 코드이며, 주석 하나하나까지 그대로입니다(deepproblog_mini.py 268–285행):
p, g = query_prob_grad(REL_C, pi[i], pi[j])
...
dl_dp = (p - y) / (p * (1.0 - p))
dl_dpi[i] += dl_dp * g[:K]
dl_dpi[j] += dl_dp * g[K:]
...
dl_dz = pi * (dl_dpi - np.sum(dl_dpi * pi, axis=1, keepdims=True))
dw = dl_dz.T @ X
db = dl_dz.sum(axis=0)
두 개의 dl_dpi 줄은 세미링의 여섯 슬롯을 올바른 문서로 보냅니다. 슬롯 1–3은 A에 묶인 문서에, 슬롯 4–6은 B에 속합니다. 그리고 세미링 패스를 포함한 전체 연쇄는 전체 배치 손실에 대한 중심 차분으로 두 번째 검증을 받는데, 아홉 개의 매개변수(가중치 여섯 개, 편향 세 개) 전부에 대해 하나씩 흔들어 봅니다. 커밋된 최대 불일치는 같은 허용오차에 대해 입니다(deepproblog_mini.py 318–341행). 이 시스템이 훈련에 쓰는 경사는 무언가의 근사가 아닙니다. 그것은 정확한 추론의 도함수입니다.
함의를 통한 훈련: 논리가 레이블링 함수다
훈련은 이제 이 권에서 가장 평범한 순환에 지나지 않습니다. 전체 배치 경사 하강, 이며, 여기서 는 아홉 개 매개변수 전부(의 여섯 항목과 의 세 항목)를 모은 벡터이고, 학습률 으로 15개 쌍에 대해 에포크를 돕니다(deepproblog_mini.py 416–444행). 이 손실은 DeepProbLog가 함의로부터의 학습(learning from entailment)이라 부르는 것입니다. 훈련 예제는 질의와 그 목표 확률, 여기서는 쌍 레이블에 대비한 relevant(a, b)이며, 어떤 topic 원자에 대한 레이블도 결코 아닙니다 [1]. 커밋된 추적 기록은:
[6] training from pair labels alone (full-batch GD, lr=2.0, 400 epochs)
epoch loss pair acc hidden-topic acc
1 0.425199 86.67% 66.67%
25 0.004551 100.00% 100.00%
100 0.001134 100.00% 100.00%
200 0.000571 100.00% 100.00%
400 0.000287 100.00% 100.00%
첫 번째 행을 주의 깊게 읽어 보십시오. 훈련되지 않은 네트워크의 86.67% 쌍 정확도는 대부분 기저율(base rate)입니다. 열다섯 개의 초기 확률 중 열넷이 문턱 아래에 있으므로, 네트워크는 거의 모든 것을 무관하다고 부르며, 진짜로 무관한 12개 쌍과 우연히 문턱 위인 에서 시작하는 하나의 진짜 쌍 (m3, p2)에서 옳습니다. 중요한 숫자는 마지막 열입니다. 은닉 주제 정확도(hidden-topic accuracy)는 소프트맥스 argmax를 훈련이 결코 보지 못한 은닉 주제와 대조해 채점하되, 세 클래스의 가지 재레이블링에 대해 최댓값을 취합니다. 쌍 레이블은 주제 이름을 바꾸는 것에 대해 불변이며, 군집화를 오직 순열(permutation)까지만 못박을 수 있기 때문인데, 이는 원격 지도의 표준적인 레이블 전환 대칭(label-switching symmetry)입니다(deepproblog_mini.py 392–405행). 25번째 에포크에 이르면 100%가 되고 계속 그 상태를 유지합니다. 커밋된 출력의 중심부는:
m1 0.9996 0.0002 0.0002 class0 -> logic logic ok
m2 0.0001 0.0000 0.9999 class2 -> ml ml ok
m3 0.0002 0.9997 0.0001 class1 -> nesy nesy ok
p1 0.9999 0.0000 0.0001 class0 -> logic logic ok
p2 0.0000 0.9999 0.0001 class1 -> nesy nesy ok
p3 0.0002 0.0002 0.9996 class2 -> ml ml ok
hidden-topic accuracy: 100% — no topic label was ever shown to training
세 갈래 문서 분류기가 여섯 문서 전부에서 확신에 차 있고 정확하며, "이 둘은 함께 간다" 또는 "이 둘은 그렇지 않다"라고만 말한 감독자에 의해 훈련되었습니다. 훈련된 쌍 확률은 깔끔하게 나뉩니다. 3개의 참인 쌍에 대한 최솟값은 이고, 12개의 거짓인 쌍에 대한 최댓값은 이며, 둘 다 완벽한 주제 복원과 함께 단언됩니다(deepproblog_mini.py 531–535행).
왜 공로가 올바른 잠재 결정으로 돌아갈까요? 회로가 정확히 말해 줍니다. 에 대한 경사 슬롯은 입니다. 관련 있는 쌍에 대해서는 가 음수이므로(위 유도는 이고 가 1보다 작을 때 를 줍니다), 하강은 상대방이 이미 주제 를 얼마나 믿고 있는지에 비례하여 각 를 끌어올립니다. 두 문서는 현재 자신들의 일치를 가장 잘 설명하는 주제 쪽으로 서로를 끌어당기며, 소프트맥스 정규화는 "한 항목을 올린다"를 "나머지를 내린다"로 바꿉니다. 관련 없는 쌍에 대해서는 부호가 뒤집혀, 어떤 주제에 대한 일치든 상대방의 믿음에 비례하여 세금이 매겨집니다. 관측된 레이블을 설명하는 세계는 소프트맥스 항목이 강화되고, 그것에 모순되는 세계는 억제됩니다. 그리고 접지된 쌍 바깥의 원자들, 즉 나머지 네 문서의 주제 지시자들은 그 쌍의 회로에서 결코 잎으로 나타나지 않으므로, 그것들의 소프트맥스 출력은 정확히 0의 경사를 받습니다. 원격 지도가 여기서 작동하는 것은 논리 프로그램이 각 쌍 레이블을 정확히 그것을 만들어 낼 수 있었던 잠재 선택으로 보내기 때문입니다. 논리가 레이블링 함수이며, 정확한 추론이 그 장부 정리를 정직하게 지켜 줍니다.
MNIST 덧셈이라는 시금석
우리의 축소판은 이 분야의 정본이 되는 시연의 축소 모형입니다. 원래 실험에서 지각은 MNIST(Modified National Institute of Standards and Technology 손글씨 숫자 집합) 위의 합성곱 신경망이고, nAD는 이미지 하나당 10갈래 소프트맥스인 nn(m_digit, [X], [0..9]) :: digit(X, 0); ...; digit(X, 9)이며, 프로그램은 한 줄, addition(X, Y, Z) :- digit(X, X2), digit(Y, Y2), Z is X2 + Y2이고, 지도는 이미지 한 쌍과 그 합뿐이며 숫자 레이블은 결코 아닙니다 [1]. 이 구조는 우리 것에 항목별로 그대로 대응됩니다. 이미지 → 문서 특징, 숫자 분류기 → 주제 분류기, 합 레이블 → 관련성 레이블입니다. 그리고 저널판 표에 보고된 숫자들은 이 현상을 구체적으로 보여줍니다. 30,000개의 합-레이블 쌍으로부터 이 파이프라인은 한 자릿수 덧셈에서 97.2%의 테스트 정확도에 도달하며, 이는 두 이미지를 19가지 가능한 합 중 하나로 직접 사상하도록 훈련된 합성곱 기준선의 93.5%를 앞서고, 합 레이블은 우리의 쌍 레이블이 주제 선택지에 걸쳐 공로를 분배하는 것과 정확히 같은 방식으로 짜리 결합 숫자 선택지에 걸쳐 공로를 분배합니다 [2]. 이 시연은 계속 남는 요점을 만들어 냈습니다. 중간의 추론이 미분 가능하기만 하다면, 논리 프로그램은 값싼 과제 수준의 지도를 정밀한 기호 수준의 훈련 신호로 바꿀 수 있다는 것입니다.
규모의 장부
이 권이 지고 있는 정직함의 빚은 이렇습니다. 위의 모든 것은 정확하며, 정확함이 바로 비용 센터입니다. 각 훈련 단계는 질의를 접지하고, 접지된 논리식을 컴파일하고, 평가합니다. 컴파일은 최악의 경우가 지수적인 바로 그 지식 컴파일 단계이며, 접지 자체도 프로그램의 선택 공간을 곱으로 불려 냅니다. 우리의 회로는 6개의 변수와 22개의 엣지를 가집니다. 두 자릿수 MNIST 덧셈은 이미 예제 하나당 짜리 결합 선택 공간을 가지며, 정본으로 삼는 저널 원문이 보고하는 것은 병목이 신경망이 아니라 접지와 컴파일이라는 것, 즉 문제가 커질수록 그 비용이 함께 불어나 정확한 추론이 큰 문제에서는 감당할 수 없이 비싸진다는 것입니다 [2]. 그 벽의 구체적인 위치는 후속 연구들의 평가가 알려 줍니다. 정확한 파이프라인은 대략 네 자릿수 숫자의 MNIST 덧셈 부근에서 시간 초과로 멈춥니다 [5][6]. 각기 무언가를 맞바꾸는 탈출 노선들의 장부는 다음과 같습니다.
| 노선 | 지키는 것 | 포기하는 것 |
|---|---|---|
| 정확(이 장) | 참된 와 그 참된 경사 | 규모: 접지 + 컴파일이 폭발함 |
| top-k 증명 | 가장 그럴듯한 개의 증명만 회로에 들어감 | 버려진 증명들의 질량; 경사는 하한(lower bound)의 경사임 |
| 근사 / 상환된(amortized) 추론 | 규모, 미니배치 친화적 평가 | 정확성과 그 보장 |
| 유도 의미론(DeepStochLog) | 유도 숲(derivation forest) 위의 한 번의 패스, 파서 수준의 속도 [5] | 가능 세계 읽기: 확률이 세계가 아니라 유도에 붙음 |
top-k 노선은 Scallop 장이 이어받는 지점입니다. 세미링을 유지하고 미분 가능성을 유지하되, 프로버넌스(provenance)를 개의 최선 설명으로 상한을 두고 원칙 있는 근사를 받아들입니다. 유도 의미론 노선인 DeepStochLog는 의미론 자체를 바꿉니다. 확률이 가능 세계가 아니라 확률 문법 유도(stochastic-grammar derivation)에 붙으며, 이는 다르고 때로는 덜 자연스러운 확률적 읽기를 대가로 훨씬 더 빠른 추론을 사 옵니다 [5]. 이 장부의 어떤 노선도 바꾸지 않는 것은 이 장의 아키텍처입니다. 기호에 대해 가중치를 제안하는 네트워크, 그것들을 합성하는 프로그램, 그리고 예산이 허락하는 어떤 추론을 거치든 경사를 되돌려 나르는 세미링입니다.
아직 풀리지 않은 부분
훈련 손실은 전적으로 질의에 관한 것입니다. 에 대한 교차 엔트로피일 뿐, 에 대한 것은 결코 아닙니다. 그러므로 위의 완벽한 혼동 표(confusion table)는 인증된 결과가 아니라 운 좋은 결과입니다. 최적화기는 질의 확률을 옳게 만드는 어떤 소프트맥스 행동이든 자유롭게 찾아낼 수 있으며, 우리 것보다 더 풍부한 프로그램에서는 그런 행동이 여럿일 수 있습니다. 술어들이 서로의 역할을 흡수할 수 있고, 두 개의 잘못이 곱해져 옳은 것이 될 수 있으며, 모든 훈련 질의가 목표값에 자리 잡고 있는 동안에도 잠재 분류기가 체계적으로 잘못 보정될 수 있습니다. 정확한 경사 세미링의 어떤 것도 이를 막아 주지 않습니다. 정확성은 질의 손실의 경사를 보장할 뿐, 중간 기호들의 의미를 보장하지는 않습니다. 우리의 축소판은 구성상 이 문제를 피해 갑니다(레이블 전환 순열이 유일한 잔여 자유도이며, 모듈이 그것을 측정합니다). 그러나 그릇된 내부 이유로 옳은 모델이라는 일반적인 현상은 실재하며, 5권의 추론 지름길(reasoning-shortcuts) 장에서 그것을 기다리는 이름과 문헌이 있습니다. 두 번째로 열려 있는 전선은 의미론이 아니라 공학입니다. 정확한 추론은 배치화(batching)에 저항합니다. GPU(graphics processing unit, 그래픽 처리 장치)는 만 개의 동일한 밀집 연산을 원하지만, 컴파일된 회로는 질의마다 다른 불규칙하고 희소한 DAG(directed acyclic graph, 방향 비순환 그래프)이며, 이 분야는 이제야 비로소 여러 회로를 가속기 위에서 한 번에 평가하는 레이아웃을 짓고 있습니다. 그 실마리는 GPU 네이티브 장에서 KLay와 함께 다시 이어집니다.
왜 중요한가
이 장은 이 권의 논제를 가장 깨끗한 형태로 보여줍니다. 1부는 경사가 건너갈 수 있는 논리를 요구했고, 2부는 정확한 기계 장치, 즉 세계, 계수, 회로를 지었습니다. DeepProbLog는 그 기계 장치가 실제로 고리를 닫는다는 것, 지각 네트워크와 논리 프로그램이 어느 쪽도 자신의 본성을 내주지 않으면서 하나의 훈련 신호를 공유할 수 있다는 것을 보여주는 시연입니다. 논리는 크리스프(crisp)한 상태를 유지하고(프로그램, 접지, 회로 모두 정확합니다; 확률을 0/1로 두면 불 논리가 다시 나타나며, 이는 크리스프 극한 검사가 확인해 줍니다), 네트워크는 네트워크로 남으며(경사 하강으로 훈련되는 소프트맥스), 그 둘 사이의 인터페이스는 하나의 대수적 발상, 즉 곱셈이 곱의 법칙인 세미링입니다. 이 패턴은 이 사례를 훨씬 넘어서 일반화됩니다. 같은 쌍 트릭은 세미링으로 평가 가능한 어떤 구조든 미분하며, 이것이 바로 프로버넌스 다항식이 Scallop에서 데이터로그를 만날 때, 그리고 다음 장에서 회로가 손실 함수가 될 때 이 패턴이 다시 나타나는 이유입니다. 그리고 그것이 사 온 보상, 즉 정확한 추론을 통해 과제 수준의 레이블이 기호 수준의 분류기를 훈련시킨다는 것은, 정확히 5권이 영수증을 요구할 종류의 주장입니다. 답을 신뢰하려면 그 답이 왜 옳은지를 아는 것이 필요하며, 이 장의 유한차분 인증서와 세계 수준의 회계가 축소된 규모에서 그 영수증이 어떻게 생겼는지를 보여줍니다.
핵심 용어
- 신경 술어 / 신경 주석 논리합(Neural predicate / neural annotated disjunction, nAD): 확률이 네트워크의 출력인 확률적 사실 계열; 소프트맥스 헤드가 접지 원자들 사이의 상호 배타적 선택으로 선언된 것으로, AD의 합이 1이 되는 특수 경우이며, 그래서 정확히 하나의 원자만 성립합니다.
- 주석 논리합(Annotated disjunction, AD): 여러 헤드 사이의 확률적 선택을 위한 ProbLog의 구성 요소; 헤드 확률들의 합은 많아야 1이며, 남는 몫이 있다면 어떤 헤드도 발화하지 않는 결과로 갑니다.
- 범주형 지시자 부호화(Categorical indicator encoding): 선택지 하나당 하나의 불 지시자, 원-핫 세계 기술, 클래스 확률로 가중되는 양의 리터럴과 상수 1로 가중되는 부정 리터럴로 이루어져, 각 합법적 세계가 정확히 자신의 소프트맥스 질량을 실어 나릅니다.
- 경사 세미링(Gradient semiring): 쌍 위의 교환 세미링으로, 는 두 슬롯을 모두 더하고 입니다; 회로를 한 번 지나면 질의 확률과 그 정확한 경사가 돌아옵니다.
- 기댓값 세미링(Expectation semiring): 같은 쌍 구성이 원래 살던 서식지로, 매개변수 추정을 위해 기대 계수를 합-곱 재귀식을 통해 밀어 보냅니다.
- 함의로부터의 학습(Learning from entailment): (질의, 목표 확률) 예제로 훈련하며, 에 대한 교차 엔트로피를 씁니다; 프로그램의 중간 원자들은 직접적인 지도를 전혀 받지 않습니다.
- 원격 지도(Distant supervision): 관측 가능한 결과(관련성, 합)에 붙은 레이블이 그것들을 잇는 규칙을 통해 잠재 결정(주제, 숫자)을 훈련시킵니다.
- 레이블 전환 대칭(Label-switching symmetry): 원격 지도가 제거할 수 없는 잔여 자유도; 여기서는 쌍 레이블이 주제 군집화를 오직 주제 이름의 순열까지만 결정합니다.
- 중심 유한차분(Central finite difference): 수치 도함수 ; 다중선형 함수에 대해서는 반올림까지 정확하며, 여기서는 두 경사 단계 모두를 인증하는 오라클로 쓰입니다.
이 장이 이어지는 곳
DeepProbLog는 프로그램을 책임자로 둡니다. 네트워크는 잎 확률을 채워 넣고, 논리는 과제를 정의합니다. 다음 장은 그 관계를 뒤집습니다. 의미 손실과 제약 층에서는 네트워크가 예측을 책임지고, 논리는 정칙자(regularizer)가 됩니다. 회로로 컴파일된 제약이 네트워크 자신의 출력 확률 위에서 평가되고, 그 충족 확률의 음의 로그가 손실에 더해집니다. 같은 세계, 같은 가중 모델 계수, 같은 컴파일된 회로이지만 반대 방향을 가리킵니다. "프로그램의 답이 옳게 나오도록 지각을 학습하라"가 아니라 "제약이 계속 충족되도록 예측을 학습하라"는 것입니다.
짝이 되는 코드: examples/integration/deepproblog_mini.py는 examples/integration/circuit.py의 회로 컴파일러 위에서 신경 술어, 원-핫 접지, 경사 세미링, 두 유한차분 인증, 그리고 원격 지도 훈련 순환을 구현합니다. python3 examples/integration/deepproblog_mini.py를 실행하면 이 장의 모든 숫자를 재현할 수 있습니다; 이 실행은 결정론적이며 모든 주장은 assert로 지켜집니다.