raiseValueError("Les critères de tri possibles sont",str(['query_freq2','idf','docs_freq','query_freq2/docs_freq']))
dt.to_csv(csv_path,index=False)
if__name__=="__main__":
iflen(sys.argv)!=5:
print("Usage : generation_idf.py <fichier_docs.csv> <fichier_query.csv> <csv_path.csv> <sort_criteria> \n where sort_criteria = 'query_freq2' or 'idf' or 'docs_freq' or 'alpha' or 'query_freq2/docs_freq'")
"# Exploration de techniques pour produire des perturbations pour les méthodes d'explication par *Activation Patching*\n",
"\n",
"## Background\n",
"### Activation Patching [[Geiger et al., 2021](https://dl.acm.org/doi/10.5555/3540261.3540994)] \n",
"Les méthodes par activation patching cherchent à identifier les composants (neurones, couches, tête d'attention,...) des modèles d'apprentissage profond sensibles à certains changements dans l'entrée ou à certaines caractéristiques. L'objectif peut être de localiser les compétences linguistiques ou la sensibilité à un certain domaine ou vocabulaire dans un modèle de langue. \n",
"\n",
"Pour produire ces explications, la méthode présentée par [[Geiger et al., 2021](https://dl.acm.org/doi/10.5555/3540261.3540994)] procède ainsi: \n",
"Soient $M$ le modèle étudié qui contient des composants (neurone ou tête d'attention) $M_{i,j}$, $\\mathcal{D}$ un dataset et $P$ une fonction qui à une entrée de $e \\in \\mathcal{D}$ lui associe une version perturbée $e'$. On pose $\\mathcal{D}'$ le dataset issu de $\\mathcal{D}$ dont chaque entrée est perturbée selon $P$. \n",
"Itérativement, on effectue pour chaque composant $M_{i,j}$:\n",
"\n",
"- une passe de $\\mathcal{D}$ dans $M$ en notant la valeur en sortie de $M_{i,j}$ ($v_e$) pour chaque entrée $e$. On note sa performance $p$.\n",
"- une passe de $\\mathcal{D}'$ dans $M$. On note sa performance $p_{\\mathcal{D}'}$.\n",
"- une passe de $\\mathcal{D}'$ dans $M$ où la sortie du composant $M_{i,j}$ est fixée à $v_e$ pour l'entrée $e' = P(e)$. On note sa performance $p_{i,j}'$.\n",
"\n",
"Ainsi, on obtient une différence de performance $p - p_{i,j}'$ pour chaque composant $M_{i,j}$ qui peut être interprété comme la sensibilité du composant $M_{i,j}$ à la perturbation $P$.\n",
"\n",
"\n",
"### Activation patching pour l'extraction de document [[Chen et al., 2024](https://dl.acm.org/doi/10.1145/3626772.3657841)]\n",
"[[Chen et al., 2024](https://dl.acm.org/doi/10.1145/3626772.3657841)] propose une adaptation de la méthode d'activation patching pour les modèles d'extraction d'information par plongement des documents et des requêtes à l'aide d'un modèle bi-encodeur. \n",
"On conserve les notations précédentes. $\\mathcal{D}$ est l'ensemble des documents et $\\mathcal{Q}$ est l'ensemble des requêtes.\n",
"\n",
"Itérativement, on effectue pour chaque composant $M_{i,j}$:\n",
"\n",
"- une passe des paires étiquetées $ \\subset \\mathcal{Q} \\times \\mathcal{D}$ dans $M$ en notant la valeur en sortie de $M_{i,j}$ ($v^\\mathcal{D}_e$) pour chaque entrée $e=(q,d)$. On note sa performance $p_{\\mathcal{D}} = moy_{(q,d) \\in \\mathcal{Q} \\times \\mathcal{D}} (M(q)\\bullet M(d))$.\n",
"- une passe des paires étiquetées $ \\subset \\mathcal{Q} \\times \\mathcal{D'}$ dans $M$ en notant la valeur en sortie de $M_{i,j}$ ($v^\\mathcal{D'}_e$) pour chaque entrée $e=(q,d')$. On note sa performance $p_{\\mathcal{D'}} = moy_{(q,d') \\in \\mathcal{Q} \\times \\mathcal{D'}} (M(q)\\bullet M(d'))$.\n",
"- On pose $ \\forall e \\in \\mathcal{Q} \\times \\mathcal{D}, v_e = v^{\\mathcal{S}}_e$ où $\\mathcal{S}$ est tel que $p_{\\mathcal{S}} = max\\{p_{\\mathcal{D}}, p_{\\mathcal{D'}}\\}$ ($p_{\\mathcal{V}} = min\\{p_{\\mathcal{D}}, p_{\\mathcal{D'}}\\}$) \n",
"- une passe de $\\mathcal{V}$ dans $M$ où la sortie du composant $M_{i,j}$ est fixée à $v^{\\mathcal{S}}_e$ pour l'entrée $e' = P(e)$. On note sa performance $p_{i,j}'$.\n",
"comme la sensibilité composant $M_{i,j}$ à la perturbation $P$. Les sensibilités de chaque composant peut être récapitulé dans un tableau. \n",
"\n",
"\n",
"Remarques:\n",
"- La méthode proposée prend en compte les perturbations pouvant augmenter ou diminuer la performance.\n",
"- La métrique couramment utilisée pour la performance est la proximité entre les représentations d'une requête et d'un document (ie. le produit scalaire).\n",
"\n",
"\n",
"### MerchIR\n",
"[[Parry et al., 2025](https://arxiv.org/abs/2501.10165)] propose une implémentation de la méthode de [[Chen et al., 2024](https://dl.acm.org/doi/10.1145/3626772.3657841)] : [Github](https://github.com/Parry-Parry/MechIR.git). \n",
"En fournissant un modèle, une base de données et une fonction de perturbation, la librairie MechIR permet de construire le tableau des perturbations que chaque composant de l'architecture fournie.\n",
"\n",
"On développe dans la suite des méthodes et approches pour exploiter au mieux cette librairie."
]
},
{
"cell_type": "markdown",
"id": "a69dbec3",
"metadata": {},
"source": [
"#### Préparation des uotils de travail de MechIR"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "304d73db",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/marine/Documents/Cours/M2GPEx/ProjetIndividuel/Travaux/stagexairag/venv-mechir/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n",
"2026-04-08 13:11:34.469 WARNING streamlit.runtime.scriptrunner_utils.script_run_context: Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.\n"
"WARNING:root:Support for BERT in TransformerLens is currently experimental, until such a time when it has feature parity with HookedTransformer and has been tested on real research tasks. Until then, backward compatibility is not guaranteed. Please see the docs for information on the limitations of the current implementation.\n",
"If using BERT for interpretability research, keep in mind that BERT has some significant architectural differences to GPT. For example, LayerNorms are applied *after* the attention and MLP components, meaning that the last LayerNorm in a block cannot be folded.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Moving model to device: cpu\n",
"Loaded pretrained model sebastian-hofstaetter/distilbert-dot-tas_b-b256-msmarco into HookedEncoder\n"
]
}
],
"source": [
"# Récupération du modèle à évaluer (cas des modèles bi-encodeur)\n",
"print(\"Number of query,doc pairs in dataset:\", len(dataset))\n",
"print(\"Query:\", dataset._get_query(\"1\"))"
]
},
{
"cell_type": "markdown",
"id": "d2019107",
"metadata": {},
"source": [
"## Construction d'une perturbation\n",
"\n",
"Pour observer les sensibilités d'un modèle à des perturbation, il est important de construire des perturbations de document pertinentes et qui engendrent un changement conséquent du comportement du modèle. On peut retrouver plusieurs approches.\n",
"\n",
"### Perturbation par ajout, remplacement ou suppression d'un mot\n",
"Les perturbations les plus simples sont:\n",
"- l'ajout d'un mot en début de document (prepend)\n",
"- l'ajout d'un mot en fin de document (append)\n",
"- le remplacement d'un mot par un autre (replace)\n",
"- la suppression d'un mot (cas particulier de replace avec le mot vide)\n",
"\n",
"Le choix important dans ces perturbations est celui du mot ajouté ou du mot replacé et de son remplaçant. On peut exploiter différentes statistiques issues des données pour choisir un mot à ajouter ou remplacer:\n",
"- la fréquence des mots dans les requêtes\n",
"- la fréquence des mots dans les documents\n",
"- le nombre de requête/ documents contenant chaque mot\n",
"- l'IDF des mots dans les documents/ requêtes\n",
"- le rapport fréquence dans les requêtes/nombre de documents contenant le mot\n",
"\n",
"Dans un second temps, pour le cas du remplacement d'un mot, le choix du mot remplaçant peut se baser sur la connaissance des données et du vocabulaire. On peut exploiter:\n",
"- les synonymes (remplacer atome par particule)\n",
"- les différents sens des mots (remplacer onde par vague ou fréquence)\n",
"- le vocabulaire connexe (remplacer atome par molécule)"
]
},
{
"cell_type": "markdown",
"id": "25a6e43a",
"metadata": {},
"source": [
"#### Définition et évaluation d'un perturbation simple"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ae4ef107",
"metadata": {},
"outputs": [],
"source": [
"# Définition de la fonction de perturbation des données\n",
"Query: [CLS] measurement of dielectric constant of liquids by the use of microwave techniques [SEP]\n",
"Baseline Document: [CLS] broadband millimetre wave paramagnetic resonance spectrometer the specimen and waveguide which can be cooled by means of a cryostat are placed between close pole pieces giving high uniform magnetic fields design details and some measurements on zero field splittings are given [SEP]\n",
"Perturbed Document: [CLS] broadband millimetre wave paramagnetic resonance spectrometer the specimen and waveguide which can be cooled by means of a cryostat are placed between close pole pieces giving high uniform magnetic fields design details and some measurements on zero field splittings are given [SEP]\n",
"On cherche à obtenir des profils de densité différents pour les données de base et les données perturbées. C'est cette variation qu'on va essayer d'attribuer aux composants du modèle."