假設閲讀速度恆定
如果保持順序
分佈平均
同一本書不會撞在一起
time and value
the formulae can be borrowed from task warrior.
assume the value of the content is equally distributed
let the value of the whole content be v
each time read n over v
but the value of the content may not be equally distributed
the only thing that may be equally distributed is the reading time.
therefore , set the total reading time be t
the time required of the read portion is n over t
but the total reading time is unknown.
anyway the relationship is like that .
what about the priority part ?
自動切割?固定比例切割
都會切錯
應該優先新的,因為人對新的有着迷不要緊,害怕的是對新內容有不敢打開的恐懼
時間估算是必須的,因為人就是只有在同一個時間做同一樣的事情。
隨機演算法反而更好嗎
但是人有偏好,討厭重複閲讀讀過的。
embrace randomness for new things
ideal situation : mixed new and old things in one day review .
known known - intermediate queue 看過的頁數 -keep in memory , prevent prevent becoming unknown known 維持印象需要的重複間隔需要多久?如何驗證已經維持了印象?應該可以相信人的記憶,拉長一點也沒關係,剩下的時間做這個就好了。
known unknown - processing queue 未看的頁數,因為無法評估價值所以只能用固定間隔重複嗎?不對,應該可以用已經讀過的部分來推測後面的部分值不值得讀
unknown unknown - new queue 新書,每天一個?
假設每天都新增一個,應該怎麼安排?
不要假設具體增加的書本量,至少假設每次打開軟件都會面對新的篇章,至少讀個十分鐘,每天打開的概率是 70 %,根據不同的排程算法會發生什麼。
假設每天都會增加新內容,因為這是理想的狀態,應該廣泛接觸新知識
就好像是一個個槽位一樣,初次重複間隔就是能裝入的數量
如果重複間隔是1天,複習數量就是簡單的自然數數列
就算指數級地增加複習間隔,只要每次複習都增加新東西,複習量的增長速度會是O(logn),雖然增長很慢,加上常數因子已經是不可以接受的了,而且有時會跳過複習,會累積倍數的複習量
難以避免重複,不需要嚴格倍增,至少增加間隔,只要比理應的間隔大就可以(類倍增)
1101000100000001
101000100001
1100100001
11
1111111111110111
用1 做複習上限,基礎間隔是1,16天能能塞進4個新知識
或者説,15 (=2^4-1)天能塞進3個知識重複4次,
15天的上限是 15,3 *4 = 12
再延長一點看看
11010001000000010000000000000001
1010001000010000001
110010000100000001
1100001000000001
1100100001
多了一倍只能多塞一個
如果間隔固定,總共可處理的知識量就等於間隔天數
算了,用代碼模擬吧
陷入了用 haskell 算進制轉換的泥潭,好像不能用遞歸的思想解決,而且也根本不需要這個。
當項目歸檔的時候,需要提前其他的項目補上空位
超時的項目,複習了之後應該怎麼排
目標:所有項目的間隔增長速度維持類倍增,維持平均每日複習量為常數
雖然未來永遠有大量的空位,但開始的空位總是很少,未來的空位總是只能用來在未來學新的東西,不能用來在現在學大量的東西
結果在差不多時間開始的項目數,約是log(學習時間),雖然未來永遠有更多時間加新材料所以感覺上應該不只這麼少,但這和大家喜歡一開始把所有材料加進去的習慣根本不一樣
還是應該從排除機制入手,最大複習次數有上限的話
知識以常數增長的時候,複習量就會以log(知識量)的速度增長,雖然緩慢但總會累積到不可接受的程度
有些知識一學會了就能記住,不需要複習,如果想要複習量維持固定,就需要把需要複習的知識轉化為不需要複習的知識,也就是設置複習時間上限,或者把知識增長率停在 log(n),這樣log(log(n)) 的增長就會很慢。
關鍵是,需要以多快的速度永久記住,以多快的速度排除知識?增加項目的速度應該是常數,所以要在複習的時間慢慢降到 log(n)。
如果排除了的項目都是已經永久記住的話,知識的總增長速度就相當於常數了。
排除了的東西只會定期隨機抽取回憶,填補空間,不會全部顯示
樸素的想法是減半,每經過一段時間,複習隊伍都需要減半
如果間隔長度不是倍增,那麼會需要減多少呢?
如果是固定長度的複習,必須記住所有的東西才能空出位置給下一批,所以要全部消滅
倍率越高,消滅的速度應該可以越慢。具體是多少我想不出來。
至於週期的時間和每天的複習量應該是無關緊要的常數。
每次複習都降低可能需要的百分比,然後統計總共的百份比符不符合實際的百份比就可以,劃分大致範圍
但是考慮錯過的話又會有堆積的問題
如果劃分明確的新增期和複習期呢?會無聊嗎
一段時間內新增的會在未來按順序出現?
用間隔的雙倍定義增加冗餘?
過期的東西應該會讓整個週期延後?
- 可用的變量
- review_count
- due_time
- intermediate_interval
- extraction_count
複習次數達到一定量就要求歸檔?
interval?
提取次數?
不行,要看整體,不能單獨判斷
需要「添加日」
先用log日數做上限,如果某個日數的複習群超過log n,就要求減到logn
延遲相當於增加倍數
週期增加相當於平均攤分分量,同一天加入的能塞進下一個週期
如果一天新增的上限是7
770700070000000700000
如果週期是7
[1111111][1111111][0000000][1111111][0000000][0000000][0000000][1111111]...
延長週期可以減輕大量新增的負擔,多了些靈活調度的空間,只是鬆緊度的問題,關鍵在於倍數
相同時間內,減少每個項目的複習次數就能塞進更多的項目
假定遺忘曲綫,超過週期的影響,應該就是下一次的遺忘速率會增加,用幾何平均等於原本的倍數來修正?但這就相當沒有改變下一次的原定日期?
不同倍率的序列怎麽互相填補?
4
1101
1100
0011
=1111
8
11010001
1101
1101
=11011101
16
1101000100000001
1101000100000001
1101110111010001
如果上限是1,怎麼無論怎麼擺都無法重疊序列,一定要暫時改變某個序列的實際倍率,騰出空間
放寬到2
4
1101
1101
1101
=2202
1101
110
110
=1221
1101
11
11
=1222
8
11010001
11010001
11010001
=12221
Days = 32, no clash fill
| max review per day | max new item | total review needed | average review per item |
|---|---|---|---|
| 1 | 6 / 32 | 23 | 3.8 |
| 2 | 13 / 32 | 52 | 4 |
| 3 | 17 / 32 | 73 | 4.29 |
| 4 | 23 / 32 | 103 | 4.47 |
| 5 | 32 / 32 | 134 | 4.1875 |
增加 max review per day 的確是能以指數級增加能新學的總量
每加一個新東西,都要付出大約 log(維持天數)的複習次數,具體的差異是因為越是新的東西,就能當作是剩下了未來還沒有到的複習。
我以為平均複習數會呈現下降的趨勢,但實際上呈現先上升後下降的狀態,應該是因為學習上限提高會先提高早期的學習量,然後才會提高後期的學習量。
反而走極端是最划算的,要麼學得最精,要麼學得最雜,感覺不好,不過既然大約都是 log(n) 就別管了。
重點是怎麼知道超過容量,基礎複習量可以是任意的數字,上限和基礎量的關係是什麼?
如果沒有減少總複習數,就算強行挪動維持低上限也會因爲拖延幾天而完全失去意義
學得太多的代價自然是留存 ,即倍數增加
幾乎可以肯定只要學過一次,無論過了多久,都能變回第二次學的狀態
超過的四種解決方法
- 超過就超過
- 移到下一個能放進的日期再開始
- 中斷舊的項目
- 延長項目的間隔增長倍數
總量是固定,有期限的的東西,只要延長時間就能統統學會
移動到之後再開始
- 就是上面的做法,不可能無限地移動到未來,新增量上限是 log(D)
中斷
優先中斷最舊的,複習次數最多的。
允許的複習量等於允許新增量 (Daily Limit = 2N)
1101
01101
001101
0001101
- 中斷第一
110
0110
00110
000110
- 變成 110 的單純循環,每個項目只複習一次
允許的複習量等於新增量的兩倍(Daily Limit = 3N)
11010001
01101000
00110100
00011010
00001101
00000110
00000011
00000001
- 中斷第一
變成 11010 的單純循環
所以不能每天都新增,這個已經知道了。
允許的複習量等於允許新增量 (Daily Limit = 2N)
11010001
011010001
0011010001
000011010001
Daily Limit 決定了複習次數上限。上限是定死的,這個已經是最單純的情況,所以多就就是多了,沒有辦法繞過。
怎麼應對一天把一大堆全部加進去的情況呢?如果有些天數沒有新增新的項目,就可以把舊序列的搬過去
應該是主動選擇最重要的到另外的天數,不重要的就篩選
同一天內新增的一定要能分出個重要度高低,才能自動調整
用户想要額外增加的時候才提示需要歸檔以前的東西,應該是最合理的。
延長間隔
不同倍數的序列重疊會發生什麼事
2^a + X = 3^b
有多少個解的詭異問題
感覺解不了。
緩衝池
總會有些日子錯過複習,有緩衝就好。
本質是把好幾天當一天用。
但如果連緩衝池也錯過了不是很不好。
需要的變量
- 緩衝池 - 3 days
- Base interval = multiplier - time box * base interval = next time
- max daily review count
每次分拆就相當的時候尋找下一個可用的空檔。
忘記複習怎麼辦
- 當作重置到第二次複習效應,base interval 改變
尋找下一個可用空檔的算法
判斷當天的新增數上限
賭未來一定少
前面不撞未來也不會撞
設置上限,不要考慮延伸到未來
只要知道初始間隔就能反推開始日,簡化問題
假設已經解決了,多加一個新項目
還是再研究一下數列
因為習慣一次增加一堆,所以如果沒有分散的算法,就會扎堆複習。
$$reviewDay = startDay + baseInterval ( \frac{multiplier^{reviewCount} - 1}{multiplier - 1} )$$
能不能證明在最高點之後就只會下降?感覺像是。應該是正確的。
因為一定比每天都增加更少。
等比數列的相差同樣是等比數列
(x^2 - x) * x = (x^3 - x^2)
過期問題
排程算法差不多就好,大量的過期項目應該怎麼處理才是最麻煩的。
Intermediate Queue 的目標不是保持記憶,而是保持印象,所以更加寬鬆
直覺湊出了這個玩意,但應該不是,記錄一下
$$-\frac{\log\left(\frac{x}{7}+0.01\right)}{4}+0.5 $$
胡亂猜測的印象遺忘率:7 天削減一半印象
$$retention = 0.5 ^ \frac{dayPassed}{halvingPeriod} $$
每次複習,halvingPeriod 就會增加
$$retention = 0.5 ^ \frac{dayPassed}{basehalvingPeriod \times reviewCount} $$
在準確的時間複習,halvingPeriod 就會增加得最多,太早複習的話,halvingPeriod 不會改變多少,錯過複習的話,halvingPeriod 也會接近重置。
用有最高點的二次方程嗎?
距離時間
0 = 不變
7天 = 乘2
超過很長時間 = 重置到第二次複習後的狀態 ( x basePeriod x 2 / current Period)
麻煩,設做 1/ baseperiod 算了,沒什麼道理的。
y = a + bx + cx^2
y-intercept = 1, a = 1
x-intercept,reviewPeriod = 0 是什麼意思?當作重置吧
0 = 1 + bx +cx^2
頂點在 (7,2),
0 = b + 2cx
代入 x = 7
0 = b + 14c
0 = b + 14c
2 = 1 + 7b + 49c
(1/2)^6 = 0.01,當作忘記了
x-intercept = basePeriod * 6 = 7 * 6 = 42
0 = 1 + 42b + 1764c
b = 1/84
c = -1/1176
不能同時滿足這麼多條件
b = 2/7
c = 1/49
$$\frac{2}{7}x-\frac{1}{49}x^{2}+1$$
x-intercept = 16.89949
2.4 倍就當作忘記
泛化一下:
0 = b + 2 * basePeriod c
multiplier = 1 + basePeriod b + basePeriod^2 c
basePeriod^2 c = 1 - multiplier
c = 1-multiplier / basePeriod^2
b = - 2 ( 1-multiplier / P )
$$newMultiplier = -\frac{2(1-multiplier)}{basePeriod}time+\frac{1-multiplier}{basePeriod^2}time^{2}+1$$
有了計算過期內容的乘數之後,就不需要把過期的視作需要特殊處理的內容了。
不需要一複習就更新間隔,收集當天複習過的文件再統一排程。