GotAI.NET

Форум: Проблемы искусственного интеллекта

 

Регистрация | Вход

 Все темы | Новая тема Стр.1 (1)   Поиск:  
 Автор Тема: Ошибка в алгоритме обратного распространения
anrkaid
Сообщений: 2
Ошибка в алгоритме обратного распространения
Добавлено: 05 июн 08 14:43
Соббственно решил запрограммировать НС, написал немножко коду, приступил к тестированию. В качестве задачи выбрал возведение символа в верхний регистр . Т.е. 8 входов, 3 слоя (взял от балды).
в структуре данных на слой больше чем теоретически (первый слой входной). вот ф-я коррекции:

Подскажите ощибку плз (я думаю она тут).

void NNet::ReverseCirculation(double *nout){
double *delta = (double *)malloc(LayerSize * sizeof(double) * 2);
double *delta2 = delta + LayerSize;
//тут будут храниться дельты (те что из формулы)

for(int q = 0; q < LayerSize; ++q)delta[q] = ns[nLayers * LayerSize + q].out * (1 - ns[nLayers * LayerSize + q].out) * (nout[q] - ns[nLayers * LayerSize + q].out);
//заполняю дельты для последнего (выходного слоя)
//nout - желаемый выход сети
for(int i = nLayers; i > 0; --i){
//с последнего до 1 слоя
for(int j = 0; j < LayerSize; ++j){
//правлю все веса для каждого нейрона в слое
double add_ = ns[i * LayerSize + j].out * EducationCoefficient * delta[j];
for(int m = 0; m < LayerSize; ++m)ns[i * LayerSize + j].weights[m] += add_;

}
for(int w = 0; w < LayerSize; ++w){
//вычисляю delt''ы для следующего слоя
double sum = 0;
for(int a = 0; a < LayerSize; ++a)sum += delta[a] * ns[i * LayerSize + a].weights[w];
// это сумма произвдений дельт и весов
delta2[w] = sum * ns[(i - 1) * LayerSize + w].out * (1 - ns[(i - 1) * LayerSize + w].out);
//сохраняю новые дельты
}
double *tmp;
tmp = delta;
delta = delta2;
delta2 = tmp;
//меняю местами
}
free((delta < delta2) ? delta : delta2);
}
[Ответ][Цитата]
daner
Сообщений: 4593
На: Ошибка в алгоритме обратного распространения
Добавлено: 05 июн 08 16:37
[Ответ][Цитата]
anrkaid
Сообщений: 2
На: Ошибка в алгоритме обратного распространения
Добавлено: 06 июн 08 13:49
Более-менее понятное объяснение алгоритма я нашел только у Уоссермана. Википедия и все прочие ресурсы пестрят формулами, часто мало имеющими отношение к практической реализации. Я вижу что вам лень копаться в моем коде , поэтому просто укажите ошибку в моем понимании алгоритма:

1. вычисляю δ по формуле δ = OUT(1 – OUT)(Target – OUT) для каждого нейрона выходного слоя. Соханяю массив дельт.

2. Для каждого нерона слоя вычисляю добавку ко всем его весам Δw = η*δ*OUT (это так должно быть что ко всем весам 1 нерона прибавляется одно и то же чило?). Прибавляю смещения.

3. Для кажого нейрона следующего слоя (т.е. предыдущего) вычисляю дельту. Для каждого нейрона δ = OUT(1-OUT)*sum. sum - сумма произведений весов и дельт впередистоящего (уже подкорректированного) слоя, т.е. для 1 нерона предпоследнего слоя это будет δ первого нерона выходного на вес ребра, их соединяющего плюс дельта второго выходного на вес, соединяющий первый в предпоследнем и второй в последнем и т.д.

4. на шаг 2 пока слои не исчерпаны.

Собственно мне кажется что ошибка где-то в шаге 3. Подскажите что я понял не так.
[Ответ][Цитата]
daner
Сообщений: 4593
На: Ошибка в алгоритме обратного распространения
Добавлено: 06 июн 08 15:39
да вроде все верно. ну надо еще не забывать w=w+Δw делать. ну и OUT на внутренних слоях будет соответствовать не конечному выходы, а выходу текущего нейрона.
Думаю у вас ошибка где-то в самой реализации.

Цитата:
Википедия и все прочие ресурсы пестрят формулами, часто мало имеющими отношение к практической реализации.

Ну это вы зря . я сам когда-то делал по этим же формулам и все классно работало . правда делал на С#.
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Ошибка в алгоритме обратного распространения
Добавлено: 06 июн 08 19:57
>2.

Неверно. Для весов нейрона должно быть OUTj, где j - номер веса (или, что то же самое, номер нейрона с ПРЕДЫДУЩЕГО слоя), поэтому числа-поправки получаются разные. Смещения никуда не прибавляются - они корректируются почти аналогично весам (без домножения на OUTпредыдущее).

>3.

никакой коррекции впередистоящего слоя делаться не должно, т.е. веса след.слоя должны браться старые

В общем, вспоминайте изученное в школе цепное правило дифференцирования сложной функции - поможет, ибо обратное распространение есть именно такое дифференцирование. И "не читайте советских газет перед обедом" (С) М.Булгаков, т.е. нефиг пользоваться ресурсами, где компетентность автора/переводчика не гарантируется.

--------------------------
нейронные сети, анализ данных, прогнозирование

[Ответ][Цитата]
гость
192.42.116.*
На: Ошибка в алгоритме обратного распространения
Добавлено: 20 июн 19 5:54
Цитата:
Автор: daner

Реализация алгоритма на С++
этот алгоритм взял за основу своего NeuroPro Виктор Генадиевич Царегородцев
[Ответ][Цитата]
 Стр.1 (1)