GotAI.NET

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

 

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

 Все темы | Новая тема Стр.1 (3)След. > >>   Поиск:  
 Автор Тема: Прогнозирование с помощью НС
DmitryF
Сообщений: 2
Прогнозирование с помощью НС
Добавлено: 25 сен 08 20:13
Есть нейронная сеть из 4 слоев. Первые три - по 14 нейронов, последний слой - из 1 нейрона. Обучаю с помощью алгоритма обратного распространения ошибки чтоб научить ее прогнозировать числовой ряд 1,4,9,16,25, ...n^2. Тренирую на обучающих выборках:
входы желаемый выход
1, 4, 9, ..., 196 -> 225
4, 9, 16,..., 225 -> 256
..............................
256, 289,..., 841 -> 900
------------------------------------
После тренировки тестирую на выборке 289, 324, ... , 900. По идее сеть должна возвратить 961 (31^2). А возвращает 900. Подскажите, плиз, может кто-то сталкивался с подобной проблемой? Если да, то где может быть ошибка? На всякий случай вот мой код:

unit nnet;

interface
//Константы для функций активации
const
THRESHOLD=1; //пороговая
SIGNUM=2; //знаковая (сигнатурная)
SIGMOID=3; //сигмоидальная (логистическая)
SEMILINEAR=4; //полулинейная
LINEAR=5; //линейная
RADIAL_BASIS=6; //радиальная базисная (гауссова)
SEMILINEAR_WITH_SAT=7; //полулинейная с насыщением
LINEAR_WITH_SAT=8; //линейная с насыщением
HYPER_TAN=9; //гиперболический тангенс (сигмоидальная)
TRIANGULAR=10; //треугольная

type
TDouble1DVector=array[1..100] of double;
TInt1DVector=array[1..100] of integer;


type TNeuron=record //нейрон
inputs_count:integer; //количество входов
Inputs,Weights:TDouble1DVector; //входы и веса
Threshold:double; //порог
act_function:integer; //тип функции активации
output:double; //выход нейрона
error:double; //ошибка
sigma:double; //сигма
sum:double; //взвешенная сумма (без вычитания порога)
end;

type TLayer=record //слой
neurons_count:integer; //нейронов в слое
Neurons:array[1..100] of TNeuron; //нейроны
end;

type TNeuralNetwork=record //нейросеть
layers_count:integer; //слоев в нейросети
Layers:array[1..100] of TLayer; //слои
input_vals_count:integer; //количество входных значений
input_vals,output_vals:TDouble1DVector;//входные и выходные значения
end;

function f(x:double; act_function:integer):double; //функция активации
function df(x:double; act_function:integer):double; //производная от функции активации

//инициализация нейросети
procedure InitNeuralNetwork(l_count:integer; //количество слоев
neurons_in_layer:TInt1DVector; //нейронов в слое
act_function:TInt1DVector; //функции активации
inp_count:integer; //количество входов в сеть
var Net:TNeuralNetwork); //инициализированная сеть

//обучение нейросети
procedure TrainNeuralNetwork(inp_count:integer; //количество входов в сеть
inp:TDouble1DVector; //входы
desired_outputs_count:integer; //количество выходов из сети
desired_outputs:TDouble1DVector; //желаемые выходы
var Net:TNeuralNetwork); //натренированная нейросеть

//получение результатов от нейросети
procedure GetResults(inp_count:integer; //количество входов в сеть
inp:TDouble1DVector; //входы
Net:TNeuralNetwork; //натренированная нейросеть
var desired_outputs_count:integer; //количество выходов из сети
var desired_outputs:TDouble1DVector); //выходы из сети

implementation

function f(x:double; act_function:integer):double;
begin
case act_function of
1: if x<0 then f:=0 else f:=1;
2: if x>0 then f:=1 else f:=-1;
3: if abs(x) < 38 then f:=1/(1+exp(-x)) else if x >= 38 then f:=1 else f:=0;
4: if x>0 then f:=x else f:=0;
5: f:=x;
6: f:=exp(-x*x);
7: if x<=0 then f:=0 else if (0<x) and (x<1) then f:=x else f:=1;
8: if x<=-1 then f:=-1 else if (-1<x) and (x<1) then f:=x else f:=1;
9: f:=(exp(x)-exp(-x))/(exp(x)+exp(-x));
10: if abs(x)<=1 then f:=1-abs(x) else f:=0;
else f:=0;
end;
end;

function df(x:double; act_function:integer):double;
begin
case act_function of
1: df:=0;
2: df:=0;
3: df:=1/(1+exp(-x))*(1-1/(1+exp(-x)));
4: if x>0 then df:=1 else df:=0;
5: df:=1;
6: df:=-2*x*exp(-x*x);
7: if x<=0 then df:=0 else if (0<x) and (x<1) then df:=1 else df:=0;
8: if x<=-1 then df:=0 else if (-1<x) and (x<1) then df:=1 else df:=0;
9: df:=4/sqr(exp(x)+exp(-x));
10: if (-1<=x) and (x<0) then df:=1 else if (0<=x) and (x<=1) then df:=-1 else df:=0;
else df:=0;
end;
end;


procedure InitNeuralNetwork(l_count:integer;
neurons_in_layer:TInt1DVector;
act_function:TInt1DVector;
inp_count:integer;
var Net:TNeuralNetwork);
var i,j,k:integer;
begin
Randomize;
//Количество слоев
Net.layers_count:=l_count;
//Количество нейронов в слоях
for i:=1 to l_count do
Net.Layers[i].neurons_count:=neurons_in_layer[i];
//Функция активации в каждом слое
for i:=1 to l_count do
for j:=1 to Net.Layers[i].neurons_count do
Net.Layers[i].Neurons[j].act_function:=act_function[i];
//Количество входов в каждый нейрон первого слоя
for i:=1 to Net.Layers[1].neurons_count do
Net.Layers[1].Neurons[i].inputs_count:=inp_count;
//Для каждого след. слоя количество входов = количеству нейронов в пред. слое
for i:=2 to Net.layers_count do
for j:=1 to Net.Layers[i].neurons_count do
Net.Layers[i].Neurons[j].inputs_count:=Net.Layers[i-1].neurons_count;
//Задаем начальные значения весов и порогов
for i:=1 to Net.Layers_count do
for j:=1 to Net.Layers[i].neurons_count do
begin
for k:=1 to Net.Layers[i].Neurons[j].inputs_count do
begin
Net.Layers[i].Neurons[j].Weights[k]:=random(5000)/10000;
Net.Layers[i].Neurons[j].error:=10E+38;
end;
Net.Layers[i].Neurons[j].Threshold:=random(5000)/10000;
end;
end;

procedure TrainNeuralNetwork(inp_count:integer;
inp:Tdouble1DVector;
desired_outputs_count:integer;
desired_outputs:Tdouble1DVector;
var Net:TNeuralNetwork);
const
epochs=10000;
procedure RunNetwork(); //прогон сети
var
i,j,k:integer;
begin
//Подсчет выходных значений нейронов
for i:=1 to Net.layers_count do
begin
for j:=1 to Net.Layers[i].neurons_count do
with Net.Layers[i].Neurons[j] do
begin
sum:=0;
for k:=1 to inp_count do sum:=sum+Inputs[k]*Weights[k];
output:=f(sum-Threshold,act_function);
end;
//Передача сигналов с выходов пред. слоя на входы след. слоя
if i<Net.layers_count then
for j:=1 to Net.Layers[i+1].neurons_count do
for k:=1 to Net.Layers[i+1].Neurons[j].inputs_count do
Net.Layers[i+1].Neurons[j].Inputs[k]:=Net.Layers[i].Neurons[k].output;
end;
end;

procedure CalculateErrors(); //вычисление ошибок
var
i,m,k:integer;
sum_err:double;
begin
for k:=Net.layers_count downto 1 do
for i:=1 to Net.Layers[k].neurons_count do
if k=Net.layers_count then //Если последний слой
with Net.Layers[k].Neurons[i] do
begin
error:=desired_outputs[i]-output;
sigma:=error*df(output,act_function);
end
else //если другой слой
begin
sum_err:=0;
for m:=1 to Net.Layers[k+1].neurons_count do
with Net.Layers[k+1].Neurons[m] do
sum_err:=sum_err+Weights[i]*sigma;
with Net.Layers[k].Neurons[i] do
begin
error:=sum_err;
sigma:=error*df(output,act_function);
end;
end;
end;

procedure UpdateWeights();
const eta=0.025;
var
i,j,k:integer;
begin
for k:=Net.layers_count downto 1 do
for i:=1 to Net.Layers[k].neurons_count do
begin
for j:=1 to Net.Layers[k].Neurons[i].inputs_count do
with Net.Layers[k].Neurons[i] do
begin
Weights[j]:=Weights[j]+2*eta*sigma*inputs[j];
Threshold:=Threshold-2*eta*sigma;
end;
end;
end;
var i,j:integer;
begin
for i:=1 to Net.Layers[1].neurons_count do
for j:=1 to Net.Layers[1].Neurons[i].inputs_count do
Net.Layers[1].Neurons[i].Inputs[j]:=inp[j];

for i:=1 to epochs do
begin
RunNetwork();
CalculateErrors();
UpdateWeights();
end;
end;

procedure GetResults(inp_count:integer;
inp:Tdouble1DVector;
Net:TNeuralNetwork;
var desired_outputs_count:integer;
var desired_outputs:Tdouble1DVector);

procedure RunNetwork(); //прогон сети
var
i,j,k:integer;
begin
//Подсчет выходных значений нейронов
for i:=1 to Net.layers_count do
begin
for j:=1 to Net.Layers[i].neurons_count do
with Net.Layers[i].Neurons[j] do
begin
sum:=0;
for k:=1 to inp_count do sum:=sum+Inputs[k]*Weights[k];
output:=f(sum-Threshold,act_function);
end;
//Передача сигналов с выходов пред. слоя на входы след. слоя
if i<Net.layers_count then
for j:=1 to Net.Layers[i+1].neurons_count do
for k:=1 to Net.Layers[i+1].Neurons[j].inputs_count do
Net.Layers[i+1].Neurons[j].Inputs[k]:=Net.Layers[i].Neurons[k].output;
end;
end;


var i,j:integer;
begin
for i:=1 to Net.Layers[1].neurons_count do
for j:=1 to Net.Layers[1].Neurons[i].inputs_count do
Net.Layers[1].Neurons[i].Inputs[j]:=inp[j];
RunNetwork();
desired_outputs_count:=Net.Layers[Net.layers_count].neurons_count;
for i:=1 to desired_outputs_count do
desired_outputs[i]:=Net.Layers[Net.layers_count].Neurons[i].output;
end;

end.


program NeuralNets;

{$APPTYPE CONSOLE}
{$M 16777216}
uses
SysUtils,
nnet in ''nnet.pas'';

var
neurons_in_layer:TInt1DVector;
act_function:TInt1DVector;
Net:TNeuralNetwork;
inputs:TDouble1DVector;
desired_outputs:TDouble1DVector;
i,x:integer;
desired_outputs_count:integer;

begin
neurons_in_layer[1]:=14;
neurons_in_layer[2]:=14;
neurons_in_layer[3]:=14;
neurons_in_layer[4]:=1;

act_function[1]:=SIGMOID;
act_function[2]:=SIGMOID;
act_function[3]:=SIGMOID;
act_function[4]:=LINEAR;

InitNeuralNetwork(4,neurons_in_layer,act_function,14,Net);
for i:=1 to 16 do
begin
for x:=i to 14+i-1 do
begin
inputs[x-i+1]:=x*x;
//write(inputs[x-i+1]:0:1,'' '');
end;
desired_outputs[1]:=(i+14)*(i+14);
TrainNeuralNetwork(14,inputs,1,desired_outputs,Net);
//writeln(Net.Layers[4].Neurons[1].output:0:1);
end;

for x:=17 to 30 do
begin
inputs[x-16]:=x*x;
//write(inputs[x-16]:0:1,'' '');
end;
desired_outputs[1]:=0;
GetResults(14,inputs,Net,desired_outputs_count,desired_outputs);
writeln(desired_outputs[1]:0:1);
readln;
end.


[Ответ][Цитата]
tac
Сообщений: 2601
На: Прогнозирование с помощью НС
Добавлено: 26 сен 08 6:18
Попробуйте почитать здесь http://www.gotai.net/forum/Default.aspx?postid=10411#10411
Не так давно я тоже воевал с этим алгоритмом ... там все много проще в три слоя, но это в данном случае не принципиально ...
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Прогнозирование с помощью НС
Добавлено: 26 сен 08 18:51
Читайте нейроучебники. Многослойный персептрон гарантированно задачу экстраполяции не решает! Просто потому, что у него сигмоидные нейроны могут влетать в насыщение (т.е. как ни увеличивай сигнал на входе, на выходе изменения будут на микроны).

--------------------------
нейронные сети, анализ данных, прогнозирование
[Ответ][Цитата]
DmitryF
Сообщений: 2
На: Прогнозирование с помощью НС
Добавлено: 26 сен 08 19:12
Жаль, что не решает, но всеравно спасибо за ответы.
[Ответ][Цитата]
tac
Сообщений: 2601
На: Прогнозирование с помощью НС
Добавлено: 27 сен 08 0:47
Цитата:
Автор: Victor G. Tsaregorodtsev

Читайте нейроучебники. Многослойный персептрон гарантированно задачу экстраполяции не решает! Просто потому, что у него сигмоидные нейроны могут влетать в насыщение (т.е. как ни увеличивай сигнал на входе, на выходе изменения будут на микроны).


Какую же задачу он ГАРАНТИРОВАННО рещает ?
[Ответ][Цитата]
гость
195.93.160.*
На: Прогнозирование с помощью НС
Добавлено: 27 сен 08 9:45
Видимо, распознавание образов.


[Ответ][Цитата]
гость
89.208.11.*
На: Прогнозирование с помощью НС
Добавлено: 27 сен 08 16:11
*
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Прогнозирование с помощью НС
Добавлено: 27 сен 08 21:06
tac Например, аппроксимации (а аппроксимация обычно не предполагает последующий выход за исходную область значений аргументов функции, аналогично и в статистике стат.модель должна строиться по репрезентативной выборке, а не по её однобокому фрагменту). И то - при условии роста числа нейронов в сети до нужного количества
Далее, после обучения аппроксимации, можно решать задачу интерполяции - получать ответ между эталонными узловыми точками.


гость 89.208.11.*

- Леди, - осторожно начал Райделл, - да из вас же торговый менеджер, как из моей жопы - соловей. У вас же совсем крыша съехала.
(С) У.Гибсон, "Виртуальный свет"
[Ответ][Цитата]
tac
Сообщений: 2601
На: Прогнозирование с помощью НС
Добавлено: 28 сен 08 15:06
Цитата:
Автор: Victor G. Tsaregorodtsev

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


