Mercurial > pylearn
comparison doc/v2_planning/architecture.txt @ 1098:4eda3f52ebef
v2planning - revs to requirements, added architecture
author | James Bergstra <bergstrj@iro.umontreal.ca> |
---|---|
date | Mon, 13 Sep 2010 09:42:36 -0400 |
parents | |
children | e5306f5626d4 |
comparison
equal
deleted
inserted
replaced
1097:8be7928cc1aa | 1098:4eda3f52ebef |
---|---|
1 ==================== | |
2 Pylearn Architecture | |
3 ==================== | |
4 | |
5 | |
6 Basic Design Approach | |
7 ===================== | |
8 | |
9 I propose that the basic design of the library follow the Symbolic Expression | |
10 (SE) structure + virtual machine (VM) pattern that worked for Theano. | |
11 | |
12 So the main things for the library to provide would be: | |
13 | |
14 - a few VMs, some of which can run programs in parallel across processors, | |
15 hosts, and networks [R6,R8]; | |
16 | |
17 - MLA components as either individual Expressions (similar to Ops) or as | |
18 subgraphs of SEs [R5,R7,R10,R11] | |
19 | |
20 - machine learning algorithms including their training and testing in the form | |
21 of python functions that build SE graphs.[R1,R8]. | |
22 | |
23 This design addresses R2 (modularity) because swapping components is literally implemented by | |
24 swapping subgraphs. | |
25 | |
26 The design addresses R9 (algorithmic efficiency) because we can write | |
27 Theano-style graph transformations to recognize special cases of component | |
28 combinations. | |
29 | |
30 The design addresses R3 if we make the additional decision that the VMs (at | |
31 least sometimes) cache the return value of program function calls. This cache | |
32 serves as a database of experimental results, indexed by the functions that | |
33 originally computed them. I think this is a very natural scheme for organizing | |
34 experiment results, and ensuring experiment reproducibility [R1]. | |
35 At the same time, this is a clean and simple API behind which experiments can be | |
36 saved using a number of database technologies. | |
37 | |
38 APIs vs. lambda | |
39 ---------------- | |
40 | |
41 Modularity in general is achieved when pieces can be substituted one for the | |
42 other. | |
43 | |
44 In an object-oriented design, modularity is achieved by agreeing on interface | |
45 APIs, but in a functional design there is another possibility: the lambda. | |
46 | |
47 In an SE these pieces are expression [applications] and the subgraphs they form. | |
48 A subgraph is characterized syntactically within the program by its arguments | |
49 and its return values. A lambda function allows the User to create new | |
50 Expression types from arbitrary subgraphs with very few keystrokes. When a | |
51 lambda is available and easy to use, there is much less pressure on the | |
52 expression library to follow calling and return conventions strictly. | |
53 | |
54 Of course, the closer are two subgraphs in terms of their inputs, outputs, and | |
55 semantics, the easier it is to substitute one for the other. As library | |
56 designers, we should still aim for compatibility of similar algorithms. It's | |
57 just not essential to choose an API that will guarantee a match, or indeed to | |
58 choose any explicit API at all. | |
59 | |
60 |