Blog Dla Programistów C#/.NET

środa, 3 grudnia 2025

Sztuczna inteligencja i sieci neuronowe kojarzą się głównie z Pythonem, ale jako programiści C# również możemy tworzyć i trenować modele AI. Dziś istnieje wiele gotowych frameworków (np. ML.NET) ułatwiających uczenie maszynowe w .NET, pozwalających od razu skupić się na rozwiązywanym problemie. Jednak warto czasem wrócić do podstaw i zrozumieć, jak taka sieć działa "pod maską". W tym artykule zbudujemy od zera prostą sieć neuronową w C# i zobaczymy, jak przebiega proces jej trenowania. Dzięki temu lepiej zrozumiesz mechanizmy stojące za uczeniem maszynowym i łatwiej będzie Ci korzystać z bardziej rozbudowanych narzędzi w przyszłości.

Twoja Pierwsza Sieć Neuronowa w C# - Trenujemy Prosty Model AI Od Podstaw

Czym jest prosta sieć neuronowa?


Sieć neuronowa to model matematyczny inspirowany działaniem ludzkiego mózgu. Składa się z połączonych ze sobą neuronów ułożonych warstwami (wejściową, ukrytą, wyjściową). Taki sztuczny neuron sumuje swoje wejścia pomnożone przez ustalone wagi, dodaje tzw. bias (stałe przesunięcie) i wynik przepuszcza przez nieliniową funkcję aktywacji. Dzięki połączeniu wielu neuronów sieć może uczyć się zależności - trenowanie polega na stopniowym modyfikowaniu wag połączeń tak, by dla danych wejściowych sieć dawała pożądane wyniki na wyjściu. Na początku wagi są losowe, więc odpowiedzi sieci są błędne. Poprzez iteracyjne uczenie (dokonywanie drobnych poprawek wag) stopniowo minimalizujemy błąd między przewidywaniami sieci a oczekiwanymi wartościami.

Dla uproszczenia zbudujemy model z jednym neuronem (to najprostsza sieć neuronowa). Taki pojedynczy neuron potrafi rozwiązać proste zadanie, np. nauczyć się funkcji logicznej OR. Jeśli potrzebna byłaby bardziej złożona zależność (np. problem XOR), zwykły pojedynczy neuron nie wystarczy, konieczne są warstwy ukryte i algorytm propagacji wstecznej błędu do trenowania wielu warstw naraz. W naszym przykładzie skupimy się jednak na podstawach, aby zrozumieć ideę.


Implementacja sieci neuronowej od podstaw w C#


Wyobraźmy sobie, że chcemy nauczyć neuron realizować bramkę OR. Mamy dwa wejścia binarne i jedno wyjście, które powinno być równe 1, gdy co najmniej jedno z wejść jest 1 (w przeciwnym razie 0). Pokażemy, jak w C# zaimplementować trening takiego neuronu krok po kroku.

Główne elementy modelu: potrzebujemy dwóch wag (po jednej dla każdego wejścia) oraz biasu. Zaczynamy od nadania im losowych wartości. Ustalamy też współczynnik uczenia (np. 0,1), który określa, jak duże korekty wag będziemy robić na podstawie błędu. Jako funkcji aktywacji użyjemy sigmoidy, przyjmuje ona dowolną sumę na wejściu i zamienia na zakres 0–1, co pasuje do interpretacji wyniku jak prawdopodobieństwa (im bliżej 1, tym pewniej neuron "uważa", że wyjście powinno być 1).

Przebieg treningu: W każdej iteracji (epoch) podajemy neuronowi kolejne przykłady z danych treningowych i aktualizujemy wagi:
    
1. Obliczenie wyjścia neuronu: dla danych wejściowych mnożymy je przez odpowiadające wagi, sumujemy, dodajemy bias i przepuszczamy przez funkcję aktywacji (np. sigmoidalną). Otrzymujemy aktualne przewidywanie neuronu.
    
2. Obliczenie błędu: porównujemy przewidywanie z oczekiwaną wartością wyjściową. Różnica (np. error = oczekiwane - przewidywane) to błąd dla danego przykładu – informuje nas, w którą stronę i jak bardzo neuron się pomylił.
    
3. Aktualizacja wag: na podstawie błędu korygujemy wagi i bias neuronu. Jeśli błąd jest duży (wynik znacznie odbiega od oczekiwanego), dokonujemy większej zmiany wag; jeśli mały - korekta jest niewielka. W przypadku funkcji sigmoidalnej mnożymy błąd przez pochodną sigmoidy (to tzw. gradjent, uwzględniający czułość neuronu przy danej wartości), a następnie dodajemy ten skorygowany błąd do wag (pomnożony przez wejście i tempo uczenia). Bias aktualizujemy analogicznie.

Powyższe kroki wykonujemy wielokrotnie dla wszystkich przykładów. Wraz z kolejnymi epokami łączny błąd sieci powinien maleć, a neuron "uczy się" zadania. Poniżej znajduje się przykładowy kod w C# ilustrujący cały proces uczenia dla bramki OR:

