"Новый нейронный" - проект Open Source движка нейронной сети для платформы MetaTrader 5. - страница 56

 
Urain:

Да, именно это и хотел узнать.

to mql5

ЗЫ сейчас больше всего волнует нужно ли будет копировать данные в специальные процессорные массивы или будут поддерживаться передача массива как параметр в обычной функции. Этот вопрос может принципиально изменить весь проект.

ЗЗЫ можете ответить в планах просто дать API OpenCL, или планируете оборачивать его в свои обёртки?

1) Если имеется ввиду память GPU, то да, будут специальные функции для копирования пользовательских массивов (туда/оттуда).
2) Будет обёртка, поддерживаться будут только HW GPU (с поддержкой OpenCL 1.1).
    Выбор из нескольких GPU если будет, то только через настройки терминала.
    OpenCL будет использоваться синхронно.
 
Urain:

Да, именно это и хотел узнать.

to mql5

ЗЫ сейчас больше всего волнует нужно ли будет копировать данные в специальные процессорные массивы или будут поддерживаться передача массива как параметр в обычной функции. Этот вопрос может принципиально изменить весь проект.

ЗЗЫ можете ответить в планах просто дать API OpenCL, или планируете оборачивать его в свои обёртки?

Судя по:

mql5:
Фактически можно будет пользоваться функциями библиотеки OpenCL.dll напрямую, без необходимости подключать сторонние DLL.

можно будет пользоваться функциями OpenCL.dll так, как будто это родные функции MQL5, а компилятор сам будет осуществлять перенаправления вызовов.

Исходя из этого можно сделать вывод, что функции OpenCL.dll можно закладывать уже сейчас (вызовы-пустышки).

Renat и mql5, правильно ли я понял "обстановку"?

 
joo:

Судя по:

можно будет пользоваться функциями OpenCL.dll так, как будто это родные функции MQL5, а компилятор сам будет осуществлять перенаправления вызовов.

Исходя из этого можно сделать вывод, что функции OpenCL.dll можно закладывать уже сейчас (вызовы-пустышки).

Renat и mql5, правильно ли я понял "обстановку"?

Работа с OpenCL в разработке. Отличия от использования OpenCL.dll напрямую будут.
 

Пока что у меня вырисовывается вот такая схема проекта:


Объекты прямоугольники, методы эллипсы.
 

методы процессинга разделяются на 4 категории:

метод параллельных расчётов
метод последовательных расчётов
метод расчётов активатора
метод расчётов операторов задержки

этими четырьмя методами описывается весь процессинг по всем слоям, методы импортируются в процессинг через объекты методов, которые наследуются от базового класса и перегружаются по необходимости в зависимости от типа нейрона.
 
Urain:

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

Забудь про OpenCL пока, без него бы что-нибудь достойное написать. Переложить всегда успеется, тем более штатной возможности пока нет.

 
TheXpert:

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

Забудь про OpenCL пока, без него бы что-нибудь достойное написать. Переложить всегда успеется, тем более штатной возможности пока нет.

Да фраза крылатая, и я уже почти согласился с ней в прошлый раз, но сделав анализ понял что не получится просто так планировать а потом когда нужно переделать под GPU, уж больно у него специфические потребности.

если планировать без GPU то логичным сделать объект Neuron, который будет отвечать как за операции внутри нейрона так и за присвоение данных расчёта в нужные ячейки памяти, удаследовав класс от общего предка можно было бы легко подключать нужный тип нейрона и так далее,

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

Но я подозреваю что тебя сбил с толку мой пост выше, там под "метод параллельных расчётов" подразумевается вполне конкретная операция перемножения входов с весами in*wg, под метод последовательных расчётов подразумевается sum+=a[i] ну и так далее.

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

 

Лекция 1 здесь https://www.mql5.com/ru/forum/4956/page23

Лекция 2 здесь https://www.mql5.com/ru/forum/4956/page34

Лекция 3 здесь https://www.mql5.com/ru/forum/4956/page36

Лекция 4 здесь https://www.mql5.com/ru/forum/4956/page46

Лекция 5 (последняя). Sparse Coding

Эта тема наиболее инетересная. Буду писать эту лекцию постепенно. Так что не забывайте заглядывать в этот пост время от времени.

В общих чертах, наша задача это представить ценовую котировку (вектор x) на последних N барах в виде линейного разложения на базисные функции (ряды матрицы A):

где s это коэффициенты нашего линейного преобразования, которые мы хотим найти и использовать в качестве входов на следующий слой нейроной сети (например, SVM). В большинстве случаев, базисные функции A нам известны, т.е. мы их заранее выбираем. Ими могут быть синусы и косинусы разных частот (получаем преобразование Фурье), функции Габора, Гамматоны, вейвлеты, кёрвлеты, полиномы или другие какие-либо функции. Если эти функции нам заранее известны, то sparse coding сводится к нахождению вектора коэффициентов s таким образом, что большое количество этих коэффициентов равны нулю (sparse vector). Идея тут состоит в том что большинство информационных сигналов имеют структуру, которая описывается меньшим количеством базисных функций чем количество выборок сигнала. Эти базисные функции входящие в разряжённое описание сигнала являются его необходимыми фиччами (features), которые можно использовать для классификации сигнала.

