я смотрел это удивительное видео по Дэйву Миллеру на создание нейронной сети с нуля в 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;
}
}