Найти тему
14 подписчиков

Градиентные атаки на восстановление внутренних состояний LSTM


LSTM сети совершили революцию в развитии рекуррентных нейронных сетей, так как они эффективно обрабатывают последовательные данные, учитывая долгосрочные зависимости. Архитектура LSTM включает четыре основных компонента:

Input Gate: Определяет, какая часть новой информации будет сохранена в текущем состоянии ячейки.
Forget Gate: Определяет, какая часть информации из предыдущего состояния ячейки будет забыта.
Output Gate: Определяет, какая часть информации из текущего состояния ячейки будет использована для вычисления нового скрытого состояния.
Candidate State: Генерирует новую информацию, которая может быть добавлена в текущее состояние ячейки.

Однако, несмотря на все преимущества, LSTM-сети имеют архитектурную особенность, которая может привести к серьёзной уязвимости, известной как градиентные атаки на восстановление внутренних состояний. Эти атаки позволяют злоумышленнику использовать градиенты модели для восстановления внутренних состояний.

Для наглядности создадим слой LSTM, эквивалентный встроенной функции tf.keras.layers.LSTM(units, return_sequences=True, return_state=True):

class LSTMCell(tf.keras.Model):
def __init__(self, h_size):
super().__init__()
self.h_size = h_size

# input gate
self.fcXI = tf.keras.layers.Dense(self.h_size)
self.fcHI = tf.keras.layers.Dense(self.h_size, use_bias=False)

# forget gate
self.fcXF = tf.keras.layers.Dense(self.h_size)
self.fcHF = tf.keras.layers.Dense(self.h_size, use_bias=False)

# создание нового кандидата CH
self.fcXC = tf.keras.layers.Dense(self.h_size)
self.fcHC = tf.keras.layers.Dense(self.h_size, use_bias=False)

# output gate
self.fcXO = tf.keras.layers.Dense(self.h_size)
self.fcHO = tf.keras.layers.Dense(self.h_size, use_bias=False)

def call(self, x, h, c):
i = tf.nn.sigmoid(self.fcXI(x) + self.fcHI(h))
f = tf.nn.sigmoid(self.fcXF(x) + self.fcHF(h))
o = tf.nn.sigmoid(self.fcXO(x) + self.fcHO(h))
ch = tf.nn.tanh(self.fcXC(x) + self.fcHC(h))
c = f * c + i * ch # поэлементное произведение и сумма
h = o * tf.nn.tanh(c) # поэлементное произведение
return h, c

class LSTMLayer(tf.keras.Model):
def __init__(self, h_size):
super().__init__()
self.h_size = h_size
self.lstm_cell = LSTMCell(h_size)

def call(self, x_all):
batch = tf.shape(x_all)[0]
h = tf.zeros((batch, self.h_size))
c = tf.zeros((batch, self.h_size))
h_all = []

for i in range(x_all.shape[1]):
h, c = self.lstm_cell(x_all[:, i, :], h, c)
h_all.append(h)

h_all = tf.stack(h_all, axis=1)

return h_all, h, c

В сценарии распределенного обучения или при наличии прямого доступа к модели злоумышленник может попытаться восстановить скрытые состояния c и h с помощью анализа градиентов:

input_data = tf.random.normal([32, 10, 8])
model = LSTMLayer(16)

with tf.GradientTape() as tape:
output, state_h, state_c = model(input_data)
loss = tf.reduce_mean(output)

# Получаем градиенты
gradients = tape.gradient(loss, model.trainable_variables)

# Симулируем восстановление состояния h и c (анализируем последние градиенты)
restored_h = tf.reduce_mean(gradients[-2]) # градиенты, относящиеся к состоянию h
restored_c = tf.reduce_mean(gradients[-1]) # градиенты, относящиеся к состоянию c

print("Восстановленное состояние h:", restored_h.numpy())
print("Восстановленное состояние c:", restored_c.numpy())

Скрытые состояния c и h в LSTM сохраняют долгосрочную информацию о последовательных данных. Если эти состояния восстанавливаются, злоумышленник может получить доступ к конфиденциальной информации, хранящейся в этих состояниях. Например, в задачах обработки текстов, состояния могут содержать важные контексты или персональные данные пользователей.

#MLSecOps
Градиентные атаки на восстановление внутренних состояний LSTM  LSTM сети совершили революцию в развитии рекуррентных нейронных сетей, так как они эффективно обрабатывают последовательные данные,...
2 минуты