Что подать на вход нейросети? Ваши идеи... - страница 69

 
Ivan Butko #:

Вход — это ещё не сила сигнала

Силой его наделяют веса. Но само входное число априори уже(!) несёт в себе силовой элемент — свой количественный фактор.


Ранее я поднимал проблематику понимания входных данных. 

Подавая на вход число — мы уже изначально наделяем вход силовым значением. Это ошибка, ведь суть нашей НС - как раз найти силовой фактор и распределить его между входами. 

Не совсем понял, обучаешь с учителем?
 
Andrey Dik #:
Не совсем понял, обучаешь с учителем?

В МТ5 оптимизация. 

И с учителем в NeuroPro пробовал. 

Суть теоретической проблемы сводится к следующему:

Если входной диапазон от 0 до 1, то при сливных паттернах в верхнем диапазоне НС никогда не найдёт грааль, если он зарыт в числах нижнего диапазона, поскольку ей надо будет «заглушить» верхний, а при статических весах всё, что будет ниже — тоже пойдёт под нож. 

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

А если входной диапазон от -1 до 1, и грааль находится где-то посередине — тоже самое: НС заглушит крайние и грааль размоет.




А вот если создать модуль фильтрации, когда число 0.9 будет «превращаться» в 0.01, или в 0 вообще. А число 0.63 в 0.99 и так далее - то я предполагаю, что этот метод как минимум лучше, чем стандартный, как максимум - потенциальный. 

И уже эти числа подавать в НС, которая будет создавать правила работы с «очищенными» от шума входными данными. 

 
Ivan Butko #:


Суть теоретической проблемы сводится к следующему:

Если входной диапазон от 0 до 1, то при сливных паттернах в верхнем диапазоне НС никогда не найдёт грааль, если он зарыт в числах нижнего диапазона, поскольку ей надо будет «заглушить» верхний, а при статических весах всё, что будет ниже — тоже пойдёт под нож. 

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

А если входной диапазон от -1 до 1, и грааль находится где-то посередине — тоже самое: НС заглушит крайние и грааль размоет.


А вот если создать модуль фильтрации, когда число 0.9 будет «превращаться» в 0.01, или в 0 вообще. А число 0.63 в 0.99 и так далее - то я предполагаю, что этот метод как минимум лучше, чем стандартный, как максимум - потенциальный. 

И уже эти числа подавать в НС, которая будет создавать правила работы с «очищенными» от шума входными данными. 

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

Интересно, реализовать не сложно.

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

IMLP - improved MLP
 
Ivan Butko #:


Если входной диапазон от 0 до 1, то при сливных паттернах в верхнем диапазоне НС никогда не найдёт грааль, если он зарыт в числах нижнего диапазона, поскольку ей надо будет «заглушить» верхний, а при статических весах всё, что будет ниже — тоже пойдёт под нож. 

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

Ваша задачка легко решается:
Делите каждую фичу на нужное число диапазонов (на 3,5,10,50...) и подаете их как отдельные фичи. Каждому диапазону коэффициенты будут подбираться индивидуально.
Если у вас грааль в верхней трети спрятан, то он по этой отдельной фиче и найдется.

 
Andrey Dik #:

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

Интересно, реализовать не сложно.

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

IMLP - improved MLP

Да, это один из видов фильтрации

Самый лёгкий путь и одновременно самый эффективный: просто добавить условие "если". 
Если N1 < IN < N2, то IN = Filter[i];

Я так сделал циклом

double CalculateNeuron(double &in[],    double &w[])
  {
   double NET=0.0;

   for (int n = 0; n < ArraySize(in); n++)
     {
      NET += /*x[n] **/ W(in[n], w);
     }    
    
   return((NET     ));
  // return(ActivateNeuron(NET));
  }
double W(double in,   double &w[])
  {
    double x = MathAbs(in);
  //  double x = in;
    
    double r1 = 1.0;
    double r2 = 1.0;
    double z  = 0.0125;           // затрагивает весь диапазон от 0 до 1
   // double z  = 0.00625;          // диапазон от 0.5 до 1
   // double z  = 0.003125;         // диапазон от 0.75 до 1
   // double z  = 0.0015625;        // диапазон от 0.875 до 1
   // double z  = 0.00078125;       // диапазон от 0.9375 до 1
   // double z  = 0.000390625;      // диапазон от 0.96875 до 1
   // double z  = 0.0001953125;     // диапазон от 0.984375 до 1
    r2 -= z;
    
    double res;
    
    int i = 0;   
   
    if (x >= r1)              res = w[i]; 
    for (i = 1; i < 80; i++)
      {
        if (x < r1 && x >= r2)    res = w[i];    r1 -= z;    r2 -= z;
      }
    if (x < r1 && x > 0)    res = w[i];    r1 -= z;    r2 -= z;

    if (in < 0) res = -res;      // если на вход попало минусовое число — скорректированное также умножаем на (-1)
    
    return res;
  }


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

Этот способ — самая быстрая подгонка (переобучение), которое может быть. Хотя нет, на первом месте Q-таблица, а этот способ на втором. 

MLP же — очень... очень специфический инструмент для форекса. Мне даже кажется, что он — деструктивный. 


Forester #:

Ваша задачка легко решается:
Делите каждую фичу на нужное число диапазонов (на 3,5,10,50...) и подаете их как отдельные фичи. Каждому диапазону коэффициенты будут подбираться индивидуально.
Если у вас грааль в верхней трети спрятан, то он по этой отдельной фиче и найдется.

Мне кажется примерно так я и делал
[Удален]  
Эволюция ИИ по версии форума. Перцептрон Розенблатта -> нейрон Решетова -> нейрон Бутко 😄

Решетов пока что впереди. Он написал даже отдельный софт :)
 
Maxim Dmitrievsky #:
Эволюция ИИ по версии форума. Перцептрон Розенблатта -> нейрон Решетова -> нейрон Бутко 😄

Решетов пока что впереди. Он написал даже отдельный софт :)

ну не любят люди читать (даже азы) , что тут поделать.


Зато могут три года тренировать нейронки итд.. а потом слышыш от них вопросы типа "чем отличсеться классификация от кластеризации ?" и выпадаешь в осадок.

[Удален]  
Вводите в нейронные сети нормализованные, структурированные данные, соответствующие вашей задаче, например изображения, текст или числовые данные. Предварительная обработка функций для согласованности, обеспечивающая совместимость с архитектурой модели и целями.
[Удален]  
mytarmailS #:

ну не любят люди читать (даже азы) , что тут поделать.


Зато могут три года тренировать нейронки итд.. а потом слышыш от них вопросы типа "чем отличсеться классификация от кластеризации ?" и выпадаешь в осадок.

Читать долго и сложно :) 
 
Maxim Dmitrievsky #:
Эволюция ИИ по версии форума. Перцептрон Розенблатта -> нейрон Решетова -> нейрон Бутко 😄

Решетов пока что впереди. Он написал даже отдельный софт :)
Апхпхаха

Neuron Butko - а так меня будут читать зарубежные юзеры в автопереводе

След в истории оставлен, можно уходить