mały|Sieć Hopfielda z czterema "neuronami". Czarne linie ze strzałkami skierowanym w stronę "neuronów" obrazują etap nadawania stanu początkowego neuronom. Czarne linie ze strzałkami skierowanym od "neuronów" obrazują etap stanu końcowego, gdy sieć ustabilizowała swój stan. Stany neuronów aktualizowane są iteracyjnie: w kolejnym kroku na stan losowo wybranego neuronu mają wpływ stany pozostałych neuronów sieci. Sieci asocjacyjne – zwane sieciami Hopfielda, opracowana przez amerykańskiego fizyka Johna Hopfielda w 1982 roku, klasa rekurencyjnych sieci neuronowych, które dają możliwość rekonstrukcji wcześniej zapamiętanego wzorca na podstawie dostępnego jego fragmentu. Sieć Hopfielda o neuronach może odtworzyć około wzorców. Za badania nad sieciami neuronowymi Hopfielda otrzymał w 2024 roku Nagrodę Nobla z fizyki.

Podstawy neurologiczne - reguła Heba

Donald Oldigin Hebb, kanadyjski neuropsycholog, odkrył że mózg zapamiętuje jakiś "wzorzec" w ten sposób, że wzmacnia połączenia między grupą neuronów, która odpowiada wzorcowi. Przypomnienie skojarzeniowe wzorca polega na aktywacji tej grupy neuronów, która została przypisana do tego wzorca. Przy tym grupa ta ma tę własność, że aktywacja części neuronów tej grupy po krótkim czasie prowadzi do aktywacji wszystkich neuronów tej grupy. Np. pobudzenie sieci neuronowej mózgu w wyniku zobaczenia części zwierzęcia, przykładowo uszu kota, powoduje aktywację neuronów, odpowiadających obserwowanej części zwierzęcia; pomimo tego sieć neuronowa mózgu jest zdolna odtworzyć, że ma się do czynienia z kotem, gdyż pobudzona zostaje szybko cała grupa neuronów, odpowiadająca za wzorzec kota dzięki istnieniu silnych połączeń między neuronami odpowiadającej mu grupy neuronów. Sieć neuronowa mózgu ma też inną własność: może odtworzyć oryginał na podstawie zaburzonego sygnału, np. obrazu czy dźwięku.

Dokładnie taką samą własność mają sztuczne sieci neuronowe Hopfielda: aktywowanie części neuronów, odpowiadających jakiemuś wzorcowi (lub neuronów, które odpowiadają nieco zniekształconemu obrazowi wzorca) wystarcza do tego, by po pewnym czasie działania sieci aktywowane zostały wszystkie neurony, odpowiadające temu wzorcowi. W tym stanie sieć stabilizuje się (tzn. nie zmienia dalej swojego stanu).

U góry artykułu pokazano uproszczony schemat sieci Hopfielda, który kumuluje złożone czasowo działanie sieci w jednym obrazie a). nadawanie stanu początkowego b). sekwencyjne aktualizowanie się stanów losowo wybieranych neuronów sieci Hopfielda na podstawie aktualnych stanów pozostałych neuronów c). przejście sieci w stan końcowy. Dalej, w sekwencji sześciu grafik, pokazano przykładową sekwencję czasową zmian stanów sieci Hopfielda.

Struktura sieci Hopfielda. Trening sieci Sieć Hopfielda składa się z jednej warstwy neuronów, w której każdy neuron jest połączony z każdym innym neuronem, z wyjątkiem samego siebie. Połączenia są dwukierunkowe i symetryczne, co oznacza, że waga dla przejścia sygnału od neuronu do neuronu jest taka sama jak waga dla przejścia sygnału od neuronu do neuronu .

Dla układu neuronów wagi przejść między neuronami tworzą macierz kwadratową , która jest symetryczna, tj. dla oraz nie występują samosprzężenia neuronów, tj. . Dzięki temu Hopfield wyeliminował przypadki nieustannego wzbudzania się sieci, która nigdy nie zmierzała do stanu stabilnego.

Sieć jest "trenowana", aby zapamiętała pewną liczbę "wzorców". Trening to de facto obliczenie macierzy wag połączeń między neuronami, z zastosowaniem reguły Heba wzorem:

