본문으로 건너뛰기

퍼지에서 신경망으로: 소프트민, 소프트맥스, 경사

📍 현재 위치: 1부 · 퍼지·다치 논리 — 3장. t-노름과 t-코노름은 최솟값, 곱, 우카시에비치를 대수로서 인증했습니다: 네 개의 공리, 이진 격자 위에서의 정확함, 그리고 동일한 인용 사슬에 대한 세 가지 나름대로 방어 가능한 신뢰도입니다. 이 장은 그것들을 미분합니다: 모든 명확한 입력에서 의견이 일치했던 세 논리곱은 서로 완전히 다른 세 가지 훈련 신호로 갈라집니다.

지난 장은 논리학자가 하듯이 t-노름들 사이에서 선택했습니다: 공리에 의해, 잉여(residuum)에 의해, 각각이 증거의 사슬에 어떤 값어치를 매기는지에 의해서 말입니다. 이 장은 최적화기가 할 수밖에 없는 방식으로 선택합니다. 논리식의 진리값이 손실 항(loss term), 즉 신경망이 값을 키우도록 훈련되는 대상이 되는 순간, 그 진리표는 더 이상 중요하지 않게 되고 대신 도함수가 중요해지기 시작합니다. 경사 하강법은 편미분 T/xi\partial T / \partial x_i를 통해서만 값 T(x)T(x)를 보기 때문입니다. 이 기준에서 보면 세 t-노름은 같은 것의 세 가지 변주가 아닙니다; 그것들은 세 가지 서로 다른 질병이며, 그중 하나는 거의 훈련이 불가능합니다. 미분 가능한 퍼지 연산자에 대한 체계적인 분석은 그래디언트 병리 현상들의 목록을 통해 이를 확립했으며 [1], 이 장은 이어지는 학술 세계 위에서 각 병리 현상을 축소판으로 재현하고, 모든 도함수를 건너뛰는 단계 없이 손으로 유도하며, 그 각각을 중심 유한차분에 맞서 인증한 다음, 두 가지 표준적인 수리책과 그 대가로 마무리합니다. 아래 인용된 모든 숫자는 일화가 아니라 examples/integration/fuzzy_grad.py의 커밋된 출력입니다.

쉽게 말하면

계주 팀을 상상해 보십시오. 코치는 오직 팀의 합산 점수를 통해서만 피드백을 줄 수 있습니다. 민(Min) 코치는 매 경주가 끝난 뒤 오직 가장 느린 주자에게만 말을 겁니다; 나머지 마흔아홉 명은 자신이 우연히 가장 느려지기 전까지는 그 어떤 말도 듣지 못합니다. 프로덕트(Product) 코치는 모든 사람의 개별 점수를 서로 곱하므로, 각 주자에게 돌아오는 피드백은 1보다 작은 다른 마흔아홉 개의 숫자들의 곱만큼 줄어들어 도착합니다: 행동으로 옮기기에는 너무 희미한 속삭임입니다. 우카시에비치(Łukasiewicz) 코치에게는 집안 규칙이 하나 있습니다: 팀 총점이 아주 높은 문턱을 넘지 못하면 점수는 정확히 0이 되고, 점수가 0이라는 것은 모든 주자가 동시에 피드백을 0으로 받는다는 뜻이므로, 팀이 크면 거의 아무 말도 듣지 못하는 셈입니다. 분별 있는 코치는 소프트민(Softmin)입니다: 그녀는 매 경주가 끝난 뒤 모든 사람에게 말을 걸되, 가장 약한 주자에게 가장 크게 말하며, 자신의 주의를 얼마나 집중시킬지 조절하는 다이얼(온도)을 갖고 있습니다. 이 장은 바로 이 네 가지 코칭 스타일의 수학이며, 그 속삭임과 침묵의 크기를 측정하고 표로 정리합니다.

이 장에서 다루는 내용

  • 연쇄 법칙 파이프라인: 퍼지 논리식이 어떻게 손실이 되는지, 그리고 왜 모든 매개변수 갱신이 논리 결합자의 편미분 T/xi\partial T / \partial x_i에 의해 게이트되는지를 다룹니다. 그래서 지난 장의 t-노름 메뉴는 그래디언트 메뉴로 다시 읽혀야 합니다.
  • 세 개의 도함수, 세 개의 병리 현상: 조각별 선형성으로부터 유도되는 괴델 최솟값의 원-핫 그래디언트(동점 경우는 서브그래디언트로 처리합니다), 곱의 법칙으로 유도되는 곱의 나머지-하나-빼기(leave-one-out) 편미분과 정량화된 그 기하급수적 감쇠 cn1c^{\,n-1}, 그리고 심플렉스의 부피로부터 유도되는 확률 11/n!1 - 1/n!을 갖는 우카시에비치의 죽은 구간을 다룹니다; 각 병리 현상은 커밋된 표로 뒷받침됩니다.
  • 소프트민, 매끄러운 수리책: 로그-합-지수(log-sum-exp) 정의, 최솟값과의 간극이 최대 τlogn\tau \log n임을 위아래로 조여 증명하는 완전한 증명, 온도가 커질 때 평균으로 향하는 극한, 그리고 그 그래디언트가 정확히 소프트맥스 가중치임을, 즉 엄격히 양수이고 합이 1임을 보이는 유도를 다룹니다.
  • 경계 폭발과 ε-클램프: 로그 공간 곱 손실이 왜 그래디언트 소실의 수리책인지, 왜 그것이 진리값 0과 1에서 폭발하는지, 그리고 사영 π₀와 π₁이 어떻게 손실과 그래디언트 모두를 유계로 만드는지를, 클램프 적용 전/후를 비교하는 커밋된 예시와 함께 다룹니다.
  • 설계표: t-노름, 그래디언트 성격, 대규모 실패 양상, 수리책을 정리하며, 모든 칸은 커밋된 숫자를 담고 있습니다; 이 표는 논리 텐서 네트워크 장을 비롯해 이후 장들에서도 재사용됩니다.
  • 정직한 장부: 모든 수리책은 의미론을 바꿉니다(소프트민은 t-노름이 아니며, 클램프는 단위 법칙을 깨뜨립니다). 그래서 훈련 가능성은 논리적 부채로 사들이는 것이며, 이 장은 그것을 숨기지 않고 명시합니다.

파이프라인: 논리식의 진리값이 손실이 되다

설정을 한 번에 고정하고, 모든 기호를 해독해 둡시다. 퍼지 논리식 φ, 예컨대 이어지는 예시의 세 인용 엣지로 이루어진 논리곱은 nn개의 논리곱 항(conjunct)을 가집니다(nn은 AND로 묶인 원자의 개수입니다; 여기서는 n=3n = 3입니다). 각 논리곱 항 ii는 진리도 xi[0,1]x_i \in [0,1]를 지니는데, 이는 0과 1을 모두 포함하는 사이의 실수입니다(기호 \in은 "~의 원소이다"라고 읽으며, [0,1][0,1]은 양 끝점을 모두 포함하는 0부터 1까지의 실수 구간입니다). 뉴로-심볼릭 시스템에서 그 진리도는 상수가 아닙니다: 그것은 미분 가능한 모델의 출력, 즉 xi=fi(θ)x_i = f_i(\theta)이며, 여기서 θ\theta매개변수 벡터(parameter vector), 즉 신경 술어 안의 모든 훈련 가능한 숫자를 모은 목록입니다(1권 9장이 이 벡터를 소개했습니다; 여기서는 한 논문이 다른 논문을 인용하는지를 채점하는 신경망의 가중치를 담고 있을 수 있습니다). 논리 결합자는 이 진리도들을 하나의 숫자, 즉 논리식의 진리값 T(x1,,xn)T(x_1, \ldots, x_n)으로 접습니다. 논리식을 향해 훈련시키기 위해 우리는 진리값을 최소화할 손실로 뒤집습니다: 가장 단순한 선택은

L(θ)  =  1T(x1(θ),,xn(θ)),L(\theta) \;=\; 1 - T\big(x_1(\theta), \ldots, x_n(\theta)\big),

이렇게 하면 진리값을 최대화하는 것과 손실을 최소화하는 것이 같은 행위가 됩니다. 이제 연쇄 법칙을 이용해 LL을 매개변수 하나인 θk\theta_k에 대해, 두 개의 고리를 거쳐 미분해 봅시다. 바깥 고리는 L/T=1\partial L / \partial T = -1입니다(1T1 - TTT에 대해 미분한 것입니다). 안쪽 고리는 모든 논리곱 항을 관통하는데, θk\theta_k가 한꺼번에 여러 진리도에 영향을 미칠 수 있기 때문입니다(아래의 기호 \sum은 색인 범위에 걸쳐 항들을 더한다는 뜻이며, ii가 1부터 nn까지 움직이며 논리곱 항마다 한 항씩 더합니다):

