# Apprentissage semi-supervisé
## Objectif
Dans le monde du machine learning, l'annotation de data est souvent coûteuse en temps, en argent, et aussi prompte à l'erreur humaine.
Le projet "gaming" ne déroge pas à la règle. En revanche, dans ce projet, la collecte de data non-annotée est très facile : nous disposons d'un pool de publicités important, et du web scrapping est envisageable pour collecter encore plus de vidéos.
La question est : est-il possible d'exploiter ces vidéos non-annotés, ou d'autres types de connaissance accessible, afin de rendre le modèle plus robuste ?
## Champs de recherche
Il existe plusieurs champs de recherche pouvant répondre à cette question.
### L'apprentissage semi-supervisé
C'est le champ de recherche correspondant à l'idée initiale : à mi-chemin entre l'apprentissage supervisé et l'apprentissage non-supervisé, l'apprentissage semi-supervisé vise à exploiter des data non labellisées appartenant au même domaine que la data annotée.
Ce champ de recherche est utilisé quand il existe une quantité de data labelisée trop faible pour entraîner un modèle correctement de manière supervisée, et quand il existe une quantité significative de data non annotée (typiquement un plusieurs ordres de grandeurs de plus que de data annotée).
### Le few-shot learning
Le few-shot learning [1] est un champ de recherche regroupant les techniques permettant d'apprendre à partir de quelques échantillons par classe uniquement (dans son cas le plus drastique, le one-shot learning, uniquement un échantillon par classe est utilisé).
Le few-shot learning "englobe" notamment l'apprentissage semi-supervisé, mais regroupe aussi d'autres techniques : on peut exploiter d'autres connaissances que de la data non-labelisée (exemple : utilisation de datasets d'un domaine similaire, utilisation d'autres tâches sur le même domaine). Ces connaissances peuvent ensuite être exploités via la data (exemple : data augmentation), via le model (ex : multi-task learning, qui permet de "limiter" l'espace de recherche), ou sur l'algorithme d'apprentissage.
Je n'ai pas poursuivi les recherches dans ce domaine car c'est une porte qui ouvre sur une infinité d'autres : de très nombreuses stratégies peuvent être employées (ex : semi-supervisé, meta-learning) dans des conditions très diverses, et le problème à régler n'est finalement pas spécifiquement le notre : nous avons la possibilité d'annoter un nombre relativement conséquent de data, ce qui nous éloigne du paradigme "few-shot".
### L'active learning
Un peu par hasard [1], je suis tombé sur ce champ de recherche qui consiste à créer une "intéraction" entre le modèle et l'utilisateur, pendant la phase d'entrainement.
Le modèle va en effet sélectionner, dans les data non labellisées, lesquelles devraient être annotées pour augmenter ses perfs (j'imagine bien les captcha Google (piétons, feux rouges etc.) sélectionnés par active learning, pour nourrir leurs modèles de manière optimale).
Vu que ce n'était pas le sujet je n'ai pas creusé, mais ça pourrait valoir le coup de s'y pencher un jour si on décide de faire l'annotation manuelle en plusieurs rounds.
### Le meta-learning
Le meta-learning [2] implique d'entrainer un modèle sur plusieurs tâches (dans l'ordre de plusieurs milliers). L'idée est que les représentations latentes de la data seront plus proches de leur représentations optimales si elles permettent de résoudre plusieurs tâches similaires, plutôt que d'apprendre from scratch, permettant une meilleure généralisation avec peu de data (moins d'overfitting).
En d'autres termes, le modèle aura acquis des connaissances génériques sur la data, connaissances qui pourront être transférés sur une autre tâche.
Néanmoins, qui dit plusieurs tâches dit plusieurs annotations, ce qui, dans notre cas, de résoud pas le problème (encore que, avec un peu d'imagination...).
### Le self-supervised learning
Le self-supervised learning [3] consiste à ajouter une phase d'apprentissage non-supervisé, par exemple pour pré-entrainé le modèle.
La logique semble être de masquer une partie de l'information dans la data d'apprentissage, et d'essayer de prédire cette information manquante à partir de l'information restante.
La logique est la même que pour le meta-learning (il me semble que le meta-learning est un concept qui englobe le self-supervised learning) : on cherche d'abord à faire "comprendre" la data à notre modèle (sauf que, dans ce cas, nous n'avons pas besoin d'annotations supplémentaires) avant de capitaliser sur ces connaissances pour mieux apprendre à effectuer la tâche voulue.
Ce domaine a l'air prometteur mais, selon [3], c'est encore jeune et il subsiste quelques problèmes.
Cette piste pourrait être à creuser mais nécessiterait un peu plus de temps de recherche, et surement un temps de prototypage conséquent.
## Le semi-supervisé, en profondeur
Bien que plusieurs autres pistes auraient sans doutes été valables, j'ai décidé de me pencher exclusivement sur l'apprentissage semi-supervisé.
Un papier review récent [4] résume très bien ce champ de recherche, ses différentes avancées, et les différentes familles de techniques d'apprentissage semi-supervisé.
### Les assomptions

*Figure 1 : Illustrations of the semi-supervised learning assumptions. In each picture, a reasonable supervised decision boundary is depicted, as well as the optimal decision boundary, which could be closely approximated by a semi-supervised learning algorithm relying on the respective assumption (source: [4]).*
Toutes les techniques d'apprentissage semi-supervisé reposent sur une des trois assomptions suivantes :
- Smoothness assumption : si deux échantillons sont proches dans l'espace d'entrée, alors leur label doit être identique.
- Low-density assumption : la frontière de décision du modèle doit passer par une zone où la densité d'échantillon est faible, dans l'espace d'entrée
- Manifold assumption : la data peut être projetée dans un espace de plus faible dimension où les échantillons de chaque classe sont réparti sur des structures distinctes (manifolds).
Le fait d'exploiter la data non-labellisés permet de mieux placer la frontière de décision du modèle, car on a davantage d'information sur la distribution des échantillons.
Sur la Figure 1 (a), nous pouvons voir qu'avec seulement deux points bleus et trois points oranges annotés, il existe énormément de droites permettant de séparer les deux populations.
Un algorithme supervisé choisirait certainement un droite proche du trait plein (maximisation de la marge). Pourtant, si l'on ajoute dans l'espace d'entrée d'autres échantillons non annotés (points bleus et orange à faible opacité), on peut comprendre que la meilleur séparation des deux distributions se fait sur la ligne en pointillés.
Un algorithme de semi-supervisé reposant sur la smoothness assumption ou sur la low-density assumption permettrait normalement de se rapprocher de cette solution optimale.
La Figure 1 (b) présente un cas de figure similaire avec la manifold assumption. Dans l'espace d'entrée, en ajoutant des data non-labellisées, nous pouvons observer que les points de chaque classe décrivent un cercle. La meilleure frontière de décision se situerait donc entre les deux cercles. Avec uniquement l'information supervisée, cette frontière ne serait pas correctement placée.
### Les différentes techniques de semi-supervisé

*Figure 2 : Visualization of the semi-supervised classification taxonomy. Each leaf in the taxonomy corresponds to a specific type of approach to incorporating unlabelled data into classification methods. In the leaf corre- sponding to transductive, graph-based methods, the dashed boxes represent distinct phases of the graph-based classification process, each of which has a multitude of variations (source : [4]).*
Engelen et. al. [4] propose d'organiser les techniques d'apprentissage semi-supervisé selon la taxonomie présentée en Figure 2.
Tout d'abord, ils séparent les méthodes en méthodes inductives et transductives.
#### Inductive/transductive
Les méthodes inductives sont les plus intuitives : les data non-labellisées sont utilisé durant le process d'entrainement afin de construire un modèle (plus robuste, normalement, que sans l'utilisation de ces data). Le modèle peut ensuite être utilisé pour effectuer de la prédiction sur d'autre, comme un modèle classique.
Les méthodes transductives ont une logique un peu différente de celle dont nous somme habitués avec l'apprentissage supervisé. Elles n'ont pas de phases de training et de testing disctinctes. L'objectif est d'obtenir des labels sur la data non-labellisée durant la phase de training. Cela implique que pour obtenir des prédictions sur de la nouvelle data non-labellisée, il faut réentrainer le modèle. Pour cette raison, je n'ai pas poussé les recherches dans cette direction.
#### Unsupervised processing/wrapper methods/intrasically semi-supervised
Ces trois familles de méthodes inductive se basent sur des paradigmes bien distincts :
- L'unsupervised processing consiste à utiliser le dataset non-labellisé et le dataset labellisé en deux étapes. On peut, par exemple, venir pré-entrainer le modèle de manière non-supervisé puis le fine tuner. De manière générale, cette branche a l'air assez obsolète désormais. Les publications sont assez vieilles, et le pré-entrainement non-supervisé ne me semble pas plus pertinent que du transfer learning classique (le pré-entrainement étant donc effectué de manière supervisé sur un domaine analogue).
- Les wrapper methods consistent à obtenir des pseudo labels sur la data non annotée après un premier entrainement sur la data labellisée uniquement. Durant l'heuristique d'entrainement, la data pseudo labellisée sera ajoutée au fur et à mesure au pool de data labellisé.
- Les méthodes intrasically semi-supervised altèrent l'algorithme d'entrainement directement. Par exemple, on peut ajouter une fonction de coût annexe venant régulariser l'entrainement avec la data non-labellisée.
### Quelques papiers intéressants
Il existe un corpus de papiers très important décrivant de nombreuses méthodes appartenant à une des catégorie listée ci-dessus.
Malheureusement, comme souvent, il n'existe pas d'expérimentations qui benchmark toutes ces approches simultanément. Les points de comparaisons et les conditions d'expérimentations varient d'un papier à l'autre.
Ne pouvant pas tout lire, j'ai voulu sélectionné des papiers récents, mais dont l'algorithme reste rapidement compréhensible et dont l'implémentation me semble relativement aisée. De plus, nous savons que nous voulons une méthode fonctionnant avec un CNN, ce qui limite le choix.
J'ai lu en profondeur trois papiers méthodologiques : un papier par catégorie "wrapper methods" et "intrasically semi-supervised", ainsi qu'une approche mêlant les deux concepts et affichant de belles performances.
Libre à nous, dans un second temps, de sélectionner une piste et de la pousser jusqu'au bout.
#### Self-training (wrapper method)
Le self-training [5] est l'idée la plus simple, et la plus ancienne dans la catégorie des wrapper method. D'autres approches (comme par exemple le co-training) sont possibles, mais sont plus contraignantes et n'ont pas l'air d'avoir des performances drastiquement supérieures (cf. [6]).
Cela consiste tout simplement à annoter chaque échantillon non-labellisé par la prédiction du modèle (création de pseudo-labels). Ces pseudos labels sont actualisés à chaque itération.
Etant donné que le nombre de data non-labellisées est typiquement bien plus élevé que le nombre de data non-laballisé, la fonction de coût est séparé en deux (une cross entropy pour chaque), et la fonction de coût associé à la prédiction des échantillons avec pseudo label est pondéré par un hyperparamètre.
Pratiquement toutes les approches plus récentes semblent faire mieux que le self-training, qui est quasiment systématiquement utilisé comme baseline.
Néanmoins, le gain de performances semble notable si la quantité de data annoté est faible (cf. Table 1), et la méthode est extrêmement triviale à implémenter.

*Table 1 : Classification error on the MNIST test set with 600, 1000 and 3000 labeled training samples. We compare our method with results from (Weston et al., 2008; Rifai et al., 2011b). dropNN is our network model trained with- out unlabeled data, +PL with unlabeled data and Pseudo- Label, +PL+DAE using unsupervised pre-training with DAE in addition (source : [5]).*
#### Ladder networks (intrasically semi-supervised)

*Figure 3 : A conceptual illustration of the Ladder network when L = 2. The feedforward path (x → z(1) → z(2) → y) shares the mappings f(l) with the corrupted feedforward path, or encoder (x → ˜z(1) → ˜z(2) → ˜y). The decoder (˜z(l) → ˆz(l) → ˆx) consists of the denoising functions g(l) and has cost functions Cd(l) on each layer trying to minimize the difference between ˆz(l) and z(l). The output ˜y of the encoder can also be trained to match available labels t(n) (source : [7]).*
L'objectif du ladder network [7] (schéma en Figure 3) est de contraindre les représentations latente du modèle en les rendant insensible à de faibles perturbations.
Le modèle de base est considéré comme un encodeur. A chaque couche, du bruit est ajouté, et un décodeur va tenter de débruiter la représentation latente. Cette représentation latente est ensuite comparée à la représentation latente sans ajout de bruit, et une fonction de coût va tenter de minimiser l'erreur.
C'est cette fonction de coût qui rend l'approche non-supervisée, puisqu'elle peut être calculée également sur les échantillons sans label.
Le papier propose aussi une alternative plus simple d'implémentation et plus rapide, appelé Γ-model, où uniquement la représentation latente la plus profonde est reliée à un décodeur.

*Table 2 : A collection of previously reported MNIST test errors in the permutation invariant setting followed by the results with the Ladder network. * = SVM. Standard deviation in parentheses (source : [7]).*
Le gain de performances est intéressant (cf. Table 2). On observe un écart assez conséquent entre cette approche et la méthode de pseudo-labellisation. Cependant, les écarts se resserent au fur et à mesure qu'on ajoute de la data labellisée.
D'un point de vue personnel, j'ai du mal à estimer la difficulté d'implémentation de la méthode. Je saisi la logique globale et d'un point de vue code, ça semble faisable, mais je n'ai pas réussi à cerner la théorie en profondeur (le Γ-model me semble "illogique" pour le moment).
#### Temporal ensembling (wrapper method et intrasically semi-supervised)
Cette méthode [8], vue par les auteurs comme une optimisation et simplification des Ladder networks, consiste à ajouter une fonction de coût sur la dernière couche latente du modèle (juste avant la couche de sortie).
Cette fonction de coût va chercher à minimiser les différences sur l'output de cette couche latente entre l'itération actuelle (z) et celles des itérations précédentes (˜z).
Cette méchanique, couplée avec du dropout et de la data augmentation différente à chaque itération, va venir contraindre cette dernière couche à être robuste à de faibles perturbations sur l'input et sur le modèle.
A chaque itération, la sortie de la dernière couche latente (z) va être aggrégé à celle des activations précédentes (˜z), d'où la notion de temporal (les dernières itérations ayant un poids plus fort que les plus anciennes). Il existe aussi un paramètre qui va augmenter le poids de cette loss additionnelle au fur et à mesure des itérations (il faut d'abord que z soit prédictif pour la tâche de classification afin que contraindre z par rapport à ˜z soit pertinent).
Couplé cette loss à la cross-entropy classique permet donc, là aussi, d'utiliser les data non-labellisés.
Le papier review [4] note un rapprochement entre cette méthode et les wrapper methods dans le sens où il est implicitement supposé que z soit fiable même pour les data non-annotées (et que donc la prédiction du modèle soit correct). Les auteurs disent aussi que la méthode est robuste en cas de mauvaise prédiction sur les data non-labellisé.

*Table 3 : CIFAR-10 results with 4000 labels, averages of 10 runs (4 runs for all labels) (source : [8]).*
La Table 3 nous montre les résultats sur le dataset CIFAR-10.
Nous pouvons noter deux choses :
- Les performances sont meilleurs que le Γ-model.
- Les performances sont meilleurs qu'un apprentissage supervisé classique, **même si toutes les data sont annotées**. L'ajout de la fonction de coût semble donc être un bénéfice même en cas d'apprentissage supervisé, et pas seulement pour le semi-supervisé.
L'implémentation de la méthode m'a l'air un peu plus simple que les Ladder networks, et la théorie me semble plus claire.
## Conclusion
### Comparatif des trois approches
| Approche | Gain performances | Complexité d'implémentation |
| ------------------- | ----------------- | ----------------------------|
| Self-training | + | + |
| Ladder networks | +++ | ++++ |
| Temporal ensembling | +++++ | +++ |
*Table 4 : Comparatif des trois approches d'apprentissage semi-supervisé.*
La Table 4 quantifie (très subjectivement) les caractéristiques des trois approches en terme de gain de performances et de complexité d'implémentation.
Dans l'ensemble, le temporal ensembling et le self-training semblent se détacher. Le self-training est très rapide d'implémentation mais ne permettra probablement qu'un gain de performances minimale (et non assuré), alors que le temporal ensembling demandera davantage de travail, mais peut vraiment valoir le coût en terme de performances. Le fait que le temporal matching augmente également les performances en cas d'apprentissage supervisé est également très intéressant pour nos autres chantiers.
### Est-ce que ça vaut bien le coup ?
Premièrement, la review [4] explique en introduction qu'il est impossible de s'assurer théoriquement que les mécaniques de semi-supervisé aient un impact positif sur les performances, et qu'il est très difficile de s'assurer au préalable si tel sera le cas sur une tâche donnée.
Deuxièmement, dans le usecase "gaming", il est assez aisé de collecter des data purement synthétiques ou purement réelles en faisant du scrapping, afin de disposer d'une base de donnée conséquente (bien que le domaine ne sera pas strictement identique, on serait donc peut être dans un cas de transfer learning, voir de meta-learning).
Ceci étant dit, les deux méthodes, et plus particulièrement le temporal ensembling, peuvent représenter un investissement de temps avec un bon retour à long terme, puisqu'en cas de succès, nous pourrons reproduire la méthode sur d'autres cas d'utilisation (ex : visual cta), voir systématiquement sur tous nos modèles de type CNN.
## Références
[1] Wang, Y., Yao, Q., Kwok, J. T., & Ni, L. M. (2020). Generalizing from a few examples: A survey on few-shot learning. ACM Computing Surveys (CSUR), 53(3), 1-34.
[2] Sun, Q., Liu, Y., Chua, T. S., & Schiele, B. (2019). Meta-transfer learning for few-shot learning. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 403-412).
[3] Liu, X., Zhang, F., Hou, Z., Mian, L., Wang, Z., Zhang, J., & Tang, J. (2021). Self-supervised learning: Generative or contrastive. IEEE Transactions on Knowledge and Data Engineering.
[4] Van Engelen, J. E., & Hoos, H. H. (2020). A survey on semi-supervised learning. Machine Learning, 109(2), 373-440.
[5] Lee, D. H. (2013, June). Pseudo-label: The simple and efficient semi-supervised learning method for deep neural networks. In Workshop on challenges in representation learning, ICML (Vol. 3, No. 2, p. 896).
[6] Triguero, I., García, S., & Herrera, F. (2015). Self-labeled techniques for semi-supervised learning: taxonomy, software and empirical study. Knowledge and Information systems, 42(2), 245-284.
[7] Rasmus, A., Valpola, H., Honkala, M., Berglund, M., & Raiko, T. (2015). Semi-supervised learning with ladder networks. arXiv preprint arXiv:1507.02672.
[8] Laine, S., & Aila, T. (2016). Temporal ensembling for semi-supervised learning. arXiv preprint arXiv:1610.02242.