Introduction
Les algorithmes de streaming apparaissent à de nombreux endroits et sont encore un champ actif de recherche par toutes leurs applications possibles et problématiques adjointes. Dans les exemples classiques, nous pouvons citer:
- Les routeurs qui peuvent détecter des communications malveillantes noyées au sein d’un flux ininterrompu de données ou essayer de stopper des transactions frauduleuses parmi celles légitimes (outlier detection/anomaly detection).
- Retourner les vidéos en top des "tendances" du moment.
- Systèmes de recommandations.
- Compressions de fichiers.
- Amélioration des performances pour des problèmes d’analyse des données de type OLAP.
Les problématiques que l’on rencontre avec les algorithmes de streaming sont assez transversales à l’informatique puisque plutôt appliqué et adapté aux problèmes de big data actuels. On peut retrouver de la réduction de dimensionalité, du machine-learning, du traitement des graphes, des problèmes en external memory model, ou des problèmes plus terre à terre comme de l’acquisition de données, de la compression d’images ou des modèles de calcul de type MapReduce.
Ce tutoriel est inspiré des cours donnés par M. Jelani Nelson de University of California, Berkeley, à l’époque professeur à Harvard, M. Raphael Clifford de University of Bristol et M. Alexandr Andoni de Columbia University.
Les sujets abordés dans cet article sont plutôt 'avancés’ et s’adresseraient donc de préférence à des étudiants en fin de master (licence pour nos amis français). C’est un domaine fort orienté statistiques, mais nous nous limiterons très fortement aux développements qui peuvent être faits. Néanmoins, il est préférable de connaître les 3 grandes inégalités que sont Markov, Chebyshev et Chernoff.
Nous allons commencer par évoquer des cadres théoriques pour discuter de ce genre de problématiques. Nous présenterons ensuite deux algorithmes fondateurs de ce champs d’étude, en mettant en évidence la manière dont on peut démontrer la justesse de l’algorithme ainsi que leur caractéristique statistique intrinsèque. Nous enchaînerons sur une vue assez haut niveau des principales avancées qui ont été opérées dans ce domaine et des idées brillantes qui ont pu émerger. Finalement, nous conclurons sur des notions qui ont été évincées et des pistes de réflexions pour aller plus loin.
Cadre théorique
Jusqu’ici, nous n’avons pas encore défini ce que nous entendions par streaming algorithm ou "algorithme de fouille de flots de données" en bon français (selon wikipédia). Il s’agit d’un nom général donné aux algorithmes qui opèrent sur une flux continu de données afin de fournir une réponse. Cette famille se distingue des algorithmes qualifiés de online par trois caractéristiques principales:
- Consommation mémoire limitée.
- Temps de traitement minimal par unité de donnée.
- Réponse qui peut être délayée dans le temps.
En outre, les algorithmes streaming fournissent généralement une réponse approximative au résultat mais suffisamment proche du résultat attendu pour être exploitable et possèdent souvent des éléments non-déterministes.
Un élément central pour les algorithmes de streaming est la notion de sketch. Il s’agit d’une construction qui agit comme une nouvelle fonction, dénotée
Un streaming algorithm consiste donc à maintenir le sketch
Cela sera mis en avant dans la construction de deux cadres théoriques différents, deux modèles de calcul, pour soutenir la construction des bornes supérieures et inférieures de complexité. On distingue généralement le Cash register model (modèle de la "caisse enregistreuse") et Turnstile Model (modèle "tourniquet")1. Le modèle de la caisse enregistreuse se veut plus simple et ne permet que de compter les éléments du stream qui arrive. Il permet de répondre aux questions du type: "Combien d’éléments faut-il avoir vu, au minimum, avant de …". Le second modèle, du tourniquet, se concentre davantage sur les opérations du maintien du sketch à chaque élément, il se veut beaucoup plus puissant. Nous reviendrons principalement sur le deuxième modèle par la suite.
- MUTHUKRISHNAN, Shanmugavelayutham, et al. Data streams: Algorithms and applications. Foundations and Trends® in Theoretical Computer Science, 2005, vol. 1, no 2, p. 117–236.↩↩
Approximate Counting
L’un des premiers problèmes connus des algorithmes de streaming est le: approximate counting par Robert H. Morris Sr. en 19781. Celui-ci consiste à fournir une estimation du nombre
Dans le cas d’un comptage approximatif, on cherche un estimateur du nombre effectif d’événements
L'algorithme de Morris:
X <- 0
for each event:
with probability 1 / 2^X:
X <- X + 1
return 2^X - 1
L'idée consiste à ne compter qu'une partie des éléments en vue d'obtenir la meilleure approximation de l'exposant du nombre que l'on recherche, en se basant sur la propriété de Bernoulli qu'il faut en moyenne
Lorsqu'on tombe sur ce genre d'étrangetés, d'algorithmes peu communs, toute une série de questions émerge. Comment peut-on analyser ce genre d'algorithmes ? Pourquoi fonctionne-t-il ? Quelles sont ces caractéristiques statistiques ? Quelle est l'erreur maximale possible ? Que la probabilité que l'erreur relative soit supérieure à
Nous allons commencer par démontrer pourquoi l'algorithme fonctionne et fournit un résultat "attendu". Pour cela, nous allons étudier son "invariant":
Posons
La première partie du produit représente toutes les possibilités de l'état actuel du compteur après
On se retrouve avec:
L'invariant est démontré et laisse donc présumer que l'algorithme est correct dans l'objectif qu'il vise. Maintenant, que peut-on dire sur l'erreur attendue ? Pour cela, il suffit d'insérer le résultat précédent dans l'inégalité précédemment mentionnée:
On applique l’inégalité de Chebyshev2 (ou de Markov):
On se retrouve avec une cochonnerie où on peut montrer3 que:
Et donc que:
Résultat plus que surprenant à première vue. Si je fixe ma probabilité d'erreur à
Maintenant, si on veut améliorer l’approximation, on peut considérer
- MORRIS, Robert. Counting large numbers of events in small registers. Communications of the ACM, 1978, vol. 21, no 10, p. 840–842.↩
- https://en.wikipedia.org/wiki/Chebyshev%27s_inequality↩
- FLAJOLET, Philippe. Approximate counting: a detailed analysis. BIT Numerical Mathematics, 1985, vol. 25, no 1, p. 113–134.↩
- GRONEMEIER, André et SAUERHOFF, Martin. Applying approximate counting for computing the frequency moments of long data streams. Theory of Computing Systems, 2009, vol. 44, no 3, p. 332–348.↩
- NELSON, Jelani et YU, Huacheng. Optimal bounds for approximate counting. arXiv preprint arXiv:2010.02116, 2020.↩
Count distinct elements
Dans la section précédente, nous avons vu une manière d'approximer le nombre d'événements dans un flux. On peut aller une étape plus loin et demander le nombre d'événements distincts dans ce dernier.
Étant donné un stream de
Le premier algorithme pour résoudre ce problème a été énoncé par Philippe Flajolet & Nigel G. Martin vers 19831. Il se présente sous deux formes, une idéalisée et une réaliste.
Algorithme idéalisé:
Pick random hash function 'h':
X <- 1
for each event:
X <- min(X, h(x))
return 1/X - 1
Si vous êtes confus, c'est normal !
Premièrement, la fonction de hachage (aléatoire) prend en entrée n'importe quelle valeur possible (au moins tous les
Démonstration:
L'invariant est le suivant:
En effet, chaque résultat de la fonction de hachage est indépendant et la probabilité que
et il ne reste plus qu'à l'insérer dans notre inégalité en cherchant à calculer la variance, on a d'abord que:
On calcule la variance:
Il ne reste plus qu'à réintroduire dans notre équation principale:
De manière générale, si la probabilité d'erreur apparaît avec un
Réalisme
Maintenant, il ne reste plus que le problème de la fonction de hachage. Afin de minimiser l'espace mémoire nécessaire pour encoder cette fonction, l'idée générale consiste à créer un ensemble de
Quant aux réalisations dans
BITMAP <- [0] * L
for each event:
i <- LSB(h(X))
BITMAP[i] <- 1
R <- index of left-most zero in BITMAP
return 2 ** R / φ # 0.77351
La magie réside dans le fait que la probabilité d’avoir un nombre qui finit par la puissance
HyperLogLog
Comment ne pas aborder le célèbre algorithme du HyperLogLog de Flajolet, Fusy, Ganouet et al. en 20072 ? Il consiste en l’algorithme suivant:
m <- 2 ** b
M <- [-inf] * m
for each event:
v <- h(X)
j <- <v1 v2 v3 ... vb>2 # On prend les premiers b bits de v
w <- <vb+1 vb+2 ...>2 # Les bits restants
M[j] <- max(M[j], LSB(w))
Z <- 1 / sum(mj: 2 ** -mj, M) # L'indicatrice
return alpha_m * m * m * Z
où alpha_m est donné par:
L'idée est la suivante, on va essayer de diviser équitablement le stream des
Le maximum de chacun de ces sous-ensembles sera proche de
Impact
Le problème précédent du count distinct elements et sa complexité sont très liés à une borne définie par Alon, Matias et Szegedy en 993 où ils s’intéressent à la complexité minimale de l’estimation du
A première vue, ce genre de questions peut sembler assez étrange, mais il permet de répondre à des problèmes assez concrets comme le point query où on cherche à estimer le nombre de fois qu’un élément a été accédé ou le heavy hitter qui donne le sous-ensemble d’éléments qui ont été le plus accédé à X%5. Ce genre de requêtes est assez commun si vous pensez à des classements des tendances en temps réel, par exemple.
- FLAJOLET, Philippe et MARTIN, G. Nigel. Probabilistic counting algorithms for data base applications. Journal of computer and system sciences, 1985, vol. 31, no 2, p. 182–209.↩
- FLAJOLET, Philippe, FUSY, Éric, GANDOUET, Olivier, et al. Hyperloglog: the analysis of a near-optimal cardinality estimation algorithm. In : Discrete Mathematics and Theoretical Computer Science. Discrete Mathematics and Theoretical Computer Science, 2007. p. 137–156.↩
- BAR-YOSSEF, Ziv, JAYRAM, T. S., KUMAR, Ravi, et al. Counting distinct elements in a data stream. In : International Workshop on Randomization and Approximation Techniques in Computer Science. Springer, Berlin, Heidelberg, 2002. p. 1-10.↩
Linear sketching & Count-Min sketch
Linear sketching
Il existe deux modèles de calcul associés aux problèmes des streaming algorithms et qu’on qualifie de Cash register model (modèle de la "caisse enregistreuse") et Turnstile Model (modèle "tourniquet")1. Grosso modo, le premier modèle ne s’intéresse qu’au nombre d’éléments nécessaires en entrée afin de calculer un résultat. Tandis que le second prend en considération une collection où les éléments du stream peuvent soit ajouter ou supprimer une valeur. Le second a des conséquences beaucoup plus profondes parce qu’il permet de démontrer des bornes de complexité et de designer des algorithmes par linear sketching.
Indyk et Woodruff ont publié une avancée majeure en 20053 dans les problèmes de streaming qui a débloqué de nombreux problèmes avec la notion de linear sketching. Malheureusement, revenir sur ces problématiques nous écarterait trop du sujet initial et nous nous étendrons peu sur la question.
En très résumé, on peut représenter les résultats comme étant une matrice qui prend en entrée les éléments du flux

