0

я смотрел это удивительное видео по Дэйву Миллеру на создание нейронной сети с нуля в C++ здесь: https://vimeo.com/19569529Крест энтропии применительно к обратному распространению в нейронной сети

Вот полный исходный код ссылки на видео: http://inkdrop.net/dave/docs/neural-net-tutorial.cpp

В качестве функции стоимости используется среднеквадратичная ошибка. Я заинтересован в использовании нейронной сети для бинарной классификации, хотя и хотел бы использовать кросс-энтропию как функцию стоимости. Я надеялся добавить это в этот код, если это возможно, так как я уже играл с ним.

Как это применимо конкретно здесь?

Было бы единственное различие в том, как вычисляется ошибка для выходного уровня ... или все уравнения меняются полностью через обратную сторону?

Что-нибудь изменилось? Является ли MSE по сравнению с кросс-энтропией исключительно для того, чтобы получить представление об общей ошибке и не независимо относиться к backpropogation?

Редактировать для ясности:

Вот соответствующие функции.

//output layer - seems like error is just target value minus calculated value 
void Neuron::calcOutputGradients(double targetVal) 
{ 
    double delta = targetVal - m_outputVal; 
    m_gradient = delta * Neuron::transferFunctionDerivative(m_outputVal); 
} 

double Neuron::sumDOW(const Layer &nextLayer) const 
{ 
    double sum = 0.0; 

    // Sum our contributions of the errors at the nodes we feed. 

    for (unsigned n = 0; n < nextLayer.size() - 1; ++n) { 
     sum += m_outputWeights[n].weight * nextLayer[n].m_gradient; 
    } 

    return sum; 
} 

void Neuron::calcHiddenGradients(const Layer &nextLayer) 
{ 
    double dow = sumDOW(nextLayer); 
    m_gradient = dow * Neuron::transferFunctionDerivative(m_outputVal); 
} 


void Neuron::updateInputWeights(Layer &prevLayer) 
{ 
    // The weights to be updated are in the Connection container in the neurons in the preceding layer 

    for (unsigned n = 0; n < prevLayer.size(); ++n) { 
     Neuron &neuron = prevLayer[n]; 
     double oldDeltaWeight = neuron.m_outputWeights[m_myIndex].deltaWeight;  

     //calculate new weight for neuron with momentum 
     double newDeltaWeight = eta * neuron.getOutputVal() * m_gradient + alpha * oldDeltaWeight; 

     neuron.m_outputWeights[m_myIndex].deltaWeight = newDeltaWeight; 
     neuron.m_outputWeights[m_myIndex].weight += newDeltaWeight; 
    } 
} 

ответ

1

Наконец нашел ответ здесь: https://visualstudiomagazine.com/articles/2014/04/01/neural-network-cross-entropy-error.aspx

Вам нужно только изменить то, как вычисляется ошибка в выходном слое.

Соответствующая функция должна быть изменена является:

void Neuron::calcOutputGradients(double targetVal) 

Для среднеквадратичных ошибок используйте:

double delta = targetVal - m_outputVal; 
m_gradient = delta * Neuron::transferFunctionDerivative(m_outputVal); 

Для перекрестной энтропии только использования:

m_gradient = targetVal - m_outputVal;