신경망. 전문가를 위한 질문입니다. - 페이지 21

 
alsu :

4) 가중치 초기화 매개변수 - 값 분포의 형태 및 분산.

설립하다. 저울의 초기화 매개변수를 설정할 수 있습니다.

기본값을 사용한 것 같습니다.


 
LeoV :
단기 고급 교육 과정 "인공 신경망
그리고 유전 알고리즘"

단기과정 신청이 마감되었습니다.
자격 "인공 신경망 및 유전 알고리즘",
모스크바 추가 교육 학부에서 실시
주립대학교. 원자력 연구소를 기반으로 한 M.V. Lomonosov
모스크바 주립 대학의 물리학. 모스크바 주립 대학 과정을 졸업 한 사람들은 국가 증명서를 발급받습니다.
고급 교육을 위한 샘플입니다.
수업은 19-00시 저녁에 주 2회 진행됩니다.
2011년 2월 25일 개강

자세한 내용은 과정 프로그램을 확인하고
다음에서 과정을 신청할 수 있습니다.
http://www.neuroproject.ru/kpk.php
실례합니다. 이것은 광고입니까, 아니면 거기서 스스로 공부할 건가요?
 
lasso :

설립하다. 저울의 초기화 매개변수를 설정할 수 있습니다.

기본값을 사용한 것 같습니다.


글쎄, 여기서 무슨 일이 일어나고 있는지 분명한 것 같습니다.

귀하의 작업을 기반으로 (내가 이해하는 바와 같이 두 개의 클래스로 분할하려는 1차원 데이터가 있음), 그 본질은 입력 값 세트(단 하나!)에서 최적의 점을 찾는 것입니다. 지정된 파티션을 생성합니다. 이를 위해 네트워크 1-7-1을 사용했다고 가정해 보겠습니다. 이 네트워크에서 가중치의 수는 21입니다(히든 레이어에 대한 7개의 입력, 7개의 바이어스, 출력 뉴런에 대한 7개의 입력). 21개의 변수를 선택하면서 한 점을 찾으려고 합니다. 21:1의 중복으로 네트워크 판독값이 그렇게 춤추는 것은 놀라운 일이 아닙니다. 초기 가중치의 작은 차이가 훈련 후 출력의 상당한 확산으로 이어집니다. 대략적으로 말하면 네트워크에 대한 작업은 너무 간단하지만 그것에 대해 알지 못하기 때문에 존재하지 않는 것을 찾고 있습니다. 공식적으로 이것은 아마도 재교육이라고 할 수 있지만 실제로는 참새에게 대포를 발사합니다.

엄밀히 말하면, 1차원 데이터를 두 개의 클래스로 분할하는 작업은 하나의 입력 가중치와 하나의 편향이 있는 단일 뉴런에 의해 성공적으로 수행됩니다.

 
lasso :

그리고 더. 나는 실제 네트워크 출력 범위의 "협소함"에 놀랐습니다. 설명하겠습니다:

-- MLP 네트워크 1-7-1

-- 신경망의 입력에 제공되는 값은 [0;1] 범위에서 균일하게 분포되며, 훈련 예제의 출력은 값 1과 -1로 표시됩니다.

훈련 후 입력 값의 전체 범위가 네트워크를 통해 실행되면 네트워크 출력이 매우 좁은 범위에 있음을 알 수 있습니다. 예를 들어:

opt_max_act= -0.50401336 opt_min_act= -0.50973881 단계=0.0000286272901034

또는 심지어 그렇게

opt_max_real= -0.99997914 opt_min_real= -0.99999908 단계=0.00000010

...........................................

맞는지 아닌지?


옳다 라고 말씀드리기 어렵습니다... 상황에 따라 다릅니다

귀하의 예에 따르면:

