AI-NNFlex
view release on metacpan or search on metacpan
lib/AI/NNFlex/Reinforce.pm view on Meta::CPAN
##########################################################
# AI::NNFlex::Reinforce
##########################################################
# NNFlex learning module
# this is a bit of an experimental one. All it does is
# Reinforce the weight depending on the sign & activity
# of the node, sort of a gross oversimplification of a
# neuron.
#
##########################################################
# Versions
# ========
#
# 1.0 20041125 CColbourn New module
# 1.1 20050116 CColbourn Fixed reverse @layers
# bug reported by GM Passos
#
# 1.2 20050218 CColbourn Mod'd to change weight
# addressing from hash to
# array for nnf0.16
#
# 1.3 20050307 CColbourn repackaged as a subclass
# of nnflex
#
##########################################################
# ToDo
# ----
#
#
###########################################################
#
package AI::NNFlex::Reinforce;
use AI::NNFlex;
use AI::NNFlex::Feedforward;
use base qw(AI::NNFlex AI::NNFlex::Feedforward);
use strict;
###########################################################
#AI::NNFlex::Reinforce::learn
###########################################################
sub learn
{
my $network = shift;
my @layers = @{$network->{'layers'}};
# no connections westwards from input, so no weights to adjust
shift @layers;
# reverse to start with the last layer first
foreach my $layer (reverse @layers)
{
my @nodes = @{$layer->{'nodes'}};
foreach my $node (@nodes)
{
my @westNodes = @{$node->{'connectedNodesWest'}->{'nodes'}};
my @westWeights = @{$node->{'connectedNodesWest'}->{'weights'}};
my $connectedNodeCounter=0;
foreach my $westNode (@westNodes)
{
my $dW = $westNode->{'activation'} * $westWeights[$connectedNodeCounter] * $network->{'learning rate'};
$node->{'connectedNodesWest'}->{'weights'}->[$connectedNodeCounter] += $dW;
}
}
}
}
1;
=pod
=head1 NAME
( run in 0.493 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )