Обсуждение статьи "Нейросети — это просто (Часть 50): Soft Actor-Critic (оптимизация модели)" - страница 2

 
Viktor Kudriavtsev #:

И тд. Я привольно понимаю? Меня смущает, то что тест часто даёт очень большие отрицательные проходы с -7000 или даже -9000. И их будет очень много в базе. Не обучится ли сеть специально торговать в минус?

Давайте привольно без излишнего углубления в математику, так сказать на пальцах, посмотрим на процесс обучения. В классическом обучении с подкреплением оценка каждого действия осуществляется средой, когда она нам дает вознаграждение. Это вознаграждение мы даем модели в качестве целевого результата. Таким образом мы обучаем модель не выбирать действие, а прогнозировать ожидаемую награду за действие (Q-функция) и потом уже из прогнозируемых наград мы выбираем максимальную для выполнения действий. Сразу скажу, что вариант ничего не делать если все действия убыточные не проходит, так как "ничего не делать" мы оцениваем как отдельное действие и у него тоже есть свой уровень вознаграждения.

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

Далее мы обучаем Актера. Берем отдельное состояние и подаем на вход Актера. Актер генерирует некое действие. Мы передаем это действие и исходное состояние окружающей среды и он оценивает действие Актера. Затем мы говорим Критику, что нам нужно улучшить результат (указываем целевой результат выше полученного). В ответ Критик говорит Актеру как нужно изменить его действия (передает градиент ошибки).

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

Теперь, что касается непосредственно работы и обучения Актера. На начальном этапе мы инициализируем модель случайными параметрами. И действие Актера такие же случайные. В процессе обучения Критик, к примеру, говорит нужно открыть позицию на 1 лот. Но мы обучаем модель с малой скоростью обучения. И на следующей итерации Актер открывает позицию на 0.01 лота. Очевидно, что для достижения желаемого результата нам необходимо совершить 100 таких итераций обучения.

Казалось бы, зачем тупо биться головой об стенку. Давайте увеличим коэффициент обучения до 1 сразу будем запоминать полученный опыт. Но ведь есть и другая сторона медали. В таком случае модель будет сразу забывать весь накопленный опыт и не о каком обобщении не может идти и речи.

Поэтому, пока не предложили ничего альтернативного мы продолжаем биться головой об стенку, пока не усвоим простою истину. И весь процесс обучения модели является направленный подбор параметров методом проб и ошибок.

 
Dmitriy Gizlyk #:

Давайте привольно без излишнего углубления в математику, так сказать на пальцах, посмотрим на процесс обучения. В классическом обучении с подкреплением оценка каждого действия осуществляется средой, когда она нам дает вознаграждение. Это вознаграждение мы даем модели в качестве целевого результата. Таким образом мы обучаем модель не выбирать действие, а прогнозировать ожидаемую награду за действие (Q-функция) и потом уже из прогнозируемых наград мы выбираем максимальную для выполнения действий. Сразу скажу, что вариант ничего не делать если все действия убыточные не проходит, так как "ничего не делать" мы оцениваем как отдельное действие и у него тоже есть свой уровень вознаграждения.

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

Далее мы обучаем Актера. Берем отдельное состояние и подаем на вход Актера. Актер генерирует некое действие. Мы передаем это действие и исходное состояние окружающей среды и он оценивает действие Актера. Затем мы говорим Критику, что нам нужно улучшить результат (указываем целевой результат выше полученного). В ответ Критик говорит Актеру как нужно изменить его действия (передает градиент ошибки).

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

Теперь, что касается непосредственно работы и обучения Актера. На начальном этапе мы инициализируем модель случайными параметрами. И действие Актера такие же случайные. В процессе обучения Критик, к примеру, говорит нужно открыть позицию на 1 лот. Но мы обучаем модель с малой скоростью обучения. И на следующей итерации Актер открывает позицию на 0.01 лота. Очевидно, что для достижения желаемого результата нам необходимо совершить 100 таких итераций обучения.

