Нейросети.

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

  1. лёксус

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

    В описании темы написал "Попытка использования нейросети в практической торговле." И это абсолютная правда в том смысле, что <i><b>попытка</b></i>, поскольку в интернете можно найти с десяток форумов, где такие попытки уже предпринимались. Все заглохли. Примерно понятно, почему. Может быть и эту ветку постигнет та же участь. Но, надеюсь, что нет, поскольку цель достаточно простая - сделать одну маленькую рабочую сеточку. Тип сетки - ОРО. Поскольку эта сетка не очень сложна в реализации, и даёт очень не плохие результаты.

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

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

    DISRAELI Искатель

    Вообще было бы весьма неплохо действительно получить ликбез по теме и чем он будет обширнее, тем большее спасибо автору. :) Первая задача ликбеза, это вопервых экономия времени самого автора, дабы исключить большое количество вопросов и вовторых возможность сразу исключить недопонимание... ^drink
     
  3. лёксус

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

    Заранее прошу прощения за задержки с ответами. Очень много работы.

    О ликбезе. Если уж и начинать, то считаю очень полезным начать с самого начала. Уверен, что 90% (или около того) "сеточников" никогда не интересовались биологическим аналогом. А зря. Для лучшего и более правильного понимания и оценки настоящего (и будущего) обязательно надо знать "свою историю". Итак, немножко биологии

    <blockquote><b>Строение</b></blockquote>
    <div align="center"> ____________.jpg </div>
    <blockquote><b>Тело клетки</b></blockquote>Нейрон состоит из тела диаметром от 3 до 100 мкм, содержащего ядро и другие органеллы, и отростков. Выделяют два вида отростков: дендриты и аксон. Нейрон имеет развитый цитоскелет, проникающий в его отростки. Цитоскелет поддерживает форму клетки, его нити служат "рельсами" для транспорта органелл и упакованных в мембранные пузырьки веществ (например, нейромедиаторов). Различается антероградный (от тела) и ретроградный (к телу) аксонный транспорт.

    <blockquote><b>Схема строения нейрона</b></blockquote><b>Аксон</b> обычно - длинный отросток, приспособленный для проведения возбуждения от тела нейрона. <b>Дендриты</b> - как правило, короткие и сильно разветвлённые отростки, служащие главным местом образования влияющих на нейрон возбуждающих и тормозных синапсов (разные нейроны имеют различное соотношение длины аксона и дендритов). Нейрон может иметь несколько дендритов и обычно только один аксон. Один нейрон может иметь связи со многими (до 20 тысяч) другими нейронами.
    Дендриты не имеют миелиновой оболочки, аксоны же могут её иметь. Местом генерации возбуждения у большинства нейронов является аксонный холмик - образование в месте отхождения аксона от тела. У всех нейронов эта зона называется триггерной.
    <b>Синапс</b> - место контакта между двумя нейронами или между нейроном и получающей сигнал эффекторной клеткой. Служит для передачи нервного импульса между двумя клетками, причём в ходе синаптической передачи амплитуда и частота сигнала могут регулироваться. Одни синапсы вызывают деполяризацию нейрона, другие - гиперполяризацию; первые являются возбуждающими, вторые - тормозящими. Обычно для возбуждения нейрона необходимо раздражение от нескольких возбуждающих синапсов.

    <blockquote><b>Классификация</b></blockquote><blockquote><b>Структурная классификация</b></blockquote>На основании числа и расположения дейндритов и аксона нейроны делятся на безаксонные, униполярные нейроны, псевдоуниполярные нейроны, биполярные нейроны и мультиполярные (много дендритных стволов, обычно эфферентные) нейроны.
    <b>Безаксонные нейроны</b> - небольшие клетки, сгруппированы вблизи спинного мозга в межпозвоночных ганглиях, не имеющие анатомических признаков разделения отростков на дендриты и аксоны. Все отростки у клетки очень похожи. Функциональное назначение безаксонных нейронов слабо изучено.
    <b>Униполярные нейроны</b> - нейроны с одним отростком, присутствуют, например в сенсорном ядре тройничного нерва в среднем мозге.
    <b>Биполярные нейроны</b> - нейроны, имеющие один аксон и один дендрит, расположенные в специализированных сенсорных органах - сетчатке глаза, обонятельном эпителии и луковице, слуховом и вестибулярном ганглиях;
    <b>Мультиполярные нейроны</b> - Нейроны с одним аксоном и несколькими дендритами. Данный вид нервных клеток преобладает в центральной нервной системе
    <b>Псевдоуниполярные нейроны</b> - являются уникальными в своём роде. От тела отходит один остросток, который сразу же Т-образно делится. Весь этот единый тракт покрыт миелиновой оболочкой и структурно представляет собой аксон, хотя по одной из ветвей возбуждение идёт не от, а к телу нейрона. Структурно дендритами являются разветвления на конце этого (периферического) отростка. Триггерной зоной является начало этого разветвления (т. е. находится вне тела клетки).

    <blockquote><b>Функциональная классификация</b></blockquote>По положению в рефлекторной дуге различают афферентные нейроны (чувствительные нейроны), эфферентные нейроны (часть из них называется двигательными нейронами) и интернейроны (вставочные нейроны).
    <b>Афферентные</b> нейроны (чувствительный, сенсорный или рецепторный). К нейронам данного типа относятся первичные клетки органов чувств и псевдоуниполярные клетки, у которых дендриты имеют свободные окончания.
    <b>Эфферентные</b> нейроны (эффекторный, двигательный или моторный). К нейронам данного типа относятся конечные нейроны - ультиматные и неультиматные.
    <b>Ассоциативные</b> нейроны (вставочные или интернейроны) - эта группа нейронов осуществляет связь между эфферентными и афферентными.


     
  4. лёксус

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

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

    <div align="center"> i_neuron.jpg </div>

    При обучении нейрона, на вход подается образ, который нейрон в дальнейшем должен узнавать. Под этот образ синапсам присваиваются коэффициенты (веса синапсов). При поступлении образа на вход, значения входов умножаются на эти коэффициенты, затем нейрон эти произведения просто суммирует и в результате на его выходе получается вполне определенный сигнал (поэтому искуственный нейрон называют адаптивным сумматором). При поступлении на вход других (отличных от "нашего") образов, сигнал будет другим. Допустим, мы подобрали веса синапсов таким образом, что на выходе нейрона при "нашем" образе будет 1. При других образах на выходе нейрона будет другое значение, больше или меньше единицы. Т.о., обучившись однажды, нейрон будет узнавать "наш" образ всю оставшуюся жизнь. А если вдруг наш образ немного изменится, то мы переучим (или подучим) нейрон и он опять будет всегда узнавать. Передаточная функция имеет много ипостасей. Для живого нейрона и в некоторых случаях для искуственного, она может быть просто пороговым значением. Т.е. на выходе всей этой конструкции сигнал появится только в том случае, если превышено значение заданного порога. Но в большинстве случаев это какая-либо нелинейная функция. В качестве такой функции чаще всего используется сигмоида (логистическая ф-ция) или гиперболический тангенс. Фактически, это функции нормализации. Иногда в литературе, например, логистическую функцию, называют сжимающей.
     
  5. лёксус

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

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

    <div align="center"><b>Однослойная искуственная нейросеть</b>

    net_1.jpg

    <b>Многослойная искуственная нейросеть</b>

    net_2.jpg </div>
     
  6. лёксус

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

    Описанный выше материал можно было бы озаглавить "Понятие искусственной нейросети." Изложил основное и кратко. Дальше хочу примерно в таком же ключе изложить принципы и проблемы обучения нейросети.

    По вышеизложенному вопросы есть? Или пожелания?


    <b>Фотография живой нейросети.</b>

    live_net.jpg
     
  7. RimiDr

    RimiDr Новичок

    Спасибо за то что взялись за эту тему. Давно хочу разобраться но образование не позволяет сделать это самому. Из пожеланий... Прошу хотя бы один раз пошагово рассказать на каком-нибудь простом примере, как подготовить данные для сети. Как это "запихнуть" в программы с сетями и как подготовить саму сеть и обучить её чему-то. Т.е. провести ликбез по пользованию ПО.
     
  8. xelAIlin

    xelAIlin Новичок

    интересная тема, сам интересуюсь нейросетями)) только вот имею слабое представление о них...точнее так..увидеть бы хоть раз их в работе...есть у кого-нибудь эксперт или индикатор для MT нейросетевой? а то в сети натыкался только на перцептронные советники (что как я понял очень и очень примитивное создание, которую с натяжкой от пола до ушей можно назвать нейросетью)..как я понял это хлам...
     
  9. лёксус

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

    У меня ещё нет ни советника, ни индикатора нейросетевого. Пока что есть только желание его сделать. Но в активе - потраченный год на изучение, осмысление и понимание, как это функционирует. Глубоко в теорию не нырял. Только до уровня, на котором возникло ощущение, что эта тема не за семью печатями, а вполне доступна и работоспособна. И как писал выше, создал эту ветку с целью построить такого советника "всем миром". Потому что для одного разработчика слишком много работы. И работы не в плане наколотить в MQL код сетки и сопутствующие алгоритмы. А сделать это всё правильно. Правильно подготовить сигналы, правильно их подать в сетку, правильно сетку обучить и получить на выходе правильные сигналы. Сам по ходу изучения теории нейросетей провел массу экспериментов в Нейрошелле, т.е. проверял буквально, каждый пункт теории. Подозреваю, что и в дальнейшем придется это делать. Только сейчас это нужно делать уже для получения практических результатов в виде, скажем, нейро-МТС. Но проверять возможно придется каждый этап работы (в смысле промежуточных результатов), потому что браться за следующий этап можно только в том случае, если есть полная уверенность в правильной реализации текущего этапа. Насколько я заметил, посещая различные форумы по этой же тематике, этому моменту уделяется либо слабое внимание, либо вообще никакого. Т.е. считается, что если "инструкция" от теории нейро на начальном этапе соблюдена, то можно быть уверенным, что сеть работает. Но примерно в половине случаев это получается не так.

    Что касается перцептрона, то с ним всё нормально. Перцептрон - это обычная не реккурентная сетка. Она может быть однослойной или многослойной, не имеет значения. И в литературе довольно часто простые сетки называют перцептронами. Модель нейросетки, которую назвали перцептроном предложил Р.Розенблатт в 1957 году. Это была однослойная сетка с принципом обучения - с учителем. На выходе этой сетки стояла пороговая функция. Т.е. сигнал с нейрона, значение которого было больше заданного порога давал на выходе 1, все остальные выходы были равны 0. Немного позже Б.Уидроу и М.Хофф заменили пороговую функцию линейной - воткнули на выход нейрона сигмоиду. И получилась сетка, которая стала основой для многих современных, наиболее сложных алгоритмов обучения с учителем. Но и сам перцептрон используется самостоятельно очень часто. А косяк при использовании перцептрона в каких-то разработках заключается не в том, ЧТО используется перцептрон, а в том КАК он используется.
     
  10. лёксус

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

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

    По сложившейся традиции, начнем с элементарного.
    Традиционно при описании работы/структуры искусственных нейросетей обозначают:
    X - входные сигналы
    Y - выходные сигналы
    W - веса синапсов
    Для однослойной сетки с двумя входами и двумя нейронами в слое будут обозначены:
    входы X1 и X2,
    выходы Y1 и Y2,
    веса синапсов:
    W11 для синапса между входом 1 и нейроном 1
    W12 для синапса между входом 1 и нейроном 2
    W21 для синапса между входом 2 и нейроном 1
    W22 для синапса между входом 2 и нейроном 2
    <div align="center"> net2_2_xwy.jpg </div>



    Синапс - это, по сути, просто передаточная функция умножения. Т.е. входное значение X умножается на значение веса синапса и результат произведения уже подается в нейрон.

    <div align="center"> sinaps.jpg </div>


    Нейрон суммирует все поданные в него значения. Для описываемой сетки значения выходов нейронов будут равны:
    Y1=X1*W11+X2*W21
    Y2=X1*W12+X2*W22
    Эта сумма и определяет состояние нейрона. В сетке Кохонена нейрон-победитель определяется, как нейрон имеющий:
    - максимальное значение суммы, если обучение (подстройка весов) проводилось по методу Хебба. - минимальное значение - если по методу Кохонена.

    Необходимо заметить, что везде в литературе используется слово "сигнал" - входные сигналы, выходные сигналы. На самом деле мы имеем дело только с числами. На вход сетки подается число; вес синапса - число; выход нейрона - число; выход сетки - число.

    Зачем нужна (или может понадобиться) сеть Кохонена? С её помощью можно "серую массу" данных расколотить на категории (классы) по схожести параметров (характеристик) этих самых данных. После чего с этими данными становится существенно проще работать.


    Допустим мы имеем некоторое количество данных, с которым надо как-то работать, и которые выглядят однородной "серой массой". На самом деле эти данные отличаются своими параметрами (характеристиками). Как эти различия раличить?

    <div align="center"> _______________1.jpg </div>

    Мы "пропускаем" все эти данные через алгоритм настройки весов, в результате чего получаем обученную сеть. А затем мы эти данные прогоняем через эту сетку. Настроенные веса синапсов "уловят" схожие и различные по параметрам данные и разложат их "по полочкам". Для одних данных активным будет один нейрон, для других - другой. В результате мы получим такую картинку.

    <div align="center"> _______________2.jpg </div>

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

    <div align="center"> net2_sqr.jpg </div>


    <div align="right">Продолжение следует...</div>
     
  11. лёксус

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

    При описании принципов подготовки данных и математики обучения сети всегда используются графические пояснения в виде единичной окружности. Единичной потому, что теория нейросетей очень сильно рекомендует проводить нормализацию входных данных к диапазону -1 +1 (или 0 +1). При этом часто используется выражение "гиперсфера". Что это такое? Это просто "общий случай", поскольку теория не рассматривает конкретную конфигурацию сети.
    А если учитывать эту конкретную конфигурацию, то:
    - для сетки с одним входом - точка на плоскости.
    - для сетки с двумя входами - двумерный вектор на единичной окружности.
    - для сетки с тремя входами - трехмерный вектор на единичной сфере (трёхмерная проекция).
    - для сетки с многими входами - N-мерный вектор на N-мерной единичной сфере или, другими словами, гиперсфере.
    Так что ничего страшного нет, если при объяснении используется единичная окружность, а обзывается она гиперсферой.

    Как происходит подстройка весов сетки Кохонена

    Целью обучения является четкая классификация входных векторов. А это означает, что значение каждого нейрона должно соответствовать определенному диапазону данных. На картинке вектор такого нейрона рисуется максимально близко к области векторов данных, за которые этот нейрон "отвечает".

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

    <div align="center"> okr_1st.jpg </div>

    А теперь задача обучения (подстройки весов синапсов) заключается в том, чтобы переместить значения векторов нейронов в области данных - добиться соответствия.

    <div align="center"> okr_1en.jpg </div>

    Настроили веса синапсов, добились абсолютного соответствия, получили идеальну сетку.
     
  12. лёксус

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

    Описанный (и нарисованный) выше процес обучения сети Кохонена универсален. В случаях, когда нужно классифицировать данные, структура которых непонятна и не известно, как именно их лучше всего классифицировать, то только таким способом их и можно проклассифицировать. Но этот метод имеет 2 существенных недостатка. Во-первых, изначально не известно на сколько категорий (классов) можно разделить эти данные. Число классов высасывается из пальца. Можно взять 10 классов, можно 23, можно 36 и т.д. И в этом случае легко можно нарваться на избыточность/недостаточность классов (количество нейронов). Во-вторых, нет никакой возможности затем оценить качество классификации.

    Можно выбрать количество классов (нейронов), которых будет недостаточно. После рандомизации и обученя 2 нейрона нашли "свои" ближайшие области данных. А для двух областей данных (желтая, зеленая) не нашлось свободных нейронов и эти области выпали из классификации.
    <div align="center"> okr_1_min.jpg </div>
    Возможна несколько другая ситуация - когда две области данных очень близко к нейрону, нейрон может настроиться на обе эти области, т.е. застрять посередине. Тогда эти две области данных попадут в один класс, хотя на самом деле они имеют различия и по своим параметрам должны принадлежать к разным классам.



    Второй вариант - слишком много классов (нейронов). После обучения только часть нейронов найдут "свои" области данных. На картинке ниже видно, что один нейрон остался свободным. Т.е. номер класса соответствующий этому нейрону никогда не встретится, хотя нами он и задан.
    <div align="center"> okr_1_max.jpg </div>

    Такое довольно часто можно наблюдать в Нейрошелле при работе с сеткой Кохонена - после обучении некоторые категории (классы) остаются пустыми.
     
  13. лёксус

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

    <b>Обучение нейросети.</b>

    <i><b>1. Рандомизируются веса синапсов.</b></i>
    <blockquote>Sqrt(N) - рекомендуемый диапазон изменения случайных начальных весов (N - количество нейронов)</blockquote><b><i>2. На вход подается вектор Х</b></i>

    <i><b>3. Входной вектор приводится к единичному - каждая компонента вектора делится на корень квадратный из суммы квадратов всех компонент:</b></i>
    <blockquote>Xi=Xi/Sqrt(X12+X22+…+Xi2)</blockquote><i><b>4. Подстраиваются веса:</b></i>
    <blockquote>Wij=Wij+alfa*(Xi-Wij)</blockquote>
    5. Шаги 2 - 4 повторяются для всего набора входных данных (т.е. цикл, количество итераций которого равно количеству входных данных).

    Кроме этого считается, что полезно сеть обучить несколько раз. Всвязи с этим возникло понятие "эпохи". Сколько должно быть эпох тоже особенно не известно. Кохонен рекомендует, чтобы эпох было в 500 раз больше количества нейронов. Но для простых задач может вполне хватить и 50 эпох, а для совсем простых сеть можно нормально обучить вообще за один проход.

    <b>Примеры практической реализации на MQL4 основных моментов:</b>

    <i><b>Задаем параметры сети</b></i>
    <!--c1--><div class='codetop'>Код</div><div class='codemain'><!--ec1-->#define I_NET 2&nbsp;&nbsp;//количество входов
    #define O_NET 2&nbsp;&nbsp;//количество нейронов

    double in_net[I_NET];&nbsp;&nbsp;&nbsp;&nbsp; //входы
    double out_net[O_NET];&nbsp;&nbsp;&nbsp;&nbsp;//нейроны
    double ww[I_NET][O_NET];&nbsp;&nbsp;//веса синапсов<!--c2--></div><!--ec2-->
    <i><b>Начальная инициализация весов синапсов (рандомизация)</b></i>
    <!--c1--><div class='codetop'>Код</div><div class='codemain'><!--ec1-->&nbsp;&nbsp;MathSrand(TimeCurrent());
    &nbsp;&nbsp;double rand=MathRand();
    &nbsp;&nbsp;double d=1/MathSqrt(O_NET);&nbsp;&nbsp; //диапазон изменения начальных весов
    &nbsp;&nbsp;for(j=0; j<O_NET; j++)
    &nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i<I_NET; i++)
    &nbsp;&nbsp;&nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rand=MathRand()*d;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ww[i,j]=rand/32767.0; //начальные случайные веса синапсов
    &nbsp;&nbsp;&nbsp;&nbsp;}
    &nbsp;&nbsp;}<!--c2--></div><!--ec2-->
    <i><b>Подстройка весов синапсов</b></i>
    <!--c1--><div class='codetop'>Код</div><div class='codemain'><!--ec1-->&nbsp;&nbsp;double alfa=1.0;
    &nbsp;&nbsp;for(i=1000; i>0; i--)
    &nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;Fill_IN(i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//заполнение входного массива данных
    &nbsp;&nbsp;&nbsp;&nbsp;for(j=0; j<O_NET; j++) // Подстройка весов нейронов
    &nbsp;&nbsp;&nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i<I_NET; i++)
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ww[i,j]=ww[i,j]+alfa*(in_net-ww[i,j]); //метод обучение Кохонена
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    &nbsp;&nbsp;&nbsp;&nbsp;}
    &nbsp;&nbsp;}<!--c2--></div><!--ec2-->
    <i><b>Получение значений нейронов</b></i>
    <!--c1--><div class='codetop'>Код</div><div class='codemain'><!--ec1-->&nbsp;&nbsp;for(j=0; j<O_NET; j++)
    &nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;double S=0;
    &nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i<I_NET; i++) S+=in_net*ww[i,j];&nbsp;&nbsp;//нейрон-сумматор
    &nbsp;&nbsp;&nbsp;&nbsp;out_net[j]=S;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //выход нейрона
    &nbsp;&nbsp;}<!--c2--></div><!--ec2-->
     
  14. лёксус

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

    <i><b>Вопросы будут?</b></i>
     
  15. Vyacheslav

    Vyacheslav Новичок

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

    ______.jpg

    Оценивая, весь объем, смею предположить, что тут потребуется некий «мозговой штурм» группы единомышленников для решения поставленной задачи, иначе ветка так и останется на уровне маленького доходчивого ликбеза. Сегодня уже всем понятно, что написанного кода в mql самой сети, явно недостаточно для получения работоспособной торгующей нейро системы. С моей точки зрения, только комплексное решение всех 6 задач указанных блок-схемы, может помочь в достижении целей.
    А для этого:
    На первом этапе определяются базовые характеристики данных, которые определяются торговой стратегией. Формируется база данных.
    На втором этапе определяется набор входных и прогнозируемых величин, производятся анализ и очистка базы данных. Для этих целей используются оптимизационные, статистические и другие методы.
    На третьем этапе производится формирование образов, подаваемых непосредственно на выходы нейросетей, с последующим созданием обучающих и тестовых множеств.
    Архитектура нейросети зависит от поставленной задачи, в большинстве случаев используются сети типа многослойный перцептрон.
    На пятом этапе с использованием выбранных алгоритмов обучения производится обучение нейронной сети, или, если это предполагается постановкой задачи, нескольких нейронных сетей (от двух до нескольких тысяч), которые после участвуют в «конкурсе» на попадание в комитет нейроэкспертов.
    Прогнозирование (шестой этап) осуществляется по тому же принципу, что и формирование обучающей выборки. При этом на этапе адаптивного предсказания и принятия решений выделяются две возможности: одношаговое и многошаговое прогнозирование.
    Я отдаю предпочтение одношаговому прогнозированию, то есть только на один бар вперед.

    С уважением, Вячеслав.
     
  16. лёксус

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

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

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

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

    Если вопросов нет, пора переходить к практической реализации.

    Я сделал сетку Кохонена традиционной реализации. Что, разумеется, дало все описанные выше неопределенности для самоорганизущихся сетей. Для простоты наблюдения я заменил рандомизацию начальных весов на равномерное распределение, т.е. прописал начальные значения весов от -0.7 до +0.7 с равным интервалом. Сделал так потому, что в качестве "входного образца" использовал разницу между значением мувинга и ценой открытия. Приведение (нормализация) полученных входных векторов к единичному вектору дало базу векторов в диапазоне -1 +1. После этого сетка обучается. И после этого, практически, готова к работе.

    Но что мы имеем в качестве результата? Хоть сетка и учится хорошо, но конечный результат "не очень". Но это понятно, что подали, то и получили. Но не только. Принцип неопределенности... На сколько классов разбивать данные? Неизвестно. Кроме этого, поскольку мы использовали рандомизацию (в этом конкретном примере псевдорандомизацию), границы между данными прошли скорее всего не в тех местах, где это должно было бы быть на самом деле. Из-за этого некоторые данные попали немножко не в те классы. Ну и кроме этого ещё данные, близкие по параметрам, но находящиеся по разные стороны этих "классовых" границ попали в разные классы, хотя должны бы попасть в один и тот же. Вот такой вот букет. Ну, а в общем и целом, сетка всё-таки работает. Но для того, чтобы сетка заработала совсем правильно, надо существенный акцент перенести с сетки на входные данные и устроить этим данным какую-то предобработку. А потом подкорректировать алгоритм самой сетки, уже с учётом.

    Сделал вывод инфы на экран во время работы сетки. Верхняя табличка - начальные веса. Средняя табличка - веса в режиме подстройки. Нижняя табличка - распределение по категориям. Т.е. количества классов, например, 0-го класс 271 штука, 1-го класса 62 штуки... А 3 и 4 классов нет вообще. Нули.

    screenshot.jpg

    А это сам скрипт.
    Посмотреть вложение __s_Koh_simple.mq4


    Какие будут предложения, соображения, обсуждения?
     
  18. njel

    njel Новичок

    мало нейронов. И входы бесполезные. Результата не будет вообще.
     
  19. лёксус

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

    Все три раза согласен. =)
    Создавал ветку, чтобы коллективно решить проблему. Чтобы нейронов было сколько нужно. Чтобы входы были супер. Чтобы был результат (пусть не супер, хотя бы просто хороший результат).

    До текущего момента содержание ветки:
    1. Краткий вводный (но достаточный) ликбез по нейро
    2. Ещё более краткое (но для поставленной задачи тоже вполне досточное) описание проблем.
    3. Пример работающей сетки.

    А начиная с текущего момента, думаю, уже должна пойти практическая работа. На этом форуме вообще заинтересованные в данной теме программисты есть? Хотя, не обязательно и программисты...

    Вопрос. Имея сетку(и), результативность которой, как у предъявленного образца, можно ли построить работающую систему?
    Ответ. Разумеется, нет. Зрительное ощущение работоспособности. Не более. Владельцы нечта подобного могут тешить себя иллюзиями до конца своих дней. Развлечений можно получить массу, толку - ноль.

    А кому-то, кроме меня, интересно построить работающую систему с использованием нейросетей?
    Скажу честно, у меня в башке бардак, я немножко утонул в вариантах подготовки входных данных. Их много, а надо выбрать пару-тройку (а может единственный) вожможных (правильных) вариантов подготовки данных, как и самих данных, собссно.
     
  20. Марк Аврелий

    Марк Аврелий Активный пользователь

    Лёксус, конечно интересно, тока вот большинство раз молчит - значит ничего не понимает. Я в том числе))))
    Так что, продолжай, жутко интересно.
     

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