mardi 30 janvier 2018

Hundred's of deck in Anki: why it can be useful

Lire la suite...

vendredi 5 janvier 2018

Lists in anki: desiderata and partial solution

In this text, I assume you are familiar with anki, and in particular know what is a field, a card, a card's type (aka template), a note and a note's type (aka a model), and that you have an idea of what are the rules used by anki to decide which cards should be generated or not.

There is one big limitation in anki, it concerns lists[1]. Here I list my trouble, the existing work arounds I know, their limits, and the functionnality I would really want. Sadly, this functionnality seems to require such a big modification of anki's underlying model that I fear that no add-on can answer my request. In particular if I want this request to also be satisfied in smartphone's application, which does not allows to add add-ons.

Learning a list of things is hard, but it's something I sometime want to do. A poem/song is just a list of line. Sometime, a mathematical notions have 4 distinct names. E.g. a pullback is also called a fiber product, a fibered product and a Cartesian square. In some othe case, a mathematical objects admits many distinct definitions[2]. E.g. I've got 5 definitions of left-trivial monoids. And I'd also wanted to see if I can learn the list of the prime number less than 100. Mostly to see how hard it is to learn an arbitrary list.

Work around

Creating a note by question

Currently, I used the add-on «imports lyrics/poetry» for lyrics of song I like. This add-on creates a note by line of the lyrics. The main trouble is that, if you have an error in a line, you need to correct many notes since the error is repeated. And it's hard to correct many notes from the smartphone, while it is easy to just correct the current note. The second problem with this method is that, since each lines correpsond to a distinct note, there is no way to ask Anki to bury the other notes(lines) related to the same song.

Furthermore, it is really inneficient in term of memory. Indeed, the first line of a 120-line lyrics is copied 120 times in memory.

A field by question

Concerning the definitions, I have in my note type «name», «name 2», «name 3» and «name 4». And my note's type contains 4 similar card's type, with similar templates. And I did the same thing for the four fields «notation». Normally, it means that when I do want to change a template, I'll need to change it - at least - 4 times. In order to avoid this, I created MetaTemplate, a template for card's type. But it's not really easy to learn how to use it and I have no idea of how to make it more user friendly. And anyway, having four fields works only because it is a small list.

Let us imagine I would like to have a single note for an entire song. And this song is 120 lines longs. The only solution I see would be to create a field by note, hence for a song with 120 lines, I would need a note type with 120 fields and 120 cards. Which is not technically impossible, but unreasonable. In particular because anki is already slow when I edit a note type with 30 cards.


The first thing I did to learn lyrics is to use cloze deletion. A single line would be deleted, and I have to remember it. The trouble is that, seeing the line after the deleted one is a really strong hint I'm not supposed to have when I recite the song. I would rearry prefer Anki to give me the start of the lyrics and asking for the next line. As is done by «imports lyrics/poetry».

My ideal world

I know explain what I would love to see when I use list. When I create a card type, I'd want to tell anki, «here is a list of thing» and maybe «its order matter» (for song) or «it order does not matter» (for list of names of an object). In the first case, I'd like to be able to ask Anki to randomize the order of the elements shown in a card. I don't think it'd be complicated, since we can use javascript.

The first option I want is to write in a card's type: «here, show every element of the list "name", separated by a "comma"» (of course, "name" and "comma" could be replaced by any other field and any other separator.) Thus, my card would show «name: fiber product, fibered product, Cartesian square». This is specially important if the question is «what is the name of "the limit of a product"». In this place, I should remember one of the name. Thus the answer need to show me every possible answer, and I would accept iff I remembered at least one of the name.

Similarly, I'd like to be able to tell anki to generate n cards, where n is the number of elements of the list. In card i I want the option to tell anki to shows only the ith element of the list. In my example above, each card would contains one of the name of the objects which admits multiple definitions, and each card would ask to give the other name. Hence the question would be «What is(are) the other name of "fibered product"» and the answer would be "fiber product, Cartesian square".

