의미 손실과 제약 계층
📍 현재 위치: 3부 · 미분 가능 프레임워크 — 8장. DeepProbLog는 신경망을 논리 프로그램 아래에 두고 정확한 추론을 통해 학습시켰습니다; 이 장은 같은 회로 기계 장치를 평범한 지도 학습에 겨냥하는데, 여기서 논리는 네트워크 위에 놓인 프로그램이 아니라 네트워크 자신의 출력에 대한 제약입니다.
2부는 논리적 질의의 확률을 계산하는 파이프라인을 만들었습니다: 가능 세계, 가중 모델 계수, 컴파일된 회로, 그리고 같은 패스를 타고 함께 흐르는 경사입니다. 지금까지의 모든 쓰임은 그 파이프라인을 지식 베이스를 향해 겨누었습니다. 이 장은 훨씬 더 평범한 무언가를 겨눕니다: 바로 분류기입니다. 여러분은 여러 개의 출력 유닛을 가진 네트워크를 학습시키고 있으며, 어떤 개별 레이블도 말해 주지 않는 출력 공간에 관한 무언가를 알고 있습니다. 클래스 비트 가운데 정확히 하나만 켜져야 합니다. neuro-symbolic으로 표시된 논문은 logic으로도 표시되어야 합니다. 그 지식은 출력 변수들에 대한 하나의 명제 논리식이며, 문제는 경사로 학습되는 모델 안 어디에서 그런 논리식이 들어올 수 있느냐입니다. 여기서 전개하는 답은 의미 손실(semantic loss)입니다: 제약은, 네트워크 자신의 출력을 독립적인 동전 던지기로 읽었을 때 그 결과가 제약을 충족하는 상태에 떨어질 확률의 음의 로그와 같은 미분 가능한 벌점이 됩니다. 그 정의는 짧고, 세 개의 자연스러운 공리를 충족하는 유일한 것임이 증명 가능하며, 이미 상 위에 올라와 있는 가중 모델 계수 기계 장치만으로 정확히 계산할 수 있습니다. 마지막에는 축을 뒤집습니다: 손실은 위반을 비싸게 만들고, 제약 계층(constraint layer)은 위반을 불가능하게 만들며, 둘 다 같은 양에 값을 매깁니다.
객관식 답안지를 채우는 학생을 상상해 보십시오. 각 행마다 정답 버블은 하나뿐입니다. 어깨너머로 채점하는 튜터는 몇몇 행에 대해서만 정답지를 갖고 있습니다. 하지만 그 튜터는 모든 행에 대해 여전히 쓸모 있는 말을 할 수 있습니다. 버블 두 개가 칠해진 행은 정답지가 무엇을 말하든 틀린 것이고, 아예 비어 있는 행도 마찬가지로 틀린 것입니다. 그래서 튜터는 두 종류의 벌점을 매깁니다: 몇 안 되는 정답지가 있는 행에는 "그 답은 정답지와 모순된다"는 벌점을, 모든 행에는 "그 답은 형식과 모순된다"는 벌점을 매깁니다. 시간이 지나면 형식 벌점 하나만으로도 학생은 결단력 있고 일관되게 답하게 되고, 몇 안 되는 정답지가 있는 행들이 어떤 결단력 있는 답이 옳은지를 고정해 줍니다. 의미 손실은 이 형식 벌점을 미분 가능하게 만든 것입니다. 이 장의 끝에 나오는 제약 계층은 더 엄격한 튜터입니다: 한 행에 버블 두 개를 칠하는 것이 물리적으로 불가능하도록 답안지 자체를 다시 설계합니다.
이 장에서 다루는 내용
- 설계 문제: 출력 공간에 대한 제약 α를 알고 있을 때, 세 개의 문이 그것을 경사로 학습되는 모델 안으로 들여보내 줍니다(퍼지 벌점, 확률적 손실, 딱딱한 계층). 순진한 네 번째 문, 즉 argmax의 위반에 벌점을 매기는 방법은 미분의 수학 그 자체에 의해 닫혀 있습니다.
- 정의, 해독한 다음 정식화: 의미 손실 , 여기서 WMC는 2부의 가중 모델 계수입니다: 이는 네트워크의 변수별 시그모이드로부터 충족 상태를 표집할 자기정보이며, 원 논문의 소프트맥스가 아닌 시그모이드 출력 층이 왜 하중을 떠받치는지도 함께 다룹니다.
- 세 공리, 하나의 손실: 함의 아래에서의 단조성, 어떤 상태가 자기 자신에 대해서는 비용이 0이라는 것, 그리고 단일 리터럴에 대한 교차 엔트로피와의 비례성이 그 정의를 (원 논문이 덧붙이는 정칙성 조건이 주어졌을 때) 상수배까지 유일하게 고정하며, 구문 독립성은 또 하나의 공리가 아니라 유도된 보증으로 도착합니다; 그 조건들 자체는 커밋된 코드로 검사됩니다.
- 하나만-참, 처음부터 끝까지 상세히 다룹니다: 가중 모델 계수는 닫힌 형식 로 무너지고, 경사는 항별로 유도되며, 구체적인 한 점에서 수치적으로 그 자취를 따라가고, 중심 유한 차분과 대조하여 3.6e-11까지 인증됩니다.
- 일반 레시피: 임의의 제약은 회로 장의 회로로 단 한 번 컴파일됩니다; 순방향 패스는 WMC이고, 역방향 패스는 경사 세미링 아래에서 평가되는 같은 회로이며, 손실과 경사는 배치당 회로 크기에 대해 선형입니다(한 번의 패스로 값과 경사 쌍을 평가하는 방식은 노드마다 경사 벡터를 실어 나르므로, 출력 비트 개수만큼의 계수가 붙습니다).
- 커밋된 실험: 레이블 있는 점 12개, 레이블 없는 점 180개, 그리고 하나의 하나만-참 제약입니다; 교차 엔트로피 단독과 교차 엔트로피 더하기 의미 손실을 정확도와 제약-위반율로 비교합니다.
- 손실 대 계층: 훈련 중에 위반에 벌점을 매기는 것과 테스트 시점에 위반을 재정규화하여 없애 버리는 것 사이의 설계 갈림길이며, 의미 확률 계층과 위계 계층을 구성적 대안으로 제시하고, 그 트레이드오프에 값을 매기는 표 하나로 마무리합니다.
세 개의 문, 그리고 열리지 않을 하나
설정을 정확히 고정해 둡시다. 네트워크는 개의 출력 유닛으로 끝나는데, 여기서 는 레이블의 개수입니다; 이 장에서는 이고, 세 레이블은 학술 세계의 주제인 logic, ml, nesy로, 3권의 kg.py에서 그대로 들여와 다시 타이핑하지 않은 것입니다(semantic_loss.py 87–89행). 각 유닛에 불 출력 변수(Boolean output variable) 를 붙입니다. 이는 참과 거짓 두 값만을 취하는 변수로서, "네트워크가 레이블 를 주장한다"라고 읽습니다. 제약(constraint) 는 에 대한 하나의 명제 논리식입니다: 주제 하나만 켜져 있다 또는 nesy로 표시된 논문은 logic으로도 표시된다와 같은 것입니다. 설계 문제는 네트워크의 매개변수 (경사 하강이 갱신하는 가중치와 편향)의 학습 안 어디에 가 들어갈 수 있느냐입니다.
솔깃한 첫 번째 답은 이산적인 예측 위에 벌점을 나사로 고정하는 것입니다: 출력을 argmax(가장 큰 출력의 인덱스)로 디코딩하거나 각 유닛을 에서 임계값 처리하여 하드 레이블로 바꾸고, 디코딩된 레이블이 를 위반할 때마다 벌금을 매기는 방법입니다. 이 방법이 실패하는 방식들을 세어 봅시다. 첫째, 연속적인 출력에서 argmax로 가는 사상은 구간별 상수(piecewise constant)입니다: 출력을 조금 흔들어도 승자 인덱스는 바뀌지 않으므로, 벌점의 출력에 대한 도함수는 거의 모든 점에서 0입니다. 둘째, argmax가 실제로 바뀌는 경계점에서는 벌점이 불연속적으로 튀어 오르므로, 그곳에서는 도함수가 아예 존재하지 않습니다. 셋째, 위반 검사 자체가 0-1 지시자, 즉 첫 번째 것 위에 쌓인 또 하나의 계단 함수입니다. 연쇄 법칙은 이 단계들을 곱하고, 0인 인자가 하나라도 있는 곱은 0입니다: 가 무엇을 하든, 벌점의 경사는 정의되는 곳마다 입니다. 오직 경사를 통해서만 세상을 보는 경사 하강법은 그런 벌점에 대해 구조적으로 눈이 멉니다. 쓸 만한 설계라면 어떤 디코딩도 거치기 전에, 를 연속적인 출력에 결합시켜야 합니다.
세 개의 문이 정확히 그 일을 하며, 이 권은 그 셋 모두를 거쳐 갑니다. 퍼지 문(fuzzy door)은 1부의 것입니다: 각 출력 를 참의 정도로 읽고, AND(), OR(), NOT(¬)을 t-노름 연산자로 바꾸어 를 안의 수로 평가한 다음, 에서 모자란 만큼을 벌점으로 매깁니다. 이는 미분 가능하지만, 벌점의 값은 어떤 t-노름을 골랐는지와 논리식이 마침 어떻게 쓰였는지에 따라 달라집니다. 확률적 문(probabilistic door)은 이 장의 것입니다: 출력을 독립적인 불 변수들의 확률로 읽고, 가 성립할 확률의 음의 로그를 네트워크에 부과합니다 [1]. 구조적 문(structural door)은 마지막 장의 것입니다: 손실이 아니라 모델 자체를 바꾸어, 네트워크가 의 충족 상태들에 대한 분포만을 내놓을 수 있는 계층으로 끝나게 하며, 그러면 위반은 억제되는 것이 아니라 아예 불가능해집니다 [2].
정의: 충족 상태를 표집하는 놀라움
논리식보다 먼저 확률적 읽기를 해독해 둡시다. 네트워크의 출력 층은 개의 로짓(logit, 시그모이드 이전의 원출력 수치, 레이블당 하나씩) 각각에 독립적으로 시그모이드(sigmoid) 를 적용하여, 각 인 를 만들어 냅니다; 여기서 는 지수함수(exponential function), 즉 오일러 수 을 부호를 뒤집은 로짓 만큼 거듭제곱한 것이므로, 크게 양수인 로짓은 를 0으로, 를 로 몰아갑니다. 각 를 독립적인 동전 하나의 매개변수로 다룹니다: 개의 동전을 모두 던지면, 그 결과는 모든 출력 변수에 참(1) 또는 거짓(0)을 배정한 상태(state) 입니다. 독립성 아래에서, 특정 상태의 확률은 그 좌표별 확률들의 곱입니다,
여기서 지수 트릭은 그저 올바른 인자를 골라낼 뿐입니다: 좌표 는 일 때 를 기여하고 일 때 를 기여합니다. 논리식 가 참인 상태들을 (기호 는 "충족한다"라고 읽습니다)라고 쓰며, 이들이 의 모델(model)입니다. 의미 손실(semantic loss)은 표집된 상태가 모델일 총확률의 음의 로그입니다 [1]:
이제 이 합을 2부의 눈으로 바라봅시다. 논리식의 모델들에 대한 합으로서, 변수별 가중치들의 곱이며 리터럴 에는 가중치 를, 리터럴 에는 가중치 를 부여하는 이것은, 가중 모델 계수 장의 가중 모델 계수(weighted model count) 그 자체와 글자 그대로 같습니다. 이 정의에는 새로운 기계 장치가 전혀 없습니다:
정보 이론적 읽기가 이 손실에 그 성격을 부여합니다: 확률의 는 그 사건의 자기정보(self-information), 즉 그것을 관측하는 놀라움입니다(자연로그의 단위인 나트(nat)로 측정합니다). 의미 손실은 네트워크 자신의 출력을, 좌표별로 표집했을 때, 제약을 충족한다는 사실에 대한 네트워크 자신의 놀라움입니다. 이미 충족 상태를 확신하는 네트워크는 아무런 놀라움도 느끼지 않고 아무것도 치르지 않습니다; 출력이 충족을 있음직하지 않게 만드는 네트워크는 무겁게 치릅니다; 출력이 충족을 불가능하게 만드는 네트워크는 무한히 치러야 할 것이며, 이것이 바로 구현이 로그를 취하기 전에 계수를 에서 잘라내는(clamp) 이유입니다(semantic_loss.py 107행 및 161–165행):
def semantic_loss(P: np.ndarray) -> np.ndarray:
"""L^s(α₁, p) = −log WMC(α₁; p), batched; the log is clamped at CLAMP so
a crisply violating p (WMC = 0) prints a large finite loss instead of raising —
a numerical-stability guard the paper's released code omits (it takes tf.log of the raw count)."""
return -np.log(np.maximum(exactly_one_wmc(P), CLAMP))
구현상의 한 가지 선택은 하중을 떠받치고 있어 소리 내어 말해 둘 가치가 있습니다: 출력 층은 소프트맥스가 아니라 개의 시그모이드이며, 이는 원 논문 시스템의 준지도 학습 코드와 정확히 같습니다 [1](컴패니언의 독스트링이 이를 semantic_loss.py 17–19행에 기록해 둡니다). 소프트맥스는 이미 그 자체로 하나의 범주형 분포입니다: 거기서 표집하면 하나의 클래스가 나오는데, 이는 원-핫 상태에 대응하며, 자동으로 하나만-참을 충족합니다. 소프트맥스 읽기 아래에서는 충족 상태에 실린 질량이 이고, 손실은 항등적으로 이며, 제약이 내줄 경사가 없습니다. 제약을 내용 있게 만드는 것은 독립적인 시그모이드입니다: 동전들은 클래스 0개에 떨어질 수도, 2개에 떨어질 수도 있으며, 손실은 정확히 그 가능성에 값을 매기기 위해 존재합니다. 시그모이드 읽기는 또한 일반화됩니다: 여러 비트가 정당하게 켜질 수 있고 제약이 레이블들 사이의 함의인 다중 레이블 설정에서도 전혀 바뀔 필요가 없습니다.
커밋된 실행은 세 개의 주제 비트에 대한 하나만-참 제약 에 대해, 손으로 읽을 수 있는 네 개의 출력 벡터 위에서 손실을 평가하는 것으로 시작합니다:
[1] exactly-one in closed form: WMC(α₁; p) = Σ_i p_i Π_{j≠i}(1 − p_j)
p = (logic, ml, nesy) WMC(α₁;p) L^s = −log WMC
one-hot (1.0, 0.0, 0.0) 1.000000 0.000000 Axiom 2: satisfying state, zero loss
uniform (0.5, 0.5, 0.5) 0.375000 0.980829
two-hot (1.0, 1.0, 0.0) 0.000000 27.631021 crisp violation: loss = −log(clamp)
mixed (0.2, 0.5, 0.9) 0.410000 0.891598
각 행은 손으로 검산할 수 있으며, 다다음 절에서 가운데 열을 계산한 닫힌 형식을 유도합니다. 원-핫 행은 자신의 모든 질량을 하나의 모델 위에 놓으므로, 계수는 이고 손실은 입니다. 균등 행은 질량을 개의 모든 상태에 고르게 펼치는데, 그중 세 개가 모델이고 각각의 질량은 입니다: 계수는 입니다. 투-핫 행은 크리스프 위반(crisp violation)입니다: 어떤 모델도 질량을 전혀 받지 못하고, 계수는 정확히 이며, 클램프는 무한한 벌점을 로 바꿔 놓습니다. 혼합 행이야말로 실제 훈련이 사는 곳이며, 우리는 그곳으로 두 번 돌아옵니다.
의미 손실은 네트워크 자신의 시그모이드가 제약의 모델들 위에 놓는 확률 질량의 −log를 부과합니다; 하나의 컴파일된 회로가 그 질량과 그 경사를 단 한 번의 패스로 계산하며, 마지막 갈림길은 위반하는 질량에 벌점을 매기는 것(손실)과 그것을 재정규화하여 없애 버리는 것(계층) 사이에서 선택합니다.
저자가 AI의 도움을 받아 직접 제작한 원본 도해.
세 공리, 하나의 손실
왜 다른 벌점이 아니라 이 벌점인가? 미분 가능한 함수들 가운데 충족 상태에서는 0이 되고 위반 상태에서는 커지는 것은 많이 있으며, 퍼지 문 하나만으로도 메뉴 전체가 나옵니다. 의미 손실의 답은 공리적인 것입니다: 어떤 합리적인 제약 손실이든 반드시 해야 할 일을 진술하고, 그 공리들이 다른 선택의 여지를 남기지 않는다는 것을 증명하는 것입니다 [1]. 원 논문의 본문은 세 개의 실질적인 공리에 미분가능성 공리 하나를 더해 진술하며, 그 부록은 유일성 정리를 위해 (독립적인 문장들에 걸친 가산성 등) 정칙성 공리를 더 추가합니다; 구문 독립성은 그런 다음 가정되는 것이 아니라 유도됩니다. 다음은 세 개의 실질적 공리와 유도된 보증이며, 각각을 먼저 평이한 언어로 적고 유도된 것은 표시해 두었습니다.
| 조건 | 평이한 진술 | 무엇을 고정하는가 |
|---|---|---|
| 공리 1: 단조성 | 더 엄격한 제약은 결코 비용을 덜 치를 수 없다: (즉 를 충족하는 모든 상태가 도 충족한다)이면 | 손실은 반드시 제약들을 그 모델 집합으로 순서 매겨야 하며, 절을 추가하면 보상을 주는 벌점을 배제한다 |
| 공리 2: 항등성 | 어떤 상태는 자기 자신에 대해서는 비용이 0이다: 모든 상태 에 대해 이며, 이는 를 그 자신의 한-모델 제약으로 읽은 것이다 | 0을 고정한다: 성공에 대한 유령 벌점이 없다(공리 1 및 부록의 진리 공리와 결합하면 이는 모든 충족 상태에서 손실이 0이라는 것으로 확장되는데, 이는 컴패니언이 단언하는 형태이다) |
| 공리 3: 리터럴에 대한 교차 엔트로피 | 가장 단순한 제약, 즉 단일 리터럴 에 대해서는 손실이 보통의 교차 엔트로피 에 비례한다 | 함수 형태를 고정한다: 로그는 여기서 들어오며, 그와 함께 상수 도 들어온다 |
| 유도됨: 구문 독립성 | 논리적으로 동치인 논리식들은 동일한 손실을 받는다: 은 오직 어떤 상태들이 를 충족하는지에만 달려 있으며, 가 어떻게 쓰였는지에는 결코 달려 있지 않다 | 원 논문의 명제 2이며, 별도의 공리가 아니다: 상호 함의의 양방향으로 실행된 단조성이 동일한 손실을 강제하며, 이것이 바로 값이 표기에 따라 달라지는 모든 t-노름 평가를 배제하는 이유이다 |
정리는 이 세 공리(원 논문의 미분가능성 공리, 그리고 독립적인 문장들에 걸친 가산성과 진리 공리(Truth axiom, 동어반복에 대한 손실 0) 같은 부록의 추가 정칙성 조건과 더불어)가 정확히 하나의 계열만을 허용한다는 것입니다: 이들을 만족하는 모든 손실은 양의 상수 에 대해 입니다 [1]. 증명을 여기서 재현하지는 않습니다; 그것은 원 논문의 부록에 있으며, 우리에게 정직한 내용은 공리들과 각 공리가 무엇을 제거하는가입니다. 단조성 하나만으로 이미 강제되는 것부터 시작합시다. 와 가 논리적으로 동치이면, 각각이 서로를 함의합니다; 공리를 양방향으로 적용하면 와 가 나오고, 서로 반대인 두 부등식은 등식을 강제합니다. 이것이 명제 2, 구문 독립성입니다: 손실은 오직 (의 모델 집합, )라는 쌍만의 함수이므로, 상태들의 질량만을 소비할 수 있을 뿐 논리식의 모양은 결코 소비할 수 없습니다. 항등성은 0을 고정하며, 이를 단조성과 결합하면 유도된 충족 성질이 나옵니다: 상태 가 를 충족하면, 를 이름 짓는 리터럴들의 논리곱이 를 함의하므로, 단조성은 를 주고, 공리 2는 이를 0으로 만듭니다. 전제 하나, 즉 비음성이 더 있어야 논증이 닫히는데, 이는 곧바로 가정되는 것이 아니라 유도되는 것입니다: 부록의 진리 공리는 이라고 정하고(모든 상태가 충족하는 동어반복은 아무 비용도 치르지 않습니다), 모든 논리식 는 참을 함의하므로, 단조성은 모든 에서 을 줍니다; 이것이 원 논문의 명제 7입니다. 방금 유도한 상계 과 결합하면, 두 부등식은 을 강제합니다. 그러면 리터럴 공리가 단일 변수 계열 위에서 함수를 고정합니다: 에 대해 충족 상태는 인 모든 이며, 그 총 질량은 인수분해됩니다. 인 개의 충족 상태를 남은 자유 비트들에 따라 묶으면, 분배법칙이 곱들의 합을 합들의 곱으로 바꾸어 놓으며, 나머지 좌표마다 인자 이 하나씩 나옵니다:
그러므로 리터럴에 대해 교차 엔트로피 에 비례할 것을 요구하는 것은 정확히 그곳에서 에 비례할 것을 요구하는 것과 같습니다. 단조성은 이 형태를 모든 논리식으로 일관되게 확장합니다: 더 엄격한 제약은 모델의 부분집합을 가지므로, 질량은 많아야 그만큼이고, 따라서 는 적어도 그만큼이며, 이는 정확히 공리가 손실이 어떻게 행동해야 한다고 말하는 바입니다.
컴패니언은 공리들을 산문으로만 남겨 두기를 거부합니다: 셋 중 둘에 유도된 보증까지 더해 코드로 실행됩니다. 항등성은, 그 유도된 충족-상태 형태로, 위 표의 원-핫 행이며, semantic_loss.py 446–448행에서 단언됩니다. 구문 독립성은 명제 2로서 검사되는데, 을 회로로 컴파일하여(같은 의미에 대한 다른 구문) 값과 경사 모두에서 까지 닫힌 형식을 되찾으라고 요구함으로써 이루어집니다; 커밋된 실행은 의 일치를 보고합니다(461–469행). 단조성은 논리곱 (하나만-참 주제 그리고 다다음 절의 nesy가-logic을-함의하는 위계)를 만들어 검사되는데, 이는 두 논리곱 항 모두를 함의하며, 다섯 개의 무작위 에서 를 단언합니다(488–495행):
Axiom 1 (monotonicity), α₃ ⊨ α₁ and α₃ ⊨ α₂, at 5 random p:
e.g. p = (0.285, 0.319, 0.783): L^s(α₃) = 2.3893 ≥ L^s(α₁) = 0.7491, L^s(α₂) = 0.8195
하나만-참, 무너뜨리고 미분하기
주력 제약에 대해서는 일반적인 합이 컴파일러를 필요로 하지 않는데, 모델들을 나열할 수 있기 때문입니다. 개의 비트에 대한 하나만-참(exactly-one) 제약 은 정확히 개의 원-핫(one-hot) 상태 에 의해 충족되며, 여기서 는 비트 만 켜지고 나머지 모든 비트가 꺼진 상태입니다. 곱 공식을 모델 위에서 평가해 봅시다: 좌표 는 참이며 를 기여하고; 인 모든 좌표는 거짓이며 를 기여합니다. 개의 모델 질량을 합하면, 가중 모델 계수는 개가 아니라 개의 항을 가진 닫힌 형식으로 무너집니다:
이것이 exactly_one_wmc가 계산하는 것으로, 각 곱 을 나눗셈이 아니라 열 를 제외하는 방식으로 만들어, 이 0을 0으로 나누는 일을 만들어 낼 수 없게 합니다(semantic_loss.py 118–128행). 표의 행들은 그로부터 따라 나옵니다: 균등한 점에서는 각 항이 이고, 세 항을 더하면 가 됩니다; 혼합된 점 에서는,
인쇄된 과 에 들어맞습니다.
이제 손으로, 항별로 경사를 구해 봅시다. (비트 의 꺼짐-확률)로 줄여 쓰고, 우리가 미분하려는 좌표 을 고정합니다. 어떤 항이 인덱스 을 갖는지에 따라 합을 나눕니다. 인 항은 입니다: 이는 에 대해 선형이며 계수는 이므로, 그 도함수는 그 계수입니다. 인 다른 모든 항은 단 하나의 인자 을 통해서만 을 담고 있습니다: 이를 로 쓰고 을 쓰면, 그 도함수는 입니다. 양수인 조각 하나와 음수인 조각 개를 더하면:
손실은 고리 하나를 더 보탭니다. 인 에 대해, 바깥쪽 도함수는 이므로, 연쇄 법칙은 다음을 줍니다
두 공식은 이 유도 과정을 독스트링에 담은 채로 semantic_loss.py 131–158행(exactly_one_wmc_grad)과 168–174행(semantic_loss_grad)에 그대로 옮겨져 있습니다. 인 혼합된 점에서 모든 곱을 계산하며 그 자취를 따라가 봅시다:
그리고 로 나누면 가 나옵니다. 다음으로 넘어가기 전에 그 방향을 읽어 두어야 하는데, 이는 솔깃한 직관 하나를 바로잡아 주기 때문입니다. 세 편미분 모두 양수이므로, 하강 스텝 (여기서 는 스텝 크기(학습률)이고 경사 는 방금 계산한 세 편미분으로 이루어진 벡터입니다)는 세 확률 모두를 낮추는데, 모호한 를 가장 빨리 낮추고, 자신 있는 조차 조금 낮춥니다. 경사가 말하는 것은 "좌표별로 가장 가까운 원-핫을 향해 움직여라"가 아니라 "충족 질량을 늘려라"이며, 이 지점에서 를 더 올리는 것은 오히려 질량을 깎아 먹을 것인데, 왜냐하면 그것이 logic 모델과 ml 모델 안의 인자를, nesy 모델을 키우는 것보다 더 빠르게 0을 향해 곱해 내리기 때문입니다. 경쟁하는 비트들이 일단 잠잠해지고 나면(예컨대 에서는 같은 공식이 을 줍니다), 부호가 뒤집혀 하강은 를 까지 밀어 올립니다: 먼저 경쟁자들을 잠재우고, 그다음에 결단합니다. 손실은 소프트 argmax를 한 번도 계산하지 않고도 그것을 안무합니다.
손으로 한 유도는 독립적인 오라클을 이겨 내야 신뢰를 얻습니다. 컴패니언은 이 장의 모든 해석적 경사를, 도함수 정의의 대칭 형태인 중심 유한 차분(central finite difference)과 대조하여 인증합니다: 각 좌표에 대해 로 를 계산하며, 이는 차수까지 정확합니다(semantic_loss.py 177–187행), 그리고 모든 검사는 이내로 일치할 것을 요구받습니다(105행). 커밋된 실행은 다음을 보고합니다:
[2] gradient certificates: analytic vs central differences (h = 1e-5)
exactly-one ∂L^s/∂p, 5 random p max|Δ| = 3.59e-11 PASS (≤ 1e-6)
implication ∂L^s/∂p via the circuit, 6 p max|Δ| = 1.12e-09 PASS (≤ 1e-6)
MLP backprop ∂(CE + w·L^s)/∂θ, 12 coords max|Δ| = 6.34e-11 PASS (≤ 1e-6)
첫 번째 줄은 위의 유도이며, 다섯 개의 무작위 내부 점에서 수치 오라클과 까지 일치합니다. 두 번째와 세 번째 줄은 다음 두 절에 속합니다.
일반 레시피: 한 번 컴파일하고, 순방향으로 계수하고, 역방향으로 미분하기
하나만-참은 친절했습니다: 그 모델들을 나열할 수 있었기 때문입니다. 일반적인 는 친절하지 않습니다. 를 정의하는 합은 최대 개의 상태에 걸쳐 있으며, 가중 모델 계수 장은 그것을 원 논리식 위에서 계산하는 일이 #P-완전임을 밝혔습니다. 탈출로는 회로 장이 지은 바로 그것입니다: 를 오프라인에서 단 한 번 매끄러운 결정론적 분해 가능 회로로 컴파일하면, 그 이후로는 모든 평가가 단 한 번의 상향 패스, 즉 엣지당 하나의 세미링 연산이 됩니다. 원 논문 시스템은 자신의 제약을 문장 결정 다이어그램(SDD, Sentential Decision Diagram)으로 컴파일하며, 미리 컴파일된 채로 배포되어 PyPSDD 라이브러리를 통해 평가됩니다 [1]; 컴패니언은 회로 장이 코드로 검사한 구조적 보증(분해 가능성, 결정성, 매끄러움)을 갖춘 섀넌 전개 컴파일러인 circuit.compile(circuit.py 322–332행)로 이를 대신하며, semantic_loss.py는 자신이 컴파일하는 모든 제약에 대해 이를 다시 검사합니다(418–427행).
순방향 패스는 계수입니다: 잎 가중치 를 가진 확률 세미링 아래에서 회로를 평가하면, 루트 값이 이며, 그 비용은 정확히 회로 엣지당 연산 하나입니다(circuit.py 336–366행; 하니스는 ops == edges를 단언합니다). 역방향 패스는 같은 회로를 한 번 더, DeepProbLog가 정확한 추론을 미분하는 데 썼던 장치인 쌍 위의 경사 세미링(gradient semiring) 아래에서 평가하는 것입니다. 그 두 연산은 미적분의 합의 법칙과 곱의 법칙을 하나의 대수로 얼려 둔 것입니다:
잎에는 와 라는 이름표가 붙는데, 여기서 는 좌표 에 을 갖고 나머지는 0인 표준기저 벡터로, 과 을 부호화합니다(semantic_loss.py 206–234행). 그러면 한 번의 패스가 계수와 그 전체 경사를 함께 돌려주며, 로그를 거치는 연쇄 법칙이 손실을 완성합니다(semantic_loss.py 237–247행):
def circuit_sl(circ, p: np.ndarray) -> tuple[float, float, np.ndarray]:
"""The general semantic-loss recipe on a compiled circuit: ONE
gradient-semiring pass gives WMC(α; p) and ∇_p WMC, then the chain rule
through the −log (as in ``semantic_loss_grad``) gives the loss gradient:
L^s = −log WMC, ∂L^s/∂p = −(∇_p WMC) / WMC .
Returns (L^s, WMC, ∂L^s/∂p)."""
wmc, g = evaluate(circ, grad_weights(p), GRAD)
wmc = max(wmc, CLAMP)
return -math.log(wmc), wmc, -g / wmc
시연용 제약은 이어져 온 예시 자신의 레이블 위계입니다: , 즉 "neuro-symbolic으로 표시된 논문은 logic으로도 표시되어야 한다"이며, 이는 논리합 로 쓰입니다(semantic_loss.py 203행). 이것의 계수 역시 손으로 셈할 수 있는 오라클을 갖고 있으며, 함의는 어디에서나 되풀이되므로 유도해 둘 가치가 있습니다. 함의를 위반하는 비트 패턴은 정확히 하나뿐입니다: 전건이 참이고 후건이 거짓인 경우입니다. 세 비트에 걸쳐 위반 상태는 이고 이며 은 자유인 두 개의 상태이며, 이들의 결합 질량은 자유 비트에 대해 인수분해됩니다:
그러므로 이며, 이 곱을 항별로 미분하면 , , 가 나옵니다(semantic_loss.py 250–272행). 커밋된 실행은 세 제약 모두를 컴파일하고, 그 구조를 인증한 다음, 회로를 두 오라클 모두와 맞세웁니다:
[3] the general recipe: compile α once, then WMC + ∇WMC in ONE pass
(gradient semiring over pairs (v, ∇v), as in deepproblog_mini.py;
every circuit passed decomposability/determinism/smoothness checks)
constraint vars terms nodes edges AND OR 2^n enum
α₁ exactly-one 3 3 12 13 4 2 8
α₂ nesy → logic 2 2 8 8 2 2 4
α₃ = α₁ ∧ α₂ 3 2 8 8 2 1 8
Proposition 2 (syntax independence): compiled α₁ == closed form,
value and gradient, max|Δ| = 2.22e-16 (≤ 1e-12)
the exhibit: p = (0.2, 0.5, 0.9) — 90% nesy but only 20% logic
WMC(α₂; p) = 1 − p_nesy·(1 − p_logic) = 1 − 0.9·0.8 = 0.280000
L^s(α₂, p) = −log 0.28 = 1.272966
∂L^s/∂p = (-3.2143, +0.0000, +2.8571)
descent pushes p_logic UP, p_nesy DOWN, never touches p_ml —
the constraint's meaning, read straight off the gradient
전시물을 유도와 맞대어 검산해 봅시다: 손실의 경사는 이므로, 그 logic 좌표는 이고(음의 편미분이므로 하강은 를 끌어올립니다), 그 nesy 좌표는 이며(하강은 를 낮춥니다), 그 ml 좌표는 정확히 0인데, 하니스는 이를 허용오차가 아니라 항등식으로 단언합니다(semantic_loss.py 484행): 어떤 변수도 언급하지 않는 제약은 그 변수를 결코 움직일 수 없습니다. 네트워크는 nesy에 대해 90퍼센트, logic에 대해 20퍼센트 확신하고 있었습니다; 손실은 양쪽에서 동시에 그것을 정합성 쪽으로 밀어붙입니다. 회로의 경사는 또한 회로 평가 자체를 거쳐 밀어붙인 중심 유한 차분과 까지 일치하며, 이는 앞서 인용한 두 번째 인증 줄입니다.
복잡도 장부를, 정직하게 진술해 둡시다. 컴파일은 훈련 전에 제약마다 한 번 일어나며, 비용이 드는 단계입니다: 컴파일된 회로는 최악의 경우 지수적으로 커질 수 있으며, 적대적인 제약에 대해서는 실제로 그렇게 될 것입니다. 하지만 제약은 훈련 도중에 바뀌지 않으므로, 그 비용은 오프라인에서 정확히 한 번 치러집니다. 그 이후로는 각 배치의 각 예제가 값쌉니다: 회로에 대한 두 번의 스칼라 패스(상향 평가 한 번, 그다음 하향 역전파 한 번)가 손실과 개의 편미분 전부를 에 전달하며, 반면 컴패니언의 단일 경사-세미링 패스는 대신 모든 노드에서 -벡터 짐을 실어 나르므로, 엣지당 의 작업을, 전체로는 를 치르지만, 고정된 에 대해서는 여전히 회로 크기에 선형입니다. 에 대해서는 그것이 개의 곱 대신 13개의 엣지이며; 실제 규모에서는 바로 이 비대칭성이 이 방법을 실용적으로 만드는 것이고, 컴파일된 회로의 크기가 이 장의 끝에서 우리가 돌아올 정직한 병목입니다.
커밋된 실험: 레이블 있는 점 12개, 레이블 없는 점 180개, 제약 하나
의미 손실의 대표적인 응용은 준지도 학습(semi-supervised learning)입니다: 레이블이 부족할 때, 제약은 아무 비용도 들지 않는 지도 신호가 되는데, 레이블이 붙어 있든 아니든 모든 입력이 제약을 충족하는 출력으로 사상되어야 하기 때문입니다 [1]. 컴패니언은 학술 세계 위, 장난감 규모에서 원 논문의 레시피를 재현합니다. 과제는 "이 논문의 주제가 무엇인가"이며: 주제마다 하나씩인 세 개의 가우시안 뭉치(blob) 안의 2차원 특징점들로, 반지름 2인 원 위에 120도 간격으로 놓인 중심에 표준편차 1.1을 갖게 하여, 이웃한 클래스들이 실제로 겹치게 만듭니다(semantic_loss.py 276–299행). 훈련 집합은 레이블 있는 점 12개(클래스당 4개, 부족한 레이블)에 레이블이 뽑힌 다음 버려진 레이블 없는 점 180개를 더한 것입니다; 테스트 집합은 또 다른 180개의 점입니다. 모델은 클래스별 시그모이드 출력을 갖는 2–16–3 다층 퍼셉트론이며(313–320행), 학습률 의 전체 배치 경사 하강으로 800 에포크 동안 훈련됩니다. 두 실행은 같은 시드 초기화에서 시작하므로(302–310행), 목적함수만이 유일한 차이입니다:
여기서 는 레이블 있는 12개 점에 대한 클래스별 시그모이드 교차 엔트로피이고, 의미-손실 가중치 는 제약 항이 레이블 항에 대해 얼마나 강하게 반영되는지를 정하는 혼합 계수이며, 위 줄(overline)은 평균을 뜻합니다: 의미 손실은 레이블 있는 예제와 없는 예제 모두에 똑같이 적용되며, 이는 원 논문의 레시피입니다(352–354행).
두 손실 항이 가중치에 도달하는 방식은 두 개의 인격을 가진 하나의 연쇄 법칙입니다. 출력 로짓 (클래스 에 대한 시그모이드 이전 수치)에서, 교차 엔트로피 항은 깔끔한 오차 신호 를 만들어 내는데(여기서 는 클래스 에 대한 0/1 목표 레이블입니다), 이는 시그모이드의 도함수에서 나오는 가 교차 엔트로피의 분모에 있는 같은 인자를 상쇄하기 때문이며, 이 상쇄는 1권이 완전히 유도한 바 있습니다. 의미-손실 항은 그런 상쇄를 누리지 못합니다: 는 고정된 레이블에 대한 교차 엔트로피가 아니므로, 시그모이드 인자가 그대로 살아남습니다,
그리고 두 신호는 공유된 몸통을 거쳐 역전파되기 전, 로짓에서 더해집니다(semantic_loss.py 347–354행):
# CE term, labeled rows only. For one output, dCE/dp = −y/p +
# (1−y)/(1−p) = (p−y)/(p(1−p)) and dσ/dz = p(1−p); the chain rule
# cancels the denominator: ∂CE/∂z2 = p − y (mean over labeled).
dz2[:n_lab] += (p[:n_lab] - y1h) / n_lab
if sl_weight != 0.0:
# SL term, ALL rows (the paper applies L^s to labeled AND
# unlabeled): ∂(w·L^s)/∂z2 = w · (∂L^s/∂p) · p(1−p) (mean).
dz2 += sl_weight * semantic_loss_grad(p) * p * (1.0 - p) / len(x_all)
두 층을 거치는 두 항 모두를 합친 전체 경사는 앞서 인용한 세 번째 인증 줄입니다: 12개의 매개변수 좌표에서 중심 유한 차분과 대조하여 검사되고 까지 일치합니다(506–522행). 커밋된 실행은 그런 다음 두 목적함수 모두를 훈련시키고 그 궤적과 판정을 보고합니다:
[4] semi-supervised blobs: CE(labeled) vs CE(labeled) + w·L^s(ALL)
3 topic blobs in 2-D (radius 2.0, σ = 1.1); 12 labeled + 180 unlabeled train, 180 test
MLP 2-16-3, per-class sigmoids, full-batch GD: η = 0.5, 800 epochs, w = 0.5; shared init (seed 1)
epoch : CE-only run (CE, L^s) CE + w·L^s run (CE, L^s)
1 : ( 1.1821, 0.8388) ( 1.1725, 0.8238)
100 : ( 0.0185, 0.2398) ( 0.0142, 0.1041)
400 : ( 0.0037, 0.2252) ( 0.0037, 0.0532)
800 : ( 0.0017, 0.2247) ( 0.0018, 0.0321)
(the CE-only run's L^s is REPORTED, never trained on: it plateaus while
the SL run drives it down — the unlabeled points becoming signal)
test set: accuracy and exactly-one coherence (threshold 1/2)
model test acc violations viol rate mean WMC(α₁)
CE only 0.8778 20/180 0.1111 0.8769
CE + 0.5·L^s 0.9000 6/180 0.0333 0.9537
메커니즘을 따로 떼어 보여 주므로, 궤적 표부터 읽어 봅시다. 두 실행 모두 레이블 있는 12개 점에 대한 교차 엔트로피를 사실상 0까지 몰아갑니다: 부족한 레이블은 맞추기 쉬우며, 800 에포크가 되면 CE 열은 구별할 수 없습니다(0.0017 대 0.0018). 차이는 전적으로 두 번째 열에 있습니다. CE 단독 실행의 의미 손실은 보고되기만 할 뿐 결코 훈련되지 않으며, 0.22 근처에서 정체됩니다: 12개의 점을 맞추는 것은 나머지 180개에 대한 네트워크의 행동을 제약 없이 남겨 두며, 모호한 입력에 대해서는 그 세 시그모이드가 비트 0개나 2개를 기꺼이 발화합니다. 제약이 있는 실행은 같은 양을 0.82에서 0.03까지 끌어내립니다: 교차 엔트로피에는 쓸모없던 레이블 없는 180개의 점이 180개의 경사 원천이 된 것입니다.
테스트 판정은 그것이 사 오는 것을 정량화합니다. 위반율(violation rate)은 각 시그모이드를 에서 임계값 처리하여, 발화된 비트의 개수가 정확히 하나가 아닌 테스트 입력을 셉니다(semantic_loss.py 390–402행): 제약은 180개 중 위반을 20개에서 6개로 줄이는 동시에, 정확도는 0.8778에서 0.9000으로 올라가고, 평균 충족 질량 는 0.8769에서 0.9537로 오릅니다. 하니스는 세 방향 모두를 단언합니다: 엄격히 더 적은 위반, 두 포인트 넘게 낮아지지 않는 정확도(여기서는 실제로 향상됩니다), 유효 상태 위에 엄격히 더 많은 질량(532–537행).
왜 출력에 대한 제약이 레이블 없는 점에 인접한 입력에 대한 정확도를 향상시켜야 할까요? 그 메커니즘을 정확히 진술해 봅시다. 하나만-참 손실은 정확히 개의 원-핫 꼭짓점에서 0이고 그 외 모든 곳에서는 양수입니다; 대칭선 를 따라 질량은 인데, 그 도함수 는 안에서 오직 에서만 0이 되어 정점값 를 주므로, 가장 결정하기 어려운 점조차 고정된 통행료, 즉 나트의 바닥값을 치릅니다. 그러므로 레이블 없는 모든 점에 대해 손실은 출력 벡터를 어떤 결단력 있는 원-핫 결정 쪽으로 밀어붙이며, 자신 있는 비정합성에도 값을 매기는데(투-핫 코너는 클램프의 27.6나트를 치릅니다), 이는 평범한 엔트로피 최소화라면 하지 않을 일입니다. 매끄러운 네트워크가 모든 점에서 결단하는 가장 값싼 방법은 결정 경계를 데이터가 성긴 곳에 놓는 것입니다: 경계를 밀도 높은 영역으로 쓸어 넘기면 근처의 많은 점들을 값비싼 미결정 구역으로 억지로 통과시키게 될 것입니다. 그러므로 제약은 경계를 뭉치들 사이의 저밀도 틈으로 조각해 넣는데, 이는 정확히 참된 클래스 경계가 놓인 곳입니다. 이는 준지도 학습의 저밀도-분리(low-density-separation) 직관이며, 여기서는 어림법이 아니라 논리적 제약의 따름정리로 얻어졌습니다. 실제 규모에서 원 논문은 순열-불변 준지도 MNIST(미국 국립표준기술연구소가 만든 손글씨 숫자 벤치마크, Modified National Institute of Standards and Technology)에서 같은 레시피를 보고합니다: 겨우 수백 개나 천 개의 레이블만으로, 평범한 다층 퍼셉트론에 하나만-참 의미 손실을 더하는 것이 그 제약 하나만으로 당대의 특화된 래더 네트워크(ladder network) 최고 성능과의 격차 대부분을 메웠습니다 [1].
손실 대 계층: 설계 갈림길
이제 설계 축을 뒤집어 봅시다. 커밋된 숫자들이 그 질문을 강제하기 때문입니다. 제약을 가지고 800 에포크를 훈련한 뒤에도, 위반율은 180개 중 6개입니다. 낮다고 해서 0은 아닙니다. 손실은 네트워크가 무엇을 배우는지를 빚어낼 뿐, 네트워크가 무엇을 내놓는지를 결박하지는 못합니다. 테스트 시점에서 시그모이드는 자유로운 수치이며, 하류의 소비자(기호 추론기, 안전성 검사, 무결성 제약을 갖춘 데이터베이스)가 를 항상 충족하는 출력을 요구한다면, 어떤 가중치의 벌점도 그것을 보장할 수 없습니다. 대안은 구조적입니다: 를 출력 층 자체에 지어 넣는 것입니다.
이 구성은 조건화(conditioning)이며, 손실이 값을 매겼던 것과 같은 양에 값을 매깁니다. 네트워크의 인수분해된 분포 를 그대로 두고, 위반 상태 위의 질량을 지운 다음, 남은 것을 재정규화합니다:
여기서 은 지시자로, 의 모델 위에서는 이고 그 외에서는 입니다. 를 하나의 확률분포로 만들어 주는 분모는 정확히, 그 음의 로그가 손실이었던 그 가중 모델 계수입니다: 두 설계는 서로 다른 자리에 들어가는 같은 의미론적 대상입니다. 아래에서는, 위반 상태의 확률이 0인 이유가 훈련이 그것을 억제했기 때문이 아니라 그 계층의 산술이 그것을 만들어 낼 수 없기 때문입니다.
의미 확률 계층(Semantic Probabilistic Layer, SPL)은 이를 두 회로의 곱으로 실제 규모에서 실현합니다 [2]. 한 회로는 독립-시그모이드 인수분해보다 더 풍부한, 학습된 확률 모델 입니다(그래서 이 계층은 독립성이 금지하는 출력 비트들 사이의 상관까지도 표현할 수 있습니다); 다른 회로는 를 컴파일하는 제약 회로 입니다. 두 회로가 구조적으로 양립 가능할 때, 그 곱과 정규화 상수는 회로 패스에 의해 정확히 계산되므로, 이 계층의 확률과 정규화 상수와 경사는 모두 다루기 쉬운(tractable) 채로 남으며, 모든 예측은 구성상 를 충족합니다. 더 가벼운 특수 사례가 이 일반적인 계층보다 먼저 있었습니다: 제약이 자식 클래스에서 부모 클래스로 가는 함의들의 집합인 레이블 위계(hierarchy)에 대해서는, 각 부모의 출력을 그 자신의 원출력과 그 자손들의 출력 가운데 최댓값으로 설정하는 max 구성으로 정합성을 강제할 수 있으며, 그러면 부모의 확률은 결코 자식의 확률보다 낮아질 수 없고 어느 층위에서 임계값을 매기든 일관된 레이블링이 나옵니다 [3]. 우리의 , 즉 nesy가 logic을 함의한다는 것은 두-노드 위계입니다: max 계층은 를 계산할 것이고, 전시물의 위반 출력 (0.2, 0.5, 0.9)를 문자 그대로 표현 불가능하게 만들 것입니다.
1부의 퍼지 문은 세 번째 열로서 이 비교를 완성합니다. 위에서 를 t-노름으로 평가하는 것 역시 미분 가능한 훈련-시점 벌점이며, 어떤 것도 컴파일하지 않으므로 어떤 회로보다도 값쌉니다; 하지만 그 값은 논리식의 구문에 따라 달라지고(의미 손실의 공리가 강제하는 구문 독립성을 만족하지 못합니다), 미분 가능한 퍼지 연산자에 대한 체계적인 연구는 그 경사가 연쇄된 함의에 대한 소멸 경사부터 괴델 t-노름 아래에서의 단일-절 승자독식 갱신에 이르기까지, 연산자마다 고유한 방식으로 저하됨을 보여줍니다 [4]. 표 하나가 이 갈림길 전체에 값을 매깁니다:
| 설계 | 훈련 시점 비용 | 테스트 시점 보증 | 표현 범위 |
|---|---|---|---|
| 퍼지 벌점(t-노름) [4] | 예제당 논리식 평가 한 번, 컴파일 없음 | 없음: 위반은 측정될 뿐 상계가 없다 | 어떤 논리식이든 되지만, 값이 구문과 연산자 메뉴에 따라 달라진다 |
| 의미 손실 [1] | 오프라인 컴파일 한 번을 거친 뒤, 예제당 회로 패스 한 번 | 없음: 위반율은 낮지만(여기서는 6/180) 0은 아니다 | 임의의 명제 ; 구문 독립적이다 |
| 의미 확률 계층 [2] | 예제당 회로 곱셈과 정규화 | 위반이 구조적으로 불가능하다: 질량이 에 조건화된다 | 양립 가능한 회로를 갖는 임의의 명제 ; 출력 상관을 더한다 |
| 위계 max 계층 [3] | 부모 클래스당 max 한 번, 회로 없음 | 위계 위반이 불가능하다 | 함의 위계에 한정된다 |
이 표의 행들은 경쟁자라기보다 하나의 기계를 서로 다른 지점에서 읽은 것에 가깝습니다. 손실은 충족 질량의 를 취하고, 계층은 그것으로 나누며, 둘 중 어느 쪽의 경사든 경사 세미링 아래에서 같은 컴파일된 회로를 타고 흐릅니다. 이는 대수적 모델 계수 그림을 축소판으로 보여 주는 것입니다: 하나의 컴파일된 산물을 서로 다른 세미링 아래에서 평가하면 계수와 그 도함수와 조건화된 분포의 정규화 상수가 나오므로, "손실"과 "계층"은 하나의 의미론에 대한 두 가지 표기법입니다 [5]. 실제로 다른 것은 비용이 어디에 떨어지는가입니다: 손실은 배치당 온건한 값을 치르고 측정 가능하고 0이 아닌 위반율을 받아들이며; 계층은 예측당 더 뻣뻣한 값을 치르고(그리고 회로 곱에서 모델링에 대한 약속을 치르고) 정리 하나를 사들입니다.
아직 풀리지 않은 부분
구문 독립성은 의미 손실이 가장 자랑스러워하는 성질이며, 동시에 이 방법의 가장 날카로운 한계를 숨기고 있습니다: 이 손실은 제약이 어떻게 쓰였는지에는 독립적이지만, 어떤 제약이 주어졌는지에는 온전히 매여 있습니다. 이 틀 안의 그 무엇도 를 학습하거나, 에 의문을 던지거나, 가 틀린 곳에서 그것을 누그러뜨릴 수 없습니다. 틀린 제약은 옳은 제약과 정확히 똑같이 깔끔한 경사로 강제됩니다: 학술 세계가 언젠가 진정으로 두 주제를 가진 논문을 받아들이게 된다면, 하나만-참 손실은 자신 있게, 그리고 구문 독립적으로 그것들을 계속 원-핫 구석으로 깎아 넣을 것이며, 그 값은 "네트워크가 결정을 내리지 못하고 있다"와 "제약이 이 입력에 맞지 않는다"를 구별할 방법을 전혀 제공하지 않습니다. 의미 손실은 기호적 지식을 소비할 뿐 그것을 만들어 내지는 않으며, 제약을 학습하는(또는 주어진 제약이 틀렸음을 탐지하는) 문제는 그 공리들 바깥에 온전히 놓여 있습니다. 두 번째로 열려 있는 전선은 비용입니다. 배치당 값은 회로 크기에 선형이지만, 회로 크기 자체가 #P-난해한 문제의 컴파일된 잔여물이며, 풍부한 제약(경로, 매칭, 수만 개의 레이블에 걸친 위계)에 대해서는 오프라인 컴파일이 폭발하거나 그 자체가 연구 문제가 됩니다. 두 인계 모두 이미 예정되어 있습니다: 다음 장은 정확성을 다이얼과 맞바꾸며(Scallop의 top- 증명 프로버넌스), GPU 네이티브 NeSy: KLay와 Lobster는 정확한 회로 평가를 병렬 하드웨어 네이티브로 만들어 상수 인자를 공략합니다.
왜 중요한가
이 장은 이 권의 논제를 가장 이동하기 쉬운 형태로 보여 줍니다. 여기서는 그 무엇도 논리 프로그램이나 증명 탐색이나 가능-세계 지식 베이스를 필요로 하지 않았습니다: 명제 논리식 하나와 평범한 분류기 하나만으로도 2부의 전체 기계 장치(가중 모델 계수, 컴파일된 회로, 경사 세미링)가 평범한 지도 학습 안에서 제 몫을 다하기에 충분했습니다. 그 이동 가능성이야말로 의미 손실이, 그 어떤 단일 시스템보다도, 널리 퍼지는 패턴인 이유입니다: 알려진 구조를 가진 어떤 출력 공간이든, 어떤 경사로 학습되는 모델이든, 컴파일하고 계수하고 미분한다는 같은 세 줄짜리 레시피를 받아들입니다. 두 기둥이 이번만큼은 대칭적으로 만나는데, 기호적인 쪽은 의미(공리들이 지키는 의 모델 집합)를 보태고 신경망 쪽은 질량(상태들에 대한 시그모이드의 분포)을 보탭니다. 그리고 측정된 위반율 대 구조적 보증이라는 마지막 갈림길은, 5권의 핵심 질문을 배아 상태로 담고 있습니다: 학습된 시스템을 신뢰해야 할 때, 낮게 관측된 실패율이면 충분한가, 아니면 실패가 구성상 불가능해야 하는가? 6/180이라는 숫자와 산술로 만들어 낸 0이라는 숫자를 마음에 담아 두십시오; 신뢰를 다루는 장들이 정확히 그 간극을 다시 열 것입니다.
핵심 용어
- 의미 손실(semantic loss) — 네트워크의 시그모이드 출력으로부터 좌표별로 표집된 상태가 제약 를 충족할 확률의 음의 로그; 가중치 와 를 써서 와 같으며, 원 논문의 정칙성 조건이 주어졌을 때 세 개의 실질적 공리가 허용하는 (양의 상수배까지) 유일한 손실이다.
- 제약(constraint) / 모델(model) — 불 출력 변수 에 대한 하나의 명제 논리식; 모델이란 가 참인 상태 이며 라고 쓴다.
- 자기정보(self-information) — 사건의 확률의 이며, 그것을 관측하는 놀라움이다; 의미 손실은 네트워크가 자기 자신의 제약 충족에 대해 느끼는 놀라움이다.
- 구문 독립성(syntax independence) — 논리적으로 동치인 제약들이 동일한 손실을 받는 성질; 원 논문의 명제 2로, 상호 함의의 양방향으로 실행된 단조성에 의해 강제되며; 하나만-참을 컴파일하여 까지 닫힌 형식을 되찾음으로써 코드로 검사된다.
- 하나만-참 닫힌 형식(exactly-one closed form) — , 개의 원-핫 모델에 대한 합; 그 손으로 유도한 경사는 중심 유한 차분과 대조해 까지 인증된다.
- 경사 세미링(gradient semiring) — 쌍 에 대한 대수로, 그 와 는 합의 법칙과 곱의 법칙이므로, 한 번의 상향 회로 패스가 가중 모델 계수와 그 정확한 경사를 함께 돌려준다.
- 위반율(violation rate) — 임계값 처리된 출력이 제약을 충족하지 못하는 테스트 입력의 비율; 손실은 이를 낮추지만(커밋된 실행에서 20/180에서 6/180으로) 0으로 만들지는 못한다.
- 제약 계층(constraint layer) — 가중 모델 계수를 분모로 삼아 네트워크의 질량을 재정규화함으로써 의 모델들에 대한 분포만을 내놓는 출력 층; 일반적으로는 의미 확률 계층의 회로 곱으로, 위계에 대해서는 max 구성으로 실현된다.
다음으로 이어지는 것
이 장의 제약은 한 번도 움직이지 않았습니다: 고정된 명제 논리식 하나가 한 번 컴파일되어 영원히 미분되었습니다. 당연한 다음 요구는 재귀와 규칙, 즉 "~와 정합적이다"가 아니라 "~로부터 도출 가능하다"이며, 다음 장 Scallop: 프로버넌스를 갖춘 미분 가능 데이터로그의 놀라운 점은 그 기계 장치가 거의 바뀌지 않는다는 것입니다: 2권의 데이터로그 엔진이, 올바른 세미링에서 나온 태그들 위에서 실행되면, 정확성이 조율 가능한 다이얼이 되는 미분 가능한 추론기가 되며, 이 장의 정확한 회로가 서 있던 자리에 top- 증명 세미링이 대신 섭니다.
짝이 되는 코드: examples/integration/semantic_loss.py는 이 장 전체를 구현합니다: 하나만-참 닫힌 형식과 그 손으로 유도한 경사(118–174행), 유한 차분 오라클(177–187행), 경사 세미링을 갖춘 회로 레시피(206–272행), 모든 역전파 공식을 주석으로 단 준지도 학습 실험(276–402행), 그리고 각 주장을 지키는 단언문들(430–537행)이며, 이는 examples/integration/circuit.py(compile, 322–332행; evaluate와 그 한 번의 패스 엔진 _eval_all, 336–374행)가 지은 회로 위에서 이루어집니다. 이 장에 인용된 모든 출력 블록을 바이트 단위까지 재현하려면 python3 examples/integration/semantic_loss.py를 실행하십시오; 그 실행은 SUMMARY semantic_loss: fd_xo=3.6e-11 fd_imp=1.1e-09 fd_mlp=6.3e-11 prop2=2.2e-16 acc_ce=0.8778 acc_sl=0.9000 viol_ce=20 viol_sl=6 wmc_ce=0.8769 wmc_sl=0.9537로 끝납니다.