GotAI.NET

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

 

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

 Все темы | Новая тема Стр.8 (12)<< < Пред. | След. > >>   Поиск:  
 Автор Тема: На: Обучение сети
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 2:23
Цитата:
Автор: 3d6
Без понятия, у меня аналогичные примеры сходились замечательно. Какая структура сети используется? Покажите также код, который читает сеть из файла, может ошибка там. Или может в вашем коде какая-то настолько простая опечатка, что я ее сейчас не вижу


Я серьезнейшим образом выкинул все лишнее, точнее оставил то, что необходимо. С утилитами успешно развязался и выкинул целиком, осталось вот такое:

int CMLP::parseConfiguration()
{
int layersCount = 3;
adaptiveSpeed = 0;

int *layers = new int[layersCount+1];

layers[0] = 2;
layers[1] = 2000;
layers[2] = 1;


setStructure(layersCount, layers, 0);

randomizeWeights();
delete layers;
return 1;
}

все прочие методы без существенных изменений, просто под другой компилятор ...
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 3:03
Цитата:
Автор: 3d6
1. Битовое представление - абсолютно необходимо.
2. А чем битовое представление не конфигурационное кодирование? о__О
3. При больших по модулю z сигмоида дает то же, что и пороговая функция.
4. Не необходимо, хотя при переходе от 99% к 100% это возможно даст прирост скорости, не знаю, как следует не анализировал этот вопрос - поскольку он не имеет практического смысла.


1. А почему это ? Ведь всюду написано что MLP с успехом работает на действительных числах - почему не подавать числа от 0 до 255 ?
2. Давайте на пальцах. Относится к выходу, если у вас 0 - один класс, 1 - второй класс - это конфигурационное, если же 01 - один класс, а 10-второй - как у вас, то позиционное. Т.е. при позиционном 1 может быть только в одном разряде. Соответственно, при байте памяти конфикурационным кодированием можно закодировать 256 классов, а при позиционном 8. Вот такая вот разница.
3. Вы можете примерон дать оценку когда это имеет быть - мне кажется, что уже после 100-1000 итерации веса возрастаю на столько, что активность явно больше 10
4. Тоже самое, что в п.3., только тогда можно говорить от 99% к 100%, или же от 49% к 100%
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 3:12
Цитата:
Автор: 3d6
Вы неправильно прочитали код. Прочитайте еще раз. Всегда вычисляется от плавающего числа - какая разница, что было в переменной ДО записи в нее числа?


Читаем:

double re = postSyn[x]; // В re пишем значение активации нейрона
if(postSyn[x] > 10) re = 0; // Если оно больше 10 или меньше -10 в re пишем 0 или -10 соответственно
if(postSyn[x] < -10) re = -10;
re = exp(-re); // Высчитываем экспоненту от re. Т.е. от 0 или -10, если значение активности нейрона больше 10 или меньше -10
return re / ( (1.0 + re)*(1.0 + re) ); // Возвращаем квадрат от фиксированого числа
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 3:21
Цитата:
Автор: 3d6
Отдельно у меня нет, все встроено в нейрокомпьютер. Однако если вы настаиваете, что ваш код не работает нормально - на днях попробую проверить.


Будьте так добры, как я уже и говорил могу переслать обрезанный мной текст под компилятор Visual C++ - хотя сдается мне, что там осталось так мало, что разницы вы не почувствуете ...

Дело даже не в том, что не работает полностью, работает но также как и мой предыдущий код - ну оооочень медленно ...
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 8:43
Предварительные результаты таковы:
1. При 2000 А-элементов = 2 часа 10 минут
2. При 2500 А-элементов = 40 минут
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 12:47
Цитата:
Автор: tac


double re = postSyn[x]; // В re пишем значение активации нейрона
if(postSyn[x] > 10) re = 0; // Если оно больше 10 или меньше -10 в re пишем 0 или -10 соответственно
if(postSyn[x] < -10) re = -10;
re = exp(-re); // Высчитываем экспоненту от re. Т.е. от 0 или -10, если значение активности нейрона больше 10 или меньше -10
return re / ( (1.0 + re)*(1.0 + re) ); // Возвращаем квадрат от фиксированого числа

Упс! Приношу свои извинения. Не знаю почему, но все это время мне казалось, что строчка re = postSyn[x]; находится ниже блока if.
Да, все что я делал с mlp ранее - неверно для случаев, когда постсинапс выходил за -10...10. Уже исправил, запустил заново на той же задаче, посмотрим что выйдет.
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 12:49
Цитата:
Автор: tac



Я серьезнейшим образом выкинул все лишнее, точнее оставил то, что необходимо. С утилитами успешно развязался и выкинул целиком, осталось вот такое:

Да, вроде все верно. Ок, на днях проверю, если успею - сегодня.
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 12:56
Цитата:
Автор: tac

1. А почему это ? Ведь всюду написано что MLP с успехом работает на действительных числах - почему не подавать числа от 0 до 255 ?
2. Давайте на пальцах. Относится к выходу, если у вас 0 - один класс, 1 - второй класс - это конфигурационное, если же 01 - один класс, а 10-второй - как у вас, то позиционное. Т.е. при позиционном 1 может быть только в одном разряде. Соответственно, при байте памяти конфикурационным кодированием можно закодировать 256 классов, а при позиционном 8. Вот такая вот разница.
3. Вы можете примерон дать оценку когда это имеет быть - мне кажется, что уже после 100-1000 итерации веса возрастаю на столько, что активность явно больше 10
4. Тоже самое, что в п.3., только тогда можно говорить от 99% к 100%, или же от 49% к 100%

1. mlp работает с действительными числами. Но сравнивая уже "разложенную по полочкам" задачу для перцептрона с не разложенной задачей для BP-mlp мы не получим сравнения этих алгоритмов - т.к. в этом случае перцептрон решает намного более простую задачу.
2. mlp может работать с одним выходом 0..1, просто для классификации два выхода обычно дают лучший результат. Если дойдем то прямого сравнения bp-mlp и перцептрона - сделаю один выход.
3. это очень сильно зависит от задачи, для одних задач веса не выйдут за -1..1, для других могут и за -100...100 выйти, тут нельзя дать какую-то общую оценку.
4. это вопрос для отдельного исследования, которое я не проводил, и о котором не слышал, поэтому не могу дать каких-либо точных оценок. Однако, подозреваю, что если бы разница была столь огромной, BP использовался бы в несколько другой модификации.
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 13:00
Да, и - огромное спасибо за найденную ошибку. Уже видно, что обучение сходится намного, намного лучше, чем раньше. Правильный вид функции производной соответственно такой:
double CMLPLayer::derAF(int x)
{
double re = postSyn[x];
re = exp(-re);
return re / ( (1.0 + re)*(1.0 + re) );
}
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 14:54
Цитата:
Автор: 3d6

Да, и - огромное спасибо за найденную ошибку. Уже видно, что обучение сходится намного, намного лучше, чем раньше.


"Ну, мы же не звери какие-то" Я тоже хочу, чтобы что-то получалось ... только вот у меня пока ничего не лучше и не хуже - все так же, "больной скорее мертв, чем жив"
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 14:57
Цитата:
Автор: 3d6
1. mlp работает с действительными числами. Но сравнивая уже "разложенную по полочкам" задачу для перцептрона с не разложенной задачей для BP-mlp мы не получим сравнения этих алгоритмов - т.к. в этом случае перцептрон решает намного более простую задачу.


Т.е. Вы согласны, что в двоичном виде задача "намного более простая", т.е. имеет смысл для любой задачи представлять данные в бинарном виде, что и делается перцептроном.
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 14:59
Цитата:
Автор: 3d6
Да, вроде все верно. Ок, на днях проверю, если успею - сегодня.


Вам - обрезанный код выслать ? А то может я чего лишнего обрезал, хотя тогда велика вероятность, что вообще ничего не работало бы - а так работает но хреново ...
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 15:10
Цитата:
Автор: tac

Т.е. Вы согласны, что в двоичном виде задача "намного более простая", т.е. имеет смысл для любой задачи представлять данные в бинарном виде, что и делается перцептроном.

Это очень сильно зависит от задачи.
Вот например, если задача - обучиться зависимости тока от напряжения, то представив напряжение в двоичной форме мы скорее усложним задачу, как перцептрону, так и bp-mlp.
Или если бы у нас было не черно-белое поле, а градиент оттенков серого, где цвет тем темнее, чем больше координата x - тоже представление в бинарном виде задачу бы усложнило. А в данной задаче, где никакой зависимости между цветом и координатой нет, бинарное представление увеличивает число связей - что конечно упрощает обучение.
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 15:12
Цитата:
Автор: tac

Вам - обрезанный код выслать ? А то может я чего лишнего обрезал, хотя тогда велика вероятность, что вообще ничего не работало бы - а так работает но хреново ...

На всякий случай высылайте, потому как я во-первых вижу совершенно отчетливое улучшение по сравнению со старой версией, а во-вторых даже старая версия на задачах вроде этой работала абсолютно нормально - так что наверняка где-то глюк.
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 26 янв 09 6:41
Цитата:
Автор: 3d6
На всякий случай высылайте, потому как я во-первых вижу совершенно отчетливое улучшение по сравнению со старой версией, а во-вторых даже старая версия на задачах вроде этой работала абсолютно нормально - так что наверняка где-то глюк.


Скачайте от сюда http://code.google.com/p/vlabdownload/downloads/list

Пункт TestForBP

Там я попробывал обучить 1/10 нашего теста - совершенно не сходится, попробуйте найти глюк, мою ошибку или что нибудь, что даст возможность задаче сойтись. Заранее спасибо.


[Ответ][Цитата]
 Стр.8 (12)1  ...  4  5  6  7  [8]  9  10  11  12<< < Пред. | След. > >>