Разработка схем безопасности для алгоритмов глубокого обучения имеет решающее значение для защиты беспроводных сетей от злоумышленников. Однако единого мнения о том, как лучше всего это сделать, нет. В этом блоге я представляю уязвимость безопасности в глубоком обучении для прогнозирования формирования луча с использованием глубоких нейронных сетей (DNN) и предлагаю два метода устранения этой уязвимости. Экспериментальные результаты показывают, что эти методы эффективны для защиты моделей DNN от атак злоумышленников в беспроводных сетях следующего поколения.
Цитировать работу
Если вы считаете эти результаты полезными, укажите их :
@misc{kuzlu2022adversarial,
title={The Adversarial Security Mitigations of mmWave Beamforming Prediction Models using Defensive Distillation and Adversarial Retraining},
author={Murat Kuzlu and Ferhat Ozgur Catak and Umit Cali and Evren Catak and Ozgur Guler},
year={2022},
eprint={2202.08185},
archivePrefix={arXiv},
primaryClass={cs.CR}
}
1. Введение
Первый стандарт 5G был объявлен и одобрен 3GPP в декабре 2017 года. Ожидается, что ранняя работа по стандартизации 5G обеспечит прочную и стабильную основу для скорейшего внедрения услуг 5G. Кроме того, 5G будет иметь важное значение для приложений Интернета вещей (IoT) и будущих мобильных сетей. При проектировании сетей 5G возникает множество проблем, в том числе схема безопасности для предсказания формирования луча. Это важная часть беспроводных сетей, изучаемая в системах связи и обработки сигналов. Разработка и реализация алгоритмов формирования луча в беспроводных сетях следующего поколения (например, 6G) также имеет решающее значение. В современных беспроводных сетях прогнозирование формирования луча на основе глубокого обучения (DL) уязвимо для враждебных атак машинного обучения. Поэтому крайне важно разработать схему безопасности для предсказания формирования луча в сетях 6G.
6G — новейшая технология беспроводной связи среди сотовых сетей, находящихся в стадии разработки. В решениях 6G алгоритмы на основе искусственного интеллекта (ИИ) будут одним из основных компонентов систем беспроводной связи для повышения общей производительности системы. Существующие решения в 5G будут перенесены в область ИИ, а точнее в область DL. Поэтому крайне важно разработать безопасные решения DL для моделей на основе ИИ в беспроводных сетях 6G. Новая поверхность атаки и существующие проблемы безопасности 5G являются уязвимостями безопасности DL. Исследователи и компании должны смягчить проблемы безопасности своих моделей DL, прежде чем развертывать их в производственных средах. Им необходимо выявлять, документировать и проводить оценку рисков новых угроз безопасности в системах беспроводной связи следующего поколения.
2. Оборонительная дистилляция
Дистилляция знаний была ранее введена Hinton et al. сжать большую модель в меньшую. Пейпернот и др. предложил эту технику для состязательной защиты от атак с помощью машинного обучения. Метод смягчения защитной дистилляции включает в себя более крупную модель учителя и сжатую модель ученика. Первый шаг — обучить модель учителя с параметром высокой температуры ($T$), чтобы смягчить выходные данные вероятности softmax модели DNN.
$i$th class и $z_{i}$ — логиты. Второй шаг — использовать ранее обученную модель учителя для получения программных меток обучающих данных. На этом этапе модель учителя прогнозирует каждую выборку в обучающих данных, используя одно и то же значение температуры ($T$), а прогнозы представляют собой метки (т. е. программные метки) для обучающих данных для обучения модели ученика. Модель ученика обучается с помощью мягких меток, полученных от модели учителя, опять же с высоким значением $T$ в softmax. После этапа обучения модели учащегося параметр $T$ устанавливается равным 1 в течение времени прогнозирования модели учащегося.
На рис. 1 показаны общие этапы этого метода.
3. Приступаем к кодированию
Я покажу предложенный нами подход на языке Python. Я импортирую обычные стандартные библиотеки, чтобы построить модель глубокого обучения для прогнозирования кодового слова формирования радиочастотного луча.
!pip install -q cleverhans
!pip install -q plot_keras_history
!pip install -q loguru
import util
from plot_keras_history import plot_history
import matplotlib.pyplot as plt
from tqdm.notebook import tqdm
import numpy as np
from sklearn.metrics import mean_squared_error
import pandas as pd
import seaborn as sns
SCENARIO_NAME = 'O1'
nb_epoch = 2000
batch_size = 1000
num_tot_TX=4
num_beams=512
loss_fn='mean_squared_error'
DS_PATH = '/Users/ozgur/Documents/Workshop/DeepMIMO_Dataset_Generation_v1.1/DLCB_dataset/'
В этой работе я буду использовать общедоступный набор данных DeepMIMO для атаки на модель прогнозирования формирования радиочастотного луча. Я буду использовать атаку FGSM и функцию потери среднеквадратичной ошибки для обработки ввода. Моя реализация атаки FGSM здесь. В этом сценарии есть 4 базовых станции.
In_train, In_test, Out_train, Out_test = util.get_dataset(SCENARIO_NAME) AP_models,AP_models_history = util.train(In_train, Out_train, In_test, Out_test, nb_epoch, batch_size,loss_fn=loss_fn, n_BS=num_tot_TX, n_beams=num_beams, sc_name=SCENARIO_NAME) for i in range(num_tot_TX): plot_history(AP_models_history[i].history, side=3) plt.show()
0%| | 0/4 [00:00<?, ?it/s] Restoring model weights from the end of the best epoch: 91. Epoch 00111: early stopping Restoring model weights from the end of the best epoch: 106. Epoch 00126: early stopping Restoring model weights from the end of the best epoch: 96. Epoch 00116: early stopping Restoring model weights from the end of the best epoch: 57. Epoch 00077: early stopping
Состязательные атаки машинного обучения
На этом этапе мы будем генерировать вредоносные сигналы восходящей линии связи, используя атаки Fast-Gradient Sign Method (FGSM), Basic Iterative Method (BIM), Momentum Iterative Method (MIM), Projected Gradient Descent (PGD).
FGSM (метод быстрого градиента)
epsilon_vals = [0.1, 0.2, 0.3] fgm_eps_mse = [] fgsm_all_mse = [] fgsm_all_eps = [] for eps_val in tqdm(epsilon_vals): fgsm_mse_malicious = [] for i_bs in range(num_tot_TX): adv_inputs = util.attack_models(model = AP_models[i_bs], attack_name = 'FGSM', eps_val = eps_val, testset = In_test, norm = np.inf) adv_inputs_pred = AP_models[i_bs].predict(adv_inputs) for j in range(adv_inputs_pred.shape[0]): tmp = mean_squared_error(Out_test[j,i_bs*num_beams:(i_bs+1)*num_beams], adv_inputs_pred[j,:]) fgsm_mse_malicious.append(tmp) fgsm_all_mse.append(tmp) fgsm_all_eps.append(eps_val) fgm_eps_mse.append(np.mean(fgsm_mse_malicious))
0%| | 0/3 [00:00<?, ?it/s] WARNING:tensorflow:5 out of the last 5 calls to <function compute_gradient at 0x7f9d7ba1eb80> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details. WARNING:tensorflow:6 out of the last 6 calls to <function compute_gradient at 0x7f9d7ba1eb80> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.
PGD (проецируемый градиентный спуск)
pgd_eps_mse = [] pgd_all_mse = [] for eps_val in tqdm(epsilon_vals): pgd_mse_malicious = [] for i_bs in range(num_tot_TX): adv_inputs = util.attack_models(model = AP_models[i_bs], attack_name = 'PGD', eps_val = eps_val, testset = In_test, norm = np.inf) adv_inputs_pred = AP_models[i_bs].predict(adv_inputs) for j in range(adv_inputs_pred.shape[0]): tmp = mean_squared_error(Out_test[j,i_bs*num_beams:(i_bs+1)*num_beams], adv_inputs_pred[j,:]) pgd_mse_malicious.append(tmp) pgd_all_mse.append(tmp) pgd_eps_mse.append(np.mean(pgd_mse_malicious))
0%| | 0/3 [00:00<?, ?it/s]
BIM (основной итерационный метод)
bim_eps_mse = [] bim_all_mse = [] for eps_val in tqdm(epsilon_vals): bim_mse_malicious = [] for i_bs in range(num_tot_TX): adv_inputs = util.attack_models(model = AP_models[i_bs], attack_name = 'BIM', eps_val = eps_val, testset = In_test, norm = np.inf) adv_inputs_pred = AP_models[i_bs].predict(adv_inputs) for j in range(adv_inputs_pred.shape[0]): tmp = mean_squared_error(Out_test[j,i_bs*num_beams:(i_bs+1)*num_beams], adv_inputs_pred[j,:]) bim_mse_malicious.append(tmp) bim_all_mse.append(tmp) bim_eps_mse.append(np.mean(bim_mse_malicious))
0%| | 0/3 [00:00<?, ?it/s]
MIM (импульсный итерационный метод)
mim_eps_mse = [] mim_all_mse = [] for eps_val in tqdm(epsilon_vals): mim_mse_malicious = [] for i_bs in range(num_tot_TX): adv_inputs = util.attack_models(model = AP_models[i_bs], attack_name = 'MIM', eps_val = eps_val, testset = In_test, norm = np.inf) adv_inputs_pred = AP_models[i_bs].predict(adv_inputs) for j in range(adv_inputs_pred.shape[0]): tmp = mean_squared_error(Out_test[j,i_bs*num_beams:(i_bs+1)*num_beams], adv_inputs_pred[j,:]) mim_mse_malicious.append(tmp) mim_all_mse.append(tmp) mim_eps_mse.append(np.mean(mim_mse_malicious))
0%| | 0/3 [00:00<?, ?it/s]
df_avg_mse = pd.DataFrame({'epsilon_vals':epsilon_vals,'fgm_eps_mse':fgm_eps_mse, 'pgd_eps_mse':pgd_eps_mse,'bim_eps_mse':bim_eps_mse, 'mim_eps_mse':mim_eps_mse}) df_avg_mse.to_csv('df_avg_mse.csv', index=False) plt.figure(figsize=(10,3)) sns.lineplot(data=df_avg_mse, x='epsilon_vals', y='fgm_eps_mse', ls='--', lw=2) sns.lineplot(data=df_avg_mse, x='epsilon_vals', y='pgd_eps_mse', ls='-.', lw=2) sns.lineplot(data=df_avg_mse, x='epsilon_vals', y='bim_eps_mse', ls='-', lw=2) sns.lineplot(data=df_avg_mse, x='epsilon_vals', y='mim_eps_mse', ls='-.', lw=2) plt.ylabel('MSE', fontsize=20) plt.xlabel(r'$\epsilon$ values', fontsize=20) plt.xticks(fontsize=16) plt.yticks(fontsize=16) plt.grid(True) plt.legend(['FGSM','PGD','BIM','MIM'],shadow=True, ncol=2,fontsize=16) plt.show()
Распределения среднеквадратичной ошибки
Гистограмма распределения MSE для каждой атаки. Существует сильная отрицательная корреляция между $\epsilon$ и эффективностью прогнозирования модели глубокого обучения. Значение доверительного интервала корреляций (т. е. значение $p$) равно 0. Значение $p$ представляет собой вероятность, связанную с вероятностью получения результата корреляции.
df_fgsm_res = pd.DataFrame({'epsilon':fgsm_all_eps,
'FGSM':fgsm_all_mse,'PGD':pgd_all_mse,
'BIM':bim_all_mse,'MIM':mim_all_mse})
df_fgsm_res.to_csv('df_fgsm_res.csv', index=False)
color_codes = ['r','g','b']
attack_types = ['FGSM','PGD','BIM','MIM']
fig,ax = plt.subplots(1, 4, figsize=(20, 5), sharey=True)
ax_idx = 0
for attack_type in attack_types:
for tmp_eps_val, c_name in zip(epsilon_vals,color_codes):
df_fgsm_res_tmp = df_fgsm_res.query('epsilon == ' + str(tmp_eps_val) )
sns.histplot(data=df_fgsm_res_tmp, x=attack_type, element="poly", cumulative=False,
lw=2,stat='count',log_scale=(False,False),
ax=ax[ax_idx], color=c_name)
ax[ax_idx].set_xlabel(attack_type, fontsize=20)
ax[ax_idx].set_ylabel(r'Count', fontsize=20)
ax[ax_idx].legend(epsilon_vals,shadow=False,ncol=1,fontsize=14)
ax[ax_idx].grid()
ax_idx += 1
plt.show()
Оборонительная дистилляция
AP_distilled_models = util.train_distill(In_train, Out_train, In_test, Out_test, nb_epoch, batch_size,loss_fn=loss_fn, n_BS=num_tot_TX, n_beams=num_beams, teacher_multiplication=3.0,student_multiplication=0.1, distill_alpha=0.1, distill_temp=100, sc_name=SCENARIO_NAME)
0%| | 0/4 [00:00<?, ?it/s]
Атака на дистиллированные модели
Мы проведем те же атаки для дистиллированных моделей. Из графиков легко увидеть, что дистиллированные модели более устойчивы к атакам.
epsilon_vals = [0.1, 0.2, 0.3] fgm_eps_mse = [] fgsm_all_mse = [] fgsm_all_eps = [] for eps_val in tqdm(epsilon_vals): fgsm_mse_malicious = [] for i_bs in range(num_tot_TX): adv_inputs = util.attack_models(model = AP_distilled_models[i_bs], attack_name = 'FGSM', eps_val = eps_val, testset = In_test, norm = np.inf) adv_inputs_pred = AP_distilled_models[i_bs].predict(adv_inputs) for j in range(adv_inputs_pred.shape[0]): tmp = mean_squared_error(Out_test[j,i_bs*num_beams:(i_bs+1)*num_beams], adv_inputs_pred[j,:]) fgsm_mse_malicious.append(tmp) fgsm_all_mse.append(tmp) fgsm_all_eps.append(eps_val) fgm_eps_mse.append(np.mean(fgsm_mse_malicious))
0%| | 0/3 [00:00<?, ?it/s]
pgd_eps_mse = [] pgd_all_mse = [] for eps_val in tqdm(epsilon_vals): pgd_mse_malicious = [] for i_bs in range(num_tot_TX): adv_inputs = util.attack_models(model = AP_distilled_models[i_bs], attack_name = 'PGD', eps_val = eps_val, testset = In_test, norm = np.inf) adv_inputs_pred = AP_distilled_models[i_bs].predict(adv_inputs) for j in range(adv_inputs_pred.shape[0]): tmp = mean_squared_error(Out_test[j,i_bs*num_beams:(i_bs+1)*num_beams], adv_inputs_pred[j,:]) pgd_mse_malicious.append(tmp) pgd_all_mse.append(tmp) pgd_eps_mse.append(np.mean(pgd_mse_malicious))
0%| | 0/3 [00:00<?, ?it/s]
bim_eps_mse = [] bim_all_mse = [] for eps_val in tqdm(epsilon_vals): bim_mse_malicious = [] for i_bs in range(num_tot_TX): adv_inputs = util.attack_models(model = AP_distilled_models[i_bs], attack_name = 'BIM', eps_val = eps_val, testset = In_test, norm = np.inf) adv_inputs_pred = AP_distilled_models[i_bs].predict(adv_inputs) for j in range(adv_inputs_pred.shape[0]): tmp = mean_squared_error(Out_test[j,i_bs*num_beams:(i_bs+1)*num_beams], adv_inputs_pred[j,:]) bim_mse_malicious.append(tmp) bim_all_mse.append(tmp) bim_eps_mse.append(np.mean(bim_mse_malicious))
0%| | 0/3 [00:00<?, ?it/s]
mim_eps_mse = [] mim_all_mse = [] for eps_val in tqdm(epsilon_vals): mim_mse_malicious = [] for i_bs in range(num_tot_TX): adv_inputs = util.attack_models(model = AP_distilled_models[i_bs], attack_name = 'MIM', eps_val = eps_val, testset = In_test, norm = np.inf) adv_inputs_pred = AP_distilled_models[i_bs].predict(adv_inputs) for j in range(adv_inputs_pred.shape[0]): tmp = mean_squared_error(Out_test[j,i_bs*num_beams:(i_bs+1)*num_beams], adv_inputs_pred[j,:]) mim_mse_malicious.append(tmp) mim_all_mse.append(tmp) mim_eps_mse.append(np.mean(mim_mse_malicious))
0%| | 0/3 [00:00<?, ?it/s]
df_avg_mse = pd.DataFrame({'epsilon_vals':epsilon_vals,'fgm_eps_mse':fgm_eps_mse, 'pgd_eps_mse':pgd_eps_mse,'bim_eps_mse':bim_eps_mse, 'mim_eps_mse':mim_eps_mse}) df_avg_mse.to_csv('df_avg_mse.csv', index=False) plt.figure(figsize=(10,3)) sns.lineplot(data=df_avg_mse, x='epsilon_vals', y='fgm_eps_mse', ls='--', lw=2) sns.lineplot(data=df_avg_mse, x='epsilon_vals', y='pgd_eps_mse', ls='-.', lw=2) sns.lineplot(data=df_avg_mse, x='epsilon_vals', y='bim_eps_mse', ls='-', lw=2) sns.lineplot(data=df_avg_mse, x='epsilon_vals', y='mim_eps_mse', ls='-.', lw=2) plt.ylabel('MSE', fontsize=20) plt.xlabel(r'$\epsilon$ values', fontsize=20) plt.xticks(fontsize=16) plt.yticks(fontsize=16) plt.grid(True) plt.legend(['FGSM','PGD','BIM','MIM'],shadow=True, ncol=2,fontsize=16) plt.show()
df_fgsm_res = pd.DataFrame({'epsilon':fgsm_all_eps,
'FGSM':fgsm_all_mse,'PGD':pgd_all_mse,
'BIM':bim_all_mse,'MIM':mim_all_mse})
df_fgsm_res.to_csv('df_fgsm_res.csv', index=False)
color_codes = ['r','g','b']
attack_types = ['FGSM','PGD','BIM','MIM']
fig,ax = plt.subplots(1, 4, figsize=(20, 5), sharey=True)
ax_idx = 0
for attack_type in attack_types:
for tmp_eps_val, c_name in zip(epsilon_vals,color_codes):
df_fgsm_res_tmp = df_fgsm_res.query('epsilon == ' + str(tmp_eps_val) )
sns.histplot(data=df_fgsm_res_tmp, x=attack_type, element="poly", cumulative=False,
lw=2,stat='count',log_scale=(False,False),
ax=ax[ax_idx], color=c_name)
ax[ax_idx].set_xlabel(attack_type, fontsize=20)
ax[ax_idx].set_ylabel(r'Count', fontsize=20)
ax[ax_idx].legend(epsilon_vals,shadow=False,ncol=1,fontsize=14)
ax[ax_idx].grid()
ax_idx += 1
plt.show()
4. Заключение
В этом блоге представлена схема безопасности для уязвимостей моделей прогнозирования формирования радиочастотного луча и методы их устранения. Для изучения этих вопросов были проведены эксперименты с выбранными сценариями DeepMIMO. Результаты подтверждают, что исходная модель формирования луча на основе DL значительно уязвима для атак FGSM, PGD, BIM и MIM. Значение MSE увеличивается во всех трех сценариях при сильной атаке со стороны BIM. С другой стороны, результаты показывают, что предложенные методы ослабления помех успешно повышают эффективность прогнозирования формирования РЧ-лучей.