
بحث كودي يطبق T-Backdoor، هجمات الباب الخلفي ذات المحفز الزمني على الشبكات العصبية النبضية باستخدام محفزات المعدل والكمون والاهتزاز دون اضطراب مكاني.
تُعد هجمات الباب الخلفي تهديدًا أمنيًا خطيرًا للشبكات العصبية العميقة (DNNs)، ولا تزال غير مستكشفة إلى حد كبير في الشبكات العصبية الشوكية (SNNs). تُدخل الهجمات الحالية في المقام الأول محفزات زمكانية تُحدث انحرافات في توزيع الشوكات للعينات المسمومة مقارنة بنظيراتها النظيفة. ولمعالجة هذا القيد، يقترح هذا العمل هجوم باب خلفي جديد على الشبكات العصبية الشوكية، يُسمى \textbf{T-Backdoor}، والذي يعمل باستخدام محفزات زمنية بحتة مثل \textit{Rate} و\textit{Latency} و\textit{Jitter} دون إدخال أي اضطراب مكاني، مما يجعل التحول في توزيعات الشوكات أكثر صعوبة في الاكتشاف بشكل ملحوظ. من خلال تجارب موسعة على ثلاث مجموعات بيانات عصبية محاكية مرجعية: N-MNIST وCIFAR10-DVS وN-Caltech101، وتقييمها مقابل سبع طرق دفاع مرجعية ضد الباب الخلفي، نُظهر أن T-Backdoor يحقق معدل نجاح هجوم (ASR) شبه مثالي يبلغ 100% في كل من إعدادات الهدف الواحد والأهداف المتعددة مع تدهور طفيف فقط في الدقة النظيفة، مع بقائه صامدًا أمام تقنيات الكشف عن الباب الخلفي والتخفيف منه الحالية.
├── models.py # Architectures for all datasets (shared)
├── datasets.py # Neuromorphic dataset loading (shared)
│
├── main_single.py # 1. Single-target entry point
├── single_poisoned_dataset.py # Trigger implementations + loaders
├── single_utils.py # Train/eval loop, saving, plots
├── single_target.sh # Paper runs
│
├── main_multi_target.py # 2. Multi-target entry point
├── multi_target_poisoned_dataset.py # Per-target parameter assignment
├── multi_target_utils.py # Per-target ASR tracking, saving
├── multi_target.sh # Paper runs
│
├── main_mtmt.py # 3. Multi-trigger multi-target entry point
├── mtmt_poisoned_dataset.py # Per-target trigger-type config
├── mtmt_utils.py # Per-target ASR tracking, saving
└── mtmt.sh # Paper runs
python -m venv venv
source venv/bin/activate
pip install torch torchvision # CUDA build matching your driver
pip install spikingjelly
pip install numpy scipy matplotlib seaborn tqdm
البيئة المرجعية المستخدمة للنتائج المُبلَّغ عنها:
قم بتنزيل مجموعات البيانات العصبية المحاكية الخام وضع كل واحدة في دليل فرعي خاص بها ضمن
data/، مسمى تمامًا كما هي قيمة --dataset:
data/
├── mnist/ # N-MNIST
├── cifar10/ # CIFAR10-DVS
├── caltech/ # N-Caltech101
└── gesture/ # DVS128-Gesture
data/ دليلاً حرفيًا في دليل العمل الخاص بكmain_single.py)محفز واحد، فئة هدف واحدة.
python main_single.py --dataset cifar10 --type latency --delay_frames 1 \
--T 10 --epochs 100 --epsilon 0.1 --data_dir 'data/'
الوسائط الأساسية
الوسائط الخاصة بالمحفز
ضبط --epsilon 0.0 يدرب نموذجًا أساسيًا نظيفًا.
main_multi_target.py)نوع محفز واحد، N من فئات الأهداف مفصولة بـقيمة معامل المحفز.
# Latency: delay 1 -> class 0, delay 3 -> class 1, delay 5 -> class 2
python main_multi_target.py --dataset mnist --type latency --n_targets 3 \
--trigger_labels 0 1 2 --delay_params 1 3 5 \
--epsilon 0.2 --T 10 --epochs 10 --data_dir 'data/'
المعاملات لكل هدف. قدمها بشكل صريح، أو دعها تُعيَّن تلقائيًا بواسطة
np.linspace عبر نطاق. يجب أن يكون طول القوائم الصريحة --n_targets وأن تتجاوز
وسائط النطاق.
المعاملات الصحيحة المعينة تلقائيًا (latency, jitter_fixed) تُزال تكراراتها عن طريق
زيادة التعارضات، بحيث لا يتشارك هدفان نفس القيمة.
بالنسبة لـ static، تُفصل الأهداف بـأي الإطارات تحمل الرقعة — المحور الزمني
يميزها بدلاً من مظهر الرقعة.
يُطبع ASR لكل هدف في كل دورة، إلى جانب الدقة النظيفة.
main_mtmt.py)نوع محفز مختلف لكل هدف.
python main_mtmt.py --dataset mnist --T 10 --n_targets 5 \
--target_types latency latency rate rate jitter_fixed \
--trigger_labels 0 1 2 3 4 \
--latency_delays 1 2 --rate_scales 0.5 2.0 --jitter_fixed_shifts 3 \
--epsilon 0.3 --epochs 100 --data_dir 'data/'
قوائم المعاملات لكل نوع. كل قائمة تحتوي على مدخل واحد لكل هدف من ذلك النوع — مع
--target_types latency latency rate rate jitter_fixed تمرر تأخيرين ومعدلين
وإزاحة واحدة:
حذف قائمة يعيّن تلقائيًا من نطاق *_min / *_max المطابق.
الإعدادات المسبقة المدمجة (تُستخدم عندما لا يُعطى --target_types):
--n_targets 3 — static (الإطارات 0..T/3)، latency (--delay)، rate (--scale_factor)--n_targets 5 — اثنان static (مجموعات إطارات ومواضع مختلفة)، اثنان latency
(--delay, --delay_2)، واحد rateأي قيمة أخرى لـ --n_targets تتطلب --target_types.
كل تشغيل يكتب صفًا في ملف CSV مشترك بالإضافة إلى دليل تجربة مكتفٍ ذاتيًا.
تُرمَّز معاملات المحفز في اسم الدليل (df1 = تأخير 1، sf0.1 = معدل
0.1، ns3 = 3 تبديلات)، بحيث لا تستبدل التشغيلات التي تختلف فقط في معامل محفز
بعضها البعض.
أجزاء من قاعدة الأكواد هذه مقتبسة من مستودع Sneaky Spikes بواسطة Gorka Abad وآخرين، المصاحب للورقة البحثية "Sneaky Spikes: Uncovering Stealthy Backdoor Attacks in Spiking Neural Networks with Neuromorphic Data" (NDSS 2024). نشكر المؤلفين على إتاحة أكوادهم للعموم.
إذا وجدت هذا العمل مفيدًا في بحثك، فيرجى التفكير في الاقتباس:
@article{miah2026tbackdoor,
title = {T-Backdoor: Exploiting Temporal Redundancy in Neuromorphic Data for Spike-preserving Backdoor Attacks on SNNs},
author = {Miah, Abdullah Arafat and Vu, Kevin and Bi, Yu},
journal = {arXiv},
year = {2026}
}
للأسئلة أو المشكلات المتعلقة بالكود، يرجى فتح مشكلة على GitHub أو التواصل مع:
| الحزمة | الإصدار |
|---|
| Python | 3.11.10 |
| torch | 2.11.0+cu128 |
| torchvision | 0.26.0+cu128 |
| numpy | 2.2.6 |
| scipy | 1.16.0 |
| matplotlib | 3.8.4 |
| seaborn | 0.13.2 |
| spikingjelly | latest from source |
| الوسيطة | الافتراضي | الوصف |
|---|
--dataset | gesture | mnist, cifar10, caltech, gesture |
--type | static | static, moving, smart, latency, rate, jitter, jitter_fixed |
--epsilon | 0.1 | نسبة مجموعة التدريب المراد تسميمها |
--trigger_label | 0 | فئة الهدف |
--T | 10 | خطوات زمن المحاكاة |
--epochs | 10 | دورات التدريب |
--batch_size | 16 | حجم الدفعة |
--lr | 0.001 | معدل التعلم |
--loss | mse | mse أو cross |
--optim | adam | adam أو sgd |
--amp | off | تمكين الدقة المختلطة التلقائية |
--seed | 42 | البذرة العشوائية |
--data_dir | data/ | جذر مجموعة البيانات |
--save_path | experiments_single | جذر المخرجات |
--model_path | None | البدء من نقطة تحقق مدربة مسبقًا |
| الوسيطة | الافتراضي | تنطبق على |
|---|
--delay_frames | 2 | latency — إطارات التأخير |
--scale_factor | 0.5 | rate — <1 أبطأ، >1 أسرع |
--n_shift | 3 | jitter_fixed — عدد أزواج الإطارات المتبادلة |
--trigger_size | 0.1 | static/moving/smart — حجم الرقعة كنسبة من العرض |
--pos | top-left | static — top-left, top-right, bottom-left, bottom-right, middle, random |
--polarity | 3 | static/moving/smart — 0=أسود، 1=أزرق داكن، 2=أخضر، 3=أزرق فاتح |
--n_masks | 2 | smart — عدد المناطق المرشحة |
--least | off | smart — استهداف المنطقة الأقل نشاطًا بدلاً من الأكثر |
--most_polarity | off | smart — استخدام القطبية الأكثر نشاطًا في المنطقة |
| الوسيطة | الافتراضي | الوصف |
|---|
--type | rate | static, latency, rate, jitter, jitter_fixed |
--n_targets | 3 | عدد فئات الأهداف |
--trigger_labels | [0..n-1] | تسميات الأهداف الصريحة؛ يجب أن يساوي الطول --n_targets |
--epsilon | 0.1 | الميزانية الإجمالية، مقسمة بالتساوي على الأهداف |
| المحفز | صريح | نطاق تلقائي | الافتراضي التلقائي |
|---|
latency | --delay_params 1 3 5 | --delay_min, --delay_max | 1 … T//2 |
rate | --rate_params 0.3 0.6 0.9 | --rate_min, --rate_max | 0.1 … 6.0 |
jitter | --jitter_params 0.05 0.15 0.25 | --jitter_std_min, --jitter_std_max | 0.05 … 0.3 |
jitter_fixed | --nshift_params 1 3 5 | --n_shift_min, --n_shift_max | 1 … max(n_shift_min+1, T//4) |
static | — | — | T مقسمة إلى n_targets من مجموعات الإطارات |
| الوسيطة | الافتراضي | الوصف |
|---|
--n_targets | 3 | عدد الأهداف؛ 3 و5 لهما إعدادات مسبقة مدمجة |
--target_types | None | نوع المحفز لكل هدف — static, latency, rate, jitter, jitter_fixed. يجب أن يساوي الطول --n_targets. يتجاوز الإعدادات المسبقة |
--trigger_labels | [0..n-1] | تسميات الأهداف |
--epsilon | 0.2 | الميزانية الإجمالية، مقسمة بالتساوي على الأهداف |
| الوسيطة | تنطبق على |
|---|
--latency_delays 1 2 | كل هدف latency |
--rate_scales 0.5 2.0 | كل هدف rate |
--jitter_fixed_shifts 3 | كل هدف jitter_fixed |
--jitter_stds 0.1 0.3 | كل هدف jitter |
--static_positions top-left bottom-right | كل هدف static |
--static_polarities 3 1 | كل هدف static |
| الإعداد | ملف CSV الملخص | دليل التجربة |
|---|
| فردي | <save_path>/results.csv | <dataset>_<type>_<eps>_<size>_<param>_<seed>/ |
| أهداف متعددة | <save_path>/multi_target_results.csv | multi_<type>_<dataset>_<n>targets_<labels>_eps<eps>_<params>_seed<seed>/ |
| MTMT | <save_path>/mtmt_results.csv | mtmt_<dataset>_<n>t_<params>_eps<eps>_seed<seed>/ |