Lessons Learned Reproducing a Deep Reinforcement Learning Paper
amid.fish
amid.fish
Not to glorify by-gone days, but isn't there a certain charm to having to wait your turn to plug punch cards into a mainframe?
Having a "single shot", with long iteration cycles, indeed does something strange to the way you approach programming and bugs and program design.
Anecdote: my long iteration cycles were caused by my mom restricting access to my C64. I filled page after page (paper!) with code, anxious for any chance to try it. I like to think I learned something during these "mental dry runs"…
On topic: I wrote a rant about the "Mummy Effect" of trying to reproduce ML papers (which we do regularly): https://rare-technologies.com/mummy-effect-bridging-gap-betw...
"When I was at Stanford with the AI project [in the late 1960s] one of the things we used to do every Thanksgiving is have a computer programming contest with people on research projects in the Bay area. The prize I think was a turkey.
[John] McCarthy used to make up the problems. The one year that Knuth entered this, he won both the fastest time getting the program running and he also won the fastest execution of the algorithm. He did it on the worst system with remote batch called the Wilbur system. And he basically beat the shit out of everyone.
And they asked him, "How could you possibly do this?" And he answered, "When I learned to program, you were lucky if you got five minutes with the machine a day. If you wanted to get the program going, it just had to be written right. So people just learned to program like it was carving stone. You sort of have to sidle up to it. That's how I learned to program." [0]
Alternately, a few days of doing might save a few hours of thinking. :-)
(In that particular story, it meant that for a ballistic missile the optimal trajectory was to shoot it straight up and steer it on the way down instead of steering it on an elliptic path from the get go)
https://youtu.be/O5Ml5kPouG8?list=PL2FF649D0C4407B30&t=688
I recommend the whole course though.
The idea behind the REPL is for fast iteration in development, but the key thing missing is thinking. Most people write code at the REPL to see what will happen. They don't formulate a hypothesis before hitting the enter key. It's more of a guess driven development methodology, keep trying till it works.
If you want to improve your program experience, slow down on the run/compile cycle. Think it through.
Also, logging every experiment is another discipline I'm teaching myself. And I fell in love with org-mode in the process.
- Implementation time vs debugging time: I've spent vastly more time debugging and rewriting. Furthermore, I was surprised at how much time I spent even setting up infrastructure to allow debugging. Corollary: Don't take shortcuts in initial implementation. Literally every hack I put in in order to get something working quickly has come back to bite me and I've had to rewrite and refactor every one of them.
- Thinking vs doing, and being explicit: There are too many degrees of freedom to just try random shit. One of the biggest tools I found (like the author) was to write everything down. I have four+ notebooks filled with literal prose conversations with myself interspersed with diagrams and drawings. I credit that with getting me past many mental roadblocks.
- Measure and test: Without unit and integration tests, I'd probably go in circles forever. It's too easy to change something to fix a problem and have that break something else. I now have a test for even the most mundane assumptions in my model and my code, after too many times realizing "oh, before I changed X I could assume Y was true but that no longer holds".
I feel like engineering for machine learning requires a different skill-set than traditional programming and even traditional AI programming. Taking a very calculated and deductive approach like the author suggests seems to be crucial.
When I was teaching machine learning classes, the biggest hurdle I had to get a lot of students over was their history and expectation that they can implement something, fix the compiler errors, fix the runtime crashes, and then just declare victory. Machine Learning is basically the study of getting a computer do give you an answer you don't know, so you have to be in this constant state of defensiveness, never quite trusting that things are correct.
Another thing that helps is having a way to queue up multiple experiments. It's not that hard to set up with celery.
Also I'd really recommend starting with the dumbest baseline model possible and getting the evaluation pipeline around it working. You can then focus on iterating on it and measure how much each change moves the needle.
I think corollary might be - Know your data and the processing steps from the paper very well.