GotAI.NET

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

 

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

 Все темы | Новая тема Стр.3 (5)<< < Пред. | След. > >>   Поиск:  
 Автор Тема: На: Обратное распространение ошибки
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 28 июл 08 22:46

[Ответ][Цитата]
daner
Сообщений: 4593
На: Обратное распространение ошибки
Добавлено: 29 июл 08 0:04
Цитата:
Автор: tac

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



Итак, у Вас есть обучаемая выборка и тестовая выборка, НО это не все примеры (в смысле, что есть еще большое множество, что нужно предсказывать) ... скажите мне чем отличается обучаемая выборка от тестовой ? Чтобы вопрос стал понятнее переформулирую и уточню Ваш текст:

Вам нужно изучить функцию Ф(х), но у вас есть только А примеров для обучения и Б примеров для теста. Поэтому, вполне вероятно, что может существовать функция Ф1(х), для которой А, так же будет истинно. И функция Ф2(х) для которой А и Б, так же будет истино. Сеть вроде бы как продолжает сходиться относительно обучаемых примеров, а так же сходится относительно тестовых, но все равно может не соответствовать функции Ф(х). Спрашивается, что изменится если объединить все доступные примеры, т.е. А и Б - и обучится на них ? Будет ли разница если их разделить ? Очевидно НЕТ (точнее будет, но в пользу объединения, т.к. не просто констатируется факт что "Сеть вроде бы как продолжает сходиться относительно обучаемых примеров, но начинает терять точность относительно тестовых", а достигается реально чтобы "Сеть сходилась бы относительно обучаемых примеров и тестовых").



Я когда написал, тоже про это задумался (забыл уже знаете ли ).
Но все просто (я поэтому и подписал после, что это именно практика). Если у вас не будет тестовой группы, вы просто не будете знать, когда сеть начнет терять точность относительно обобщения. Короче вы сойдетесь к Ф2 (ну на сколько сможете) и все.
А так, если тестить на отдельных примерах, то сможете поймать момент, когда сеть начнет превращаться в "узкого специалиста". Ну вот, я так себе это понимаю.
[Ответ][Цитата]
daner
Сообщений: 4593
На: Обратное распространение ошибки
Добавлено: 29 июл 08 0:10
Цитата:
Автор: tac

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

А зачем так замысловато ? От непригодности алгоритма обратного распространения нужно думать .... ну, ладно, я был бы рад, если бы получилось хотя бы это ... Тогда это означало бы, что ошибка все же не может прыгать хаотично, а должна находится в приделах от выбранной произвольно функции Val ... Теперь давайте поговорим, что же это за функция такая ? И что она показывает ?

Похоже такая функция уже прогнозирует не целевую функцию, а процесс схождения, т.е. она показывает, что обратное распространение все же стремится сойтись, но число "13" в отличии от "0" показывает, что этому не сужденно случится ... что означает, что 13 примеров из обучаемой выборки не будут братся во внимание, и только 87 будут запомнены ... и то не понятно какие именно ....
И ладно, но у меня получается другое соотношение, если требовать достаточную точность, то лишь 1 пример из 100 будет учтен (думаю у Вас так же, но у Вас таких графиков просто нет - Вы показываете все что угодно (поэтому я сказал "не много"), но не существенное ) - т.е. совершенная случайность ... Проблема в том, что алгоритм найде решение для одного примера, тут же его теряет, продолжая искать для других ...


А чего тут замысловатого? Обыкновенная сходимость ряда, или функции... Сходимость колебательных систем точно так же определяется (ну я конечно своими словами выразился, обычно это формальней описывается).

Не понял, причем тут 13 примеров. Это не кол-во примеров, а величина ошибки. И это как раз то, что я показываю. Ну т.е. я не искал такую Val, но я показывал "практически" монотонную сходимость при обучении среднего арифметического ошибки. (обыкновенное сглаживание функции: есть окно определенного размера и значение функции (в моем случае ошибки) заменяется значением среднего арифметического n-ого числа соседей.

Так что, я не пойму о чем вы говорите.

Графики там показывают одно и тоже, но с разными параметрами сети. Именно поэтому, я даю код с этой статьей, так как из нее сразу видно как потом под себя сеть настраивать.
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 29 июл 08 3:52
Не знаю, что я делаю не так, но с итерациями у меня на выходах значения приближаются к среднему значению на всех 5 примерах, т.е. 48.6 - думаю это не случайно ! Но почему так ? Что обратное распространение - это способ посчитать среднее

Проверил на 3 примерах - всегда дает среднее ... как это понимать ?

При таких требуемых выходах double[] d = { 10, 20, 20, 40, 60 }; получаю все равно среднее 30 ! Это 100% не случайно ...
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 29 июл 08 18:33
Можете меня поздравить - чудо свершилось - тестовый пример сошелся ... оказалось ему было мало 10 нейронов в скрытом слое, дал ему 20, немного поколдовал с коэффициентом скорости, и примерно за 10000 итераций сошел малюсенький пример в 5 примеров ... Да, еще тот чудо алгоритм

Хотя нет число нейронов тут не причем ... похоже дело только в коэффициенте, он у меня был 0.01 и я ни как не мог дождаться, сделал 0.7 и в лучшем случае (зависит от случайных весовых коэффициентов) сошелся за 8000 итераций ... немного лучше, но тоже не блеск

Да, а самое главное, все же не в коэффициенте, я ему для простоты поменял входные данные, и вот с ними он стал умнее ... Блин, как вообще этот алгоритм можно считать для чего нибудь пригодным ???
[Ответ][Цитата]
dereyly
Сообщений: 9
На: Обратное распространение ошибки
Добавлено: 30 июл 08 0:11
попробуйте адаптивный шаг. Например, rprop просто и эффективно
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 30 июл 08 0:31
Цитата:
Автор: dereyly

попробуйте адаптивный шаг. Например, rprop просто и эффективно


А для классического алгоритма - это нормально ? Или у меня все же где-то закралась ошибка ?
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 30 июл 08 0:41
Цитата:
Автор: dereyly

попробуйте адаптивный шаг. Например, rprop просто и эффективно


Да, и еще ряд програм используют т.н. понятие "момента", дополнительного множителя, скажем 0,9 * PrevUpdate[k], где PrevUpdate[k] - предыдущая коррекция - это сильно помагает ? А что лучше rprop или установка этого момента ?
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 30 июл 08 0:57
Цитата:
Автор: dereyly

попробуйте адаптивный шаг. Например, rprop просто и эффективно


А можете, привести код как это делается, а то всюду только заумные описания через производные (ужас как не люблю )?
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 30 июл 08 3:03
Цитата:
Автор: tac
Да, и еще ряд програм используют т.н. понятие "момента", дополнительного множителя, скажем 0,9 * PrevUpdate[k], где PrevUpdate[k] - предыдущая коррекция - это сильно помагает ? А что лучше rprop или установка этого момента ?


Момент проверил полезная штука, позволило уменьшить коэффициент скорости с 0.7 до 0.1, и главное алгоритм сошелся при изначальных входах за 15000 итераций (есть надежда, что это позволит сходится вне зависимости от сложности входов-выходов) ...

Что, касается, адаптивного шага то сомневаюсь, правильно ли его вводить ... как я понимаю прейдется рассчитывать производную от каждого веса ? Это что такое ? если вес скажем 0.1, то какова его производная ? или имеется введу 0.1 * (1-0.1) ? И с какой радости такая производная изменит знак ?

[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 30 июл 08 3:46
Цитата:
Автор: dereyly

попробуйте адаптивный шаг. Например, rprop просто и эффективно


О! Статья участвующего здесь в дискусии Царегородцев В.Г. "Общая неэффективность использования суммарного градиента выборки при обучении нейронной сети // Материалы XII Всеросс. семинара "Нейроинформатика и ее приложения", Красноярск, 2004. - 196с. - С.145-151"

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

Интересно только, можно ли применять адаптивный шаг, но корректировать веса все же после каждого примера (т.е. то, что Царегородцев В.Г. называет on-line)
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 30 июл 08 4:02
Ниже помещаю последнию версию кода, в надежде, что кто нибудь его когда нибудь посмотрит, и на этом Демо примере (который крайне необходим разработчику, а по чему то о нем ни кто не заботится, считая что он должен читать лирику о производных) покажет мне, где я восзможно ошибся или как можно добится более быстрой сходимости, на этом примере я получаю сходимость на 21261 итерации - кто быстре ?

public class BackProp
{
int ACount = 10;
int StimulCount = 5;

double[,] w1;
double[] w2;
double[,] PrevUpdate1;
double[] PrevUpdate2;

double[] y1;
//RCount=1
double y2 = 0;

//InputCount=3
double[,] y0 = { { 7, 4, 5 }, { 6, 4, 5 }, { 7, 5, 6 }, { 6, 3, 5 }, { 8, 5, 6 } };

double[] d = { 10, 20, 40, 50, 60 };

private bool checkAll = false;
private int checkCnt = 0;
double[] s1;
double s2 = 0;
double delta_m2 = 0;
double[] delta_m1;
double delta2 = 0;
double delta1 = 0;
private bool[] checkX = new bool[5];

public double F(double x)
{
return (1.0 / (1.0 + Math.Exp(-x)));
}
public double FF(double Fx)
{
return Fx * (1.0 - Fx);
}

public void ClearCheck()
{
checkCnt = 0;
for (int i = 0; i < StimulCount; i++)
{
checkX[i] = false;
}
}

public void Run()
{
w1 = new double[3, ACount];
w2 = new double[ACount];
PrevUpdate1 = new double[3, ACount];
PrevUpdate2 = new double[ACount];

y1 = new double[ACount];
s1 = new double[ACount];
delta_m1 = new double[ACount];


Random rnd=new Random(1);
for (int j = 0; j < ACount; j++)
{
w1[0, j] = rnd.NextDouble();
w1[1, j] = rnd.NextDouble();
w1[2, j] = rnd.NextDouble();
w2[j] = rnd.NextDouble();
}

double EachRate = 0.1;
double Momentum = 0.9;
int Iteration = 0;
while (!checkAll)
{
ClearCheck();
Iteration++;

for (int i = 0; i < StimulCount; i++)
{
// Прямой проход
s2 = 0;
for (int j = 0; j < ACount; j++)
{
s1[j] = w1[0, j] * y0[i, 0] + w1[1, j] * y0[i, 1] + w1[2, j] * y0[i, 2];
y1[j] = F(s1[j]);
s2 += w2[j] * y1[j];
}
y2 = F(s2);

// Проверка есть ли ошибка
Console.WriteLine("{0} = {1}", y2, (d[i] / 100));
if (Math.Abs(y2 - (d[i] / 100)) < 0.001)
{
checkX[i] = true;
}

delta_m2 = (y2 - (d[i] / 100)) * FF(y2);
for (int j = 0; j < ACount; j++)
{
delta_m1[j] = delta_m2 * w2[j] * FF(y1[j]);
}

// 10*3 связей первого слоя
for (int j = 0; j < ACount; j++)
{
for (int k = 0; k < 3; k++)
{
delta1 = -EachRate * delta_m1[j] * y0[i, k] + Momentum * PrevUpdate1[k, j];
w1[k, j] += delta1;
PrevUpdate1[k, j] = delta1;
}
}
// 10 связей второго слоя
for (int j = 0; j < ACount; j++)
{
delta2 = -EachRate * delta_m2 * y1[j] + Momentum * PrevUpdate2[j];
w2[j] += delta2;
PrevUpdate2[j] = delta2;
}
}
//Console.ReadLine();

for (int i = 0; i < StimulCount; i++)
{
if (checkX[i]) checkCnt++;
}

if (checkCnt == StimulCount)
{
checkAll = true;
}

Console.WriteLine("Iteration={0} - {1}", Iteration, checkCnt);
}
}
}
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обратное распространение ошибки
Добавлено: 30 июл 08 4:25
И последние на сегодня ... в этой сети совершенно не заметно влияние числа нейронов в среднем слое ! И этому есть объяснение - отсутствует понятие возбужденных (активированных) нейронов, у которых есть порог. Отсюда суммируются (почему-то ) все веса слоя, различаясь лишь весовыми коэффициентами (а если бы они были изначально одинаковыми - вообще труба) ... Это правильно ? Нет ли вариантов, где в сумме участвуют, например, лишь те нейроны, выход которых больше 0.5 ? Почему активны все нейроны (в той или иной мере), или это как раз противоречит сигмоидной активационной функции ? Думаю, именно поэтому такая не суразно долгая сходимость !!!
[Ответ][Цитата]
dereyly
Сообщений: 9
На: Обратное распространение ошибки
Добавлено: 31 июл 08 0:46
По поводу rprop
как я себе это представляю
тип: блочный
идеология: если направление обучения не меняет знака значит вектор направления правильный
алгоритм:
1. Инициализируем буфер градиентов нулями
2. Вычисляем градиент
3. Сравниваем градиент с буфером
а.если знаки у буфера и текущего градиента разные то уменьшаем коэффициент обучения на Н1=0.5
б. если одинаковые то увеличиваем на Н2=1.2
в. Если буфер или текущий градиент равен нулю то неизменяем
4. Заносим градиент ошибки в буфер
5. Модифицируем вес
Примечание:
В своей реализации я использовал маленькие блоки обучения, т.е. модифицировал веса каждые М=100 (из 2000) примеров, причем примеры подавались на вход системы в случайном порядке.

ЗЫ ваш код я пока не смотрел... а мой врят ли вам поможет, т.к. MATLAB неочень популярен в кругах программистов
[Ответ][Цитата]
dereyly
Сообщений: 9
На: Обратное распространение ошибки
Добавлено: 31 июл 08 0:54
Забыл сказать
rprop не совсем алгоритм адаптивного изменения шага обучения, т.к. в литературе принято считать адаптивным шагом некую эмпирическую формулу, которая зависит от первой производной (градиента) и ее буфера(т.е. предыдущего градиента). а rprop работает только со знаком изменения градиента и не зависит от велечины градиента, собственно это сильная сторона алгоритма.
[Ответ][Цитата]
 Стр.3 (5)1  2  [3]  4  5<< < Пред. | След. > >>