Задача нахождения разряжённого линейного преобразования исходной информации получило название Compressed Sensing (http://ru.wikipedia.org/wiki/Compressive_sensing). В общем случае, задача формулируется таким образом:

minimize L0 norm of s, subject to As = x

где L0 норма равняется количеству ненулевых значений вектора s. Самым распространённым методом решения этой задачи является замена L0 нормы на L1 норму, что составляет основу метода basis pursuit (https://en.wikipedia.org/wiki/Basis_pursuit):

minimize L1 norm of s, subject to As = x

где L1 норма вычисляется как |s_1|+|s_2|+...+|s_L|. Эта задача сводится к линейной оптимизации

 

Другой распространённый метод нахождения sparse vector s это matching pursuit (https://en.wikipedia.org/wiki/Matching_pursuit). Суть этого метода заключается в нахождении первой базисной функции a_i из заданной матрицы A таким образом что она вписывается во входной вектор x с наибольшим коеффициентом s_i по сравнению с другими базисными функциями.  После вычитания a_i*s_i из входного вектора, к полученному остатку вписываем следующую базисную функцию, и т.д. пока не достигнем заданной ошибки. Примером метода matching pursuit является слудующий индикатор, который вписывает одну синусоиду за другой во входную коритовку с наименьшим остатком: https://www.mql5.com/ru/code/130.

Если базисные функции A (словарь, dictionary) нам заранее неизвестны, то их нам нужно найти из входных данных x используя методы под общим названием dictionary learning. Это наиболее сложная (и для меня самая интересная) часть метода sparse coding. В предыдущей лекции я показал как эти функции можно например найти по правилу Оджи, что делает эти функции принципиальными векторами входной котировки. К сожалению, такой вид базисных функций не приводит к разряжённому описанию входных данных (т.е. вектор s - nonsparse).

Существующие методы dictionary learning, приводящие к разряжённым линейным преобразованиям, делятся на

  • вероятностные
  • кластерные
  • он-лайн 

Вероятностные методы нахождения базисных функций сводятся к максимизации максимального правдоподобия:

maximize P(x|A) over A. 

Обычно делается предположение что ошибка аппроксимации имеет Гауссовское распределение, что приводит нас к решению следующей задачи оптимизации:

(1) ,

которая решается в двух шагах: (1-sparse coding step) при фиксированных базисных функциях А, выражение в круглых скобках минимизируется по отношению к вектору s, и (2-dictionary update step) найденный вектор s фиксируется и выражение в круглых скобках минимизируется по отношению к базисным функциям А используя метод градиентного спуска:

(2)  

где (n+1) и (n) в суперскрипте обозначают номера итераций. Эти два шага (sparse coding step and dictionary learning step) повторяются пока не достигнут локальный минимум. Этот вероятностный метод нахождения базисных функций используется например в

Olshausen, B. A., & Field, D. J. (1996). Emergence of simple-cell receptive field properties by learning a sparse code for natural images. Nature, 381(6583), 607-609. 

Lewicki, M. S., & Sejnowski, T. J. (1999). Learning overcomplete representations. Neural Comput., 12(2), 337-365. 

Метод Оптимальных Направлений (MOD) использует те же два шага оптимизации (sparse coding step and dictionary learning step), но на втором шагу оптимизации (dictionary update step) базисные функции вычисляются путём приравнивания производной выражения в скобках (1) по отношению к А к нулю:

 ,

откуда получаем

(3) ,

где s+ - псевдообратная матрица. Это более точное вычисление базисной матрицы чем по методу градиентного спуска (2). Более подробно MOD метод описан здесь:

K. Engan, S.O. Aase, and J.H. Hakon-Husoy. Method of optimal directions for frame design. IEEE International Conference on Acoustics, Speech, and Signal Processing., vol. 5, pp. 2443-2446, 1999.

Вычисление псевдообратных матриц трудоёмко. Метод k-SVD избегает их вычисления. Пока в этом методе сам не разобрался. О нём можно прочитать здесь:

M. Aharon, M. Elad, A. Bruckstein. K-SVD: An Algorithm for Designing Overcomplete Dictionaries for Sparse Representation. IEEE Trans. Signal Processing, 54(11), November 2006.

С кластерными и он-лайн методами нахождения словаря тоже пока не разобрался. Интересующихся направляю к следующему обзору:

R. Rubinstein, A. M. Bruckstein and M. Elad, “Dictionaries for sparse representation modeling,” Proc. of IEEE , 98(6), pp. 1045-1057, June 2010.

Вот интересные видеолекции на эту тему:

http://videolectures.net/mlss09us_candes_ocsssrl1m/ 

http://videolectures.net/mlss09us_sapiro_ldias/ 

http://videolectures.net/nips09_bach_smm/ 

http://videolectures.net/icml09_mairal_odlsc/

Пока всё. По мере своих возможностей а также интереса от посетителей этого форума, буду расширять эту тему в следующих постах.

 
TheXpert:

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

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

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

Я это проверил многократно на своей многолетней практике управления проектами.

 
Renat:

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

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

Я это проверил многократно на своей многолетней практике управления проектами.

Так может примените свой многолетний опыт? Заодно покажете пример для подражания и профессионализм вместо высокомерного тона.
Причина обращения: