"New Neural"은 MetaTrader 5 플랫폼용 신경망 엔진의 오픈 소스 프로젝트입니다. - 페이지 16

 

나는 프로젝트의 본질을 이해할 수 없습니다. 예를 들어 신경망 엔진이란 무엇입니까? 그리고 왜 다른 유형의 네트워크에 대해 동일해야 합니까? 일부 네트워크는 한 방향으로 효과적으로 "이동"하고 다른 네트워크는 다른 방향으로 이동합니다. 네트워크 구조에 대한 설명도 각각 다를 수 있습니다. 간단한 예를 들어 선형 방정식의 해를 구하십시오. 물론 모든 유형의 선형 시스템은 가우스라는 하나의 방법으로 해결할 수 있습니다. 그러나 계수 행렬의 구조를 알면 보다 효율적인 해결 방법이 있습니다. 네트워크 훈련 작업도 마찬가지입니다. 순방향 전파 네트워크는 역전파에 의해 훈련되고, 에코 네트워크는 최소 자승법에 의해 훈련되는 식입니다. 하나의 엔진 대신 여러 개의 엔진을 만드는 이유는 무엇입니까? 같은 일을 하면서 동시에 합의에 도달하기 위해 노력하는 프로그래머 팀이 필요한 이유는 무엇입니까? 이 경우 만장일치로 창의성이 저해됩니다. 다른 프로그래머가 표시기 및 조언자에서 호출할 수 있는 라이브러리 형태로 다른 네트워크의 코드를 작성하게 하십시오. 이 경우 프로젝트는 네트워크, 작동 방식 및 사용 예를 자세히 설명하는 기사와 함께 프로그래머에게 라이브러리 코드베이스로 코드를 보내는 현재 시스템과 다르지 않습니다. 여러 프로그래머가 동일한 네트워크를 독립적으로 코딩해도 괜찮습니다. 피드포워드 네트워크를 훈련하기 위한 수십 가지 옵션이 있습니다. 이 접근 방식을 사용하면 네트워크를 올바르게 설명하는 방법을 논의하는 데 많은 시간을 소비하는 대신 사람들이 이미 이러한 네트워크에 대한 코드를 만들기 시작할 것입니다. 예를 들어, 저는 에코 네트워크에 대한 Xpert의 기사를 읽는 데 매우 관심이 있습니다. 그러나 분명히 곧 그렇지는 않을 것입니다.

 
gpwr :

나는 프로젝트의 본질을 이해할 수 없습니다. 예를 들어, 신경망 엔진이란 무엇입니까? 그리고 다른 유형의 네트워크에 대해 동일해야 하는 이유는 무엇입니까?

우리는 다재다능함을 원합니다. 인테리어와 조립은 물론 다릅니다. 가능한 시각화 및 위원회로의 연결을 위해 통합이 필요합니다.

gpwr :

예를 들어, 저는 에코 네트워크에 대한 Xpert의 기사를 읽는 데 매우 관심이 있습니다. 그러나 분명히 곧 그렇지는 않을 것입니다.

글쎄요, 오픈 소스의 틀 안에서 아마 읽을 수 있을 겁니다 :).

척도 표현:


 

사실 그게 다에요 :)

네트워크 표현:


 

샘플 레이어 템플릿 :

 class LayerFunctional
{
        typedef boost::shared_ptr<Synapse> SynapsePtr;
        typedef std::vector<SynapsePtr> SynapseVector;
        typedef SynapseVector::iterator SynapseIterator;

public :
        typedef boost::shared_ptr<Vector> VectorPtr;
        typedef boost::shared_ptr<IPatternCollection> PatternsPtr;

public :
        LayerFunctional
                (         bool bAdaptiveStep
                        , double step
                        , size_t newSize
                        , bool bTUsed
                );

         void Init( const Initializer& initializer);

         void AddInputSynapse(boost::shared_ptr<Synapse> pSynapse);
         void RemoveInputSynapse(boost::shared_ptr<Synapse> pSynapse);

         void AddOutputSynapse(boost::shared_ptr<Synapse> pSynapse);
         void RemoveOutputSynapse(boost::shared_ptr<Synapse> pSynapse);

         void FwdPropagate();
         void BackPropagate();

         void ClearInputs();
         void ClearErrors();

         const size_t Size() const ;

         void SetSize(size_t newSize);

         const bool ThresholdsUsed() const ;
         void SetThresholdsUsed( bool used = false );

         const bool AdaptiveStepUsed() const ;
         void SetAdaptiveStepUsed( bool used = false );
         const double GetStep() const ;

         const VectorPtr GetInputs() const ;
         const VectorPtr GetOutputs() const ;
         const Vector& GetErrors() const ;
         const Vector& GetThresholds() const ;

         const PatternsPtr GetInputCollection() const ;
         const PatternsPtr GetOutputCollection() const ;


         void SetInputCollection(PatternsPtr patterns);
         void SetOutputCollection(PatternsPtr patterns);

         void FeedInputs(size_t patternIndex);
         void CompareOutputs(size_t patternIndex);

         void DoF(Vector& data);
         void DodF(Vector& data);

         void Learn();

         double CountAlpha();

        template< class Archive>
         void save(Archive & ar, const unsigned int version ) const
        {
        }

        template< class Archive>
         void load(Archive & ar, const unsigned int version )
        {
        }

private :
         bool m_bAdaptiveStep;

         double m_Step;

        size_t m_Size;
         bool m_bTAreUsed;

        Vector m_vT;
        Vector m_vErrors;
        VectorPtr m_pInputs;
        VectorPtr m_pOutputs;

        SynapseVector m_vInSynapses;
        SynapseVector m_vOutSynapses;

        PatternsPtr m_pInputCollection;
        PatternsPtr m_pOutputCollection;
};

이것은 MLP 구현에 대한 추정치이며 대부분이 일반 인터페이스에 맞습니다.

m_vInSynapses

레이어에 포함된 시냅스의 벡터입니다. 이 시냅스와 레이어 자체는 다음을 통해 연결됩니다.

m_pInputs

공유 버퍼. 따라서 버퍼의 변경 사항은 레이어의 개체와 시냅스 모두에서 즉시 볼 수 있습니다.

출력 시냅스는 출력 버퍼를 통해 동일한 방식으로 연결됩니다.

 

시냅스:

 class Synapse
{
        Synapse()
        {
        }

public :
        typedef boost::shared_ptr<Vector> VectorPtr;

public :
        Synapse(boost::shared_ptr<Vector> inputVector, boost::shared_ptr<Vector> outputVector);
        
         void AssignInput(boost::shared_ptr<Vector> inputVector);
         void AssignOutput(boost::shared_ptr<Vector> outputVector);

         void FwdPropagate();
         void BackPropagate(LayerFunctional* outLayer);

         double operator ()(size_t inIdx, size_t outIdx) const ;

         const Detail::Slice FromInput(size_t inIdx) const ;
         const Detail::Slice ToOutput(size_t outIdx) const ;

        size_t GetOutSize() const ;
        size_t GetInSize() const ;

         const Vector& GetErrors() const ;
         void ZeroErrors();

         void Init( const Initializer& initializer);
         void Learn(LayerFunctional* outLayer, const double & step);

         const VectorPtr GetInputs() const ;
         const VectorPtr GetOutputs() const ;

         void SetValues( const Synapse& other);

private :
        size_t m_InSize;
        size_t m_OutSize;

        Matrix m_vSynapses;
        Vector m_vErrors;

        VectorPtr m_pInBuffer;
        VectorPtr m_pOutBuffer;
};

시냅스에도 오류가 있습니다.

뉴런 오류는 임계값 학습을 위한 것이고 시냅스 오류는 시냅스 학습을 위한 것입니다.

음, 가중치의 실제 행렬(수동으로 설정할 수 있는 가중치의 존재 행렬이 여전히 좋은 방법으로 충분하지 않음) 및 계층과의 통신을 위한 버퍼입니다.

 

회로망:

 class Net
{
        typedef boost::shared_ptr<LayerFunctional> LayerPtr;
        typedef boost::shared_ptr<Synapse> SynapsePtr;
        
        typedef std::vector<LayerPtr> LayersVector;
        typedef std::vector<SynapsePtr> SynapsesVector;

public :
        Net();

         void AddLayer(size_t size, bool bTUsed)
         void AddLayer( const LayerPtr& pLayer);

        LayerPtr GetLayer(size_t index) const ;
        SynapsePtr GetSynapse(size_t index) const ;

         void ConnectLayers(LayerPtr& inLayer, LayerPtr& outLayer);
        size_t GetLayersCount() const ;

        size_t GetSynapsesCount() const ;

         void Init( const Initializer& initializer);

         void FeedInputs(size_t patternIndex);
         void FwdPropagate();
         void BackPropagate();
         void CountErrors(size_t patternIndex);
         void Learn();

        size_t GetLayerID( const LayerPtr& pLayer) const ;

         void save(Archive & ar, const unsigned int version ) const
         void load(Archive & ar, const unsigned int version )

private :
         struct Link;

        typedef std::vector<Link> LinksVector;

private :
        size_t m_LayersCount;
        size_t m_SynapsesCount;

        LayersVector m_vLayers;
        SynapsesVector m_vSynapses;
        LinksVector m_vLinks;
};

이것이 네트워크의 모습입니다.

 

가장 간단한 테스트에서 구성 및 사용:

 void XORTest()
{
        Net net;

        LayerPtr inLayer( new Layer<Functions::LinearFunction>( false , 0.2 , 2 , false ));
        LayerPtr hiddenLayer( new Layer<Functions::BiSigmoidFunction>( false , 0.2 , 3 , false ));
        LayerPtr outLayer( new Layer<Functions::LinearFunction>( false , 0.2 , 1 , false ));

        net.AddLayer(inLayer);
        net.AddLayer(hiddenLayer);
        net.AddLayer(outLayer);

        net.ConnectLayers(inLayer, hiddenLayer);
        net.ConnectLayers(hiddenLayer, outLayer);

        PatternsPtr inPattern( new PatternCollection<>( 2 ));
         // filling patterns

        PatternsPtr outPattern( new PatternCollection<>( 1 ));
         // filling patterns

        inLayer->SetInputCollection(inPattern);
        outLayer->SetOutputCollection(outPattern);

        Initializer initer( 0.1 );
        net.Init(initer);

        size_t count = 0 ;
         double Es = 0.0 ;

         do 
        {
                Es = 0.0 ;
                 for (size_t i = 0 ; i < 4 ; ++i)
                {
                        net.FeedInputs(i);
                        net.FwdPropagate();
                        net.CountErrors(i);
                        net.BackPropagate();
                        net.Learn();

                        Vector v(outLayer->Size());
                        v = outLayer->GetErrors();
                        v *= v;

                        Es += v.sum()/ 2.0 ;
                }

                ++count;
        } while (Es > 0.0001 && count < 10000 );
}

또한 일반적인 구성에 대한 템플릿을 만들 수 있습니다.

 
더엑스퍼트 :

그것은 그런 식으로 작동하지 않을 것입니다 :) 당신은 최소한 무엇을 취하고, 무엇을 가르치고, 어떻게 평가해야 하는지 알아야 합니다. 그리고 이것들은 손잡이로 정리되어야 합니다.

정확히. 그리고 나도 몰라. 또한 일반적으로 결합하기 매우 어려운 세트가 있습니다. 뉴런은 도구일 뿐입니다. 숙련 된 손에서 (최소한 Leonid가 있어야 함) 매우 강력합니다.

그가 상담을 원하는지 궁금합니다.

여기에 잠잠한 동안 작은 IMHO 궁극적으로 기능면에서 요구 사항을 완전히 충족하지만 다른 99%의 잠재 사용자에게는 완전히 부적합한 제품을 만드는 위험을 피해야 합니다.

청중에게 새로운 도구를 제공하는 것이 임무라면 터미널을 처음 여는 사람과 몇 년 동안 Quick을 사용해 온 사람, 거의 모든 사람을 위해 이상적으로 설계되어야 합니다. 2개의 더 높은 것을 가지고 있는 사람과 tspsh를 가지고 있는 사람.

인터페이스와 제품 자체는 레고 세트처럼 단순하고 이해하기 쉬워야 합니다.

 
미첵 :

청중에게 새로운 도구를 제공하는 것이 임무라면 터미널을 처음 여는 사람과 몇 년 동안 Quick을 사용해 온 사람, 거의 모든 사람을 위해 이상적으로 설계되어야 합니다. 2개의 더 높은 것을 가지고 있는 사람과 tspsh를 가지고 있는 사람.

글쎄, 이것을 위해서는 프로그래머가 아닌 유능한 사람이있는 것이 바람직합니다.
 
파파클라스 :
거래자들 사이에서 설문조사를 실시합니다. 거래에서 어떤 작업을 해결합니까? 대다수가 필요로 하는 것을 얻으십시오.
그리고 상인들 스스로가 여기에서 무언가를 따라잡고 글을 쓰려고 합니까?