Lθk  =  LTi=1nTxixiθk  =  i=1nTxixiθk.\frac{\partial L}{\partial \theta_k} \;=\; \frac{\partial L}{\partial T} \sum_{i=1}^{n} \frac{\partial T}{\partial x_i}\,\frac{\partial x_i}{\partial \theta_k} \;=\; -\sum_{i=1}^{n} \frac{\partial T}{\partial x_i}\,\frac{\partial x_i}{\partial \theta_k}.

이 합을 항별로 읽어 봅시다. 인자 xi/θk\partial x_i / \partial \theta_k는 신경망 자신의 역전파된 신호로, 1권의 신경망 장이 유도한 바로 그 양입니다. 인자 T/xi\partial T / \partial x_i는 새로운 것이며, 하나의 게이트(gate)입니다: 신경망이 원자 ii에 대해 무엇을 배울 수 있든, 그 학습 신호는 논리 결합자의 편미분이 곱해진 채로 도착합니다. 만약 T/xi=0\partial T / \partial x_i = 0이라면, 원자 ii가 아무리 틀렸어도 이번 단계에서는 아무런 갱신도 받지 못합니다. 이 장 전체는 t-노름 메뉴 전반에 걸쳐 바로 이 한 인자를 연구하는 것입니다 [1].

시험대는 지난 장이 구성했던 것과 동일한 논리곱입니다: 인용 사슬 cites(p3, p2) ∧ cites(p2, p1) ∧ cites(p3, p1)이 신뢰도 x=(0.9,0.8,0.5)x = (0.9, 0.8, 0.5)를 가지며, 이는 2권의 annotated.py에서 그대로 읽어 온 것이지 다시 타이핑한 것이 아닙니다(fuzzy_grad.py 60–62행). 어떤 유도도 하기 전에, 전체 이야기를 하나의 커밋된 표로 먼저 보여 드리겠습니다: 각 연산자가 부여하는 진리값, 그것이 각 엣지로 보내는 그래디언트, 그리고 세 입력 가운데 몇 개가 살아 있는지(0이 아닌 그래디언트를 받는지)입니다. 이 블록은 또한 이 장의 나머지 부분을 신뢰할 수 있게 만드는 인증도 함께 보여 줍니다: 아래의 손으로 유도한 모든 그래디언트는 중심 유한차분(central finite difference), 즉 좌표마다 h=106h = 10^{-6}에서의 양방향 추정치 (f(x+hei)f(xhei))/(2h)\big(f(x + h\,e_i) - f(x - h\,e_i)\big)/(2h)에 맞서 검사됩니다(hh는 흔드는 크기이고, eie_i는 좌표 ii만을 살짝 흔드는 단위벡터이며, 양방향 형식의 오차는 h2h^2 차수입니다). 이는 fuzzy_grad.py 153–163행에 구현되어 있습니다:

