記事"Neural Networks: From Theory to Practice"についてのディスカッション - ページ 6

 
fyords: もちろん、このスレッドでニューラルネットワークの機微について議論することに反対しているわけではないが、もともとこの記事は初心者向けに企画されたもの だ。なぜなら、そのような詳細は初心者のニューラルネットワーク研究者を混乱させる可能性が あるからだ。もちろん、この記事にはニューラルネットワークの様々なトレーニング(フィッティング)方法は明記されていないが、最初の段階では必要ない。ニューラルネットワークがそれほど難しいものではないとわかったとしても、「これはとても難しいし、私には向かない」と目を背ける口実にはならない。もっと詳しいのであれば、それは素晴らしいことだが、その場合、この記事はあなたには向かないだろう。

今のところ、私が上で質問したような詳細がないことが、普通の間抜けである私を呆然とさせている。 記事を3回読み直したが、必要な答えはフォーラムでしか見つけられなかった。

fyords 今のところ、第2部では多層ニューラルネットワークを使った作業を取り上げる予定です。 その内容について何か希望があれば、簡単に書いてください。
外部」オプティマイザを使わなくてもできる自己学習 プログラムを作るにはどうしたらいいかということです。もちろん、現段階でそのようなことが可能であればの話ですが。
 
fyords:

検討の結果、後編を書くことになった。

今のところ、後編は多層ニューラルネットワークを使った仕事を取り上げる予定です。
その内容について何か希望があれば、簡単にでも書いてください。
私の指で伝えることができそうなアイデアは、記事に記載する予定です。

ありがとうございます。

勾配学習法を指で説明してほしい。
 
Yedelkin:

私は、ロシア語を母国語とする人々の間では、独立した学習のプロセスを「パラメータ・フィッティング」と呼ぶ習慣はないと「素朴に推測」している。それと同様に、どのようなシステムであれ、(外部プロセスの助けを借りて)パラメータを選択することを学習と呼ぶことは認められていない。

フィッティングをどのように呼ぼうと、フィッティングでなくなることはない。

非定常データを扱うニューラルネットワークの最適化、フィッティング、学習は同義語である。なぜなら、この3つの用語はすべて同じ意味だからである。ニューラルネットワークの出力の誤差を最小化するために、過去の履歴データ(トレーニングサンプル)の重み付け係数を選択することである。もし、未来のデータをグリッドに供給することが可能なら、話は別だ。しかし、事務機器店にはまだタイムマシンは売っていないので、過去に合わせるしかない。

 
Reshetov:

フィッティングを何と呼ぼうと、それがフィッティングでなくなることはない。

再訓練は初歩的な方法で定義されている。だから鏡のせいにすることはない。
 
Yedelkin:

それは、"外部 "オプティマイザーを使わなくてもできる自己学習 プログラムをどう作るか、ということだ。もちろん、現段階でそのようなことが可能であればの話だが。

簡単なことだ。EAのコードにネットワークそのものとその重みのオプティマイザを含めることができ、新しいデータが届いたときに自動的に起動させることができる。ニューラルネットワークとは、ほとんどの場合、自己学習型ネットワークのことを指す。例えばテスター・オプティマイザーによって外部から学習されたネットワークはおもちゃである。

 
みんな、助けてくれ!入力データの正規化は、ネットワークの全トレーニング 期間に対して行う必要があるということですが、正しく理解できましたか?つまり、xiの最大値と最小値は、全期間から取得する必要があるということですか?
 
net:
みんな、助けてくれ!入力データの正規化は、ネットワークの全トレーニング期間に対して行う必要があるということですが、正しく理解できましたか?つまり、xiの最大値と最小値は全期間から取らなければならないということですか?
全トレーニングサンプルに対して行う必要があります。
 
//+------------------------------------------------------------------+
//|macd-neuro-example.mq5
//| Copyright 2012, MetaQuotes Software Corp.
//|http://mql5.commql5.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);

//--- 初期化完了
   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))
           {
            //--- そしてこのポジションのタイプはSellである。
            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);
            //--- そして、このポジションのタイプがSellであれば、終了する。
            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...)だけ取られる。さらに、NeuronMACDの例と同じように - 0を返します。売却する - 逆をミラーリングします。

私は、コードとアルゴリズムの批判を待っています。

 
dimeon:

このフクロウは私が書いた。ニューラルネットワークと言えるのだろうか?

チャネルで取引するためのフクロウ。

アルゴリズムは以下の通り:極値がフィボ・バーの数(2,3,5,8,13...)だけ取られる。さらに、NeuronMACDの例と同じように、価格が1期間のLOW極値の価格を下回るか等しい場合、我々は1を返す - 0。売りの場合は、その逆。

私は、コードとアルゴリズムに対する批判を待っています。

あなたのケースでは、ニューロンの活性化の機能を捨てることができ、それは不必要なブレーキです。
return(NET);
それはニューラルネットワークではなく、ただのパーセプトロンです。ネットワークには少なくとも2、3のパーセプトロンが必要です。
 
her.human:
あなたの場合、ニューロン活性化機能は不要なブレーキである。
return(NET);
これはニューラルネットワークではなく、ただのパーセプトロンだ。ネットワークには少なくとも2、3のパーセプトロンが必要です。
例えば、MAや他のインジケーターを追加するとか、どのようにネットワーク化するのか、例を挙げてもらえますか?