이 경우 첫 번째 네트워크는 모든 입력에 대해 "모른다"고 말하고 두 번째 네트워크는 동일한 입력에 대해 "클래스 -1"이라고 말합니다. 데이터가 동일하고 차이점이 가중치 초기화에만 있는 경우 문제는 클래스의 강력한 혼합에 있을 가능성이 높으며 이것이 그리드가 학습 패턴을 현명하게 구문 분석할 수 없는 이유이며 결과적으로, "무작위로" 행동합니다. 이것이 일어날 수 있는 방법에 대해 말하면, 편향이 있는 뉴런이 네트워크에서 사용되는 경우(아마도 그럴 것입니다) 그리드는 단순히 모든 정보 입력의 가중치를 재설정하고 분석을 위해 편향만 남겨 둡니다. 물론 "분석"은 명목상으로 판명되었으며 네트워크는 타조의 원리에 따라 작동합니다. 단순히 입력을 보지 못합니다. 이를 확인하거나 반박하려면 훈련된 네트워크 의 행렬을 확인해야 합니다.

 

다음은 "Statistics"에서 생성한 MLP NS 코드입니다.

 /* ------------------------------------------------------------------------- */


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif

#define MENUCODE - 999


static double NNCode38Thresholds[] =
{

/* layer 1 */
- 0.78576109762088242 , - 0.23216582173469763 , - 1.6708808507320108 , - 1.525614113040888 ,
1.4153558659332133 , - 0.77276960668316319 , 2.3600992937381298 , 2.473963708568014 ,
- 0.43422405325901231 , 0.68546943611132893 , 0.19836417975077064 , 0.26461366779934564 ,
- 0.19131682804149783 , 0.24687125804149584 , - 0.95588612620053504 , 0.25329560565058901 ,
- 1.0054817062488075 , 1.3224622867600988 , 0.88115523574528376 , 0.32309684489223067 ,
0.52538428519764313 ,

/* layer 2 */
- 1.8292886608617505

};

static double NNCode38Weights[] =
{

/* layer 1 */
1.8660729426318707 ,
1.3727568288578245 ,
3.1175074758006374 ,
3.356836518157698 ,
3.2574311486418068 ,
3.2774957848884769 ,
1.4284147042568165 ,
3.534875314491805 ,
2.4874577673065557 ,
2.1516346524000403 ,
1.9692127720516106 ,
4.3440737376517129 ,
2.7850179803408932 ,
- 12.654434243399631 ,
2.4850018642785399 ,
2.1683631515554227 ,
1.77850226182071 ,
2.1342779960924272 ,
2.8753050022428206 ,
3.9464397902669828 ,
2.5227540467556553 ,

/* layer 2 */
- 0.041641949353302246 , - 0.099151657230575702 , 0.19915689162090328 , - 0.48586373846026099 ,
- 0.091916813099494746 , - 0.16863091580772138 , - 0.11592356639654273 , - 0.55874391921850786 ,
0.12335845466035589 , - 0.022300206392803789 , - 0.083342117374385544 , 1.550222748978116 ,
0.10305706982775611 , 3.9280003726494575 , 0.12771097131123971 , - 0.12144621860368633 ,
- 0.40427171889553365 , - 0.072652508364580259 , 0.20641498115269669 , 0.1519896468808962 ,
0.69632055946019444

};

static double NNCode38Acts[ 46 ];

/* ---------------------------------------------------------- */
/*
  NNCode38Run - run neural network NNCode38

  Input and Output variables.
  Variable names are listed below in order, together with each
  variable's offset in the data set at the time code was
  generated (if the variable is then available).
  For nominal variables, the numeric code - class name
  conversion is shown indented below the variable name.
  To provide nominal inputs, use the corresponding numeric code.
  Input variables (Offset):
  stoch

  Выход:
  res
    1=1
    2=-1

*/
/* ---------------------------------------------------------- */

void NNCode38Run( double inputs[], double outputs[], int outputType )
{
   int i, j, k, u;
   double *w = NNCode38Weights, *t = NNCode38Thresholds;

   /* Process inputs - apply pre-processing to each input in turn,
   * storing results in the neuron activations array.
   */

   /* Input 0: standard numeric pre-processing: linear shift and scale. */
   if ( inputs[ 0 ] == - 9999 )
    NNCode38Acts[ 0 ] = 0.48882189239332069 ;
   else
    NNCode38Acts[ 0 ] = inputs[ 0 ] * 1.0204081632653061 + 0 ;

   /*
   * Process layer 1.
   */

   /* For each unit in turn */
   for ( u= 0 ; u < 21 ; ++u )
  {
     /*
     * First, calculate post-synaptic potentials, storing
     * these in the NNCode38Acts array.
     */

     /* Initialise hidden unit activation to zero */
    NNCode38Acts[ 1 +u] = 0.0 ;

     /* Accumulate weighted sum from inputs */
     for ( i= 0 ; i < 1 ; ++i )
      NNCode38Acts[ 1 +u] += *w++ * NNCode38Acts[ 0 +i];

     /* Subtract threshold */
    NNCode38Acts[ 1 +u] -= *t++;

     /* Now apply the logistic activation function, 1 / ( 1 + e^-x ).
     * Deal with overflow and underflow
     */
     if ( NNCode38Acts[ 1 +u] > 100.0 )
       NNCode38Acts[ 1 +u] = 1.0 ;
     else if ( NNCode38Acts[ 1 +u] < - 100.0 )
      NNCode38Acts[ 1 +u] = 0.0 ;
     else
      NNCode38Acts[ 1 +u] = 1.0 / ( 1.0 + exp ( - NNCode38Acts[ 1 +u] ) );
  }

   /*
   * Process layer 2.
   */

   /* For each unit in turn */
   for ( u= 0 ; u < 1 ; ++u )
  {
     /*
     * First, calculate post-synaptic potentials, storing
     * these in the NNCode38Acts array.
     */

     /* Initialise hidden unit activation to zero */
    NNCode38Acts[ 22 +u] = 0.0 ;

     /* Accumulate weighted sum from inputs */
     for ( i= 0 ; i < 21 ; ++i )
      NNCode38Acts[ 22 +u] += *w++ * NNCode38Acts[ 1 +i];

     /* Subtract threshold */
    NNCode38Acts[ 22 +u] -= *t++;

     /* Now calculate negative exponential of PSP
     */
     if ( NNCode38Acts[ 22 +u] > 100.0 )
       NNCode38Acts[ 22 +u] = 0.0 ;
     else
      NNCode38Acts[ 22 +u] = exp ( -NNCode38Acts[ 22 +u] );
  }

   /* Type of output required - selected by outputType parameter */
   switch ( outputType )
  {
     /* The usual type is to generate the output variables */
     case 0 :


       /* Post-process output 0, two-state nominal output */
       if ( NNCode38Acts[ 22 ] >= 0.05449452669633785 )
        outputs[ 0 ] = 2.0 ;
       else
        outputs[ 0 ] = 1.0 ;
       break ;

     /* type 1 is activation of output neurons */
     case 1 :
       for ( i= 0 ; i < 1 ; ++i )
        outputs[i] = NNCode38Acts[ 22 +i];
       break ;

     /* type 2 is codebook vector of winning node (lowest actn) 1st hidden layer */
     case 2 :
      {
         int winner= 0 ;
         for ( i= 1 ; i < 21 ; ++i )
           if ( NNCode38Acts[ 1 +i] < NNCode38Acts[ 1 +winner] )
            winner=i;

         for ( i= 0 ; i < 1 ; ++i )
          outputs[i] = NNCode38Weights[ 1 *winner+i];
      }
       break ;

     /* type 3 indicates winning node (lowest actn) in 1st hidden layer */
     case 3 :
      {
         int winner= 0 ;
         for ( i= 1 ; i < 21 ; ++i )
           if ( NNCode38Acts[ 1 +i] < NNCode38Acts[ 1 +winner] )
            winner=i;

        outputs[ 0 ] = winner;
      }
       break ;
  }
}
 
alsu :

옳다 라고 말씀드리기 어렵습니다... 상황에 따라 다릅니다

귀하의 예에 따르면:

