제한된 볼츠만 기계의 파생 및 응용(2024년 노벨상) | 작성자: Ryan D’Cunha | 2025년 1월

제한된 볼츠만 기계의 파생 및 응용(2024년 노벨상) | 작성자: Ryan D’Cunha | 2025년 1월

Geoffrey Hinton의 노벨상 수상 작품을 조사하고 PyTorch를 사용하여 처음부터 구축하기

라이언 디쿠냐
데이터 과학을 향하여

2024년 노벨 물리학상 수상자 중 한 명은 AI 및 기계 학습 분야에 기여한 제프리 힌튼(Geoffrey Hinton)이었습니다. 많은 사람들이 그가 신경망 분야에 종사했으며 “AI의 대부”라고 불린다는 것을 알고 있지만 그의 작품을 이해하는 사람은 거의 없습니다. 특히 그는 수십 년 전에 제한된 볼츠만 기계(RBM)를 개척했습니다.

이 기사는 RBM에 대한 연습이 될 것이며 이러한 복잡한 수학 기계 뒤에 있는 직관을 제공할 수 있기를 바랍니다. 파생 과정을 거친 후 PyTorch에서 RBM을 처음부터 구현하는 방법에 대한 몇 가지 코드를 제공하겠습니다.

RBM은 비지도 학습의 한 형태입니다(입력만 학습에 사용되며 출력 레이블은 사용되지 않음). 이는 출력에 의존하지 않고 데이터에서 의미 있는 특징을 자동으로 추출할 수 있음을 의미합니다. RBM은 이진 입력을 갖는 두 가지 유형의 뉴런으로 구성된 네트워크입니다. 엑스숨겨져 있고, 시간. 눈에 보이는 뉴런은 입력 데이터를 받아들이고 숨겨진 뉴런은 특징/패턴을 감지하는 방법을 학습합니다.

입력이 있는 RBM 엑스 그리고 히든 레이어 와이. 원천: [1]

좀 더 기술적인 용어로 말하면 RBM은 확률론적 이진 가시 변수와 숨겨진 변수가 있는 무방향 이분 그래픽 모델이라고 말합니다. RBM의 주요 목표는 관절 구성의 에너지를 최소화하는 것입니다. 이자형(x,h) 자주 대조 학습을 사용합니다(나중에 논의됨).

에너지 함수는 물리적 에너지와 일치하지 않지만 물리학/통계에서 나옵니다. 점수 계산 기능처럼 생각하세요. 에너지 함수 이자형 구성에 더 낮은 점수(에너지)를 할당합니다. 엑스 모델이 선호하기를 바라는 구성과 피하고 싶은 구성에 더 높은 점수를 부여합니다. 에너지 기능은 모델 설계자로서 선택할 수 있는 것입니다.

RBM의 경우 에너지 함수는 다음과 같습니다(볼츠만 분포를 따라 모델링됨).

RBM 에너지 함수. 출처: 작성자

에너지 함수는 3개의 항으로 구성됩니다. 첫 번째는 숨겨진 레이어와 보이는 레이어 사이의 가중치와의 상호작용입니다. W. 두 번째는 가시 단위에 대한 바이어스 항의 합입니다. 세 번째는 숨겨진 단위에 대한 편향 항의 합입니다.

에너지 함수를 사용하면 볼츠만 분포에 의해 주어진 관절 구성의 확률을 계산할 수 있습니다. 이 확률 함수를 사용하여 단위를 모델링할 수 있습니다.

RBM의 공동 구성 가능성. 출처: 작성자

는 분할 함수(정규화 상수라고도 함)입니다. 이는 보이는 유닛과 숨겨진 유닛의 가능한 모든 구성에 대한 e^(-E)의 합입니다. Z의 가장 큰 문제점은 가능한 모든 구성을 합산해야 하기 때문에 정확하게 계산하는 것이 일반적으로 계산적으로 다루기 어렵다는 것입니다. 다섯 그리고 시간. 예를 들어, 이진 단위를 사용하는 경우 눈에 보이는 단위와 N 숨겨진 단위의 경우 합이 2^(+N) 구성. 따라서 계산을 피할 수 있는 방법이 필요합니다. .

