2017-02-22 7 views
2

이 게시물을 읽는 데 시간을내어 다시 한번 감사드립니다.XOR은 S 자형 신경망에서 backpropagation을 사용하여 항상 0.5로 수렴됩니다. C++

이 질문은 많은 질문을 받았지만이 문제에 대한 많은 게시물을 확인했습니다. 그러나 backpropagation을 사용하여 sucessfull XOR 학습을 수행하는 것에 대한 미션은 아직 완료되지 않았습니다.

내가 제안한 것처럼, 학습 속도, 운동량, 바이어스 유무 등을 시도했지만, 여전히 성공하지 못했습니다.

네트워크는 2 입력 뉴런, 2 숨겨진 뉴런, 1 출력, 모두 Sigmoids로 구성됩니다. 출력 뉴런은 모든 입력에 대해 항상 약 0.5로 수렴하는 것처럼 보입니다.

나는 그 문제에 대해 귀중한 기술을 요구하고 있습니다. 저는 자체 제작 된 C++ 라이브러리를 사용하고 있습니다. (기본 지식이 무엇인지 깊이 배울 수 있습니다.) 여기

라인 - 이익의 내 코드입니다 :

void ClOutputSigmoidNeuron::ComputeErrorGradient() 
{ 
    double wanted_output = this->m_dataset->GetNextData(); 
    double delta = wanted_output - this->m_result_buffer; 
    this->m_error_gradient = delta * this->SigmoidDerivative(this->m_result_buffer); 
} 

가져 오기 오류 유도체 숨겨진 뉴런의 출력 신경 세포에서

가져 오기 오류 유도체

void ClSigmoidNeuron::ComputeErrorGradient() 
{ 
    double tmpBuffer = 0.00; 
    for(std::size_t i=0;i<this->m_output_connections.size();i++) 
    { 
     ClNeuron* target_neuron = (ClNeuron*)m_output_connections[i]->m_target_neuron; 
     tmpBuffer += (target_neuron->m_error_gradient * this->m_output_connections[i]->m_weight); 
    } 

    //Get the sigmoid derivative 
    this->m_error_gradient = tmpBuffer * this->SigmoidDerivative(this->m_result_buffer); 
} 

세대에 대한 가중치 업데이트 알 신경 세포 :

void ClNeuron::UpdateWeights() 
{ 
    for(std::size_t i=0;i<this->m_input_connections.size();i++) 
    { 
     double momentum = this->m_input_connections[i]->m_weight_last_delta * this->m_input_connections[i]->m_momentum_value; 
     double new_weight_delta = this->m_learning_rate * this->m_error_gradient * this->m_input_connections[i]->m_data + momentum ; 
     this->m_input_connections[i]->m_weight += new_weight_delta; 
     this->m_input_connections[i]->m_weight_last_delta = new_weight_delta; 
     this->m_input_connections[i]->m_number_of_time_updated++; 
    } 
} 

전송 기능

double ClNeuron::Sigmoid(double p_value) 
{ 
    return 1.00/(1.00 + std::exp(p_value*-1.00)); 
} 


double ClNeuron::SigmoidDerivative(double p_value) 
{ 
    double sigmoid = this->Sigmoid(p_value); 
    return sigmoid * (1.00 - sigmoid); 
} 

기능은이 글을 읽고에 대한

bool ClBackPropagationSupervisedTrainer::Train() 
{ 
    for (std::size_t i = 0; i < this->m_dataset_size; i++) 
    { 
     this->m_network->Fire(); 

     if (!this->m_network->ComputeErrorGradients()) 
     { 
      std::cout << "ClBackPropagationSupervisedTrainer:Train - Oups" << std::endl; 
      return false; 
     } 

     this->m_network->UpdateWeights(); 
    } 

    return true; 
} 

다시 훈련에 감사를 사용, 나는이 질문을 요청 받았다 알고 많이 ! 올바른 방향으로 나를 가리켜 주시면 대단히 감사하겠습니다.

답변

1

누군가가 도움이 될 수있는 경우 Sigmoid() 네트워크에서 TanH() 네트워크로 변경하면 문제가 해결되었습니다. 이 의미가 않습니다, 아직, 시그 모이 드 TRANSFERT 기능은 XOR 이미 정규 1 & 0 사이이기 때문에, 이런 종류의 문제에 대한 완벽한 것 같습니다 어떤 방법으로

...