Нейронная сеть в виде скрипта - страница 9

 
Andy_Kon писал (а) >>

На сколько важно точность для сигмоида?

После 20 точность в 9 знаке...


При обучении влияет. Иногда может очень серьезно влиять на сходимость, вплоть до необучения.

При использовании GA для обучения таких проблем быть не должно.

 
YuraZ писал (а) >>

3-что давать на вход ( тут понятно сколько входов )

4-когда переобучать

5-какой выбрать алгоритм обучения

GA - генетический

BP -


3. Действительно проблема, все зависит от фантазии :) .

4. Вот здесь можно схитрить. Сделать сеть со способностью забывать. Это не так сложно.

Допустим, можно сделать так (классно прокатит при обучении с помощью BP):

ограничить количество паттернов -- допустим 1000.

При появлении следующего паттерна (новый ТФ, допустим)

- удаляем самый старый

- делаем цикл обучения

- для появившегося нового паттерна прогоняем обучение раз 5.



Что получается?

+ Цикл обучения длится недолго.

+ старый паттерн забывается далеко не сразу

- новый паттерн обучается тоже не сразу, но

+ быстрее, чем забывается старый за счет агрессивного обучения (5 раз ПОДРЯД)

- подходит только для BP обучения



5. Это дилемма,

GA -- стабильно спускается к оптимуму, в силу свойств имеет защиту от локальных минимумов, но жрет много памяти, дико медленный.

BP -- не гарантирует результат, хотя вероятность очень велика (т.е. если GA способен обучить, то 95%, что BP тоже обучит), быстрее, не жрет памяти, но нуждается в наворотах типа моментума (избавление от локальных минимумов) и адаптивного шага (минимумы тоже проскакиваются, а также в разы увеличивается скорость обучения)



Я за BP.

 
TheXpert писал (а) >>

3. Действительно проблема, все зависит от фантазии :) .

4. Вот здесь можно схитрить. Сделать сеть со способностью забывать. Это не так сложно.

Допустим, можно сделать так (классно прокатит при обучении с помощью BP):

ограничить количество паттернов -- допустим 1000.

При появлении следующего паттерна (новый ТФ, допустим)

- удаляем самый старый

- делаем цикл обучения

- для появившегося нового паттерна прогоняем обучение раз 5.



Что получается?

+ Цикл обучения длится недолго.

+ старый паттерн забывается далеко не сразу

- новый паттерн обучается тоже не сразу, но

+ быстрее, чем забывается старый за счет агрессивного обучения (5 раз ПОДРЯД)

- подходит только для BP обучения



5. Это дилемма,

GA -- стабильно спускается к оптимуму, в силу свойств имеет защиту от локальных минимумов, но жрет много памяти, дико медленный.

BP -- не гарантирует результат, хотя вероятность очень велика (т.е. если GA способен обучить, то 95%, что BP тоже обучит), быстрее, не жрет памяти, но нуждается в наворотах типа моментума (избавление от локальных минимумов) и адаптивного шага (минимумы тоже проскакиваются, а также в разы увеличивается скорость обучения)



Я за BP.


это пример работы ГА

исходник на СИ...


по скорости ГА хвалят как быстрый

есть еще MGA - тот еще бодрее


---

ну по сути ГА или МГА это быстрый поиск максимума или минимума

по крайней мере специалисты METAQUOTES в тестере применили именно ГА для скорости, а не что то иное ...

Файлы:
dio.zip  4 kb
 
YuraZ писал (а) >>


по скорости ГА хвалят как быстрый

есть еще MGA - тот еще бодрее


---

ну по сути ГА или МГА это быстрый поиск максимума или минимума

по крайней мере специалисты METAQUOTES в тестере применили именно ГА для скорости, а не что то иное ...


ГА однозначно медленней BP.

Metaquotes применили его вполне правильно, поскольку ГА дико универсальная штука. И естественно он будет быстрее чем простой перебор.

Вопрос в другом, так же как и в нейронках -- буквы распознают не нейронками, а специализированными алгоритмами, FR сетей не использует.

Аналогично для обучения лучше использовать специализированные алгоритмы, они априори лучше.

 
TheXpert писал (а) >>

ГА однозначно медленней BP.

Metaquotes применили его вполне правильно, поскольку ГА дико универсальная штука. И естественно он будет быстрее чем простой перебор.

Вопрос в другом, так же как и в нейронках -- буквы распознают не нейронками, а специализированными алгоритмами, FR сетей не использует.

Аналогично для обучения лучше использовать специализированные алгоритмы, они априори лучше.

А откуда такие сведения, если не секрет? А как же тогда обучение FR на примерах?

И еще чем отличается (принципиально) специализированный алгоритм от обученной(натренированной) нейросети?

 
Sergey_Murzinov писал (а) >>

А откуда такие сведения, если не секрет? А как же тогда обучение FR на примерах?

И еще чем отличается (принципиально) специализированный алгоритм от обученной(натренированной) нейросети?

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

Зайдите на RSDN.ru и почитайте ветки, связанные с нейросетями. Там сидят далеко не глупые парни, кстати, думаю, и здесь можно найти парочку из них :) .


Насчет обучения на примерах, например, так:

- векторизируем (делаем скелет)

- считаем пересечения и их взаимное положение

- берем, допустим, пару первых коэффициентов преобразования Фурье, нормализовав предварительно для size insensitive. Кстати, с помощью FT можно добиться и rotate insensitive, ЕМНИП.

- усредняем для примеров

- заносим в базу как эталон


Чем отличается?

Когда используешь спец. алгоритм, ты знаешь, как это работает.

А как это делает нейросеть, ты не знаешь. Ты просто знаешь, что данная конкретная функция, заданная нейросетью, способна интерполировать входы в выходы с высокой степенью точности.

 