Казалось бы, зачем тупо биться головой об стенку. Давайте увеличим коэффициент обучения до 1 сразу будем запоминать полученный опыт. Но ведь есть и другая сторона медали. В таком случае модель будет сразу забывать весь накопленный опыт и не о каком обобщении не может идти и речи.

Поэтому, пока не предложили ничего альтернативного мы продолжаем биться головой об стенку, пока не усвоим простою истину. И весь процесс обучения модели является направленный подбор параметров методом проб и ошибок.

Понятно. Большое спасибо за такое понятное объяснение.

Тогда возникает вопрос - а зачем обучать модель по 100 000 итераций и иметь базу в 200 траекторий и повторять постоянно процесс сбора новых примеров? Почему нельзя советнику создать базу к примеру в 1000 траекторий и в обучение поставить 10 000 000 итераций и пусть он учиться там ночь, день, неделю. Зачем нужно постоянно пополнять базу и учить небольшим число итераций?

 
Viktor Kudriavtsev #:

Понятно. Большое спасибо за такое понятное объяснение.

Тогда возникает вопрос - а зачем обучать модель по 100 000 итераций и иметь базу в 200 траекторий и повторять постоянно процесс сбора новых примеров? Почему нельзя советнику создать базу к примеру в 1000 траекторий и в обучение поставить 10 000 000 итераций и пусть он учиться там ночь, день, неделю. Зачем нужно постоянно пополнять базу и учить небольшим число итераций?

Теоретически можно, но все упирается в ресурсы. К примеру мы говорим о размере ТП в 1000 пунктов. В концепции непрерывного пространства действий это 1000 вариантов. Даже если мы возьмем с шагом 10, то 100 вариантов. Пусть столько же СЛ или даже половина (50 вариантов). Накиньте хотя бы 5 вариантов объема сделки и получаем 100 * 50 * 5 = 25000 вариантов. Умножаем на 2 (buy / sell) - 50 000 вариантов для одной свечи. Умножьте на длину траектории и получите число траекторий для полного покрытия всего возможного пространства.

При пошаговом обучении мы семплируем траектории в ближайшем окружении текущих действий Актера. Тем самым сильно сужаем область изучения. И изучаем не все возможные варианты, а только малую область с поиском вариантов улучшить текущую стратегию. После небольшого "тюнинга" текущей стратегии мы собираем новые данные в той области, куда нас привели эти улучшения и определяем дальнейший вектор движения.

Это может может напомнить поиск пути выхода в неизвестном лабиринте. Или путь туриста, который идет по улице и спрашивает у прохожих как пройти.

 
Dmitriy Gizlyk #:

Теоретически можно, но все упирается в ресурсы. К примеру мы говорим о размере ТП в 1000 пунктов. В концепции непрерывного пространства действий это 1000 вариантов. Даже если мы возьмем с шагом 10, то 100 вариантов. Пусть столько же СЛ или даже половина (50 вариантов). Накиньте хотя бы 5 вариантов объема сделки и получаем 100 * 50 * 5 = 25000 вариантов. Умножаем на 2 (buy / sell) - 50 000 вариантов для одной свечи. Умножьте на длину траектории и получите число траекторий для полного покрытия всего возможного пространства.

При пошаговом обучении мы семплируем траектории в ближайшем окружении текущих действий Актера. Тем самым сильно сужаем область изучения. И изучаем не все возможные варианты, а только малую область с поиском вариантов улучшить текущую стратегию. После небольшого "тюнинга" текущей стратегии мы собираем новые данные в той области, куда нас привели эти улучшения и определяем дальнейший вектор движения.

Это может может напомнить поиск пути выхода в неизвестном лабиринте. Или путь туриста, который идет по улице и спрашивает у прохожих как пройти.

Понятно. Спасибо.