gdzie: – liczba neuronów, – liczba wzorców do zapamiętania, – wektor -elementowy -tego wzorca, , którego elementy przyjmują wartości lub .

Związek między wagami połączeń neuronów a wzorcami, które ma odtwarzać sieć Jeśli neurony często są w tym samym stanie w zapamiętywanych wzorcach (tj. oba są często jednocześnie w stanie lub jednocześnie w stanie ), to waga połączeń między nimi jest dodatnia, tj. ; przy tym waga ta będzie tym większa, im silniejsza jest ta korelacja. Jeśli neurony często są w stanie przeciwnym w zapamiętywanych wzorcach (tj. jeden częściej w stanie , a drugi częściej w stanie lub odwrotnie), to waga połączeń między nimi jest ujemna, tj. ; przy tym waga ta będzie tym bardziej ujemna, im silniejsza jest ta antykorelacja. Jeśli neurony bardzo rzadko są skorelowane, to ich waga jest bliska zeru, .

Dzięki regule Hebba macierz wag tworzy „energetyczne minima” w jej przestrzeni stanów; minima te odpowiadają zapamiętanym wzorcom. Kiedy zainicjujemy stan początkowy sieci odpowiadający niepełnemu lub zaszumionemu wzorowi, to sieć będzie ewoluować w stronę minimum energii, któremu odpowiada stan stabilny odtwarzanego wzorca (atraktor).

Sieć Hopfielda: inicjacja stanu sieci i reguła aktualizacji Proces odtwarzania wzorca przebiega w sieci Hopfielda następująco: W początkowym kroku iteracji aktywowana jest grupa neuronów, które stanowią część neuronów wybranego wzorców lub odpowiadają jego nieco zniekształconemu obrazowi; aktywacja ta polega na przypisaniu tym neuronom początkowych stanów liczbowych a pozostałym neuronom sieci stanów Losuje się liczbę ze zbioru liczb oznaczających numery neuronów sieci i oblicza się nowy stan -tego neuronu wg wzoru (wzór ten uwzględnia działanie od pozostałych neuronów sieci na -ty neuron):

gdzie: - numer kroku iteracji (kroku czasowego); – stan neuronów w kroku – stan neuronu obliczany w kroku – waga połączenia między neuronem a neuronem – liczba neuronów w sieci – funkcja znakowa:

Punkt 2. powtarza się iteracyjnie tak długo, aż sieć ustabilizuje się, tj. nie zmieniają się stany jej neuronów. Stan ustabilizowany sieci powinien odpowiadać rozpoznanemu wzorcowi.

Uwaga: Synchronizacja: neurony można aktualizować asynchronicznie (po jednym na raz) lub synchronizacyjnie (wszystkie naraz).

Właściwości sieci Hopfielda Sieć Hopfielda o neuronach potrafi "zapamiętać" i odtworzyć poprawnie wzorców. Np. dla sieć może odtworzyć wzorców.

Przykładowe obliczenia

Poniżej podano kod programu w Python, który: a). zapisuje wzorce dwóch liter L i T b). oblicza macierz wag sieci Hopfielda metodą Hebba c). oblicza zaburzenia losowe liter wzorcowych d). podaje zaburzone litery jako stany wejściowe do sieci Hopfielda - sieć w kolejnych sekwencjach obliczeń odtwarza wzorcowe litery (por. animacje).

W linii 54 kodu można wybrać, którą literę, zaburzoną szumem, daje się na wejście sieci Hopfielda.

W linii 59 kodu można ustalić, ile pikseli oryginalnego wzorca zostanie odwrócone czarnego na biały (litery zapisano w postaci macierzy 9x9, co daje 81 pikseli; podawane na wejścia sieci sygnały skonstruowano następująco: do litery L dodano obraz o osłabionej jasności litery T (stanowiącej 50% oryginalnej jasności), a następnie z takiego obrazu odwracano losowo 39 pikseli; szum więc był bardzo wysoki, bo stanowił około 48% sygnału; patrz linie kodu 56 i 58). Szare piksele na animacji - to efekt nałożenia osłabionego obrazu litery T na obraz litery L. Analogicznie tworzono sygnał wejściowy dla litery T

Do obliczeń i wygenerowania animacji wykorzystano darmowy notatnik colab google dostępny online. import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from IPython.display import HTML

