Как научить нейронную сеть складывать числа

Решил написать простенькую нейронную сеть с одним нейроном, которая из набора введённых нулей и единиц (к примеру: 0,1,1) должна выводить первую по порядку цифру (в данном случае это цифра 0). Для получения результата я прогоняю сумму входных данных, умноженных на весы, через сигмоиду (которая выдает результат от 0 до 1). После происходит корректировка весов. Вопрос такой: что делать, если я, к примеру, хочу научить нейронную сеть складывать все эти числа (числа могут быть больше 1)? что тогда должно быть вместо функции активации? как получить результат, больше единицы?

P.S может быть вопрос не такой сложный, но я сравнительно плох в программировании, поэтому это мой максимум.

#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib> 
#include <ctime> 
using namespace std;
int main()
{
    srand(static_cast<unsigned int>(time(0)));
    int t = 0;
   

   
    double output = 0;
   double output1 = 0;
  

    double adjust = 0;

    double error = 0;

    int training_inputs[4][3] =
    {
    { 0, 0, 1 }, 
    { 1, 1, 1 }, 
    { 1, 0, 1 },
    { 0, 1, 1 }
    };

    

    int training_outputs[4] = { 0,1,1,0 };

    double weights[3] = { 1,1,1 };

    int inputs[3] = { 0,1,1 };

 


    for (int i = 0; i < 100000; i++)
    {
        for (int m = 0; m < 4; m++)
        {
            for (int n = 0; n < 3; n++)
            {
                output1 += training_inputs[m][n]*weights[n];
            }

            output = 1 / (1 + exp(-output1));

            error = training_outputs[m] - output;

            for (int p = 0; p < 3; p++)
            {

                adjust = error * training_inputs[m][p] * output*(1 - output);
                weights[p] += adjust;
            }
            output1 = 0;
            output = 0;
            error = 0;
            adjust = 0;

        }

    }

    for (int n = 0; n < 3; n++)
    {
       cout<< weights[n]<<endl;
    }

    
        for (int n = 0; n < 3; n++)
        {
            output1 += inputs[n] * weights[n];
        }

        output = 1 / (1 + exp(-output1));

        cout << output;

    
    return 0;
}

Ответы (1 шт):

Автор решения: V-Mor

Во всех пособиях по машинному обучению и нейронным сетям утверждается примерно следующее: нейронные сети не предназначены для точных вычислений.

То есть, учить нейронку даже простым математическим операциям – гиблое дело. Классификация – да, прогнозирование – да, ещё множество полезных применений – несомненно. Но не вычисления. Обосновано это утверждение тем, что нейронные сети – алгоритм, основанный на вероятностях и случайных числах. То есть Вы не сможете добиться абсолютно численно одинакового результата, обучив одну сеть даже на тех же (достаточно сложных) наборах данных несколько раз.

Здесь можно достаточно долго рассуждать о том, как работают нейронные сети и почему они не пригодны для точных вычислений. Я лишь скажу из опыта, что научить нейронную сеть складывать числа теоретически можно, приняв, как минимум, следующие два допущения:

  1. Набор складываемых чисел всегда будет ограничен. То есть, если Вы будете тренировать сеть на данных типа [1, 1, 2], [2, 2, 4], [2, 3, 5], ... ([слагаемое, слагаемое, сумма]), а потом передадите ей на вход [15, 15], Вы точно не получите в ответ 30. То, на чём Вы её тренировали, она "запомнит", но выполнить своё главное свойство – выдать аналогичное решение на данных, которые не использовались при обучении, Ваша НС не сможет.
  2. Даже при обучении на маленьком наборе данных с небольшими числами вполне возможен такой исход, что НС, складывая, например, 2 и 2, будет получать в конце что-то типа 3.99998 или 4.00003. Потому что, опять же, алгоритм не точный и основан на вероятностях и случайных числах.

P.S. Этот ответ был дан исключительно исходя из личного опыта и знаний. Здесь я указал далеко не все причины, по которым НС не пригодны для точных вычислений и описал далеко не все проблемы, с которыми Вам предстоит столкнуться, если Вы всё же решитесь заняться таким делом. Мой Вам совет – почитайте литературу о машинном обучении и нейросетях, Вам многое станет понятно.

→ Ссылка