Как обучить простейшую нейросеть?
Имеется нейросеть с 2 входными нейронами и 1 выходным. Задача предсказать число (сложить 2 числа). Можно представить координатную прямую. Первый нейрон - текущее положение на оси X. Второй нейрон - на сколько изменилось значение на оси X. Например, 1 нейрон: 100, второй нейрон: 25, на выходе должно получиться 125. В теории оба веса должны быть = 1. Однако на практике у меня так не получилось сделать. Я пробовал % соотношение, то есть на сколько сильно вес повлиял на выход, на столько он и будет изменён. Однако ничего хорошего у меня не получилось. Стартовые веса я брал 0.6 и 0.4. (у меня получались веса 1.2 и 0.8, за 10к повторений они не поменялись) Объясните пожалуйста, какими действиями обучить нейросеть? Что нужно сделать? В высшей математике не разбираюсь (производные и т.д. не понимаю). C++
#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
float X = 0; //Входное значение (координата мыши X)
float V = 0; //Входное значение (на сколько переместились)
float W1 = 0; //вес 1
float W2 = 0; //вес 2
float S = 0; //сумма нейронов (конечный результат, предсказание)
int j = 0; //количество повторений (обучения)
float E = 0; //на сколько ошиблись
float EB = 0; //ошибки
int main()
{
std::cout << "Vvedite Colichestvo povtorenii: " << std::endl;
std::cin >> j;
for (int i = 0; i < j; i++)
{
std::cout << "Vvedite nachalnui X: " << std::endl;
std::cin >> X;
std::cout << "Vvedite na skolko peremestilis: " << std::endl;
std::cin >> V;
//подгружаем веса
setlocale(LC_ALL, "ru");
string path = "test.txt";
ifstream fin;
fin.open(path);
if (!fin.is_open())
{
cout << "Ошибка открытия файла!" << endl;
}
else
{
fin >> W1;
fin >> W2;
}
fin.close();
X = X * W1; //результат 1 нейрона
V = V * W2; //результат 2 нейрона
S = X + V; //сумма (выходное значение)
std::cout << "Rezultat: " << S << std::endl;
std::cout << "Vvedite sto dolzhno bilo poluchitza: " << std::endl;
std::cin >> E;
//рассчёт ошибки
E = E - S; //находим на сколько ошиблись
X = W1 / S; //находим % (так же пробовал находить % от суммы весов, а не от выходного значения)
V = W2 / S; //находим %
X = X * E; //умножаем ошибку на %
V = V * E; //умножаем ошибку на %
W1 = W1 + X;
W2 = W2 + V;
//для 1 запуска
//W1 = 0.6;
//W2 = 0.4;
//новые веса
std::cout << "W1: " << W1 << std::endl;
std::cout << "W2: " << W2 << std::endl;
setlocale(LC_ALL, "ru");
ofstream fout;
fout.open(path);
if (!fout.is_open())
{
cout << "Ошибка открытия файла для записи!" << endl;
}
else
{
//выгружаем веса
fout << W1;
fout << W2;
}
fout.close();
cout << "i: " << i << endl; //сколько выполнено проходов
}
return 0;
}