{"action":"created","issue":{"url":"https://api.github.com/repos/nengo/nengo/issues/867","labels_url":"https://api.github.com/repos/nengo/nengo/issues/867/labels{/name}","comments_url":"https://api.github.com/repos/nengo/nengo/issues/867/comments","events_url":"https://api.github.com/repos/nengo/nengo/issues/867/events","html_url":"https://github.com/nengo/nengo/pull/867","id":109600198,"number":867,"title":"Utility for setting PES learning_rate","user":{"login":"arvoelke","id":5420057,"avatar_url":"https://avatars.githubusercontent.com/u/5420057?v=3","gravatar_id":"","url":"https://api.github.com/users/arvoelke","html_url":"https://github.com/arvoelke","followers_url":"https://api.github.com/users/arvoelke/followers","following_url":"https://api.github.com/users/arvoelke/following{/other_user}","gists_url":"https://api.github.com/users/arvoelke/gists{/gist_id}","starred_url":"https://api.github.com/users/arvoelke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arvoelke/subscriptions","organizations_url":"https://api.github.com/users/arvoelke/orgs","repos_url":"https://api.github.com/users/arvoelke/repos","events_url":"https://api.github.com/users/arvoelke/events{/privacy}","received_events_url":"https://api.github.com/users/arvoelke/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/nengo/nengo/labels/needs%20review","name":"needs review","color":"eb6420"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":2,"created_at":"2015-10-03T03:36:45Z","updated_at":"2015-10-04T18:36:44Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/nengo/nengo/pulls/867","html_url":"https://github.com/nengo/nengo/pull/867","diff_url":"https://github.com/nengo/nengo/pull/867.diff","patch_url":"https://github.com/nengo/nengo/pull/867.patch"},"body":"This makes the results from some recent research easy to use. Just specify the error that you want PES to be able to achieve within some specified time, and `pes_learning_rate` will tell you the exact `learning_rate` that accomplishes this (for constant input, no error filtering, and no noise). At the very least, this should make the task of choosing learning rates better motivated. :sweat_smile: \r\n\r\nDetails: http://compneuro.uwaterloo.ca/publications/voelker2015.html"},"comment":{"url":"https://api.github.com/repos/nengo/nengo/issues/comments/145371931","html_url":"https://github.com/nengo/nengo/pull/867#issuecomment-145371931","issue_url":"https://api.github.com/repos/nengo/nengo/issues/867","id":145371931,"user":{"login":"arvoelke","id":5420057,"avatar_url":"https://avatars.githubusercontent.com/u/5420057?v=3","gravatar_id":"","url":"https://api.github.com/users/arvoelke","html_url":"https://github.com/arvoelke","followers_url":"https://api.github.com/users/arvoelke/followers","following_url":"https://api.github.com/users/arvoelke/following{/other_user}","gists_url":"https://api.github.com/users/arvoelke/gists{/gist_id}","starred_url":"https://api.github.com/users/arvoelke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arvoelke/subscriptions","organizations_url":"https://api.github.com/users/arvoelke/orgs","repos_url":"https://api.github.com/users/arvoelke/repos","events_url":"https://api.github.com/users/arvoelke/events{/privacy}","received_events_url":"https://api.github.com/users/arvoelke/received_events","type":"User","site_admin":false},"created_at":"2015-10-04T18:36:44Z","updated_at":"2015-10-04T18:36:44Z","body":"Mm, good question... not silly at all. Short answer is I don't know how, and that it shouldn't make much of a difference. I found that for tau < 0.01, the decoders and error are well-approximated by just filtering them by tau. But for larger tau, the added dynamics begin to dominate and cause oscillations (since the feedback dynamics are being changed, not simply the output).\r\n\r\nThe longer answer is I think it can be done by modifying the equations from the beginning of the proof to use a filtered error, and then taking the Laplace transform to see how the new transfer function differs from the original. Then the idea is you see how this changes the eigenvalues, which will give you the new gamma. The problem is that filtering the error is not equivalent to simply filtering the decoders. It's equivalent to filtering the delta, while separately integrating them into the decoders, and so you have two different control systems that mutually interact. I ran into some problems when trying to combine these transfer functions to find the new eigenvalues... I might just have to try harder.\r\n\r\nI also have some intuitions about how to extend this to handle noise, but it only complicates the story. I think you can make a connection to random walks and null-recurrence to show that the decoders basically \"wander\" off in the hyperplane orthogonal to a (making PES asymptotically unstable for constant inputs), which seems to agree with what I've observed from some tests."}}