Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обучение нейрона определению “подходящей” прямой д, вопрос о стабилизации весов в НС 
:(
    Опции темы
gmkraprike
Дата 11.11.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



Добрый день. Уровень моего вопроса весьма примитивен, однако, он остается вопросом.
В книге Р.Каллана встречается задача обучения одного нейрона:

ЗАДАЧА:
Обучив нейрон на входящих образцах (x,y), найти прямую, для которой сумма квадратов ошибок для всех точек будет наименьшей. Ошибкой является расстояние от точки до прямой.
Убедиться в том, что найденная прямая будет почти идентичная прямой, найденной методом наименьших квадратов.

ДАНО:
1)
Набор точек
x=[0.30,0.35,0.40,0.50,0.60,0.80,0.95,1.10];
y=[1.60,1.40,1.40,1.60,1.70,2.00,1.70,2.10];

2)
Нейрон с линейной активностью, с двумя входами: “x” и “1” с соответствующими весами “m” и “c” (параметры уравнения прямой); и одним выходом “y”.
Начальные коэффициенты m=0.5 , c=0.5;

3)  Правило обучение берется Видроу-Хоффа(дельта-правило) с нормой обучения 0.3

4) Замечание, что “обучение закончится после рассмотрения каждой точки 10000 раз”.

МОЙ ВОПРОС:
На первом графике ниже я вывел все 8 линий, проходящие через набор точек. Данный расклад соответствует 1ой эпохе. Линия, найденная методом наименьших квадратов (m=0.7172 c=1.2392) находится почти тютелька в тютельку на линии 4.
По прошествии ~70 эпох веса перестали настраиваться и стали равны

Line        m          c
1    0.9116    1.3229
2    0.8374    1.1109
3    0.8228    1.0744
4    0.8668    1.1624
5    0.8729    1.1726
6    0.9338    1.2486
7    0.7176    1.0210
8    0.8599    1.1504

Как мы видим:
1) Только прямая №7 очень приблизительно похожа на искомую.
Вопрос: По какому результату оценивать работы сети?

2) Нет единого ответа НС. Насколько я понимаю, в конце обучения m и c должны “устояться” в одном лице.
Вопрос: Как же m и c могут устояться, если процедура обучения (в итерации) отдельной прямой не закончится, пока она не подтянет прямую вплотную к себе (к рассматриваемой точке (x/y)) от  прямой предыдущей итерации? То есть даже, когда на больших эпохах изменения перестанут происходить, прямые все равно будет проходить через свои точки, что мы и видим на втором графике.

График 1 (Эпоха 1)
user posted image

***********

График 2 (Эпоха 70)
user posted image


PS
Ссылка на мою matlab процедуру
http://webfile.ru/2378609
PM MAIL   Вверх
dereyly
Дата 11.11.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 16.6.2006

Репутация: 1
Всего: 4



Может быть у вас ошибка в понимание что нейронная сеть как и МНК адаптируется к набору точек.... для НС не существует 8 вариантов решения а есть только 1 варинат когда НС адаптируется ко всем примерам... если приводить пример из вашего кода, то вместо
 
Код

for j=1:70
    y_plot=[0.5,1.05];
    for i=1:8
        [m c] = learning_WX(m,c,x(i),y(i));
        y_plot=[y_plot,[m*x_plot(1)+c , m*x_plot(2)+c]];
        %stat=[stat;j i m c];
    end
    %stat=[stat;0 0 0 0];
end

должно быть как-то так 
Код

for j=1:70
    for i=1:8
        [m c] = learning_WX(m,c,x(i),y(i));
    end
    y_plot=[c , m+c];
end


Это сообщение отредактировал(а) dereyly - 11.11.2008, 17:52
PM MAIL   Вверх
gmkraprike
Дата 11.11.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



Добрый вечер. 
"для НС не существует 8 вариантов решения а есть только 1 варинат когда НС адаптируется ко всем примерам"
Вот этого я и жду от НС. В итоге обучения, насколько я понимаю, параметры (веса) должны стабилизироваться на чем то одном (для всех входов). У меня же они получились разными, для каждого входа.

PS
А то, что вы предложили с кодом - ситуация следующая:
Данный код покажет "m" и "с" последней прямой, проходящей через точку с номером 8. Но ведь, остальные прямые (проходящие через остальные точки) будут (факт!) при своих "m" и "с", отличных от последней прямой. Как быть?



Это сообщение отредактировал(а) gmkraprike - 11.11.2008, 18:13
PM MAIL   Вверх
dereyly
Дата 11.11.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 16.6.2006

Репутация: 1
Всего: 4



Еще раз посмотрел на ваш код
Код

while abs(b) > 0.005
    y_= x*m + 1*c;

    b=y-y_;

    if abs(b) > 0.005
        delta_m = 0.3 * b * x;
        delta_c = 0.3 * b * 1;
        m= m + delta_m;
        c= c + delta_c;
    else
        alert=1;
    end
end

В процедуре обучения вы пытаетесь адаптироваться к ОДНОМУ примеру, что неправильно... НС во время своей работы обучается на всем множестве и качество обучение определяется среднеквадратичной ошибкой по ВСЕМ примерам
PM MAIL   Вверх
gmkraprike
Дата 11.11.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



dereyly, если у вас еще остались нервы, пожалуйста, укажите еще раз (по возможности подробнее) на ту грань, которую я до сих пор не вижу, ибо не понимаю физическую часть того момента, о котором вы говорите в последнем посте. Для меня сейчас стадия обучения( весов) НС включается, когда к ней приходит очередной входной вектор. И, действительно, момента знаменитого обобщения НС в такой картине  я не вижу.
Если вас не затруднит - внесите ясность.
PS Литературой я располагаю, но на этот вопрос-"стенку",ответа я не нашел.
PM MAIL   Вверх
dereyly
Дата 11.11.2008, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 16.6.2006

Репутация: 1
Всего: 4



Ну если рассмотреть ваш код
Код

y_=y;
b=1;
while abs(b) > 0.005
    y_= x*m + 1*c;

    b=y-y_;

    if abs(b) > 0.005
        delta_m = 0.3 * b * x;
        delta_c = 0.3 * b * 1;
        m= m + delta_m;
        c= c + delta_c;
    else
        alert=1;
    end
end

то неправильно в данном случае пытаться ошибку для одного примера сделать почти нулевой, единственное чего вы добьетесь это прямая будет проходить через данную точку
т.е. ЦИКЛ этот нужно удалить
ну и коэффициент обучения сделать поменьше, к примеру 0.03
после этого обучение должно заработать

среднеквадратичная ошибка которую мы уменьшаем с помощью правила Видроу-Хоффа можно записать так
Код

while (abs(b) > 0.005 && i<1000)
    i=i+1;
    for ind=randperm(length(x));
        y_= x(ind)*m + 1*c;
        bl(ind)=y(ind)-y_;
        if abs(b) > 0.005
            delta_m = 0.03 *  bl(ind) * x(ind);
            delta_c = 0.03 *  bl(ind) * 1;
            m= m + delta_m;
            c= c + delta_c;
        else
            alert=1;
        end
    end
    b=sum(bl.^2);
    hist(i)=b;
end

где bl это ошибка конкретного примера, а b среднеквадратичная
*ф-ия ind=randperm(length(x)); это тоже самое что и for i=1:8 но рандомно
как несложно понять что НС с одним элементом не достигнет наперед заданной точности 0.005 а достигнет лишь ошибки выдаваемой МНК... и из графика hist это видно... так же можно как критерий остановки выбрать неизменность ошибки
PM MAIL   Вверх
VictorTsaregorodtsev
Дата 12.11.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 28.7.2006

Репутация: 3
Всего: 8



gmkraprike

русским языком, ибо далек от матлаба:
1. Обучение - два цикла, внешний - по числу эпох (до 10000 или иного числа, или пока не будет достигнута нужная суммарная/средняя по примерам ошибка), а внутренний - по числу примеров (в данном случае - до 8).
2. Коэффициент обучения я бы не до 0.03, а еще на пару порядков снизил ;)
3. Коэффициент обучения можно прикинуть (да и для проверки правильности проги это тоже подойдет), обучая какой-либо единственный пример - квадрат его ошибки должен сходиться до 10^-6 - 10^-8 и менее без особых проблем, при запуске с разными начальными весами синапсов сети (особо отмечаю - прогу надо несколько раз протестировать на рандомных коэффициентах, а не просто на паре 0.5, 0.5, как у Вас в первом посте). Если обучение не сходится, начинает скакать вокруг более высокого уровня, то надо уменьшать коэффициент и/или проверять заново всю прогу на корректность. В одну единственную точку ответ сети должен вставать сколь угодно точно и при этом намертво.
4. Во второй раз повторяю (см. п.1) и тут уже говорилось, что не стоит учить до упора единственный пример и потом переходить к другому - сетка должна видеть все примеры (т.е. перебирать один за другим) и иметь достаточно малый коэффициент обучения, чтобы обучение одному примеру НЕ СЛОМАЛО навык решения предыдущих. 
5. Указанные в первом посте точки-эталоны требуют нормировки (нормализации). Если у Каллана ничего об этом нет - то Каллана в топку, однозначно!

ЗЫ. На форуме бываю редко, чисто ради саморекламы. Поэтому вопросы можно не задавать smile
PM MAIL WWW   Вверх
gmkraprike
Дата 14.11.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



Господа, очень признателен за вашу выдержку и детальность в объяснении - большая пища для дальнейшего разбора.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.