Вопрос по machine-learning, neural-network – Приближение функции синуса с помощью нейронной сети

16

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

Я в основном пытаюсь приблизить один период синусоидальной функции одним скрытым слоем, состоящим из 6-10 нейронов. Сеть использует гиперболический тангенс в качестве функции активации для скрытого слоя и линейную функцию для вывода. Результат остается довольно грубой оценкой синусоиды и требует много времени для расчета.

я смотрел наEncog для справки, но даже при этом я не могу заставить его работать с простым обратным распространением (при переключении на устойчивое распространение оно начинает улучшаться, но все еще намного хуже, чем предоставленный супер гладкий сценарий Rв этом похожем вопросе). Так что я на самом деле пытаюсь сделать что-то, чтоне возможно? Разве невозможно приблизить синус с простым обратным распространением (без импульса, без динамической скорости обучения)? Какой метод используется библиотекой нейронных сетей в R?

РЕДАКТИРОВАТЬЯ знаю, что это определенновозможный чтобы найти достаточно хорошее приближение даже при простом обратном распространении (если вам невероятно повезло с вашими начальными весами), но на самом деле мне было более интересно узнать, является ли этовыполнимый подход. Сценарий R, с которым я связан, кажется, сходится так невероятно быстро и надежно (в 40 эпохах только с несколькими учебными образцами) по сравнению с моей реализацией или даже смогомЭластичное распространение. Я'мне просто интересно, если естьЧто-то, что я могу сделать, чтобы улучшить свой алгоритм обратного распространения, чтобы добиться той же производительности, или мне нужно искать какой-то более продвинутый метод обучения?

Вы когда-нибудь заставляли его работать? Столкнувшись с той же проблемой. Lex
Дон»Я так не думаю, но не могуЯ больше не помню все детали, как это было 4 года назад. Упомянутый выше пакет nnet реализован на C и состоит всего из 700 строк кода, а затем поверх него помещается некоторая R-оболочка. Возможно, изучение этого даст вам некоторые идеи. Muton

Ваш Ответ

2   ответа
7

сред для нейронных сетей, таких как TensorFlow.

Например, двухслойная нейронная сеть, использующая 100 нейронов на слой, обучается за несколько секунд на моем компьютере и дает хорошее приближение:

Код также довольно прост:

import tensorflow as tf
import numpy as np

with tf.name_scope('placeholders'):
    x = tf.placeholder('float', [None, 1])
    y = tf.placeholder('float', [None, 1])

with tf.name_scope('neural_network'):
    x1 = tf.contrib.layers.fully_connected(x, 100)
    x2 = tf.contrib.layers.fully_connected(x1, 100)
    result = tf.contrib.layers.fully_connected(x2, 1,
                                               activation_fn=None)

    loss = tf.nn.l2_loss(result - y)

with tf.name_scope('optimizer'):
    train_op = tf.train.AdamOptimizer().minimize(loss)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    # Train the network
    for i in range(10000):
        xpts = np.random.rand(100) * 10
        ypts = np.sin(xpts)

        _, loss_result = sess.run([train_op, loss],
                                  feed_dict={x: xpts[:, None],
                                             y: ypts[:, None]})

        print('iteration {}, loss={}'.format(i, loss_result))
Ваш код фактически реализует 3-х слойную нейронную сеть, а не 2-х слойную. Схема именования включает в себя скрытые слои и выходной слой, так что ваши три слоя,x1x2, а также .result stackoverflowuser2010
2

универсальные аппроксиматоры - это означает, что для любой функции F и ошибки E существуетнемного нейронная сеть (требующая только одного скрытого слоя), которая может приближаться к F с ошибкой меньше, чем E.

Конечно, найти эту (эти) сеть (и) - это совсем другое дело. И лучшее, что я могу вам сказать, это метод проб и ошибок ...s основная процедура:

Разделите ваши данные на две части: обучающий набор (~ 2/3) и тестовый набор (~ 1/3).Тренируйте свою сеть по всем предметам в тренировочном наборе.Тест (но неt) обучить вашу сеть всем элементам в наборе тестирования и записать среднюю ошибку.Повторите шаги 2 и 3, пока недостигли минимальной ошибки тестирования (это происходит с "переобучения» когда ваша сеть начинает получать очень хорошие данные об обучении в ущерб всему остальному) или пока ваша общая ошибка не перестанет заметно уменьшаться (подразумевая сеть 'так хорошо, как этособирается получить).Если ошибка в этой точке приемлемо мала, вы 'сделано. Если нет, ваша сеть недостаточно сложный, чтобы справиться с функцией, которую выпереучить его; добавьте больше скрытых нейронов и вернитесь к началу ...

Иногда изменение вашей функции активации также может иметь значение (просто неt использовать линейный, так как это сводит на нет силу добавления дополнительных слоев). Но опять же, этоБуду методом проб и ошибок, чтобы увидеть, что работает лучше всего.

Надеюсь, что это помогает (и извините, я могу 'быть более полезным)!

PS: Я тоже это знаювозможно, так как явидел кто-то приблизительный синус с сетью. Я хочу сказать онане было используя функцию активации сигмоида, но я не могуне могу гарантировать мою память на этот счет ...

@ Мутон - Попался. Мой единственный совет в этом случае - добавить термин «импульс» к вашей текущей настройке. Должна помочь по двум направлениям:немного ускорит обучение и позволит вам убежать от некоторых локальных минимумов. Я могу'Однако я не думаю, что это будет иметь огромное значение для производительности. Xavier Holt
Спасибо! Это на самом деле то, что яя уже делаю, и яМне жаль, если я был немного неясен. Я знаю этовозможный, но больше пытался выяснить, является ли простой метод обучения, который я использую,выполнимый для этой конкретной проблемы? Muton

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