Многослойный персептрон! Встречайте! Впервые на арене!


Многослойный персептрон! Встречайте! Впервые на арене!
Atom
11/13/2013


Первая часть. Лирика (можно не читать)
C# я начал изучать год назад, просмотрев курсы S#. До этого программированием не занимался вовсе. Поэтому за код прошу не пинать, лучше подскажите как правильно делать. С удовольствием выслушаю все вопросы, предложения и пожелания! А также выражаю искреннюю благодарность команде S# за их проект!

Вторая часть (Для тех, кто в теме). Многослойный персептрон (как я его реализовал)
Моя нейросеть состоит из 1) Первый слой (или входной слой) — это набор признаков(входной вектор) которых мы подаем на вход нейросети. 2) Второй слой нейронов. Каждый нейрон второго слоя связан со всеми нейронами первого(входного) слоя и всеми нейронами третьего слоя нейронов связями(синапсами). 3) Третий слой тоже само что и второй, только связан со вторым слоем и четвертым. 4) Четвертый слой состоит из одного нейрона, выход которого и будет нам нужен. Рис.1.

Особенности нейросети которые стоит упомянуть.
Функция активации гиперболический тангенс
Code
private const double AlfaSigmoid = 0.66666d;
        public static double ThFunc(double y)
        {
            return (1.7159 * Math.Tanh(AlfaSigmoid * y));
        }


Производная активационной функции, для обратного распространения ошибки
Code
public static double ThDerivative(double _out)
        {
            return (AlfaSigmoid * (1.7159d * 1.7159d - _out * _out) / 1.7159d);
        }


На каждый нейрон подан дополнительный синапс с постоянным входным значением (-1).
При обучении нейросети в качестве обучающего значения используется значения double (но как правило -1, 0 и 1), в качестве входного набора признаков использую List<double> inputSignals (хоть и double, но как правило (-1, 0 и 1).
Все остальное можно найти в интернете, вот сайт, с которого я взял рисунок http://www.aiportal.ru/a...s/multi-perceptron.html там же можно найти информацию про персептрон и обратное распространение ошибки.

Третья часть. Сама программа
Чтобы обучить нейросеть, нужно создать обучающую последовательность. Из всех разных способов который пробовал, при том что обучающую последовательность постоянно меняю. Я остановился на следующем. В гидре создаю свечи, в примере это пятиминутки. Сохраняю их в Excel, открываю сохраненный файл. В столбике H создаю необходимую логику, в примере это бычья или медвежья свеча. Сохраняем файл в формате CSV. Рис 2
Теперь необходимо прописать путь до папки со свечами, и пут к файлу обучающей последовательности.
Code
private const string PathStorage = @"C:\History";
        private const string PathLessons = @"..\\..\\..\\candles_SPFB.RTS@FORTS_TimeFrameCandle_00_05_00.csv";
        private const string PathNeuroNet = @"..\\..\\..\\NeuroNet.dat";
        private const string PathLog = @"..\\..\\..\\log.txt";

Я как правило сохраняю в файл в ту же папку где лежит NeuroRobot.sln. Туда же сохраняется нейросеть, и лог. В таком случае нужно только папку со свечами прописать.
Файл обучающей последовательности(candles_SPFB.RTS@FORTS_TimeFrameCandle_00_05_00.csv) содержит знания с 1.1.2013 по 1.10.2013. Файл нейросети (NeuroNet.dat) обучен на данных с 1 по 15 января 2013г.
Запускаем программу, переходим на вкладку Lesson. Если активна кнопка «Удалить файл знаний» значить существует обученная сеть, ее можно удалить или доучить.
Если кнопка неактивна и на ней написано файл знаний отсутствует, то можно задать период обучения, я задал первые 15 дней года, всего 809 образов получилось. Также задается таймфрайм, количество нейронов на втором и третьем слое. При этом если в третьем слое поставить 0, то сеть будет двухслойная. В ходе обучения, можно изменять, шаг обучения, момент, порядок предоставления образов. На графике видна среднеквадратичная ошибка сети. Также видна статистика обучения сети. При обновлении минимума ошибки, класс сети сохраняется. Рис 3.Когда дальнейшее обучение сети бесполезно, останавливаем обучение. Переходим на вкладку Stratagy testing.Рис 4.

Задаем период тестирования, я поставил весь январь, жмем StratagyHistoryTesting. Рис 5.
На рисунке видно, что сеть запомнила первые 15 дней года, но уже с 16-го января начала сливать.
С нажатием StratagyHistoryTesting, становится активной вкладка График. В этой вкладке можно смотреть тестирование стратегии.Рис 6.
На втором окне графика черными точками обозначена текущая позиция. Зеленым обозначена желаемое значение из обучающей последовательности. Красным то что выдала нейросеть.
В третьем окне прибыль на текущий момент.
Стратегия простая если следующая свеча бычья покупаем, медвежья продаем.

Ну и самый интересный вопрос. Что подавать на вход? Для стратегии я использовал OXLC последних 4 свечей, переведенных в двоичный формат, получилось 240 единиц и минус единиц.

Всем спасибо за внимание! Жду отзывов, и лайков![biggrin]
А кстати робот лежит в TFS NeuroRobot Public называется.
001.jpg 44 KB (289) 002.jpg 167 KB (292) 003.jpg 160 KB (288) 004.jpg 184 KB (299) 005.jpg 137 KB (292) 0006.jpg 282 KB (273) 0006.jpg 151 KB (282)


Самунджян Артем

Avatar
Date: 11/13/2013
Reply


Ребята, советую, статья тащит [thumbup]
Thanks:

Mikhail Sukhov

Avatar
Date: 11/14/2013
Reply


Стратегия с каждым новым днем истории делала свое переобучение?
Thanks:

pyhta4og

Avatar
Date: 11/14/2013
Reply


Quote:
я задал первые 15 дней года, всего 809 образов получилось. Также задается таймфрайм, количество нейронов на втором и третьем слое. При этом если в третьем слое поставить 0, то сеть будет двухслойная. В ходе обучения, можно изменять, шаг обучения, момент, порядок предоставления образов. На графике видна среднеквадратичная ошибка сети. Также видна статистика обучения сети. При обновлении минимума ошибки, класс сети сохраняется. Рис 3.Когда дальнейшее обучение сети бесполезно, останавливаем обучение. Переходим на вкладку Stratagy testing.Рис 4.
Я так понял 15 дней это INSAMPLE - период где обучали сеть. И обучили ее до состояний "Профит растет как ракета вверх".
Quote:

Задаем период тестирования, я поставил весь январь, жмем StratagyHistoryTesting. Рис 5.
На рисунке видно, что сеть запомнила первые 15 дней года, но уже с 16-го января начала сливать.
С нажатием StratagyHistoryTesting, становится активной вкладка График. В этой вкладке можно смотреть тестирование стратегии.Рис 6.

с 16го января пошел OUT OF SAMPLE, те данные не использованные для обучения. И способность сети предсказывать стала равна нулю.

Дело в общем-то известное. Называется curve fitting, нейросеть для этой цели - отличный инструмент. Может интерполировать практически любые данные. Но предсказательная функция у нее ничем не лучше чем у простого "вчера рос-покупай, вчера падал - продавай".

ИМХО при построении моделей надо изначально ставить вопрос "а в чем собственно РАЦИОНАЛЬНОЕ ЗЕРНО модели".

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

Thanks:

loop

Avatar
Date: 11/24/2013
Reply


А чему она учится? Что на вход, как формируются обучающие паттерны?

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

Нейросетей в виде C# библиотек пруд пруди в открытом доступе(наприер на хабрахаре), есть смысл вникать в конкретно Вашу реализацию только если есть изюминка, либо процесс вникания будет доставлять.

Thanks:

Иван З.

Avatar
Date: 11/24/2013
Reply


[USERLINK]Mikhail Sukhov[/USERLINK]
Quote:
Стратегия с каждым новым днем истории делала свое переобучение?

Нет, стратегия с каждым новым днем не переобучается. Стратегия в примере простая, если сеть показала больше 0,5 покупаем, если меньше -0,5 продаем. Данную стратегию я брал для примера, и нисколько не настаиваю на использование ее именно в таком виде. К тому же сам период обучения, очень маленький 7 рабочих дней. Входная последовательность это всего лишь двоичное представление основных параметров 4 последних свечей. Такая сеть обучается у меня на компьютере за 1м30сек. В общем это слишком просто чтоб работало.
Приведу пример работы 3 одинаковых по параметрам нейросетей, сеть трехслойная 3:2:1, на входе и выходе все те же данные. Но обучать их я буду весь январь с 01.01.2013 по 01.02.2013, В этих сетях отличаются только первоначальные весовые коэффициенты связей нейронов(синапсов) они очень маленькие и выбираются рандомно. На первых 3 рисунках можете увидеть результат тестирования стратегии, с 28.01.2013 по 15.02.2013. У них разные даже 4 дня января на которых сеть обучалась!!! Сложно как то такому механизму довериться.
Сеть с периодом обучения 6 месяцев около 20000 образов, обучается около 2 часов, нейронов надо больше(иначе не выучится). Но результат не лучше.
По поводу переобучение и добавление нейронов. То Сеть на новых данных выучивается лучше, чем переобучать старую сеть, по крайней мере Ошибка значительно меньше.
[USERLINK]pyhta4og[/USERLINK]
Quote:
Я так понял 15 дней это INSAMPLE - период где обучали сеть. И обучили ее до состояний "Профит растет как ракета вверх".

Да.
[USERLINK]pyhta4og[/USERLINK]
Quote:
с 16го января пошел OUT OF SAMPLE, те данные не использованные для обучения.

Да.
[USERLINK]pyhta4og[/USERLINK]
Quote:
И способность сети предсказывать стала равна нулю.
Дело в общем-то известное. Называется curve fitting, нейросеть для этой цели - отличный инструмент. Может интерполировать практически любые данные. Но предсказательная функция у нее ничем не лучше чем у простого "вчера рос-покупай, вчера падал - продавай".

Согласен.
[USERLINK]pyhta4og[/USERLINK]
Quote:
ИМХО при построении моделей надо изначально ставить вопрос "а в чем собственно РАЦИОНАЛЬНОЕ ЗЕРНО модели".
Предвидя вопросы приведу пример рационального зерна. Я работал в фонде где продавали переоцененную волатильность за 3 дня до экспирации. Нормально все было, в профите. Пока в августе 2008го не начался кавардак и фонд не потерял половину денег. Ну это просто хеджироваться надо было лучше.

[smile]
01.jpg 170 KB (290) 02.jpg 162 KB (278) 03.jpg 170 KB (282)
Thanks:

Mikhail Sukhov

Avatar
Date: 11/24/2013
Reply


Иван З. Go to
[USERLINK]Mikhail Sukhov[/USERLINK]
Quote:
Стратегия с каждым новым днем истории делала свое переобучение?

Нет, стратегия с каждым новым днем не переобучается.


Так ведь рынок то не стационарен. Значит его структура изменчина. Значит сеть нужно постоянно переобучать. Переобучение на реале - это как раз не зло. Зло - переобучение на истории, так как это подгонка под среднее-статистическое положение рынка. А если переобучение идет за последние время, то это подгонка под последнее движение. Что есть не плохо.

Вообще наверное нужно иметь как у с обычными ТА стратегиями так же 2 сети, одна на краткосроке, другая на большем ТФ. Первая смотрит за микроструктурой рынка. Другая более глобально. Если стратегия позиционная, меньший ТФ может нас в черный лебедь завести своими сделками. Помог резкий переход на новый уровень - и мы в минусах.
Thanks:

Иван З.

Avatar
Date: 11/24/2013
Reply


[USERLINK]loop[/USERLINK]
Quote:

А чему она учится? Что на вход, как формируются обучающие паттерны?

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

Нейросетей в виде C# библиотек пруд пруди в открытом доступе(наприер на хабрахаре), есть смысл вникать в конкретно Вашу реализацию только если есть изюминка, либо процесс вникания будет доставлять.

Спасибо за вопрос. А то я уже думал что все по комментариям в коде разобрались. Сам я до этого статей не писал, только злобные и критические Комменты![lol] Поэтому прошу снисхождения. Сейчас все объясню как смогу.
В статье и в примере выложенном в TFS, вся логика спрятана в методе

Но мы его пока трогать не будем. Для примера берем Максимум свечи например 163360 в делим на шаг это 10. получили 16336

и там же с помощью следующего метода, переводим 16336 в двоичный формат длинной 12 символов, получаем 11111111010000. Так как у нас гиперболический тангенс, то вместо нулей ставим минус единицу.

Все это повторяем для Открытия и Закрытия Минимума свечи. И каждый отдельный символ двоичной последовательность заносим в List<double>()

Таким образом мы получили одну свечу. А нам надо 5, (только сейчас понял что в примере беру 5 свечей). Для этого нам нужно

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

Ну и сам метод который я показывал в начале, когда List<Candle> Candles заполнится, IsFormed станет true. Этот метод объединит все наши 5 свечей в последовательность из 240 единиц и минус единиц.

здесь не обязательно inputSignals.AddRange(CandleLevelRi(candles[0]));, можно inputSignals.Add(Если мувинг 30>мувинга 20 то 1 иначе -1)); зависит от вашей фантазии. Важно добавить в inputSignals значение от -1 до 1, можно -0,345 или 0,53 но чтоб в диапазоне от -1 до 1. В общем вся логика в этом методе.
В итоге у нас получилось 240 входных сигналов (признаков). Программа обучения сети сама определит количество этих признаков.(Я это сейчас объяснять не буду) Вам их рассчитывать и куда то забивать не надо.
Вся ваша задача для тестирования правильно описать входной сигнал(признаки) на котором будет обучаться сеть. Если вы решите взять не 5 свечей а 10. То Сделайте так

И больше ничего нигде менять не надо!!! Не забывайте изменять CandlesCount по количеству свечей используемых в обучении.
Установите период обучения какой пожелаете, количество нейронов все это устанавливается в окне. И обучайте!
Как задавать эталонную последовательность я уже описывал.
Надеюсь помогло мое пояснение. И вы найдете РАЦИОНАЛЬНОЕ ЗЕРНО! [biggrin]

Thanks: wkj

Иван З.

Avatar
Date: 11/24/2013
Reply


[USERLINK]Mikhail Sukhov[/USERLINK]
Quote:
Вообще наверное нужно иметь как у с обычными ТА стратегиями так же 2 сети, одна на краткосроке, другая на большем ТФ. Первая смотрит за микроструктурой рынка. Другая более глобально. Если стратегия позиционная, меньший ТФ может нас в черный лебедь завести своими сделками. Помог резкий переход на новый уровень - и мы в минусах.

Михаил, вы раскрываете секрет Грааля! [biggrin]
А если серьезно, то переобучение, как и разные ТФ, это вопрос технический, это можно реализовать. Нужно немного времени.
А вот вопрос входных данных(признаков)открыт. Даже более простой вопрос, что задавать за эталонно для обучения на известных данных, тоже не решен. В примере это предсказание бычьей или медвежьей свечи. Это даже не движение рынка.
Thanks:

Андрей Гунинский

Avatar
Date: 11/28/2013
Reply


Иван З. Go to
[USERLINK]Mikhail Sukhov[/USERLINK]
Quote:
Вообще наверное нужно иметь как у с обычными ТА стратегиями так же 2 сети, одна на краткосроке, другая на большем ТФ. Первая смотрит за микроструктурой рынка. Другая более глобально. Если стратегия позиционная, меньший ТФ может нас в черный лебедь завести своими сделками. Помог резкий переход на новый уровень - и мы в минусах.

Михаил, вы раскрываете секрет Грааля! [biggrin]
А вот вопрос входных данных(признаков)открыт. Даже более простой вопрос, что задавать за эталонно для обучения на известных данных, тоже не решен. В примере это предсказание бычьей или медвежьей свечи. Это даже не движение рынка.


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy