"New Neural" es un proyecto de motor de red neuronal de código abierto para la plataforma MetaTrader 5. - página 54

 
TheXpert:
Propongo que el primero implemente el eco o el SOM a lo largo del camino y las interfaces pueden ser finalizadas.

Vamos, ¿qué está más cerca de ti?

La más sencilla sería MLP.

 
Urain:
Vamos, ¿qué está más cerca de ti?
Más cerca del eco, más ligero al SOM. Probablemente sea mejor el SOM, porque se puede hacer con o sin profesor.
 
TheXpert:
Eco más cercano, SOM más ligero. Probablemente sea mejor que SOM, porque se puede hacer con o sin profesor.

SOM es así.

1. inicialización de la malla
2. carrera de trabajo de la malla
3. malla didáctica

¿Quién hace qué?

¿O tal vez deberíamos ajustar primero la jerarquía de clases?

 
Urain:

Estuve pensando en cómo hacer que durante el entrenamiento nacieran nuevas neuronas en los lugares adecuados, pero tras estudiar los algoritmos llegué a la conclusión de que no tendrían una formalización común, prácticamente no hay puntos de intersección. Por eso me negué y me concentré en construir una red vertical. Tipo:

Datos --> neurona --> red neuronal encapsulada --> red neuronal contenedora

Es posible hacer que los AG sean amorfos. El genoma humano no siempre ha estado formado por 28.000 genes.

Ouch...

 
joo:
Oh, estás en línea. Respuesta sobre la topología.
 

Primeras estimaciones

class IEvolvable // интерфейс для подключения эволюционных алгоритмов
{
public:
   virtual void GetWeightsAsVector(double& weights[]) const; // получаем все изменяемые веса собранные в одном векторе для генетики
   virtual void ApplyWeightsVector(double weights[]); // применяем подобранные генетикой веса к сети
   
   virtual void FeedInput(double inData[]); // подаем вход
   virtual void PropagateSignal(); // прогоняем входной сигнал
   virtual void GetOutput(double& outData[]) const; // берем выход
};

class ISerializable // сохранение
{
public:
   virtual bool LoadFromFile(string filePath);
   virtual bool SaveToFile(string filePath) const;
};

class IBasicNet
   : public IEvolvable
   , public ISerializable
{
public:
   virtual void FeedInput(double inData[]); // вход можно брать из коллекции или отдельно. Подразумевается, что коллекция включает в себя обработку входов, поэтому отдельные входы надо преобразовывать коллекцией
   virtual void FeedInput(int index);
   virtual void PropagateSignal();
   virtual void GetOutput(double& outData[]) const;
   virtual void Init(); // инициализация. Инициализатор можно подавать в конструкторе, можно в функцию, посмотрим как будет удобно
}

class ISupervised // сеть с учителем
   : public IBasicNet
{
public:
   virtual void SetPatternCollection(PatternCollection* collection); // у сетей с учителем обязательно каждому входному образу соответствует выходной поэтому лучше их сразу организовывать по парам
   virtual void CountError(); // подсчет ошибки. сюда например будет входить ОРО для MLP
   virtual void Learn(); // изменение весов. никаких итераций внутри, чтобы можно было на каждом шаге просмотреть состояние
};

class IUnsupervised // сеть без учителя
   : public IBasicNet
{
public:
   virtual void SetInputCollection(InputCollection* collection); // у сетей без учителя только входы
   virtual void Learn();
};

class IInitializer // инициализатор
{
public:
   virtual void Init(double& value);
   virtual void Init(double& value[]);
   virtual void Init(Matrix& value);
};

 
TheXpert:
Oh, estás en línea. Respuesta sobre la topología.
Para mí, la gestión de la topología puede y debe considerarse como una programación genética. Aquí no soy muy fuerte - es una vasta área de conocimiento aparte. Pero, si es necesario, retomaré esta cuestión de cerca. Es un AG en el que la longitud del cromosoma puede cambiar dinámicamente. En mi AG, la longitud del cromosoma es fija. Aunque es posible sortear esto introduciendo banderas adicionales para congelar genes individuales y tomar la longitud del cromosoma con una reserva.
 
TheXpert:

Primeras estimaciones

Poner algún comentario
 
joo:
Ese es el "oops" que es.
Bien, por ahora, hay una forma de evitar el problema, lo pensaremos cuando hagamos la genética.
 
Urain:
Este es el siguiente paso y no está directamente relacionado con el motor, su implementación es a través de un GA externo que crea diferentes topologías, esas inicializan objetos de diferentes motores.

Y sí, probablemente deberías usar más de un AG. Uno para la topología y otro para ajustar todos los pesos de todas las redes. Entonces el segundo AG sólo congelaría algunos de los genes dependiendo de la topología actual.