Count-Min Sketch
Une brique élémentaire, qui sert également de structure de données, de nombreux streaming algorithmes est le sketch du Count-Min introduit par Cormode & Muthukrishnan en 20057 qui prolonge une idée de Charikar, Chen & Farach-colton dès 20026. Il consiste en une matrice de taille
Supposons pour un
Par définition:
En effet, le second terme correspond à l’erreur, à l’ensemble des autres termes qui sont rentrés en collision avec cette cellule. Mais, nous savons que:
L’astuce réside à choisir la taille de
et:
Puisqu’il faut que tous les compteurs se trompent pour que le minimum soit erroné.
On arrive à ce que la complexité du sketch soit en
- MUTHUKRISHNAN, Shanmugavelayutham, et al. Data streams: Algorithms and applications. Foundations and Trends® in Theoretical Computer Science, 2005, vol. 1, no 2, p. 117–236.↩
- ALON, Noga, MATIAS, Yossi, et SZEGEDY, Mario. The space complexity of approximating the frequency moments. Journal of Computer and system sciences, 1999, vol. 58, no 1, p. 137–147.↩
- INDYK, Piotr. Stable distributions, pseudorandom generators, embeddings, and data stream computation. Journal of the ACM (JACM), 2006, vol. 53, no 3, p. 307–323.↩
- INDYK, Piotr et WOODRUFF, David. Optimal approximations of the frequency moments of data streams. In : Proceedings of the thirty-seventh annual ACM symposium on Theory of computing. 2005. p. 202–208.↩
- ANDONI, Alexandr, KRAUTHGAMER, Robert, et ONAK, Krzysztof. Streaming algorithms via precision sampling. In : 2011 IEEE 52nd Annual Symposium on Foundations of Computer Science. IEEE, 2011. p. 363–372.↩
- CHARIKAR, Moses, CHEN, Kevin, et FARACH-COLTON, Martin. Finding frequent items in data streams. In : International Colloquium on Automata, Languages, and Programming. Springer, Berlin, Heidelberg, 2002. p. 693–703.↩
- CORMODE, Graham et MUTHUKRISHNAN, Shan. An improved data stream summary: the count-min sketch and its applications. Journal of Algorithms, 2005, vol. 55, no 1, p. 58–75.↩
- CORMODE, Graham et MUTHUKRISHNAN, Shan. An improved data stream summary: the count-min sketch and its applications. Journal of Algorithms, 2005, vol. 55, no 1, p. 58–75.↩
Sparse recovery
Un autre problème des streaming algorithmes est celui du *sparse recovery*. Ce problème consiste à estimer la fréquence d'apparition d'un élément (
1-sparse stream
Pour le cas du 1-sparse stream, il suffit de calculer ces deux valeurs:
Où
Cet algorithme vous parlera peut-être plus dans un autre contexte, c'est celui qu'on emploie lorsque vous avez une permutation d'un array ayant pour valeurs
Maintenant, si l'on souhaite retrouver la valeur associée, l'astuce consiste à calculer une preuve en travaillant dans l'arithmétique modulo p avec p tel que
L’algorithme est le suivant:
l, z, p = 0, 0, 0
r <- random.rand(2, p)
for each event (j, c):
l <- l + c
z <- z + c * j
q <- q + c * (r ** j)
if l == z == q == 0:
return "error"
elif z / l not in [n]:
return "error"
elif p != l * (r ** (z / l))
return "error"
else:
tmp <- [0] * l
return tmp[z / l] = l
Sur un exemple concret, supposons que
- l vaudra successivement 3, 1, -1, 1
- z vaudra 6, 4, 0, 2
- q vaudra
3 * 5^2 = 75 (9), 75 + (−2) * 5^1 = 65 (10), 65 + (−2) * 5^2 = 15 (4), 15 + 2 * 5^1 = 25 (3).
Si on avait additionné chaque élément du stream par catégorie, on se retrouverait au final avec (0, 1), les "1" se sont bien annulés et il ne reste que "2" avec la fréquence 1.
C'est algorithme fonctionne parce que si
s-sparse stream
Il ne reste plus qu'à généraliser ce procéder à
t <- log(s / delta)
D <- [[0 for _ in range(2 * s)] for _ in range(t)]
hashes <- [pick_independent_random_hash_from_n_to_2s() for _ in t]
for each event (j, c):
for hi, i in enumerate(hashes)
update D[i, hi(j)] with (j, c)
On peut alors montrer que:
- L'espace mémoire nécessaire de en
bits. - Le temps d’exécution est en:
pour chaque nouveau token. pour fournir les résultats.
Ce qui est plutôt pas mal du tout !
Streaming algorithms for Graph & Dynamic Programming
Ce n’est pas tout, on peut plonger encore plus profondément dans la folie et s’intéresser à des algorithmes sur des graphes dans des considérations de semi-streaming. Ce champ a été ouvert par Feigenbaum et al. en 20041.
Tout d'abord, on définit un algorithme en semi-streaming sur un graphe comme employant
Par exemple, pour un spanning forest, afin de détecter la connectivité, on peut avoir l’algorithme suivant:
F <- set()
for each edge as e:
if not leads_to_cycle(F U e): # Vérifier que les deux sommets ne sont pas déjà dans F
F <- F U e
return 1 if is_tree(F) else 0 # F = n - 1
Mais quel est le rapport avec les s-sparse recovery ? La possibilité que l’on puisse reconstruire l’ensemble des arêtes incidentes pour chacun des nœuds du graphe ! Vous avez également de nombreux problèmes de type dynamic programming qui peuvent s’exprimer au travers de graphes et donc bénéficier de ce genres d’avancées3. De nombreux algorithmes ont pu être exprimés dans ce cadre de travail, parfois avec des solutions très élégantes: comme l’AGM sketch4 ou le maximal matching5.
- FEIGENBAUM, Joan, KANNAN, Sampath, MCGREGOR, Andrew, et al. On graph problems in a semi-streaming model. In : International Colloquium on Automata, Languages, and Programming. Springer, Berlin, Heidelberg, 2004. p. 531–543.↩
- SUN, Xiaoming et WOODRUFF, David P. Tight bounds for graph problems in insertion streams. In : Approximation, Randomization, and Combinatorial Optimization. Algorithms and Techniques (APPROX/RANDOM 2015). Schloss Dagstuhl-Leibniz-Zentrum fuer Informatik, 2015.↩
- GOPALAN, Parikshit, JAYRAM, T. S., KRAUTHGAMER, Robert, et al. Estimating the sortedness of a data stream. In : SODA. 2007. p. 318–327.↩
- AHN, Kook Jin, GUHA, Sudipto, et MCGREGOR, Andrew. Graph sketches: sparsification, spanners, and subgraphs. In : Proceedings of the 31st ACM SIGMOD-SIGACT-SIGAI symposium on Principles of Database Systems. 2012. p. 5–14.↩
- KONRAD, Christian. Maximum matching in turnstile streams. In : Algorithms-ESA 2015. Springer, Berlin, Heidelberg, 2015. p. 840–852.↩
Algorithmes sur les matrices
Une grande famille d’algorithmes et qui sont particulièrement intéressants dans le cadre du streaming sont les problèmes liés aux matrices. En effet, leur ubiquité dans les algorithmes de machine learning et de statistiques, de manière plus générale, les rendent indispensables dans ce cadre.
Approximate Matrix Multiplication
Véritable brique élémentaire, ce problème est évidemment à la racine de nombreux travaux. L’objectif est que l’on souhaiterait pouvoir multiplier deux matrices entre-elles, de manière efficace et sans trop d’erreur. De nombreux travaux se sont attelés à réduire la complexité du cas exact ou à essayer de trouver, a minima, des bornes inférieures de complexité théorique possible1. Mais, dans le cas où on s’autorise des erreurs, peut-on réellement faire mieux ?
Il y a deux grands courants de pensée:
- La technique du sampling comme on peut la retrouver dans un papier en plusieurs parties de Drineas, Kannan & Mahoney en 20062. Cette technique, comme son nom l’indique, consiste à fournir une distribution de données suffisamment similaires à la source originelle et d’où la qualification de Monte-Carlo vu qu’on ne connaît pas à priori la distribution réelle sous-jacente.
La méthode en elle-même consiste à construire deux nouvelles matrices qui synthétisent l'information originelle et ensuite de "bêtement" les multiplier entre-elles. Cet algorithme nécessite (au moins) 2 passes et possède une complexité en
bits de stockage où représente cette représentation intermédiaire ( estimé par et par ).
où
- Et une par Sarlòs aussi en 20063, dérivée d’un concept assez ancien en mathématique par W. B. Johnson et J. Lindenstrauss en 19844 mais remis au goût du jour en 2006 par Ailon et Chazelle5 dans le but de trouver les voisins les plus proches (approximate nearest neighbour). L’algorithme emploie la notion de tug-of-war, hérité de l’estimation de moments6, qui consiste à prendre des bouts de matrices aléatoires puis à les combiner ensemble de manière intelligente en vue tout en ne conservant que des vecteurs assez clairsemé (sparse), on parle de projections aléatoires. Elle peut ne nécessiter qu’une seule passe, mais deux sont vraiment nécessaires et requiert
bits d’espace mémoire et est oblivious.
Chacune de ces techniques a mené à de nouvelles explorations qui continuent encore aujourd’hui7 et très liées aux questions du subspace enconding et de la réduction de dimensionalité.
Ensuite, il y a eu un papier assez influent de Clarkson et Woodruff sur les extensions possibles aux algorithmes d’apprentissage automatiques (comme les SVM, perceptrons)8. En réemployant les approches itératives plutôt que les solutions exactes comme pour les moindres carrés, par exemple.
Les notions peuvent également servir aux problèmes de recommandation où, in fine, on cherche, sur base de quelques appréciations de la part d’un utilisateur, à retrouver toutes les notes qu’il pourrait attribuer. Reconstruire sa "ligne" dans la matrice en ne possédant que quelques éléments. L’une des suppositions est très souvent l’aspect low-rank de la matrice (qu’elle est essentiellement vide), en effet, rares sont les utilisateurs à avoir vu tous les films du catalogue.
- GALL, François Le et URRUTIA, Florent. Improved rectangular matrix multiplication using powers of the Coppersmith-Winograd tensor. In : Proceedings of the Twenty-Ninth Annual ACM-SIAM Symposium on Discrete Algorithms. Society for Industrial and Applied Mathematics, 2018. p. 1029–1046.↩
- DRINEAS, Petros, KANNAN, Ravi, et MAHONEY, Michael W. Fast Monte Carlo algorithms for matrices I: Approximating matrix multiplication. SIAM Journal on Computing, 2006, vol. 36, no 1, p. 132–157.↩
- SARLOS, Tamas. Improved approximation algorithms for large matrices via random projections. In : 2006 47th annual IEEE symposium on foundations of computer science (FOCS’06). IEEE, 2006. p. 143–152.↩
- JOHNSON, William B. Extensions of Lipschitz mappings into a Hilbert space. Contemp. Math., 1984, vol. 26, p. 189–206.↩
- AILON, Nir et CHAZELLE, Bernard. Approximate nearest neighbors and the fast Johnson-Lindenstrauss transform. In : Proceedings of the thirty-eighth annual ACM symposium on Theory of computing. 2006. p. 557–563.↩
- ALON, Noga, MATIAS, Yossi, et SZEGEDY, Mario. The space complexity of approximating the frequency moments. Journal of Computer and system sciences, 1999, vol. 58, no 1, p. 137–147.↩
- CHEPURKO, Nadiia, CLARKSON, Kenneth L., KACHAM, Praneeth, et al. Near-optimal algorithms for linear algebra in the current matrix multiplication time. In : Proceedings of the 2022 Annual ACM-SIAM Symposium on Discrete Algorithms (SODA). Society for Industrial and Applied Mathematics, 2022. p. 3043–3068.↩
- CLARKSON, Kenneth L., HAZAN, Elad, et WOODRUFF, David P. Sublinear optimization for machine learning. Journal of the ACM (JACM), 2012, vol. 59, no 5, p. 1–49.↩
Conclusions
Dans cet article, nous n’avons fait qu’effleurer qu’une infime partie des problèmes qui peuvent apparaître dans le cas des streaming algorithmes. Nous n’avons pas vraiment mis en avant la différence qui peut exister entre les algorithmes déterministes (deterministic), déterministes approximatifs, aléatoires (randomized) ou aléatoires approximatifs avec leurs deux interprétations ("Monte-Carlo" peut se tromper et "Las Vegas" ne se trompe pas, mais dont le temps d’exécution n’est pas défini).
Toutes les notions de complexité et de bornes inférieures (lower bound) ont également été évincées, malgré un modèle de calcul associé la communication complexity. Ou encore les problèmes de réduction de dimensionnalité et les travaux de Andoni sur le local sensitive hashing1. De même que leurs applications directes dans le compressed sensing, l’acquisition de données, leur traitement et compression.
Si ce genre de sujets vous a intéressé et, en particulier, la partie plus statistiques, Philippe Flajolet & Robert Sedgewick sont deux très renommés chercheurs à l’origine du champ que l’on appelle: Analytic Combinatorics2 et à l’origine de bon nombre de démonstrations en complexité. Attention, il s’agit vraiment d’un domaine 'avancé' en informatique et qui nécessite de solides bases en mathématiques.
- ANDONI, Alexandr, INDYK, Piotr, NGUYỄN, Huy L., et al. Beyond locality-sensitive hashing. In : Proceedings of the twenty-fifth annual ACM-SIAM symposium on Discrete algorithms. Society for Industrial and Applied Mathematics, 2014. p. 1018–1028.↩
- FLAJOLET, Philippe et SEDGEWICK, Robert. Analytic combinatorics. cambridge University press, 2009.↩