Добрый день, уважаемые!
прошу у Вас помощи, ибо 3й день я не могу найти ошибку в написанном мной алгоритме обучения нейросети, казалось бы проще уже не бывает: гомогенная нейронная сеть с биполярной сигмоидной функцией и обучением при помощи обратного распространения ошибки...
один нейрон учится командам AND и OR, однако стоит добавить еще один слой и попытаться обучить команде XOR, как сетка начинает ворочить носом и и выдавать что угодно, лишь бы не "исключающе или" (структура сети для XOR сделана совершенно стандартная, из книжек).
p.s. не нашел более подходящего раздела, ибо исходники у меня на Action Script'e
p.s.s. если появитятся добрые люди, имеющие возможность и желание помочь, выложу исходники и литературу, на которую я опирался при написании своей программы, а также опишу всю структуру нейросети, чтобы Вам не пришлось сидеть и разбираться что у меня к чему (код обучения, кстати, с коментариями).
p.s.s.s. если честно я на панике, это часть моего диплома, защита приддипломной практики которого будет 7 числа =(
Добавлено через 19 минут
конено, у меня есть и примеры и код.
проект лежит в дроп боксе, могу дать ссылку
функция обучения сети:
Код AS1/AS2:
public function train():void{
var iter:int = 0;
while (iter++<1000){
for (var ei:int = 0; ei < learningInputArray.length; ei++){//обход обучающих примеров
//прямой прогон
var output:Number = computeResult(learningInputArray[ei].inputSignalArray);
var realOutput:Number = learningInputArray[ei].realOutput;
for (var li:int = neuralLayerArray.length - 1; li >= 0; li--){//обход слоев сети
var neuralLayer:NeuralLayer = neuralLayerArray[li];
for (var ni:int = 0; ni < neuralLayer.neuronArray.length; ni++){// обход нейронов в сети
var neuron:Neuron = neuralLayer.neuronArray[ni];
var inputSignal:Signaller;
var delta:Number = 0;
var error:Number = 0;
if (li == neuralLayerArray.length - 1){//если выходной слой:
//расчет ошибки:
error = output - realOutput;
} else {//если скрытый слой:
error = 0;
//расчет распространения ошибки:
var nextNeuralLayer:NeuralLayer = neuralLayerArray[li+1];
for (var nnl:int = 0; nnl<nextNeuralLayer.neuronArray.length; nnl++){
var learnedNeuron:Neuron = nextNeuralLayer.neuronArray[nnl];
error += 0.5*learnedNeuron.learningError * learnedNeuron.synapticPowerArray[ni] * (1 - learnedNeuron.outputSignal*learnedNeuron.outputSignal);
}
}
neuron.learningError = error;
//корректировка входных весов нейрона:
for (var spah:int = 0; spah<neuron.synapticPowerArray.length; spah++){
inputSignal = neuron.inputSignalArray[spah];
neuron.synapticPowerArray[spah] = neuron.synapticPowerArray[spah] - 0.5*error*(1 - neuron.outputSignal*neuron.outputSignal)*inputSignal.outputSignal;
}
//корректировка активационного барьера:
neuron.activationBarrier = neuron.activationBarrier + 0.5*error*(1 - neuron.outputSignal*neuron.outputSignal)
trace("first layer");
}
}
}
}
}
активационная функция нейрона:
Код AS1/AS2:
override public function compute(v:Number):Number{
var e:Number = Math.E;
return 2/(1 + Math.pow(e, (-1*v)))-1;
}
основной материал, на который я опирался:
http://www.machinelearning.ru/wiki/i...LDA2011no1.pdf