Matrix 同态加密:使用PALISADE库的矩阵向量乘法

Matrix 同态加密:使用PALISADE库的矩阵向量乘法,matrix,encryption,linear-algebra,seal,Matrix,Encryption,Linear Algebra,Seal,对于所有的he专家: 我想用非常大的矩阵(600000 x 55)实现矩阵向量乘法。目前,我能够用少量输入执行加法、乘法、内积等操作。当我尝试在较大的输入上应用这些操作时,会出现错误,例如下一个大小无效(正常),或者在操作系统终止进程之前,我耗尽了主内存(退出代码9) 您是否有任何建议/示例来说明如何高效地实现矩阵向量乘法或类似的方法?(使用BFV和CKKS) PS:我正在使用PALISADE库,但如果您有更好的建议,如SEAL或Helib,我也很乐意使用它们。CKKS,也在PALISADE中提

对于所有的he专家:

我想用非常大的矩阵(600000 x 55)实现矩阵向量乘法。目前,我能够用少量输入执行加法、乘法、内积等操作。当我尝试在较大的输入上应用这些操作时,会出现错误,例如
下一个大小无效(正常)
,或者在操作系统终止进程之前,我耗尽了主内存(退出代码9)

您是否有任何建议/示例来说明如何高效地实现矩阵向量乘法或类似的方法?(使用BFV和CKKS)


PS:我正在使用PALISADE库,但如果您有更好的建议,如SEAL或Helib,我也很乐意使用它们。

CKKS,也在PALISADE中提供,对于您的场景来说是一个更好的选择,因为它支持近似(类似浮点)算法,并且不需要高精度(大的明文模数)。BFV精确执行所有操作(mod明文模数)。您必须使用非常大的纯文本模,以确保结果不会环绕纯文本模。随着深度的增加,情况会变得更糟,例如,两个链式乘法


对于矩阵向量乘法,可以使用中描述的技术以及的补充信息。其主要思想是选择正确的编码并利用SIMD封装。您可以使用两个向量大小的幂,并可以将矩阵打包为每密文64xY(多行)或每密文每行的一部分,具体取决于哪一行更有效。

谢谢您的回答!我尝试用CKKS方案实现矩阵向量乘法(与..pke/advanced-real-number.cpp中的参数设置相同)。如果我应用EvalMult()操作,则会生成一个大小为(~600000)的向量我可以创建一个压缩的明文并对密文进行乘法,但结果只有深度的一半那么长,不能大于2^16。这我真的不明白。其次,我尝试了你建议的方法,将输入矩阵的一部分打包,分别对它们执行乘法,并将其聚合但我实施的每一个解决方案都需要相当长的时间(>15分钟)才能执行,这让人感觉我做错了什么。请您详细说明一下建议的方法(如选择什么参数等)提前感谢!对于第一个问题,我们可以将多达n/2个实数打包到一个CKKS密文中,其中n是环尺寸。这是CKKS打包本身的一个限制。我想指出深度和批量大小(插槽数)是两个不同的概念。
depth
是一个人可以执行多少链式乘法,
number of plaintext slot
是一个密文中可以打包多少实数以SIMD方式执行操作。对于性能问题,第一个建议是确保将multDepth设置为1以使用smaller参数。第二个建议与编码有关。您希望确保将n/2实数放入一个密文中,以便使用最少数量的密文。然后,您有两个选项可以选择如何将矩阵写入大小为n/2的向量。例如,您可以使用行或列排序。高级思想是在同一密文中添加实数的EvalSum要比在多个密文中添加实数的EvalAdd昂贵得多。感谢所有的帮助!也许你也可以看看这篇文章: