TLDR: 在这篇博客中,我们要训练一个训练期间完全加密的神经网络(使用未加密数据)。这个神经网络将会有两个有益的特性。首先,该神经网络智被保护不受那些想要偷窃它的人的伤害,即允许在不安全的环境下训练贵重的AI而无被盗窃的风险。第二,该神经网络可以只作出加密的预测 (这对外部世界可能没有什么影响,因为外部世界无法理解没有密钥的预测)。这就在用户和超级智能之间创造出一个非常重要的权利不平衡。如果这个AI被同态加密,那么在它看来,整个外部世界也被同态加密了 。控制该密钥的人就可以选择解锁这个AI(将它公之于众)或者仅仅个人拥有这个AI做出的预测(似乎更安全)
当我在@iamtrask 上完成一篇新博客后,通常会发推特。如果你有兴趣阅读更多的博客的话,可以在twitter关注我,在此感谢所有的反馈。
超级智能
许多人担心超级强大的AI有一天会选择伤害人类。最近,斯蒂芬·霍金呼吁新世界政府 控制我们给予人工智能的能力,这样人工智就不会反过来毁灭我们。这是相当大胆的言论,我认为这反映出了科学界和社会的一种普遍担忧。在这篇博客中,就这个问题我想给出一种可能的技术解决方案,并用一些示例代码来证明该方法。
目标很简单。我们想要构建AI科技——可以变得极度聪明(聪明到可以治愈癌症,解决世界饥饿问题等等),但是它的智能被一个持有密钥的人所控制,因此智能的应用被限制了。不受限的学习固然很棒,但是那种知识的不受限制的应用可能是危险的。
为了介绍这个想法,我会非常快速地描述两个令人兴奋的研究领域:深度学习和同态加密。
Part 1:什么是深度学习?
深度学习是为了智能自动化的一套工具,主要利用神经网络。作为计算机科学的一个领域,深度学习和近来AI科技的繁荣有着密不可分的关系,因为它在许多智能任务中已经超过之前的质量记录。例如,它在DeepMind的AlphaGo 系统,最近击败了世界围棋冠军李世石,中扮演了很重要的角色。
问题: 神经网络如何学习?
神经网络基于输入作出预测。它学着通过试验和错误有效地作出预测。一开始它先作出一个预测(最初有很大的随机性),然后收到一个"错误信号(error
signal)"——表明它预测的太高或者太低(通常可能性)。在这个循环重复几百万次甚至几千万次后,神经网络开始作出合理的预测。若想要了解更多关于此过程的细节,请看A Neural Network in 11 Lines of Python
其中的关键点就是这个错误信号。要是神经网络不被告知它的预测的好坏程度,它就无法学习。这一点很重要,牢记。
Part 2:什么是同态加密?
人如其名,同态加密 是一种加密的方式。在非对称情形下,它可以使用公钥(public
key)完美地将可阅读文本(明文)转换为一堆乱七八糟的东西(密文)。更重要的是,它还能使用私钥(secret
key)将那些密文还原为相应的明文。理论上,除非你拥有私钥,否则你是无法破译密文的。
同态加密是加密方法中的一种特殊类型。它允许有人以特定方式修改加密的信息而不必能读懂那些信息。例如,数字可以做同态加密,比如对加密的数值可以执行乘法和加法而无需解密它们。这里有一些简单的例子。
如今,有关同态加密的方案越来越多,每种方案都有不同的特性。这是一个相对年轻的领域,有一些重要的问题还正在研究之中,但是我们以后再说。
接下来我们只讨论以下方案。基于乘法和加法同态的整数公钥加密方案,此外可以执行上面图片中的运算。更进一步,由于公钥允许“单向”加密,你甚至可以在未加密数字和(通过单向加密的)已加密数字之间执行运算,例如上面的2
* Cypher A(有些加密方案甚至连那个也不需要……但是……我们以后再说。)
Part 3:我们能将深度学习和同态加密一起使用吗?
或许深度学习和同态加密之间最常见的交点已经证明是数据隐私方面。事实证明,当你同态加密数据后,虽然你无法读懂它的含义,但是你仍然保留了大部分有趣的统计结构。这就允许人们使用加密的数据(CryptoNets )训练模型。此外,一个新成立的对冲基金Numer.ai 加密了昂贵的,专有的数据,并允许任何人尝试去训练机器学习模型以此来预测股市。正常情况下他们无法这样做,因为这要放弃极其珍贵的信息(正常的加密不可能训练模型)。
但是,这篇博客将要做的是相反的事情,加密神经网络并使用未加密数据训练它。
一个神经网络,看起来惊人的复杂,实际可分解为非常小的、简单的一遍又一遍地重复的移动单元。事实上,许多最先进的神经网络只能使用下面的运算来创建:
· 加法
· 乘法
· 除法
· 减法
· Sigmoid
· 双曲正切(Tanh )
· 指数运算(Exponential )
现在,问一个明显的技术性问题,我们能否同态加密神经网络?事实证明,做一些保守的近似后,这是可以做到的。
· 加法-现成可用的
· 乘法-现成可用的
· 除法-现成可用的?-简单地1/乘法
· 减法-现成可用的?-简单地加法的反面
· Sigmoid -呃...有点难
· 双曲正切(Tanh )-呃...有点难
· 指数运算(Exponential )-呃...有点难
看起来似乎我们可以十分容易地得到除法和减法,但是这些更复杂的函数...好吧...比起简单的加法和乘法要复杂得多。为了同态加密一个深度神经网络,我们还需要一个秘密武器。
Part 4:泰勒级数展开
或许你可从小学的记忆中找到它。泰勒级数(Taylor Series )允许人们利用无穷 级数的加、减、乘、除来计算一个复杂的(非线性)函数。这很完美!(除了无穷那部分)。幸运的是,如果你只计算了精确的泰勒级数展开的前面有限项,你仍可以得到该函数的一个精度相当高的结果。这里有一些常用的借助泰勒级数近似的函数(Source )。
等一下!这里有指数运算!别担心。指数运算只不过是重复的乘法,我们可以计算。
玩一下吧,这里有个利用泰勒级数近似计算sigmoid函数的python实现代码。(你可以在网站Wolfram Alpha 中查看公式)。我们会计算此泰勒级数的前几项并看看得到的结果和真正sigmoid函数相差多少。
运行结果:
仅仅计算了该泰勒级数的前四项,我们得到的结果就非常接近sigmoid函数了。既然我们已经有了总体策略,是时候选择一种同态加密算法了。
Part 5:选择一种加密算法
同态加密是一个相对新兴的领域,主要的里程碑是Craig Gentry于2009年提出了第一个完全同态加密算法 。这个里程碑事件为许多后来者创造了一个立足点。大多数围绕同态加密的令人兴奋的成果正在被用于开发图灵完备(Turing
Complete)、同态加密的计算机。因此,为了一个完全同态方案而进行的探索力图找到一种可以高效并安全地计算出进行任意运算所需的各种各样的逻辑门数量的算法。总体上的希望就是人们可以将工作安全地转移到云端,而发送中的数据不存在被除了发送者之外的任何人读懂的风险。这是一个非常酷的想法,已经取得了很多进展。
但是,还存在一些缺点。通常,大多数完全同态加密方案和正常的计算相比是极其缓慢的(还不实用)。这已经引发了一个很有趣的研究方向,那就是限制运算符的数量成为部分同态的,这样至少可以执行一些运算。低灵活性但更快,这是计算中一种常见的折中方案。
这正是我们想开始看到的地方。理论上,我们想要一种操作浮点数(但是我们会安置整数,正如我们将看到的)而非二进制数的同态加密方案。二进制数可以工作,但是它不仅需要完全同态加密的灵活性(成本计算性能),我们还必须处理二进制的含义和我们想要操作的数学运算符之间的逻辑关系。一个不那么强大,为了浮点数运算量身打造的HE算法会是一个更好的匹配。
尽管有这种约束,但是仍有大量方案可供选择。这里有一些有我们喜欢的特性的方案。
· 基于整数矢量的高效同态加密及其应用(Efficient Homomorphic Encryption on Integer Vectors and Its Applications)
· 另一个部分同态加密(Yet Another Somewhat Homomorphic Encryption (YASHE))
· 有点实用性的完全同态加密(Somewhat Practical Fully Homomorphic Encryption (FV))
· 不自举的完全同态加密(Fully Homomorphic Encryption without Bootstrapping)
这里最好使用的可能是YASHE或FV。YASHE是流行的CryptoNets算法中使用的方法,对浮点数运算的支持非常好。但是,它相当的复杂。为了使这篇博客更易读和好玩些,我们将要使用的是有点低级(或许也更不安全 )的高效整数矢量同态加密。但是,我认为值得注意的是当你阅读这篇博客的时候,新的HE算法正处于被开发之中,而且这篇博客中出现的观点对于任何基于整数和(或)浮点数的加法和乘法同态的方案都是通用的。如果还有什么的话,我希望能提升HE的这种应用的认识,这样更多的HE算法将会被开发出来用于深度学习的优化。
这个加密算法在Yu, Lai, and Paylor这篇文章 也被广泛地提到并且在这里 还有相应的实现。这个方法的主要部分在C++文件vhe.cpp中。下面我们将要穿过这个代码的一个python端口,伴随解释说明发生了什么。如果你选择实现一个更高级的方案,这也将会是有用的,因为有相当通用的主题(普遍的函数名称,变量名称等)。
Part 6:Python中的同态加密
我们从了解一些同态加密的专业术语开始吧:
· 明文: 这是你的未加密数据。也被叫做“消息”。在我们这里,这将会是一堆数字,代表我们的神经网络。
· 密文: 这是你的已加密数据。我们将对密文做一些数学运算,这会改变潜在的明文。
· 公钥: 这是一个伪随机的数字串,任何人都可用它来加密数据。把它分享给别人也没事,因为(理论上)公钥只能被用来加密数据。
· 私钥: 这是一个伪随机的数字串,你可以用它来解密那些使用公钥加密的数据。你应该并不想把私钥分享给别人,否则,他们就可以解密你的消息。
那些是主要的移动部分。它们和不同的同态加密技术中的专有标准变量名称是一致的。。在这篇博文中,它们是下面这些:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课