
بحث كودي يطبق 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
البيئة المرجعية المستخدمة للنتائج المُبلَّغ عنها:
| الحزمة | الإصدار |
|---|---|
| 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 |
قم بتنزيل مجموعات البيانات العصبية المحاكية الخام وضع كل واحدة في دليل فرعي خاص بها ضمن
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/'
الوسائط الأساسية
| الوسيطة | الافتراضي | الوصف |
|---|---|---|
--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 — استخدام القطبية الأكثر نشاطًا في المنطقة |
ضبط --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/'
| الوسيطة | الافتراضي | الوصف |
|---|---|---|
--type | rate | static, latency, rate, jitter, jitter_fixed |
--n_targets | 3 | عدد فئات الأهداف |
--trigger_labels | [0..n-1] | تسميات الأهداف الصريحة؛ يجب أن يساوي الطول --n_targets |
--epsilon | 0.1 | الميزانية الإجمالية، مقسمة بالتساوي على الأهداف |
المعاملات لكل هدف. قدمها بشكل صريح، أو دعها تُعيَّن تلقائيًا بواسطة
np.linspace عبر نطاق. يجب أن يكون طول القوائم الصريحة --n_targets وأن تتجاوز
وسائط النطاق.
| المحفز | صريح | نطاق تلقائي | الافتراضي التلقائي |
|---|---|---|---|
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 من مجموعات الإطارات |
المعاملات الصحيحة المعينة تلقائيًا (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/'
| الوسيطة | الافتراضي | الوصف |
|---|---|---|
--n_targets | 3 | عدد الأهداف؛ 3 و5 لهما إعدادات مسبقة مدمجة |
--target_types | None | نوع المحفز لكل هدف — static, latency, rate, jitter, jitter_fixed. يجب أن يساوي الطول --n_targets. يتجاوز الإعدادات المسبقة |
--trigger_labels | [0..n-1] | تسميات الأهداف |
--epsilon | 0.2 | الميزانية الإجمالية، مقسمة بالتساوي على الأهداف |
قوائم المعاملات لكل نوع. كل قائمة تحتوي على مدخل واحد لكل هدف من ذلك النوع — مع
--target_types latency latency rate rate jitter_fixed تمرر تأخيرين ومعدلين
وإزاحة واحدة: