Нейросети.

Тема в разделе "Нейросети", создана пользователем лёксус, 2 авг 2009.

  1. yu-sha

    yu-sha Активный пользователь

    <div align="center"><b><!--sizeo:2--><span style="font-size:10pt;line-height:100%"><!--/sizeo-->Самоликбез по нейросетям - Урок 1<!--sizec--></span><!--/sizec--></b></div>

    Попробуем научить нейросеть вычислять значения какой-нибудь нетривиальной функции, например,
    y(x)=x+cos(x/30)*200
    На рисунке ниже диаграмма y=f(x), построенная Excel'ом

    <div align="center"> pic1.PNG </div>

    1)Создаем .xls файл с расчетами значений функции (в столбцах Х и У - то, что мы предъявим нейросети):
    X Y
    1 201
    2 202
    .......
    658 458
    659 459
    660 460
    Всего 660 строк - вполне достаточно для обучения и тестирования

    2) В NeuroShell 2 (профессиональный режим)
    Импортируем данные
    В Предобработке выбираем <i>Графики зависимостей</i>
    Смотрим график зависимости Y от номера примера
    <div align="center"> pic2.PNG </div>
    похожа на диаграмму выше - значит, исходные данные распознали верно

    3) Настраиваем входы-выходы (Х-вход,У-выход) и устанавливаем мин-макс по стандартному отклонению
    <div align="center"> pic3.PNG </div>

    4) Делим исходные данные на 3 части = файла (.trn-тренировочный, .tst-тестовый, .pro-экзаменационный)
    <div align="center"> pic4.PNG </div>
    получим три файла - .trn, .tst, .pro
    первые два используются для обучения нейросети, третий - совершенно неизвестный для сети (его мы будем использовать для проверки работоспособности)

    5) Настраиваем архитектуру сети и параметры обучения
    Нейрошелл предлагает сеть Ворда - оставим как есть, ибо мало что могу сейчас сказать о принципах выбора архитектуры
    Параметры обучения выставим такими (уберем любые причины остановки обучения - будем тренировать долго)))
    <div align="center"> pic5.PNG </div>

    6) Запускаем процесс обучения
    Через несколько секунд останавливаем его, чтобы посмотреть, что получилось
    Для этого применяем нейросеть к .pat-файлу (содержит полный набор данных) - создается .out-файл
    Просматриваем, что получилось
    <div align="center"> pic6.PNG </div>
    черным - график, построенный по оригинальным данных
    синим - ответ сети
    прямо скажем - не очень хороший результат )))
    надо дать сети возможность поучиться

    7) Тренируем сеть еще 2 минуты и снова применяем ее к .pat-файлу … уже неплохо, очень неплохо
    <div align="center"> pic7.PNG </div>

    8) Еще через 15 минут обучения …
    Применяем сеть к полному набору данных
    Получаем результаты применения (учимся работать по приборам, т.к. в дальнейшем таких простых входов-выходов не будет)

    <blockquote>Имя файла: C:NeuroShell 2MYПарабола.pat 
    Обработано примеров: 660

    Выход: C1
    R квадрат: 0.9992
    r квадрат: 0.9992
    Средний квадрат ошибки: 46.699
    Ср. квадратичная ошибка (СКО): 6.834
    Относительная СКО, %: 0.727
    Средняя абсолютная ошибка: 5.800
    Мин. абсолютная ошибка: 0.010
    Макс. абсолютная ошибка: 15.153
    Коэффициент корреляции r: 0.9996
    Доля с ошибкой менее 5%: 79.697
    Доля с ошибкой от 5% до 10%: 7.121
    Доля с ошибкой от 10% до 20%: 9.091
    Доля с ошибкой от 20% до 30%: 1.061
    Доля с ошибкой свыше 30%: 3.030
    </blockquote>

    <div align="center"> pic8.PNG </div>

    <div align="center"> pic9.PNG </div>

    9) Дальше нет особого смысла обучать - результат более чем хороший

    Пробуем применить эту сеть к экзаменационной части набора (.pro - эта часть никак не участвовала в обучении) - сравнимо с проверкой в реале

    Имя файла: C:NeuroShell 2MYПарабола.pro
    Обработано примеров: 66

    Выход: C1
    R квадрат: 0.9991
    r квадрат: 0.9991
    Средний квадрат ошибки: 42.929
    Ср. квадратичная ошибка (СКО): 6.552
    Относительная СКО, %: 0.697
    Средняя абсолютная ошибка: 5.410
    Мин. абсолютная ошибка: 0.018
    Макс. абсолютная ошибка: 14.666
    Коэффициент корреляции r: 0.9996
    Доля с ошибкой менее 5%: 83.333
    Доля с ошибкой от 5% до 10%: 13.636
    Доля с ошибкой от 10% до 20%: 1.515
    Доля с ошибкой от 20% до 30%: 0
    Доля с ошибкой свыше 30%: 1.515

    <div align="center"> pic10.PNG </div>

    Отлично!!!

    ИТОГО:
    - получен первый опыт создания нейросети в нейрошелл 2))
    ВЫВОДЫ:
    - 23-нейронная сеть справилась с непростой задачей
    - ошибка на выходе реального применения <10%
    - похоже, что еще пару часов обучения снизят ошибку до 5%
    - что дальше?

    P.S.
    Открываю случайную книгу (подвернулась "NLP: используйте свой мозг для изменения. Р.Бэндлер) на случайной странице. Читаю:
    "Замешательство всегда есть указание на то, что вы находитесь на пути к пониманию. Замешательство предполагает, что у вас есть множество данных, но они еще не организованы способом, который позволяет вам понять их" ))

    P.S.2 Обучение нейросети остановил, т.к. в течение нескольких минут ошибка перестала снижаться
    Подправил архитектуру - вместо 2х блоков по 7 нейронов скрытого слоя выставил 2 блока по 20 нейронов
    Через 10 минут обучения ошибка этой сети уже меньше, чем наилучшая ошибка прошлой сети
    Вывод: старой сети просто-напросто не хватало нейронов, чтобы выучить урок ближе к оригиналу

    За 40 минут новая сеть выдала вот такой результат
    <div align="center"> pic11.PNG </div>
     
  2. лёксус

    лёксус Активный пользователь

    Отличный пример. ^good^

    К вопросу, что дальше.
    Сначала преамбула. Пример на самом деле простой (показательность и результат примера это нисколько не умаляет). Это синусоида с постоянной длинной волны (периодом, частотой) и амплитудой. От обычной синусоиды отличается осью абсцисс, которая идет не горизонтально, а под наклоном 30 градусов.

    А теперь, что дальше.
    Если по максимуму... То период синусоиды делаем переменным (частотная модуляция), амплитуду делаем переменной (+/- 25%, например) и ось абсцис заменяем прямую на синусоиду с длинным периодом. Не знаю, понятна ли картинка, которую "нарисовал". Если нет, скажите, нарисую в фотошопе. :unsure:

    Можно весь этот максимум разбить на части и попробовать окучить частями. Но очень интересен результат решения "по максимуму".
     
  3. yu-sha

    yu-sha Активный пользователь

    Подозреваю, что с этой задачей сеть тоже справится без труда, весь вопрос в количестве нейронов и времени обучения
    Сейчас вектор интереса смещаю в сторону поиска закономерности как таковой
    Применительно к Форексу это может звучать так:
    1) Имеет ли значение цвет галстука Бернанке при выступлении
    2) Связаны ли между собой экономические показатели, связаны ли экономические показатели США, Еврозоны, ...
    3) Зависит ли разворот тренда от дня недели, часа, месяца
    ....
    А также:
    Как влияет время обучения сети и количество требуемых нейронов при количестве входов 2,3,... 50 ?
     
  4. yu-sha

    yu-sha Активный пользователь

    Ставлю более практичную задачу:
    зависит ли направление свечи D1 от :
    - направления N предыдущих свечей
    - фин.инструмента
    - дня недели
    ?
    возможно, будут изменения
    о результатах сообщу
     
  5. лёксус

    лёксус Активный пользователь

    Не факт, что справится. А если и справится, не известно, на сколько хорошо.
    Вообще-то, я описал идеальную, но довольно близкую к реальной, картину рынка с точки зрения преобразований Фурье.

    На счет Ваших пунктов, я понимаю, что Вы имеете ввиду, но тут таки есть что сказать...
    1. Цвет галстука не имеет значения. Имеет значения час назначенной пресс-конференц после чего-либо.
    2. Не связаны. В большей степени имеет значение в вечернее время строительство новых домов в штатах, а в ночное время уровень безработицы в Австралии. При этом Еврозона реагирует по разному. Евра, как правило соответсвует в противоположном направлении, а фунт, как правило, чихать хотел на всю эту ерунду
    3. Не зависит. Один из моих экспериментов в НШ2 это показал однозначно. На часовке введение номера часа существенно ухудшило результаты обучения и работы нейро сети.

    Выше перечисленное - мои личные наблюдения, т.е. ИМХО. На истину в последней инстанции не претендую.
     
  6. yu-sha

    yu-sha Активный пользователь

    .
    Из Фотошопа проблематично будет создать ряд данных
    В Excel через формулу не получится?
     
  7. yu-sha

    yu-sha Активный пользователь

    Вот новая функция - менее гладкая))
    После 1,6млн эпох обучения (19 часов на ноутбуке) имеем
    <div align="center"> pic12.PNG </div>
    видно, что на пилообразном участке шансов приблизиться к оригиналу практически нет
    на гладких участках все более-менее терпимо

    P.S. Кстати говоря NeuroShell 2 (Версия 4.0) работает в WoW подсистеме Windows
    Другими словами - это DOS архитектура (Windows 3.1) программа 15-тилетней давности
    Ни о какой многопотоковости речи быть не может
    Т.е. разницы в скорости обучения на одноядерном Celeron'e и 4-хядерном Xeon'e не будет
    Есть что-либо посовременнее?
    Задача обучения нейросети должна прекрасно параллелиться
     
  8. yu-sha

    yu-sha Активный пользователь

    Касаясь вопроса о процессорном времени и распараллеливании процесса обучения...
    Не вижу особой сложности в том, чтобы сделать процесс обучения сети распределенным: есть NeuroServer и NeuroClient'ы - сервер хранит последнюю версию наиболее удачных весов, а клиенты каждый сам по себе пытаются улучшить ошибку.
    Двадцать человек держат у себя на компьютере клиента, который настроен на Low приоритет использования процессора, чтобы не мешать выполнению таких ресурсоемких задач, как просмотр web-страничек и набора текста в Word))), а в сумме получаем неслабый кластер - дешево и сердито
    Подозреваю, что кто-то уже это сделал )))
    Что слышно на этом фронте?
     
  9. лёксус

    лёксус Активный пользователь

    Я уверен, что если на пилу натравить отдельну сеть, она так же хорошо обучится.
    По-моему, из этого примера видно, что для разных участков надо делать разные сети.
    Применительно к рынку, в трендах работает одна сеть, на флетах другая.
    Дело за малым, выбор критерия определения однотипных участков на исторических данных.
    Результат работы критерия - количество однотипных участков и их "адреса".
    Задача аналогичная проблеме создания алгоритмического принципа определения тренда и флета.

    Я видел множество попыток решения такого автоопределения (возможности отличия) тренда и флета. Ни одна не увенчалась успехом. Точнее, какие-то результаты всегда были, лучше или хуже. Но задачу можно считать до сих пор не решенной. Хотя, может быть у кого-то и получилось решить эту проблему с приемлемой точностью, и просто я не видел такого решения.
     
  10. yu-sha

    yu-sha Активный пользователь

    Для Форекса нет необходимости получать решение с точность в 95%
    Простые размышления позволяют сделать вывод о том, что достаточно 60-65% успешности предсказания отдельных событий (в отличие от 50% успешности при подбрасывании монетки), чтобы вычислить необходимый размер депозита и подобрать ММ (стратегию управления капиталом), для достижения прибыльности
    На уровне ощущений чувствую, что при работе с нейросетями не следует пользоваться устоявшимися терминами - тренд, флет, волатильность, ... Таким образом мы "навязываем" новорожденной нейросети все наши обусловленности - надо дать ей возможность взглянуть на мир по новому.
    Как это сделать и тем более объяснить - я пока не знаю
    Надо экспериментировать, термины придут сами. Моя нейросеть головного мозга что-нибудь заметит ))
     
  11. лёксус

    лёксус Активный пользователь

    Я не слышал. Хотя у самого с полгода назад возникала почти такая же идея.
    Готового решения не нашел, хотя, собссно, глубоко и не рыл.
    Была мысль о собственной реализации. Но решил не тратить время. Тем более, что нейро жрет ресурсы только на этапе обучения. Готовая сеть работает очень быстро.
     
  12. лёксус

    лёксус Активный пользователь

    Увы, ya-sha, Вы ошибаетесь. Моя практика нейро-предсказаний показывает однозначно, что процент предсказания менее 80, это все равно, что подбрасывать монетку.
     
  13. yu-sha

    yu-sha Активный пользователь

    Здесь много "но" и "если"
    Пока воздержусь от развития этой темы, если Вы не против
    Хотя мой следующий вопрос частично затрагивает эту тему

    Имею вопрос по нейрошелл 2
    Подаю нейросети данные в виде
    21 58 -16 3 101 -63 12 117 -48 64 53 -2 113 45 30 -0.5
    3 76 -56 21 58 -16 3 101 -63 12 117 -48 64 53 -2 -0.5
    179 7 166 3 76 -56 21 58 -16 3 101 -63 12 117 -48 0.5
    50 36 19 179 7 166 3 76 -56 21 58 -16 3 101 -63 0.5
    44 71 -40 50 36 19 179 7 166 3 76 -56 21 58 -16 -0.5
    54 61 -12 44 71 -40 50 36 19 179 7 166 3 76 -56 -0.5
    47 30 27 54 61 -12 44 71 -40 50 36 19 179 7 166 0.5
    181 3 124 47 30 27 54 61 -12 44 71 -40 50 36 19 0.5

    Последний столбец - это желаемый ответ: "плюс 0.5 - следующий бар вверх, минус 0.5 - вниз"
    нормировал выход в диапазоне [-0.5,+0.5], чтобы проще было анализировать ошибку
    ожидал, что если средняя ошибка будет около 0.5, то сеть не нашла закономерности
    другими словами "средняя ошибка"*100% - это процент неугадывания сетью направления следующего бара

    Вот график выходов в Предобработке
    <div align="center"> pic13.PNG </div>

    Применяю натренированную сеть к .pro файлу и получаю ср.абсолютную ошибку 0.037
    если следовать моей логике, то вероятность ошибиться у этой сети 3.5%, соответственно вероятность угадывания 96.5%
    Вот результаты применения:
    <blockquote><i>Имя файла: C:\NeuroShell 2\MY\EURUSD1440.pro
    Обработано примеров: 205

    Выход: C1
    R квадрат: 0.9672
    r квадрат: 0.9691
    Средний квадрат ошибки: 0.008
    Ср. квадратичная ошибка (СКО): 0.090
    Относительная СКО, %: 8.986
    Средняя абсолютная ошибка: 0.037
    Мин. абсолютная ошибка: 0
    Макс. абсолютная ошибка: 0.725
    Коэффициент корреляции r: 0.9844
    Доля с ошибкой менее 5%: 64.390
    Доля с ошибкой от 5% до 10%: 15.610
    Доля с ошибкой от 10% до 20%: 9.268
    Доля с ошибкой от 20% до 30%: 3.415
    Доля с ошибкой свыше 30%: 5.854 </i></blockquote>

    Находясь в здравом рассудке, задался вопросом "Где я ошибаюсь?" )))
    Собственно, прошу помочь мне найти ошибку в логике
    ---------------------------------------------------------------------
    Ответ найден: в исходные данные попала информация о баре, для которого производилось прогнозирование ^acute^
    А как все красиво начиналось :tatice_06:
     
  14. лёксус

    лёксус Активный пользователь

    Точно. В таких случаях всегда получаются результаты, близкие к идеальным. И, кстати, это самые распространенные грабли, на которые хотя бы раз, наступают практически все. Обязательно надо для сетки оставлять кучку неизвестных ей данных, которые не попали ни в тренировочный, ни в тестовый набор.
     
  15. лёксус

    лёксус Активный пользователь

    Совсем забыл... :unsure:
    В соседней ветке <b>Прогаммы для нейросетей</b> выложил НШ2 с русским хелпом. Если кому-то надо...
     
  16. yu-sha

    yu-sha Активный пользователь

    Экзаменационный и тестовые наборы я выделил, так что проблема была не в "переобученности" сети
    Возможно, я нечетко выразился в следующей фразе
    Поясню
    В исходных данных
    21 58 -16 3 101 -63 12 117 -48 64 53 -2 113 45 30 -0.5
    3 76 -56 21 58 -16 3 101 -63 12 117 -48 64 53 -2 -0.5
    179 7 166 3 76 -56 21 58 -16 3 101 -63 12 117 -48 0.5
    третий столбец содержал информацию об искомом направлении закрытия бара
    т.е. вопрос к нейросети звучал так "Каково будет направление закрытия 0-го бара, если известны high, low и close 0-го,1-го,2-го,3-го и 4-го?"
    Вот что показала гистограмма важности входов
    <div align="center"> pic14.PNG </div>
    третий вход во многом определял итоговый результат

    Как говорится - нет худа без добра
    Такая ошибка позволила мне сделать вывод, что нейросеть найдет закономерность, если она есть (по крайней мере, если она настолько явная)
    Что уже хорошо, на этапе знакомства

    После того, как эта информация была удалена из входного набора, ошибка сети после 20 часов обучения не смогла опуститься ниже 49.5%
    Что, впрочем, ожидаемо

    После такого эксперимента можно усомниться в теории свечного анализа применительно к EURUSD D1
     
  17. лёксус

    лёксус Активный пользователь

    Вы выразились, как раз-таки, вполне четко и понятно. Я ведь в самом начале тоже наступал на эти грабли. У меня сетка выдавала изумительные результаты при проверке. И я так же, как Вы, задавал себе вопрос - в чем ошибка (слишком всё красиво). Потом до меня дошло, что я проверяю сеть на тех же данных, на которых она училась - бэк тест. Тогда я и перешел на форвард тест. И результаты стали настолько плохими, что я снова задал себе вопрос - в чем ошибка. И в результате я пришел к тому, что "катастрофа" содержится в принципе выбора входных данных. Что на вход подадим, то и получим. В 90% случаев - ничего хорошего.

    То, что я имел ввиду в своем посте
    написано и в хелпе в НШ2
    <i>Выделение тестового набора
    Воспользуйтесь этим модулем для выделения тестового набора и/или экзаменационного набора данных из числа тренировочных примеров. ... Экзаменационный набор может использоваться для проверки результатов работы сети на данных, которые сеть <b>никогда не "видела" раньше</b></i>.
     
  18. yu-sha

    yu-sha Активный пользователь

    лёксус, ок!
    этот урок я уже усвоил
    Кстати, в матлабе я не нашел такого инструмента\технологии как "калибровка" и, как следствие, не было возможности автоматически контролировать переобученность сети
    Поэтому считаю, что Нейрошелл 2 больше подходит для работы с Форекс
     
  19. лёксус

    лёксус Активный пользователь

    Сделал простенький скрипт. Основа - генератор случайных чисел. Используется для определения - добавить или отнять некоторое значение. Фактически, получилась имитация прилетающих тиков, которые собираются в "минутные" бары. И таких баров сделал 1000 штук. Скрипт пишет сгенерированные бары в файл csv, в котором можно потом построить биржевую диаграмму (тоже самое, что мы видим на графике цен в МТ4).

    Вот, что получилось.

    screenshot.jpg


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

    Это сам скрипт.
    Посмотреть вложение s_Random.mq4
     
  20. SINtez

    SINtez Новичок

    После ряда тестов получил следующие цифры, может быть будут интересны кому-то.
    Торговля на 4Н в направлении D. (% изменения по сравнению с тестом по 4H)

    Колличество сделок : -45,24%
    Winners: +7.99%
    Profit: -25.10%
    Max DD(общий): -29,92%
    ФВ(Recovery Factor): +6.84%

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

    Какие мысли по поводу улучшения показателей?
     

Поделиться этой страницей