기고글 토론 "신경망 네트워크: 이론에서 실전까지" - 페이지 6

 
fyords: 물론이 스레드에서 신경망의 미묘함에 대해 논의하는 것에 반대하는 것은 아니지만 원래이 기사는 초보자를 위해 계획되었습니다. 이러한 세부 사항은 초보 신경망 전문가를 혼란스럽게 할 수 있기 때문에 일부 세부 사항은 생략했습니다. 물론이 기사에서는 신경망을 훈련 (피팅)하는 다양한 방법을 지정하지는 않지만 초기 단계에서는 필요하지 않습니다. 신경망이 그렇게 어렵지 않다는 것을 깨닫는다면 "이것은 매우 어렵고 나에게 적합하지 않다"고 외면 할 변명을주지 않습니다. 더 많은 것을 알고 있다면 다행이지만, 이 글은 아마도 여러분에게 적합하지 않을 것입니다.

지금까지 제가 위에서 질문한 세부 사항이 없어서 일반인인 저를 당황하게 만들었습니다. 기사를 세 번이나 다시 읽었지만 포럼에서만 필요한 답변을 찾았습니다.

fyords: 현재 두 번째 부분에서는 다층 신경망 작업을 다룰 것입니다. 내용에 대해 바라는 점이 있으면 간단히 적어주세요.
단 한 가지 질문이 궁금합니다. "외부" 최적화 프로그램을 사용하지 않고도 할 수 있는 자가 학습 프로그램을 만드는 방법입니다. 물론 이 단계에서 그런 것이 가능하다면요.
 
fyords:

약간의 심의 끝에 기사의 두 번째 부분을 작성하기로 결정했습니다.

현재 두 번째 부분에서는 다층 신경망을 사용한 작업을 다룰 것입니다.
내용에 대해 바라는 점이 있으면 간단히 적어주세요.
제가 손가락으로 전달할 수 있는 아이디어는 기사에 설명되어 있습니다.

감사합니다.

손가락으로 설명하는 그라디언트 학습 방법을 보고 싶습니다.
 
Yedelkin:

저는 러시아어 원어민들 사이에서 독립적인 학습 과정을 "매개변수 맞추기"라고 부르는 것이 관습이 아니라고 "순진하게 가정"합니다. 뿐만 아니라 모든 시스템에 대한 매개 변수 선택 (외부 프로세스의 도움으로)을 학습이라고 부르는 것은 허용되지 않습니다.

피팅을 어떻게 부르든 피팅이 멈추지 않을 것입니다.

비고정 데이터를 다루는 신경망에 대한 최적화, 피팅, 학습은 동의어입니다. 세 용어 모두 신경망 출력의 오류를 최소화하기 위해 과거의 과거 데이터(학습 샘플)에 대한 가중치 계수를 선택하는 것을 의미하기 때문입니다. 미래 데이터를 그리드에 공급할 수 있다면 다른 문제가 될 수 있습니다. 하지만 아직 사무기기 판매점에서는 타임머신을 판매하지 않기 때문에 과거를 맞춰야 합니다.

 
Reshetov:

피팅이라고 부르는 것이 무엇이든, 그것은 피팅으로 끝나지 않을 것입니다.

재교육은 원초적인 방식으로 정의됩니다. 따라서 거울을 탓할 필요는 없습니다.
 
Yedelkin:

'외부' 최적화 프로그램을 사용하지 않고도 할 수 있는 자가 학습 프로그램을 만드는 방법은 단 한 가지 질문입니다. 물론 이 단계에서 그러한 것이 가능하다면 말이죠.

간단합니다. EA 코드에는 네트워크 자체와 가중치 최적화기가 포함될 수 있으며, 새로운 데이터가 도착하면 자동으로 실행될 수 있습니다. 대부분의 경우 신경망이란 이러한 자가 학습 네트워크를 의미합니다. 예를 들어 테스터 최적화 프로그램에 의해 외부에서 훈련된 네트워크는 장난감에 불과합니다.

 
여러분, 도와주세요! 네트워크의 전체 훈련 기간 동안 입력 데이터의 정규화를 수행해야한다는 것을 올바르게 이해 했습니까? 전체 기간에서 xi의 최대값과 최소값을 가져와야 한다는 뜻인가요?
 
net:
여러분, 도와주세요! 네트워크의 전체 훈련 기간 동안 입력 데이터의 정규화를 수행해야한다는 것을 올바르게 이해 했습니까? 전체 기간에서 xi의 최대값과 최소값을 구해야 한다는 뜻인가요?
전체 훈련 샘플에서 필요합니다.
 
//+------------------------------------------------------------------+
//|macd-neuro-example.mq5 |
//| 저작권 2012, MetaQuotes Software Corp.
//|http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+

#define SIZE 1000

#include <Trade\Trade.mqh>        //거래 작업 수행을 위한 라이브러리 연결
#include <Trade\PositionInfo.mqh> //위치에 대한 정보를 얻으려면 라이브러리에 연결합니다.
#include <Indicators/TimeSeries.mqh>

//--- 가중치 계수 값 
input double w0=0.5;
input double w1=0.5;
input double w2=0.5;
input double w3=0.5;
input double w4=0.5;
input double w5=0.5;
input double w6=0.5;
input double w7=0.5;
input double w8=0.5;
input double w9=0.5;
input double w10=0.5;
input double w11=0.5;
input double w12=0.5;

string            my_symbol;         // 문자를 저장할 변수
double            inputsH[13];        // 입력 신호 저장용 배열
double            inputsL[13];        // 입력 신호 저장용 배열
int               periods[13]={2,3,5,8,13,21,34,55,89,144,233,377,610};
int B,Ba;
double            weight[13];        // 가중치 계수 저장용 배열
double High[SIZE],Low[SIZE];

CTrade            m_Trade;           // 거래 작업 수행을 위한 객체
CPositionInfo     m_Position;        // 위치 정보를 위한 객체
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit()
  {

   weight[0]=w0;
   weight[1]=w1;
   weight[2]=w2;
   weight[3]=w3;
   weight[4]=w4;
   weight[5]=w5;
   weight[6]=w6;
   weight[7]=w7;
   weight[8]=w8;
   weight[9]=w9;
   weight[10]=w10;
   weight[11]=w11;
   weight[12]=w12;

   my_symbol=Symbol();
   B=Bars(my_symbol,0);

//--- 반환 0, 초기화 완료
   return(0);
  }
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| 전문가 틱 기능|
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);                   // 최고의 구매 제안
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);                   // 베스트 오퍼 판매

   B=Bars(my_symbol,0);
   if(B!=Ba)
     {
      CiHigh hi;
      CiLow li;
      hi.Create(_Symbol,_Period);
      li.Create(_Symbol,_Period);
      hi.GetData(0,SIZE,High);
      li.GetData(0,SIZE,Low);
     }
   Ba=B;

     {
      for(int i=0; i<13; i++)
        {
         int HB = ArrayMaximum(High,SIZE-periods[i],periods[i]);
         int LB = ArrayMinimum(Low, SIZE-periods[i],periods[i]);
         if(Bid>=High[HB]) inputsH[i] =1;
         else inputsH[i]=0;
         if(Bid<=Low[LB]) inputsL[i]=1;
         else inputsL[i]=0;
        }

      double outH=CalculateNeuron(inputsH,weight);
      double outL=CalculateNeuron(inputsL,weight);

      //--- 뉴런 출력 값이 0보다 작은 경우
      if(outL>0)
        {
         //--- 이 문자에 대한 위치가 이미 있는 경우
         if(m_Position.Select(my_symbol))
           {
            //--- 이 포지션의 유형은 매도이고 청산합니다.
            if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);
            //--- 그리고 이 포지션의 유형이 매수인 경우 종료합니다.
            if(m_Position.PositionType()==POSITION_TYPE_BUY) return;
           }
         //--- 여기에 도착했는데 포지션이 없다면 열어보세요.
         m_Trade.Buy(0.1,my_symbol);
        }
      //--- 뉴런 출력 값이 0보다 크거나 같은 경우
      if(outH>0)
        {
         //--- 이 문자에 대한 위치가 이미 있는 경우
         if(m_Position.Select(my_symbol))
           {
            //--- 이 포지션의 유형은 매수이고 청산합니다.
            if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);
            //--- 그리고 이 포지션의 유형이 매도인 경우 종료합니다.
            if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
           }
         //--- 여기에 도착했는데 포지션이 없다면 열어보세요.
         m_Trade.Sell(0.1,my_symbol);
        }

      if(outH>0.0 || outL>0) Print(outH,"    ",outL);
     }

  }
