Google Groups

Re: Playing with clojure-encog, Machine-Learning wrapper

frye Nov 3, 2012 4:14 PM
Posted in group: Clojure
Ok, so this is a continuation of the thread where I'm trying to build a neural network. I took a step back, and am trying to implement the backpropagation algorithm (to understand the gradient descent principle). At the moment, I'm just trying to predict the Ask price (Bid & Ask will come later). I've gotten to the point where I can i) create a neural network with 3 layers: input, hidden and output. The neural-network has a structure as in B) (see below). I'm trying to predict EURUSD tick data and each tick has a structure like in A) (see below). I can also do ii) feed forward calculations (which calculates the total error) and iii) the backpropogation (with weight updates). So my intuition is a little better, but I'm still getting funny results. Can anyone provide specific critiques of my code and algorithms? 

The problem is that, during training, the error progression looks something like in C). This means that the backpropaagation and weight updates, are making the connection weights progressively smaller. I'm trying to figure out what in my training calculation is throwing the numbers off. 
  1. I used this paper as a guideline. See pages 17 - 19 (click here). As well, I used some of Richard Ng's online video guides (click here)
  2. My code is online (click here). And I've hard-coded some start points at the bottom of neural-net-clj (click here). 

Based on the abouve paper (p. 17 - 19), my understanding of the crucial steps are below: 
  • total-error: predicted-ask - actual-ask

  • backpropagated-error (starting from the output, we need to propagate the total error, back through the NN). For the output layer, it's i) , where o = neuron's calculated output , t = actual value . For the hidden and input layers, the backpropogated value is ii). 
  • i): δ(2) = o(2) ( 1 o(2) ) ( o(2) tj )
  • ii): δ(1) = o(1) ( 1 o(1) ) sum of output edges( w(2)δ(2) ). 

  • partial-derivative: is that neuron's calculated output * it's backpropogated error, or: δ(1)oi.

  • weight update (where γ is a learning constant): γo(1)δ(2),

Time,  Ask,  Bid,  AskVolume,  BidVolume
["01.05.2012 20:00:00.676" "1.32390" "1.32379" "3000000.00" "2250000.00"]

 ({:partial-derivative -0.009423520331775223,                                                                                                                                                                                                                                                                                                                                                                                      
   :backpropagated-error -0.009577375764433694,                                                                                                                                                                                                                                                                                                                                                                                    
   :calculated-error -0.6059176084131211,                                                                                                                                                                                                                                                                                                                                                                                       
   :calculated-value 0.9839355334443673,                                                                                                                                                                                                                                                                                                                                                                                         
   ({:calculated 1.3151970649487539,                                                                                                                                                                                                                                                                                                                                                                                               
     :key :avolume,                                                                                                                                                                                                                                                                                                                                                                                                                
     :value 2.25,                                                                                                                                                                                                                                                                                                                                                                                                                  
     :weight 0.5845320288661129,                                                                                                                                                                                                                                                                                                                                                                                                   
     :bias 0}                                                                                                                                                                                                                                                                                                                                                                                                                   
    {:calculated 1.6338470575538622,                                                                                                                                                                                                                                                                                                                                                                                               
     :key :bvolume,                                                                                                                                                                                                                                                                                                                                                                                                                
     :value 3.0,                                                                                                                                                                                                                                                                                                                                                                                                                   
     :weight 0.5446156858512874,                                                                                                                                                                                                                                                                                                                                                                                                   
     :bias 0}                                                                                                                                                                                                                                                                                                                                                                                                                   
    {:calculated 0.2561967809535058,                                                                                                                                                                                                                                                                                                                                                                                               
     :key :ask,                                                                                                                                                                                                                                                                                                                                                                                                                 
     :value 1.32379,                                                                                                                                                                                                                                                                                                                                                                                                               
     :weight 0.19353279670756374,                                                                                                                                                                                                                                                                                                                                                                                                  
     :bias 0}                                                                                                                                                                                                                                                                                                                                                                                                                   
    {:calculated 0.23599856672991676,                                                                                                                                                                                                                                                                                                                                                                                              
     :key :bid,                                                                                                                                                                                                                                                                                                                                                                                                                    
     :value 1.3239,                                                                                                                                                                                                                                                                                                                                                                                                                
     :weight 0.17826011536363529,                                                                                                                                                                                                                                                                                                                                                                                                  
     :bias 0}                                                                                                                                                                                                                                                                                                                                                                                                                   
    {:calculated 0.6737111232873203,                                                                                                                                                                                                                                                                                                                                                                                               
     :key :time,                                                                                                                                                                                                                                                                                                                                                                                                                   
     :value 1.335902400676,                                                                                                                                                                                                                                                                                                                                                                                                        
     :weight 0.5043116345523487,                                                                                                                                                                                                                                                                                                                                                                                                   
     :bias 0}),                                                                                                                                                                                                                                                                                                                                                                                                                 
   :id "583c10bfdbd326ba757cc20613ac7d057547f4c"} 
  { ... }
  { ... }
  { ... }
  { ... })
 ({ ... }
  { ... }
  { ... }
  { ... }
  { ... })
 ({:partial-derivative -0.036994957610738156,                                                                                                                                                                                                                                                                                                                                                                                      
   :backpropagated-error -0.04145832311707688,                                                                                                                                                                                                                                                                                                                                                                                     
   :calculated-error -0.4315490940191753,                                                                                                                                                                                                                                                                                                                                                                                       
   :calculated-value 0.8923409059808247,                                                                                                                                                                                                                                                                                                                                                                                         
   ({:calculated 0.7242368892448368,                                                                                                                                                                                                                                                                                                                                                                                               
     :input-id "583c10bfdbd326ba757cc20613ac7d057547f4b",                                                                                                                                                                                                                                                                                                                                                                          
     :weight 0.8067764901943574,                                                                                                                                                                                                                                                                                                                                                                                                   
     :bias 0}                                                                                                                                                                                                                                                                                                                                                                                                                   
    {:calculated 0.36721372822007137,                                                                                                                                                                                                                                                                                                                                                                                              
     :input-id "583c10bfdbd326ba757cc20613ac7d057547f4a",                                                                                                                                                                                                                                                                                                                                                                          
     :weight 0.4496084864073244,                                                                                                                                                                                                                                                                                                                                                                                                   
     :bias 0}                                                                                                                                                                                                                                                                                                                                                                                                                   
    {:calculated 0.5280161699903125,                                                                                                                                                                                                                                                                                                                                                                                               
     :input-id "583c10bfdbd326ba757cc20613ac7d057547f49",                                                                                                                                                                                                                                                                                                                                                                          
     :weight 0.5522295330396643,                                                                                                                                                                                                                                                                                                                                                                                                   
     :bias 0}                                                                                                                                                                                                                                                                                                                                                                                                                   
    {:calculated 0.27331789552319197,                                                                                                                                                                                                                                                                                                                                                                                              
     :input-id "583c10bfdbd326ba757cc20613ac7d057547f48",                                                                                                                                                                                                                                                                                                                                                                          
     :weight 0.29332599944059334,                                                                                                                                                                                                                                                                                                                                                                                                  
     :bias 0}                                                                                                                                                                                                                                                                                                                                                                                                                   
    {:calculated 0.22209386028791103,                                                                                                                                                                                                                                                                                                                                                                                              
     :input-id "583c10bfdbd326ba757cc20613ac7d057547f47",                                                                                                                                                                                                                                                                                                                                                                          
     :weight 0.2798996186425936,                                                                                                                                                                                                                                                                                                                                                                                                   
     :bias 0}),                                                                                                                                                                                                                                                                                                                                                                                                                 
   :id "583c10bfdbd326ba757cc20613ac7d057547f46"})} 

"total-error[-0.39489344469762966] / calculated-value[0.9289965553023704] / actual-value[1.32389]"               ;; feed forward result, from initial randomized weights in the neural network                                                                                                                                                                                                                                                                                                                      
"total-error[-0.8491601535927018] / calculated-value[0.47472984640729826] / actual-value[1.32389]"                                                                                                                    
"total-error[-0.8727499656138056] / calculated-value[0.4511300343861944] / actual-value[1.32388]"    
"total-error[-0.870064689195726] / calculated-value[0.4538253108042741] / actual-value[1.32389]"                                                                                                                      
"total-error[-0.8703720508895528] / calculated-value[0.4535079491104471] / actual-value[1.32388]"    
"total-error[-0.870344491097142] / calculated-value[0.45354550890285805] / actual-value[1.32389]"                                                                                                                     
"total-error[-0.8703392461183919] / calculated-value[0.453540753881608] / actual-value[1.32388]"    
"total-error[-0.8703383388467554] / calculated-value[0.4535416611532446] / actual-value[1.32388]"                                                                                                                     
"total-error[-0.8703384452579834] / calculated-value[0.4535415547420166] / actual-value[1.32388]"    
"total-error[-0.8703184327773317] / calculated-value[0.4535415672226684] / actual-value[1.32386]"                                                                                                                     
"total-error[-0.870307735104118] / calculated-value[0.45354226489588195] / actual-value[1.32385]"    
"total-error[-0.8702674673615948] / calculated-value[0.45354253263840516] / actual-value[1.32381]"

Tim Washington 

On Mon, Oct 1, 2012 at 5:17 PM, Timothy Washington <> wrote:
Hey, thanks for these. I'll take the evening to read through them. It's the gradient descent calculation that I find to be convoluted. I understand the concept. But I haven't seen a clear example of how that's done. That's what I was trying to nail down with that output neuron example. And reading the encog-java source code wasn't any clearer either. 

Thanks very much for the resources. Perhaps these docs will help. 

Tim Washington 

On Mon, Oct 1, 2012 at 3:43 PM, Jim - FooBar(); <> wrote:
Hmmm...I am not sure I follow...
the error is simply (- target actual). Then you take the square of that difference (2 reasons for that) and there you have the error per neuron at the output layer. Then you simply add them up to get the entire network's error. so far so good...

the tricky bit comes now when you need to find out how much the error depends on the output, inputs and weights so you can feed that in to the gradient descent formula via which the weights will be adjusted. Basically gradient descent says this:

"the adjustment of each weight will be the negative of a constant theta multiplied by the dependence of the previous weight on the error of the network, which is the derivative of that error with respect to that weight."

so essentially you're only looking to find the derivative of E (total error) with respect to Wij , but in order to find that you will need to know

  • how much the error depends on the output
  • how much the output depends on the activation (which depends on the weights)

It is not straight forward to type formulas here but I've put a relevant document that describes the procedure exactly and the encog book which i cannot guarantee it goes that deep, in my public dropbox for you. the link is : ...I'll leave it up until tomorrow...

hope that helps...


ps: the encog source did not help you?