Я вот сейчас заметил что когда делаешь сбор  Research.mqh то результаты формируются как-то группами с очень близким балансом конечным в группе. И вроде бы в Research.mqh как будто есть какой-то прогресс (положительные группы исходов стали появляться чаще что-ли). А вот с Test.mqh прогресса как будто нет совсем. Он даёт какой-то рандом и вообще чаще завершает проход минусом. Когда-то сначала идёт вверх а потом вниз, а когда-то сразу вниз и потом топчется на месте. Еще в конце походу объём входа наращивает. Иногда бывает торгует не в минус а просто в районе нуля. Ещё я заметил что он меняет количество сделок - за 5 месяцев он открывает когда-то 150 сделок, а ког-то 500 (примерно). Это всё нормально, что я наблюдаю?

 
Viktor Kudriavtsev #:

Понятно. Спасибо.

Я вот сейчас заметил что когда делаешь сбор  Research.mqh то результаты формируются как-то группами с очень близким балансом конечным в группе. И вроде бы в Research.mqh как будто есть какой-то прогресс (положительные группы исходов стали появляться чаще что-ли). А вот с Test.mqh прогресса как будто нет совсем. Он даёт какой-то рандом и вообще чаще завершает проход минусом. Когда-то сначала идёт вверх а потом вниз, а когда-то сразу вниз и потом топчется на месте. Еще в конце походу объём входа наращивает. Иногда бывает торгует не в минус а просто в районе нуля. Ещё я заметил что он меняет количество сделок - за 5 месяцев он открывает когда-то 150 сделок, а ког-то 500 (примерно). Это всё нормально, что я наблюдаю?

Рандомность - это результат стохастичности Актера. По мере обучения она будет становиться меньше. Может не исчезнуть полностью, но результаты будут близкие.

 
Дмитрий у меня теперь что-то изменилось с нейронкой - Она стала как-то странно открывать сделки (на одной свече откроет а на следующей закрывает) и почему-то не меняется баланс и эквити. На графике просто прямая линия рисуется. И изменение баланса по итогу проходов 0. Притом такое происходит и на советнике Test.mqh и на Research.mqh. И вся база теперь заполнилась такими проходами. Это нормально? Что делать - дальше учить или у меня появилась мысль снести базу и модели обученные перенести из папки в другую временно и создать новую базу со случайными моделями, а потом вернуть назад модели и продолжить их учить. Чтобы как то их избавить от прямой линии.
 
Viktor Kudriavtsev #:
Дмитрий у меня теперь что-то изменилось с нейронкой - Она стала как-то странно открывать сделки (на одной свече откроет а на следующей закрывает) и почему-то не меняется баланс и эквити. На графике просто прямая линия рисуется. И изменение баланса по итогу проходов 0. Притом такое происходит и на советнике Test.mqh и на Research.mqh. И вся база теперь заполнилась такими проходами. Это нормально? Что делать - дальше учить или у меня появилась мысль снести базу и модели обученные перенести из папки в другую временно и создать новую базу со случайными моделями, а потом вернуть назад модели и продолжить их учить. Чтобы как то их избавить от прямой линии.

База примеров не "забьётся" проходами без сделок. В Research.mq5 стоит проверка и не сохраняет такие проходы. Но хорошо, что такой проход сохранится из  Test.mq5. При формировании вознаграждения есть штраф за отсутствие сделок. И это должно помочь модели выйти из такой ситуации. 

 

Дмитрий я сделал уэе 90 циклов (обучение- тест-сбор БД) и у меня до сих пор модель даёт рандом. Могу сказать так из 10 проходов Test.mqh 7 сливает 2-3 в 0 и 1-2 раза за примерно 4-5 циклов есть прогон в плюс. Вы в статье указали что у Вас положительный результат получился за 15 циклов. Я понимаю что тут много рандома в системе, но мне не понятно почему такая разница? Ну я понимаю если бы у меня модель дала положительный исход к примеру через 30 циклов, ну пусть 50, ну уже 90 и особо не видно почти прогресса....

А Вы точно выложили тот-же код, что и сами обучали? Может что исправили для тестов и случайно забыли и не тот вариант выложили.....?

А если допустим коэффициент обучения повысить на один разряд, она не быстрей будет учиться?

Я чё-то не понимаю......