/* Inicjalizacja parametrów */
double w1 = 0.5, w2 = -0.5; /* przykładowe losowe wagi początkowe */
double bias = 0.0; /* początkowy bias */
double lr = 0.1; /* tempo uczenia (learning rate) */

/* Dane treningowe dla bramki OR: (x1, x2) -> oczekiwane wyjście */
var trainingData = new (double x1, double x2, double expected)[]
{
(0, 0, 0),
(0, 1, 1),
(1, 0, 1),
(1, 1, 1)
};

/* Trening przez określoną liczbę epok */
for (int epoch = 0; epoch < 1000; epoch++)
{
foreach (var (x1, x2, expected) in trainingData)
{
/* 1. Oblicz wyjście neuronu (funkcja aktywacji = sigmoid) */
double sum = w1 * x1 + w2 * x2 + bias;
double output = 1.0 / (1.0 + Math.Exp(-sum));
/* 2. Oblicz błąd (różnica oczekiwanego wyniku i otrzymanego wyjścia) */
double error = expected - output;
/* 3. Skoryguj wagi i bias (uwzględniając pochodną sigmoidy) */
double grad = output * (1 - output); /* pochodna sigmoid dla 'sum' */
w1 += lr * error * grad * x1;
w2 += lr * error * grad * x2;
bias += lr * error * grad;
}
}

Po przeprowadzeniu powyższego treningu neuron powinien poprawnie realizować funkcję OR, tzn. dla wejść (0,0) wyjście będzie bliskie 0, a dla pozostałych kombinacji bliskie 1. Zwróć uwagę, że użyliśmy bardzo prostego modelu i algorytmu uczenia. Mimo to zasada jest podobna jak w większych sieciach: minimalizujemy błąd poprzez iteracyjne dostosowanie wag. W bardziej złożonych sieciach z wieloma neuronami procedura odbywa się analogicznie, tylko trzeba dodatkowo rozpropagować błąd na kolejne warstwy (stąd nazwa algorytmu backpropagation, czyli propagacja wsteczna). Implementacja pełnej propagacji wstecznej ręcznie jest dość skomplikowana matematycznie, ale idea pozostaje taka sama jak wyżej – małymi krokami poprawiać parametry, by zbliżać wyniki modelu do oczekiwań.

Uwaga: Nasza implementacja od podstaw jest edukacyjna. W praktyce, trenowanie głębokiego modelu od zera bywa czasochłonne i wymaga dużej ilości danych oraz mocy obliczeniowej (nierzadko setek godzin pracy GPU). Dlatego w projektach komercyjnych zazwyczaj korzysta się z istniejących bibliotek i frameworków, które zawierają zoptymalizowane algorytmy. W ekosystemie .NET mamy m.in. ML.NET, które zapewnia dostęp do zaawansowanych frameworków (TensorFlow, TorchSharp itp.) i pozwala korzystać z sieci neuronowych bez pisania ich całkowicie od podstaw. Mimo to, znając podstawy działania sieci (np. poprzez taką prostą implementację jak powyżej), łatwiej zrozumieć i prawidłowo wykorzystać te narzędzia.


Podsumowanie


Zbudowanie prostej sieci neuronowej w C# od podstaw pokazuje, że również w .NET można trenować modele AI, a przy tym zyskujemy lepsze zrozumienie ich działania. Omówiliśmy, jak pojedynczy neuron sumuje wejścia z wagami, stosuje funkcję aktywacji i jak dzięki iteracyjnemu uczeniu może poprawiać swoje wyniki. Choć w praktyce częściej sięgniemy po gotowe biblioteki, taka podstawowa wiedza przyda się każdemu, kto chce rozwijać się w kierunku AI/ML. Zachęcam Cię do eksperymentów, np. zmiany funkcji aktywacji, tempa uczenia lub próby nauczenia neuronu innych prostych zadań.

Jeśli zainteresowało Cię uczenie modeli AI w C# i chcesz zgłębić temat bardziej systematycznie, rozważ dołączenie do mojego kursu online Szkoła AI w C#/.NET. To kompleksowy program, w którym uczymy się krok po kroku tworzenia aplikacji z wykorzystaniem sztucznej inteligencji i uczenia maszynowego w środowisku .NET - od podstaw aż po bardziej zaawansowane projekty. Dzięki temu zbudujesz solidne fundamenty i pewność w tworzeniu własnych rozwiązań AI jako programista C#.

Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
CTO & Founder - FindSolution.pl
Programista C#/.NET. Specjalizuje się w Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET Web API, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Dodaj komentarz

Wyszukiwarka

© Copyright 2025 modestprogrammer.pl | Sztuczna Inteligencja | Regulamin | Polityka prywatności. Design by Kazimierz Szpin. Wszelkie prawa zastrzeżone.