Блог им. WLMike
Наконец дошли руки сделать работающий прототип на нейронных сетях — сразу же получился результат близкий к текущей используемой модели на основе градиентного бустинга. Учитывая, что в нейронные сети подавалась только часть информации по сравнению с той, которая используется для построения признаков для градиентного бустинга, и пара простых архитектур без всякой оптимизации, то есть все шансы в перспективе обойти градиентный бустинг. Из минусов — сетки обучаются в разы медленнее бустинга, но для моей инвестиционной стратегии это не принципиально.
Сходил недавно на семинар по эволюционному поиску нейросетевых архитектур — очень проникся темой. Пока останусь на градиентном бустинге, но буду двигаться в сторону сетей и эволюционного поиска их архитектур. В какой-то момент столкну бустинг и сети в эволюционном процессе, а там посмотрим, кто победит.
Dmitryy, вы вряд ли в своем примере сможете придумать схему предсказания, которая будет иметь корреляцию с исходом статистически значимо отличающуюся от нуля. С другой, стороны если вы научились прогнозировать с коэффициентом корреляции R таким, что R * (n — 2)^0.5 / (1 — R^2)^0.5 > 2 (для моего количества проверочных примеров R > 0.017), то есть значительный шанс, что ваше предсказание отлично от случайного и на его базе можно построить работающую торговую модель. В большинстве случаев, корреляцию можно транслировать в оценку прибыльности стратегии.
Что далеко ходить, может ли модель обыграть вчерашнюю новость с Лукойлом и индексом? http://www.finmarket.ru/news/5162517
Dmitryy, давайте подискутируем, но чтобы понять вашу точку зрения и быстрее прийти к взаимопониманию, напишите, в общих чертах на чем основывается ваш подход и как он справляется с указанной вами проблемой на примере Лукойла.
Мои соображения примерно следующие:
1. Критерием должны быть не сомнения из общих соображений, а формальные статистические тесты. Если некая “простая” модель, которая заведомо все не учитывает дает статистически значимы результат, ее можно использовать. Если хочется ее можно продолжать улучшать.
2. Более сложная (или другая) модель принимается не потому, что она сложная и учитывает какие-то дополнительные факторы, а потому что она дает статистически значимое улучшение по сравнению с более слабой моделью. Иногда выгоднее использовать ансамбль моделей — но выгодность этого решения так же должна проверяться статистическими тестами.
3. Я не против учета новостей, и в принципе сети это позволяют делать. Для меня это сложно, особенно на первых порах, так как сложно найти подходящие исторические данные. Может когда-то дойду до этого.
4. Принципиально не строю модель для конкретного инструмента, а строю единую модель по примерно 100 бумагам, некоторые из которых меняли долю в индексе, поэтому есть шанс, что модель в какой-то мере может учесть это.
5. Вряд ли можно создать идеальную модель, которое будет все точно предсказывать. Не совсем строго выражаясь, важно, чтобы модель ошибалась реже и меньше, чем угадывала, тогда ошибки (например, с Лукойлом) будут компенсировать правильными ставками под другим бумагам. Формально это надо подтверждать статистическими тестами.
6. Чтобы нивелировать эффект ошибок и сделать свой результат более устойчивым, нужно делать много ставок параллельно (я анализирую около 100 бумаг и одновременно делаю “ставки” по ним), учитывать структуру рисков и грамотно диверсифицировать их (использую робастные методы оценки ковариационных матриц для портфелей с большим количеством инструментов).
7. Для того, чтобы совершать меньше сделок, дополнительно используется статистическая значимость улучшений в структуре портфеля — если некая операция улучшает портфель, но не статистически значимо, то она не совершается.
Что касается моего подхода, это торговля волатильностью. Мы с большой долей вероятности можем определить движение волатильности, когда она сильно выше своего среднего значения. А учитывая волатильность волатильности можно делать более или менее приближенные прогнозы по ее поведению. ЗЫ, но я только учусь.
akuloff, сверточные сети вполне нормально учитывают время, если в конце вы не делаете глобальный пулинг. Дополнительно можно усилить понятие времени с помощью добавления к каналам с основными фичам каналов с эмбедингом, который задает временную позицию данных по аналогии с Bert.
WaveNet — пример сверточной сети, которая работает с временным рядом (звуком). Я использовал нечто похожее, но без Gated Units и прочих наворотов.
Минус LSTM в том, что он плохо параллелится, поэтому его вытесняют архитектуры, которые не страдают этим недостатком.
Про сверточные в приложении к временным рядам WaveNet: A Generative Model for Raw Audio. А дальше гуляете по ссылкам внутри статей и экспериментируете сами.
Дополнительно можно порыться в исходниках Gluon — там есть ссылки на статьи
Примеров до 100 — простые статистические методы
Примеров от 100 до 1000 — простые методы машинного обучения (KNN, SVM, регрессии с L1/L2 регуляризацией)
Примеров от 1000 до 10000 — мощные методы машинного обучения (GBM, RF)
Примеров более 10000 — можно попробовать сети, но вероятно GBM будет лучше
Примеров очень много — рано или поздно сети лучше GBM
У вас примеров явно мало для сетей
SergeyJu, вы правы относительно меток — они сильно коррелированы, поэтому важно, чтобы метки в обучающем сете и в валидационном совсем не пересекались. Но вектора признаков практически независимы. Корреляция в векторе дивидендов нулевая, корреляция в векторе котировок если есть, то буквально в паре соседних по времени обучающих примерах. Таким образом мы учим по независимым признакам зависимые метки.
Наверное, некое “эффективное” количество семплов меньше того, которое получается прямым подсчетом, но больше, чем вы думаете. Это в принципе легко проверить — построить модель на непересекающихся семпла (их будет условно 1000) и на пересекающихся их будет в 250 раз больше. Я делал подобное сравнение — первая вариант совсем не работает, а второй делает статистически значимые прогнозы.
Ну и по сути, так как наши признаки практически независимы, но часто имеют сильно похожие метки, сеть вообщем-то понимает, что в признаках огромное количество шума. Если бы мы учили на непересекающихся данных, ей было бы гораздо сложнее это понять.
KNN — это обучение без учителя.
SVM — работает на линейной разделимости, а не на малых выборках.
Как вы получили своё правило...
Kot_Begemot,
GBN — это решающие деревья, а не сети. У них мало чего общего с сетями, и их обычно используют на табличных данных (в ручную сделанных фичах), а сети на сырых данных (кусок временного ряда, изображение, текст).
KNN-регрессия — обучение с учителем. Вы ведь находите ближайших соседей и берете среднее их меток для предсказания. Раз метки есть, то это обучение с учителем.
SVM — работает с линейноразделимыми поверхностями в спремляющем пространстве. Если вы используете, kernel trick (обычно rbf ядро), то можете вполне нелинейные прогнозы получать с помощью SVM. sklearn это все поддерживает из коробки. SVM может работать и с большим количеством данных, но он обычно уступает GBM, когда данных достаточно много, поэтому смысла в его использование на относительно больших данных обычно мало.
Это уже «напилинг» -
Обычно перед применением нейронных сетей данные предобрабатывают. Это ядерные свёртки изображений, обработка по градиентам яркости и пр., пр. пр. в голом виде нейронные сети не применяют… обычно. Если, конечно, задача не ставится вытащить заранее известный в подробностях сигнал из под шума.
Предобработка данных перед использованием в свёрточной NN.
Разница между GBM и NN в процессе обучения и, соответственно, в размере области градиентного пересмотра параметров.
В этом смысле, ваше решение отвязаться от «ручного» построения признаков (фич), остаётся для меня не ясным.
У вас очень странная интерпретация нейронных сетей — сверхточный слой, это не предобработка, а один из стандартных слоев сетей. Параметры сверток обучаются как и все остальные слои с помощью back propagation. Свертки бывают и в начале, и в конце, и в середине. Часто это практически основной содержательный слой в сети (можно глянуть RezNet или WaveNet — там сплошные свертки от начала и до конца — это что не сети что ли, а только предобработка?). Одна из моделей, которую я использовал, состояла из 7 сверхточных слоев и одного глобального пулинга. Так как в пулинге совсем нет обучаемых параметров, то по сути вся сеть из сверток. Для таких архитектур даже термин есть fully convolutional network.
Я бы сказал, что там все разное.
NN — это дифференцируемая функция, производные которой много где отличны от нуля. При обучении дифференцируется Loss по параметрам сети. На каждой итерации обновляются существующие параметры с учетом производной Loss по ним.
Ансамбль деревьев — это функция с кучей разрывов, а там где разрывов нет, там производная равна нулю (кусочно постоянная функция). Loss диференцируется не по параметрам построенных деревьев, а по значениям функции. Полученные производные (с минусом) приближают новым деревом, дерево добавляется в ансамбль, а ранее сформированные деревья и их параметры не меняются.
PS: Мне кажется, мы уже удалились куда-то не в конструктивное русло, из-за различий в терминологической базе.
В качестве прогнозируемой переменной только будущие изменения цен?
В этом смысле, я ещё могу понять замену одних алгоритмов на другие — тонкие эффекты могут играть роль. А вот на счёт требований к «сырости»… как-то сомнительно, чтобы NN обладали меньшими требованиями, чем GBM.
В любом случае, интересно было бы увидеть оценку ваших результатов на этом поприще.
Kot_Begemot, дискретность GMB, когда у вас 10000 деревьев глубиной 10 (практический кейс моей модели — будет примерно 10 млн дискретных значений на области определения), с практической точки зрения можно считать непрерывной. Хотя кончено, это совсем разные методы, поэтому прямое их сопоставление не совсем корректно проводить. На мой взгляд ключевое отличие в табличности GBM и возможности NN делать фичи из сырых данных.
Что лучше использовать зависит от ситуации — NN более требовательны к количеству данных и железу. Если вы умеет и любите придумывать, какие-то интересные фичи, а не очередные вариации на тему скользящих средних, моментумов, дивидендных доходностей и т.д. И ограничены по железу, то наверное не стоит лезть в сети.
Если вы не ограничены по железу и считаете, что вряд ли выдумаете что-то уникальное и содержательное, можно копнуть в сторону сетей, в надежде, что они придумают фичи за вас. В любом случае, нужно тестировать понятными стат тестами, что лучше.
Пока NN у меня вышло хуже GBM, но GBN я точу давно, а по NN сделал первую попытку на самых простых архитектурах, без каких-то настроек параметров (выбрал минимальные из общего здравого смысла и предыдущего опыта из других областей), и на ограниченных данных. Результат хуже, но не разительно — есть потенциал.
Вот из-за этого и все вопросы. Зачем чесать правой ногой правое ухо, если удобнее левой?
ммм… можете привести пример, в котором NN построит фичу из сырых данных, да такую, что на это не способно дерево решений или бустинг?
Я вижу разницу только в непрерывности — если NN умеет складывать числа, то GBM — нет, он только сравнивает числа в логическом масштабе (Булевы операции). Поэтому и пишу про… «нелинейность» NN.
Про что-то подобное для деревьев я не знаю, так же я не знаю примеров применения GMB для анализа изображений, звука, текстов и любых других сырых сигналов. Если вы дадите мне ссылки на подобные примеры буду рад почитать.
Булевых функции достаточно для реализации сложения, чем компьютер по сути внутри занимается.
Если бы я занимался распознаванием текста/речи/видео, то мог бы ответить вам профессионально и в цифрах. Но мне известно об этих и подобных задачах лишь постольку, поскольку.
В принципе, если опустить дифференцируемую пороговую функцию активации, то NN от дерева отличается только тем, что NN способна создавать свёртку из входящих переменных x и y с некоторыми весами w (это делает любой слой NN).
То есть, другими словами, помимо X>a производить операцию X+Y>a, и линейно разделять данные. Бустинг, в случае обнаружения линейных зависимостей, нарисует вам ту же линию ступеньками и к классифицирующему нейрону дайет та же информация, что и в случае NN, но, разве что нарезанная «кусками».
Это касается «обычных» нейронных сетей также как и «свёрточных», здесь никакого разделение не нужно.
Вот, например, в задачах распознавания лиц
habr.com/ru/post/133826/
Но даже если что и придумали, то какое это имеет отношение к делу? Если NN даже теоретически не способна придумывать «фичи» отличные от обычных линейных алгоритмов?
Я же не зря попросил у вас пример любой простой задачи, с которой может справиться NN и не может, например, RF (или справляется значительно хуже).
Про простую задачу вы в первый раз сейчас спрашиваете — специально поиском поискал. На простых задачах у NN обычно нет преимуществ по сравнению с моделями на основе решающих деревьев. И есть много простых задач, которые сети решить могут (классический пример, один класс круг на плоскости, а другой класс все остальное, или XOR), а линейный классификатор нет.
эта теорема по любой сложный классификатор, состоящий из множества простых классификторов, работающих в единой композиции, например, нейронной сети.
При этом, заметьте, никакой дополнительной свёртки между классификаторами ансамбля теорема не предусматривает (один скрытый слой), оставляя выход композиции линейным по классификаторам (нейронам).
Если вопрос, почему делают много слоев? С начало было экспериментально установлено в множестве прикладных задач, что это дает более качественный результат, а потом было доказано, что это экспоненциально снижает количество необходимых нейронов.
Чтобы распространить действие теоремы на другие архитектуры необходимо доказать, что простейший (элементарный) классификатор композиции способен решать задачи линейной разделимости, то есть представим в виде:
Fi ( w'*x +b), где Fi — пороговая функция
тогда композиция из этих классификаторов будет обладать всеми свойствами рассматриваемой сети.
Дерево решений, например, умеет решать задачу линейной разделимости?
В итоге получается, что NN на сырых данных не даст вам никакого преимущества по сравнению с XGBoost или др. используемыми алгоритмами.
Сети полностью вытесни бустинги из анализа неструктурированных данных (текст, видио, звук, картинки), а бустинги остаются основным алгоритмом при анализе табличных данных.
Может чего-нибудь поменяется со временем, но последние лет пять (как были изобретены некоторые подходы, которые позволили тренировать глубокие сети) состояние дел именно такое.
И что ещё за «глубокие сети», предполагающие какие-то особые методы тренировки?
Kot_Begemot, основное отличие, что в случае картинок, звука и т.д. у нас обычно очень много одинаковых элементов (картинка, 500 на 500 это 250000, элементов, секунда звука, 44000), в табличных данных элементы разные (пол, возраст, вес, последнее место работы, образование и т.д.) и их обычно гораздо меньше (десятки или сотни). Никаких теоретических причин, почему сети хорошо работают на данных первого типа, и обычно проигрывают на вторых, я не знаю, но практика показывает, что это так.
Нет строгого определения глубоких сетей — в академическом контексте, обычно сети, в которых слоев больше, чем нужно по теореме, а в практическом — достаточно много, чтобы возникала проблема затухания или взрыва градиентов.
Основная проблема тренировки, что производные параметров слоев близких к входу представляют собой произведение производных промежуточных слоев. Если эти производные отличный от 1 по модулю, то произведение имеет тенденцию или расти сильно по модулю, или стремится к нулю по модулю. Соответственно в первом случае при обновлении параметры скачут в беспорядочном порядке, а во втором слишком слабо меняются и сеть не учится. Обычно раньше наблюдалось именно вторая ситуация, так как широко использовались сигмойдные функции активации, а у них производная за исключением узкого диапазона близка к нулю.
Было предложено много приемов решения этих проблем:
ReLu активация вместо сигмойдной — производная 1 на половине области определения
Правильная инициализация параметров — раньше инициализировались случайно, теперь инициализируют особым образом, который в некотором смысли гарантирует сохранение дисперсии сигнала при прохождении слоев, что в статистическом смысли гарантирует, что градиенты не будут затухать или взрываться
Batch normalization — особый слой, который стабилизирует градиенты
Skip connections — способ пробросить градиент в глубокие слои напрямую без множественных промежуточных умножений.
Все это позволило тренировать сети в качестве эксперимента глубиной в несколько тысяч слоев, но реально на практике слоев обычно 50-150
1. Неслучайные веса или даже ненастраиваемую предобработку
2. Регуляризацию плавности
3. и т.д.
Для «неструктурированных данных», не обладающих априорной структурой никакая априорная регуляризация по структуре или априорное задание дерева (веса нейронной сети) — невозможны.
Наверное так)
И поскольку рынок скорее обладает структурой, нежели — нет, то нейронные сети к нему должны быть теоретически применимы лучше чем Boosting, в этом смысле я вас поддерживаю и желаю вам всяческих успехов.