class NeuralNetwork::Neuron

Constants

LEARNING_RATE

make this a variable in the future to be configurable

Attributes

delta[RW]
incoming[RW]
input[RW]
outgoing[RW]
output[RW]

Public Class Methods

new() click to toggle source
# File lib/neural_network/neuron.rb, line 9
def initialize
  @incoming = []
  @outgoing = []
end

Public Instance Methods

activate(value = nil) click to toggle source
# File lib/neural_network/neuron.rb, line 14
def activate(value = nil)
  return @output = 1 if bias?

  @input = value || incoming.reduce(0) do |sum, connection|
    sum + connection.source.output * connection.weight
  end

  @output = activation_function(input)
end
bias?() click to toggle source
# File lib/neural_network/neuron.rb, line 49
def bias?
  false
end
connect(target) click to toggle source
# File lib/neural_network/neuron.rb, line 24
def connect(target)
  connection = Connection.new(self, target)
  outgoing << connection
  target.incoming << connection
end
input?() click to toggle source
# File lib/neural_network/neuron.rb, line 30
def input?
  incoming.empty?
end
train(target_output = nil) click to toggle source
# File lib/neural_network/neuron.rb, line 34
def train(target_output = nil)
  if !bias? && !input?
    if output?
      # this is the derivative of the error function
      # not simply difference in output
      # http://whiteboard.ping.se/MachineLearning/BackProp
      @delta = @output - target_output
    else
      calculate_outgoing_delta
    end
  end

  update_weights
end

Private Instance Methods

activation_function(input) click to toggle source
# File lib/neural_network/neuron.rb, line 72
def activation_function(input)
  1 / (1+ Math.exp(-input))
end
calculate_outgoing_delta() click to toggle source
# File lib/neural_network/neuron.rb, line 59
def calculate_outgoing_delta
  @delta = @outgoing.reduce(0) do |sum, connection|
    sum + connection.weight * connection.target.delta
  end
end
output?() click to toggle source
# File lib/neural_network/neuron.rb, line 55
def output?
  @outgoing.empty?
end
update_weights() click to toggle source
# File lib/neural_network/neuron.rb, line 65
def update_weights
  @outgoing.each do |connection|
    gradient = output * connection.target.delta
    connection.weight -= gradient * LEARNING_RATE
  end
end