# Funkcje pomocnicze

def show_pattern_ax(pattern, ax, frame_color="green"): ax.imshow(pattern.reshape((9,9)), cmap="gray_r") for spine in ax.spines.values(): spine.set_edgecolor(frame_color) spine.set_linewidth(3) ax.axis("off")

def hebbian_weights(patterns): n = patterns.size W = np.zeros((n,n)) for p in patterns: W += np.outer(p, p) np.fill_diagonal(W, 0) return W / len(patterns)

def hopfield_update_sync(s, W, steps=20): states = [s.copy()] for t in range(steps): s_new = np.sign(W @ s) s_new[s_new == 0] = 1 s = s_new states.append(s.copy()) return states

# Wzorce 9x9

T = -np.ones((9,9)) T[0,:] = 1 T[:,4] = 1

L = -np.ones((9,9)) L[:,0] = 1 L[8,:] = 1

p1 = T.flatten() p2 = L.flatten()

# Wagi W = hebbian_weights([p1, p2])

# Zaburzona litera T lub L

np.random.seed(1) litera = 'L' if litera == 'T': noisy_T = p1.copy()+0.5*p2.copy() else: noisy_T = 0.5*p1.copy()+ p2.copy() flip_idx = np.random.choice(len(noisy_T), size=39, replace=False) noisy_T[flip_idx] *= -1

# Symulacja

states = hopfield_update_sync(noisy_T.copy(), W, steps=5)

# Animacja i zapis do GIF

fig, ax = plt.subplots(figsize=(5,5))

def update(frame): ax.clear() show_pattern_ax(states[frame], ax, frame_color="blue") ax.set_title(f"Step {frame}")

ani = FuncAnimation(fig, update, frames=len(states), interval=2000, repeat=False)

# Zamknięcie statycznej figury (żeby nie wyświetlała się w Colabie) plt.close(fig)

# Zapis do GIF from matplotlib.animation import PillowWriter ani.save("hopfield_animation_L.gif", writer=PillowWriter(fps=1))

# Pobranie pliku GIF z Colaba from google.colab import files files.download("hopfield_animation_L.gif") Zastosowania sieci Hopfielda Sieć Hopfielda jest używana tam, gdzie istotne jest przechowywanie i przywoływanie informacji na podstawie częściowych danych. Przykładowe zastosowania obejmują:

Pamięci asocjacyjne: Zdolność do odtworzenia pełnych wzorców na podstawie częściowych danych. Rekonstrukcja obrazów: Gdy obrazy są zaszumione lub niekompletne, sieć Hopfielda może służyć do ich rekonstrukcji. Optymalizacja: Sieci te mogą być stosowane do rozwiązywania problemów optymalizacyjnych, takich jak problem komiwojażera, gdzie szukamy najkrótszej możliwej trasy między wieloma miastami.

Inspiracja dla innych modeli Sieć Hopfielda stała się punktem wyjścia do badań nad:

maszynami Boltzmanna (sieć probabilistyczna) rekurencyjnymi sieciami neuronowymi (RNN) nowoczesnymi transformerami Hopfielda (Hopfield Networks Revisited, 2020), które działają na dużo większych zbiorach danych i znajdują zastosowania w NLP oraz bioinformatyce.

Zobacz też Rodzaje sieci neuronowych

perceptron maszyna Boltzmanna konwolucyjna sieć neuronowa rekurencyjna sieć neuronowa (RRN) sieć Kohonena transformer

Inne:

model Isinga sieć neuronowa jednokierunkowa sieć neuronowa probabilistyczna sieć neuronowa rekurencyjna sieć neuronowa sieci neuronowe wielowarstwowe sztuczna inteligencja

Przypisy

Linki zewnętrzne

Modele pamięci. Sieci neuronowe Hopfielda - na YouTube świetne objaśnienie idei sieci Hopfielda na prostym przykładzie; podano też kod programu w języku Python do trenowania sieci A Brain-Inspired Algorithm For Memory - na YouTube objaśnienie podstaw fizjologicznych sieci Hopfielda Hopfield network: How are memories stored in neural networks? - na YouTube objaśnienie sieci Hopfielda

Kategoria:Pamięci komputerowe Kategoria:Sieci neuronowe