Как построить ML-модель, которая не знает данных, но всё равно делает правильные прогнозы

Представь: ты разрабатываешь модель для диагностики заболеваний по медицинским снимкам. Данные — это истории тысяч пациентов. Ты не можешь их передавать в облако, потому что это нарушает закон. Ты не можешь делиться ими с коллегами, потому что это этически неприемлемо. Но модель должна учиться. И делать это быстро, точно, безопасно.

Ты не один. Такие задачи возникают в медицине, финтехе, государственных системах, где данные — священны, а доступ к ним — ограничен. И тут на помощь приходит гомоморфное шифрование. Не как теоретическая фишка, а как рабочий инструмент. Я покажу, как его реально использовать, чтобы обучить модель, не раскрывая ни одного бита данных.

Что такое гомоморфное шифрование — простыми словами

Представь, что у тебя есть сейф. Внутри — цифры. Ты не можешь открыть сейф, но можешь вставить в него калькулятор, который умеет складывать и умножать числа, не видя их. Ты вводишь команду: «сложи 5 и 3», и сейф выдаёт результат — 8 — тоже в зашифрованном виде. Ты не знаешь, что было внутри, но знаешь, что получилось.

Это и есть гомоморфное шифрование (ГШ). Оно позволяет выполнять вычисления над зашифрованными данными, не расшифровывая их. Результат — тоже зашифрован, но когда ты его расшифруешь — он совпадает с тем, что получился бы, если бы ты работал с открытыми данными.

Для машинного обучения это означает: ты можешь обучать модель на зашифрованных изображениях, зашифрованных медицинских показателях, зашифрованных транзакциях — и при этом модель «видит» данные, как будто они открыты. Только ты и владелец ключа знаете, что там на самом деле.

Почему это работает для ML, а не просто для сложения чисел

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

Например, линейная регрессия: y = w₁·x₁ + w₂·x₂ + b. Каждый x — зашифрован. Веса w — тоже. Ты берёшь зашифрованные x, умножаешь их на зашифрованные w — используя ГШ, — складываешь, прибавляешь зашифрованный сдвиг b. Получаешь зашифрованный результат y. Потом сравниваешь с зашифрованной меткой — и получаешь зашифрованную ошибку. Обновляешь веса — снова через ГШ. И так — итерация за итерацией.

Это не магия. Это математика. Но она работает только с определёнными типами шифрования. Самый популярный — BFV (Brakerski-Fan-Vercauteren) и CKKS (Cheon-Kim-Kim-Song).

BFV vs CKKS: что выбрать

Параметр BFV CKKS
Тип данных Целые числа Вещественные числа (с плавающей запятой)
Точность Полная Приблизительная (с ошибкой округления)
Скорость Быстрее Медленнее (на 2–5x)
Подходит для Классификация, бинарные решения, логические операции Нейросети, регрессия, обработка сигналов, медицинские данные
Размер шифротекста Меньше Больше (в 2–3 раза)

Если ты работаешь с медицинскими данными — температура, давление, уровень глюкозы — тебе нужен CKKS. Целые числа здесь не подойдут. Если ты решаешь задачу распознавания мошенничества по бинарным признакам («да/нет»), BFV — оптимальнее. Он быстрее, компактнее, проще в реализации.

Как построить модель шаг за шагом

Вот реальный путь, который я использовал в проекте с частной клиникой:

  1. Подготовь данные. Нормализуй все входы в диапазон [0,1] или [-1,1]. Это критично. ГШ работает с ограниченной точностью. Если у тебя значения варьируются от 0.001 до 1000 — ты потеряешь точность. Нормализация — первое, что делают все, кто пробует ГШ.
  2. Выбери шифрование. Для медицинских данных — CKKS. Для бинарных задач — BFV. Не пытайся использовать BFV для вещественных чисел — это обречено на ошибки.
  3. Зашифруй данные. Используй библиотеку PySyft или Microsoft SEAL. SEAL — самый зрелый. PySyft удобнее для Python-разработчиков. Шифруй каждый вектор данных отдельно. Не пытайся шифровать целый датасет за раз — это не сработает.
  4. Создай модель, совместимую с ГШ. Не используй ReLU. Он не гомоморфный. Замени его на полиномиальную аппроксимацию (например, f(x) ≈ x - x³/6) или сигмоиду. Используй только слои, где есть умножение и сложение. Без dropout, без batch norm — они не работают в зашифрованной среде.
  5. Обучай на зашифрованных данных. Запусти градиентный спуск. Каждый шаг: зашифрованный forward → зашифрованная ошибка → зашифрованный backward → обновление зашифрованных весов. Это занимает в 100–500 раз дольше, чем обычное обучение. Готовься к этому.
  6. Декодируй результат. После обучения — расшифруй веса. Проверь точность на открытом тестовом наборе. Если она упала на 3–5% — это нормально. Если на 15% — ты что-то сделал не так. Скорее всего, неправильно выбрал параметры шифрования.

