Method: TLearn::FNN#back_propagation

Defined in:
lib/t_learn/feedforward_neural_network.rb

#back_propagation(y) ⇒ Object

Parameters:

  • y

    Array teacher_data



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/t_learn/feedforward_neural_network.rb', line 110

def back_propagation(y)

  raise "output size different from node num of output layer"  if get_output_layer.size != y.size
  # raise "o"  if get_output_layer.size != y.size
  delta = {}
  ( @layer_size - 1).downto(0) do |layer_num|
    if ( @layer_size - 1) == layer_num   # if output layer
      @layer_list[layer_num].each_with_index do |output_node, i|
        delta["#{output_node.id}"] = -1.0 * calc_err(y[i], output_node.w) * output_node.w * (1.0 -output_node.w)
      end
    else 
      @layer_list[layer_num].each do |from_node|
        # リンクの更新
        @layer_list[layer_num + 1].each do |to_node|
          # モメンタムによる更新
          momentum_weight = @momentum_rate * @momentum_weight_list["#{from_node.id}_#{to_node.id}"]
          update_weight = -1.0 * @learning_rate * delta["#{to_node.id}"] * from_node.w
          @link_list["#{from_node.id}_#{to_node.id}"] = @link_list["#{from_node.id}_#{to_node.id}"] + update_weight + momentum_weight
          @momentum_weight_list["#{from_node.id}_#{to_node.id}"] = update_weight # for momentum
        end
        # その層のdeltaの更新
        delta["#{from_node.id}"] = calc_delta(delta,layer_num, from_node) * from_node.w * (1.0 - from_node.w)
      end
    end
  end
end