Не могли бы вы пояснить как соотносятся между собой понятия аппроксимации и распознования образов ? Есть ли это одно и тоже или чем-то отличается (чем?) (только не по формулировке, а по сути) ? И еще есть ли хоть какая нибудь ИНС про которую можно сказать, что она способна ГАРАНТИРОВАННО решить задачу экстраполяции ?
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Прогнозирование с помощью НС
Добавлено: 28 сен 08 16:35
Аппроксимация "в базовом варианте" "проводит" функцию (находит функцию и её коэффициенты) через ряд эталонных точек.
Распознавание образов (вернее, обучение нейросетки в этой задаче) делает то же самое. Вернее, учась давать эталонные коды в эталонных точках, сетка дополнительно неявно выстраивает функцию - разделяющую поверхность между классами.
А что понимается под "гарантированием"? Сетка-то экстраполировать может (т.е. выдаст ответ, даже если ей на входы сунуть плюс или минус бесконечности), но из-за ограниченных диапазонов значений сигмоидных функций у нее и значения на выходе будут ограничены каким-то диапазоном. Хотите отказаться от ограниченной сигмоиды - отказывайтесь, только имейте геморрой и с обучением, и с точностью решения после обучения, т.к. вырастут и возможные производные в сети, и возможные сигналы нейронов (даже не абсолютные величины важны, а соотношения больших производных или сигналов к малым, т.к. просто будет происходить потеря чувствительности к малым сигналам, потерявшимся на фоне больших, да и шум на единственном входе так может быть усилен по пути до выхода, что сетка погоду на луне будет показывать).

----------------------------------------------------------------------------------------------
www.neuropro.ru - нейросети, анализ данных, прогнозирование
[Ответ][Цитата]
tac
Сообщений: 2601
На: Прогнозирование с помощью НС
Добавлено: 03 окт 08 0:41
Цитата:
Автор: Victor G. Tsaregorodtsev
Аппроксимация "в базовом варианте" "проводит" функцию (находит функцию и её коэффициенты) через ряд эталонных точек.
Распознавание образов (вернее, обучение нейросетки в этой задаче) делает то же самое. Вернее, учась давать эталонные коды в эталонных точках, сетка дополнительно неявно выстраивает функцию - разделяющую поверхность между классами.


Т.е. без разницы говорить или аппроксимация или распознование образов - т.к. это одно и тоже ?

Цитата:
Автор: Victor G. Tsaregorodtsev
А что понимается под "гарантированием"? Сетка-то экстраполировать может (т.е. выдаст ответ, даже если ей на входы сунуть плюс или минус бесконечности), но из-за ограниченных диапазонов значений сигмоидных функций у нее и значения на выходе будут ограничены каким-то диапазоном. Хотите отказаться от ограниченной сигмоиды - отказывайтесь, только имейте геморрой и с обучением, и с точностью решения после обучения, т.к. вырастут и возможные производные в сети, и возможные сигналы нейронов (даже не абсолютные величины важны, а соотношения больших производных или сигналов к малым, т.к. просто будет происходить потеря чувствительности к малым сигналам, потерявшимся на фоне больших, да и шум на единственном входе так может быть усилен по пути до выхода, что сетка погоду на луне будет показывать).


Хорошо, а что будет если функция пороговая ?
гемороя с обучением нету (точнее, наоборот с сигмоидой оно хуже) , точность как минимум не хуже сигмоидальной ... ? Какая еще потеря малых сигналов - это у сигмоиды так, а так образ бинаризован - поэтому по определению все сигналы одного рода, просто есть сигнал или нет ...
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Прогнозирование с помощью НС
Добавлено: 03 окт 08 19:10
>Т.е. без разницы говорить или аппроксимация или распознование образов

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

>Хорошо, а что будет если функция пороговая ?

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

>гемороя с обучением нету (точнее, наоборот с сигмоидой оно хуже)

Этот геморрой и "хуже" для сигмоиды - чисто Ваши проблемы. Дорабатывайте программу или свое понимание метода. Бэкпроп - самый широко распространенный сейчас метод из тех, которые можно назвать методами машинного обучения, и народ не жалуется

>а так образ бинаризован

И что? Как связана бинаризированность образа с тем, что требуется от нейросети на выходе? Вопрос-то был в том, чтобы выйти на входах сети за исходные интервалы значений и получить при этом некоторый хороший выход за интервал исходных эталонных значений и на выходе сети. А с бинаризированным образом - что, будет какое-то третье состояние пиксела, например, значение 2?
[Ответ][Цитата]
tac
Сообщений: 2601
На: Прогнозирование с помощью НС
Добавлено: 03 окт 08 23:13
Цитата:
Автор: Victor G. Tsaregorodtsev
Будет однонейронный персептрон Розенблатта (обучаемый) или многослойный персептрон Р с обучаемым только последним слоем Прогнозировать он не умеет - попробуйте спрогнозировать с его помощью, например, биржевой курс рубля к баксу


т.е. Вы хотите сказать что перцептрон Розенблата прогнозировать не умеет (что такое однослойный перцептрон я не знаю и зхнать не хочу - это нелепеца ) ? А бэкпро типа умеет ?
Не вы ли говорили, что распознование образов и апроксимация, частный случай которой экстраполяция, т.е. прогнозирование - практически одно и тоже .. конкретной разницы вы не назвали ... так вот перцептрон Розенблатта распознает на порядок лучше бэкпропа - и народ не жалуется (если соображает что такое перцептрон Розенблатта )
[Ответ][Цитата]
tac
Сообщений: 2601
На: Прогнозирование с помощью НС
Добавлено: 03 окт 08 23:22
Цитата:
Автор: Victor G. Tsaregorodtsev
>а так образ бинаризован

И что? Как связана бинаризированность образа с тем, что требуется от нейросети на выходе? Вопрос-то был в том, чтобы выйти на входах сети за исходные интервалы значений и получить при этом некоторый хороший выход за интервал исходных эталонных значений и на выходе сети. А с бинаризированным образом - что, будет какое-то третье состояние пиксела, например, значение 2?


Ну, если вы не в курсе, в чем я сомневаюсь ... и если вы говорите о выходе ... то бинаризованный сигнал будет отображен на поверхность больщей размерности, и получившийся сигнал будет взвешен ... поэтому разница будет как раз находится в весовых коэффициентах, которые участвую в разных пропорциях ... это в бэкпропе с этим творится всякая херня, а тут все в прядке нужны как маленькие величины так и большие, для другого стимула активируются другие нейроны среднего слоя и снова все в порядке ...
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Прогнозирование с помощью НС
Добавлено: 04 окт 08 18:28
>Вы хотите сказать что перцептрон Розенблата прогнозировать не умеет

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

>так вот перцептрон Розенблатта распознает на порядок лучше бэкпропа

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

>то бинаризованный сигнал будет отображен на поверхность больщей размерности,
>и получившийся сигнал будет взвешен

Если действительно гарантированно делать больше нейронов в скрытом слое, чем число пикселов на картинке - тогда да, будет отображение в бОльшую размерность.
Хотя... Похожий принцип используется и в нелинейных SVM (в них на среднем слое вместо нейронов со случайными связями к ретине происходит генерация искусственных добавочных признаков, например, попарных произведений исходных входных сигналов, произведений троек, квадратов сигналов и т.д. - далее выполняется их подсовывание взвешивающему линейному нейрону), так что можно апеллировать к конкретным теоремам о том, что может и что не может делать такая схема. На текущем уровне аргументации (простые слова) разговор смысл уже потерял.
Например, можно взять теоремы из статьи Bengio, LeCun "Scaling learning algorithms towards AI" 2007г. Взять эту статью можно в разделе публикаций на сайте yann.lecun.com. Там изложена теория, которая вполне может угробить практический интерес к машинам опорных векторов и всем малослойным сеткам (в том числе и к персептрону Р предполагаемой Вами структуры), как раньше книга Минского и Пейперта угробила интерес к классическому персептрону.

>это в бэкпропе с этим творится всякая херня

"Да Вы просто не умеете их готовить" (С) Анекдот

>для другого стимула активируются другие нейроны среднего слоя и снова все в порядке

А что, в бэкпроповской сети это не так?
[Ответ][Цитата]
 Стр.1 (3): [1]  2  3След. > >>