Hopfield Networks
Hopfield 네트워크는 노이즈가 있는 단서에서 저장된 패턴을 복원하는 순환 연관 메모리로, 에너지 기반 검색과 현대적인 어텐션을 연결합니다.
Hopfield 네트워크는 패턴을 저장하고 불완전하거나 손상된 입력에서 패턴을 복원하는 순환 신경망입니다. Hopfield 네트워크는 패턴의 일부를 단서로 사용해 전체 패턴을 검색하는 연관 메모리로 작동합니다. 저장된 메모리는 에너지 지형의 골짜기처럼 작동하며, 네트워크의 변화하는 상태는 근처 골짜기를 향해 안정화됩니다.
John J. Hopfield는 1982년 신경망의 집단 연산에 관한 연구를 통해 이 모델을 소개했습니다. "Hopfield network", "Hopfield net", "Hopfield model"은 흔히 사용되는 동의어입니다. 이 아키텍처는 피드백 연결이 내부 상태를 반복적으로 갱신하므로 순환 신경망 계열에 속합니다.
Hopfield 네트워크의 패턴 저장 및 검색 방식#
고전적인 Hopfield 네트워크는 서로 연결된 뉴런으로 구성되며, 뉴런의 상태는 일반적으로 −1 또는 +1로 표현됩니다. 모델 가중치는 대칭입니다. 즉, 뉴런 A에서 뉴런 B로 연결되는 가중치와 뉴런 B에서 뉴런 A로 연결되는 가중치가 같습니다. 표준 구성에서는 자기 연결을 0으로 설정합니다. Hebbian 학습은 저장된 예제에서 상태가 일치하는 뉴런 간의 연결을 강화하여 패턴을 저장합니다. 계산 관점에서 보면, 각 패턴의 외적, 즉 쌍별 곱으로 이루어진 행렬을 가중치 행렬에 더합니다.
검색 중에는 각 뉴런이 가중 입력의 합을 계산한 다음 임계값 활성화 함수를 적용합니다. 비동기 업데이트는 한 번에 뉴런 하나의 상태를 변경합니다. 가중치가 대칭이고 자기 연결이 0이며 정확히 임계값에 해당하는 경우 상태를 변경하지 않으면, 각 상태 변화는 네트워크가 안정된 구성에 도달할 때까지 에너지 함수를 낮춥니다. 이 구성을 어트랙터라고 하며, 이 구성으로 수렴하는 시작 상태의 집합을 어트랙터의 흡인 영역이라고 합니다. 모든 뉴런을 동시에 업데이트하면 구성 간 진동이 발생할 수 있습니다.
저장과 검색은 별개의 작업입니다. 저장은 연결을 변경하고, 검색은 연결을 고정한 채 뉴런 상태를 변경합니다. 따라서 검색은 또 다른 역전파를 수행하는 것이 아니라 상태를 최적화하는 과정입니다.
Python에서 패턴 복원하기#
다음 PyTorch 예제는 Hebbian 규칙을 사용해 이진 패턴 하나를 저장하고, 두 항목을 반전한 다음 비동기 업데이트를 통해 메모리를 검색합니다.
import torch
memory = torch.tensor([1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0])
weights = torch.outer(memory, memory) / memory.numel()
weights.fill_diagonal_(0)
state = memory.clone()
state[[1, 6]] *= -1
initial_errors = int((state != memory).sum())
while True:
previous = state.clone()
for i in range(state.numel()):
field = weights[i] @ state
# Preserve the current state when the weighted input is zero.
if field != 0:
state[i] = field.sign()
if torch.equal(state, previous):
break
print(f"Bit errors: {initial_errors} -> {int((state != memory).sum())}")출력은 Bit errors: 2 -> 0입니다. 순환 업데이트는 표준 연관 메모리 동역학을 사용해 손상된 단서에서 저장된 패턴을 재구성합니다.
연속 네트워크, 어텐션 및 응용 분야#
연속 Hopfield 네트워크는 시그모이드와 같은 단계형 뉴런 출력을 사용하며 평형 상태를 향해 변화합니다. Hopfield는 1984년에 이 정식을 확립했습니다. 현대적인 Hopfield 네트워크는 서로 다른 에너지 함수와 더 높은 저장 용량을 통해 연관 메모리를 확장하며, 연속 상태 변형은 실수값 벡터를 처리합니다.
Hubert Ramsauer와 동료들은 2020년에 현대적인 Hopfield 검색을 어텐션 메커니즘과 연결했습니다. 쿼리를 저장된 벡터와 비교하고, softmax를 사용해 유사도 점수를 가중치로 변환한 다음, 가중 조합을 통해 연관 정보를 검색합니다. 이를 통해 트랜스포머에서 사용되는 어텐션 연산을 연관 메모리 관점에서 해석할 수 있습니다.
이미지 표현의 경우 Ultralytics YOLO26은 model.embed()를 통해 특징 추출을 제공하고 이미지 임베딩을 반환합니다. 이러한 벡터는 현대적인 연관 메모리 계층에서 사용하는 실수값 표현을 제공합니다.
대표적인 응용 분야로는 저장된 시각 패턴 복원, 대규모 특징 모음의 풀링, 제약 최적화가 있습니다. Hopfield와 David Tank는 1985년에 아날로그 네트워크를 순회 외판원 문제에 적용하고, 경로의 품질과 제약 조건을 에너지 지형에 인코딩했습니다. 현대적인 Hopfield 풀링은 다중 인스턴스 학습을 통해 면역 레퍼토리 분류도 지원하며, 수십만 개의 생물학적 시퀀스에 걸쳐 정보를 집계합니다.
관련 개념 및 저장 용량의 한계#
오토인코더는 입력을 재구성하는 인코더-디코더 매핑을 학습하지만, 고전적인 Hopfield 네트워크는 어트랙터에 안착해 패턴을 재구성합니다. 메모리 뱅크는 나중에 액세스할 표현을 저장하는 반면, Hopfield 동역학은 단서가 연관된 상태를 검색하는 방식을 규정합니다.
고전적인 네트워크에서는 메모리가 서로 간섭할 때 검색 오류가 발생합니다. 상관관계가 있는 패턴은 크로스토크를 일으키며, 허위 어트랙터는 저장된 메모리의 혼합물을 반환할 수 있습니다. 무작위로 생성되고 서로 거의 상관관계가 없는 이진 패턴을 저장하는 대규모 고전 Hebbian 네트워크의 경우, 검색 오류를 소량 허용하면 알려진 용량 추정치는 뉴런 수의 약 0.14배입니다. 즉, 뉴런이 1,000개라면 패턴 약 140개를 저장할 수 있습니다.










