WedX - журнал о программировании и компьютерных науках

Многослойная нейронная сеть, сходящаяся к бесконечности всего за 10 эпох при скорости обучения 0,1

Итак, я пытаюсь создать многослойную нейронную сеть с 3 входными нейронами, 3 скрытыми нейронами и 1 выходным нейроном.

Я планирую заставить его изучить 3-битный шаблон xor. b1 xor b2 xor b3 вид таблицы. Прямо сейчас я пытаюсь научить этому следующую таблицу.

0d,0d,0d    =>0d
0d,0d,1d    =>1d    
0d,1d,0d    =>1d
0d,1d,1d    =>0d
1d,1d,0d    =>0d
1d,1d,1d    =>1d

введите описание изображения здесь

hidden [] - это веса между скрытым слоем и выходным слоем, input [] - это веса между входным и скрытым слоями.

Игнорировать D

Вот код, и он сходится всего через 10 эпох при скорости обучения 0,1 и значении ошибки до бесконечности: |

class neuron{
    double hidden[] = {1d,1d,1d};
    double input[][] = { {1d,1d,1d},{1d,1d,1d},{1d,1d,1d}};
    double learning = 0.1;
    double bias = 1d;

    public double[] react(double a,double b,double c){
        double h1 = a*input[0][0] + b*input[0][1] + c*input[0][2];
        double h2 = a*input[1][0] + b*input[1][1] + c*input[1][2];
        double h3 = a*input[2][0] + b*input[2][1] + c*input[2][2];
        //System.out.println(input[0][0]);
        double total[] = new double[4];
        total[0] = h1*hidden[0] + h2*hidden[1] + h3*hidden[2] + bias;
        total[1] = h1; total[2] = h2; total[3] = h3;
        return total;
    }

    public void learn(double a,double b, double c, double ideal){
        double actual[] = react(a,b,c);

        double error = ideal - actual[0];
        System.out.println(error);
        error *= learning;

        for( int i = 0; i < 3; i++ )
            hidden[i] += error * actual[i+1];
        bias += error;
        for( int i = 0; i < 3; i++ ){
            input[i][0] +=  error * actual[i+1] * a;
            input[i][1] +=  error * actual[i+1] * b;
            input[i][2] +=  error * actual[i+1] * c;
        }

        }
    }



public class multilayer{

        public static void main(String argz[]){
        neuron a = new neuron();
        for( int i = 0; i < 20; i++){
            a.learn(0d,0d,0d,0d);
            a.learn(0d,0d,1d,0d);   
            a.learn(0d,1d,0d,0d);
            a.learn(0d,1d,1d,0d);
            a.learn(1d,1d,0d,0d);
            a.learn(1d,1d,1d,1d);

        }
        System.out.println(a.react(0d,0d,0d)[0] >=0.5 ? 1 : 0);
        System.out.println(a.react(0d,0d,1d)[0]>=0.5 ? 1 : 0);
        System.out.println(a.react(0d,1d,0d)[0]>=0.5 ? 1 : 0);
        System.out.println(a.react(1d,1d,0d)[0]>=0.5 ? 1 : 0);
        System.out.println(a.react(0d,1d,1d)[0]>=0.5 ? 1 : 0);
        System.out.println(a.react(1d,1d,1d)[0]>=0.5 ? 1 : 0);
        }
}

Я сбил спрятанный нейрон а он все равно сходится к бесконечности все веса !!

18.12.2013

  • Нарушаю ли я какое-то правило, не используя сигмовидную функцию? 19.12.2013

Ответы:


1

Прежде всего, вы должны добавить ввод смещения для каждого из ваших скрытых единиц. Каждый невходной блок в искусственной нейронной сети должен иметь вход смещения, это поможет блоку быстрее сходиться.

Во-вторых, вы должны изменить веса в противоположном направлении (вы должны вычесть ошибку из весов). Основная причина того, что вы приближаетесь к бесконечности, заключается в следующем. Потому что чем больше у вас вес, тем больше будет ваша ошибка. Добавляя ошибку к весу, вы создаете цепную реакцию, в результате которой веса (и погрешность) сходятся к бесконечности.

В-третьих, ваш алгоритм обучения совершенно неправильный :) особенно часть, в которой вы вычисляете входные веса с учетом ошибок и их входных данных.

В многослойной нейронной сети следует использовать алгоритм обратного распространения ошибки (EBP). Этот алгоритм изменяет каждый вес в зависимости от его доли в окончательной ошибке. Для определения скорости изменения используется производная выходной ошибки. Для получения дополнительной информации о EBP проверьте этот вопрос.

01.01.2014
  • На самом деле использование входов смещения не является строго необходимым, хотя лучше оставить их по умолчанию. Более того, обратное распространение ошибок - не единственный способ обучения в нейронной сети. Возможно, вы захотите предварительно обучиться с помощью RBM Learning. 09.03.2014
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]