@BashkaMen
C# программист

Однослойный персептрон, почему не обучается?

Всем привет, читая много статей, и смотря много видео я смогу реализовать персептрон, но почему-то он не может обучится делать мой перечень условий и функция обучения просто бесконечно учится и у меня есть пару вопросов о том что я реализовал.

Вот моя модель персептрона думаю знающие сразу поймет что к чему.

class Perceptron
    {
        public Input[] Inputs { get; private set; }
        public double OutPut { get; private set; }

        public Perceptron(int inputCount)
        {
            var r = new Random();
            Inputs = new Input[inputCount];

            for (int i = 0; i < Inputs.Length; i++)
            {
                Inputs[i] = new Input()
                {
                    Weight = r.NextDouble()
                };
            }
        }

        private double Normalize(double x)
        {
            return x > 0.5 ? 1 : 0;
        }

        public void Handle(double[] inputValues)
        {
            if (inputValues.Length != Inputs.Length) throw new ArgumentException("Количество параметров должно совпадать с количеством входов");

            for (int i = 0; i < Inputs.Length; i++)
            {
                Inputs[i].Value = inputValues[i];
            }

            OutPut = Normalize(Inputs.Select(s => s.Value * s.Weight).Sum());
        }

        public void Study(double[] inputValues, double answer)
        {
            var gError = 1.0;
            var error = 1.0;
            while (gError != 0)
            {
                gError = 0;
                Handle(inputValues);

                for (int i = 0; i < Inputs.Length; i++)
                {
                    error = answer - OutPut;
                    gError += Math.Abs(error);
                    var offset = error * Math.Abs(Inputs[i].Weight) * 0.001;
                    Inputs[i].Weight += offset;
                }
            }
        }
    }


этот персептрон может обучиться логическому И и ИЛИ, но XOR он обучиться не может и я понимаю почему - потому что разделить XOR можно только 2 полосками
18XGL1p.png
и я для завершающего понимая персептрона хотел обучить такой модели:

Персептрон сможет предсказывать (примитивно конечно, чисто для примера) результат матча по футболу.
у нас есть 2 параметра
1) Травмы
2) где играем Дом\Гости
Травмы очень сильный порог и я хочу что б персептрон понял это и понимал что если травма есть то он должен сильно снизить шансы на победу, а где играем не особо сильно влияет на игру, если б параметров было больше то все это было б точнее, и другие параметры имели б шанс перебить травму, но в текущем примере все проще чтоб я понял как это работает.
Я нарисовал график что б понять сможет ли он решить эту задачу.
tc8JdN1.png
Как видим, все делиться одним вектором - то-есть по идее возможно, но на деле не так, он просто зависает на какой-то из итераций обучения (предполагаю что мои условия противоречат логике), и веса просто растут до бесконечности.

1) Что все таки мешает ему обучиться моему примеру?
2) Функция нормализации служит для нормализации результата и передачи его в след слой? или нормализовать на выход? (планирую сделать многослойный персептрон)
3) У меня есть сомнения на счет метода обучения, потому как метод обучения трогает все веса, и подгоняет под одну ошибку всей сети, хотя я знаю что чтоб решить мою задачу достаточно сделать малый вес на параметр где играем и большой отрицательный вес на травмы, тогда я буду получать число ближе к 0 и нормализоровать его к 0
  • Вопрос задан
  • 1023 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы