Зачем в нейроне сглаживание?

using System;

namespace NeuralNetwork
{

    class Program
    {
        public class Neuron
        {
            public decimal weight = 0.5m;
            public decimal lastError;
            public decimal smoothing = 0.00001m;

            public decimal ProcessInputData(decimal input)
            {
                return input * weight;
            }

            public decimal RestoreInputData(decimal output)
            {
                return output / weight;
            }

            public void Train(decimal input, decimal expectedRsult)
            {
                var actualResult = input * weight;
                lastError = expectedRsult - actualResult;
                var correction = (lastError / actualResult) * smoothing;
                weight += correction;

            }
        }

        static void Main(string[] args)
        {
            decimal km = 100m;
            decimal miles = 62.1371;

            Neuron neuron = new Neuron();

            int i = 0;

            do
            {
                i++;
                neuron.Train(km, miles);
                if (i%1000 == 0)
                {
                    Console.Clear();
                    Console.WriteLine($"Вес: {neuron.weight}\t Ошибка:\t{neuron.lastError}");
                }

            } while (neuron.lastError > neuron.smoothing || neuron.lastError < -neuron.smoothing);

            Console.WriteLine($"{neuron.ProcessInputData(100)} миль в {100} км");
        }
    }
}

Начал изучение нейросетей и наткнулся на код одного нейрона, не могу понять зачем нужно умножать на Smoothing

var correction = (lastError / actualResult) * smoothing;

Ведь если smoothing = 0.01 то выход получается 62,127346013186325993867045670 (правильно 62.1371)

Eсли smoothing = 0.0001 то выход получается 62,137000019305511022149689300 (правильно 62.1371)

Eсли smoothing = 0.000001 то выход получается 62,137099000002893257049892940 (правильно 62.1371)

var correction = (lastError / actualResult) * smoothing;

Если просто не умножать на smoothing то выход получается 62,137099404290247741450941250 (правильно 62.1371)

И чем больше нолей после запятой тем дольше идёт обучение, а если не умножать то мгновенно, и точность выше, объясните мне тупому в чём тут прикол?


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

Автор решения: Danis

smoothing - это коэффициент скорости обучения:

Коэффициент скорости обучения – это гиперпараметр, определяющий порядок того, как мы будем корректировать наши весы с учётом функции потерь в градиентном спуске. Чем ниже величина, тем медленнее мы движемся по наклонной. Хотя при использовании низкого коэффициента скорости обучения мы можем получить положительный эффект в том смысле, чтобы не пропустить ни одного локального минимума

вот статья на habr

→ Ссылка