Let’s first talk about how you would do this entire PIRL setup without using a memory bank. So you have an image I and you have an image It, and you feed-forward both of these images, you get a feature vector f(vI) from the original image II, you get a feature g(vIt​) from the transform versions, the patches, in this case. What you want is the features f and g to be similar. And you want features from any other unrelated image to basically be dissimilar. In this case, what we can do now is if you want a lot of negatives, we would really want a lot of these negative images to be feed-forward at the same time, which really means that you need a very large batch size to be able to do this. Of course, a large batch size is not really good, if not possible, on a limited amount of GPU memory. The way to do that is to use something called a memory bank. So what this memory bank does is that it stores a feature vector for each of the images in your data set, and when you’re doing contrastive learning rather than using feature vectors, say, from a different from a negative image or a different image in your batch, you can just retrieve these features from memory. You can just retrieve features of any other unrelated image from the memory and you can just substitute that to perform contrastive learning. Simply dividing the objective into two parts, there was a contrasting term to bring the feature vector from the transformed image g(vI​), similar to the representation that we have in the memory so mI​. And similarly, we have a second contrastive term that tries to bring the feature f(vI) close to the feature representation that we have in memory. Essentially g is being pulled close to mI​ and f is being pulled close to mImI​. By transitivity, f and g are being pulled close to one another. And the reason for separating this out was that it stabilized training and we were not able to train without doing this. Basically, the training would not really converge. By separating this out into two forms, rather than doing direct contrastive learning between f and g, we were able to stabilize training and actually get it working.
Parlons d’abord de la façon d’appliquer PIRL sans utiliser une banque de mémoire. Nous avons donc une image I et une image It, et les donnons à un ConvNet. Nous obtenons un vecteur de caractéristique f(vI​) de l’image originale i et une caractéristique g(vIt) des versions transformés (les patches Jigsaw dans ce cas). Ce que nous voulons c’est que les caractéristiques f et g soient similaires, et que les caractéristiques de toute autre image sans rapport soient fondamentalement différentes. Ce que nous voudrions maintenant c’est que beaucoup d’images négatives soient données en même temps, ce qui signifie qu’il nous faut une très grande taille de batch pour pouvoir faire cela. Une grande taille de batch n’est pas vraiment bonne pour la mémoire. Le moyen d’y parvenir est d’utiliser ce qu’on appelle une banque de mémoire. Ainsi, cette banque de mémoire stocke un vecteur de caractéristiques pour chacune des images de notre jeu de données, et lorsque nous faisons l’apprentissage contrastif, plutôt que d’utiliser des vecteurs de caractéristiques, nous pouvons simplement récupérer ces caractéristiques en mémoire. En divisant l’objectif en deux parties, il y a un terme contrastif est utilisé pour amener le vecteur de caractéristiques de l’image transformée g(vI​), similaire à la représentation que nous avons en mémoire, donc mI. Et de même, nous avons un second terme contrastif qui tente de rapprocher la caractéristique f(vI) de la représentation de la caractéristique que nous avons en mémoire. Essentiellement, g est rapproché de mI​ et f est rapproché de mImI​. Par transitivité, f et g sont rapprochés l’un de l’autre. La raison de cette séparation est que cela stabilise l’entraînement et que nous ne n’arrivons pas à le réaliser sans cela car il ne convergeait pas vraiment.