Поэтому я пытаюсь научить себя нейронным сетям (для регрессионных приложений, а не для классификации изображений кошек).
Моими первыми экспериментами было обучение сети внедрению КИХ-фильтра и дискретного преобразования Фурье (обучение сигналам «до» и «после»), поскольку обе эти линейные операции могут быть реализованы одним слоем без функции активации. Оба работали нормально.
Тогда я хотел посмотреть, смогу ли я добавить abs()
и выучить амплитудный спектр. Сначала я подумал о том, сколько узлов потребуется в скрытом слое, и понял, что для грубого приближения достаточно abs(x+jy) = sqrt(x² + y²)
3 ReLU, поэтому я протестировал эту операцию отдельно для одиночных комплексных чисел (2 входа → 3 узла ReLU скрытый слой → 1 вывод). Изредка это работает:
Но в большинстве случаев, когда я это пробую, он застревает в локальном минимуме и не может найти правильную форму:
Я перепробовал все оптимизаторы и варианты ReLU в Keras, но они не имеют большого значения. Есть ли что-то еще, что я могу сделать, чтобы простые сети, подобные этой, надежно сходились? Или я просто подхожу к этому с неправильным отношением, и вы должны просто отбросить больше узлов, чем необходимо, при решении проблемы, и если половина из них умрет, это не будет иметь большого значения?
Ответы:
Выходные данные, по-видимому, убедительно свидетельствуют о том, что один или несколько ваших нейронов погибли (или, возможно, гиперплоскость весов для двух ваших нейронов слилась). Вы можете видеть, что с 3 Relu вы получаете 3 теневых разделения в центре, когда вы подходите к более разумному решению. Вы можете легко проверить, верно ли это, проверив выходные значения каждого нейрона, чтобы увидеть, остается ли он мертвым для подавляющего большинства ваших выборок. В качестве альтернативы, вы можете построить все 2x3 = 6 весов нейронов, сгруппированных по их соответствующим нейронам, чтобы увидеть, не коллапсируют ли два нейрона в одну и ту же пару весов.
Я подозреваю, что одной из возможных причин этого является то, что наклонено к одной координате, например, , и в этом случае вы пытаетесь воспроизвести тождество, как тогда . Здесь действительно мало что можно сделать, чтобы исправить это. Один из вариантов - добавить больше нейронов, как вы уже пробовали. Второй вариант - попробовать непрерывную активацию, например сигмоид, или что-то неограниченное, например, экспоненциальную. Вы также можете попробовать выбыть (скажем, с вероятностью 10%). Вы можете использовать обычную реализацию dropout в keras, которая, будем надеяться, достаточно умна, чтобы игнорировать ситуации, когда выпадают все 3 ваших нейрона.x ≫ y a b s ( x + i y ) ≈ xx+iy x≫y abs(x+iy)≈x
источник
3 shadowy splits in the center when you converge to the more reasonable solution.
Да, это грубое приближение я имел в виду; перевернутая шестиугольная пирамида.or perhaps something unbounded like an exponential
Я попробовал elu и selu, которые не работали намного лучше.two neurons collapse to the same pair of weights
Ах, я не думал об этом; Я просто предположил, что они были мертвы.