[1] gradient routing on the running chain — the 3-ary conjunction
cites(p3,p2) ∧ cites(p2,p1) ∧ cites(p3,p1) at confidences
x = (0.9, 0.8, 0.5) (read from Volume 2's annotated.py)
operator T(x) ∂T/∂x₁ ∂T/∂x₂ ∂T/∂x₃ inputs alive
godel 0.5000 0.0000 0.0000 1.0000 1/3
product 0.3600 0.4000 0.4500 0.7200 3/3
lukasiewicz 0.2000 1.0000 1.0000 1.0000 3/3
softmin_0.1 0.4934 0.0171 0.0466 0.9362 3/3
min starves two of three inputs; softmin keeps all alive while
still sending 94% of the gradient to the weakest edge (0.5).
central-FD certification (h=1e-6), max |analytic - FD|:
godel 1.000e-12
product 1.815e-11
lukasiewicz 1.398e-10
softmin_0.1 1.064e-11

네 개의 연산자, 네 개의 라우팅 정책입니다. 최솟값은 모든 것을 가장 약한 엣지에 보내고 다른 어디에도 보내지 않습니다. 곱은 세 엣지 모두를 합리적인 순위로 살려 두지만(가장 약한 엣지가 가장 큰 편미분값 0.72를 받습니다), 앞으로 측정하겠지만 논리곱이 커질수록 전체 신호가 줄어듭니다. 우카시에비치는 여기서는 모두에게 기울기 1을 보내는데, 이는 이 특정한 점이 마침 그 문턱을 넘기 때문입니다; 이 항수에서 균등 무작위 입력의 83퍼센트에서는 모두에게 정확히 0을 보내며, 논리곱이 소수의 원자를 넘어 커지면 사실상 모든 입력에서 그렇게 됩니다. 온도 0.1의 소프트민은 미분 가능한 최솟값처럼 행동합니다: 모든 입력이 살아 있고, 가중치의 94퍼센트가 가장 약한 엣지에 실립니다. 이 장의 나머지 부분은 각 행을 유도한 다음, 각 정책이 nn에 따라 어떻게 규모가 변하는지를 측정합니다.

훈련 신호로서의 t-노름 그래디언트를 보여주는 3패널 도해. 왼쪽 패널은 신뢰도 0.9, 0.8, 0.5를 갖는 세 인용 엣지로 이루어진 이어지는 논리곱을 보여주고, 그 아래에는 그래디언트 라우팅을 나타내는 화살표 네 줄이 있다: 괴델 최솟값 줄은 0.5 엣지로 향하는 하나의 전력 화살표와 나머지 둘로 향하는 X표 쳐진 0 화살표를 보여주고, 곱 줄은 0.40, 0.45, 0.72로 표시된 세 개의 중간 크기 화살표를 보여주며, 우카시에비치 줄은 1.0으로 동일하게 표시된 세 개의 화살표와 그것들이 모두 죽은 구간 안에서 사라진다는 경고를 보여주고, 소프트민 줄은 가장 약한 엣지로 향하는 0.94로 표시된 두꺼운 화살표 하나와 0.02와 0.05로 표시된 얇지만 존재하는 화살표 두 개를 보여준다. 가운데 패널은 논리곱 항의 개수 n에 대해 측정된 세 가지 병리 현상을 그린다: 괴델의 제로-그래디언트 비율은 곡선 (n 빼기 1) 나누기 n을 따라 올라가 n이 50일 때 0.98에 이르고, 곱의 그래디언트 크기는 0.9의 (n 빼기 1)제곱으로 줄어들어 n이 50일 때 0.006에 이르며, 우카시에비치의 죽은 구간 비율은 1 빼기 1 나누기 n계승으로 n이 8일 때 이미 0.99998에서 포화된다(측정값 0.99997). 오른쪽 패널은 두 가지 수리책을 보여준다: 소프트민을 위한 온도 다이얼이 낮은 온도에서의 원-핫 막대 그래프와 높은 온도에서의 균일한 막대 그래프 사이를 보간하며 간극의 상한 tau 곱하기 log n이 주석으로 달려 있고, 그 옆에는 사영 pi-zero와 pi-one이 단위 구간을 양 끝점으로부터 밀어내어 로그-손실 곡선이 발산하는 대신 유한한 값 9.2103에서 끊기게 만드는 엡실론-클램프 도해가 있다. 세 개의 t-노름, 하나의 논리곱, 논리곱이 커짐에 따라 나타나는 세 가지 실패 양상, 그리고 두 가지 수리책: 소프트민은 그래디언트를 소프트맥스 가중치로 재분배하고, ε-클램프는 경계에서 로그-손실을 유계로 만듭니다. 저자가 AI의 도움을 받아 직접 제작한 원본 도해.

괴델 최솟값: 승자 한 명이 그래디언트 전부를 가져간다

괴델 논리곱 TG(x)=minixiT_G(x) = \min_i x_i조각별 선형(piecewise linear)입니다: 입력 공간에서 특정 좌표가 가장 작은 각 영역에서, TGT_G는 정확히 그 좌표와 일치합니다. 이를 정확히 짚어 봅시다. 좌표 kk유일한 argmin이라고, 즉 모든 jkj \ne k에 대해 xk<xjx_k \lt x_j라고 합시다. δ=12minjk(xjxk)\delta = \tfrac{1}{2}\min_{j \ne k}(x_j - x_k), 즉 가장 가까운 경쟁자와의 간극의 절반을 두면; 유일성에 의해 δ\delta는 엄격히 양수입니다. 모든 좌표를 δ\delta보다 작게 흔들어 봅시다: 좌표 kk는 최대 xk+δx_k + \delta까지 오르고, 다른 모든 좌표는 최소 xjδxk+2δδ=xk+δx_j - \delta \ge x_k + 2\delta - \delta = x_k + \delta까지 내려가므로, 좌표 kk는 여전히 최솟값입니다. 이 근방 전체에서 TG(x)=xkT_G(x) = x_k가 항등적으로 성립하며, 이는 함수 사이의 등식이므로 양변을 미분할 수 있습니다:

TGxk=1,TGxj=0    모든 jk에 대해.\frac{\partial T_G}{\partial x_k} = 1, \qquad \frac{\partial T_G}{\partial x_j} = 0 \;\; \text{모든 } j \ne k\text{에 대해}.

최솟값의 그래디언트는 argmin의 원-핫 지시자입니다: 0으로 이루어진 벡터에 1이 하나만 있는 것입니다. 동점에서는 도함수가 존재하지 않으며(min(x,y)\min(x, y)x=yx = y를 따라 꺾인 지점을 가집니다), 표준적인 탈출구는 서브그래디언트(subgradient)입니다: 최솟값은 오목 함수이고, 동점에서의 그 위미분(supergradient)들은 동점을 이룬 좌표들의 지시 벡터들이 이루는 볼록 껍질(convex hull), 즉 음이 아니고 합이 1인 가중치로 만든 그 벡터들의 모든 가중 평균의 집합을 형성하며, 그중 하나를 고르는 것(코드는 첫 번째 argmin을 고릅니다)은 유효한 선택입니다. 이는 3권이 EL 임베딩에서 힌지 손실의 꺾인 지점에 사용한 것과 동일한 관례이며, 같은 이유로 안전합니다: 입력에 대한 어떤 연속 분포 아래에서도 정확한 동점의 확률은 0이기 때문입니다. 동반 코드는 이를 그저 믿고 넘어가지 않습니다: 표집된 어떤 배치에서도 동점이 일어나지 않음을 단언합니다(fuzzy_grad.py 176–178행). 구현은 네 줄입니다(fuzzy_grad.py 76–83행):

def godel_grad(x: np.ndarray) -> np.ndarray:
# ∂/∂x_i min(x) = 1 if i = argmin(x), else 0. Away from ties min is
# locally just its smallest coordinate, so the derivative is the
# indicator of the argmin (at a tie we take the first-argmin
# subgradient; ties have probability 0 under continuous sampling).
g = np.zeros_like(x)
g[int(np.argmin(x))] = 1.0
return g

이제 그 결과에 이름을 붙여 봅시다. nn-항 논리곱에서, nn개의 입력 가운데 정확히 n1n - 1개가 그래디언트 0을 받습니다: 이번 단계에서 그것들은 아무것도 배우지 못합니다. 따라서 제로-그래디언트 비율은 정확히 (n1)/n(n-1)/n이며, nn마다 시드가 고정된 2000개의 균등 배치에서 측정한 비율은 인쇄된 모든 자릿수까지 일치합니다(fuzzy_grad.py 168–183행):

[2] Gödel (min) gradient SPARSITY — fraction of the n inputs that
receive zero gradient (2000 seeded uniform batches per n):
n zero-grad fraction exact (n-1)/n
2 0.5000 0.5000
5 0.8000 0.8000
10 0.9000 0.9000
20 0.9500 0.9500
50 0.9800 0.9800

n=50n = 50일 때, 어느 주어진 단계에서든 논리곱 항의 98퍼센트가 굶주립니다. 이는 체계적인 분석이 단일 통과(single-passing) 그래디언트라 부르는 것입니다 [1]: 학습 신호 전체가 오직 하나의 입력만을 통과하며, 다른 모든 원자의 오차는 아무리 크더라도, 현재 가장 약한 원자가 충분히 개선되어 argmin 자리를 넘겨줄 때까지는 보이지 않습니다. 훈련은 여전히 진전을 이룰 수 있지만(argmin이 이동합니다), 신용 할당은 직렬화됩니다: 원자 쉰 개짜리 규칙 몸체는 한 번에 원자 하나씩 교정됩니다.

곱: 모든 입력은 살아 있지만 모든 그래디언트는 줄어든다

곱 논리곱 TP(x)=j=1nxjT_P(x) = \prod_{j=1}^{n} x_j(기호 \prod\sum이 항들을 더하듯이 색인 범위에 걸쳐 항들을 곱합니다)는 어디서나 매끄러우며, 곱을 인수분해하고 나면 그 편미분은 한 단계짜리 계산이 됩니다. 좌표 ii를 분리해 봅시다:

TP(x)  =  xijixjxi에 대한 상수,T_P(x) \;=\; x_i \cdot \underbrace{\prod_{j \ne i} x_j}_{x_i\text{에 대한 상수}},

여기서 중괄호로 묶인 인자는 xix_i를 제외한 모든 항을 모은 것이므로 xix_i가 바뀌어도 변하지 않습니다. 상수 곱하기 xix_i를 미분하면 그 상수가 나옵니다:

TPxi  =  jixj,\frac{\partial T_P}{\partial x_i} \;=\; \prod_{j \ne i} x_j,

이것이 나머지-하나-빼기(leave-one-out) 곱입니다. (동일한 결과는 이항 곱의 법칙 ddx(xc)=c\tfrac{d}{dx}(x \cdot c) = c를 한 번에 한 인자씩 귀납적으로 적용해도 얻어집니다; 인수분해 논증은 그저 그 n1n-1단계 전부를 한꺼번에 수행하는 것뿐입니다.) 구현은 직접적인 옮김입니다(fuzzy_grad.py 91–94행):

def prod_grad(x: np.ndarray) -> np.ndarray:
# ∂/∂x_i ∏_j x_j = ∏_{j≠i} x_j (leave-one-out product: differentiate
# the product treating every other factor as a constant).
return np.array([float(np.prod(np.delete(x, i))) for i in range(len(x))])

이어지는 사슬에서 이는 (0.80.5,  0.90.5,  0.90.8)=(0.40,0.45,0.72)(0.8 \cdot 0.5,\; 0.9 \cdot 0.5,\; 0.9 \cdot 0.8) = (0.40, 0.45, 0.72)를 주며, 이는 라우팅 표가 인쇄했던 그 행입니다: 조밀하고, 합리적으로 순위가 매겨져 있습니다. 어떤 입력에 대한 편미분은 그 입력 자신의 값을 생략하므로, 가장 약한 논리곱 항이 가장 큰 그래디언트를 보게 되기 때문입니다. 여기까지는 곱이 옳은 답처럼 보입니다. 문제는 규모입니다. 모든 입력을 동일한 값 cc로 두어 봅시다(모든 원자가 신뢰도 cc를 갖는 "약하게 참인" 규칙 몸체입니다). 그러면 나머지-하나-빼기 곱은 cc를 자기 자신과 n1n - 1번 곱한 것입니다:

TPxixj=c  j  =  cn1  =  e(n1)logc,\frac{\partial T_P}{\partial x_i}\bigg|_{x_j = c \;\forall j} \;=\; c^{\,n-1} \;=\; e^{(n-1)\log c},

여기서 log\log자연로그(natural logarithm), 즉 지수함수 exe^x의 상수인 e2.71828e \approx 2.71828을 밑으로 하는 로그입니다; 자연로그는 그 지수함수의 역함수이므로 elogc=ce^{\log c} = c이며, 이 장의 모든 로그는 언제나 log\log로 쓰는 이 밑이 ee인 로그입니다. 어떤 c<1c \lt 1에 대해서도 logc<0\log c \lt 0이므로, 이는 논리곱 항의 개수에 대한 기하급수적 감쇠(geometric decay)입니다: 원자가 하나 늘어날 때마다 다른 모든 원자의 그래디언트에 cc를 곱하게 됩니다. c=0.9c = 0.9일 때 log0.90.105\log 0.9 \approx -0.105이므로, 논리곱 항 쉰 개는 그래디언트를 e49×0.105e5.16e^{-49 \times 0.105} \approx e^{-5.16} 배로 줄입니다. 커밋된 크기는 다음과 같습니다(fuzzy_grad.py 186–196행):

[3] product gradient VANISHING — |∂T_P/∂x_i| = ∏_{j≠i} x_j at
x_j = 0.9 for all j (a mildly-true n-clause rule body):
n |gradient| = 0.9^(n-1)
2 0.900000
5 0.656100
10 0.387420
20 0.135085
50 0.005726

n=50n = 50에 이르면 게이트는 0.0060.006 아래로 닫혀 버립니다: 최적화기가 어떤 학습률을 쓰든, 원자 쉰 개짜리 몸체의 각 원자에 대한 유효 학습률은 175분의 1로 줄어듭니다. 이는 다른 옷을 입은, 깊은 신경망의 전형적인 그래디언트 소실 질병입니다: 깊은 신경망을 통한 역전파는 층마다 하나씩의 인자를 곱하는데, 그 각각은 대개 1보다 작으며, 곱은 깊이에 따라 기하급수적으로 줄어듭니다; 3권의 어텐션 장은 동일한 붕괴의 소프트맥스 버전을 측정했습니다. 여기서는 곱셈이 신경망의 층들을 통해서가 아니라 논리식의 논리곱 항들을 통해 일어납니다: 긴 규칙 몸체는 그래디언트의 눈으로 보면 깊은 신경망입니다, 그리고 곱 t-노름은 그 깊이를 명시적으로 드러냅니다 [1]. 아래에서 풀어낼 수리책은 곱이 소실될 때 쓰는 표준적인 방법입니다: 로그 공간으로 옮기는 것입니다.

우카시에비치: 죽은 구간

이항 우카시에비치 논리곱은 TŁ(x,y)=max(0,x+y1)T_{\text{Ł}}(x, y) = \max(0, x + y - 1)입니다. 이를 결합법칙으로 사슬처럼 이어 나가면 유도해 둘 만한 닫힌 형식이 나오는데, 그래디언트 이야기 전체가 바로 그 안에 담겨 있기 때문입니다. 주장: nn-항 왼쪽 폴드(fold)는 다음과 같습니다

TŁ(x1,,xn)  =  max ⁣(0,  i=1nxi(n1)).T_{\text{Ł}}(x_1, \ldots, x_n) \;=\; \max\!\Big(0,\; \sum_{i=1}^{n} x_i - (n-1)\Big).

접힌 입력의 개수에 대한 귀납법으로 증명합니다. kk개의 입력을 접은 뒤의 결과를 FkF_k라 쓰고, Fk=max(0,ikxi(k1))F_k = \max\big(0, \sum_{i \le k} x_i - (k-1)\big)라고 가정합시다; 기저 사례 F1=x1F_1 = x_1은 성립하는데, 항 하나의 합에서 0을 뺀 것은 x1x_1이고 이는 음이 아니기 때문입니다. 다음 접기 단계는 Fk+1=max(0,Fk+xk+11)F_{k+1} = \max(0, F_k + x_{k+1} - 1)입니다. 두 경우로 나눕니다. Fk>0F_k \gt 0이면 Fk=ikxi(k1)F_k = \sum_{i \le k} x_i - (k-1)이고, 이를 대입하면 Fk+1=max(0,ik+1xik)F_{k+1} = \max\big(0, \sum_{i \le k+1} x_i - k\big)가 되어 주장된 형태와 같습니다. Fk=0F_k = 0이면, 가정에 의해 ikxik1\sum_{i \le k} x_i \le k - 1입니다; 양변에 xk+11x_{k+1} \le 1을 더하면 ik+1xik\sum_{i \le k+1} x_i \le k가 되므로 ik+1xik0\sum_{i \le k+1} x_i - k \le 0이고, 주장된 형태는 max(0,0 이하인 어떤 값)=0\max(0, \text{0 이하인 어떤 값}) = 0으로 계산되며, 한편 접기 단계도 xk+11x_{k+1} \le 1이므로 max(0,0+xk+11)=0\max(0, 0 + x_{k+1} - 1) = 0을 줍니다. 두 경우가 일치합니다. ∎ 동반 코드는 무작위 항수를 가진 쉰 번의 무작위 접기에 대해 이 항등식을 검사합니다(fuzzy_grad.py 271–277행).

이제 닫힌 형식을 미분해 봅시다. s=ixi(n1)s = \sum_i x_i - (n-1), 즉 클램프 이전 값을 이렇게 씁시다. s>0s \gt 0인 곳에서는 최댓값이 비활성이고 TŁ=sT_{\text{Ł}} = s는 모든 좌표에서 기울기가 1인 선형 함수입니다:

TŁxi=1모든 i에 대해(s>0).\frac{\partial T_{\text{Ł}}}{\partial x_i} = 1 \quad \text{모든 } i\text{에 대해} \qquad (s \gt 0).

s<0s \lt 0인 곳에서는 클램프가 활성이고 TŁ0T_{\text{Ł}} \equiv 0이 근방 전체에서 성립하는 상수 함수입니다:

TŁxi=0모든 i에 대해(s<0),\frac{\partial T_{\text{Ł}}}{\partial x_i} = 0 \quad \text{모든 } i\text{에 대해} \qquad (s \lt 0),

이는 꺾인 지점 s=0s = 0에서 서브그래디언트 0을 고른 것이며, 앞서와 동일한 힌지 관례입니다(fuzzy_grad.py 104–109행). 이것이 최솟값의 실패와 얼마나 다른지 주목하십시오. 최솟값은 n1n-1개의 입력을 굶기지만 언제나 하나는 가르칩니다. 우카시에비치는 사례별로 전부 아니면 전무입니다: 모든 논리곱 항이 기울기 1을 받거나(라우팅 표의 그 행이 바로 이 경우인데, 사슬의 합 0.9+0.8+0.5=2.20.9 + 0.8 + 0.5 = 2.2가 문턱 n1=2n - 1 = 2를 마침 넘기 때문입니다), 아니면 모든 논리곱 항이 정확히 0을 받습니다. 모든 것이 죽는 영역, 즉 죽은 구간(dead zone)은 집합 {x[0,1]n:ixin1}\lbrace x \in [0,1]^n : \sum_i x_i \le n - 1 \rbrace입니다; 중괄호를 소리 내어 읽으면 "xx의 좌표들의 합이 n1n - 1 이하인, nn차원 단위 정육면체 안의 점 xx들의 집합"입니다(콜론은 "그러한"이라고 읽습니다). 그 크기는 의견의 문제가 아닙니다; 정확한 부피를 가집니다.

ui=1xiu_i = 1 - x_i로 치환합시다. 각 uiu_i는 논리곱 항 ii의심(doubt)입니다. 사상 xux \mapsto u(화살표 \mapsto는 소리 내어 읽으면 "xxuu로 보내진다"는 뜻입니다)는 단위 정육면체를 자기 자신으로 보내는 반사(reflection)이므로 부피를 보존하며, xx가 정육면체 위에서 균등하다면 uu도 균등합니다. 살아있음 조건은 다음과 같이 바뀝니다

ixi>n1    i(1ui)>n1    niui>n1    iui<1:\sum_i x_i \gt n - 1 \;\Longleftrightarrow\; \sum_i (1 - u_i) \gt n - 1 \;\Longleftrightarrow\; n - \sum_i u_i \gt n - 1 \;\Longleftrightarrow\; \sum_i u_i \lt 1 :

논리곱은 정확히 총 의심이 1 미만일 때 살아 있습니다. 살아있는 영역은 표준 심플렉스(simplex)의 모서리 {u0,  iui<1}\lbrace u \ge 0,\; \sum_i u_i \lt 1\rbrace이며, 이제 그 부피를 유도합니다. t[0,1]t \in [0,1]에 대해 Vn(t)V_n(t){u[0,)n:iuit}\lbrace u \in [0,\infty)^n : \sum_i u_i \le t \rbrace의 부피라 둡시다(각 uit1u_i \le t \le 1이므로 정육면체 안에 머뭅니다). 주장: Vn(t)=tn/n!V_n(t) = t^n / n!이며, 여기서 n!=n(n1)21n! = n \cdot (n-1) \cdots 2 \cdot 1은 계승(factorial)입니다. 기저 사례: V1(t)=tV_1(t) = t는 구간 [0,t][0, t]의 길이이고, t1/1!=tt^1/1! = t입니다. 귀납 단계: 마지막 좌표를 따라 잘라 봅시다. 자르는 높이는 ww로 씁니다(위의 클램프 이전 값 ss와 헷갈리지 않도록 새 글자를 씁니다). un=wu_n = w이면, 나머지 좌표들은 i<nuitw\sum_{i \lt n} u_i \le t - w를 만족해야 하며, 이는 부피 Vn1(tw)V_{n-1}(t - w)를 갖는 집합이므로,

Vn(t)  =  0tVn1(tw)dw  =  0t(tw)n1(n1)!dw  =  0trn1(n1)!dr  =  tnn(n1)!  =  tnn!,V_n(t) \;=\; \int_0^t V_{n-1}(t - w)\, dw \;=\; \int_0^t \frac{(t-w)^{n-1}}{(n-1)!}\, dw \;=\; \int_0^t \frac{r^{n-1}}{(n-1)!}\, dr \;=\; \frac{t^n}{n\,(n-1)!} \;=\; \frac{t^n}{n!},

가운데 단계는 r=twr = t - w를 대입합니다(그러면 dr=dwdr = -dw이고 적분 한계가 뒤바뀌어 부호가 상쇄됩니다). t=1t = 1에서 살아있을 확률은 1/n!1/n!이므로, 균등 무작위 입력의 죽은 비율은 11/n!1 - 1/n!입니다. 계승은 무자비하게 커집니다: n=4n = 4에서 11/240.9581 - 1/24 \approx 0.958, n=8n = 8에서 11/403200.999981 - 1/40320 \approx 0.99998입니다. nn마다 200,000개의 균등 표본에 대한 측정 결과입니다(fuzzy_grad.py 199–213행):

[4] Łukasiewicz DEAD ZONE — max(0, Σx-(n-1)) clamped at 0 gives
ZERO gradient to every input; dead fraction of 200,000 uniform
samples vs the exact simplex volume 1 - 1/n!:
n measured exact 1-1/n!
2 0.50050 0.50000
3 0.83271 0.83333
4 0.95878 0.95833
5 0.99177 0.99167
8 0.99997 0.99998

마지막 행을 하나의 판결로 읽어 봅시다: 술어 출력이 거의 균등한 신경망을 초기화하고, 그 여덟 개를 우카시에비치로 논리곱하면, 사례의 99.997퍼센트가 그래디언트에 아무런 기여도 하지 못합니다. n4n \approx 4를 넘어서면, 입력이 이미 참에 가깝지 않은 한 사실상 아무것도 훈련되지 않으며 [1], 이것이 바로 이 t-노름에 대한 실용적인 우회책이 준비된(warm-started) 진리값이나 짧은 논리곱인 이유입니다.

소프트민: 매끄러운 수리책

최솟값의 문제는 그 그래디언트가 원-핫 벡터라는 점입니다. 수리책은 딱딱한 최솟값을 최솟값으로 수렴하면서도 그래디언트를 모든 입력에 걸쳐 퍼뜨리는 매끄러운 함수로 바꾸는 것입니다. 표준적인 구성은 소프트민(softmin), 즉 로그-합-지수(log-sum-exp) 평활화입니다: 온도(temperature) τ>0\tau \gt 0(입력과 같은 단위를 갖는 다이얼로, τ\tau가 작으면 날카롭고 크면 매끄럽습니다)에 대해,

softminτ(x)  =  τlogi=1nexi/τ.\operatorname{softmin}_\tau(x) \;=\; -\tau \,\log \sum_{i=1}^{n} e^{-x_i/\tau}.

이 구성을 안쪽에서부터 바깥쪽으로 해독해 봅시다: τ\tau로 나누고 부호를 바꾸면 작은 진리도가 큰 지수가 되고, 지수함수는 가장 작은 xix_i가 합을 지배하게 만들며, 로그는 그 지수 스케일을 되돌리고, 바깥의 τ-\tau는 부호 바꿈과 나눗셈을 되돌립니다. 두 개의 극한이 그 거동을 정확히 못 박으며, 둘 다 짧게 유도됩니다.

작은 τ: 소프트민은 명시적인 간극 상한과 함께 최솟값으로 수렴합니다. m=minixim = \min_i x_i라 둡시다. 합에서 em/τe^{-m/\tau}를 인수로 빼냅니다:

i=1nexi/τ  =  em/τi=1ne(xim)/τ.\sum_{i=1}^{n} e^{-x_i/\tau} \;=\; e^{-m/\tau} \sum_{i=1}^{n} e^{-(x_i - m)/\tau}.

이동된(shifted) 합에서는 모든 지수 (xim)/τ-(x_i - m)/\tau가 0 이하이므로(ximx_i \ge m이기 때문입니다), 모든 항은 e0=1e^0 = 1 이하이고 따라서 합은 nn 이하입니다; 그리고 argmin 자신의 항은 정확히 e0=1e^0 = 1이므로 합은 1 이상입니다. 순서를 보존하는 로그를 취하면: 0logie(xim)/τlogn0 \le \log \sum_i e^{-(x_i-m)/\tau} \le \log n입니다. 이제 인수분해된 곱에 τlog()-\tau \log(\cdot)를 적용합니다; 곱의 로그는 로그들의 합이므로,

softminτ(x)  =  τ(mτ+logie(xim)/τ)  =  mτlogie(xim)/τ,\operatorname{softmin}_\tau(x) \;=\; -\tau\Big({-\tfrac{m}{\tau}} + \log \sum_i e^{-(x_i-m)/\tau}\Big) \;=\; m - \tau \log \sum_i e^{-(x_i - m)/\tau},

그리고 괄호 안의 상하한을 대입하면(τ-\tau를 곱하면 부등호 방향이 뒤집힙니다):

mτlogn    softminτ(x)    m.m - \tau \log n \;\le\; \operatorname{softmin}_\tau(x) \;\le\; m.

소프트민은 아래로부터 최솟값에 접근하며, 그 간극은 최대 τlogn\tau \log n으로, 온도에 대해 선형입니다. τ\tau를 절반으로 줄이면 최악의 간극도 절반이 됩니다. 이 인수분해된 형식은 또한 코드가 오버플로 없이 이를 계산하는 방식이기도 합니다: 이동된 지수들은 모두 0 이하이므로, τ=0.01\tau = 0.01에서도 아무것도 폭발하지 않습니다(fuzzy_grad.py 114–124행).

큰 τ: 소프트민은 평균을 향해 평평해집니다. 각 지수함수를 1차까지 전개하면 exi/τ=1xi/τ+O(1/τ2)e^{-x_i/\tau} = 1 - x_i/\tau + O(1/\tau^2)입니다(표기 O(1/τ2)O(1/\tau^2)은 적어도 1/τ21/\tau^2만큼 빠르게 줄어드는 항들을 모은 것입니다). ii에 대해 합하고 산술평균을 xˉ=1nixi\bar{x} = \tfrac{1}{n}\sum_i x_i로 쓰면, 그 합은 n(1xˉ/τ+O(1/τ2))n\big(1 - \bar{x}/\tau + O(1/\tau^2)\big)입니다. log(ab)=loga+logb\log(ab) = \log a + \log blog(1+z)=z+O(z2)\log(1 + z) = z + O(z^2)를 이용하면,

softminτ(x)  =  τ(lognxˉτ+O(1/τ2))  =  xˉτlogn+O(1/τ).\operatorname{softmin}_\tau(x) \;=\; -\tau\Big(\log n - \frac{\bar{x}}{\tau} + O(1/\tau^2)\Big) \;=\; \bar{x} - \tau \log n + O(1/\tau).

입력과 무관한 오프셋 τlogn\tau \log n을 제외하면, 온도가 높은 소프트민은 그저 입력들의 평균일 뿐입니다: 어떤 입력도 특별하지 않으며, 이는 다이얼의 평평한 쪽 끝입니다. 훈련에서 흥미로운 쪽 끝은 그래디언트이며, 그것에는 이름이 있습니다. 먼저 규칙이 하나 더 필요합니다. 자연로그의 도함수는 u>0u \gt 0에 대해 ddulogu=1u\tfrac{d}{du}\log u = \tfrac{1}{u}이며, 따라서 logu\log u의 변화율은 그 인수의 역수입니다(항등식 elogu=ue^{\log u} = u를 연쇄 법칙으로 미분하면 eloguddulogu=1e^{\log u} \cdot \tfrac{d}{du}\log u = 1이고, 양변을 elogu=ue^{\log u} = u로 나누면 됩니다); 이 장 뒷부분의 로그 공간 손실들도 같은 규칙에 기댑니다. S=jexj/τS = \sum_j e^{-x_j/\tau}라 두면, 연쇄 법칙은 단계별로 다음을 줍니다,

xi(τlogS)  =  τ1SSxi  =  τ1Sexi/τ(1τ)  =  exi/τS  =  softmax(x/τ)i.\frac{\partial}{\partial x_i}\big(-\tau \log S\big) \;=\; -\tau \cdot \frac{1}{S} \cdot \frac{\partial S}{\partial x_i} \;=\; -\tau \cdot \frac{1}{S} \cdot e^{-x_i/\tau} \cdot \Big({-\frac{1}{\tau}}\Big) \;=\; \frac{e^{-x_i/\tau}}{S} \;=\; \operatorname{softmax}(-x/\tau)_i .

소프트민의 그래디언트는 정확히 부호가 바뀌고 온도로 스케일링된 입력들의 소프트맥스 가중치 벡터입니다: 각 성분은 엄격히 양수이며(지수함수는 결코 0이 되지 않습니다) 그 합은 S/S=1S/S = 1, 즉 볼록 결합(convex combination)입니다. 모든 논리곱 항은 매 단계마다 살아 있으며, 온도는 희소성을 연속적으로 조절합니다: τ0\tau \to 0이면 가중치가 argmin에 집중되고(극한으로서 괴델의 원-핫 라우팅을 회복합니다), τ\tau \to \infty이면 가중치는 균일한 벡터 (1/n,,1/n)(1/n, \ldots, 1/n)로 평평해집니다. 구현은 동일한, 오버플로에 안전한 이동을 사용하며 이는 비율에서 상쇄됩니다(fuzzy_grad.py 127–134행):

def softmin_grad(x: np.ndarray, tau: float) -> np.ndarray:
# With S = Σ_j exp(-x_j/τ):
# ∂softmin/∂x_i = -τ · (1/S) · exp(-x_i/τ) · (-1/τ)
# = exp(-x_i/τ) / S = softmax(-x/τ)_i.
# Every weight is strictly positive and they sum to 1: a convex
# combination that leans on the smallest inputs but starves none.
z = np.exp(-(x - float(np.min(x))) / tau) # same shift, cancels in z/Σz
return z / float(np.sum(z))

이어지는 사슬에서 τ=0.1\tau = 0.1일 때 가중치는 (0.0171,0.0466,0.9362)(0.0171, 0.0466, 0.9362)입니다: 가장 약한 엣지는 여전히 그래디언트의 94퍼센트를 받는, 최솟값과 비슷한 거동을 보이지만, 다른 두 엣지도 진짜의, 0이 아닌 신호를 받으며, 유한차분 검사는 이 유도를 1.064×10111.064 \times 10^{-11}까지 인증합니다. 수렴 주장 역시 추상적으로 남겨 둔 극한 논증이 아니라 커밋된 표입니다(fuzzy_grad.py 216–226행): [0,1]5[0,1]^5 안의 균등 벡터 500개에 대한 최대 간극은 τ\tau에 따라 줄어들며 언제나 상한 τlog51.609τ\tau \log 5 \approx 1.609\,\tau를 지킵니다:

[5] softmin_τ(x) = -τ·log Σ exp(-x_i/τ): the smooth min —
max |softmin_τ - min| over 500 uniform vectors (n = 5):
τ max gap bound τ·log n
1.0 1.544452 1.609438
0.1 0.119991 0.160944
0.01 0.006536 0.016094

경계 폭발과 ε-클램프

소프트민은 최솟값을 수리합니다. 곱의 소실에는 그 나름의 고전적인 수리책이 있습니다: 로그 공간(log space)에서 작업하는 것입니다. 접지들의 배치에 대한 진리 벡터 a=(a1,,an)a = (a_1, \ldots, a_n)에 걸쳐 TP(a)=iaiT_P(a) = \prod_i a_i를 최대화하는 것은, 로그 함수가 엄격히 증가하므로, 그 음의 로그를 최소화하는 것과 같습니다:

L(a)  =  logi=1nai  =  i=1nlogai,Lai  =  1ai.L(a) \;=\; -\log \prod_{i=1}^{n} a_i \;=\; -\sum_{i=1}^{n} \log a_i, \qquad \frac{\partial L}{\partial a_i} \;=\; -\frac{1}{a_i}.

이 편미분을 나머지-하나-빼기 곱과 비교해 봅시다. 로그는 논리곱 항들을 서로 분리시켰습니다: 원자 ii의 그래디언트는 오직 자기 자신의 진리값에만 의존하며, 다른 n1n - 1개의 인자에 대한 곱은 전혀 없으므로, nn이 커져도 아무것도 소실되지 않습니다. 약한 원자(작은 aia_i)는 큰 교정 그래디언트를 받고, 강한 원자는 작은 그래디언트를 받습니다. 이 로그-곱 손실은 접지들의 배치를 하나로 접는 바로 이 일을 위해 체계적인 연산자 분석 자신이 권장하는 수리책이며, 서로 분리된 도함수 1/ai1/a_i도 거기서 유도됩니다 [1]. 논리 텐서 네트워크(LTN)는 같은 곱 계열 안에서 작업하되 손실을 진리값 공간에 둡니다: 그 프로덕션 기본값인 안정적 곱 설정(stable product configuration)은 곱 계열 논리 결합자에 양화사를 위한 일반화된 p-평균 집계자(조절 가능한 지수를 갖는 거듭제곱 평균)를 짝지우고, 특이한 입력은 모두 아래에서 소개할 사영으로 보호하며, 손실 1SatAgg1 - \mathrm{SatAgg}, 즉 이론의 집계된 만족도를 1에서 뺀 값으로 훈련합니다 [2]. 로그 손실이든 진리값 공간 손실이든, 특이점은 진리 구간의 경계, 정확히 실제 데이터가 놓이는 자리에 있습니다. ai0a_i \to 0일 때 손실 항 logai-\log a_i는 발산하고 그래디언트 크기 1/ai1/a_i는 무계가 됩니다. 부정된 논리식에 대한 대칭 손실 log(1ai)-\log(1 - a_i)ai1a_i \to 1일 때 똑같은 방식으로 발산합니다.

동반 코드는 이어지는 세계로부터 이 예시를 구성합니다(fuzzy_grad.py 310–325행): 진리 벡터 a=(1.0,  0.9,  0.0)a = (1.0,\; 0.9,\; 0.0)이며, 여기서 1.0은 1권의 kb.py에서 명확하게 단언된 사실 advises(alice, bob)이고, 0.9는 2권의 annotated.py에서 온 cites(p3, p2)이며, 0.0은 뒤집힌 엣지 cites(p1, p3)로 그냥 거짓입니다. 정확히 거짓인 접지가 하나만 있어도 논리곱 손실 전체 ilogai-\sum_i \log a_i는 말 그대로 무한대가 됩니다; 정확히 참인 접지가 하나만 있어도 부정 손실 log(1a)-\log(1 - a) 역시 무한대가 됩니다. 확신에 찬 예시 하나가 배치 전체의 갱신을 망가뜨립니다. 수리책은 작은 상수 ε\varepsilon(코드는 ε=104\varepsilon = 10^{-4}를 씁니다, fuzzy_grad.py 66행)를 갖는 한 쌍의 아핀 안정화 사영(stability projection)이며, 진리값이 로그나 몫에 들어가기 전에 적용됩니다(fuzzy_grad.py 139–148행):

def pi_0(a, eps: float = EPS):
# π₀(a) = (1-ε)·a + ε — maps [0,1] to [ε, 1]: bounds truth values away
# from 0 before a log/quotient that is singular there (LTN eq. 13/19).
return (1.0 - eps) * a + eps


def pi_1(a, eps: float = EPS):
# π₁(a) = (1-ε)·a — maps [0,1] to [0, 1-ε]: bounds truth values
# away from 1 before log(1-a) etc. (LTN eq. 14/20).
return (1.0 - eps) * a

π₀는 단위 구간을 [ε,1][\varepsilon, 1]로 압축하여 진리값을 바닥으로부터 떼어 놓고, π₁은 그것을 [0,1ε][0, 1-\varepsilon]로 압축하여 천장으로부터 떼어 놓습니다. 두 상한 모두 이제 연쇄 법칙으로 유도되며, 모든 단계를 보여 드립니다. 양의 쪽에서는 π0(a)=1ε\pi_0'(a) = 1 - \varepsilon이므로(아핀 함수의 도함수는 그 기울기입니다),

dda[logπ0(a)]  =  π0(a)π0(a)  =  1επ0(a),dda[logπ0(a)]    1εε,\frac{d}{da}\big[-\log \pi_0(a)\big] \;=\; -\frac{\pi_0'(a)}{\pi_0(a)} \;=\; -\frac{1-\varepsilon}{\pi_0(a)}, \qquad \Big|\frac{d}{da}\big[-\log \pi_0(a)\big]\Big| \;\le\; \frac{1-\varepsilon}{\varepsilon},

마지막 단계는 [0,1][0,1] 전체에서 π0(a)ε\pi_0(a) \ge \varepsilon이기 때문입니다. 손실 자체도 같은 이유로 logπ0(a)logε-\log \pi_0(a) \le -\log \varepsilon을 만족합니다. 부정 쪽에서는 1π1(a)=1(1ε)a1(1ε)=ε1 - \pi_1(a) = 1 - (1-\varepsilon)a \ge 1 - (1-\varepsilon) = \varepsilon이고,

dda[log(1π1(a))]  =  π1(a)1π1(a)  =  1ε1π1(a)    1εε.\frac{d}{da}\big[-\log(1 - \pi_1(a))\big] \;=\; \frac{\pi_1'(a)}{1 - \pi_1(a)} \;=\; \frac{1-\varepsilon}{1 - \pi_1(a)} \;\le\; \frac{1-\varepsilon}{\varepsilon}.

ε=104\varepsilon = 10^{-4}일 때 상한은 손실 항당 logε=9.2103-\log \varepsilon = 9.2103, 그래디언트당 (1ε)/ε=9999.0(1-\varepsilon)/\varepsilon = 9999.0으로 계산됩니다: 크지만, 여전히 제약 쪽으로 세게 조종하면서도, 유한합니다. 두 클램프의 도함수 모두 네 연결사 그래디언트와 동일한 인증을 받습니다: 해석적 형태 (1ε)/π0(a)-(1-\varepsilon)/\pi_0(a)(1ε)/(1π1(a))(1-\varepsilon)/(1-\pi_1(a))는 매끄러운 사슬 점에서 중심 유한차분에 맞서 검사됩니다(fuzzy_grad.py 344–354행). 클램프 적용 전/후를 비교하는 커밋된 예시입니다(fuzzy_grad.py 330–343행):

[6] the LTN stability clamps π₀(a) = (1-ε)a + ε, π₁(a) = (1-ε)a
(ε = 0.0001); grounding truths a = (1.0, 0.9, 0.0):
advises(alice,bob) = 1.0 (crisp fact, kb.py), cites(p3,p2) =
0.9 (annotated.py), reversed cites(p1,p3) = 0.0 (false).
unclamped with π₀/π₁
-Σ log a_i (∧ as loss) inf 9.3157
max |∂| = 1/a inf 9999.0
-log(1-a) at a = 1 (¬φ) inf 9.2103
∂ = 1/(1-a) inf 9999.0
bounds with clamps: loss ≤ -log ε = 9.2103 per term, |grad| ≤ (1-ε)/ε = 9999.0
one exactly-false grounding turns the whole loss to inf — the
clamps are load-bearing, not cosmetic (LTN eqs. 19-20).

이득만큼이나 그 대가도 분명하게 밝혀 둡시다. 원천 시스템도 그렇게 하기 때문입니다 [2]. 클램프가 적용된 논리곱은 더 이상 정확히 t-노름이 아닙니다. 사영을 곱을 통해 밀어 넣어 유효 이항 결합자 T~(x,y)=π0(x)π0(y)\tilde{T}(x, y) = \pi_0(x) \cdot \pi_0(y)를 생각해 봅시다: y=1y = 1로 두고 π0(1)=(1ε)1+ε=1\pi_0(1) = (1-\varepsilon)\cdot 1 + \varepsilon = 1임을 이용하면 T~(x,1)=π0(x)1=(1ε)x+εx\tilde{T}(x, 1) = \pi_0(x) \cdot 1 = (1-\varepsilon)x + \varepsilon \ne x가 되므로, 지난 장이 편차 정확히 0.0으로 검증했던 공리인 단위 법칙 T(x,1)=xT(x, 1) = x가 이제는 최대 ε\varepsilon만큼 깨집니다. 이 거래는 의도적입니다: 유계인 손실과 유계인 그래디언트를, 대수의 작고 영구적인 왜곡을 대가로 사들이는 것입니다.

설계표

이제 표 하나가 이 장을 요약하며, 이후 장들은 어떤 시스템이 자신의 t-노름을 선언할 때마다 이를 재사용합니다. 모든 칸은 정성적인 인상이 아니라 위 실행에서 나온 커밋된 숫자입니다.

논리곱T/xi\partial T / \partial x_i그래디언트 성격대규모에서 측정된 실패수리책
괴델   TG=minixi\;T_G = \min_i x_iargmin에서 1, 그 외에는 0희소함: 단일 입력 신용 할당n=50n = 50에서 제로-그래디언트 비율 0.98000.9800softminτ_\tau: 모든 가중치가 양수, 간극 τlogn\le \tau \log n(τ=0.01\tau = 0.01, n=5n = 5에서 측정값 0.0065360.006536)
  TP=ixi\;T_P = \prod_i x_ijixj\prod_{j \ne i} x_j조밀하고 합리적으로 순위가 매겨지지만 줄어듦n=50n = 50에서 0.949=0.0057260.9^{49} = 0.005726로그 공간(=1/ai\partial = -1/a_i, 나머지-하나-빼기 곱 없음) 및 π₀/π₁ 클램프(항당 손실 9.2103\le 9.2103, 그래디언트 9999.0\le 9999.0)
우카시에비치   TŁ=max(0,ixi(n1))\;T_{\text{Ł}} = \max(0, \sum_i x_i - (n-1))ixi>n1\sum_i x_i \gt n-1이면 모든 입력에 1, 아니면 모든 입력에 0이진적: 전부 살거나 전부 죽음죽은 비율 11/n!1 - 1/n!, n=8n = 8에서 측정값 0.999970.99997논리곱을 짧게 유지하거나, 진리값을 1 근처에서 준비시켜 시작하거나(warm-start), 긴 몸체에는 쓰지 않기

이것들은 가상의 메뉴 선택이 아닙니다. 바로 이 세 t-노름으로 구성된 제약 훈련 손실들은 논리적 요구 사항을 가진 실제 지각 과제인 ROAD-R 자율주행 벤치마크에서 정면으로 비교된 바 있으며, 그곳에서 t-노름은 손실의 명시적인 설계 축입니다 [3]. 그리고 진리-함수적 연산자를 미분 가능하게 만든 이 퍼지 계열은, 그래디언트를 설계 기준으로 삼아, 뉴로-심볼릭 방법론이라는 더 큰 지도의 한 갈래입니다; 그 지형에 대한 조사는 이를 이 권의 2부가 다음으로 다룰 확률적 계열 바로 옆에 놓습니다 [4].

해결되지 않은 부분

이 장의 모든 수리책은 대수를 팔아 훈련 가능성을 사들이며, 그 부채는 정확히 계산할 수 있습니다. 소프트민은 t-노름이 아닙니다. 단위원소를 넣어 봅시다: 두 입력 xx11에 대해,

softminτ(x,1)  =  τlog(ex/τ+e1/τ)  <  τlog(ex/τ)  =  x,\operatorname{softmin}_\tau(x, 1) \;=\; -\tau \log\big(e^{-x/\tau} + e^{-1/\tau}\big) \;\lt\; -\tau \log\big(e^{-x/\tau}\big) \;=\; x,

이 엄격한 부등호는 로그 안의 합이 두 번째의, 엄격히 양수인 항을 갖고 바깥의 τlog()-\tau\log(\cdot)가 엄격히 감소하기 때문에 성립합니다. 그래서 이전 장이 편차 정확히 0.0으로 검증했던 공리인 단위 법칙 T(x,1)=xT(x, 1) = x는 모든 xx와 모든 τ>0\tau \gt 0에서 깨집니다. 더 나쁜 것은, 소프트민이 진리 구간 안에조차 머물지 않는다는 것입니다: 모서리 x=(1,1)x = (1, 1)에서는 1τlog21 - \tau \log 2를 반환하고, (0,0)(0, 0)에서는 τlog2-\tau \log 2, 즉 음수인 진리값을 반환합니다(τ=0.1\tau = 0.1에서 0.069\approx -0.069입니다). ε-클램프도 앞 절 끝에서 정량화한 것과 같은 종류의 부채를 짊어집니다: 클램프가 적용된 곱은 단위 법칙을 최대 ε\varepsilon만큼 영구적으로 위반합니다. 이 가운데 어느 것도 이 수리책들을 쓰는 시스템들에 의해 감추어지지 않습니다; 안정적 곱 설정은 논리적 선택이라기보다 수치적 필요성으로서 정확하게 문서화되어 있습니다 [2]. 진정으로 열려 있는 것은 감사(audit)입니다. 훈련된 모델의 손실 곡선은 평활화된 논리(훈련 온도에서의 소프트민, 클램프된 진리값)를 보고하는 반면, 실무자가 추론하고 결과를 보고하는 대상인 의미론은 평활화되지 않은 t-노름입니다. 어떤 현재의 프레임워크도 이 둘 사이의 간극을 추적하지 않습니다: 어떤 시스템이 τ=0.1\tau = 0.1에서 인증하는 논리식의 진리값들이, 수천 개의 논리식과 훈련 단계에 걸쳐 누적되면서, 최솟값이 부여했을 진리값들로부터 얼마나 벗어날 수 있는지는, 이 장에서 하나의 논리곱에 대해서는 측정되었지만(위아래로 조이는 부등식에 의해 적용당 최대 τlogn\tau \log n입니다) 대규모에서는 어디서도 감사되지 않습니다. 훈련 가능성은 논리적 부채로 사들이는 것이며, 이 분야는 현재 어떤 장부도 기록하지 않습니다.

왜 중요한가

이 장은 이 권의 경첩을 축소판으로 보여 줍니다. 1부의 약속은 논리가 손실이 될 수 있다는 것이었습니다; 라우팅 표는 그 약속의 작은 글씨입니다. 이어지는 모든 미분 가능 논리 시스템은 논리곱을 하나 선언해야 하며, 그렇게 하는 순간 설계표의 한 행을 물려받습니다: 논리 텐서 네트워크 장은 여기서 그 대가를 매긴 클램프를 가진 안정적 곱 설정 위에 언어 전체를 짓고, 의미 손실 장은 곱을 유지하되 그것을 정확한 확률을 거쳐 다시 배선하며, 이 권 후반부의 퍼지 질의 응답 기계 장치는 수백만 개의 임베딩된 원자에 걸쳐 괴델과 곱 연산자를 실행하는데, 여기서는 원-핫 그래디언트와 소프트맥스 그래디언트의 차이가 무엇이 조금이라도 훈련되는지를 결정합니다. 이 장은 또한 이 시리즈의 두 기둥과의 고리를 닫습니다. 기호주의 기둥은 연산자들과 그 공리를 제공했습니다; 신경 기둥은 공리가 결코 묻지 않는 단 하나의 질문, 즉 당신의 도함수는 무엇인가를 제공했으며, 3권의 어텐션 장이 소프트맥스 형태로 측정한 그래디언트 소실 질병이 원자 쉰 개짜리 규칙 몸체에도 그대로 적용된다는 것이 드러났습니다. 5권을 내다보면, 이 교훈은 신뢰의 문제로 일반화됩니다: 자신의 원자 중 98퍼센트를 조용히 굶기거나 자신의 사례 중 99.997퍼센트에서 죽어 버리는 훈련 신호는 손실 곡선만으로는 진단될 수 없습니다. 시스템의 목표가 가르친다고 주장한 것이 아니라 시스템이 실제로 무엇을 배웠는지를 감사하는 것이, 바로 그 권이 여는 문제입니다.

핵심 용어

  • 그래디언트 게이트(gradient gate): 논리 결합자를 통해 원자 ii로 흘러가는 모든 매개변수 갱신에 곱해지는 인자 T/xi\partial T / \partial x_i입니다; 이것이 0이면, 그 원자는 오차가 아무리 크더라도 이번 단계에서 아무것도 배우지 못합니다.
  • 단일 통과(원-핫) 그래디언트(single-passing (one-hot) gradient): 조각별 선형성으로부터 유도되는 괴델 최솟값의 라우팅 정책입니다: 유일한 argmin에서는 서브그래디언트 1, 나머지 n1n-1개의 입력에서는 0이므로, 제로-그래디언트 비율은 정확히 (n1)/n(n-1)/n입니다.
  • 나머지-하나-빼기 곱(leave-one-out product): 곱 t-노름의 편미분 TP/xi=jixj\partial T_P / \partial x_i = \prod_{j \ne i} x_j입니다; 조밀하고 합리적으로 순위가 매겨져 있지만, 균등 입력에서는 cn1c^{\,n-1}과 같아지며, 이는 논리곱 항의 개수에 대한 기하급수적 감쇠입니다.
  • 죽은 구간(dead zone): nn-항 우카시에비치 논리곱이 0으로 클램프되어 모든 입력이 정확히 0인 그래디언트를 받는 영역 ixin1\sum_i x_i \le n - 1입니다; 균등 입력 아래에서 그 부피는 심플렉스 부피 tn/n!t^n/n!로부터 유도된 11/n!1 - 1/n!입니다.
  • 소프트민(로그-합-지수 평활화)(softmin, log-sum-exp smoothing): softminτ(x)=τlogiexi/τ\operatorname{softmin}_\tau(x) = -\tau \log \sum_i e^{-x_i/\tau}이며, min(x)τlogn\min(x) - \tau\log nmin(x)\min(x) 사이에 끼여 있고, 그래디언트는 소프트맥스 가중치 softmax(x/τ)\operatorname{softmax}(-x/\tau)와 같아 엄격히 양수이며 합이 1입니다.
  • 온도(temperature) τ\tau: 소프트민의 날카로움 다이얼입니다; τ0\tau \to 0이면 최솟값과 그 원-핫 라우팅을 회복하고, τ\tau가 크면 균일한 가중치로 평균을 향해 평평해집니다.
  • 안정화 사영 π₀, π₁(stability projections): 진리값을 0과 1로부터 떼어 놓는 아핀 클램프 π0(a)=(1ε)a+ε\pi_0(a) = (1-\varepsilon)a + \varepsilonπ1(a)=(1ε)a\pi_1(a) = (1-\varepsilon)a이며, 로그-손실을 항당 logε-\log\varepsilon로, 그 그래디언트를 (1ε)/ε(1-\varepsilon)/\varepsilon로 유계로 만듭니다.
  • 안정적 곱 설정(stable product configuration): 논리 텐서 네트워크의 프로덕션 조리법입니다: 곱 계열 연산자와 일반화된 p-평균 집계자이며, 특이한 입력은 모두 사영으로 보호됩니다; 로그 공간 손실은 체계적인 연산자 분석이 권장하는 동반 수리책으로, 같은 사영에 기댑니다.
  • 중심 유한차분(central finite difference): 오차가 h2h^2 차수인 양방향 추정치 (f(x+hei)f(xhei))/(2h)\big(f(x + h e_i) - f(x - h e_i)\big)/(2h)입니다; 이 장에서 손으로 유도한 모든 그래디언트가 이에 맞서 검사되는 인증 도구입니다.
  • 논리적 부채(logical debt): 훈련 가능성 수리책이 도입하는 의미론적 왜곡입니다(소프트민의 깨진 단위 법칙과 범위 밖 값들, 클램프의 단위 공리에 대한 ε\varepsilon-위반), 유계이고 소실하지 않는 그래디언트를 위해 의도적으로 치르는 대가입니다.

이 장이 이어지는 곳

1부는 이제 완결되었으며, 그 장부는 두 개의 열을 가지고 있습니다. 진리-함수적 퍼지 논리는 모든 논리 결합자를 고정되고, 값싸고, 미분 가능한 함수로 만들었으며, 이 장은 그 대가를 보여 주었습니다: 정직한 연산자들은 병리적인 그래디언트를 가지고, 훈련 가능한 연산자들은 더 이상 온전한 논리가 아닙니다. 2부는 그 지도의 다른 갈래를 택합니다 [4]. 그것은 진리-함수성을 완전히 포기합니다: 논리곱의 확률은 그 논리곱 항들의 확률의 함수가 아니며(그것은 논리곱 항들이 증거를 어떻게 공유하는지에 달려 있습니다), 그래서 아무리 영리하게 평활화된 연산자 표라도 그것을 계산할 수 없습니다. 그 대체물은 분포 의미론(distribution semantics)이며, 여기서는 확률적 사실을 가진 논리 프로그램이 가능 세계들에 대한 단 하나의 정확한 분포를 정의하고, 질의의 진리값은 진짜의, 잘 거동하는 도함수를 가진 진짜 확률입니다. 미적분은 정확해집니다; 아무것도 클램프되지 않고, 아무것도 평활화되지 않으며, 어떤 단위 법칙도 깨지지 않습니다. 비용은 다른 곳으로, 즉 그래디언트 병리에서 계수(counting)로 옮겨 가는데, 가능 세계에 대한 합산이 컴파일로 길들여야 하는 지수적인 작업이기 때문입니다. 다음 장인 분포 의미론은 동일한 학술 세계 지식 베이스 위에 그 토대를 지으며, 23개의 사실 가운데 열한 개를 독립적인 동전으로 바꾸고, 그 뒤를 잇는 두 장이 그 계수 비용을 치릅니다.


동반 코드: examples/integration/fuzzy_grad.py는 이 장의 모든 연산자, 손으로 유도한 모든 그래디언트, 유한차분 인증기, 그리고 네 가지 측정 연구 전부를 구현합니다; 그것이 미분하는 t-노름 대수는 지난 장에서 examples/integration/tnorms.py가 정확하게 검증한 바로 그것입니다. 위의 모든 표를 재현하려면 examples/integration/에서 python3 fuzzy_grad.py를 실행하십시오; 스위트 하니스 examples/integration/validate.py는 그 단언들(라우팅 벡터, FD 게이트, (n1)/n(n-1)/n 희소성 법칙, 0.9490.9^{49} 소실 하한, 11/n!1 - 1/n! 죽은 구간 일치, τlogn\tau\log n 상한, 그리고 클램프 상한)을 이 권의 인증 판정의 일부로서 다시 실행합니다.