Как не "перетренировать" НС - страница 3

 
StatBars писал(а) >>

ну вот на 80 сигналов около 160 реально значимых точек(которые влияют на все Ваши критерии оценки) все остальные точки могут быть где угодно, главное чтоб они на позиции не влияли... Я веду к тому что реальная выборка около 160 примеров а не 4000...

Если сеть оптимизируется на более чем 1 критерий, то как Вы эту задачу решили? - просто интересен метод.

что-то я запутался...

на 4.000 баров 3.920 раз "побеждает" один выходной сигнал, 80 раз другой. Про числоо 160 я не совсем понял, откуда берется.

Если считать по формуле, приведенной Нейтроном, то количество синапсов в сети с входом 17, скрытым 34 и выходом в получается (17*34) + (34*2) = 646. Popt=k*w*w/d при k=1 получается 646 * 646 / 17 = 24.548. Можно попробовать, хотя придется гонять комп недели две, пока получится что-то вразумительное...

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

public static BigDecimal getBenchmark(GenInfo gi) {
BigDecimal e = gi.performance.result;
if(Main.getPhase() == Main.PHASE_RESULT) {
//В фазе 1 оптимизация только по результату
return e;
}

java.util.Vector <BigDecimal> v = new java.util.Vector();
//Доля прибыльных позиций в общем количеству позиций
v.add(new BigDecimal((double)gi.performance.profitableTrades/(double)gi.performance.totalTrades).setScale(5, BigDecimal.ROUND_HALF_UP));
//Доля прибыли в "обороте" (turnover = прибыль + проигрыш.abs())
v.add(gi.performance.totalProfit.divide(gi.performance.turnover, BigDecimal.ROUND_HALF_UP));
//Средняя просадка по позиции (чем меньше, тем лучше)
double d = gi.performance.avgOrderDrawdown.doubleValue() + 1;
if(d == 1) {
v.add(new BigDecimal(1));
} else {
v.add(BigDecimal.ONE.setScale(5).divide(new BigDecimal(Math.log(d)), BigDecimal.ROUND_HALF_UP));
}
//Максимальная просадка по позиции (чем меньше, тем лучше)

d = gi.performance.maxOrderDrawdown.doubleValue() + 1;
if(d == 1) {
v.add(new BigDecimal(1));
} else {
v.add(BigDecimal.ONE.setScale(5).divide(new BigDecimal(Math.log(d)), BigDecimal.ROUND_HALF_UP));
}
//Максимальная продолжительность позиции (чем меньше, тем лучше)
v.add(BigDecimal.ONE.setScale(5).divide(new BigDecimal(Math.log(1 + gi.performance.maxTradeDuration)), BigDecimal.ROUND_HALF_UP));

//Количество прибыльных позиций
v.add(new BigDecimal(Math.log(1 + gi.performance.profitableTrades)));

for(int i = 0; i < v.size(); i++) {
if(gi.performance.result.signum() == 1) {
e = e.multiply(v.elementAt(i));
} else {
e = e.divide(v.elementAt(i), BigDecimal.ROUND_HALF_UP);
}
}

return e;
}

 
Тоже не понял немного формулу расчета оптимльного колличества выборки. А в вашем случае расчет синапсов ведется так. 17 входов если и один скрытый в 34 нейрона. получается 17*17+34*17+2*34=, это если на выходе 2 нейрона. Вы не посчитали еще что у каждого входного нейрона еще есть синапсы, равные числу входов
 
YDzh писал(а) >>

...количество синапсов в сети с входом 17, скрытым 34 и выходом в получается (17*34) + (34*2) = 646. Popt=k*w*w/d при k=1 получается 646 * 646 / 17 = 24.548. Можно попробовать, хотя придется гонять комп недели две, пока получится что-то вразумительное...

Да, уж... а, вы попробуйте уменьшить число нейронов в скрытом слое - глядишь и результат станет более вразумительным. Не понадобится выборка длиной 25000 отсчётов, тем более, что если учитывать возможную изменчивость рынка и на более короткой истории. Становится понятно, откуда растут ноги у проблемы несостоятельности сети в данном случае, да и время обучения сократится до приемлемого. Коэффициент k, как правило, выбирается равным 2-4.

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

P.S. У меня приемлемые результаты для двуслойной нелинейной сети получались при размерности входа d=100-200, число нейронов в скрытом слое 2, и одним на выходе. Покупка, если выход положителен и больше порога, продажа - отрицателен и меньше порога, вне рынка - в пределах порога. Такая НС оперативно реагирует на смену настроений на рынке. Действительно, P=2*2d*2d/d+2=8d=1000, т.е. достаточно короткая выборка.

 
YDzh писал(а) >>

что-то я запутался...

на 4.000 баров 3.920 раз "побеждает" один выходной сигнал, 80 раз другой. Про числоо 160 я не совсем понял, откуда берется.

Я говорю за те точки которые оказывают влияние на функцию приспособленности! их как я понял ровно 160 именно 160 раз происходит переключение между Buy/Sell - правильно? А оставшиеся 3840 значений гуляют(по числовой оси выхода) где захочеться никаким образом не отвечая за итоговый рез-ат! Да и к тому же налицо - несиметричность целевой функции...

По оптимизации не понял... Но всё равно все параметры должны оптимизироваться единовременно(Задача - "Как выбрать лучшего трейдера по многим показателям?")

 
Neutron писал(а) >>

Да, уж... а, вы попробуйте уменьшить число нейронов в скрытом слое - глядишь и результат станет более вразумительным. Не понадобится выборка длиной 25000 отсчётов, тем более, что если учитывать возможную изменчивость рынка и на более короткой истории. Становится понятно, откуда растут ноги у проблемы несостоятельности сети в данном случае, да и время обучения сократится до приемлемого. Коэффициент k, как правило, выбирается равным 2-4.

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

P.S. У меня приемлемые результаты для двуслойной нелинейной сети получались при размерности входа d=100-200, число нейронов в скрытом слое 2, и одним на выходе. Покупка, если выход положителен и больше порога, продажа - отрицателен и меньше порога, вне рынка - в пределах порога. Такая НС оперативно реагирует на смену настроений на рынке. Действительно, P=2*2d*2d/d+2=8d=1000, т.е. достаточно короткая выборка.

Ну положим, между одним и двумя нейронами на выходе большой разницы я не вижу. Мне просто чем-то нравится модель winner takes all, потому нейронов на выходе два :) Я просто как-то прочитал на одном сайте, связанном с Encog, следующее: дескать каким должен/должны быть размер/ы скрытого слоя/слоев, сказать сложно. Есть некие ориентиры:

  • The number of hidden neurons should be in the range between the size of the input layer and the size of the output layer.
  • The number of hidden neurons should be 2/3 of the input layer size, plus the size of the output layer.
  • The number of hidden neurons should be less than twice the input layer size.

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

Можно будет попробовать - в принципе-то стараемся обобщить входную информацию до двух сигналов... Да и перспектива увеличения количества входных нейронов манит :)

 
Neutron писал(а) >>

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

Вот, вспомнил, пробовал некоторое время назад разные ванианты: кратность скрытого слоя от 1 до 3, один скрытый слой, два... С двумя скрытыми слоями сетка врала, с фактором 1 тоже... Хотя алгоритмы тренировки были тогда другими...

 

Понятно.

Тоже перебрал многие алгоритмы тренировок сети - наигрался в усмерть! пока не остановился на самом простом и действенном -ОРО. Сейчас подаю на вход только знак интересующих величин, это позволило сократить число эпох обучения с нескольких сотен до нескольких десятков без потери точности прогноза НС, что в свою оередь, позволило практически решать проблему прогноза приращений котира на имеющихся мощностях.

 
Neutron писал(а) >>

Понятно.

Тоже перебрал многие алгоритмы тренировок сети - наигрался в усмерть! пока не остановился на самом простом и действенном -ОРО. Сейчас подаю на вход только знак интересующих величин, это позволило сократить число эпох обучения с нескольких сотен до нескольких десятков без потери точности прогноза НС, что в свою оередь, позволило практически решать проблему прогноза приращений котира на имеющихся мощностях.

Для back propagation нужен ряд идеальных данных. В joone есть даже специальный класс, который занимается выделением этих данных. Но что-то не нравится мне...

Идея насчет знака, конечно, свежая... а какая точность прогноза, если не секрет? ;)

 
Хотелось бы услышать мнение знающих "матчасть" о размере скрытого слоя... Я даже где-то видел математические выкладки о его оптимальных размерах, но застрял в обилии формул и, если честно, ни черта не понял
 
YDzh писал(а) >>
Хотелось бы услышать мнение знающих "матчасть" о размере скрытого слоя... Я даже где-то видел математические выкладки о его оптимальных размерах, но застрял в обилии формул и, если честно, ни черта не понял

Конструктивный синтез многослойных сетей...

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

Естественно не следует бросаться в крайности, просто не делать "узкого горла" внутри сети...

YDzh писал(а) >>
Для back propagation нужен ряд идеальных данных. В joone есть даже специальный класс, который занимается выделением этих данных. Но что-то не нравится мне...

Идея насчет знака, конечно, свежая... а какая точность прогноза, если не секрет? ;)

Идеальные данные нужны при решении любой задачи, а точнее оптимальные, но это реально спорный вопрос...
Причина обращения: