Итак, в ходе моего эксперемента, как это часто бывает, я отошел немного в сторону и погрузился в рассмотрение работы TFX pipeline. Что на самом деле довольно не плохо, так как теперь понимаю как он работает.
Однако TFX, как и большинство опен сорс софта, имеет свои проблемы:
- Как я писал в предыдущем посте, компоненты работают в основном только с тренировочным и оценочным (train, eval) наборами данных
- Версия TFX 0.15 работает только с estimator API — однако говорят что в версии 0.21 ввели поддержку keras моделей без конвертирования ее в estimator, к сожалению не удалось это опробовать, так как в этой версии они сломали interactive context. Конечно, можно было бы и без него, просто все компоненты загнать в пайплайн, но хотелось, что бы и в ноутбуке все работало.
- При использовании keras моделей, так и не разобрался как заставить работать TFMA в полную силу, а штука выглядит забавной. Если кто то в курсе, буду рад совету %).
В общем и целом можно смело использовать все эти технологии, но лучше без интерактивных компонентов. Загоняем все в apache beam и строим модельки, проверяем, лучшие используем :). Думаю простейший метод это простой конвейер с функцией трансформации данных и самой моделью. Остальное можно и проигнорировать для домашнего пользования.
Собственно вот видюшка, про все это
Буду рад, если найдете время на посмотреть.
Собственно, есть еще такой религиозный вопрос касательно данных. Как и где их обрабатывать.
- Скажем если есть у меня набор исторических даннах, я могу сформировать все входящие фичи еще на этапе подготовки данных, потом в блоке трансформации нормализовать их и изменить формат пригодный для наших моделей, далее обучаем модель.
- На этапе подготовки мы берем просто сырые данные и шлем их в наш конвейер, там генерируем фичи, может быть что то еще подтягиваем с базы данных и получается у нас совершенно новый набор входных фич.
Если в первом случае у нас набор/количество фич на входе будет равен набору на выходе из функции обработки, то во втором они могут быть совершенно разные. Что, кстати, и происходит в примере на видео, и отсюда вытекают проблемы с использованием кераса и модуля для анализа моделей.
И опять же, не ясно как лучше делать в реальной торговли, готовить фичи до того как их в модель загонять, или же подавать только последние поступившие данные, а там уже как в пункте 2 тянуть все со второстепенных источников.
Если кто пользует машинное обучение и нейронные сети, как решаете эту проблему?
зы. ссылка на код из видео
https://github.com/CloseToAlgoTrading/CodeFromVideo/tree/master/episode_10
Я на PyTorch пишу, поэтому ваши проблемы возможно не до конца понимаю, но в общем это зависит от ситуации.
Если фичи тяжело считать на лету, то возможно их целесообразно предвычислять. У меня в принципе была такая ситуация, что расчет фичей на лету занимал 95% времени, собственно операции с графом 5%. С каждой эпохой обучения выгода от предвычисления растет.
Обратная сторона — фичи могут занимать в разы больше, чем исходные данные. Допустим у вас ряд котировок 1 млн значений, а вы на вход подаете в качестве фич слайс из 252 подряд идущих значений. Фичи у вас будут занимать 252 раза больше места, чем исходные данные для их построения. Наверное тут целесообразно вычислять на лету.
В общем надо профайлить — я в итоге решил считать на лету, но переписал все для максимального ускорения. Раньше расчет фичей делал в Pandas и Numpy, а переписал все прямо в PyTorch с отключенным расчетом градиентов. В результате расчет фич стал в ~100 раз быстрее идти.
Конкретно в тфх меня смущает что в их эталонном пайплайне они создают метамодель описывающие входные сырые данный и делают некоторый статистический анализ именно сырыз данных, а потом вроде как предлагают их трансформировать, но! трансформировать то можно поразному.
И вот дальше в этом же подходе, предлагается проанализировать модель, исходят из того, что ты будешь рассматривать сырые фичи. В общем :) тут я немного мне кажется не допонял идеи.
А так то да, в идеале что торч что тенсорфлоу предлагают функциональность на лету все клепать, и это мне кажется правильный подход.
А вы когда модель используете, данные сырые которые 252 подряд идущих, из файла, базы данных тащите или просто собираете их и как набралось нужное количество шлете в модель?
я имею ввиду не обучение, а уже когда используете в продакшене :)
Denis,
Вряд ли вы будете менять это каждый день, особенно в продакшене. Решите поменять — посчитаете один раз ночью, а потом каждый день инкрементально будете досчитывать. На самом деле отдача есть, если вы тренируете больше одной эпохи, а это всегда так. Вопрос большая она или нет — зависит от данных и сложности фич.
Я вам еще в прошлый раз писал, что вы по моему, чем-то не тем занимаетесь — у вас скорее исследовательская задача, которую можно и нужно делать без фреймворков, которые под продакшен придуманы. И как выясняется эта система еще и сырая, чего-то там не поддерживает. Рисеч все делают даже не в py файлах, а ноутбуках — так получите хотя бы в ноутбуке чего-то минимально работающее, а потом думайте, как его в продавшей раскатать.
И как правильно вы поймете только после первого результат — как часто вам нужно будет переучивать модель? Может вы ее обучите один раз и будете месяцами использовать, а может нужно доучивать практически на лету? Сколько будет данных, будут ли они лезть в память? Насколько сложно считать фичи? Как вы будете исполнять — может вам для быстрой торговли нужно будет на C все переписать, а не REST север разворачивать на Python, как вы где-то писали.
У меня стратегия инвестиционная, поэтому мне не нужен какой-то суровый продакшен. В моем случае это выглядит так:
Раз в день в 19.45 на MOEX обновляются данные ISS. Я запускаю скрипт, он докачивает все обновления данных в MongoDB. Далее все необходимые данные берутся из базы (в моем случае они легко влезают в память и это не только котировки из ISS). С нуля учится модель, а фичи генерятся на лету иногда с lru_cache. Делается предсказание на следующий день по примерно 100 инструментам. К предсказаниям применяется, условно назовём, портфельная теория. Далее выдается рекомендация, какой инструмент в моем портфеле нужно продать, а какой купить, или рекомендация ничего не трогать. Все от начала скачки до рекомендации занимает около 5 минут.
Где-то раз в месяц я запускаю процедуру байсовской оптимизации гиперпараметров модели — она занимает около суток.
Торгую я ручками по этим рекомендациям, благо сделок немного и далеко не каждый день.
Все исследования по старинке в питоновском ноутбуке делаю.
Ну тут проблем как раз таки с тенсорфлоу еще нет :), он отлично коннектится через gRPC.
А потом будет ясно этот скрипт, как у меня, REST сервер, gRPC или монолитное высокооптимизированное приложение на колокейшене, а модель вы будете например офлайн тренировать, а потом ночью грузить на сервер колокейшен, чтобы использовать на следующий день. А то и вообще ничего путного не получится, что тоже бывает.
Мне вот например пришлось написать некий генератор описания параметров модели, используемых признаков и их параметров, а также процедуру сборки и обучения модели по этому описанию, чтобы подбор оптимальной модели производить, хотя когда я начинал, вряд ли я об этом думал. И вряд ли есть такое готовое решение.
я думаю, что все же от данных надо отталкиваться, а потом уж модель, ну это другой вопрос уж.
Так ведь все эти модные технологии, я про тфх, как раз таки и направленны на автоматизирование этих действий, а значит и экономии времени на исследования. Хочется в это верить :)
А по-поводу сетей и данных: вся история NN — это поиск все более совершенных архитектур для тех же данных. Картинки или текст давно существуют и ничего нового с ними не делают, но постепенно изобретают RezNet или BERT. У вас тоже вряд ли будут какие-то необычные данные. Скорее всего дальше котировок вы никуда не уйдете, а если уйдете, то это будет отдельное непростое приключение по поиску и сбору данных. Поэтому основной ваш инструмент — это правильно подобрать архитектуру.
Боюсь что все в это и выплывет, хотя мне такой подход не нравится, это такой каггл подход, берем какие-то данные и начинаем искать архитектуру, а вдруг повезет. То же кстати с анализом фич происходит, сеть что то выдает хорошее значит и фичи хороши.
Я люблю исходить все же от понимания данных. Хотя именно в этом эксперементе который пытаюсь реализовать, все идет в обратную сторону ).
И в кагле реальные чемпионы не пробуют все подряд, они знают, что обычно заходит, как тюнить модели под конкретные задачи, хотя для не знающего это кажется беспорядочным перебором.