samrussell/lernmi

View on GitHub
lib/link.rb

Summary

Maintainability
A
0 mins
Test Coverage
class Link
  attr_accessor :weight
  attr_accessor :output_neuron, :input_neuron

  def initialize(initial_weight, training_rate = 0.1, input_neuron = nil, output_neuron = nil)
    @weight = initial_weight
    @training_rate = training_rate
    @input_neuron = input_neuron
    @output_neuron = output_neuron
  end

  def propagate
    @output_neuron.input(@input_neuron.output * @weight)
  end

  def backpropagate
    output_sensitivity = output_neuron.previous_layer_sensitivity_sum * activation_function_sensitivity(output_neuron.output)

    input_neuron.submit_sensitivity(@weight * output_sensitivity)

    update_weight(input_neuron.output * output_sensitivity)
  end

  private

  def update_weight(sensitivity)
    @weight -= sensitivity * @training_rate
  end

  def activation_function_sensitivity(value)
    value * (1.0 - value)
  end
end