Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по нейронным сетям 
V
    Опции темы
4ybaka
Дата 5.11.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



добрый вечер.начал вот изучать нейросети и сразу возникли вопросы:

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

2)в каком диапазоне изменяются веса?нашел пример где изнчально они порядка 0,01,но до какой величины они могут расти?понятно что до бесконечности,но там же вроде есть так называемое состояние насыщения...или я чтото потуаю?

3)веса они мгут только увеличиваться?ведь если один нейрон "неправ",то проще у него одного уменьшить вес,чем потом увеличивать веса у всех остальных.или это просто сложно реализовать?

4)может ли изменяться число нейронов в слое?пока про это нигде не нашел..

Это сообщение отредактировал(а) 4ybaka - 5.11.2007, 23:09


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
dereyly
Дата 5.11.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



1) Веса вручную почти никогда не задаются, хотя если вы знаете что начальные значения должны быть примерно такими, вы можете назначить веса +0.3*rand().
1.1) Чаще всего веса инициализируются случайными значениями k*rand(). 0.01<k<0.3
1.2) Иногда инициализация задается некоторым функционалом... Ну допустим равномерное распределение  значений... Что-то подобное было в статье Галушкина.... некое применение Монте-Карло (к сожалению точнее описать не могу... не помню... если вы заинтересуетесь проблемой инициализации то можете начать копать оттуда)
2) "Насыщение" наверно зависит от выбора активационной функции. Чаще всего это сигмоидальная функция, где разница между 5 и бесконечностью поступающая на вход сигмоиды не такая большая... (0.9933 и 1 при стандартных коэффициентах)
3) Веса естественно могут как уменьшатся так и увеличиватся... так же они могут быть положительными и отрицательными (тормозящие синапсы)
4) Опишите в каких целях вам нужно менять число нейронов (все зависит от топологии сети)

Это сообщение отредактировал(а) dereyly - 5.11.2007, 23:30
PM MAIL   Вверх
4ybaka
Дата 7.11.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dereyly @  5.11.2007,  23:27 Найти цитируемый пост)
4) Опишите в каких целях вам нужно менять число нейронов (все зависит от топологии сети)

просто хотелось узнать,какие параметры в сети могут быть динамическими(нужно для проектирования сети)

еще возник вопрос: если случилось такое чудо и вес синапса стал равен 0,то как я понимаю этот синапс больше не будет влиять на этот нейрон?

и еще пара вопросов:

1)сколько примерно необходимо наборов данных для обучения сети в 3 слоя по 2 нейрона в каждом?

2)на Code Project нашел такой пример:
Код

 public bool Train()
        {
            double currentError = 0;
            int currentIteration = 0;
            NeuralEventArgs Args = new NeuralEventArgs() ;

            do
            {
                currentError = 0;
                foreach (KeyValuePair<T, double[]> p in TrainingSet)
                {
                    NeuralNet.ForwardPropagate(p.Value, p.Key);
                    NeuralNet.BackPropagate();
                    currentError += NeuralNet.GetError();
                }
                
                currentIteration++;

                if (IterationChanged != null && currentIteration % 5 == 0)
                {
                    Args.CurrentError = currentError;
                    Args.CurrentIteration = currentIteration;
                    IterationChanged(this, Args);
                }

            } while (currentError > maximumError && currentIteration < maximumIteration && !Args.Stop);
                        
            if (IterationChanged != null)
            {
                Args.CurrentError = currentError;
                Args.CurrentIteration = currentIteration;
                IterationChanged(this, Args);
            }

            if (currentIteration >= maximumIteration || Args.Stop)   
                return false;//Training Not Successful
            
            return true;
        }  

насколько я понял цикл while это все прокручивает для одного и того же набора(кот весь прогоняется в foreach),но вот когда реализовал это у себя получил что после первой итерации результат больше не менялся...я чего то не понял?

Это сообщение отредактировал(а) 4ybaka - 8.11.2007, 00:29


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
dereyly
Дата 8.11.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

еще возник вопрос: если случилось такое чудо и вес синапса стал равен 0,то как я понимаю этот синапс больше не будет влиять на этот нейрон?

Да все правильно и это достаточно важная информация. При оптимизации (обученной) нейронной сети можно прослеживать цепочки нейронов с малыми значениями... С помощью этих данных можно исключать входные элементы (анализ главных компонент) или перенормировать их.
1. Что то немогу вспомнить стандартную эмпирическую формулу =(, но где то >20
2. Самое интересное вы не выложили... по какой формуле идет обратное распространение и как корректируются веса... обычно обучение включает >1000 итераций, для тестовых задачек естественно меньше
PM MAIL   Вверх
4ybaka
Дата 9.11.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



после добавления смещения все вроде заработало...но только вроде.
расчет выхода нейрона:
Код

        internal void ComputeValue()
        {
            double sum = 0;
            for (int i = 0; i < input.Count; i++)
            {
                sum += input[i].Value * input[i].Weight;//входные синапсы
            }
             value = FunDef(sum - threshold);//threshold - смещение.FunDef - сигмоидальня функция
        }


расчет ошибки и пересчет весов и смещений:
Код

        internal void ComputeError(double target)//для выходного слоя
        {
            error = (target - value) * value * (1.0 - value);
        }
        internal void ComputeError()//для остальных
        {
            double sum = 0;
            for (int i = 0; i < output.Count; i++)
            {
                sum += output[i].Weight * output[i].To.Error;
            }
            error = value * (1.0 - value) * sum;
        }

        internal void ComputeWeightsNThreshold()
        {
            threshold -= learningRate * error;
            for (int i = 0; i < input.Count; i++)
            {
                input[i].UpdateWeight(learningRate * error * input[i].Value);
            }
        }



обучение всей сети:
Код

public bool Train(TrainingData[] trainData,double maxError,int maxIteration) {
            double curError;
            int curIteration = 0;
            do
            {
                curError = 0;
                curIteration++;
                foreach (TrainingData data in trainData)
                {
                    //вычисляем значения выходов всех нейронов
                    layers[0].InitValues(data.values);//инициализируем значения входного слоя
                    for (int i = 1; i < layers.Count; i++)
                    {
                        layers[i].ComputeValues();
                    }
                    //вычисляем ошибки для всех нейронов
                    layers[layers.Count - 1].ComputeErrors(data);
                    for (int i = layers.Count - 2; i >= 0; i--)
                    {
                        layers[i].ComputeErrors();
                    }
                    //изменяем веса синапсов
                    for (int i = 1; i < layers.Count; i++)
                    {
                        layers[i].ComputeWeights();//для каждого нейрона вызывается ComputeWeightsNThreshold
                    }
                    //считаем общую ошибку
                    for (int i = 0; i < layers.Count; i++)
                        curError += layers[i].GetToatalError;
                }
            }
            while ((Math.Abs(curError) > maxError) && (curIteration <= maxIteration));

            if (Math.Abs(curError) <= maxError)
                return true;
            return false;
}


так вот пытался обучить эту сеть складывать 2 числа (или вычитать) которые лежат в диапазоне от 0 до1.но в итоге получал либо почти 0(для - ) либо почти 1(для + ).но ошибка(по модулю!)была менее 0,2.выяснилось что во всем виноваты веса синапсов.они всегда получались следующего порядка:
Код

Synapse: from  to  with weight = -1,56982488541095E-20
Synapse: from  to  with weight = -1,56982478121492E-20
Synapse: from  to  with weight = -2,11888276371133E-20
Synapse: from  to  with weight = -2,11888262307196E-20
Синапсы между 1 слоем и 2 слоем
Synapse: from  to  with weight = -2,86591299659517E-11
Synapse: from  to  with weight = -2,86591399875267E-11
Synapse: from  to  with weight = -2,86591281521648E-11
Synapse: from  to  with weight = -2,86591381737392E-11
Синапсы между 2 слоем и 3 слоем
Synapse: from  to  with weight = 2,84589475907478E-06
Synapse: from  to  with weight = 2,84589570904152E-06

Layer: 1
Neuron: 0.Threshold = 0,1
Neuron: 1.Threshold = 0,1
Layer: 2
Neuron: 0.Threshold = 0,0999805962581826
Neuron: 1.Threshold = 0,0999808432392426
Layer: 3
Neuron: 0.Threshold = 0,097479799227483
Neuron: 1.Threshold = 0,0974784957763081

те они все обнуляются!..что не так?

Это сообщение отредактировал(а) 4ybaka - 9.11.2007, 00:05


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
dereyly
Дата 9.11.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



1) Какая топология... 
я тут запустил нейросеть 2-3-1 (входной-сигмоидальный-линейный) на 100 примерах 100 итераций... ошибка на выходе в 4ом знаке
2) Смещение я думаю проще задать как дополнительный нейрон с выходом +1... 
3) Вроде все правильно в коде... еще посмотри как у тебя веса обновляются и learningRate покрути... ИМХО у тебя где то модуль зарыт потому что веса у тебя меняются только в одну сторону --- уменьшения
PM MAIL   Вверх
4ybaka
Дата 9.11.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dereyly @  9.11.2007,  01:34 Найти цитируемый пост)
Смещение я думаю проще задать как дополнительный нейрон с выходом +1... 

