{"id":63,"date":"2005-04-21T20:38:49","date_gmt":"2005-04-22T02:38:49","guid":{"rendered":"\/?p=63"},"modified":"2005-04-21T20:55:24","modified_gmt":"2005-04-22T02:55:24","slug":"dynamic-programming-generalizations-and-their-use","status":"publish","type":"post","link":"https:\/\/hunch.net\/?p=63","title":{"rendered":"Dynamic Programming Generalizations and Their Use"},"content":{"rendered":"<p><a href=\"http:\/\/ttic.uchicago.edu\/~dmcallester\/\">David Mcallester<\/a> gave a talk about this <a href=\"http:\/\/nagoya.uchicago.edu\/~dmcallester\/astar.pdf\">paper<\/a> (with <a href=\"http:\/\/people.cs.uchicago.edu\/~pff\/\">Pedro Felzenszwalb<\/a>).  I&#8217;ll try to give a high level summary of why it&#8217;s interesting.<\/p>\n<p>Dynamic programming is most familiar as instantiated by Viterbi decoding in a hidden markov model.  It is a general paradigm for problem solving where subproblems are solved and used to solve larger problems.  In the Viterbi decoding example, the subproblem is &#8220;What is the most probable path ending at each state at timestep <em>t<\/em>?&#8221;, and the larger problem is the same except at timestep <em>t+1<\/em>.  There are a few optimizations you can do here:<\/p>\n<ol>\n<li><strong>Dynamic Programming -> queued Dynamic Programming<\/strong>. Keep track of the &#8220;cost so far&#8221; (or &#8220;most probable path&#8221;) and (carefully) only look at extensions to paths likely to yield the shortest path.  &#8220;Carefully&#8221; here is defined by <a href=\"http:\/\/ciips.ee.uwa.edu.au\/~morris\/Year2\/PLDS210\/dijkstra.html\">Dijkstra&#8217;s shortest path algorithm<\/a>.<\/li>\n<li><strong>queued Dynamic programming -> A<sup>*<\/sup><\/strong>Add a lower bound on the cost to complete a path (or an upper bound on the probability of a completion) for the priority queue of Dijkstra&#8217;s shortest path.  This can yield computational speedups varying between negligible and outstanding.<\/li>\n<li><strong>A<sup>*<\/sup> -> Hierarchical A<sup>*<\/sup><\/strong> The efficiency of A<sup>*<\/sup> search is dependent on the tightness of it&#8217;s lower bound, which brings up the question: &#8220;Where do you get the lower bound?&#8221; One appealing answer is from A<sup>*<\/sup> applied to a simplified problem equivalent to the original problem, but with states aliased (many states in original problem = 1 state in new problem).  This technique can be applied recursively until the problem is trivial.\n<\/li>\n<\/ol>\n<p>Each of these steps has been noted previously (although perhaps not in the generality of this paper).   What seems new and interesting is that the entire hierarchy of A<sup>*<\/sup> searches can be done simultaneously on one priority queue.<\/p>\n<p>The resulting algorithm can use low level information to optimize high level search as well as high level information to optimize low level search in a holistic process.  It&#8217;s not clear yet how far this approach can be pushed, but this quality is quite appealing.  Naturally, there are many plausible learning-related applications.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>David Mcallester gave a talk about this paper (with Pedro Felzenszwalb). I&#8217;ll try to give a high level summary of why it&#8217;s interesting. Dynamic programming is most familiar as instantiated by Viterbi decoding in a hidden markov model. It is a general paradigm for problem solving where subproblems are solved and used to solve larger &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/hunch.net\/?p=63\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Dynamic Programming Generalizations and Their Use&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,18],"tags":[],"class_list":["post-63","post","type-post","status-publish","format-standard","hentry","category-general","category-papers"],"_links":{"self":[{"href":"https:\/\/hunch.net\/index.php?rest_route=\/wp\/v2\/posts\/63","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hunch.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hunch.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hunch.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hunch.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=63"}],"version-history":[{"count":0,"href":"https:\/\/hunch.net\/index.php?rest_route=\/wp\/v2\/posts\/63\/revisions"}],"wp:attachment":[{"href":"https:\/\/hunch.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=63"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hunch.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=63"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hunch.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}