Content-Type: text/enriched Text-Width: 70 /**This implements: "A possible representation of reward in the learning of saccades" C. Weber and J. Triesch. Proc. Epigenetic Robotics, pp. 153-60 (2006). After training: the weights w_5_2 and w_6_2 are those of Fig.5a), the weights w_3_2 are those from which a sample is shown in Fig.5b), and activations J, I and E on area 1 represent Fig.5 c),d) and e), respectively. **/ global { iter 0 areas 7 mult 1 <x-color><param>blue</param>d "/tmp/coco"</x-color> <x-color><param>saddle brown</param>r ""</x-color> } all { d_a 0 d_b 0 } /*image*/ area 0 { d_a 300 d_b 300 } /*input (retina)*/ area 1 { d_a 101 d_b 101 } /*SC*/ area 2 { d_a 51 d_b 101 } /*motor for vertical saccades (deeper layer on SC, only one line of neurons along medio-lateral dimension)*/ area 3 { <x-bg-color><param>DarkOliveGreen1</param> d_a 1 /*21*/ </x-bg-color> d_b 101 } /*saccade endpoint*/ area 4 { d_a 1 d_b 2 } /*motor unit for horizontal saccades -- trained with vectorial error signal*/ area 5 { d_a 1 /*21*/ d_b 1 } /*motor unit for horizontal saccades -- trained with vectorial error signal*/ area 6 { d_a 1 /*21*/ d_b 1 } set sigma 3.0 <x-color><param>DimGrey</param>/*stimulus (Gaussian)*/</x-color> set<x-color><param>DarkGreen</param> eps </x-color><underline> 1.0 </underline><x-color><param>DarkGreen</param> /*2.0*/</x-color> <x-color><param>DarkGreen</param>set importW 0</x-color> <x-color><param>DarkGreen</param>set exportW 1</x-color> set rad 60 <x-color><param>DimGrey</param>/*angle radius used in retina, and also motor range ... IGNORED!*/</x-color> <x-color><param>DarkGreen</param>if ($importW = 0)</x-color> series (1) { sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { <x-color><param>DarkGreen</param>2(n) {N,w; weight_list_alloc_full; 3 ; ; 0.0+0.01}</x-color> <x-color><param>DimGrey</param>/**these are "inverted", as used with weight_list_AXON_total**/</x-color> <x-color><param>DarkGreen</param>5(n) {N,w; weight_list_alloc_full; 2 ; ; 0.0+0.01}</x-color> <x-color><param>DarkGreen</param>6(n) {N,w; weight_list_alloc_full; 2 ; ; 0.0+0.01}</x-color> } sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { <x-color><param>DarkGreen</param>2(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_export ; 3 ; ; }</x-color> <x-color><param>DarkGreen</param>5(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_export ; 2 ; ; }</x-color> <x-color><param>DarkGreen</param>6(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_export ; 2 ; ; }</x-color> } sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; order) { <x-color><param>DarkGreen</param>5(o) {N,w; weight_list_cuthalfinput; 2 ; ; 0}</x-color> <x-color><param>DarkGreen</param>6(o) {N,w; weight_list_cuthalfinput; 2 ; ; 1}</x-color> } } <x-color><param>DarkGreen</param>if ($importW = 1)</x-color> series (1) { sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { <x-color><param>DarkGreen</param>2(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_alloc_import; 3; ; }</x-color> } } series (150000) { sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { 0(n) {R ; data_gauss_3areas_2D ; ; ; 1, 0, <x-bg-color><param>tomato</param>0.2+3.0</x-bg-color>, 1.0, 1, 0.5, 50} } <x-color><param>DimGrey</param>/*new,area sigma, height mode ??? border*/</x-color> if (iter << 6000) sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { 0(n) {R ; data_gauss_3areas_2D ; ; ; 1, 0, <x-bg-color><param>tomato</param>2.0+5.0</x-bg-color>, <x-bg-color><param>tomato</param>0.5</x-bg-color>, 1, 0.5, 50} } <x-color><param>DimGrey</param>/*new,area sigma, height mode ??? border*/</x-color> if (iter << 2000) sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { 0(n) {R ; data_gauss_3areas_2D ; ; ; 1, 0, <x-bg-color><param>tomato</param>4.0+10.0</x-bg-color>, <x-bg-color><param>tomato</param>0.5</x-bg-color>, 1, 0.5, 50} } <x-color><param>DimGrey</param>/*new,area sigma, height mode ??? border*/</x-color> sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; order) { 0(t) {R ; total_scale_to_max ; ; ; 1.0 } 4(o) {O ; local_const ; , ; , ; 0.0 } 1(t) {R ; total_cut_at ; 0, 4; R, O; 1 } <x-color><param>saddle brown</param>1(t) {N, r; total_winner ; ; R ; 1 } /**also tests whether at edge or outside of retina circle and returns r=1 if so**/</x-color> 2(t) {<underline>R</underline> ; total_retina_to_SC ; 1 ; R ; 0 } <x-color><param>dark violet</param>2(t) {A ; total_set_mean ; ; R ; }</x-color> 3(t) {R, <x-color><param>DarkGreen</param>w</x-color>; weight_list_AXON_total; 2 ; R ; 0,0,0} <x-color><param>blue</param>2(t) {L ; total_normalize ; ; R ; 1.0 }</x-color> 2(t) {L ; total_neigh_winner ; ; ; 1, 2.0+2.0+2.0, 1000+10000, 1} <x-color><param>blue</param>5(o) {R,</x-color> <x-color><param>DarkGreen</param>w</x-color><x-color><param>blue</param>; weight_list_feed ; 2 ; L ; }</x-color> <x-color><param>blue</param>6(o) {R,</x-color> <x-color><param>DarkGreen</param>w</x-color><x-color><param>blue</param>; weight_list_feed ; 2 ; L ; } 6(o) {R ; local_mult_const ; , ; , ; -1 }</x-color> <x-color><param>blue</param> 6(t) {S ; total_copy_nth ; 5 ; R ; 0, 0} 6(o) {T ; local_sum ; , ; R, S; }</x-color> <x-color><param>blue</param>4(t) {R ; total_copy_nth ; 6 ; T ; 0, 1}</x-color> <x-color><param>DimGrey</param>/**copy the value from the area5 unit to the 2nd motor unit (for horiz)**/</x-color> /*3(t) {T ; total_true_softmax_row; ; R ; 2.0 }*/ 3(t) {S ; total_winner_per_row ; ; R ;<underline> 2</underline>.0 } /**here sigma 1 and below sigma 2 ; this is heuristically better then other way around**/ if (iter << 6000) 3(t) {S ; total_winner_per_row ; ; R ; 6.0 } if (iter << 2000) 3(t) {S ; total_winner_per_row ; ; R ; 10.0 } <bold>3(t) {T ; total_as_rand ; ; S ; 0.3+1+2 }</bold> <x-color><param>DimGrey</param>/**for each row**/</x-color> 3(t) {T ; total_winner_per_row ; ; ;<underline> 4.0 </underline>} if (iter << 6000) 3(t) {T ; total_winner_per_row ; ; ; 6.0 } if (iter << 2000) 3(t) {T ; total_winner_per_row ; ; ; 10.0 } <x-bg-color><param>DarkOliveGreen1</param> 4(t) {R ; total_population_motor_row;3; T ; -54+-54, 54+54, 0} /**3rd parameter says that only neuron0 should be updated (with row0)**/ </x-bg-color> 1(t) {S ; total_cut_at ; 0, 4; R, R; 1 } /**first component of inarea2: vert; second component: horiz**/ 2(t) {S ; total_retina_to_SC ; 1 ; S ; 0 } <x-color><param>dark violet</param>2(t) {B ; total_set_mean ; ; S ; }</x-color> <x-color><param>dark violet</param>2(o) {C ; local_sub ; , ; B, A; } 2(o) {D ; local_mult ; , ; C, R; }</x-color> <x-color><param>saddle brown</param>if (r=0)</x-color> <x-color><param>DarkGreen</param>2(o) {N, w; weight_list_hebb ; 2, 3; </x-color><x-color><param>dark violet</param>D</x-color><x-color><param>DarkGreen</param>, T; $eps}</x-color> <x-color><param>saddle brown</param>if (r=0)</x-color> <x-color><param>DarkGreen</param>2(o) {N, w; weight_list_rectify ; 3 ; ; 0, 1}</x-color> <x-color><param>saddle brown</param>if (r=0)</x-color> <x-color><param>DarkGreen</param>2(o) {N, w; weight_list_normalize; 3 ; ; 1, 2}</x-color> <x-color><param>blue</param>5(t) {S ; total_mean_left_min_right;2; S ; }</x-color> <x-color><param>DimGrey</param>/**copy the value from the area5 unit to the 2nd motor unit (for horiz)**/</x-color> <x-color><param>blue</param>/*5(o) {S ; local_sign ; , ; , ; }*/</x-color> <x-color><param>saddle brown</param>if (r=0)</x-color> <x-color><param>blue</param>5(o) {N,</x-color><x-color><param>DarkGreen</param> w</x-color><x-color><param>blue</param>;</x-color><x-color><param>DarkGreen</param> weight_list_hebb</x-color><x-color><param>blue</param> ; 5, 2; S, L; -3.0}</x-color> <x-color><param>blue</param>6(t) {S ; total_mean_left_min_right;2; S ; }</x-color> <x-color><param>DimGrey</param>/**copy the value from the area5 unit to the 2nd motor unit (for horiz)**/</x-color> <x-color><param>blue</param>/*6(o) {S ; local_sign ; , ; , ; }*/</x-color> <x-color><param>saddle brown</param>if (r=0)</x-color> <x-color><param>blue</param>6(o) {N,</x-color><x-color><param>DarkGreen</param> w</x-color><x-color><param>blue</param>;</x-color><x-color><param>DarkGreen</param> weight_list_hebb</x-color><x-color><param>blue</param> ; 6, 2; S, L; 3.0}</x-color> } <x-color><param>DimGrey</param>/**reset error count -- so final error is average between iter 100000 and 150000**/</x-color> if (iter % 100000) sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; order) { 1(o) {X ; local_const ; , ; , ; 0.0} /**position error x**/ 1(o) {Y ; local_const ; , ; , ; 0.0} /**position error y**/ 1(o) {I ; local_const ; , ; , ; 0.0} /**position error x**/ 1(o) {J ; local_const ; , ; , ; 0.0} /**position error y**/ 1(o) {K ; local_const ; , ; , ; 0.0} /**counter**/ 1(o) {F ; local_const ; , ; , ; 0.0} /**error init (isn't incremented but should be 0 outside of retina circle)**/ 2(o) {X ; local_const ; , ; , ; 0.0} /**position error x**/ 2(o) {Y ; local_const ; , ; , ; 0.0} /**position error y**/ 2(o) {I ; local_const ; , ; , ; 0.0} /**position error x**/ 2(o) {J ; local_const ; , ; , ; 0.0} /**position error y**/ 2(o) {K ; local_const ; , ; , ; 0.0} /**counter**/ 2(o) {F ; local_const ; , ; , ; 0.0} /**error init (isn't incremented but should be 0 outside of retina circle)**/ } <x-color><param>saddle brown</param>if (r=0)</x-color> sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; order) { 4(t) {C ; total_softmax ; 1 ; R ; 1.0, 3} /**writes x,y of maximum to auxiliary area4 which has two units**/ /*4(t) {A ; total_dist_xy_middle ; 1 ; R ; 1+1 }*/ 4(t) {B ; total_dist_xy_middle ; 1 ; S ; 1+1 } 1(t) {O ; total_error_at ; ,4+4; ,C+B; 0 } /**at x,y-position of C give out x-component of B, everywhere else give out zero **/ 1(t) {Q ; total_error_at ; ,4+4; ,C+B; 1 } /** " y B " **/ 1(t) {V ; total_error_at ; ,4+4; ,C+C; 2 } /** " 1, in order to count how often the target is there**/ 1(o) {X ; local_sum ; , ; X, O ; } /**sums up the errors**/ 1(o) {Y ; local_sum ; , ; Y, Q ; } /**sums up the errors**/ 1(o) {K ; local_sum ; , ; K, V ; } /**sums up the occurences -- to normalise the errors**/ 1(o) {I ; local_div ; , ; X, K ; } /**averaged (over runs)**/ 1(o) {J ; local_div ; , ; Y, K ; } /**averaged (over runs)**/ 1(o) {A ; local_mult ; , ; O, O ; } /**squared error in x-direction**/ 1(o) {B ; local_mult ; , ; Q, Q ; } /** " y " **/ 1(o) {C ; local_sum ; , ; A, B ; } /**sum of squared error**/ 1(o) {C ; local_sqrt ; , ; , ; } /**distance**/ 1(o) {F ; local_sum ; , ; F, C ; } /**sums up distances**/ 1(o) {E ; local_div ; , ; F, K ; } /**averaged (over runs) distance**/ 1(o) {E ; <x-color><param>saddle brown</param>local_rectify</x-color> ; , ; , ; <x-color><param>saddle brown</param>10.0</x-color>+-1} } <x-color><param>saddle brown</param>if (r=0)</x-color> sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; order) { 4(t) {C ; total_softmax ; 2 ; R ; 1.0, 3} /**writes x,y of maximum to auxiliary area4 which has two units**/ /*4(t) {A ; total_dist_xy_middle ; 1 ; R ; 1+1 }*/ 4(t) {B ; total_dist_xy_middle ; 1 ; S ; 1+1 } 2(t) {O ; total_error_at ; ,4+4; ,C+B; 0 } /**at x,y-position of C give out x-component of B, everywhere else give out zero **/ 2(t) {Q ; total_error_at ; ,4+4; ,C+B; 1 } /** " y B " **/ 2(t) {V ; total_error_at ; ,4+4; ,C+C; 2 } /** " 1, in order to count how often the target is there**/ 2(o) {X ; local_sum ; , ; X, O ; } /**sums up the errors**/ 2(o) {Y ; local_sum ; , ; Y, Q ; } /**sums up the errors**/ 2(o) {K ; local_sum ; , ; K, V ; } /**sums up the occurences -- to normalise the errors**/ 2(o) {I ; local_div ; , ; X, K ; } /**averaged (over runs)**/ 2(o) {J ; local_div ; , ; Y, K ; } /**averaged (over runs)**/ 2(o) {A ; local_mult ; , ; O, O ; } /**squared error in x-direction**/ 2(o) {B ; local_mult ; , ; Q, Q ; } /** " y " **/ 2(o) {C ; local_sum ; , ; A, B ; } /**sum of squared error**/ 2(o) {C ; local_sqrt ; , ; , ; } /**distance**/ 2(o) {F ; local_sum ; , ; F, C ; } /**sums up distances**/ 2(o) {E ; local_div ; , ; F, K ; } /**averaged (over runs) distance**/ } if (iter % 10) sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { 0(n) {R, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 1(n) {R, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 2(n) {R, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 3(n) {R, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 4(n) {R, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 4(n) {A, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 4(n) {B, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 1(n) {S, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 2(n) {S, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 2(n) {D, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 2(n) {L, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 3(n) {T, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 3(n) {S, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } <x-color><param>saddle brown</param>if (r=0)</x-color> 1(n) {N, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 1(n) {I, <x-color><param>blue</param>d</x-color>; observe_phase; ; ; } 1(n) {J, <x-color><param>blue</param>d</x-color>; observe_phase; ; ; } 1(n) {K, <x-color><param>blue</param>d</x-color>; observe_phase; ; ; } 1(n) {E, <x-color><param>blue</param>d</x-color>; observe_phase; ; ; } 2(n) {I, <x-color><param>blue</param>d</x-color>; observe_phase; ; ; } 2(n) {J, <x-color><param>blue</param>d</x-color>; observe_phase; ; ; } 2(n) {K, <x-color><param>blue</param>d</x-color>; observe_phase; ; ; } 2(n) {E, <x-color><param>blue</param>d</x-color>; observe_phase; ; ; } 5(n) {<x-color><param>blue</param>R</x-color>, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } 5(n) {<x-color><param>blue</param>S</x-color>, <x-color><param>blue</param>d</x-color>; observe_act ; ; ; } } if (iter % 5000) sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>3(n) {N,w; weight_list_free ; 2; ; }</x-color> <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>3(n) {N,w; weight_list_alloc_invert; 2; ; }</x-color> <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>3(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_export ; 2; ; }</x-color> } if (iter % 100) sw (<x-color><param>red</param>0</x-color>; <x-color><param>red</param>1</x-color>; alltime) { <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>2(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_export ; 3 ; ; }</x-color> <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>2(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_histogram; 3 ; ; 0 }</x-color> <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>5(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_export ; 2 ; ; }</x-color> <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>5(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_histogram; 2 ; ; 0 }</x-color> <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>6(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_export ; 2 ; ; }</x-color> <x-color><param>DarkGreen</param>if ($exportW = 1)</x-color> <x-color><param>DarkGreen</param>6(n) {N,w+</x-color><x-color><param>blue</param>d</x-color><x-color><param>DarkGreen</param>; weight_list_histogram; 2 ; ; 0 }</x-color> } }