Нейронные сети MATLAB: проблемы с trainbfg при использовании пользовательской функции производительности - PullRequest
2 голосов
/ 18 июля 2011

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

Моя функция производительности isselft представляет собой сумму двух функций: функции кросс-энтропии F иштрафная функция P, приведенная ниже формула:

Performance function Enter image description here

, где B и векторы e1 и e2 - это лишь некоторые константы, а w - это весовая матрица (i для нейронов скрытого слоя, j для нейронов входного слоя).

Я реализовал производные dy и dx, не очень уверенный в отношении производной dx (где x является результатом функции getx - она ​​содержит всю информацию о весе и смещении).Я предположил, что производная dx моей функции производительности для веса wij будет равна производной функции штрафа:

Derivative dx

Затем я начал тренировать свою нейронную сеть с помощью 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...