Выбор подходящих параметров для SEAL и уточнение некоторых математических операций

A) У меня есть проблемы, чтобы понять отношения между этими настройками:

parms.set_poly_modulus("1x^2048 + 1");
parms.set_coeff_modulus(coeff_modulus_128(2048));
parms.set_plain_modulus(1 << 8);

и эта таблица из УПРАВЛЕНИЕ ПЕЧАТЬЮ.

введите описание изображения здесь

Меня интересует, в частности, число 54 и как оно было рассчитано в отношении parms.set_poly_modulus("1x^2048 + 1") а также parms.set_coeff_modulus(coeff_modulus_128(2048)),

B) Я пытаюсь найти правильные параметры для моего варианта использования.
Допустим, у меня есть 10000 дробных чисел от -180 до +180, и я хочу кодировать каждое из этих чисел, используя FractionalEncoder, Предварительно выполненные операции будут: вычесть, сложить, умножить, возвести в квадрат и возвести в степень. Результат будет сохранен в отдельном Ciphertext переменная.

Итак, что касается моего варианта использования, каковы оптимальные параметры для:

  1. n, q, t в

    parms.set_poly_modulus("1x^n + 1");
    parms.set_coeff_modulus(coeff_modulus_128(q));
    parms.set_plain_modulus(t);
    
  2. a а также b в seal::FractionalEncoder encoder(context.plain_modulus(), context.poly_modulus(), a, b, 2), я использую а = 512 а также б = 128, что слишком высоко для моего варианта использования.

Как я могу рассчитать эти параметры самостоятельно, если мой вариант использования изменится?

0

Решение

A) В вашем примере вы используете полиномиальный модуль измерения 2048 и 128-битный уровень безопасности по умолчанию для модуля коэффициента. Чтобы увидеть, что именно это значение, посмотрите на SEAL/seal/util/globals.cpp, Коэффициент модуля является вектором SmallModulus объекты, которые являются положительными целыми числами, представляющими до 60-битных факторов Всего коэффициент модуля. Например, для ваших параметров модуль коэффициента состоит только из одного простого множителя 0x3fffffff000001, но вы увидите, что для больших параметров это может иметь гораздо больше факторов.

Уровень безопасности зависит как от степени модуля полинома (чем выше, тем выше безопасность), так и от длины в битах Всего коэффициент модуля (меньше — высокий уровень безопасности). Таким образом, для фиксированного модуля полинома должен быть максимально допустимый коэффициент модуля, обеспечивающий фиксированный уровень безопасности. Поскольку совсем не легко узнать, какова эта верхняя граница для модуля коэффициента, SEAL предоставляет его в качестве значения по умолчанию через coeff_modulus_128 (а также coeff_modulus_192 а также coeff_modulus_256 для более высоких уровней безопасности). В некоторых случаях вы можете использовать меньший модуль коэффициента, чем по умолчанию, но вы никогда не должны использовать больший модуль коэффициента, если вы действительно не знаете, что делаете (и, вероятно, даже тогда). Длина в 54 бита получается с использованием оценки Мартина Альбрехта LWE: https://bitbucket.org/malb/lwe-estimator.

B) Типичный рабочий процесс при определении параметров в такой ситуации — сначала определить достаточно большой plain_modulus так что вы получите правильность для вашего вычисления. Если вы исчерпали бюджет шума, просто настройте свой coeff_modulus пока это не работает.

Как только вы нашли достаточно большой plain_modulusпопробуйте оптимизировать coeff_modulus установив его наименьшее значение, оставляя вас с ненулевым шумовым бюджетом. Для простоты вы можете просто попробовать разные значения по умолчанию, полученные через coeff_modulus_128, Если вы действительно заботитесь о производительности, вы можете выбрать coeff_modulus простые числа, чтобы действительно найти наименьшее значение, которое работает.

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

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

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

Параметризация FractionalEncoder это другое дело. Я бы порекомендовал поэкспериментировать с разными значениями, чтобы понять, как эти варианты влияют на точность. Что не так с выбором a = 512, b = 128?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]