Обсуждение статьи "Обучение многослойного персептрона с помощью алгоритма Левенберга-Марквардта"

 

Опубликована статья Обучение многослойного персептрона с помощью алгоритма Левенберга-Марквардта:

В статье представлена реализация алгоритма Левенберга-Марквардта для обучения нейронных сетей прямого распространения. Проведен сравнительный анализ результативности с алгоритмами из библиотеки scikit-learn Python. Предварительно обсуждаются более простые методы обучения такие как градиентный спуск, градиентный спуск с импульсом и стохастический градиентный спуск.

Цель данной статьи дать практикующим трейдерам очень эффективный алгоритм обучения нейронных сетей — вариант ньютоновского метода оптимизации, известный как алгоритм Левенберга-Марквардта. Это один из самых быстрых алгоритмов обучения нейронных сетей прямого распространения, конкуренцию которому может составить разве что алгоритм Бройдена-Флетчера-Гольдфарба-Шанно(L-BFGS).

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

На данный момент насколько мне известно, реализации алгоритма Левенберга-Марквардта на языке MQL5 в открытом доступе нет. Пора этот пробел заполнить, а также, заодно, вкратце пройтись по хорошо известным и самым простым алгоритмам оптимизации, таким как градиентный спуск, градиентный спуск с импульсом (momentum) и стохастический градиентный спуск. В конце статьи проведем небольшое тестирование эффективности алгоритма Левенберга-Марквардта и алгоритмов из библиотеки машинного обучения scikit-learn.

Автор: Evgeniy Chernish

 

Спасибо за интересную статью.

Жаль по кодам мало объяснений.

И с питоновским кодом что-то не так, вроде все библиотеки установил, выдаёт в терминале следующее:

learning time  = 1228.5106182098389
solver =  lbfgs
loss =  0.0024399556870102
iter =  300
C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py:545: ConvergenceWarning: lbfgs failed to converge (status=1): in '' (0,0)
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. in '' (0,0)
Increase the number of iterations (max_iter) or scale the data as shown in: in '' (0,0)
    https://scikit-learn.org/stable/modules/preprocessing.html in '' (0,0)
  self.n_iter_ = _check_optimize_result("lbfgs", opt_res, self.max_iter) in '' (0,0)
Traceback (most recent call last): in '' (0,0)
    plt.plot(np.log(pd.DataFrame(clf.loss_curve_))) in 'SklearnMLP.py' (59,0)
AttributeError: 'MLPRegressor' object has no attribute 'loss_curve_' in 'SklearnMLP.py' (59,0)

Ещё один момент, скрипт SD в некоторых случаях рисует такую картинку:


Т.е., алго застрял на, судя по всему, простой дате.

Остальные коды тоже выдают очень разные результаты по сходимости. Поэтому желательно приводить графики серии независимых испытаний, картинки единичных испытаний мало о чем говорят (практически ничего).

 

Спасибо за отзыв.

По пайтону. Это не ошибка, это он предупреждает, что алгоритм остановился из-за того, что мы достигли лимита итераций. То есть алгоритм остановился раньше чем достигнуто значение tol = 0.000001. А дальше он ругается, что оптимизатор lbfgs не имеет атрибута "loss_curve", то есть данных функции потерь. Для adam и sgd они сделали,а для lbfgs почему-то нет. Мне наверно нужно было сделать скрипт так, что бы когда запускается lbfgs то не запрашивать это свойство , что бы оно людей с толку не сбивало.

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

 
Evgeniy Chernish #:

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

Об этом и веду речь. Это устойчивость, или, воспроизводимость результатов. Чем больше разброс результатов, тем ближе алгоритм по свойствам к RND для данной задачи.

Вот пример работы трёх разных алго. Какой из них лучше всего? Если не провести серию независимых испытаний и не посчитать средние результаты (в идеале посчитать и сравнить дисперсию итоговых результатов), то и сравнить невозможно.

 
Andrey Dik #:

Об этом и веду речь. Это устойчивость, или, воспроизводимость результатов. Чем больше разброс результатов, тем ближе алгоритм по свойствам к RND для данной задачи.

Вот пример работы трёх разных алго. Какой из них лучше всего? Если не провести серию независимых испытаний и не посчитать средние результаты (в идеале посчитать и сравнить дисперсию итоговых результатов), то и сравнить невозможно.

Нужно определится тогда с критерием оценки.
Можно за критерий взять время и максимальный результат ( или минимальный если нужно найти минимум функции).
Задать количество рестартов.
Зафиксировать максимум достигнутый за это количество рестартов и затраченное на это время.
 Провести серию таких испытаний, допустим 1000.
И уже среднее и дисперсию считать по этой серии, то есть среднее и дисперсию по максимуму.

Я уже просто так тщательно чуть ли не до построения плотности распределения результатов это не делал, все же невозможно охватить в одной статье.
 
Статья замечательна без дополнительных тестов и соответствует общепринятым выводам относительно алгоритмов :) Благодаря этому можно быстро о чем-то договориться и перейти к следующей теме.
 
Evgeniy Chernish #:
Нужно определится тогда с критерием оценки.
Можно за критерий взять время и максимальный результат ( или минимальный если нужно найти минимум функции).
Задать количество рестартов.
Зафиксировать максимум достигнутый за это количество рестартов и затраченное на это время.
 Провести серию таких испытаний, допустим 1000.
И уже среднее и дисперсию считать по этой серии, то есть среднее и дисперсию по максимуму.

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

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

В любом случае спасибо, статья натолкнула на интересные мысли.