이러한 함수와 분포가 정의되면 훈련 및 구현에 대해 이야기하기 전에 추론을 위한 몇 가지 파생 사항을 검토할 수 있습니다. 우리는 이미 계산할 수 없다고 언급했습니다. 결합 확률 분포에서. 이 문제를 해결하기 위해 Gibbs Sampling을 사용할 수 있습니다. Gibbs Sampling은 결합 분포에서 직접 샘플링이 어려울 때 지정된 다변량 확률 분포에서 샘플링하기 위한 Markov Chain Monte Carlo 알고리즘이지만 조건부 분포에서 샘플링하는 것이 더 실용적입니다. [2]. 따라서 조건부 분포가 필요합니다.

A에 대한 가장 큰 부분은 제한된 볼츠만 대 완전히 연결됨 볼츠만은 레이어 내에 연결이 없다는 사실입니다. 이는 가시 레이어가 주어지면 모든 숨겨진 유닛이 조건부 독립이고 그 반대의 경우도 마찬가지임을 의미합니다. 시작하는 것이 무엇인지 살펴보겠습니다. 피(x|h):

조건부 분포 p(h|x). 출처: 작성자

조건부 분포가 j가 jᵗʰ 행인 시그모이드 함수로 단순화되는 것을 볼 수 있습니다. . 내가 포함시킨 훨씬 더 엄격한 계산이 있습니다. 충수 이 파생의 첫 번째 줄을 증명합니다. 관심이 있다면 연락하세요! 이제 조건부 분포를 살펴보겠습니다. (h|x):

조건부 분포 p(x|h). 출처: 작성자

우리는 이 조건부 분포가 k가 kᵗʰ 행인 시그모이드 함수로 단순화되는 것을 볼 수 있습니다. W. RBM의 제한된 기준으로 인해 조건부 분포는 추론 중에 Gibbs 샘플링에 대한 쉬운 계산으로 단순화됩니다. RBM이 정확히 무엇을 배우려고 하는지 이해하고 나면 이를 PyTorch에서 구현하겠습니다.

대부분의 딥러닝과 마찬가지로 우리는 모델을 훈련하기 위해 음의 로그 우도(NLL)를 최소화하려고 노력하고 있습니다. RBM의 경우:

RBM의 경우 NLL입니다. 출처: 작성자

이것의 미분을 취하면 다음과 같은 결과가 나옵니다.

NLL의 파생물. 출처: 작성자

방정식 왼쪽의 첫 번째 항은 실제 데이터의 에너지를 낮추도록 모델을 밀어붙이기 때문에 양의 위상이라고 합니다. 이 용어에는 숨겨진 유닛에 대한 기대가 포함됩니다. 시간 실제 훈련 데이터를 바탕으로 엑스. 실제 훈련 데이터 xᵗ가 있고 조건부 독립으로 인해 h에 대한 기대치를 계산할 수 있으므로 양수 단계는 계산하기 쉽습니다.

두 번째 항은 현재 모델이 가능성이 있다고 생각하는 구성의 에너지를 높이기 때문에 음의 위상이라고 합니다. 이 용어는 두 가지 모두에 대한 기대를 포함합니다. 엑스 그리고 시간 모델의 현재 분포 하에서. 모델의 전체 결합 분포에서 샘플링해야 하기 때문에 계산하기가 어렵습니다. (x,h) (이를 위해서는 Markov 체인이 필요하며 훈련에서 반복적으로 수행하는 것은 비효율적입니다). 다른 대안에는 컴퓨팅이 필요합니다. 우리는 이미 실현 불가능하다고 간주했습니다. 음의 위상 계산 문제를 해결하기 위해 다음을 사용합니다. 대조 발산.

대조 발산의 핵심 아이디어는 잘린 Gibbs 샘플링을 사용하여 k 반복 후 점 추정치를 얻는 것입니다. 기대치 음수 위상을 이 점 추정으로 대체할 수 있습니다.

대조 발산. 원천: [3]

일반적으로 k = 1이지만 k가 클수록 기울기 추정의 편향이 줄어듭니다. 음의 위상(가중치/편향 업데이트의 경우)과 관련하여 다양한 부분에 대한 파생을 표시하지는 않지만 다음의 부분 파생을 취하여 파생할 수 있습니다. 이자형(x,h)는 변수에 관한 것입니다. 체인을 xᵗ로 초기화하는 대신 마지막 반복의 음수 샘플로 체인을 초기화하는 지속적인 대조 발산의 개념이 있습니다. 그러나 일반적인 대비 발산이 충분히 작동하므로 이에 대해서는 깊이 다루지 않겠습니다.