I also want the option to tell anki to show each elements appart from the i-th one. For example, this would let me tell to anki to ask me the i-th name given the n-1 other name. This would be especially usefull in order to learn lyrics. Assuming that you know the 10 first line, it makes sens to let you read them again in order to find the i-th line. By symmetry I probably want to see the n-i last line. (I don't yet see the usage I would have of it, but no reason not to do it too)

I'd also love the option to ask Anki for lines i-4 to i-1. For example, in the case of learing lyrics, you probably could remember the i-th line with only the four last lines, and not the entire beginning of the lyrics. That is what the add-ons «imports lyrics/poetry» does. But with this add-on, it is not possible do simply change the value of 4 to 10 if I realize that 10 would be better.


The main problem I see with this option is that some power-user may intend to put multiple lists l1, ..., lm into a type field. Assuming that the list lj has nj elements, the numbers of card to generate may be up to n1 times ... times nj elements. This may quickly be unreasonnable. This would mainly be a problem for the user, reviewing a lot of cards is not necessarily usefull. But it would also be a technical problem because each cards has a name. For clozed cards, the name depends on the card number. Here the name would depends of multiple number, it should be sure that we find a correct method to generate name, without ambiguity, and which does not vary if the content of a note vary. The name could be card_n1_..._nj but its not really beautiful nor practical when a card's type is changed. (Technical note: Actually, in the database, the card's number is used instead of its name. Here, I could state that the card n1 ... nj would be numbered as 2n1 times .... times pj^nj, with pj being the jth prime. But it would means that the length of the card number is linear in the number of card, which is technically ugly and innefficient.

Concerning the input, I think there should be at least two distinct kinds of input. The field should be either a text or a list. Nothing should be changed for the text field (what already exists). For a field F which is a list, the interface would have a button (+), stating to add a new text input for F.

Or maybe, each elements should be entered in a single text input area, with a special separator symbol. The separator should probably be a parameter, either in the add/edit window, or in the template. For example, it makes sens to consider that the separator of a lyric is the newline. But it would also makes sens to accept that the user just copy-paste the list of elements they want to learn, separated by a comma or a tab. (à la CSV)

I don't know enough about database to know the ideal way to obtain a column of a table which is a list of things. So I do hope that it would not be particularly complicated. I can imagine multiple solutions, but I don't know what is the best practice. But since, in the current database, a note is a list of field with a separator symbol, I guess it would not be really complicated to add a second separator.


[1] I assume here that sets are list, with an arbitrary order

[2] This is in general considered to be a proof that the object is really interesting

mardi 29 novembre 2016

Logiciel de mémorisation pour les mathématiques

En traînant sur less wrong, j'ai découvert un truc que, visiblement, beaucoup de gens autour de moi connaissait - mais pas moi. Anki, un logiciel pour aider à la mémorisation, partant du principe que pour se souvenir des choses, il faut les revoir juste avant de les oublier, et que plus on les a revu, plus on met longtemps avant de les oublier. Il semblerait qu'en général, il soit principalement employé pour l'apprentissage de vocabulaire étranger. Je m'en vais vous expliquer comment je l'utilise pour les mathématiques. Sachez déjà que vous pouvez trouver un(des) example(s) de mes decks ici

Personnellement, mon plus grand problème avec les mathématiques, c'est la quantité de choses à apprendre. Je commence par donner un exemple, qui ne sera pas forcément clair pour les gens ne connaissant pas déjà un peu le domaine dont je parle, mais ça ne devrait pas trop gêner à saisir l'idée générale. J'ai voulu découvrir ce qu'était la théorie des catégories. Un autre jour j'ai voulu lire un manuel d'introduction à la théorie des nombres. Deux sujets qui, ont l'air franchement passionnants. Dans lequel les premières pages me semblent clairs. Mais après quelques dizaines de pages, j'avais oublié les définitions exactes donnés dans les pages d'avants. Pas des définitions très complexes. Juste trop nombreuses.

J'insiste énormément sur le fait que je parle d'apprendre des définitions que j'ai comprises. Il ne sert à rien, en mathématique, et de manière général, d'apprendre sans comprendre (à part une liste de courses ou les décimales de Pi, auquel cas il ne sert à rien de l'apprendre.)

Dans le cas des catégories, les définitions étaient expliquée en montrant comment des propriétés bien connus d'algèbre ou de topologie étaient des cas particuliers des propriétés catégoriques qu'on nous introduisait. C'est génial pour comprendre, vu que ça ramène à des notions connus. Par exemple, je me souviens que Épi et Mono sont les généralisations de surjectif et d'injectif. Ou d'injectif et surjectif. J'avais toujours un doute. Dans tous deux cas, ça me permettait donc de savoir que même un Épi peut être Mono. Mais d'une part, ça garde la question «Un Épi, c'est surjectif ou injectif ?» Et d'autre part, savoir que c'est une généralisation ne m'aide pas à savoir comment ça généralise. Quelles propriétés des surjections sont gardées et lesquels ne le sont pas. Par exemple, suivre de trop près la métaphore indiquerait que Épi et Mono implique Iso.

Et pour ce genre de problème, un logiciel de mémorisation est génial. Le souci, c'est que les decks créé par la communauté d'utilisateur de anki sont assez médiocres. D'abord parce qu'on dirait qu'aucun procédé systématique n'a été suivi en créant les cartes (certains ont juste scanné des pages de cours manuscrites). Et puis parce que c'est rarement des maths qui m'intéressent. Je ne cherche pas à apprendre mes tables de multiplication, ni les bases de calculus. En fait, les seuls deck de la communauté que j'utilise sont: pour apprendre les notes naturelles sur les cordes de guitare, les techniques pour utiliser efficacement un logiciel de mémorisation, et le deck créé à partir de Rationality, from A.I. to Zombie. Je me retrouve donc à créer mes propres decks à partir de livre de cours ou d'articles de recherche dont j'aimerai maîtriser le contenu.

Les régles que j'utilise.

Les decks.

J'utilise un deck par livre. Parce que comme ça je pourrai donner ses decks à la communauté en indiquant précisément ce que contient le deck. Ça veut dire que j'ai choisi de prendre le temps de remettre dans le deck des trucs que je crois déjà connaître; et en particulier des choses sont en double d'un deck à l'autre (Par exemple, la définition d'un ensemble ouvert se trouve bien sûr dans un deck de topologie. Mais il se trouve aussi dans un deck d'analyse complexe, où la définition est restreinte aux cas des espaces métriques.). J'ai l'impression que ça ne me fait pas perdre beaucoup de temps, que ça me permet d'être sur que je n'omet pas de chose que je pense maîtriser à-peu-près - mais en fait non. Et ça permettra à la communauté puisse commencer par n'importe quel deck.

Je précise tout de suite que ces decks ont vocation à servir à aider la lecture du livre. Mais PAS à la remplacer. Parce que avoir vu au moins une fois la démonstration est souvent important. Et que mes deck ne reprennent pas en général les démonstrations[1].

Je ne créé pas la totalité d'un decks d'un coups. Par exemple, je lis un bouquin de théorie des ensemble. Pour l'instant je n'ai créé que le chapitre un. Parce qu'il y a déjà tellement de définitions différentes que je ne maîtrise pas encore par cœur et qui me demande de réfléchir (le type, la cofinalité) que je ne serai pas encore capable de comprendre la suite du livre. (À ce sujet, il faudrait que je conseille aux utilisateurs de mes decks de «suspendre» l'étude du chapitre n tant qu'ils ne maîtrisent pas le chapitre n-1.)

À contrario, je construis plusieurs decks d'un coup. Ce qui est d'ailleurs assez cohérent avec la manière dont les maths sont étudiées en cours. C'est à dire que si je suis bloqué pour l'instant par ma maîtrise de l'analyse complexe, ça ne m'empêche aucunement d'avancer dans un livre de théorie des graphes. Et le temps d'avancer petit à petit dans l'apprentissage sur Anki des résultats d'analyse, je peux y mettre des résultats de théorie des graphes.

Type de carte

Une carte standard de Anki montre un recto et demande un verso. Et parfois les cartes sont à double sens: on montre le verso et on demande le recto. C'est génial pour du vocabulaire, et je l'utilise quand je cherche à me souvenir de la traduction anglaise d'un mot que je connais en français, ou vice-versa.

À part pour le vocabulaire, j'utilise presque uniquement les textes a trous. C'est à dire, comme son nom l'indique, il y a un texte de base, et on cache une partie du texte que l'utilisateur doit retrouver. L'intérêt du texte à trou, c'est que ça permet de simuler les cartes normales. Donc une fois qu'on a sélectionner texte à trou, on n'a jamais besoin de rechanger le type de texte.

Je rajoute dans un champ à part le numéro de chapitre, section, sous-section. Et si c'est un théorème, lemme, corollaire, définition[2], je rajoute son numéro. Je ne rajoute pas (encore) le numéro de la page, parce que c'est souvent redondant avec les informations précédentes. Mais je suppose que je devrai le faire quand il n'y a pas de numéro d'environnement, car dans certains livre où rien n'est numéroté et dont les sections font 10 pages, retrouver une définition précise peut prendre plusieurs minutes. Cet intérêt est d'autant plus grand que, pour se souvenir d'un résultat, une méthode efficace est de se souvenir de sa preuve. Et que réciproquement, il est pratique d'avoir la position du résultat pour relire la preuve si on s'aperçoit qu'on l'a oublié.

Un dernier point important: je coche systématiquement la case disant à Anki de ne pas vider les champs quand j'ai rempli une carte. Concernant les numéros de chapitre et de section, c'est évident que ça change rarement d'une fois sur l'autre et qu'on gagne du temps en n'ayant pas à les retaper. Concernant les maths elles-mêmes, j'ai remarqué que les objets arrivant les uns après les autres sont souvent similaires. Ainsi, dans un livre d'algèbre linéaire, beaucoup de résultats vont commencer par «Soit U,V deux espace vectoriels et T un morphism de U dans V». C'est quand même pratique d'éviter de retaper ça a chaque fois.


Pour une définition, il y a en général trois trous. Le premier, c'est le nom de l'objet défini. Le second c'est la notation utilisée pour représenter l'objet. et le troisième c'est la définition. Si un objet admet plusieurs définitions équivalentes, je rajoute un trou par définition. Parce que si on te demande ce qu'est un carré, et que tu réponds : un losange avec un angle droit, tu n'as pas envie d'avoir faux car ça a été défini comme un rectangle avec deux côtés adjacents de mêmes longueurs.

Attention cependant, il vaut parfois mieux que la notation et la définition apparaissent dans le même trou. Ainsi pour X un ensemble, il est simple d'intuiter que «Aff(X)» est «le plus petit espace affine contenant X». Or ce genre de question est totalement inintéressante. Ce qu'il faut c'est retrouvé cette définition à partir de «l'ensemble des éléments de la forme Somme des x_ir_i, ou x_i appartient à X, r_i appartient au corps, et la somme des r_i vaut 1.»


Un théorème comprend en général deux trous: les hypothèse, et la conclusion. Un troisième trou si le théorème est important et admet un nom classique. Cependant, il faut faire attention, quand une hypothèse introduit un objet, il vaut mieux introduire l'objet en dehors du trou. C'est à dire «Si ..., alors le centre de P est non trivial» est peu clair. Alors que «Soit P un groupe. Si ..., alors le centre de P est non trivial» est plus clair.

Une première chose très importante est de toujours remettre toutes les hypothèses. Parfois, certaines hypothèses sont marquées en début de section/chapitre et sont supposées vrai pour tout le chapitre. Sauf que lors de la révision, on ne voit plus ces hypothèses (il serait même absurde de demander à connaître les hypothèses par cœur, chapitre par chapitre).

Il est aussi important de mettre des trous vides. En théorie des automates, certains théorèmes concernent des monoides, et d'autres uniquement des monoides finis. Si je dis «Soit M un monoide fini» ou «soit M un monoide», la simple présence du trou m'indique que l'hypothèse est que M est fini. Donc dans le deuxième cas, il est indispensable de mettre «Soit M un monoide ». C'est d'autant plus simple à faire que, si on dit à Anki que quand on créé une nouvelle carte, ses champs soient les champs de l'ancienne carte,

Implication multiples
Ce qui m'amène à un autre problème. Une hypothèse peut avoir plusieurs implications. Une propriété peut être impliqué par plusieurs hypothèse différentes. Donc il vaut mieux mettre «Si P1 ou P2 .. ou Pi alors Q», ou bien «Si P alors Q1 et Q2 ... et Qi». En effet, on ne voudrait pas avoir tort juste parce que, de toutes les conséquences, on a choisi celle qui est sur une autre carte. Ici, chaque terme entre crochet indique un trou différent.

On tomberait bien sur sur un problème si P implique Q et R et que Q est impliqué par O et P. Mais jusqu'à présent, je ne suis pas tombé dessus, et j'ai l'impression que dans les maths, en pratique, ça arrive rarement.

Ordre des mots
Quand un théorème est de la forme «Le centraliseur de A dans G divise le normalisateur de A dans G». Il faut absolument avoir «Le normalisateur de A dans G est divisé par le centraliseur de A dans G». Sinon on peut compléter le résultat par simple reconnaissance de motif. En se doutant que le trou du milieu est soit une égalité, soit une affirmation sur la divisibilité. Pour l'instant je n'ai pas encore trouvé comment faire ça efficacement, mais il faudrait que je repasse sur mes anciennes carte et fasse cet ajout.


La dernière chose que je veux rajouter dans Anki, ce sont les exemples. En général, ils sont de la forme «A, B.., Z sont des exemples de P».

J'ai longtemps cru que les exemples ne faisaient pas parti des mathématiques. Parce que, d'un point de vue purement Bourbakiste, logique, un exemple n'apparaît pas dans les preuves, et ce qui compte c'est: définition, axiomes, théorème, preuves. Et je pense que c'est une idée assez répandue, puisque je me souviens qu'un prof de l'ENS avait insisté sur le fait qu'il ne fallait pas qu'on ignore les exemples.

Depuis, j'ai compris que les exemples avaient aux moins trois utilités. Officiellement, ça donne de l'intuition, en montrant dans quel cas les hypothèses peuvent s'appliquer. Formellement, un exemple permet de montrer qu'un ensemble d'hypothèse est non contradictoire, et donc qu'il est pertinent de considérer ces hypothèses. Et en pratique, un exemple pourra être réutilisé quand on veut étudier des affirmations qui ne sont pas dans le cours.


Une fois les cartes faites, je demande à Anki de créer toutes les images à partir de LaTeX (étape non automatique, ce qui est bête) et j'utilise la synchronisation (possible uniquement via leur serveur), pour envoyer le tout vers mon téléphone portable. (Application gratuite et sans pubs, ils sont fantastiques !) et les réviser dans le métro/quand j'ai un moment seul sans mon ordinateur.

Bien sûr, en créant les cartes, je fais des fautes. Soit parce que je n'écris pas du LaTeX sans faute et que Anki affiche les message d'erreurs dans les cartes au lieu de le montrer à leur créations. Soit parce que j'ai oublié un mot, remplacé un mot par un autre (typiquement, je confond systématiquement les mot set et state - ce qui est ennuyeux quand on fait de la logique et des automates). C'est pour ça aussi que, quand je créé une carte, d'indiquer précisément d'où vient l'information. Si c'est le cas, s'il y a une faute, je «suspend» la carte. Et une fois synchronisé, je regarde les cartes suspendues sur mon ordinateur pour les corriger.

Parfois, c'est une carte à trou, et le trou fait que la phrase n'a aucun sens. Dans ce cas je suspend aussi avec un message explicatif. Ça arrive surtout si je n'ai pas respecté les règles énoncées plus haut, par exemples pour les premières cartes que j'ai créé. Même règles si je vois une faute tellement grosse que je ne comprend plus la question.


[1] La principale exception étant pour Least Significant Digit First Presburger Automata, où mon but est justement de comprendre un jour la démonstration de ce papier de 130 pages.

[2] Bref, un environnement en LaTeX