Список форумов neuroproject.ru neuroproject.ru
Форум сайта компании НейроПроект
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Метод градиентного спуска. Расхождение теории и практики.

 
Начать новую тему   Ответить на тему    Список форумов neuroproject.ru -> Нейронные сети
Предыдущая тема :: Следующая тема  
Автор Сообщение
kostia
Новый посетитель
Новый посетитель


Зарегистрирован: 18 Июн 2011
Сообщения: 2
Откуда: Томск

СообщениеДобавлено: Сб Июн 18, 2011 5:03 pm    Заголовок сообщения: Метод градиентного спуска. Расхождение теории и практики. Ответить с цитатой

Доброго времени суток. Недавно занялся программирование НС, 2 курс ПМиИ.
Написал класс обычного однослойного персептрона и решил воспользоватся одним из методов безусловной оптимизации для корректировки весовых значений.
В общем все получается как и при обычном методе коррекции ошибки, но умножая deltaW на значение производной, но зачастую получается так, что это значение крайне мало и обучение происходит оооочень медленно(сходится где-то в бесконечности)

вот функции инциализации, обучения и выполнения:

Код:
      Neuron(int s = 0){
         if(s>0){
            a = 2;
            lern = 0.75;
            SynapsesCount = s+1;
            Synapses = new Synapse[SynapsesCount];
            Synapses[0].Weight = 0;
            Synapses[0].Data = 1;
            for(int i=1; i<SynapsesCount; i++){
               Synapses[i].Weight = ((rand()%101)/100.0 - 0.5)/sqrt((double)SynapsesCount);
            }
         }else{
            SynapsesCount = 0;
            Synapses = NULL;
         }
      };
double Learning(double TrueResult){
         if(Synapses){
            double out;
            double error;
            double delta;
            out = Execute();
            cout << " " << out;
            error = TrueResult-out;
            //if(abs(error) < 0.005) return out;
            for(int i=0; i<SynapsesCount; i++){
               delta = lern*error*Synapses[i].Data*(1.0-out*out)*a/2.0;
               Synapses[i].Weight += delta;
            }
            //lern /= 1.02;
            return out;
         }else return 0;
      }

      double Execute(){
         if(Synapses){
            Summator = 0;
            for(int i=0; i<SynapsesCount; i++)
               Summator += Synapses[i].Data*Synapses[i].Weight;
            double e = exp(Summator*a);
            if(!_isnan(e)&&(_finite(e)!=0)) return (e-1)/(e+1);
            else return 0;
            //return Summator<=0?0:Summator>1?1:Summator;
         }else throw 2;
      }

Обучение без производной проходит гораздо быстрее и точнее, нежели с ней.
Код:
#define N 8
int main(void)
{
   srand((unsigned int)time(0));
   Neuron nerv1(N);
   double data[N]={1,1};
   double in[N];
   int TRUE = 0;
   int iter = 0, max = 500;
   for(;max;){
      cout << iter << ") " << data[0]<<" or "<<data[1] << " ";
      int t = (int(data[0]+0.5)==1)&&(int(data[1]+0.5)==1)?1:-1;
      in[0] = data[0];
      in[1] = data[1];
      for(int i=2; i<N/2; i++){
         in[i*2] = data[0];
         in[i*2+1] = data[1];
      }
      nerv1.SetData(in);
      data[0] = nerv1.Learning(t);
      cout << " " << t << endl;
      if(int(data[0]>0?data[0]+0.5:data[0]-0.5)==t){
         TRUE++;
         if(TRUE>10) break;
      }else TRUE = 0;
      max--;iter++;
      switch(iter%4){
         case 0: data[0]=1; data[1]=1;
            break;
         case 1: data[0]=1; data[1]=0;
            break;
         case 2: data[0]=0; data[1]=1;
            break;
         case 3: data[0]=0; data[1]=0;
            break;
      }
   }
...

В общем прошу просветить меня по этому поводу, наставить на верный путь и я пойду тестить следующие методы безусловной оптимизации.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
kostia
Новый посетитель
Новый посетитель


Зарегистрирован: 18 Июн 2011
Сообщения: 2
Откуда: Томск

СообщениеДобавлено: Сб Июн 18, 2011 5:36 pm    Заголовок сообщения: Ответить с цитатой

Аяй!!! Я не верно градиент посчитал... Нафига я вычислял производную по пороговой функции для однослойного песептрона... Во баклан... Ночью всё же надо спать =)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов neuroproject.ru -> Нейронные сети Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Rambler's Top100 Rambler's Top100