RBM을 처음부터 생성하려면 논의한 모든 개념을 하나의 클래스로 결합해야 합니다. __init__ 생성자에서 가중치, 가시 레이어의 편향 항, 숨겨진 레이어의 편향 항, 대조 발산에 대한 반복 횟수를 초기화합니다. 우리에게 필요한 것은 입력 데이터의 크기, 숨겨진 변수의 크기, k뿐입니다.

또한 샘플링할 베르누이 분포를 정의해야 합니다. Bernoulli 분포는 훈련 중 폭발적인 기울기를 방지하기 위해 고정됩니다. 이 두 분포는 모두 순방향 전달(대조적 발산)에 사용됩니다.

class RBM(nn.Module):
"""Restricted Boltzmann Machine template."""

def __init__(self, D: int, F: int, k: int):
"""Creates an instance RBM module.

Args:
D: Size of the input data.
F: Size of the hidden variable.
k: Number of MCMC iterations for negative sampling.

The function initializes the weight (W) and biases (c & b).
"""
super().__init__()
self.W = nn.Parameter(torch.randn(F, D) * 1e-2) # Initialized from Normal(mean=0.0, variance=1e-4)
self.c = nn.Parameter(torch.zeros(D)) # Initialized as 0.0
self.b = nn.Parameter(torch.zeros(F)) # Initilaized as 0.0
self.k = k

def sample(self, p):
"""Sample from a bernoulli distribution defined by a given parameter."""
p = torch.clamp(p, 0, 1)
return torch.bernoulli(p)

RBM 클래스를 구축하는 다음 방법은 조건부 분포입니다. 우리는 이전에 이 두 가지 조건을 모두 도출했습니다.

def P_h_x(self, x):
"""Stable conditional probability calculation"""
linear = torch.sigmoid(F.linear(x, self.W, self.b))
return linear

def P_x_h(self, h):
"""Stable visible unit activation"""
return self.c + torch.matmul(h, self.W)

마지막 방법에는 순방향 통과 및 자유 에너지 기능의 구현이 수반됩니다. 에너지 함수는 가능한 모든 숨겨진 유닛 구성을 합산한 후 가시 유닛에 대한 유효 에너지를 나타냅니다. 순방향 함수는 Gibbs 샘플링의 고전적인 대비 발산입니다. x_negative를 초기화한 다음 k 반복 동안: P_h_x와 x_negative에서 h_k를 얻고, Bernoulli에서 h_k를 샘플링하고, P_x_h와 h_k에서 x_k를 얻은 다음, 새로운 x_negative를 얻습니다.

def free_energy(self, x):
"""Numerically stable free energy calculation"""
visible = torch.sum(x * self.c, dim=1)
linear = F.linear(x, self.W, self.b)
hidden = torch.sum(torch.log(1 + torch.exp(linear)), dim=1)
return -visible - hidden

def forward(self, x):
"""Contrastive divergence forward pass"""
x_negative = x.clone()

for _ in range(self.k):
h_k = self.P_h_x(x_negative)
h_k = self.sample(h_k)
x_k = self.P_x_h(h_k)
x_negative = self.sample(x_k)

return x_negative, x_k

이것이 RBM의 기본 이론뿐만 아니라 RBM을 훈련하는 데 사용할 수 있는 기본 코딩 구현 클래스에 대한 기초를 제공했기를 바랍니다. 코드나 추가 파생 사항이 있으면 언제든지 문의하여 더 많은 정보를 얻으세요!

종합에 대한 도출 (h|x)는 각 개별 조건부 분포의 곱입니다.

출처: 작성자

[1] 몬투파르, 귀도. “제한된 볼츠만 기계: 소개 및 검토.” arXiv:1806.07066v1 (2018년 6월).

[2] https://en.wikipedia.org/wiki/Gibbs_sampling

[3] 힌튼, 제프리. “대비발산을 최소화한 전문가 양성 제품.” 신경 계산 (2002).

출처 참조

Post Comment