2016-01-06 2 views
3

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

Это пример кода given in this section для создания нейронной сети для изучения функции 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 

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

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 

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

+0

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

+0

Трудно сказать, прежде чем увидеть тип данных, которые вы имеете, способ обучения в сети, используемая регуляризация и .... Вообще говоря, чем сложнее модель, тем больше данных вам нужно будет изучить функцию * right *. – Amir

ответ

3

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

  • инициализации Вес важно. Правильная инициализация веса позволяет нашим градиентам проскальзывать через нашу сеть и учиться. Есть ли возможность инициализировать вес в вашей сети? Общие схемы инициализации - Инициализация Ксавьера Глорота, приведенная в Understanding the difficulty of training deep feedforward neural networks, а совсем недавно в Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification.

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

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

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

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

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

Смежные вопросы