Форум программистов, компьютерный форум, киберфорум
Наши страницы
Искусственный интеллект
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
IR001
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 14
Завершенные тесты: 1
1

Простая задача, но сеть уходит в континуум

25.10.2016, 09:06. Просмотров 1652. Ответов 34
Метки нет (Все метки)

Здравствуйте.
Сеть: 10 входов, изначально связи нейронов N<->N, 1 нейрон на выходном слое, F сигмоид.
Вроде самую примитивную задачу поставил: научиться считать количество "1" и "0" в примере. Но не получается и всё, при обучении сеть после 5-7 итераций схватывает контузий.
Вывод выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
0,4994      0,999
0,4975      0,993
0,4861      0,96
0,4345      0,828
0,3154      0,581
0,222       0,395
0,1928      0,301
0,1856      0,252
0,1838      0,225
0,1832      0,209
0,183       0,199
0,183       0,192
0,1831      0,188
0,1831      0,185
0,1831      0,183
...................................
Первый столбец - это ошибка сети, второй - значение выхода на последнем примере выборки, там ожидается "0". Но к "0" так и не приближается.
Порог количества итераций обучения = 500, затем параметры сети сбрасываются, заново заполняются веса случайными числами. Но результат всё тот же, десяток итераций и привет.

Заполнял малыми, очень малыми весами, нулями - результат тот же.
Количество скрытых слоёв не оказывает влияния на итоги решений. Только сеть быстрее сваливается в сингулярность.
Возможно, что ошибка в структуре сети, только я не вижу её. Либо какая-нибудь ламерская ошибка, либо всё к чёрту неверно.
Прошу помочь знатоков, разглядеть где тут собака.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
const iLayersCount = 5;
const iDendrCount = 10;
const double dLearnStep = 0.01;
const double dHighValueErr = 0.12;
const iUotputCount = 1;
const double dImpulse = 0.5;
const int iIterations = 100;
//5 слоёв, включая 1 входной; выходной слой из одного нейрона (класс описан отдельно)
 
//Нейрон---------------------------------------------------------------------------------------
class TNeuron{
 public:
 double dSumm;
 double dDendr[iDendrCount];
 double dWeights[iDendrCount];
 double dExtremum[iDendrCount];
 double dDemWeights[iDendrCount];//"история" изменения весов
 double dSigma;
 
 TNeuron(){
   dSumm = 0;
   dSigma = 0;
   for ( int i = 0; i<iDendrCount; i++)
       dWeights[i] =  = (double)(rand()%200)/200.000;
   for ( int i = 0; i<iDendrCount; i++) dExtremum[i] = 1;
   for ( int i = 0; i<iDendrCount; i++) dDendr[i] = 0;
   for ( int i = 0; i<iDendrCount; i++) dDemWeights[i] = dWeights[i];
 }
 
  double _Func(){//acson
  dSumm = 0;
  for ( int i = 0; i < iDendrCount; i++){
        dSumm += dDendr[i]*dWeights[i];
      }
  return RoundingTo( 1/( 1 + exp(-1.1*dSumm)), -3);
 }
 
};
 
//Нейрон выходного слоя---------------------------------------------------------------
class TDecision{
 public:
 double dSumm;
 double dWeights[iDendrCount];
 double dDemWeights[iDendrCount];
 double dDendr[iDendrCount];
 double dSigma;
 TDecision(){
  dSumm = 0;
  dSigma = 0;
  for ( int i = 0; i<iDendrCount; i++)
      {
      double dd = (double)(rand()%200)/200.000;
      dWeights[i] = dd;
      }
  for ( int i = 0; i<iDendrCount; i++) dDendr[i] = 0;
  for ( int i = 0; i<iDendrCount; i++) dDemWeights[i] = dWeights[i];
 }
 
  double _Func(){//acson
  dSumm = 0;
  for ( int i = 0; i < iDendrCount; i++)
      {
        dSumm += dDendr[i]*dWeights[i];
      }
  return RoundingTo( 1/( 1 + exp(-1.1*dSumm)), -3);
 }
 
};
 
//класс слоя сети------------------------------------------------------------------------------
class TLayer{
 public:
 TNeuron *Neurones[iDendrCount];
 double dSigma;
 TLayer(){
  dSigma = 0;
  for ( int i = 0; i<iDendrCount; i++)
      Neurones[i] = new TNeuron();
 }
};
 
//класс сеть----------------------------------------------------------------------------
class TNetwork{
 public:
 TLayer *layers[iLayersCount];
 TDecision *dDec[iUotputCount];
 TNetwork(){
  for ( int i = 0; i<iLayersCount; i++){
        layers[i] = new TLayer();
      }
  for ( int i = 0; i<iUotputCount; i++){
        dDec[i] = new TDecision;
      }
 }
};
TNetwork* Net;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
double _fastcall CalcSigmasOnLayer( int iLayer, int idxW)//сигмы внутренних слоёв
{
 double dSum = 0;
 if ( iLayer == iLayersCount)//это последний скрытый слой
    {
      for ( int N = 0; N < iUotputCount; N++)
          dSum += Net->dDec[N]->dSigma * Net->dDec[N]->dWeights[idxW];//сигма_выхода* вес_нейрона
    }
    else
    for ( int N = 0; N<iDendrCount; N++)//остальные внутренние слои
     {
       dSum += Net->layers[iLayer]->Neurones[N]->dSigma * Net->layers[iLayer]->Neurones[N]->dWeights[idxW];
     }
 return dSum;
}
 
//----------------------------------------------------------------------------------------------
double _fastcall CalcSigmasOnDec( double dY)//сигма выходного слоя
{
 double dSum = 0;   
 double dOut = Net->dDec[idxW]->_Func();//у сети всего один нейрон на выходном слое
 Net->dDec[idxW]->dSigma = dOut*(1-dOut)*(dY-dOut);
 return Net->dDec[idxW]->dSigma;
}
 
//----------------------------------------------------------------------------------------------
void CalcSigmasOnNeuron()//Сигма по нейронам скрытых слоёв
{
 for ( int N = 0; N<iDendrCount; N++)//последний скрытый слой
     {
       double dOut = Net->layers[iLayersCount-1]->Neurones[N]->_Func();//значение выхода нейрона слоя
       double dSigmaOnLayer = CalcSigmasOnLayer(iLayersCount, N);//сигма выходного слоя
       Net->layers[iLayersCount-1]->Neurones[N]->dSigma = dOut*(1-dOut)*(dSigmaOnLayer);
     }
 
 for ( int L = iLayersCount-2; L>0; L--)//внутренние слои, кроме последнего
     {
       for ( int N = 0; N<iDendrCount; N++)
           {
             double dOut = Net->layers[L]->Neurones[N]->_Func();
             Net->layers[L]->Neurones[N]->dSigma = dOut*(1-dOut)*CalcSigmasOnLayer(L+1, N);
           }
     }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void CorrectNetWeights()//корректировка весов сети
{
 for ( int N = 0; N < iUotputCount; N++)//выходной слой
     {
       for ( int i = 0; i<iDendrCount; i++) {
             Net->dDec[N]->dDemWeights[i] = dLearnStep*Net->dDec[N]->dSigma + dImpulse*Net->dDec[N]->dDemWeights[i];
             Net->dDec[N]->dWeights[i] = Net->dDec[N]->dWeights[i] + Net->dDec[N]->dDemWeights[i];
           }
     }
 
for ( int L = iLayersCount-1; L>0; L--) {
     for ( int N = 0; N<iDendrCount; N++) {
         for ( int i = 0; i <iDendrCount; i++) {
                   Net->layers[L]->Neurones[N]->dDemWeights[i] = dLearnStep * Net->layers[L]->Neurones[N]->dSigma +
                                                                 dImpulse * Net->layers[L]->Neurones[N]->dDemWeights[i];
                   Net->layers[L]->Neurones[N]->dWeights[i] = Net->layers[L]->Neurones[N]->dWeights[i] +
                                                              Net->layers[L]->Neurones[N]->dDemWeights[i];
             }
         }
     }
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//Запуск обучения
String sInput[] = { "10010110111",//7
                     "11010110111",//8
                     "10010110000",//4
                     "10010110000",//4
                     "10010100000",//3
                     "10100110000",//4
                     "10000100000",//2
                     "10010111101",//7
                     "11010111101",//8
                     "01000101100"//4
                   };//обучающая выборка
 
while ( dErr_Current>dHighValueErr)
 {
 dErr_Current = 0;
 
 int iSz = sizeof(sInput)/4;//колво элементов в обучающей выборке
 
 for ( int Y = 0; Y<iSz; Y++)
       {
         sAwaited = sInput[Y][10];//ожидаемое значение выхода
 
         int iSzR = sInput[Y].Length();
         for ( int i = 0; i<iSzR; i++) {
               Net->layers[0]->Neurones[0]->dDendr[i] = String(sInput[Y][i+1]).ToInt();//подали сигналы на вход
             }
 
         //расчёт сети==============================================
          for ( int L = 1; L<iLayersCount; L++)//текущий слой
              {
                 for ( int N = 0; N < iDendrCount; N++)//нейроны текущего слоя
                     {
                       for ( int D = 0; D<iDendrCount; D++)//дендриты текущего нейрона текущего слоя
                           {
                             Net->layers[L]->Neurones[N]->dDendr[D] = Net->layers[L-1]->Neurones[D]->_Func();
                             double fff = Net->layers[L]->Neurones[N]->dDendr[D];
                           }
                     }
              }
 
           for ( int O = 0; O < iUotputCount; O++){
                 for ( int D = 0; D<iDendrCount; D++){
                       double dT = Net->layers[iLayersCount-1]->Neurones[D]->_Func();
                       Net->dDec[O]->dDendr[D] = dT;
                     }
               }
 
         double dOutput = Net->dDec[0]->_Func();
 
         //завершение расчёта сети======================================
 
         double dA_ = 0;//ожидаемые значения
 
         if ( sAwaited == "1")
            dA_ = 1;
 
         CalcSigmasOnDec( dA_);//расчёт сигмы на нейронах(-оне) выходного слоя
         CalcSigmasOnNeuron();//сигмы скрытых слоёв
         CorrectNetWeights();//корректировка весов
 
         double dEsum = fabs( pow(dOutput-dA_, 2)) * 0.5;
       }//for
 
   dErr_Current = (dErr_Current+1)/iSz;
 }
Добавлено через 9 минут
"10010110111" - обучающая выборка, считаются первые 10 элементов, [11] - ожидаемый ответ сети
sAwaited = sInput[Y][11];//ожидаемое значение выхода
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2016, 09:06
Ответы с готовыми решениями:

Континуум
Добрый вечер! Проверьте, пожалуйста, правильность изложенного ниже. Доказать, что множество всех...

Простая нейронная сеть
Доброго времени суток, встал такой вопрос: Имеется неравенство x1 - x2 + 0.5 &gt;= 0. Это неравенство...

Дешевая простая домашная беспроводная сеть
Нужно связать несколько девайсов разного назначения с компьютером. Без проводов. Передавать большие...

Простая нейронная сеть для обхода препятствий (C# + Unity3d)
Всем привет, хочется написать простую нейронную сеть для обхода объектом препятствий. То есть есть...

Нет подключения роутера, простая сеть в Cisco Packet Tracer
Всем доброго времени суток! В общем такое дело, решил изучить сетевые технологии, в колледже сети...

34
IR001
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 14
Завершенные тесты: 1
09.11.2016, 13:07  [ТС] 21
MNIST слишком сложно для "курса новичка". Была необходимость вспомнить и доучить то, что не было усвоено несколько лет назад. А взамен распознавания образов есть своя задача. Пусть и не такое количество обучающих примеров, как доступные в мнисте.
0
VTsaregorodtsev
609 / 567 / 85
Регистрация: 19.02.2010
Сообщений: 2,074
09.11.2016, 21:50 22
Цитата Сообщение от IR001 Посмотреть сообщение
MNIST слишком сложно для "курса новичка".
MNIST легко берётся обычным персептроном с одним скрытым слоем.
Полторы сотни скрытых нейронов - и точность на тестовой выборке становится ниже 3% ошибок. Больше нейронов - лучше точность. Ещё лучше точность становится при неМНКшной целевой функции или постановке нелинейностей и на выходной слой нейронов. Хотя, конечно, порог в 1.6% ошибки не взять никаким ростом размера персептрона - но небольшой хитростью (иными нейронами на выходном слое, приведёнными в списке "стандартных" формальных нейронов в двухтомнике PDP 1986г) таки и его можно преодолеть. Но ненамного - до 1.4% ошибок можно будет дотянуть, но это уже уровень, с которого только стартуют свёрточные нейросетки.

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

Просто новичок напишет такооооой тормозной код, который будет работать на пару порядков медленнее чемпионского. Соответственно, результат каждого изменения в нейросети/алгоритмах будет виден не через минуту или несколько минут обучения - а через гораздо бОльшее время. И вот ожидание-то и способно убить весь исследовательский интерес.
0
IR001
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 14
Завершенные тесты: 1
10.11.2016, 11:34  [ТС] 23
Не очень владею терминами, мягко говоря.
неМНКшной целевой функции
Поясните, пожалуйста, "МНК-функции" - это что? Постановка нелинейности - это по сути использование какой-либо нелинейной функции в элементах выходного слоя?
И вот это тоже ново:
порог в 1.6% ошибки
Сейчас смотрю на СКв ошибку. Извините, а процент ошибки - что это? Это уже процент неверных ответов при тестировании новыми выборками на уже обученной сети?
напишет такооооой тормозной код
Так и есть
Сейчас сделал изменение коэффициентов импульса, шага в режиме обучения. Интересно, что во время обучения после доведения СКв ошибки до 0.01 изменение шага обучения в большую сторону сразу даёт довольно заметное увеличение СКв, а уменьшение шага, собственно, уменьшение СКв на следующих итерациях (эпохах). В первом случае СКв через несколько десятков эпох возвращается в своё прежнее значение.
Играюсь вот так пока.
0
VTsaregorodtsev
609 / 567 / 85
Регистрация: 19.02.2010
Сообщений: 2,074
12.11.2016, 22:27 24
Цитата Сообщение от IR001 Посмотреть сообщение
МНК-функции" - это что?
Метод наименьших квадратов = среднеквадратичная ошибка.
При обучении задаче классификации (задаче распознавания) - учит сеть не собственно самому распознаванию, а запоминанию значений эталонных выходных кодов (которые берутся человеком с потолка). Т.к. в случае "сверхуверенного" ответа сети (грубо говоря, когда имеем выходной сигнал=2 на нужном выходе и выходные сигналы=-2 на остальных выходах) не оставит сеть в покое - а начнёт требовать именно предписанных значений эталонов.

Цитата Сообщение от IR001 Посмотреть сообщение
Постановка нелинейности - это по сути использование какой-либо нелинейной функции в элементах выходного слоя?
Да.
Как должно быть видно из объяснения выше - чтобы заменить большой штраф при большом зашкаливании (у бывшего линейного нейрона) на совсем копеечный штраф от недотягивания до асимптоты, с соответствующим малым последующим вкладом в изменение весов сети.

Цитата Сообщение от IR001 Посмотреть сообщение
а процент ошибки - что это? Это уже процент неверных ответов при тестировании новыми выборками на уже обученной сети?
Да, это уже процент неверно распознанных новых (тестовых) примеров обученной нейросетью.

Весь тот мой пост был про МНИСТ, а не про ХОР. Да-да, в том числе названные мной минута или несколько минут обучения - это именно для МНИСТ, каким бы фантастичным это не показалось кому-то.
1
12.11.2016, 22:27
Excalibur921
824 / 509 / 89
Регистрация: 12.10.2013
Сообщений: 3,362
13.11.2016, 00:40 25
Хотел пошаманить со сверхточными чисто из интереса… причем пару идей что можно в разы проще все делать.
Но уже столько либ готовых +тесты их скорости на мнисте и детальное описание на сайте лекуна на английском куча статей его...
Получается это будет:
Велик на CPU с кодом и алгоритмом новичка и выбором архитектуры сетки отбалды “Вуду кодинг” который будет давать ошибку больше готовых либ и работать медленней их… и применение всему этому аж нигде =).
Вот такое и отбивает. Или это рациональность? А вкурить суть как сделать архитектуру это долго и в книге написано по сути это все отбалды…либо нужен оч. Высокий уровень чтобы осознано задать устройство сетки. Помню в универе распознавал этих букв десятки страниц и даже и не знал про сетки =)).