이 경우 첫 번째 네트워크는 모든 입력에 대해 "모른다"고 말하고 두 번째 네트워크는 동일한 입력에 대해 "클래스 -1"이라고 말합니다. 데이터가 동일하고 차이점이 가중치 초기화에만 있는 경우 문제는 클래스의 강력한 혼합에 있을 가능성이 높으며 이것이 그리드가 학습 패턴을 현명하게 구문 분석할 수 없는 이유이며 결과적으로, "무작위로" 행동합니다. 이것이 일어날 수 있는 방법에 대해 말하면, 편향이 있는 뉴런이 네트워크에서 사용되는 경우(아마도 그럴 것입니다) 그리드는 단순히 모든 정보 입력의 가중치를 재설정하고 분석을 위해 편향만 남겨 둡니다. 물론 "분석"은 명목상으로 판명되었으며 네트워크는 타조의 원리에 따라 작동합니다. 단순히 입력을 보지 못합니다. 이를 확인하거나 반박하려면 훈련된 네트워크의 행렬을 확인해야 합니다.

그리고 한 가지 더: FANN에서 바이어스 오프셋은 들어오는 레이어를 제외하고 각 레이어에 실제로 적용됩니다.

그러나 "통계 6" 프로그램의 NN 패키지에 대한 설명에서 편견과 유사한 것을 찾지 못했습니다.

국회의원 초심자에게는 이 모든 차이가 정말 두뇌를 앗아갑니다...

 

네, 제가 말한 것과 매우 유사합니다. 다만 그 반대입니다. 네트워크가 데이터에서 길을 잃었습니다. 주의하십시오. 네트워크 아키텍처에서 첫 번째 계층의 모든 가중치는 입력 데이터와 관련하여 동일하고 이론적으로 0 주위에 균등하게 분포되어야 합니다. 그러나 그림에서 볼 수 있듯이 은닉층의 뉴런이 포화 상태가 되었기 때문에 위쪽으로 구동되었습니다( 로지스틱 활성화 함수가 있음). 활성화 임계값이 저장되지 않았기 때문입니다. 그들은 예상대로 첫 번째 뉴런이 말하는 것에서 아무것도 이해하지 못한 출력 뉴런과 마찬가지로 0 영역에 머물렀지만 우리는 이미 그것에 무슨 일이 일어났는지 알아냈습니다.


 

굉장한!!

다이어그램 형태의 가중치 및 임계 값.

그리고 완전히 다른 모습. 고맙습니다.

 
lasso :

다음은 "Statistics"에서 생성한 MLP NS 코드입니다.

안녕하세요!

간단히 말해서 프로그래머의 도움으로 Statistica에서 생성한 신경망을 사용하여 C 파일에서 dll 파일을 컴파일하는 방법을 배우는 것이 가능합니까? 절차를 한 번 설명하면 나중에 계획에 따라 직접 할 수 있습니다. 그것은 학교에서 기본 프로그래밍 수준이고 외환 작업을 위한 HC 모델이 직조되지만 정기적으로 네트워크를 업데이트해야 합니다. 생성하려면 새 dll을 읽어야 합니다. MQL 코드에서는 매번 수정하는 것이 어쩐지 어렵습니다.

 
alexeymosc :

안녕하세요!

프로그래머의 도움으로 Statistica에서 생성한 신경망을 사용하여 C 파일에서 dll 파일을 컴파일하는 방법을 배울 수 있습니까?

잘 자!

나는 그렇지 않다고 생각합니다. 예외는이 프로그래머가 회사 "통계"자체에서 일하지 않는 경우에만 해당됩니다))

알렉세이모스크 :

MQL 코드에서는 매번 수정하는 것이 어쩐지 어렵습니다.

통계에서 어떤 유형의 NS를 사용합니까?

손으로 뭔가를 수정하면 알고리즘이 있으므로 자동화해야합니다 ....

...........................................

위에서 GA 사용을 추천받았는데 바로 오늘 joo 라이브러리( UGALib )의 도움으로 원하는 안정적인 결과를 얻을 수 있었습니다.

이제 이 사건을 4구로 끌고 가겠습니다...

Andrey (저자) 낮은 활. 매우 유망하고 유연한 방향입니다.

...........................

아마도이 방향으로 파고들 가치가 있습니까?