а почему +1?ведь он тогда будет открывать нейрон а не закрывать его?

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


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
4ybaka
Дата 9.11.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile она считает!оказалась банальная опечатка - для обновления веса вместо += было =...
но вот обучается довольно плохо.при тех же 100 примерах и 100 итераций дает ошибку во 2 знаке...
dereyly, не поделитесь секретом smile 


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
dereyly
Дата 11.11.2007, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я тоже еще раз проверил и тоже получил ошибку во 2 знаке... значит в тот раз мне с инициализацией повезло =)
Как я писал выше 100 итераций это мало... за 500 итераций оно хорошо обучается 
PM MAIL   Вверх
4ybaka
Дата 11.11.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dereyly, спасибо за помощь.держи)



--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
zaver
Дата 15.11.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(4ybaka @ 5.11.2007,  22:35)
добрый вечер.начал вот изучать нейросети и сразу возникли вопросы:

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

2)в каком диапазоне изменяются веса?нашел пример где изнчально они порядка 0,01,но до какой величины они могут расти?понятно что до бесконечности,но там же вроде есть так называемое состояние насыщения...или я чтото потуаю?

3)веса они мгут только увеличиваться?ведь если один нейрон "неправ",то проще у него одного уменьшить вес,чем потом увеличивать веса у всех остальных.или это просто сложно реализовать?

4)может ли изменяться число нейронов в слое?пока про это нигде не нашел..

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

из литературы могу посоветовать только "Хайкин "Нейронные сети"" - книга огромная, но охватывает немерянно материала, есть примеры на MatLab'e. Но использует очень тяжелую математику, школьного курса явно не хватит, тут нужно мехматовские знания. НО, если ты освоишь эту книгу, то будешь мегамозгом в области НС.

На заметку: хаотично накидав побольше нейронов и связав их random'om через синапсы, ты НС не получишь. (т.е. формально это будет НС, но без функций НС). сколько ты не будешь сигналить на вход (найти вход в такой каше тоже проблема smile ), ничего вразумительного не получишь. такая каша сама-собой не организуется и не начнеть говорить с тобой на по-человечески.
PM MAIL WWW ICQ Skype YIM MSN   Вверх
arilou
Дата 17.11.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Цитата(zaver @  15.11.2007,  17:11 Найти цитируемый пост)
такая каша сама-собой не организуется и не начнеть говорить с тобой на по-человечески

Интересно, почему?  smile Ведь у ребенка в мозге намного больше связей между нейронами, а у взрослого это кол-во уменшается. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
zaver
Дата 18.11.2007, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(arilou @ 17.11.2007,  16:17)
Цитата(zaver @  15.11.2007,  17:11 Найти цитируемый пост)
такая каша сама-собой не организуется и не начнеть говорить с тобой на по-человечески

Интересно, почему?  smile Ведь у ребенка в мозге намного больше связей между нейронами, а у взрослого это кол-во уменшается.

потому что эти связи упорядочены. и причем нейроны имеют разный алгоритм расположения, соединения в зависимости от их специализации (т.е. нейрон из позмоночника, из лобных долей, из ствола мозга, из коры, и пр.), некоторые связи заложены генетически, некоторые появляються в первые дни жизни (но опять таки по генетически заложенному алгоритму), а некоторые формируються до конца жизни. нейроны в нашей голове - это не каша, которая смогла самоорганизоваться.
PM MAIL WWW ICQ Skype YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

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

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


 




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


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

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