Обсуждение статьи "Глубокие нейросети (Часть V). Байесовская оптимизация гиперпараметров DNN" - страница 2
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Добрый день.
Давайте уточним. Набор данных Х состоит из 4 поднаборов preptrain = 4001, train = 1000, test = 500 и test1= 100 баров. Для претренинга используются обучающий набор - pretrain, валидационный - train.
Для тонкой настройки в качестве обучающего используется набор train , а валидационного - первые 250 баров набора test .
Поэтому для определения окончательного качества в качестве тестового набора используем последние 250 баров набора test. code
Не вижу противоречий. Согласны?
Удачи
Технически все сделано хорошо, не об этом вопрос.
Мне кажется маловато 250 бар для оценки модели, потому и интересовался, почему только по этому участку отбор делаете.
Да, это работает в конкретном случае (у вас на всех участках получилась хорошие результаты), но мне кажется это не универсально.
Ведь могли попасться данные, которые не так хороши. И модель например могла обучаться до 40% ошибки на обучающем участке, и чисто случайно показать 30% на тестовом. А вторая модель допустим, обучилась до 35% на обоих участках. Вторая очевидно лучше. Но выбор только по тестовому участку выберет первую. Для сравнения есть такие варианты оценки модели:
оценка только на обучающем участке,
или на сумме всех участков,
или как в Darch, (при поданных валидационных данных) на Err = (ErrLeran * 0.37 + ErrValid * 0.63) - эти коэффициенты по умолчанию, но их можно менять.
Последний вариант самый интересный, т.к. учитывает обе ошибки, но с большим весом валидационного участка.
В принципе можно формулу расширить, например до Err = (ErrLeran * 0.25 + ErrValid * 0.35 + ErrTest * 0.4).
Может даже по дельтам ошибок надо делать отбор, например если ErrLeran и ErrTest отличаются более чем на 5% - то отбраковать такую модель. А из оставшихся уже делать выбор.
Поставил эксперимент.
Вот некоторые результаты из 30 обучений: (модель не та, что изначально, на ней все отлично, поэтому убрал претренинг чтобы были и плохие результаты)
Расшифровка: V1 = 1-ErrLearn; V2= 1-ErrOOC; Value = 1 - (ErrLeran * 0.37 + ErrOOC * 0.63); в ООС cклеил данные из Valid и Test.
Value V1 V2
0.5712 0.4988 0.6138 - ООС хорош, но случаен, т.к. Learn = 50%
0.5002 0.5047 0.4975 - так чаще получалось
0.6719 0.6911 0.6606 - и вот так пару раз. Сортировка по Value = 1 - (ErrLeran * 0.37 + ErrOOC * 0.63) вытягивает такие модели вверх
Конечно, он запостил уже очень много R кода, но хотелось бы увидеть и адекватные результаты, а главное понять, сколько ещё он напишет таких статей, пока появится хоть один, нормальный советник.
В одной из статей был советник, я его за пару дней переписал под новую версию Darch - технически все прекрасно взаимодействует. Советник то простенький - считать OHLC и закинуть в R и запустить ф-ю расчетов в R. В конце получив команды от НС, послать торговые команды на сервер. Все. Остальное - трейлинги, стопы, ММ - на свой вкус.
Самое сложное как раз то, что описывается в статьях - найти хорошие данные, и правильно обучить на них НС. Владимир показывает всевозможные варианты моделей, ансамблей, оптимизаций, отбора и обработки предикторов..., не успеваю за ним угнаться))
Как думаете,
может стоит из перебора гиперпараметров исключить варианты c числом нейронов в слоях, где n2 > n1 ?
Например сеть 10 - 20 - 100 - 2 или 10 - 8 - 100 - 2
Если n2 > n1, то получится сжатие до n1, потом декомпрессия до n2 и потом снова сжатие до 1 или 2 нейронов выходного слоя. Если в конце все-равно имеем 2 нейрона, то в середине декомпрессия не должна дать никаких перимуществ, после сжатия данных на n1 слое. Но это будет съедать кучу времени на просчет заведомо худших вариантов.
Обновление:Думаю это можно сделать в фитнес функции таким образом: n1 перебирать, как число нейронов, а n2, как % от n1, потом округлить и *2 для maxout
себе сделал, надеюсь вычислительные мощности будут тратиться более эффективно.
Как думаете,
может стоит из перебора гиперпараметров исключить варианты c числом нейронов в слоях, где n2 > n1 ?
Например сеть 10 - 20 - 100 - 2 или 10 - 8 - 100 - 2
Если n2 > n1, то получится сжатие до n1, потом декомпрессия до n2 и потом снова сжатие до 1 или 2 нейронов выходного слоя. Если в конце все-равно имеем 2 нейрона, то в середине декомпрессия не должна дать никаких перимуществ, после сжатия данных на n1 слое. Но это будет съедать кучу времени на просчет заведомо худших вариантов.
Думаю это можно сделать в фитнес функции таким образом: n1 перебирать, как число нейронов, а n2, как % от n1, потом округлить и *2 для maxout
Приветствую.
Из моих длительных экспериментов с параметрами только несколько особенностей заметил:
- часто лучшие результаты с fact = 2
- или когда оба скрытых слоя имеют одинаковую функцию активации
Я не ограничивал соотношение нейронов в скрытых слоях. Не оптимальные соотношения очень быстро выбывают из рассмотрения. Но Вы можете проверить эту идею. Я может найду время и проверю оптимизацию с помощью rgenoud.
Удачи
Я не ограничивал соотношение нейронов в скрытых слоях. Не оптимальные соотношения очень быстро выбывают из рассмотрения. Но Вы можете проверить эту идею. Я может найду время и проверю оптимизацию с помощью rgenoud.
Я сделал, чтобы следующий слой считался в % от предыдущего. Но сравнивать особо нет желания. Чисто теоретически надеюсь, что прав, что декомпрессия внутри сети новой информации ей не даст, после сжатия на предыдущих слоях.
Генетику на GA:ga попробовал. Он 200-300 раз запустил НС на расчеты. Многовато. И по результатам улучшений нет.
Хотя и для бейесовской оптимизации предполагаю, что надо больше проходов, не 20-30, а может и до 100. Т.к. часто бывает, что лучшим результатом остается один из 10 рандомных стартовых вариантов, и за следующие 10-20 проходов оптимизатором - ничего лучшего не находится. Может за 100 проходов будут улучшения...
- часто лучшие результаты с fact = 2
- или когда оба скрытых слоя имеют одинаковую функцию активации
Тут у меня все по разному. Relu часто хорош.
Я сделал, чтобы следующий слой считался в % от предыдущего. Но сравнивать особо нет желания. Чисто теоретически надеюсь, что прав, что декомпрессия внутри сети новой информации ей не даст, после сжатия на предыдущих слоях.
Генетику на GA:ga попробовал. Он 200-300 раз запустил НС на расчеты. Многовато. И по результатам улучшений нет.
Хотя и для бейесовской оптимизации предполагаю, что надо больше проходов, не 20-30, а может и до 100. Т.к. часто бывает, что лучшим результатом остается один из 10 рандомных стартовых вариантов, и за следующие 10-20 проходов оптимизатором - ничего лучшего не находится. Может за 100 проходов будут улучшения...
Тут у меня все по разному. Relu часто хорош.
Генетика не нашла лучших вариантов и у меня.
Для байесовской нужно поиграть не только с количеством проходов но и с количеством точек. Нужно искать более быстрый вариант. С этим очень утомительно.
Удачи
ПС. Вы что не переходите на TensorFlow? Это просто более высокий уровень.
Для байесовской нужно поиграть не только с количеством проходов но и с количеством точек. Нужно искать более быстрый вариант. С этим очень утомительно
Для ускорения добавьте в параметры при вызове BayesianOptimization
maxit = 1 #1 вместо 100 - число повторов для GP_fit для предсказания гиперплоскости
Не заметил улучшений при 100 повторах в сравнении с 1, поэтому теперь использую 1.
Т.е.
maxit=1 через ... пердастся в GPfit::GP_fit и оптимизация будет 1 раз запускаться вместо 100.
Еще можно передать:
control = c(20*d, 10*d, 2*d);#по умолчанию - control = c(200*d, 80*d, 2*d) - из 200*d выбрать 80*d лучших и построить 2*d кластеров - где d - число оптимизируемых параметров
Описание этих параметров тут https://github.com/cran/GPfit/blob/master/R/GP_fit.R
ПС. Вы что не переходите на TensorFlow? Это просто более высокий уровень.
Хотя Darch плохо поддерживается, кое что они поправили и доработали, но в январе его из CRAN в архив отправили за неисправление ошибок (там была одна с оценкой ошибки в режиме обучения с валидацией). В мае выпустили 13 версию, но потом откатили к 12-й. Сейчас вот опять 13-я появилась - видимо доделали.
Для ускорения добавьте в параметры при вызове BayesianOptimization
maxit = 1 #1 вместо 100 - число повторов для GP_fit для предсказания гиперплоскости
maxit=1 через ... пердастся в GPfit::GP_fit и оптимизация будет 1 раз запускаться вместо 100.Не заметил улучшений при 100 повторах в сравнении с 1, поэтому использую 1.
Т.е.
Еще можно передать:
control = c(20*d, 10*d, 2*d);#по умолчанию - control = c(200*d, 80*d, 2*d) - из 200*d выбрать 80*d лучших и построить 2*d кластеров - где d - число оптимизируемых параметров
Да вроде и с Darch 30% при обучении и 36% на тесте получается. Доделаю советник, запущу в работу, а потом может займусь.
Хотя Darch плохо поддерживается, кое что они поправили и доработали, но в январе его из CRAN в архив отправили за неисправление ошибок (там была одна с оценкой ошибки в режиме обучения с валидацией). В мае выпустили 13 версию, но потом откатили к 12-й. Сейчас вот опять 13-я появилась - видимо доделали.
Спасибо за информацию. Попробую с Вашими параметрами.
Я давно к ним не заходил на Github. Нужно будет предложение написать. В пакете darch предусмотрено использование GPU но пакет который они используют для этого из CRAN удалили (для 3.4.4). А было бы интересно как повлияет GPU на скорость и качество.
Удачи
Еще один тормоз тут
https://github.com/yanyachen/rBayesianOptimization/blob/master/R/Utility_Max.R
Тоже ставлю maxit = 1 вместо 100.
Через ... передать нельзя, можно просто свою Utility_Max функцию в R загрузить и пользоваться исправленной версией.
Еще один тормоз тут
https://github.com/yanyachen/rBayesianOptimization/blob/master/R/Utility_Max.R
Тоже ставлю maxit = 1 вместо 100.
Через ... передать нельзя, можно просто свою Utility_Max функцию в R загрузить и пользоваться исправленной версией.
Проверил на оптимизации ансамбля нейросетей из статьи PartVI. Ни maxit, ни control не оказывают видимого влияния на время вычисления. Наибольшее влияние оказывает количество нейронов в скрытом слое. Оставил так
Лучших 10
Value - средний F1. Неплохие показатели.
Для ускорения вычислений нужно переписать некоторые функции пакета. Самое первое - заменить все ncol(), nrow() которых там море на dim()[1], dim()[2]. Они исполняются в десятки раз быстрее. Ну и наверное, поскольку там только матричные операции, использовать GPU (пакет gpuR ). Сам я это сделать не смогу, может предложить разработчику?
Удачи