Даааааа!!!!!!!

Кстати RSDN.RU - форум программеров, а не разработчиков нейросетевых алгоритмов и их применения.

Для сведения сообщаю Вам что FineReader использует блоки нейросетевых технологий (последние версии). И еще для получения представлений по нейросетям советую почитать специальную (не научно-популярную) литературу и почитать ветки специализированных форумов.

И еще обученная сеть и есть спец алгоритм. Самый простой приме можно увидеть если сгенерировать C код в программе NeuroShell2. Код сети прекрасно виден.

 
Sergey_Murzinov писал (а) >>

Для сведения сообщаю Вам что FineReader использует блоки нейросетевых технологий (последние версии). И еще для получения представлений по нейросетям советую почитать специальную (не научно-популярную) литературу и почитать ветки специализированных форумов.

OK, можно ссылки по теме? просвещусь немного.
 

2 YuraZ

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

После детального разбора, как я понял, вы используете для ускорения расчетов метод нейронного смещения (массивы _threshold и _t_change), а также метод импульса (Momentum parameter).

У меня возникло несколько вопросов по её реализации.
1) В функции корректировки весов вы меняете _t_change, но затем нигде не используете эту корректировку для вычисления нового массива весов _threshold.

2) При передаче выходного сигнала в функцию сигмоида вы вычитаете из sum параметр _threshold, хотя как пишется в литературе, на этот пороговый вес подается не -1, а +1. А значит надо не отнимать, а прибавлять. Тем более, что при корректировке весов вы подаете именно +1 а не -1.
Вообще я побаловался с этим порогом и импульсом, и оказалось, что он реально помогает скорости расчетам. Время уменьшается в несколько раз.

3) Также меня заинтересовала функция сигмоида. Как я понял, такие его параметры обусловлены вашими практическими наработками в этой области, но думаю, что и вы читали книги Уссермена, где он пишет, что диапазон {0,1} не оптимален. Величина коррекции веса пропорциональна выходному уровню, а нулевой выходной уровень ведет к тому, что вес не меняется. А так как при двоичных входных векторах в среднем половина значений будет равна нулю, то и веса, с которыми они связаны, не будут обучаться!
Решение состоит в приведении входов к диапазону {-0.5,0.5} и добавлению смещения к сигмоиду также на величину 0.5. Такой сигмоид [1/(1+Exp(-х))-0.5], с диапазоном {-0.5,0.5} сокращает время сходимости на 30-50%. 
Единственная проблема в этом случае - приведение входного вектора к диапазону {-0.5,0.5}. Придется наверно нормировать. Я попытался это сделать, но почему-то результат сигмоида был всегда положительным. Хотелось бы услышать ваше мнение по этому вопросу.

4) Теперь что касается способа задания входов. Наверно стоит автоматизировать этот процесс. Что скажете на такой подход: На выходе как обычно будем ожидать значения 100, 010, 001. 
Чтоб автоматом задать массив выходов предлагаю для каждого бара определить отношение максимальной и минимальной цены на последующем промежутке (например, 5000 баров на минутках). Значение этого соотношения будут показателем, куда двинулась цена. Если оно в районе 1, то флет. Если больше 1, то вверх. Если от 0 до 1 то вниз. Хотя оптимальным для анализа мне кажется необходимо сделать не [0, +ЭЄ], а диапазон [-ЭЄ, -А; -А, A; А, +ЭЄ], что кстати будет соответствовать нашим выходным векторам
На вход сети будем подавать последние K значений N скользящих средних (или разница между MA и средней ценой бара). То есть всего входов будет N*K.  

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

P.S.
Я надеюсь, вы и дальше будете делиться своими разработками, поэтому есть небольшая просьба. Если вам не помешает, то уберите, пожалуйста, в параметрах редактора "Вставлять пробелы", а то немного сложно читать код. Жду новой версии. Возможны предложения по совместному тестированию.

Файлы:
 
sergeev писал (а) >>

2 YuraZ


2) При передаче выходного сигнала в функцию сигмоида вы вычитаете из sum параметр _threshold, хотя как пишется в литературе, на этот пороговый вес подается не -1, а +1. А значит надо не отнимать, а прибавлять. Тем более, что при корректировке весов вы подаете именно +1 а не -1.
Вообще я побаловался с этим порогом и импульсом, и оказалось, что он реально помогает скорости расчетам. Время уменьшается в несколько раз.

3) Также меня заинтересовала функция сигмоида. Как я понял, такие его параметры обусловлены вашими практическими наработками в этой области, но думаю, что и вы читали книги Уссермена, где он пишет, что диапазон {0,1} не оптимален. Величина коррекции веса пропорциональна выходному уровню, а нулевой выходной уровень ведет к тому, что вес не меняется. А так как при двоичных входных векторах в среднем половина значений будет равна нулю, то и веса, с которыми они связаны, не будут обучаться!
Решение состоит в приведении входов к диапазону {-0.5,0.5} и добавлению смещения к сигмоиду также на величину 0.5. Такой сигмоид [1/(1+Exp(-х))-0.5], с диапазоном {-0.5,0.5} сокращает время сходимости на 30-50%.
Единственная проблема в этом случае - приведение входного вектора к диапазону {-0.5,0.5}. Придется наверно нормировать. Я попытался это сделать, но почему-то результат сигмоида был всегда положительным. Хотелось бы услышать ваше мнение по этому вопросу.

2. Исходная формула выглядит так -- S[j] = Sum(i)(y[i]*w[i,j] - t[j]). Т.е. порог отнимается, именно поэтому его пороговым значением и назвали. А в формуле пересчета два минуса в итоге дают плюс, т.е. никакой ошибки в использовании порога и пересчете параметров нету.

Если я неправ, автор меня поправит.

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