Я написал свою собственную пользовательскую функцию производительности, которая является функцией кросс-энтропии с некоторыми изменениями, называемой расширенной функцией кросс-энтропии.
Моя функция производительности isselft представляет собой сумму двух функций: функции кросс-энтропии F иштрафная функция P, приведенная ниже формула:
, где B и векторы e1 и e2 - это лишь некоторые константы, а w
- это весовая матрица (i
для нейронов скрытого слоя, j
для нейронов входного слоя).
Я реализовал производные dy и dx, не очень уверенный в отношении производной dx (где x является результатом функции getx - она содержит всю информацию о весе и смещении).Я предположил, что производная dx моей функции производительности для веса wij
будет равна производной функции штрафа:
Затем я начал тренировать свою нейронную сеть с помощью trainbfg и обнаружил, что ничему не научится.Сообщение было «Строка поиска не нашла новый минимум».Из описания trainbfg:
Каждая переменная настраивается в соответствии со следующим: X = X + a * dX;где dX - направление поиска.Параметр a выбран для минимизации производительности в направлении поиска.
Оказалось, что параметр a
всегда вычисляется как 0 с помощью функции поиска по умолчанию, srchbac (поиск строки).Я предполагаю, что это как-то связано с тем, что моя функция производительности была неправильно реализована, потому что когда я устанавливаю mse в качестве функции производительности, a
вычисляется правильно.
В чем причина проблем при поиске нового минимума с помощью функции srchbac
?Просто чтобы узнать, где я должен искать, поскольку на второй день я ничего не нашел.
Редактировать:
Вектор x сначала состоит из весовых значений входных скрытых соединений, а затем из всех остальных смещений ивеса.Я вычисляю производную dx вектора весов по следующей формуле:
res = 2 .* E1 .* b .* W ./( 1 + b .* W.^2).^2 + 2 .* E2 .* W ;
и остальные значения, которые я установил в 0 (так, чтобы res
имел ту же длину, что и вектор x).