//+------------------------------------------------------------------+
//|| 뉴런 계산 함수|
//+------------------------------------------------------------------+
double CalculateNeuron(double &inputs[],double &w[])
  {
//--- 입력 신호의 가중 합계를 저장하는 변수
   double NET=0.0;
//--- 루프에서 입력 수에 따라 입력의 가중 평균 합을 구합니다.
   for(int n=0;n<ArraySize(inputs);n++)
     {
      NET+=inputs[n]*w[n];
     }
//--- 입력의 가중 평균 합계에 가산 계수를 곱합니다.
   return(ActivateNeuron(NET));
  }
//+------------------------------------------------------------------+
//|| 뉴런 활성화 기능|
//+------------------------------------------------------------------+
double ActivateNeuron(double x)
  {
//--- 활성화 함수 결과를 저장하기 위한 변수
   double Out;
쌍곡선 탄젠트 함수 //---
   Out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
//--- 활성화 함수의 값을 반환합니다.
   return(Out);
  }
//+------------------------------------------------------------------+

제가 이 부엉이를 썼습니다. 의심이 들기 때문에 신경망이라고 말할 수 있습니까?

채널에서 거래하는 올빼미.

알고리즘은 다음과 같습니다 : 피보 바 수 (2,3,5,8,13....)에 대해 극한값을 취합니다. 예를 들어, 매수할 각 뉴런에 대해 가격이 한 기간 동안 극값 LOW의 가격보다 낮거나 같으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 또한 NeuronMACD의 예에서와 같이. 판매하려면 - 반대를 미러링하십시오.

코드와 알고리즘에 대한 비판을 기다리고 있습니다.

 
dimeon:

제가 이 부엉이를 썼습니다. 의심이 들기 때문에 신경망이라고 말할 수 있습니까?

채널에서 거래하는 올빼미.

알고리즘은 다음과 같습니다 : 피보 바 수 (2,3,5,8,13....)에 대해 극한값을 취합니다. 예를 들어, 매수할 각 뉴런에 대해 가격이 한 기간 동안 최저 극한 가격보다 낮거나 같으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 또한 NeuronMACD의 예에서와 같이. 판매하려면 - 반대를 미러링합니다.

코드와 알고리즘에 대한 비판을 기다리고 있습니다.

귀하의 경우 뉴런 활성화 기능을 버릴 수 있으며 불필요한 브레이크입니다.
return(NET);
신경망이 아니라 퍼셉트론 일뿐입니다. 네트워크에는 최소한 두 개의 퍼셉트론이 필요합니다.
 
her.human:
귀하의 경우 뉴런 활성화 기능이 불필요한 제동을 걸 수 있습니다.
return(NET);
신경망이 아니라 퍼셉트론일 뿐입니다. 네트워크에는 최소한 두 개의 퍼셉트론이 필요합니다.
MA나 다른 지표를 추가하는 것과 같은 예와 이 모든 것을 네트워크로 연결하는 방법을 알려주실 수 있나요?