
Sieci neuronowe: od perceptronów do głębokiego uczenia
Jak warstwy prostych funkcji uczą się złożonych wzorców
Ruch, którego nikt nie zrozumiał
10 marca 2016 roku, w drugiej partii pięciomeczowej serii w Seulu, maszyna zwana AlphaGo postawiła czarny kamień na piątej linii planszy. Ruch był tak dziwny, że ludzcy komentatorzy założyli, że to błąd. Jeden zawodowiec powiedział na głos, że początkującego by za to skrzyczano. Lee Sedol — osiemnastokrotny mistrz świata w grze go — wstał i wyszedł z pomieszczenia, żeby się pozbierać.
To nie był błąd. Pięćdziesiąt ruchów później ten kamień — dziś słynny jako „Ruch 37” — był zawiasem, na którym obraciała się cała gra. AlphaGo wygrało. Lee Sedol, uważany za jednego z najlepszych żyjących zawodników, przegrał serię 4–1. I tu jest część, która ma znaczenie: żaden człowiek nie nauczył AlphaGo tego ruchu. Nie było go w żadnym podręczniku. Maszyna odkryła go sama, grając miliony gier przeciwko sobie i regulując miliardy niewielkich wewnętrznych liczb, aż wyłonił się wzorzec, którego nigdy wcześniej nie widziała żadna osoba.
Go ma więcej możliwych pozycji na planszy niż jest atomów w obserwowalnym wszechświecie. Nie da się tego rozwiązać brute-force. Nie da się dla tego napisać reguł. Jedynym sposobem na grę na nadludzkim poziomie jest jej nauczenie się — a robiącą to maszynerią była sieć neuronowa: stos prostych jednostek matematycznych, które, mając wystarczająco dużo danych i dostosowań, mogą znaleźć strukturę, jakiej żaden człowiek nie umie w pełni wyartykułować.
Ta sama maszyneria — te same ważone sumy, ta sama pętla treningowa, te same przesunięcia gradientu — zasila model językowy, z którym rozmawiasz, system flagujący fałszywe transakcje kartowe, oraz modele, które fundusze kwantytatywne dziś kierują na rynki finansowe. Ta lekcja jest o tym, co faktycznie dzieje się w tym pudełku.
Perceptron: gdzie to wszystko się zaczyna
Każda sieć neuronowa — od prostego filtra spamu, przez GPT, do AlphaGo — pochodzi od jednej idei: perceptronu, wynalezionego przez Franka Rosenblatta w 1958 roku. Jest to model matematyczny, luźno zainspirowany biologicznym neuronem. Prawdziwy neuron odbiera sygnały elektryczne przez swoje dendryty, zbiera je w ciele komórki i wysyła sygnał wzdłuż aksonu tylko wtedy, gdy skumulowany sygnał przekroczy próg. Perceptron robi to samo, tylko z liczbami zamiast z napięciem.
Perceptron przyjmuje wektor sygnałów wejściowych x, mnoży każdy sygnał przez wyuczoną wagę w, sumuje te produkty, dodaje wyraz bias b, który przesuwa próg, i przepuszcza wynik przez funkcję aktywacji. Jeśli wynik przekroczy tę belkę, neuron „strzela”; w innym wypadku pozostaje cichy. Całość to jedno kompaktowe wyrażenie: output = f(w·x + b).
Myśl o wagach jako o gałkach głośności. Każdy sygnał wejściowy przychodzi z jakąś głośnością, a waga decyduje, jak ważny jest ten sygnał dla tego konkretnego neuronu. Neuron uczący się wykrywać fałszywą transakcję mógłby podkręcić wagę na „wielkości transakcji względem historii konta” i przykręcić wagę na „godzinie dnia”. Uczenie się, w swej istocie, jest niczym bardziej wyszukanym niż ustawianie tych gałek na właściwe wartości.
Pojedynczy perceptron ma sztywny limit: może rozdzielać dane wyłącznie prostą linią (lub, w wyższych wymiarach, płaską hiperpłaszczyzną). Może odpowiedzieć na pytanie „czy ten punkt jest ponad linią, czy pod nią?”, ale nie na „czy ten punkt jest wewnątrz zakrzywionego obszaru?”. Historycznym przykładem jest problem XOR — wzorzec, którego pojedynczy perceptron udowodnienie nie może się nauczyć, ograniczenie, które pomogło zamrozić finansowanie AI na lata w latach 70. Ucieczka jest z perspektywy czasu prawie absurdalnie prosta: ułóż wiele perceptronów w warstwy i wstaw między nimi nieliniową aktywację. Zrób to, i wynikowa sieć może zginać, zawijać i wyrzeźbić przestrzeń w dowolnie skomplikowane kształty.
Warstwy, głębokość, i czemu uczenie „głębokie”
Jeden neuron to gałka. Użyteczna sieć to tysiące ich, ułożonych w warstwy, które przekazują informację dalej jak brygada wiaderek.
- Warstwa wejściowa — gdzie wchodzą twoje surowe cechy: piksele obrazu, słowa zdania, lub dla modelu handlowego, rzeczy jak cena, wolumen, zmienność i nierównowaga księgi zleceń.
- Warstwy skryte — warstwy pomiędzy, gdzie odbywa się prawdziwa praca. Każda warstwa przyjmuje wyjścia poprzedniej i rekombinuje je w nowe, bardziej abstrakcyjne cechy.
- Warstwa wyjściowa — ostateczna odpowiedź: prawdopodobieństwo, prognoza ceny, etykieta klasy.
Słowo „głębokie” w głębokim uczeniu oznacza po prostu wiele warstw skrytych. A głębokość daje ci coś konkretnego: hierarchię cech. W sieci obrazowej pierwsza warstwa wykrywa krawędzie, następna składa krawędzie w kształty, kolejna składa kształty w obiekty. Nikt nie zaprogramował „wykrywacza krawędzi” czy „wykrywacza oka” — te koncepcje wyłaniają się z treningu. Sieć wymyśla swoje własne słownictwo pośrednie.
Jest tu piękny wynik teoretyczny, teorema uniwersalnej aproksymacji: sieć z choćby jedną warstwą skrytą, mając wystarczająco wiele neuronów, może aproksymować każdą funkcję ciągłą z dowolną dokładnością. Innymi słowy, właściwa sieć może w zasadzie reprezentować każdy wzorzec istniejący w twoich danych. Zaczep — i to duży zaczep — jest taki, że „w zasadzie” wykonuje tu ciężką pracę. Teorema obiecuje, że taka sieć istnieje; nic nie mówi o tym, czy możesz ją znaleźć, czy masz wystarczająco danych, aby ją ustalić, albo czy wzorzec, za którym gonisz, jest w ogóle rzeczywisty. W dziedzinach o niskim sygnale, jak finanse, ta przepaść między „reprezentowalne” a „uczylne” jest właśnie miejscem, gdzie umiera większość modeli.
Funkcje aktywacji: nieliniowy sekretny sos
Tu jest fakt, który zaskakuje ludzi: bez funkcji aktywacji głębokość jest bezużyteczna. Jeśli każda warstwa byłaby zwykłą sumą ważoną, ułożenie dziesięciu warstw byłoby matematycznie identyczne z jedną warstwą — łańcuch operacji liniowych zapada się w jedną operację liniową. Wydałbyś fortunę na obliczenia, żeby zbudować pochwalona linię prostą. Funkcje aktywacji to nieliniowe zagięcie wstawione między warstwami, które pozwala sieci się zginać, a zginanie jest tym, co czyni ją potężną.
Aktywacje, które każdy praktyk powinien znać:
- Sigmoid — σ(x) = 1/(1+e⁻ˣ). Ściska każdy sygnał wejściowy do (0, 1), co naturalnie czyta się jako prawdopodobieństwo. Świetny dla binarnego wyjścia, ale słaby wybór wewnątrz warstw skrytych: dla dużych dodatnich lub ujemnych wejść krzywa się wyprowaścza, jej gradient zbiega do zera, i uczenie się zamiera — problem zanikającego gradientu (vanishing gradient).
- Tanh — wyjścia w (−1, 1) i jest wycentrowana na zerze, co ułatwia optymalizację. Wciąż saturuje na ekstremach, ale mniej brutalnie niż sigmoid.
- ReLU — f(x) = max(0, x). Nowoczesny domyślny wybór dla warstw skrytych. Jest śmiesznie prosta, tania w obliczeniu i zachowuje zdrowy gradient dla wszystkich dodatnich sygnałów wejściowych. Jej wadą jest „umierające ReLU”: neuron, który zostaje wypchnięty do zawsze wyjściowego zera, może stać się permanentnie bezwładny.
- Leaky ReLU — f(x) = max(0,01x, x). Przepuszcza mały strumień gradientu dla wartości ujemnych, co powstrzymuje neurony przed umieraniem.
- GELU — gładki, probabilistyczny kuzyn ReLU, który jest standardem wewnątrz transformerów jak BERT i GPT.
Propagacja wsteczna i spadek gradientu: jak sieci się uczą
Do tej pory mamy sieć pełną wag. Ale skąd pochodzą właściwe wartości wag? Nikt ich nie wpisuje — jest ich miliony. Są odnajdywane przez pętlę zwrotną, która w istocie jest zorganizowanym prób i błędów, w którym rachunek różniczkowy prowadzi księgowość.
Krok pierwszy to przejście w przód (forward pass): wprowadź przykład, pozwól mu przepłynąć przez warstwy, i odczytaj przewidywanie. Krok drugi to zmierzenie, jak bardzo to przewidywanie się myliło, za pomocą funkcji straty. Do przewidywania liczby (ceny) błąd średniokwadratowy (MSE) uśrednia kwadrat odległości między przewidywaniem a prawdą. Dla klasyfikacji entropia krzyżowa (cross-entropy) mierzy, jak daleko przewidywane prawdopodobieństwa siedzą od właściwej odpowiedzi. Wysoka strata oznacza „bardzo źle”; celem całego treningu jest zepchnięcie tej liczby na dół.
Krok trzeci to sprytna część: propagacja wsteczna (backpropagation). Używając reguły łańcuchowej z rachunku różniczkowego, algorytm pracuje w tył od straty, przez każdą warstwę, i obliczaja dla każdej pojedynczej wagi gradient — odpowiedź na pytanie „jeśli przesunę tę jedną wagę odrobinę wyżej, błąd wzrasta czy spada, i o ile?”. To jest sztuczka, która rozmroziła zimę AI. Backpropagacja, spopularyzowana w latach 80., umożliwiła efektywne przypisywanie winy między milionami wag, zamiast zgadywania.
Krok czwarty to spadek gradientu (gradient descent): przesuń każdą wagę o mały krok w kierunku, który redukuje stratę, za pomocą reguły w = w − α × ∂L/∂w. Wyobraź sobie stanie na mglistym wzgórzu, próbując dojść do dna doliny; nie widzisz dna, ale czujesz, w którą stronę jest schodzące, pod stopami, więc idziesz w tę stronę i powtarzasz. Współczynnik uczenia (learning rate) α to długość twojego kroku, i jest to prawdopodobnie najważniejszy pokrętło w całym systemie. Zbyt duży, i przeskakujesz dolinę, odbijając się w nieskończoność; zbyt mały, i pełzasz wiecznie albo utykasz w rowie w połowie drogi.
Dwa udoskonalenia, na które natrafisz od razu. Mini-batche: zamiast aktualizować po każdym pojedynczym przykładzie (zaszumione) albo tylko po całym zbiorze danych (wolno), aktualizujesz po małej partii — typowo 32 do 256 przykładów — co jest stabilne, przyjazne dla GPU, i słodkim punktem w praktyce. I Adam: sprytniejszy optymalizator, który daje każdej wadze własny adaptywny krok i dodaje momentum, żeby wygładzić zaszumione gradienty. Adam to sensowny punkt wyjścia dla praktycznie każdego projektu — choć w finansach, z ich niskim wskaźnikiem sygnał-szum, wciąż będziesz musiał ręcznie dostrajać współczynnik uczenia, zanikanie wag (weight decay) i punkt zatrzymania.
Przeuczenie: kiedy sieć zapamiętuje, zamiast się uczyć
Tu jest schemat awarii, który rujnuje więcej modeli finansowych niż jakikolwiek inny. Sieć neuronowa jest tak elastycznym dopasowywaczem funkcji, że, gdy dostanie szansę, będzie zapamiętywać twoje dane treningowe w całości — łącznie z całym losowym szumem, jednorazowymi przypadkami i zbieżnościami, które nigdy się nie powtórzą. Osiąga piękne wyniki na danych, które już widziała, i padnie plackiem w momencie, gdy trafi na coś nowego. To jest przeuczenie (overfitting), i na rynkach — gdzie prawdziwy sygnał jest słaby a szum ogłuszający — to jest domyślny wynik, nie wyjątek. Narzędzia, które z tym walczą, nazywane są regularyzacją.
Dropout jest najpopularniejsze. W każdym kroku treningowym każdy neuron ma prawdopodobieństwo p (często 0,2–0,5) na tymczasowe wyłączenie. Zmuszona do działania nawet, gdy losowi partnerzy zniknęli, sieć uczy się rozprowadzać swoją wiedzę między wiele neuronów, zamiast stawiać wszystko na kilka delikatnych — efekt ensemble upieczony w jednym modelu. W czasie przewidywania wszystkie neurony przełączają się z powrotem, odpowiednio przeskalowane.
Kary L1 i L2 dodają podatek na wielkie wagi do straty. L2 (zanikanie wag, weight decay) odzwyczaja jakąkolwiek pojedynczą wagę od stania się zbyt dużą, rozprowadzając wpływ równomiernie. L1 jest ostrzejsze: aktywnie prowadzi bezużyteczne wagi całą droga do dokładnie zera, wykonując automatyczną selekcję cech. W finansowym zbiorze danych, gdzie większość ze stu cech to szum, L1 może po cichu znaleźć tę garstkę, która faktycznie niesie sygnał.
Normalizacja partii (batch normalization) przeskalowuje wyjścia każdej warstwy do stabilnej średniej i wariancji, co stabilizuje trening i pozwala na wyższe współczynniki uczenia. Wczesne zatrzymanie (early stopping) jest najprostszym i najbardziej wiarygodnym zabezpieczeniem ze wszystkich: obserwuj błąd na zbiorze walidacyjnym, i w momencie, gdy zaczyna pełzać w górę, podczas gdy błąd treningowy wciąż spada, zatrzymaj się — to skrzyżowanie jest właśnie momentem, kiedy sieć przełącza się z uczenia wzorców na zapamiętywanie szumu.
CNN dla wzorców, RNN i LSTM dla sekwencji
Zwykłe sieci feedforward traktują każdy sygnał wejściowy jako niestrukturalny worek liczb. Ale wiele rzeczywistych danych ma strukturę — obraz ma przestrzenny układ, seria cenowa ma porządek czasowy — i dwie wyspecjalizowane architektury eksploatują tę strukturę bezpośrednio.
Splotowe sieci neuronowe (CNN) zostały zbudowane dla obrazów. Zamiast łączyć każdy piksel z każdym neuronem, CNN przesuwa małe filtry przez sygnał wejściowy, tropiąc lokalne wzorce — tu krawędź, tam tekstura — i wykorzystując ten sam filtr wszędzie. Wczesne warstwy wychwytują krawędzie; głębsze warstwy składają je w kształty i obiekty. W finansach badacze kierowali CNN na:
- Obrazy wykresów świecowych — przeformowanie odczytywania wykresu jako wizualnego zadania rozpoznawania wzorców.
- Mapy ciepła księgi zleceń — wykrywanie nierównowag popytu/podaży w zrzutach głębokości rynku.
- Splot 1D nad surowymi sekwencjami cenowymi — nauka krótkich motywów czasowych w sposób, w jaki obrazowy CNN uczy się motywów przestrzennych.
Rekurencyjne sieci neuronowe (RNN) są zbudowane dla sekwencji. Przetwarzają jeden krok czasowy po drugim, przenosząc stan skryty — działającą pamięć — z każdego kroku na następny. Teoretycznie to czyni je idealnymi dla szeregów czasowych. W praktyce zwykłe RNN są okulawione przez problem zanikającego gradientu przez długie sekwencje: sygnał z wielu kroków wcześniej zmniejsza się w kierunku zera na drodze z powrotem, więc sieć zwyczajnie zapomina odległą przeszłość.
Sieci LSTM (Long Short-Term Memory) naprawiają to za pomocą małego zestawu wyuczalnych bram — zapominania, wejścia i wyjścia — które decydują w każdym kroku, co usunąć z pamięci, co zapisać i co odczytać. To bramkowanie pozwala LSTM utrzymywać istotne informacje przez setki kroków, dlatego stała się koniem roboczym do modelowania finansowych szeregów czasowych, gdzie wydarzenie z wczoraj wciąż porusza dzisiejszą cenę.
import torch.nn as nn
class PricePredictor(nn.Module):
def __init__(self, input_dim, hidden_dim, num_layers):
super().__init__()
self.lstm = nn.LSTM(input_dim, hidden_dim,
num_layers, batch_first=True,
dropout=0.2)
self.fc = nn.Linear(hidden_dim, 1)
def forward(self, x):
out, _ = self.lstm(x)
return self.fc(out[:, -1, :])
Na platformie takiej jak GaiaEx, gdzie feedy WebSocket przesyłają strumień ciągłych danych o cenie i księdze zleceń, LSTM może naturalnie przyswajać tę sekwencję. Powiedziawszy to, ta dziedzina w dużej mierze poszła dalej: transformery — architektura za współczesnymi modelami językowymi — dziś dorównują lub przebijają LSTM w wielu zadaniach sekwencyjnych, wykorzystując „uwagę” (attention), żeby patrzeć na wszystkie kroki czasowe naraz, zamiast przechodzić przez nie po jednym.
Czego sieci neuronowe nie naprawiają (zwłaszcza na rynkach)
Sieci neuronowe są spektakularnymi wykrywaczami wzorców. Ale uczciwa edukacja oznacza wskazanie, gdzie się łamią — a w handlu łamią się w kosztowny sposób.
- Znajdują wzorce, nawet gdy żadne nie istnieją. Daj głębokiej sieci szum, i będzie go z przekonaniem dopasowywać. Rynki są w dużej mierze szumem, więc ciężar dowodu leży na tobie, aby pokazać, że wzorzec jest rzeczywisty i trwały — nie tylko obecny w danych z zeszłego roku.
- Są czarnymi skrzynkami. Model może być dokładny i wciąż nie umieć powiedzieć ci, czemu. Kiedy nagle traci pieniądze, często nie ma czystego wyjaśnienia i żadnej oczywistej naprawy. Dla kapitału obciążonego ryzykiem, „nie wiem, czemu to zrobił” jest poważną odpowiedzialnością.
- Są głodne i delikatne. Głębokie uczenie błyszczy z milionami czystych przykładów. Historia finansowa jest krótka, niestacjonarna i zaszumiona — reżim, na którym trenował się twój model, może po prostu przestać istnieć, problem zwany przesunięciem rozkładu (distribution shift).
- Nie pobijają prostszych modeli za darmo. Na tabelarycznych, opartych na cechach danych powszechnych w finansach, drzewa ze wzmacnianiem gradientowym (gradient-boosted trees), jak XGBoost, często przewyższają sieci neuronowe, będąc jednocześnie szybszymi w treningu i łatwiejszymi w interpretacji. Złożoność jest kosztem, nie zaletą.
- Mogą być zaatakowane. Drobne, celowe zakłócenia sygnału wejściowego mogą odwrócić wyjście sieci — przykład wrogi (adversarial example) — co ma znaczenie wszędzie, gdzie przeciwnik może uformować to, co widzi twój model.
Sprzęt, narzędzia, i twoja droga w przód
Trenowanie sieci neuronowych jest ciężkie na arytmetykę — w ogromnej mierze mnożenia matrycowe — a sprzęt, na którym to uruchamiasz, zmienia twoją prędkość iteracji z „przez noc” na „przy kawie”.
GPU są standardem. Ich tysiące jąder wykonują tę samą operację na różnych danych naraz, co jest właśnie kształtem matematyki sieci neuronowej. Model, który pełza 8 godzin na CPU, może zakończyć się w 15 minut na współczesnym GPU. NVIDIA dominuje: karty konsumenckie (GPU klasy RTX) są w porządku do nauki, podczas gdy karty centrów danych (A100, H100) i instancje cloud obsługują trening skali produkcyjnej. TPU, niestandardowe chipy Google do matematyki tensorowej, błyszczą na bardzo dużych modelach przez Google Cloud, ale GPU pozostają praktycznym domyślnym wyborem dla większości praktyków dzięki szerszemu wsparciu oprogramowania.
Nie musisz niczego kupować, żeby zacząć. Google Colab rozdaje darmowy czas GPU, w bród na naukę i prototypowanie; wynajmuj GPU w chmurze na żądanie, gdy twoje modele rosną; kupuj dedykowany sprzęt tylko wtedy, gdy trenujesz codziennie i rachunek za chmurę usprawiedliwia to.
Rozsądna droga uczenia się od tego miejsca:
- Zacznij od prostej sieci feedforward na kilku zaprojektowanych cechach — szybka w treningu, łatwa do debugowania, i uczciwy model bazowy.
- Wypróbuj 1D CNN na surowych sekwencjach cenowych i porównaj ją twarzą w twarz z tym modelem bazowym.
- Zbuduj LSTM, która przyswaja sekwencje danych świecowych z API GaiaEx.
- Studiuj uwagę (attention) i transformery — coraz częściej architekturę wyboru dla sekwencji.
- Nade wszystko, zawsze wystawiaj swój głęboki model przeciwko modelowi bazowemu z gradient boosting, jak XGBoost. Jeśli sieć neuronowa nie może pobić prostszego modelu out-of-sample na twoich tabelarycznych danych finansowych, wyślij prostszy model i idź dalej.
Ta sama pętla, która znalazła Ruch 37 — przewiduj, mierz błąd, przesuwaj wagi, powtarzaj — jest pętlą działającą wewnątrz każdego systemu na tej liście. Zrozum tę pętlę, i rozumiesz głębokie uczenie; resztę to architektura i inżynieria na jej szczycie.