These are my ongoing research notes and should be read as a draft document.
I'm interested in neural program synthesis for general task solving.
Task solving is a challenging problem because tasks are generally out-of-distribution. It's hard to develop algorithms that can examine a problem, reason about a solution, and then execute that solution -- on tasks it may never have seen before.
A neural program synthesis network is shown a task and then generates a program (ususally in a domain specific language) that can execute a solution to the problem. I believe that we can develop algorithms that are shown tasks from a previously unseen domain and through self-play learn to generate programs that operate in that domain.
As an example, consider the toy (yet difficult) challenges from the ARC-AGI problem set.
3c9b0459
Each task in the ARC challenge is a collection of input-output pairs (input on the left, output on the right in
Figure 01, above). The bottom four rows are
There are two reasons why the ARC challenge is difficult:
I like the ARC challenge because it's actually antithetical to the typical use of a neural network, which is to
learn a distribution over inputs. If we consider a simple image recognition task, then the goal is to learn to
predict a class label given an input sample. At training time we have supervised labels, but critically at test
time we don't have any supervision. The ARC challenge is different:
In my opinion a solution is composed of three main components:
A
The mask in column (3) selects the pink squares from the input grid, and the mask in column (4) selects the yellow squares. By shifting the masks across the output grid and changing the order of how we apply each mask we can change where the two coloured shapes are placed in the output. For this particular task a solution could be to take mask (3), shift it up and to the right one unit, then take mask (4) and shift it down and to the right one unit. This results in the final output grid as shown by the solution.
My theory is that any ARC task can be represented as a collection of masks (layers) that can be manipulated by
programs which are themselves collections of operations over masks. In this hypothetical example some operations
are select(mask, input)
, shift(mask, x, y)
and draw(mask)
.