Operacje Matematyczne za pomocą sieci neuronowych?

Operacje Matematyczne za pomocą sieci neuronowych?
wojas666
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łuków
  • Postów: 177
0

Witam,
Od wczoraj zacząłem zagłębiać się w temat sieci neuronowych. Napisałem sobie sieć nieliniową z bias'em korzystając ze wzorów. Jako funkcję aktywacji użyłem funkcję logistyczną. Chciałbym nauczyć swoją sieć choćby nawet dodawania, ale czy to możliwe?

Do nauki używam przykładowych wartości:

Kopiuj
neuralNetwork.LearnNetwork(new double[] { 5.0 }, new double[] { 2.0, 3.0 }, 0.15);
Kopiuj
result = neuralNetwork.Calculation(signals);
Kopiuj
Debug.Log("Result: " + result[0]);

Dostaję na wyjściu wartości od 0 do 1. Czy jest w ogóle możliwość przykładowo "dodawania" wartości wejściowych i otrzymywania odpowiednich wyników na wyjściu?

drorat1
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Krasnystaw
  • Postów: 1185
0

Oczywiście że jest to możliwe. Jednak na wejściach taka sieć przyjmuje wartości rzeczywiste od -1 do 1 a na wyjściu w zależności od funkcji aktywacji 0..1 dla sigmoidalna unipolarna albo -1 do 1 dla sigmoidalna bipolarna. Bias jest po to żeby np. jeśli masz tą funkcję sigmoidalną bipolarną, to jeśli masz na wejściach same zera a na wyjściu chcesz mieć np 1 to bez tego nie nauczysz sieci.

Jeśli sieć nie obsługuje biasu (nie ma tego w swojej implementacji), najprościej jest dodać dodatkowe wejście na które dajesz stałą wartość np. 1.0 (albo -1.0). Nie zawsze jest zresztą ten bias potrzebny. Kolejna sprawa to to ile warstw musisz mieć i czy w ogóle potrzebujesz warstw ukrytych, w większości zastosowań wystarczy tylko jedna warstwa ukryta.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

@wojas666 jest możliwe, ale wymaga żebyś rozumiał w ogóle jak taka sieć działa. Sieć interpretuje siłę przychodzących sygnałów i na ich podstawie generuje sygnał wyjściowy. Sygnał na wyjściu zwykle jest "dyskretny" i ma 0 albo 1 (albo -1 ewentualnie) i oznacza aktywacje neuronu.
Żeby uzyskać "wynik" potrzebowałbyś tylu neuronów ile bitów może mieć wynik! Co więcej wejście sensowniej byłoby także zadać binarnie tak żeby mieć wyraźne dyskretne wejście.

drorat1
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Krasnystaw
  • Postów: 1185
1

Robiłem kiedyś też tego typu prosty kalkulator, z tym że była to tabliczka mnożenia od 0 do 100, w sposób, że na wejściach były dwie liczby, reprezentacja binarna więc po 4 bity na każdą liczbę wejściową od 0 do 9, więc 8 wejść, 7 bitów na wyjściu więc 7 wyjść. Mam źródła, była to struktura 8-16-7, funkcja sigmoidalna unipolarna.

Fajnie to wygląda w praktyce, bo można świetnie zobrazować proces uczenia, tzn. jak mała liczba rund treningowych to tym więcej błędów taka sieć popełnia, zwiększanie liczby rund treningowych aż do momentu kiedy to sieć wypluwa dane bez żadnych błedów, co obrazuje nauczenie się tabliczki mnożenia jakby na blachę :-)

Robiłem to w Lazarusie na FANN (port pod Lazarusa) i to tylko eksperymentalnie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.