隐私计算中的非线性函数很难算,或者开销很大。三角函数更是如此,Squirrel文章中提出了一种高效的计算方式,感觉可以作为一种通用优化方案。
参考文献:Squirrel: A Scalable Secure Two-Party Computation Framework for Training Gradient Boosting Decision Tree [USENIX Security 23]
在基于秘密分享机制的两方安全计算场景下:
sin ( x ) = sin ( ⟨ x ⟩ 0 + ⟨ x ⟩ 1 ) = sin ( ⟨ x ⟩ 0 ) ⋅ cos ( ⟨ x ⟩ 1 ) + sin ( ⟨ x ⟩ 1 ) ⋅ cos ( ⟨ x ⟩ 0 ) \sin(x) = \sin(\langle x\rangle_0 + \langle x\rangle_1) = \sin(\langle x\rangle_0)\cdot \cos(\langle x\rangle_1) + \sin(\langle x\rangle_1)\cdot \cos(\langle x\rangle_0) sin(x)=sin(⟨x⟩0+⟨x⟩1)=sin(⟨x⟩0)⋅cos(⟨x⟩1)+sin(⟨x⟩1)⋅cos(⟨x⟩0)
cos ( x ) = cos ( ⟨ x ⟩ 0 + ⟨ x ⟩ 1 ) = cos ( ⟨ x ⟩ 0 ) ⋅ cos ( ⟨ x ⟩ 1 ) − sin ( ⟨ x ⟩ 1 ) ⋅ sin ( ⟨ x ⟩ 0 ) \cos(x) = \cos(\langle x\rangle_0 + \langle x\rangle_1) = \cos(\langle x\rangle_0)\cdot \cos(\langle x\rangle_1) - \sin(\langle x\rangle_1)\cdot \sin(\langle x\rangle_0) cos(x)=cos(⟨x⟩0+⟨x⟩1)=cos(⟨x⟩0)⋅cos(⟨x⟩1)−sin(⟨x⟩1)⋅sin(⟨x⟩0)
其中,四项都可以在client和server端本地(local)计算,不带来任何通信开销。唯一的通信开销来自两次乘法,需要双方通过不经意传输(OT)共同计算。最后加法也是本地完成,不带来任何通信开销。
有了三角函数协议之后,就可以搭建sigmoid函数的协议:
至于指数 exp \exp exp能不能用这样的方式?
exp ( x ) = exp ( ⟨ x ⟩ 0 + ⟨ x ⟩ 1 ) = exp ( ⟨ x ⟩ 0 ) ⋅ exp ( ⟨ x ⟩ 1 ) \exp(x) = \exp(\langle x\rangle_0 + \langle x\rangle_1) = \exp(\langle x\rangle_0) \cdot \exp(\langle x\rangle_1) exp(x)=exp(⟨x⟩0+⟨x⟩1)=exp(⟨x⟩0)⋅exp(⟨x⟩1)
我认为应该是不能的,因为 exp ( ⟨ x ⟩ 0 ) , exp ( ⟨ x ⟩ 1 ) \exp(\langle x\rangle_0), \exp(\langle x\rangle_1) exp(⟨x⟩0),exp(⟨x⟩1)两项即使本地计算,但是 exp \exp exp不像 sin , cos \sin, \cos sin,cos,它是发散的,在本地计算是很可能会超出有限环的范围,发生溢出错误。