over uh basically the entirety of the computer Age The Way We Tell computers what to do is by programming and especially since the Advent of high-level programming languages programming means something very specific means writing code in a high-level programming language and you know you know people who are up in this approach to telling the machine what to do we actually like programming there's a lot of things going for it first of all I can write a program and you know people make fun of Engineers induction okay I tested it with n equals one I tested
it with n equals two I tested it with n equals three yeah it probably works for all n turns out actually it's often does there's modularity and encapsulation modern programming languages have been built around modularity and encapsulation what does it mean it means that different parts of the code have different responsibilities you can tell that this part of the code is going to do this and this part of the code is going to do that and if something fails if something is not going wrong if you want to change how one particular piece of the
code is behaving you know exactly what part of the code to go to you can build software uh incrementally over the span of decades oftentimes you can build this software in many cases we have these massive code bases that have been built over decades by lots and lots of people and yet every part of the code has its role every part of the code has a particular task now today we also have other ways of telling the machine what to do and in particular deep learning has kind of crashed the party over the last few
years and it has a lot of things going for it right there's a lot of things to be said for you know here's my data just figure out what you need to do and do it I don't need to understand the relationship between say Spanish and English in order to get the machine to translate from one to the other and this ability to do things even without a lot of prior knowledge is actually a really big thing that this approach to telling the machine what to do has going for it right people talk about letting
the data speak for itself right don't go and bake all your prejudices and all your pre-existing ideas into the code instead just get a lot of data and let the data speak for itself and so there's a lot of good to be said about that but you know what happened with all these things right all these things were actually really useful and really important and really essential to building large systems and to making our computer-enabled world work and so one of the things that we're really interested in in my group is can we get a
little bit of the best of both situations you know yes it's great to learn from data it's great to be able to start with relatively little uh knowledge and allow the data to speak for itself but we want the generalization we want to be able to take this piece of code and in some cases even prove that they're actually going to work for all n and not just for the cases that we tried them we like to be able to tell this part is doing this and this part is doing that and this part is
responsible for this we like to be able to add functionality as we go and build that knowledge base in order to get the system over time to do the things we wanted to do and so what we're really looking for in other words is synergy between the things that we know how to do with programming languages and existing programming systems with the things that are enabled by the ability to learn and so I'm going to tell you very very quickly about a couple of different uh recent and auto recent projects where we've looked at ways
of bringing in some of the benefits from the more traditional approach to tell the machine what to do while leveraging learning and so for example this uh this was a paper a few years back from uh now former student who is now at Microsoft research and a whole team of awesome people that I got to work with right and to give you an idea of what we were thinking about right think about yourself as trying to exit a very tight parking spot right uh you know the drill you have to go forward a little bit
and back a little bit and forward a little bit again and then roof you can be out of there right and if if things get a little bit tighter then you know that you have to do it a few more times right and if it's really really tight you know that you have to do it quite a few times before you're actually going to be able to get out of these right and and this is a kind of simple generalization that uh you know we're pretty good at we know what to do when we do
it once and we know what to do when it has to be done twice and we know that you know if we keep doing this it's going to get better and better and then we're going to be out of that parking spot but it turns out if you only have a couple of scenarios like this and you try to get just a neural network to learn a policy to get out of this parking spots you can do a pretty good job of learning a policy that gets out of the parking spots and gets out of
these individual scenarios that you gave it but from only three scenarios you're not going to learn a policy that generalizes to this extreme case where you have to go back and forth lots and lots of times right that really requires this ability to generalize far beyond the instances that you have seen this kind of inductive generalization that again traditional programs do very naturally learn policies in the form of neural networks generally not so much so what do you do well you still want to learn but you want to learn something that looks more like a
program you want to learn something in the test structure you want to learn something that incorporates this notion of looping that actually tells you look you have to keep doing this until you get out of the parking spot until you have a clear path then you can drive away but you want the system to be able to learn this you don't want the engineer to have to be able to have to write this on their own and you know it turns out you'll probably have to read the paper to get the full details but uh
it's actually pretty cool you can get a level of generalization that is difficult to get if you don't have that representation grounded in this uh more structured way of telling the system what to do inspired by traditional programming I want to very very briefly give you another example of some of the kind of things that that we can do so one of the you know I've been working on this problem of synthesizing programs for a long time and we've had lots and lots of projects that are of the form you know give me a bunch
of basic components that you can put together in order to complete a task and we have you know really clever techniques to figure out exactly how to assemble them together so that they do what you want them to do but people would always ask well where do the components come from well where else are they going to come from graduate students of course like where else right and uh you know generally for every one of these projects it takes some graduate students to sit down design a language figure out what the language is supposed to
say so we had this collaboration with Josh Tenenbaum that was led by a former student Kevin Ellis where we looked at you know can we do better right and to give you an example of a you know very simple domain that actually goes back uh quite a bit in the AI World Imagine That I Want to generate programs to produce every single one of these pictures but from a very very simple low-level language where The Primitives are basically things like pen up pen down uh you know move forward turn basic arithmetic right some of these
are pretty intricate forms that would actually require fairly elaborate programs in order to produce but the idea is if you have a corpus like this you can go and tell your program synthesizer find me programs that can generate as many of these things as possible well it's pretty hard to generate those programs because they have to be pretty big but you can learn a few and from those few you can actually apply more symbolic reasoning techniques that come from the program analysis world to figure out what are basic building blocks that encapsulate everything we've learned
from running these programs and then you can actually essentially try out different ways of combining these things different ways of uh try to really have the machine learn how to use these components so that when uh when you're done now you have a neural network that can help you with this you have new components that you can bring to the party and very quickly you can learn to components that can even do some fairly intricate things and you can learn the stacks of components that by building up from more and more complex components in the
same way that you build software from simple components to more elaborate components can do things with relatively little code that actually look fairly intricate and so these are just a handful of examples of the sort of things that you can do when you bring together some of the things that we know from how to write programs and from the world of programming languages with the things that we know from the world of machine learning thank you thank you very much [Applause]