Добавлено через 41 минуту
Сверточными сетками..ворд исправил криво =)
0
VTsaregorodtsev
609 / 567 / 85
Регистрация: 19.02.2010
Сообщений: 2,074
13.11.2016, 21:54 26
А никто и не спорит - просто внезапно возник разговор про использование МНИСТ в качестве современного реального учебного примера вместо ХОР. Да, можно взять готовую либу (начиная с персептронных FANN и AForge и заканчивая либами для свёрточных сеток, которые позволят сделать и персептрон тоже). Но сама задача - вполне подходит как пример, на котором можно тестить разные виды-структуры-размеры нейросетей и не нейросетевые алгоритмы тоже (всякие классификаторы из статистики - типа линейных дискриминантов, k-nn). Тем более, что если расчёты тормозят - есть возможность взять половину, четверть или 1/10 всей базы, но таки спокойно играться с этими реальными данными.
Ну и нельзя не отметить просто ОБЯЗАТЕЛЬНОЙ (для освоения методологии построения адекватных моделей) возможности исследовать зависимость поведения решения от размера выборки данных - т.е. учиться находить и видеть признаки репрезентативности обучающей выборки. ХОР с его 4мя примерами такого не позволяет сделать.
0
IR001
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 14
Завершенные тесты: 1
01.12.2016, 08:39  [ТС] 27
Доброго дня.

Подскажите, пожалуйста, большие значения весов (скажем, около -40;+40) - это нормально и допустимо?

4 скрытых слоя, 50 элементов в каждом.
На выходном слое веса чуть меньше (-20;+20).
Ср. квадрат. ошибка 0.0003.
Выборка из 3000+ примеров.
0
VTsaregorodtsev
609 / 567 / 85
Регистрация: 19.02.2010
Сообщений: 2,074
01.12.2016, 19:48 28
Цитата Сообщение от IR001 Посмотреть сообщение
большие значения весов (скажем, около -40;+40) - это нормально и допустимо?
Зависит от алгоритма обучения и от нейросети.

Для MLP с сигмоидной функцией активации - недопустимо как при инициализации, так и после обучения этой нейросети.
Ибо прокатывает только потому, что функции exp(), tanh() (это иной вариант сигмоидной функции) принимают и возвращают значения типа double.
А были бы у этих функций аргументы (вернее, возвращаемые результаты) одинарной точности - exp бы переполнилась при аргументах за пределами интервала +-87 (по памяти число пишу, но почти не ошибся). А организовать выход за эти границы - легко, при 50-то нейронах предыдущего слоя и больших весах от них.

Ну и просто посмотрите (в Екселе график постройте, например), при каких значениях аргумента сигмоида выходит на асимптоты. И подумайте, нужны ли для этого избыточные по модулю веса.
1
IR001
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 14
Завершенные тесты: 1
05.12.2016, 10:25  [ТС] 29
У меня в пределах (-40;+40), процент ошибки приемлемый. Но покопаю код ещё, может быть ошибка есть какая (вероятность сего 0.999).
Спасибо за ответ.
Кстати, обучение пошло веселее после предобработки входных данных. По Вашему выступлению на конференции в Ростове (2005 г.), нашёл в сети. Спасибо, просто и понятно.
0
VTsaregorodtsev
609 / 567 / 85
Регистрация: 19.02.2010
Сообщений: 2,074
05.12.2016, 23:37 30
Цитата Сообщение от IR001 Посмотреть сообщение
По Вашему выступлению на конференции в Ростове (2005 г.), нашёл в сети.
Журнальная статья - в 2 раза длиннее. Например, по причине наличия в нём таблицы с результатами экспериментов. Ну и про "другие свойства выборок" - тоже более подробно изложено, с формулами (вместо простой ссылки на статью) и с цифрами результатов экспериментов и для этих новых индикаторов. Вернее, цифры "сырые", но их можно вручную сводить в графики, где относительным изменениям того или иного индикатора (из трёх посчитанных) соответствует то или иное изменение длительности обучения, ну и тренд на этих графиках рисовать. Плюс - обсуждения побольше, в т.ч. с привязкой к значениям индюкаторов.
http://neuropro.ru/mypapers/neurcompmag05_4.pdf

Не по теме:

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

1
IR001
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 14
Завершенные тесты: 1
12.01.2017, 07:20  [ТС] 31
Доброго.
Пришёл к выводу, что большие веса (F сигмоид), вероятно, свидетельствуют о недостаточном количестве элементов в слое.
После увеличения размерности сети веса исчезли.
Не знаю на сколько моё замечание верно. Но уже интереснее, попробовал сделать по несколько сотен нейронов в разных (не во всех) слоях.
0
VTsaregorodtsev
609 / 567 / 85
Регистрация: 19.02.2010
Сообщений: 2,074
15.01.2017, 21:39 32
IR001, не только. Ещё и от настроек алгоритма обучения зависит.
Ибо если требуете абсолютно точного соответствия выходов сети и эталонных значений - то сетка будет напрягаться до тех пор, пока не загонит в насыщение нелинейности тех нейронов, которые можно загнать. Ибо при насыщении (на асимптотах) - производные становятся нулевые, а до моментов насыщения - ненулевые и позволяют сети обучаться.
Т.е. ранний останов обучения или обучение с некоторой "допустимой" погрешностью - это направления, куда можно/нужно посмотреть.

Ну или просто поменяйте (если у Вас задача классификации) эталонные коды с 0/1 или -1/1 (т.е. с уровней насыщения нелинейных функций, если на выходных нейронах у Вас нелинейность стоИт) на иные величины, не дотягивающие до уровней асимптот нелинейности. И посмотрите, как это повлияет (а это повлияет) на веса в обученной нейронке.
1
IR001
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 14
Завершенные тесты: 1
16.01.2017, 15:29  [ТС] 33
если требуете абсолютно точного соответствия выходов сети и эталонных значений
Нет, не требую. Тем более, что заметил как возможность обобщения резко падает (ошибка на тестовой выборке увеличивается) после преодоления определённого уровня ср.кв.ошибки.

Не могу разобраться вот в чём.
Допустим, три скрытых слоя. Какая разница в структуре скрытых слоёв: 100-20-300, или 100-50-20, или 50-100-40?
У меня в итоге получается примерно та же картина на выходе, всё те же решения. По скорости обучения: как Вы ранее верно заметили, у новичков код "тааакой медленный", что разницы не особо заметил.
Единственно, что экстремумы весов связей в более коротком слое оказывались чуть-чуть больше.
Наверняка опять что-то наворотил не по науке. Но подскажите, пожалуйста, какой результат стоит ожидать, то есть в чём ожидается разница?
0
warhast
20 / 20 / 4
Регистрация: 02.02.2014
Сообщений: 79
18.01.2017, 15:53 34
"Чего стоит ожидать", не имея представления об используемых наборе данных и алгоритмах, не скажет никто.

P.S. разве что если по-прежнему все веса инициализируются в 0 (или другую константу) - однозначно результаты для скрытых слоев вида 10000-10000-10000-10000 и 1-1-1-1 будут совпадать, причем для 1-...-1 еще и обучение быстрее пойдет, но больше шансов получить inf-ы и nan-ы в весах/выхлопе.
1
VTsaregorodtsev
609 / 567 / 85
Регистрация: 19.02.2010
Сообщений: 2,074
18.01.2017, 22:03 35
Цитата Сообщение от IR001 Посмотреть сообщение
Допустим, три скрытых слоя. Какая разница в структуре скрытых слоёв: 100-20-300, или 100-50-20, или 50-100-40?
Я вопроса не понял. С какой точки зрения Вам нужно описАть разницу?

С абстрактной же точки зрения, если все настройки (размеры и т.д.) более-менее правильно подобраны под задачу - то их варьирование отражается на точности обучения и/или обобщения нейросетки. Просто в некоторых задачах нужно варьировать число нейронов на единицы - и влияние будет видно (в задачах, где хватает нейросетки в несколько или в несколько десятков нейронов), а в каких-то задачах нужно с шагом в полсотни-сотню нейронов ходить, чтобы выстроить график зависимости точности от размера сети и найти минимум или асимптоту на этом графике. Аналогично и с другими настройками тех или иных алгоритмов - в зависимости от задачи их может понадобиться варьировать по-разному, чтобы видеть эффект.
Что будет не с точки зрения точности решения, а с "точки зрения" каких-то характеристик "внутренних свойств" сети (характеристик распределения весов синапсов, полученных после обучения) - предсказать ещё сложнее. Вернее, предсказать-то попробовать можно, но количественно выразить это предсказание...

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

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

1
18.01.2017, 22:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2017, 22:03

Простая задача.
Пожалуйста помогите кто может, очень нужно Даны натуральное число n, действительные числа...

Простая задача
Помогите пожалуйста решить. Имеется в наличии 3 арбуза. Найти самый тяжелый. Примечание: решить...

Не простая задача
Необходимо отправить из js запрос, трудность в слудующем. Один из параметров это url текущей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru