FSRS: 현대적이고 효율적인 간격 반복 알고리듬
(github.com/open-spaced-repetition)- 학습 복습 일정을 최적화하는 FSRS의
ABC of FSRS위키는 fsrs4anki에서 새awesome-fsrs위키로 이동함 - 연결된 MaiMemo 연구 자료는 간격 반복 스케줄 최적화와 기억 동역학 모델링을 각각 ACM KDD·IEEE TKDE 논문으로 다룸
- 별도 글은 학부생이 ACM KDD 논문을 출판한 경험을 통해 간격 반복 알고리듬 연구 과정을 소개함
FSRS-Anki-20k와anki-revlogs-10k는 시계열 특성을 포함한 오픈소스 데이터셋으로 함께 제시됨- FSRS는 커뮤니티 주도의 독립 오픈소스 프로젝트이며, MaiMemo Inc. 같은 조직의 지원이 핵심 기여자의 지속적인 참여를 뒷받침함
새 위키로 이동한 ABC of FSRS
ABC of FSRS페이지는 새 위키로 이동함- 새 위치: https://github.com/open-spaced-repetition/awesome-fsrs/wiki/ABC-of-FSRS
간격 반복 연구 자료
- MaiMemo의 논문 2편이 연결되어 있음
- A Stochastic Shortest Path Algorithm for Optimizing Spaced Repetition Scheduling: 간격 반복 스케줄 최적화를 다루는 ACM KDD 논문
- Optimizing Spaced Repetition Schedule by Capturing the Dynamics of Memory: 기억 동역학 포착을 통한 간격 반복 스케줄 최적화를 다루는 IEEE TKDE 논문
- 두 논문 모두 중국어판 링크가 함께 제공됨
연구 경험 글
- How did I publish a paper in ACMKDD as an undergraduate?: 간격 반복 알고리듬에 관한 연구 경험을 다룬 글
공개 데이터셋
- 시계열 특성을 포함한 간격 반복 관련 오픈소스 데이터셋이 제공됨
커뮤니티 프로젝트와 후원
- FSRS는 커뮤니티가 주도하는 독립 오픈소스 프로젝트임
- 墨墨背单词 (MaiMemo Inc.) 같은 조직의 지원에 감사를 표함
- MaiMemo의 지원은 Jarrett Ye 같은 핵심 기여자가 FSRS에 시간과 전문성을 투입할 수 있게 함
- 이런 협업은 FSRS가 모두에게 자유롭게 제공되는 선도적인 간격 반복 알고리듬으로 남는 데 도움을 줌
댓글과 토론
Hacker News 의견들
-
간격 반복을 개선하는 데 크게 과소평가되는 방법은 카드를 더 쉽게 만드는 것임. 효과적인 카드가 놀랄 만큼 쉬워도 된다는 걸 알게 됨
처음에는 Anki로 프랑스어 어휘를 외우며 영어↔프랑스어 양방향 카드를 만들었는데, 카드가 수백 장이 되자 유의어가 너무 많아져 고통스러웠음
이후 Katzumoto의 일본어 학습 조언을 따라 전자책이나 웹페이지 문단 전체를 붙여넣고 단어 하나만 가리는 빈칸 카드를 만들었고, 쉽지만 효과적이었음
더 게을러져서 단어 절반만 가리거나, 단어를 굵게 표시하고 문맥 속에서 대충 떠올리면 통과로 처리했는데 오히려 더 잘 작동했음
카드가 뜰 때 “아, 저 카드 또?” 싶으면 삭제했고, 3번 틀리면 Anki가 영구 보류하도록 설정함. 정말 알아야 하는 단어라면 곧 더 나은 문맥에서 다시 보게 되니 문제 없었고, 프랑스어 어휘는 계속 빠르게 늘었음
가장 큰 개선은 더 나은 간격 반복 알고리즘보다 카드 형식 개선에서 나올 것 같고, 유용하기엔 너무 쉬운 카드를 만들기는 의외로 어렵다고 봄. 세 언어에서 Anki 반복 35,000회 이상 해본 결과임- 이게 SRS를 제대로 쓰는 방식임. 우리 같은 긱들은 더 똑똑한 반복 알고리즘이나 입력 방식으로 1% 개선을 좇기 쉽지만, 실제 실패 모드는 훨씬 평범하게도 사람들이 포기하는 것임
뭔가를 배우는 첫 달에 Anki에 수천 장을 밀어 넣고, 한두 달 뒤 복습량에 압도돼 복습이 잡무처럼 느껴져 그만두는 경우를 자주 봄
차이를 만드는 조언은 두 가지임. 카드를 약간 ‘너무’ 쉽게 만들고, 어떤 카드를 넣을지 꽤 선별해야 함
카드를 처음 만들 때는 그 주제를 막 공부 중이라 머릿속에 생생하므로 지금의 자신에게 재미있고 도전적인 카드를 만들고 싶어짐. 하지만 1~2주 뒤에는 혼란스럽게 하기보다 기억을 살짝 건드릴 정도로 쉬운 카드가 더 낫다
책 한 권 분량의 문장을 통째로 Anki에 넣기보다, 과수원을 걷듯 천천히 둘러보고 가장 좋은 사과 한두 개만 따는 편이 좋음. 썩은 사과, 즉 흥미 없거나 너무 어려운 카드는 덱 전체를 오염시켜 복습 자체를 피하게 만듦 - 반대로 해왔음. 한 언어에서 Anki 반복 70,000회를 했는데, 문맥을 신중히 추가하는 건 대체로 카드 생성 시간 낭비처럼 느껴졌음
복습은 보통 빠르게 지나가므로 카드당 학습 시간에서 생성 시간이 의외로 큰 비중을 차지함. 요즘은 문맥을 점점 덜 넣고, 사전 플러그인이 만드는 기본 단순 카드로도 충분한 경우가 많음
카드 앞면에 굳이 문맥을 추가하는 건 거의 항상 그 문맥 안에서만 보이는 전문 용어일 때 정도임. 독립적으로 배우는 가치가 없을 때임
다만 게으르게 하고 스스로에게 관대해지는 건 좋다고 봄. 답을 채점할 때도 원어민 수준의 완벽한 숙달이 아니라, 실제로 혼동을 피할 만큼 이해했는지를 기준으로 꽤 느슨하게 처리함 - 원래 SuperMemo의 SRS 카드 작성 20가지 규칙은 보물창고임: https://www.supermemo.com/en/blog/twenty-rules-of-formulating-knowledge
카드 품질을 크게 개선해 줄 것임 - 기타를 배울 때도 비슷한 생각을 함. 한 문제를 머리가 여러 방식으로 다루게 하는 게 좋을 수 있음
예를 들어 지판 음을 간격 반복으로 무식하게 밀어붙일 수도 있지만, 실제로는 문맥을 섞는 것이 더 효과적이었음
어떤 주에는 게을러서 음 이름만 드릴하고, 다른 주에는 헝가리안 스케일 같은 이상한 음계를 만지작거리고, 또 다른 주에는 아르페지오 코드나 파워 코드 진행, 특정 곡의 소리나 느낌을 재현하려고 함
시간이 지나면 뇌가 연결을 만들기 시작함. “이건 그냥 G단음계네”, “이건 G장음계인데 저 음들을 건너뛰는 거네”, “이 패턴이면 저렇게 연주해볼 수 있지 않나?” 같은 깨달음이 생김
안다고 생각하는 것보다 모른다는 걸 깨닫는 속도가 훨씬 빠르게 늘어나는 묘한 느낌도 있음. 그래도 5~10분짜리 기타 과제를 던져 주는 간격 반복 알고리즘을 써서 근육 기억과 신경 연결을 같이 키워볼까 생각 중임 - 언어 학습에는 Anki를 오랫동안 띄엄띄엄 써왔고, 최근에는 온라인 대학 강의 공부에 쓰고 있음
내용이 언어만 있을 때보다 다양해서인지 카드 형식의 영향력이 크게 느껴짐. 남이 만든 덱에서도 답변 쪽 문구를 자주 고치는데, 유지율에 체감 가능한 차이가 남
간결하고 자연스럽게 흐르는 답변이 더 잘 붙음. 어색하게 느껴지는 카드가 있으면 주저하지 말고 고치는 편이 좋다
- 이게 SRS를 제대로 쓰는 방식임. 우리 같은 긱들은 더 똑똑한 반복 알고리즘이나 입력 방식으로 1% 개선을 좇기 쉽지만, 실제 실패 모드는 훨씬 평범하게도 사람들이 포기하는 것임
-
Anki로 외국어 단어 수만 개를 외웠고, 카드에 그림이 있으면 단어를 기억하는 데 항상 도움이 됐음
지금은 가족과 하는 퀴즈 게임 카드 750장을 외우는 다소 어리석을 수도 있는 프로젝트를 하고 있음. 모든 질문의 답이 연도인 카드들임. 예: “Coca Cola Light는 몇 년에 나왔나?”
Midjourney로 카드용 이미지를 만들면 훨씬 쉽게 떠올릴 수 있음
세기마다 대표 인물을 두는 체계를 씀. Einstein은 1900~2000년, Marie-Antoinette는 1700~1800년을 나타냄
물건은 10년 단위를 나타냄. 60년대 자동차는 60년대, 어깨 패드 재킷은 80년대 같은 식임. 마지막 자리 숫자도 비슷하게 처리함
Midjourney가 이런 요소들을 만화 스타일 이미지로 만들게 하고, 가장 재미있거나 황당한 이미지를 저장해 Anki 카드 뒷면에 넣음. 이미지는 연도 자체보다 떠올리기 쉬운 경우가 많음- 세 가지가 있음. 첫째, 이미지 기반 기억술인 PAO를 찾아보면 좋음
둘째, 이미지가 없는 실제 상황에서 회상이 나빠질 수 있으니 주기적으로 이미지가 있을 때와 없을 때를 나눠 테스트해야 함
셋째, 그 퀴즈가 Trivial Pursuit인지 궁금함. 친구 한 명은 원판 Genus 에디션 카드를 전부 일부러 외웠음 - 지금 지리 쪽으로 같은 일을 하고 있음. 국기, 수도 같은 것들임. 대부분의 퀴즈 밤에서 +5 정도의 이점은 줄 것 같음
- 그 체계가 기발함. 날짜는 늘 힘들었는데, 앞으로 그 아이디어를 훔쳐 써야겠음
- 세 가지가 있음. 첫째, 이미지 기반 기억술인 PAO를 찾아보면 좋음
-
흥미로움. 벤치마크에 따르면 이 알고리즘을 쓰면 고전적인 Anki 알고리즘보다 20~30% 더 적은 카드를 복습해도 된다고 함
며칠 전에 https://python.cards에서 쓰는 고전적인 SM-2 알고리즘의 Python 구현을 공개했는데, FSRS로 바꿀 수도 있겠음: https://github.com/vlopezferrando/simple-spaced-repetition- python.cards가 좋아 보임. 예제를 몇 개 추가하면 좋겠음
웹 앱을 오픈소스로 공개할 가능성이 있는지도 궁금함. 학생들이 X를 배우는 식으로 특정 분야에서 플래시카드를 보여주는 인기 있는 방식이 될 수 있어 보임
- python.cards가 좋아 보임. 예제를 몇 개 추가하면 좋겠음
-
설명을 보면 FSRS도 여전히 각 카드에 정확한 복습 날짜를 붙이는 것 같음. 이 기능 때문에 Anki를 그만뒀음
대학생도 아니고 시험을 보는 것도 아니라서, 그냥 하고 싶을 때 연습하고 싶음. 세션 사이에 긴 공백이 있을 수도 있고, 밀린 카드가 쌓인다는 느낌을 받고 싶지 않음
Anki는 훌륭한 앱이지만, 복습 날짜를 붙이기보다 카드들을 무작위 표본추출하되 긴급히 복습해야 할 확률에 비례해 뽑는 알고리즘이 있었으면 함
https://github.com/fasiha/ebisu 같은 방식이 Anki 플러그인으로 가능하거나, 공개 카드 형식을 쓰는 비슷한 앱이 있으면 좋겠음- 하지만 기억은 그런 식으로 작동하지 않음. 제안하는 것처럼 기억을 보류 상태로 둘 수는 없음. FSRS가 개인화된 기억 곡선을 따르는 데는 이유가 있음
- 하고 싶을 때 연습하고, 세션 사이에 긴 공백이 있을 수도 있다는 건 이미 SRS가 하는 방식임
다만 “밀린 것”을 다 비우면 더는 원할 때 연습할 수 없고, 다시 연습 가능해질 때까지 일정 기간 기다려야 함 - 그런 식의 반쯤 만든 앱을 만들어봤는데, 매우 잘 안 됐음
기억하는 사실은 반복이 짜증났고, 잊은 것들 중 상당수는 완전히 잊어버렸음. 그래서 반복의 의미가 거의 없고 진행이 매우 느렸음
핵심은 거의 잊기 직전에 반복하는 것인데, 이는 기한과 일정 관리 없이는 어렵다 - Phrasing.app에서 바로 그런 방식을 만들고 있음. 처음에는 ebisu를 썼지만, 결국 FSRS 포크를 크게 수정해서 쓰게 됐음
실제로 기한은 쓰지 않고, 요청받은 일부 분석 기능을 제외하면 사용자를 여러 난이도 수준에 유지하려고 함
항상 100% 밀린 것을 없애는 것보다 앞으로 나아가는 것을 더 중요하게 봄. 정말 중요한 단어라면 즐겨찾기하거나 다시 보게 됨
공개 플래시카드 앱은 아니고, 외국어 자동 문장 채굴에 많이 집중하고 있음. 그래도 FSRS를 수정해본 경험에 대한 질문에는 기꺼이 답할 수 있음
제품에 대한 내용은 https://blog.phrasing.app/phrasing-first-look/에서 볼 수 있음 - Anki에서는 필터 덱을 쓰고 상대적 기한 초과 정도로 카드를 정렬할 수 있음
-
FSRS를 3개월 써왔고, 예전 SM2 일정 알고리즘을 시행착오로 조정해야 했던 고통이 마침내 해결됐음
각 덱의 내용이 최적 유지율에 큰 영향을 줄 수 있는데, 이제 몇 달마다 각 덱의 가중치를 다시 학습시키면 적절히 적응함
논문[0]도 대규모 실제 환경의 간격 반복 과학을 엄밀하게 분석한 내용을 보고 싶다면 읽을 가치가 큼
광범위한 벤치마크 때문에, 대부분은 리뷰가 수천 건 쌓이기 전까지 자기 컬렉션에 맞춰 가중치를 다시 맞춰도 이득이 크지 않을 것임. 저자는 1,000회 이상을 권장함
카드를 늦게 해도 잘 작동함. 회상 확률이 안정도와 마지막 복습 시점에 기반하고, 기한이 지난 뒤에도 기억해냈다면 안정도가 조금 더 길게 업데이트되기 때문임
[0] https://dl.acm.org/doi/10.1145/3534678.3539081?cid=99660547150
[1] https://github.com/open-spaced-repetition/fsrs4anki/wiki/The-Algorithm -
플래시카드를 취미로 좋아해서 매일 여러 간격 반복 앱을 재미로 씀. FSRS도 써봤고 좋지만, 최신 SuperMemo만큼은 아직 아님
같거나 비슷한 자료를 두 개 이상의 앱에 넣어보면 차이가 보임. 그래도 FSRS는 지금 나와 있는 거의 모든 것보다 훨씬 낫고, 곧 SuperMemo보다 좋아질 것 같음
Mochi Cards는 약 1년 써봤는데 그냥 괜찮은 정도였고, 기본 Anki 설치보다 조금 나았음. Mnemosyne도 비슷함. SuperMemo SaaS 앱도 괜찮지만 언어 자료를 구성하는 방식은 마음에 들지 않음
언어 어휘에는 Clozemaster를 쓰고, 맞힌 뒤에는 그 문장을 SuperMemo에 넣음. SuperMemo 알고리즘이 그만큼 더 낫기 때문임. 각 단어에 대한 ChatGPT 설명도 있어서 그것도 SuperMemo에 넣음
가장 어려운 부분은 확실히 좋은 카드를 만드는 것임. 아이디어를 더 얻는 데는 http://arxiv.org/abs/2401.01257와 https://rust-book.cs.brown.edu가 도움이 됨
SuperMemo만큼 빠르게 카드를 만들게 해주는 플래시카드 프로그램은 아직 못 찾았음. SuperMemo에서는 텍스트 덩어리를 붙여넣고(ctrl-n), 빈칸 삭제로 만들 단어를 선택한 뒤 alt-x를 누르면 됨. 같은 텍스트 조각에서 여러 번 할 수 있고, 할 때마다 새 빈칸 카드가 복습에 들어감
다른 앱은 대부분 카드를 한 장씩 만들어야 함. 카드와 덱 은유에 너무 강하게 묶여 있기 때문인 것 같음. SuperMemo는 모든 것을 트리 구조로 정리해서 큰 차이를 만듦. 사실 꼭 정리할 필요도 없는데, 사람들은 배운 자료가 머릿속에서 깔끔한 덱으로 분류될 것처럼 행동함- Anki에서는 Debian 기준으로 Ctrl-Alt-C임
- Mochi에서도 거의 같음. n으로 새 카드를 만들고, ctrl-v로 텍스트를 붙여넣고, 단어를 선택한 뒤 ctrl-l로 빈칸을 만들고, ctrl-[n]으로 0~9번 빈칸 그룹을 만들면 됨
각 빈칸 그룹은 자기만의 “카드”를 갖게 됨
-
간격 반복의 중요성을 생각하면, Anki와 달리 모듈식 접근이 필요하지 않을까 싶음
세 가지가 분리돼 있는 것 아닌가?- 카드들 또는 카드의 부분집합
- 그 카드들과 상호작용한 기록
- 그 기록을 바탕으로 카드를 제시하고, 다시 기록을 추가하는 알고리즘. 잠재적으로는 필요 시점에 계산하는 방식일 수 있음
- Anki FSRS는 사용자가 제공한 입력만 기반으로 하는 적시 계산 알고리즘에 더 가까워졌음
자료구조가 엄격히 모듈식은 아니지만, 기존 Anki 덱과 확장 기능 호환성을 유지하면서 현실적으로 가능한 한 그 이상에 가까움
실제로 이제 기록과 현재 알고리즘 조정값만으로 모든 간격과 난이도를 완전히 다시 계산하는 버튼이 있음. 이미 FSRS를 쓰고 있고 조정값이 바뀌지 않았다면, 재계산은 각 복습 뒤의 증분 계산과 같으므로 아무 효과도 없음
원칙적으로는 적시 계산하는 순수 함수로 볼 수 있고, 기존 호환성과 성능 때문에 생성된 데이터를 캐시하는 형태라고 보면 됨
-
관련된 뻔뻔한 자기 홍보로, YouTube 영상에서 Anki 카드를 만들 수 있는 무료 오픈소스 도구를 만들었음: https://youtube2anki.fly.dev/
피드백을 받고 싶음. 코드는 GitHub에 있음: https://github.com/vacmar01/youtube2anki- 멋지다. 어떤 영상에 쓰는지 물어봐도 될까?
-
FSRS와 Anki에 대해 Xiaojun과 여러 번 이야기해봤음. Anki+FSRS 같은 전통적인 간격 반복 시스템에서는 학습자가 지식을 항상 같은 문맥에서 복습하는 경우가 많아, 지식을 더 큰 네트워크의 일부가 아니라 고립된 단위로 이해하게 될 수 있음
예를 들어 단어를 따로 배우는 것은 실제 생활에서 언어를 쓰는 데 충분한 준비가 되지 않음. 실제 상황에서는 문맥, 연어, 용법이 큰 역할을 함
고립된 반복보다 더 나은 언어 학습 방식은 단어를 다양한 문맥과 조합 속에서 접하게 해, 단어가 자연스럽게 덩어리와 문장으로 형성되는 방식을 이해하게 하는 것임
그래서 언어 학습에서는 Anki 카드 대신 실제 생활의 짧은 영상을 보여주는 것을 만들고 있음. 각 영상은 작은 시나리오로, 실제 상황에서 언어가 어떻게 쓰이는지 보여줌
학생들은 단어를 암기하는 것뿐 아니라 시각적 단서와 몸짓까지 포함된 자연스러운 문맥에서 쓰임을 봄. 이 접근은 단어와 표현의 실제 적용을 이해하게 해 학습을 더 몰입감 있고 효과적으로 만들 수 있음. 외국어 학습 실패의 주된 이유가 지속하지 못하는 것이기 때문임
Anki에 부족한 또 하나는 “기억하나?”가 아니라 실제 상황 기반 퀴즈임. 학생들이 배운 것을 재미있고 부담 낮은 환경에서 적용해야 함
SRS 알고리즘은 해법의 일부일 뿐이고 만능은 아님. 기억에는 감정이 부호화에 미치는 영향 같은 요소가 많음. 첫 키스나 졸업식 날을 기억하는 데는 SRS가 필요 없음
사람들은 어떤 SRS도 없이 모국어를 유창하게 배우지만, 외국어는 SRS를 써도 대부분 유창해지지 못함- 문맥 속에서 배우고 문맥을 다양화해야 한다는 주장은 가치 있지만, “사람들은 Anki나 문법 공부 없이 모국어를 배운다”는 말은 늘 거슬림
제1언어 습득과 제2언어 습득은 사과와 베이컨만큼 다름. 아기와 성인의 뇌는 다르고, 필요와 능력, 문맥도 크게 다름 - 맞음. Refold 방식처럼 SRS와 몰입 학습을 결합하는 쪽을 선호함
- 문맥 속에서 배우고 문맥을 다양화해야 한다는 주장은 가치 있지만, “사람들은 Anki나 문법 공부 없이 모국어를 배운다”는 말은 늘 거슬림