Что может пойти не так — частые ошибки

  • Игнорируешь точность шифрования. CKKS — не идеален. Каждое умножение добавляет шум. Через 3–4 умножения точность падает. Если твоя модель имеет 10 слоёв — тебе нужно настраивать параметры глубины шифрования. Не делай это на глаз. Используй scale и poly_modulus_degree из SEAL. Минимально — 8192, оптимально — 16384 для медицинских моделей.
  • Пытается использовать любую архитектуру. Трансформеры? CNN с max-pooling? Dropout? Нет. Гомоморфное шифрование — не для всех моделей. Только те, где есть линейные операции. Лучше начать с полносвязной сети из 2–3 слоёв.
  • Забывает про размер. Зашифрованный тензор в 10 раз больше оригинального. Если у тебя 100 МБ данных — после шифрования будет 1 ГБ. Не хватает памяти? Ты не можешь просто взять больше RAM. Нужно уменьшать размеры входов, сжимать изображения, использовать более низкое разрешение.
  • Ожидает скорости. Обучение на зашифрованных данных — это не «быстрее, чем в облаке». Это в 100–1000 раз медленнее. Если ты хочешь обучать модель за час — не используй ГШ. Он для случаев, когда безопасность важнее скорости.
  • Не тестирует на реальных данных. Многие пробуют на MNIST. Потом удивляются, что на реальных снимках точность падает. Начни с 100–200 реальных примеров. Проверь, как модель работает на твоих данных — до и после шифрования.

Когда это имеет смысл — и когда нет

Гомоморфное шифрование — не панацея. Это инструмент для специфичных случаев.

Если твоя ситуация такая — делай так:

  • Ты работаешь с персональными данными, которые нельзя передавать — медицинские записи, финансовые транзакции, генетические данные. Делай ГШ.
  • Ты должен обучать модель на данных, находящихся у разных партнёров — например, 5 клиник не хотят обмениваться снимками. Используй ГШ для федеративного обучения. Каждая клиника шифрует свои данные, отправляет их центру — там обучается модель, веса шифруются и возвращаются обратно.
  • Ты в регулируемой индустрии — финансы, здравоохранение, госсектор. ГШ — твой способ соответствовать GDPR, HIPAA, FISMA.

Если твоя ситуация такая — не трать время:

  • Ты хочешь быстрый прототип. ГШ требует недель на настройку. Используй анонимизацию или дифференциальную приватность, если точность не критична.
  • Твой датасет больше 10 ГБ. ГШ не масштабируется. У тебя будет проблема с памятью и временем. Рассмотри сэмплинг или федеративное обучение без шифрования.
  • Ты используешь сложные модели — трансформеры, GAN, RNN. ГШ пока не справляется. Подожди 2–3 года, пока не появятся оптимизации.
  • Ты не обязан соблюдать строгую приватность. Если можно анонимизировать данные — сделай это. Это дешевле, быстрее и проще.

Как сделать это правильно — практические рекомендации

Вот то, что я бы сказал своему коллеге, если бы он пришёл со своей задачей:

  • Начни с малого. Возьми 100 зашифрованных изображений. Обучи простую сеть на 2 слоя. Убедись, что она работает. Потом масштабируй.
  • Используй Microsoft SEAL. Это самый стабильный инструмент. Есть Python-обёртки. Документация — на уровне. Не трать время на эксперименты с менее известными библиотеками.
  • Настрой параметры шифрования до обучения. poly_modulus_degree = 16384, coeff_modulus = [60, 40, 40, 60]. Это база для CKKS. Не меняй без необходимости.
  • Замени ReLU на полином. f(x) = 0.5x + 0.5x² - 0.125x⁴ — работает лучше, чем сигмоида. Проверено на практике.
  • Используй только CPU. GPU не поддерживают ГШ. Не трать деньги на видеокарты. Считай на 16-ядерном сервере — это нормально.
  • Делай логирование ошибок. Шум в шифровании растёт. Следи за ним. Если он превышает порог — останови обучение. Иначе модель начнёт генерировать случайные результаты.
  • Проверяй точность на открытом тесте. После обучения — расшифруй веса, протестируй на открытом датасете. Если точность упала больше чем на 5% — ищи проблему в шифровании, а не в архитектуре.

Итог: что делать прямо сейчас

Если ты читаешь это — ты, скорее всего, стоишь перед выбором: либо нарушить приватность, либо отказаться от ML. Но есть третий путь — гомоморфное шифрование.

Не пытайся построить модель для 100 000 пациентов сразу. Начни с 50. Зашифруй их. Обучи простую сеть. Убедись, что результаты совпадают с открытым обучением (погрешность до 5%). Запиши, сколько времени ушло. Проверь, сколько памяти съела. Сделай это — и ты поймёшь, работает ли ГШ для твоей задачи.

Если ты в медицине, финтехе или государственном секторе — это не теория. Это уже реальность. Компании в США и Европе уже используют это для анализа медицинских данных без передачи их в облако. Ты не отстаёшь. Ты просто ещё не начал.

Ты не должен знать, как устроено шифрование. Ты должен знать, когда его использовать, как настроить и как не сломать.

Сегодня — возьми 100 данных, зашифруй их, обучи сеть с 2 слоями, замени ReLU на полином. Потестируй. Убедись, что точность не упала. И только потом — масштабируй.

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

dfncfg.ru — цифровой мир и технологии