Почему добавление дополнительных слоев к этой нейронной сети ухудшает результат?

Я только начинаю работать с нейронными сетями и использую Synaptic, чтобы начать работу (я знаю, что знаю, нейронные сети в JavaScript , ах!).

Это пример кода, приведенный в этом разделе для создания нейронной сети для изучения функции XOR:

var myPerceptron = new Architect.Perceptron(2, 3, 1);
var myTrainer = new Trainer(myPerceptron);

myTrainer.XOR();

console.log(myPerceptron.activate([0, 0])); // 0.0268581547421616
console.log(myPerceptron.activate([1, 0])); // 0.9829673642853368
console.log(myPerceptron.activate([0, 1])); // 0.9831714267395621
console.log(myPerceptron.activate([1, 1])); // 0.02128894618097928

Я экспериментирую с добавлением дополнительных слоев и смотрю, что получится. Добавление одного дополнительного скрытого слоя не имеет большого эффекта, но добавление двух слоев делает вывод идентичным независимо от ввода.

var myPerceptron = new Architect.Perceptron(2, 3, 3, 3, 1);
var myTrainer = new Trainer(myPerceptron);

myTrainer.XOR();

console.log(myPerceptron.activate([0, 0])); // 0.521076904986927
console.log(myPerceptron.activate([1, 0])); // 0.5210769149857782
console.log(myPerceptron.activate([0, 1])); // 0.5210769118775331
console.log(myPerceptron.activate([1, 1])); // 0.5210769209325651

Почему так происходит? Это просто потому, что более сложная сеть требует гораздо большего обучения, или потому, что такая сеть по своей сути не подходит для такого рода проблем?


person Aron    schedule 06.01.2016    source источник
comment
Мне кажется, сложно изучить многоуровневую нейронную сеть. Насколько мне известно, нет простого механизма для изучения таких сетей в направлении оптимальности.   -  person Willem Van Onsem    schedule 06.01.2016
comment
Трудно сказать, прежде чем увидеть тип имеющихся у вас данных, способ обучения сети, используемую регуляризацию и ... Вообще говоря, чем сложнее становится модель, тем больше данных вам потребуется для изучения функции right.   -  person Amir    schedule 06.01.2016


Ответы (1)


Я не очень хорошо знаком с Synaptic (но он выглядит довольно круто), но вот некоторые общие проблемы, которые вы могли бы изучить:

  • Инициализация веса важна. Правильная инициализация веса позволяет нашим градиентам распространяться по нашей сети и обучаться. Есть ли возможность инициализировать веса в вашей сети? Распространенными схемами инициализации являются инициализация Xavier Glorot, приведенная в Понимание сложности обучения глубоких нейронных сетей с прямой связью и совсем недавно в Углубляясь в выпрямители: Превосходя человеческий уровень производительности по классификации ImageNet.

  • Ваш размер шага, или скорость обучения, слишком велик? Похоже, ваша сеть выводит постоянные значения. Если вы используете насыщающие нелинейности (то есть ограниченные функции активации, такие как сигмоид или tanh), то большое обучение может привести к насыщению ваших нелинейностей, и обучение эффективно остановится, и это может привести к получению постоянных значений.

  • Относится к предыдущему пункту: какой тип нелинейности вы используете в своих скрытых слоях? Опять же, если это насыщающая нелинейность, это может мешать вашему обучению. Вы можете попробовать исправить линейные единицы (ReLU), которые имеют форму $ f (x) = \ max (0, x) $. Они не ограничены, поэтому они не насыщаются и имеют градиент, равный 1, когда $ x> 0 $. У них есть интерпретация "активации", когда входной сигнал больше 0. В этом случае они действуют как переключатель и позволяют градиенту распространяться.

Могут быть и другие проблемы, которые, надеюсь, другие тоже могут прокомментировать. Вот те 3, которые мне сразу приходят в голову.

Я не знаком с Synaptic, поэтому я не уверен, сколько контроля и каковы их настройки или параметры по умолчанию.

Надеюсь это поможет!

person Indie AI    schedule 06.01.2016