Open bumper314 opened 7 years ago
Hello, this is a blast from the past!
I can only speak for my implementation, which is based on the SM2 algorithm as described on this page. This is extracted from the original paper. Step 6 states,
- If the quality response was lower than 3 then start repetitions for the item from the beginning without changing the E-Factor (i.e. use intervals I(1), I(2) etc. as if the item was memorized anew).
This is where I got the value 3
in the 3/5
you noted. There is a bit of room for interpretation, though, as the quality responses Wozniak describes are integer values in the range 0-5, whereas I normalise the quality response value to a real (well, floating point) value between 0 and 1. You could legitimately interpret "lower than 3" to mean "less than 0.6" (as I did), "less than half" (since in his description, the bottom half 0-2 all fall under it and the top half 3-5 are over it), or "less than or equal to 0.4" (which is essentially the inverse of my interpretation).
If the input into the normalised score is an integer value in the range 0-5, then it shouldn't matter which of these interpretations you pick -- the only values you'll get in are 0, 0.2, 0.4, 0.6, 0.8, or 1.0, and with that set of possible values the three interpretations I enumerated above are equivalent. However, if you use a different scoring system (as I do), then you will start to see a difference in how the scheduling algorithm responds to these differing interpretations. If you skew high (closer to 0.6, like my version), it means that even moderate recall results in having to review the card more frequently. If you skew low (closer to 0.4, like @edubkendo), the algorithm is more "forgiving"; you would have to do more badly to be forced to review the card more frequently.
I believe any value in the range > 0.4 and < 0.6 is a valid interpretation of the SM2 algorithm, so after that it's a question of personal preference and tweaking. Of course, you could tweak it outside of this range if you like, but arguably it wouldn't be SM2 any more. I suppose If you want to go down that road, you could also argue that this isn't SM2 either if you don't quantise your scores to the SM2 values of 0, 0.2, 0.4, 0.6, 0.8 and 1.
Hope that's helpful/interesting! I consider this project essentially abandoned, so I don't plan on updating it or tweaking this value any further, but feel free to fork it and try out different values if you want, or to use it as a basis for any of your own stuff!
I've also dropped @edubkendo a note in case he would like to chime in with his own thinking.
Wow, I appreciate your thoughtful reply. Very interesting and helpful to me.
I consider this project essentially abandoned
That's fine, I'm curious if you found something better, or if you left the system for some reason (low perceived value or ROI).
Nope, I just got sidetracked and moved on to other things. I actually still think the idea of a scriptable SRS, configured by "models" which describe the testing mechanism, and "schedulers" which control the spacing of the repetition, is a good design. The only model I implemented here is flash cards, but at one point I was considering having one which displays sheet music and reads in input from a MIDI device to score you automatically when practicing piano, or a hook into vim golf which would score you based on how many keystrokes it took you to solve a particular puzzle. There's quite a lot of potential there for somebody who wants to take the idea and run with it. But, for now at least, that person isn't me :-)
Excellent read. I agree with your last statement.. so much potential!
I was comparing your implementation to https://github.com/edubkendo/supermemo/blob/master/lib/supermemo.ex, and I see that your
ITERATION_RESET_BOUNDARY
is 3/5 = 0.6 while the other implementation uses 0.4.I don't know the SM2 algo well enough to say which is right, or whether it's just a weighting that can be adjusted. Can you confirm?