
Código y resultados del artículo de QAI 2026 sobre la transferibilidad del ataque FGSM desde la simulación al hardware cuántico de IBM.
Código, parámetros entrenados y resultados del artículo FGSM Attack Transferability from Simulation to Quantum Hardware in Network Intrusion Detection, IEEE International Conference on Quantum Artificial Intelligence (QAI) 2026.
Las cifras del artículo provienen de los archivos JSON en results/. Los
scripts incluidos aquí generaron esos archivos.
src/ experiment scripts, numbered in run order
data/ preprocessed splits (the raw CICIDS2017 CSVs are not included)
models/ trained circuit parameters
results/ one JSON per experiment
figures/ the two figures in the paper
python >= 3.10
pennylane == 0.44.1
qiskit-ibm-runtime
numpy, scipy, scikit-learn, pandas, matplotlib
Instala con pip install -r requirements.txt.
Los scripts 08 y 09 se ejecutan en hardware real, por lo que necesitan una cuenta de IBM Quantum. Copia .env.example y coloca tu propio token e instancia en él. Luego configúralos como variables de entorno. Los scripts leen las credenciales únicamente del entorno.
La captura original no está aquí. Descarga CICIDS2017 del
Canadian Institute for Cybersecurity
y coloca Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv en data/.
Ese es el único archivo que se utiliza.
01_preprocess.py construye las cuatro divisiones .npy. Deberías obtener 1134
muestras de ataque y 866 benignas en entrenamiento. En prueba, 284 de ataque y 216
benignas. Conteos distintos indican un archivo de captura diferente, o una versión
diferente de scikit-learn.
Ejecuta los scripts en orden numérico. Los scripts 04 a 07 requieren que 01, 02 y 03 se hayan ejecutado primero.
| Script | Produce | Tiempo de ejecución |
|---|---|---|
01_preprocess.py | las cuatro divisiones en data/ | segundos |
02_train_narrow_margin.py | models/clean_params.npy | segundos |
03_retrain_poisoning_and_noise.py | modelos envenenados y con ruido, dos archivos de resultados | varias horas |
04_epsilon_sweep.py | results/epsilon_sweep.json | menos de un minuto |
05_compare_attack_guidance.py | results/gradient_vs_untargeted.json | menos de un minuto |
06_finish_rq3.py | línea base sin ruido y el barrido FGSM con ruido | alrededor de una hora |
07_margin_control.py | results/margin_control.json | unos minutos |
08_run_hardware_models.py | results/hardware_clean_vs_poisoned.json | tiempo en cola |
09_run_hardware_fgsm.py | results/hardware_fgsm_adam.json | tiempo en cola |
10_convert_hardware_results.py | results/hardware_fgsm_cobyla.json | segundos |
make_figures.py | las dos figuras | segundos |
El script 03 es el lento. Simula matrices de densidad, lo que cuesta alrededor de dieciséis minutos por inicialización. Entrena tres inicializaciones en cada uno de los tres niveles de ruido.
Los scripts de hardware envían todos sus circuitos en un solo trabajo. Cada circuito
en un trabajo comparte entonces el mismo estado de calibración. Ambos scripts aceptan
--dry-run, que transpila todo e imprime las estadísticas del circuito
sin enviar nada.
| Artículo | Archivo de resultados | Script |
|---|---|---|
| Tabla I, envenenamiento | poisoning_retrained.json | 03 |
| Tabla II, FGSM contra no dirigido | gradient_vs_untargeted.json | 05 |
| Tabla III, simulación contra hardware | hardware_clean_vs_poisoned.json, hardware_fgsm_adam.json | 08, 09 |
| Tabla IV, ruido depolarizante | noise_retrained.json, noise_fgsm_sweep.json, noiseless_400_baseline.json | 03, 06 |
| Figura 1, transferencia a hardware | hardware_fgsm_adam.json, hardware_fgsm_cobyla.json | 09, 10 |
| Figura 2, precisión y margen bajo ruido | igual que la Tabla IV | 03, 06 |
| Sección IV-A, línea base limpia | clean_history.json, noise_retrained.json | 02, 03 |
| Sección IV-C, márgenes de decisión | epsilon_sweep.json | 04 |
| Sección VI, control de margen | margin_control.json | 07 |
| Archivo | Qué es |
|---|---|
clean_params.npy | clasificador de margen estrecho, COBYLA, 86.8% de precisión con margen 0.07 |
noisy_0.0_params.npy | clasificador de margen amplio, Adam, 92.2% de precisión con margen 0.54 |
noisy_0.0_params_400.npy | modelo sin ruido entrenado con el subconjunto de 400 muestras, para comparar entre niveles de ruido |
noisy_0.001_params.npy, noisy_0.01_params.npy, noisy_0.05_params.npy | uno por nivel de ruido depolarizante |
poisoned_5pct_params.npy, poisoned_10pct_params.npy, poisoned_15pct_params.npy | uno por tasa de volteo de etiquetas |
Todas las ejecuciones usaron IBM Fez, un procesador Heron r2 de 156 qubits. 1024 shots por circuito, mediante Qiskit Runtime SamplerV2. La transpilación se realizó con nivel de optimización 1.
Cada ejecución envió el mismo circuito lógico: profundidad 20 con 12 compuertas de dos qubits. La transpilación lo mapea sobre qubits físicos, lo que cambia ambos números en cada envío.
| Resultado | Script | Circuitos | Profundidad transpilada | Puertas de dos qubits |
|---|---|---|---|---|
| Precisión del modelo limpio y envenenado | 08 | 100 | 100 | 27 |
| Transferencia FGSM, modelo de margen amplio | 09 | 150 | 87 | 42 |
| Transferencia FGSM, modelo de margen estrecho | código anterior, reemplazado por 09 | 400 | no registrado | no registrado |
La ejecución de transferencia de margen estrecho es anterior a los scripts de este repositorio.
Su salida es results/transferability_hw_50_expA.json, que el script 10
convierte al formato que leen las figuras. La ejecución utilizó el mismo circuito
y el mismo nivel de optimización que el script 09.
Las dos profundidades registradas difieren. El transpilador elige los qubits físicos mediante heurísticas, por lo que el mismo circuito se mapea de forma diferente en cada envío. Ambas ejecuciones coincidieron aun así con la simulación.
Los resultados de hardware dependen del estado de calibración del dispositivo ese día. Envía los mismos circuitos de nuevo y obtendrás recuentos diferentes. Los archivos JSON son el registro de lo que hizo el dispositivo.
models/clean_params.npy no se puede regenerar. Sus parámetros iniciales
provenían del estado aleatorio global de NumPy en lugar de un generador con semilla.
02_train_narrow_margin.py ahora inicializa con semilla, por lo que las nuevas ejecuciones son
reproducibles entre sí. Sin embargo, aterrizan en otro lugar, y la
dispersión es amplia. Un optimizador sin gradiente sobre un objetivo estocástico puede
colapsar a predecir la clase mayoritaria. El script lo indica cuando eso
ocurre.
El resto tiene semilla. La precisión sigue variando entre inicializaciones, por lo que los scripts informan la media y la desviación estándar en lugar de una sola ejecución. La Sección VI del artículo explica por qué.
@inproceedings{ajmal2026fgsm,
author = {Ajmal, Zeeshan and Halunen, Kimmo and Mau{\ss}ner, Marc
and Reers, Volker and Khan, Arif Ali},
title = {{FGSM} Attack Transferability from Simulation to Quantum
Hardware in Network Intrusion Detection},
booktitle = {IEEE International Conference on Quantum Artificial
Intelligence (QAI)},
year = {2026},
note = {To appear},
}
El código es MIT. Consulte LICENSE.
CICIDS2017 proviene del Canadian Institute for Cybersecurity bajo sus propios términos. No se redistribuye aquí.