机器学习很好玩(Machine Learning is Fun!
Machine Learning is Fun!
中文版:第一部,第二部,第三部,*第四部, *第五部](https://zhuanlan.zhihu.com/p/24590838),第六部
Part1: 世界上最简单的机器学习入门
机器学习的理念是,有一些通用算法可以告诉你有关一组数据的有趣信息,而无需编写任何特定于问题的自定义代码。您可以将数据提供给通用算法,而不是编写代码,并根据数据构建自己的逻辑。
您可以将机器学习算法视为两个主要类别之一 - 监督学习和无监督学习。差异很简单,但非常重要。
-
监督学习 -- 你知道问题的答案,并可以从那里向后工作以找出逻辑。
在有人监督的学习中,你让计算机为你解决这种关系。一旦你知道解决这一系列问题需要什么数学,你就可以回答同一类型的任何其他问题! -
无监督学习 -- 这有点像某人在一张纸上给你一个数字列表并说“我真的不知道这些数字是什么意思,但也许你可以弄清楚是否有模式或分组或者什么 - 祝你好运!”
那么这些数据怎么办?对于初学者,您可以使用一种算法自动识别数据中的不同细分市场。也许你会发现当地学院附近的购房者真的很喜欢有很多卧室的小房子,但郊区的购房者更喜欢有三居室的房子,有很多面积。了解这些不同类型的客户可以帮助指导您的营销工作。
你可以做的另一个很酷的事情就是自动识别出与其他一切不同的异常房屋。也许那些离群房屋是巨型房屋,你可以把最好的销售人员集中在这些区域,因为他们有更大的佣金。
第一个简单的例子是房价模型,构建一个线性函数。应用后例子如下:
0815a.png
但是观察发现结果不是很好的符合现实,要衡量这个误差,
假设您的数据集中有500个房屋销售,取总和除以500,得到每个房子的平均距离。将此平均误差量称为函数的成本。
我们的目标 - 通过尝试不同的权重,使这个成本尽可能低。
0815b.png
这是您的成本函数。
用机器学习术语说明就是:
0815d.png
θ代表您当前的权重。J(θ)表示“当前权重的成本”。
得到下面曲线:
0815e.png
我们的目标就是图中的最低点。寻找最低点的方法叫做批量梯度下降。
一些问题:
过度拟合 很容易想出一组权重,这些权重总是能够很好地预测原始数据集中房屋的价格,但实际上并不适用于原始数据集中没有的任何新房。但有一些方法可以解决这个问题(比如正规化和使用交叉验证数据集)。学习如何处理这个问题是学习如何成功应用机器学习的关键部分。
要记住机器学习只有在问题实际上 可以用您拥有的数据解决 时才有效。
这里还有一些会让你大吃一惊的事实:
- 在过去40年中,许多领域(如语言学/翻译)的研究表明,这些通用的学习算法“煽动数字炖”(我刚刚编写的一个短语)胜过真正的人试图提出明确的方法统治自己。机器学习的“哑”方法最终击败了人类专家。
- 你最终得到的功能是完全愚蠢的。它甚至不知道“平方英尺”或“卧室”是什么。所有它知道的是,它需要搅拌一些数量的这些数字才能得到正确的答案。
你很可能不知道为什么一组特定的权重会起作用。所以你刚刚编写了一个你并不真正理解的函数,但你可以证明它可以工作。 - 想象一下,您的预测功能不是采用“sqft”和“num_of_bedrooms”等参数,而是采用了一系列数字。假设每个数字代表安装在汽车顶部的摄像头拍摄的图像中一个像素的亮度。现在假设不是输出称为“价格”的预测,而是输出称为“degrees_to_turn_steering_wheel”的预测。你刚刚制作了一个可以让你自己驾驶汽车的功能!
Part2: 使用机器学习生成超级马里奥制作者级别
上面可以使用下面图形表示:
08150.png
如果房价背后的真相不是那么简单怎么办?例如,对于大房子和小房子来说,社区可能很重要但对于中型房屋来说并不重要。为了更聪明,我们可以使用不同的权重多次运行此算法,每个权重捕获不同的边缘情况:
https://medium.com/@ageitgey/machine-learning-is-fun-part-2-a26a10b68df3
从而得到上面的神经网络!每个节点都知道如何接受一组输入,对它们应用权重以及计算输出值。通过将大量这些节点链接在一起,我们可以对复杂函数进行建模。
为了保持这种简短(包括特征缩放和激活功能),我正在跳过很多,但最重要的部分是这些基本想法点击:
-
我们做了一个简单的估计函数,它接受一组输入并将它们乘以权重以得到输出。将这个简单的函数称为神经元。
神经元
简单的说神经元是神经网络的基本单元。神经元接受输入,对它们进行一些数学计算,并产生一个输出。
-
这里发生了3件事。首先,每个输入乘以一个权重; 接下来,所有加权输入与偏差b一起添加;最后,总和通过激活函数传递。
-
激活函数用于将无界输入转换为具有良好,可预测形式的输出。常用的激活函数是sigmoid函数:
-
通过将大量简单的神经元链接在一起,我们可以模拟太复杂的函数,无法通过单个神经元建模。
对于哪些激活功能最适合特定问题,没有明确的指南。这是一个试错过程,人们应该尝试不同的功能集,看看哪个功能最适合手头的问题。我们将介绍4种最常用的激活函数:
- Sigmoid函数( σ ):g(z) = 1 /(1 + e ^ { - z})。建议仅在输出层使用,以便我们可以轻松地将输出解释为概率,因为它限制了0到1之间的输出。在隐藏层上使用sigmoid函数的一个主要缺点是渐变非常接近在其域的大部分上为零,这使得学习算法学习起来变得缓慢和困难。
- 双曲正切函数:g(z) = (e ^ z -e ^ { - z})/(e ^ z + e ^ { - z})。它优于sigmoid函数,其输出的平均值非常接近于零,换句话说,激活单位的输出在零附近居中并使值的范围非常小,这意味着学习更快。它与sigmoid函数共享的缺点是在域的良好部分上梯度非常小。
- 整流线性单位(ReLU):g(z) = max {0,z}。接近线性的模型易于优化。由于ReLU共享线性函数的许多属性,因此它在大多数问题上都能很好地工作。唯一的问题是导数没有在z = 0处定义,我们可以通过在z = 0处将导数分配给0来克服。但是,这意味着对于z≤0,梯度为零,再次无法学习。
- 泄漏整流线性单位:g(z) = max {α* z,z}。它从RELU克服了零梯度问题,并分配α,其为小的值Ž ≤0。
如果您不确定选择哪个激活功能,请从ReLU开始。
我们现在并不真正关心准确率,因为我们可以做很多事情来提高准确性,这将是以下帖子的主题。以下是一些要点:
- 即使神经网络可以代表任何功能,也可能由于以下两个原因而无法学习:
-1 优化算法可能无法找到期望(真实)函数的参数的最佳值。它可以卡在局部最佳状态。
-2 由于过度拟合,学习算法可以找到与预期函数不同的不同函数形式。- 即使神经网络很少收敛并始终保持在局部最小值,它仍然能够显着降低成本并提出具有高测试精度的非常复杂的模型。
- 我们在这篇文章中使用的神经网络是标准的完全连接网络。但是,还有另外两种网络:
-1 卷积NN:并非所有节点都连接在一起。它是图像识别领域的佼佼者。
-2 循环NN:存在反馈连接,其中模型的输出被反馈回自身。它主要用于序列建模。- 完全连接的神经网络也会忘记前面步骤中发生的事情,也不知道有关输出的任何信息。
- 我们可以使用交叉验证来调整多个超参数,以获得我们网络的最佳性能:
-1 学习率(α):确定每次更新参数的步长。
A. 小α导致收敛慢,并且可能在计算上变得非常昂贵。
B. 大的α可能导致超调,我们的学习算法可能永远不会收敛。
-2. 隐藏层数(深度):隐藏层越多越好,但计算成本更高。
-3. 每个隐藏层的单元数(宽度):研究证明,每层的大量隐藏单元不会增加网络的改进。
-4. 激活功能:隐藏层上使用的功能因应用程序和域而异。尝试不同的功能并查看哪个功能最佳,这是一个试错过程。
-5. 迭代次数。- 标准化数据将有助于激活单元具有相似的值范围,并避免梯度失控。
https://medium.com/machine-learning-for-humans/supervised-learning-740383a2feab
机器学习中的一个常见问题是过度拟合:学习一种能够完美地解释模型所学习的训练数据的功能,但不能很好地概括为看不见的测试数据。当模型从训练数据中过度扩展到开始拾取不能代表现实世界中的模式的特性时,就会发生过度拟合。当您使模型变得越来越复杂时,这尤其成问题。欠拟合是一个相关问题,您的模型不够复杂,无法捕捉数据中的基本趋势。
两种打击过度拟合的方法:
1.使用更多培训数据。您拥有的越多,通过从任何单个训练示例中学习太多来过度拟合数据就越困难。
2.使用正规化。在损失函数中添加一个惩罚,用于构建一个模型,该模型为任何一个特征分配过多的解释力,或者允许考虑太多的特征。(超参数)
给我们的神经网络一个记忆
当我们想使用神经网络开发一个推荐下一个输入字符的算法,如下:
但是由于没有状态,它无法完成工作。
要使用神经网络解决这个问题,我们需要在模型中添加状态。每当我们向神经网络询问答案时,我们也会保存一组中间计算,并在下次作为输入的一部分重新使用它们。这样,我们的模型将根据最近看到的输入调整其预测。 0815f.png
这是 循环神经网络 的基本思想。我们每次使用它时都会更新网络。这允许它根据最近看到的内容更新其预测。它甚至可以随着时间的推移对模式建模,只要我们给它足够的内存。
我们看到了如何猜测海明威句子中的下一个字母。让我们尝试以海明威的风格制作一个完整的故事。
要做到这一点,我们将使用循环神经网络实现的是安德烈Karpathy写道。Andrej是斯坦福大学的深度学习研究员,他写了一篇关于用RNN生成文本的精彩介绍,你可以在github上查看模型的所有代码。
但真正引人注目的部分是该算法可以计算出任何数据序列中的模式。它可以轻松生成真实的食谱或虚假的奥巴马演讲。
我们可以将同样的想法应用于任何具有模式的顺序数据。
例如生成假的马里奥关卡。
递归神经网络算法是现实世界公司用来解决语音检测和语言翻译等难题的同类算法。
Part3: 深度学习和卷积神经网络
手写识别的问题
我们想用神经网络处理图像。我们如何将图像输入神经网络而不仅仅是数字?
答案简直令人难以置信。神经网络将数字作为输入。对于计算机来说,图像实际上只是一个数字网格,表示每个像素的暗度:
0815a1.gif
例如上面的8就可以使用324个数字的数组表示。但是当我们直接使用神经网络时会遇到问题:
0815a2.png
- 我们的神经网络比上次要大很多(324个输入而不是3个!)。但是任何现代计算机都可以处理具有几百个节点的神经网络而不会闪烁。
-
当字母没有完全居中于图像时,我们的“8”识别器完全无法工作。
对问题2,解决方法1是使用一个滑动窗口搜索居中的8,但是效率非常低。
另外一个就是使用“深度神经网络”,因为它比传统的神经网络有更多的层次。
0815a3.png
但是训练这么大的神经网络实在太慢了,无法发挥作用。
这时我们采用 卷积 的计算方法,步骤是:
-
将图像分解为重叠的图像切片
我们在整个原始图像上传递一个滑动窗口,并将每个结果保存为一个单独的微小图片块
-
将每个图像块馈送到小型神经网络中
0815a6.png
中间的小型神经网络也可以叫滤波器filter(带着一组固定权重的神经元),用于取出某个特征。引用卷积和滤波器介绍
值得一提的是:
左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。
如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。
当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。
比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。
与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,
这个权重不变即所谓的CNN中的参数(权重)共享机制。
再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。
btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,
所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。
-
将每个小图片的结果保存到一个新数组中
0815a7.png
-
进行池化,用于确定原始图像的哪些部分最有趣。
这里的想法是,如果我们在构成每个2x2网格方块的四个输入图块中的任何一个中发现了一些有趣的东西,我们将保留最有趣的位。这样可以减少阵列的大小,同时保留最重要的位。
0815a8.png
-
做出预测
到目前为止,我们已经将一个巨大的图像缩小为一个相当小的阵列。
你猜怎么着?那个数组只是一堆数字,所以我们可以使用那个小数组作为另一个神经网络的输入。最终的神经网络将决定图像是否匹配。为了区别于卷积步骤,我们将其称为“完全连接”网络。
所以从开始到结束,我们的整个五步管道看起来像这样:
0815a9.png
添加更多步骤
我们的图像处理管道是一系列步骤:卷积,最大池,最后是完全连接的网络。
在解决现实世界中的问题时,可以根据需要将这些步骤组合并堆叠多次!您可以拥有两个,三个甚至十个卷积层。您可以在任何地方放入最大池,以减小数据的大小。
基本的想法是从一个大图像开始,一步一步地将其逐渐煮沸,直到你最终得到一个结果。您拥有的卷积步骤越多,您的网络能够学会识别的功能就越复杂。
例如,第一个卷积步骤可能会学会识别锋利的边缘,第二个卷积步骤可能会使用它对尖锐边缘的识别来识别喙,第三步可能会使用它对喙等的知识来识别整个鸟类。
构建正确的网络
那么,您如何知道需要合并哪些步骤才能使图像分类器工作?
老实说,你必须通过做大量的实验和测试来回答这个问题。在找到要解决的问题的最佳结构和参数之前,您可能需要训练100个网络。机器学习涉及大量的反复试验!
关于准确率
假如我们的神经网络声称准确率为95%。但魔鬼在于细节。这可能意味着各种各样的事情。
例如,如果我们5%的训练图像是鸟类,而另外95%不是鸟类,那该怎么办?每次猜测“不是鸟”的程序将准确率达到95%!但它也将100%无用。
我们需要更仔细地查看数字而不仅仅是整体准确性。为了判断分类系统究竟有多好,我们需要仔细研究它是如何失败的,而不仅仅是它失败的时间百分比。
不要将我们的预测视为“正确”和“错误”,而是将它们分解为四个不同的类别 -
-
首先,这里有一些我们的网络正确识别为鸟类的鸟类。让我们称之为真阳性(True Positives):
-
其次,这是我们的网络正确识别为“不是鸟”的图像。这些被称为真阴性(True Negatives):
-
第三,这里有一些我们认为是鸟类但根本不是鸟类的图像。这些是我们的误报(False Positives):
-
最后,这里有一些我们没有正确认识为鸟类的鸟类图像。这些是我们的假阴性(False Negatives):
使用我们的15,000张图像验证集,这是我们的预测落入每个类别的次数:
0815b1.png
我们不仅仅考虑整体准确性,而是计算精度和召回指标。Precision和Recall指标让我们更清楚地了解我们的表现:
这告诉我们97%的时间我们猜到了“鸟”,我们是对的!但它也告诉我们,我们只在数据集中找到了90%的实际鸟类。换句话说,我们可能找不到每只鸟,但是当我们找到它时我们非常肯定!
正如我们描述的动物大脑检测抽象特征一样,隐藏层中的人工神经元将学会检测抽象概念 - 无论哪种概念最有用于捕获最多信息并最大限度地减少网络输出精度的损失(这是一个实例)在网络内发生的无监督学习)。
这是以模型可解释性为代价的,因为当您添加更多隐藏层时,神经元开始表示越来越抽象且最终难以理解的特征 - 以至于您可能听到深度学习被称为“黑盒优化”,其中您基本上只是随意地尝试一些东西,看看会发生什么,而不是真正了解内部发生了什么。
线性回归是可解释的,因为您决定在模型中包含哪些要素。深度神经网络更难以解释,因为这些特征是学习的,并且在英语的任何地方都没有解释。这一切都在机器的想象中。
一些扩展和进一步的概念值得注意
- 深度学习软件包。您很少需要从头开始实现神经网络的所有部分,因为现有的库和工具使深度学习实现更容易。其中有很多:TensorFlow,Caffe,Torch,Theano等等。
- 卷积神经网络(CNN)。CNN专门用于拍摄图像作为输入,并且对计算机视觉任务有效。它们也有助于深层强化学习。CNN受到动物视觉皮层工作方式的启发,它们是我们在本文中引用的深度学习课程的重点,斯坦福大学的CS231n。
- 递归神经网络(RNN)。RNN具有内置记忆感,非常适合语言问题。它们在强化学习中也很重要,因为它们使代理能够记录事物的位置以及历史上发生的事情,即使这些元素不是一次全部可见。Christopher Olah 在语言问题的背景下写了一篇关于RNN和LSTM 的精彩演练。
- 深层强化学习。这是深度学习研究中最激动人心的领域之一,其中最近取得的成就包括OpenAI击败专业Dota 2玩家以及DeepMind的AlphaGo在Go游戏中超越人类。我们将在第5部分深入探讨,但基本上我们的目标是将这篇文章中的所有技术应用于教授代理人以最大化奖励的问题。这可以应用于任何可以被游戏化的环境 - 从反恐精英或吃豆子等实际游戏,到自动驾驶汽车,交易股票,到(最终)现实生活和现实世界。
Part4: 深度学习的现代人脸识别
如何在一个非常复杂的问题上使用机器学习
到目前为止,在第1部分,2和3中,我们使用机器学习来解决只有一步孤立的问题- 估计房子的价格,生成基于现有数据的新数据,并告知如果图像包含的某个对象。所有这些问题都可以通过选择一种机器学习算法,输入数据并获得结果来解决。
但面部识别实际上是一系列相关问题:
- 首先,查看图片并找到其中的所有面孔
- 其次,专注于每张脸,并且能够理解即使脸部朝向奇怪的方向或光线不好,它仍然是同一个人。
- 第三,能够挑选出可以用来区别于其他人的脸部特征 - 例如眼睛有多大,脸部有多长等等。
- 最后,将该面孔的独特功能与您已知的所有人进行比较,以确定该人的姓名。
作为一个人,你的大脑有力地自动并立即完成所有这些。
计算机无法进行这种高级概括(至少还没有......),所以我们必须教他们如何分别完成这个过程中的每一步。
我们需要建立一个管道,分别解决人脸识别的每个步骤,并将当前步骤的结果传递给下一步。换句话说,我们将几个机器学习算法链接在一起:
检测面部的基本管道如何工作
第1步:面部轮廓: hog (亮度变化的方向指示人脸形状)
0815c2.gif
第2步:构成和投射面部:面部地标估计算法
[图片上传失败...(image-9c8624-1566397481164)]创建,他在OpenFace上[工作]
](https://img.haomeiwen.com/i3001141/c596bcd9dbc4205c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第3步:编码面部
对于我们人类来说显而易见的测量(如眼睛颜色)对于查看图像中单个像素的计算机来说并不真正有意义。研究人员发现,最准确的方法是让计算机找出测量结果来收集自己。在确定面部的哪些部分对于衡量时,深度学习比人类做得更好。
解决方案是训练深度卷积神经网络(就像我们在第3部分中所做的那样)。但是,我们不是像上次那样训练网络识别图片对象,而是训练它为每张脸生成128个测量值。
训练过程通过一次查看3张脸部图像来工作:
- 加载已知人员的训练面部图像
- 加载同一已知人物的另一张照片
- 加载完全不同的人的照片
然后,该算法查看它当前为这三个图像中的每一个生成的测量值。然后稍微调整神经网络,以确保它为#1和#2生成的测量值稍微靠近,同时确保#2和#3的测量结果稍微分开:
0815c5.png
在对数千个不同的人的数百万张图像重复这一步数百万次之后,神经网络学会可靠地为每个人生成128个测量值。同一个人的任何十张不同的照片应该给出大致相同的测量值。
这种训练卷积神经网络以输出面嵌入的过程需要大量的数据和计算机能力。即使使用昂贵的NVidia Telsa视频卡,也需要大约24小时的连续培训才能获得良好的准确性。
但是,一旦网络经过训练,它就可以为任何面部生成测量结果,甚至是以前从未见过的面部!所以这一步只需要做一次。
0815c6.png那么这些128个数字的哪些部分准确测量?事实证明我们不知道。这对我们来说并不重要。我们所关心的只是网络在查看同一个人的两张不同图片时会产生几乎相同的数字。
第4步:从编码中查找此人的姓名
您可以使用任何基本的机器学习分类算法来实现。不需要花哨的深度学习技巧。我们将使用简单的线性SVM分类器,但许多分类算法都可以工作。
Part5: 深度学习的语言翻译和序列的魔力
让计算机翻译
最简单的是单词翻译,然后添加特定于语言的规则以改善结果。
0815d1.png
0815d2.png
不幸的是,这只适用于简单,结构清晰的文档,如天气预报。它对于真实世界的文档并不可靠。
问题是人类语言不遵循一套固定的规则。人类语言充满了特殊情况,区域变化,并且只是破坏了规则。我们说英语的方式更多地受到几百年前入侵者的影响,而不是那些坐下来定义语法规则的人。
使用统计数据使计算机更好地翻译
在基于规则的系统失败之后,使用基于概率和统计而不是语法规则的模型开发了新的翻译方法。
构建基于统计的翻译系统需要大量的培训数据,其中完全相同的文本被翻译成至少两种语言。这种双翻译文本称为并行语料库。
基于概率的翻译系统与统计翻译系统的根本区别在于,他们不会尝试生成一个精确的翻译。相反,他们会产生数千种可能的翻译,然后他们对这些翻译进行排名,可能每种翻译都是正确的。
他们通过与训练数据的相似程度来估计“正确”的东西。以下是它的工作原理:
第1步:将原始句子分成块
首先,我们将句子分解成简单的块,每个块都可以轻松翻译。
第2步:查找每个块的所有可能的翻译。
0815d3.png
其中一些可能的翻译比其他翻译更常用。根据每个翻译在我们的培训数据中出现的频率,我们可以给它一个分数。
第3步:生成所有可能的句子并找到最可能的句子。
为此,我们将每个生成的句子与用英语写成的书籍和新闻故事中的数百万个真实句子进行比较。我们可以获得的英语文本越多越好。
但看看这个可能的翻译:
我想要| 去| 到| 最漂亮的 海滩。
这句话与我们的训练集中的某些内容类似,因此它将获得高概率分数。
在尝试了所有可能的句子之后,我们将选择具有最可能的块翻译的句子,同时也是与真实英语句子最相似的句子。
如果您给他们足够的训练数据,统计机器翻译系统比基于规则的系统执行得更好。Franz Josef Och对这些想法进行了改进,并在21世纪初使用它们构建谷歌翻译。机器翻译终于可以为全世界所用。
在早期,每个人都感到惊讶的是,基于概率的“哑”翻译方法比语言学家设计的基于规则的系统更有效。这导致了80年代研究人员的一种(有点意思)说法:
“每当我解雇一名语言学家,我的准确率就会提高。”
统计机器翻译的局限性
统计机器翻译系统运行良好,但构建和维护起来很复杂。您要翻译的每对新语言都需要专家调整和调整新的多步骤转换管道。
因为构建这些不同的管道需要做很多工作,所以必须进行权衡。如果你要求谷歌将格鲁吉亚语翻译成Telegu,它必须在内部将其翻译成英语作为中间步骤,因为没有足够的Georgain-to-Telegu翻译来证明在该语言对中投入大量资金是合理的。并且它可能使用不太先进的翻译管道进行翻译,而不是如果您要求更常见的法语 - 英语选择。
如果我们能让计算机为我们完成所有烦人的开发工作,那不是很酷吗?
让计算机转化得更好 - 没有所有那些昂贵的人
机器翻译的圣杯是一个黑匣子系统,它通过查看训练数据来学习如何自行翻译。通过统计机器翻译,人们仍然需要构建和调整多步统计模型。
2014年,KyungHyun Cho的团队取得了突破。他们找到了一种方法来应用深度学习来构建这个黑盒系统。他们的深度学习模型采用并行语料库,并使用它来学习如何在这两种语言之间进行翻译而无需任何人为干预。
两个重要的想法使这成为可能 - 循环神经网络和编码。通过巧妙地结合这两个想法,我们可以建立一个自学翻译系统。
循环神经网络
常规(非循环)神经网络是一种通用机器学习算法,它接收数字列表并计算结果(基于先前的训练)。神经网络可以用作黑盒子来解决许多问题。例如,我们可以使用神经网络根据房屋的属性计算房屋的近似值:
循环神经网络(或RNN的简称) 是其中神经网络的先前状态是输入到下一个计算一个神经网络的略微调整了的版本。这意味着先前的计算会改变未来计算的结果!
0815d5.png
这个技巧允许神经网络学习数据序列中的模式。例如,您可以使用它根据前几个单词预测句子中下一个最可能的单词:
这是您可以为智能手机的键盘应用程序实现“自动更正”的一种方法
只要您想学习数据模式,RNN就很有用。
由于人类语言只是一种大而复杂的模式,因此RNN越来越多地应用于自然语言处理的许多领域。
编码
将面转换为测量列表的想法是编码的示例。我们正在获取原始数据(面部图片)并将其转换为表示它的测量列表(编码)。
但就像我们在第4部分中看到的那样,我们不需要提出一个特定的面部特征列表来衡量自己。相反,我们可以使用神经网络从面部生成测量结果。计算机可以比我们更好地确定哪些测量最能区分两个相似的人:
这是我们的编码。它让我们用简单的东西(128个数字)来表示非常复杂的东西(一张脸的图片)。现在比较两个不同的面部要容易得多,因为我们只需比较每个面部的这128个数字而不是比较完整的图像。
你猜怎么着?我们可以用句子做同样的事情!我们可以提出一种编码,将每个可能的不同句子表示为一系列唯一数字:
这个数字列表代表英文句子“机器学习很有趣!”。不同的句子将由一组不同的数字表示。
为了生成这种编码,我们将把句子送入RNN,一次一个字。处理完最后一个单词后的最终结果将是表示整个句子的值:
因为RNN具有通过它的每个单词的“记忆”,所以它计算的最终编码表示句子中的所有单词。很好,所以现在我们有办法将整个句子表示为一组唯一数字!我们不知道编码中的每个数字意味着什么,但它并不重要。只要每个句子由它自己的一组数字唯一标识,我们就不需要确切地知道这些数字是如何生成的。
让我们翻译吧!
好的,我们知道如何使用RNN将句子编码成一组唯一数字。这对我们有什么帮助?事情变得非常酷!
如果我们采用两个RNN并将它们端到端连接怎么办?第一个RNN可以生成代表句子的编码。然后第二个RNN可以采用该编码,并且反向执行相同的逻辑以再次解码原始句子:
1.png当然能够再次对原始句子进行编码然后解码并不是很有用。但是,如果(这是一个好主意!)我们可以训练第二个RNN将句子解码为西班牙语而不是英语?我们可以使用我们的并行语料库训练数据来训练它:
1.png就像那样,我们有一种将英语单词序列转换成等同的西班牙语单词序列的通用方法!
这是一个强大的想法:
这种方法主要受限于您拥有的训练数据量以及您可以投入的计算机能量。机器学习研究人员两年前才发明了这一点,但它的表现和统计机器翻译系统的表现已有20年的历史。
这不取决于了解任何有关人类语言的规则。该算法自己计算出这些规则。这意味着您不需要专家来调整翻译流程的每一步。电脑为你做到了。
这种方法适用于 几乎任何类型的序列到序列问题!事实证明,许多有趣的问题是序列到序列的问题。继续阅读其他可以做的很酷的事情!
序列到序列模型的荒谬力量
那么我们还能用序列到序列模型做些什么呢?
大约一年前,Google的研究人员表明,您可以使用序列到序列模型来构建AI机器人。这个想法非常简单,它的功能令人惊叹。
首先,他们捕获了Google员工与Google技术支持团队之间的聊天记录。然后,他们训练了一个序列到序列模型,其中员工的问题是输入句子,技术支持团队的回答是该句子的“翻译”。
1.png当用户与机器人交互时,他们将使用该系统“翻译”每个用户的消息以获得机器人的响应。
最终结果是一个半智能机器人,可以(有时)回答真正的技术支持问题。这里有一个用户和机器人之间的一个示例对话的一部分,从他们的文章:
Human: connection refused or something like that
Machine: may i know the version of network connect you connect?
Human: i am not sure i know that
Machine: is the network connect prompting for any user certificate?
Human: yes
Machine: are you at home or at work at the moment? office?
Human: i am at home
Machine: try this. goto <URL redacted> page and enter your name and password
Human: done
Machine: try logging in with <NAME redacted> and check if its working fine now
Human: yes, now it works!
Machine: great. anything else that i can help?
这只是可能性的开始。我们不仅限于将一个句子转换成另一个句子。也可以制作可以将图像转换为文本的图像到序列模型!
谷歌的另一个团队通过用卷积神经网络取代第一个RNN(就像我们在第3部分中学到的那样)来做到这一点。这允许输入是图片而不是句子。其余的工作方式基本相同:
image.png就这样,我们可以将图片转换成文字(只要我们有大量的培训数据)!
Andrej Karpathy 对这些想法进行了扩展,以构建一个能够通过分别处理图像的多个区域来详细描述图像的系统:
<figcaption style="box-sizing: border-box; display: block;">从图像本文通过安德烈Karpathy</figcaption>
这使得构建能够查找与奇怪的特定搜索查询匹配的图像的图像搜索引擎成为可能:
甚至有研究人员研究反向问题,只根据文字描述生成整个图片!
仅从这些例子中,您可以开始想象可能性。到目前为止,从语音识别到计算机视觉的各个方面都有序列到序列的应用。我打赌明年还会有更多。
Part6: 如何通过深度学习进行语音识别
语音识别已经存在了几十年,那为什么它现在才成为主流呢?原因在于深度学习最终使语音识别准确到足以在精心控制的环境之外有用。
Andrew Ng长期以来预测,随着语音识别从95%准确到99%准确,它将成为我们与计算机交互的主要方式。这个想法是,这4%的准确度差距是烦人的不可靠和非常有用的差异。感谢深度学习,我们终于达到了顶峰。
让我们学习如何通过深度学习进行语音识别!
机器学习并不总是黑盒子
如果你知道神经机器翻译是如何工作的,你可能会猜到我们可以简单地将录音输入神经网络并训练它来产生文本:
这是深度学习的语音识别的圣杯,但我们还没有完全存在(至少在我写这篇文章的时候 - 我打赌我们将会在几年内)。
最大的问题是语音速度不同。一个人可能会很快说“你好!”而另一个人可能会非常缓慢地说“heeeelllllllllllllooooo!”,从而生成一个包含更多数据的更长声音文件。两个声音文件都应该被识别为完全相同的文本 - “你好!”自动将各种长度的音频文件对齐到固定长度的文本结果相当困难。
要解决这个问题,除了深度神经网络之外,我们还必须使用一些特殊的技巧和额外的进动。让我们看看它是如何工作的!
把声音变成比特
进行采样 - 采样的速度至少是我们想要记录的最高频率的两倍。
1.gif
预处理我们的采样声音数据
我们现在有一个数字数组,每个数字代表声波的振幅,以1/16,000秒为间隔。
我们可以将这些数字直接输入神经网络。但是试图通过直接处理这些样本来识别语音模式是困难的。相反,我们可以通过对音频数据进行一些预处理来使问题更容易。
让我们首先将我们的采样音频分组为20毫秒长的块。
将这些数字绘制为简单的折线图,可以在20毫秒的时间内粗略估计原始声波:
为了使神经网络更容易处理这些数据,我们将把这个复杂的声波分解成它的组成部分。我们将打破低音调部分,下一个最低音调部分,等等。然后通过计算每个频段(从低到高)的能量,我们为此音频片段创建了各种指纹。
想象一下,你有一个人在钢琴上演奏C大调和弦的录音。那个声音是三个音符C,E和G的组合 - 所有音符都混合成一个复杂的声音。我们希望将复杂的声音分解为单个音符,以发现它们是C,E和G.这是完全相同的想法。
我们使用称为傅立叶变换的数学运算来完成此操作。它将复杂的声波分解成简单的声波。一旦我们获得了那些单独的声波,我们就会计算每个声波中包含多少能量。
最终结果是每个频率范围的重要性得分,从低音(即低音)到高音。下面的每个数字代表我们20毫秒音频剪辑的每个50赫兹频段的能量:
1.png但是当您将其绘制为图表时,这将更容易看到:
您可以看到,我们的20毫秒声音片段具有大量的低频能量,并且在较高频率下没有太多能量。这是典型的“男性”声音。如果我们在每20毫秒的音频块上重复这个过程,我们最终得到一个频谱图(每个列从左到右是一个20ms的块):
“hello”声音片段的完整频谱图现在我们的音频格式易于处理,我们将其提供给深度神经网络。神经网络的输入将是20毫秒的音频块。对于每个小音频切片,它将尝试找出与当前所说声音相对应的字母。
1.png我们将使用循环神经网络 - 即具有影响未来预测的记忆的神经网络。这是因为它预测的每个字母都会影响它预测下一个字母的可能性。例如,如果到目前为止我们已经说过“HEL”,那么我们很可能会在“Hello”字样旁边说“LO”。我们不太可能会像“XYZ”那样说一些不可发音的东西。因此,对先前预测的记忆有助于神经网络进行更准确的预测。
在我们通过神经网络(一次一个块)运行我们的整个音频剪辑之后,我们最终会得到每个音频块到该块中最有可能说出的字母的映射。这是我对“你好”的映射看起来的样子:
1.png
我们的神经网络预测我说的一个可能的东西是“HHHEE_LL_LLLOOO”。但它也认为有可能我说“HHHUU_LL_LLLOOO”甚至“AAAUU_LL_LLLOOO”。
我们有一些步骤来清理这个输出。首先,我们将替换任何重复字符的单个字符:
HHHEE_LL_LLLOOO变为HE_L_LO
HHHUU_LL_LLLOOO变为HU_L_LO
AAAUU_LL_LLLOOO变为AU_L_LO
然后我们将删除任何空白:
HE_L_LO变为HELLO
HU_L_LO变成了HULLO
AU_L_LO变为AULLO
这给我们留下了三个可能的转录 - “Hello”,“Hullo”和“Aullo”。如果你大声说出来,所有这些听起来都像“你好”。因为它一次预测一个角色,神经网络将提出这些非常响亮的转录。例如,如果你说“他不会去”,它可能会给出一个可能的转录“He wud net go”。
诀窍是将这些基于发音的预测与基于书面文本(书籍,新闻文章等)的大型数据库的似然分数相结合。你扔掉似乎最不可能真实的转录,并保持看起来最真实的转录。
在我们可能的转录“Hello”,“Hullo”和“Aullo”中,显然“Hello”将更频繁地出现在文本数据库中(更不用说在我们原始的基于音频的训练数据中),因此可能是正确的。所以我们选择“Hello”作为我们的最终转录而不是其他转录。完成!
不承认“Hullo”是一种合理的行为,但有时你会发现烦人的情况,你的手机只是拒绝理解你说的有效的东西。这就是为什么这些语音识别模型总是被重新训练,有更多数据来修复这些边缘情况。
关于机器学习最酷的事情之一就是它有时看起来有多简单。你获得了大量数据,将其输入到机器学习算法中,然后神奇地你在游戏笔记本电脑的视频卡上运行了一个世界级的AI系统...... 对吗?
在某些情况下,这种情况确实如此,但不适用于语言。认识到语言是一个难题。您必须克服几乎无限的挑战:质量差的麦克风,背景噪音,混响和回声,重音变化等等。所有这些问题都需要存在于您的训练数据中,以确保神经网络能够处理它们。
Part7: 滥用生成的对抗网络来制作8位像素艺术
一年多以前,Alec Radford(以Ian Goodfellow的作品为基础)发表了一篇论文,改变了大家对机器学习建立生成模型的看法。新系统称为深度卷积生成对抗网络(简称DCGAN)。
DCGAN能够通过使用两个相互竞争的深度神经网络的巧妙组合来幻觉化原始照片般逼真的图像。所有这些卧室照片都是由DCGAN设想的:
生成模型的目标
那么,为什么人工智能研究人员正在构建复杂的系统来生成略显难看的卧室照片呢?
我们的想法是,如果你能够生成某些东西的图片,你就必须对它有所了解。
但对于计算机而言,图片只是表示每个像素颜色的数字网格。计算机不了解图片代表一个概念。
但现在想象一下,我们向计算机展示了成千上万张狗的照片,看完这些照片后,电脑就能够自己生成新的狗图片 - 包括不同的犬种和不同角度的图片。也许我们甚至可以询问某些类型的图片,比如“比格犬的侧视图”。
如果计算机能够做到这一点并且它生成的图片具有正确数量的腿,尾巴和耳朵,那么即使没有人明确告诉它,计算机也会知道构成“狗”的部分是什么。所以从某种意义上说,一个好的生成模型就是基本理解的证明 - 至少在幼儿一级。
这就是研究人员对构建生成模型如此兴奋的原因。它们似乎是一种训练计算机理解概念的方法,而没有明确地教导这些概念的含义。这是目前系统的一大步,只能从人类精心预先标记的训练数据中学习。
DCGAN如何运作
为了构建DCGAN,我们创建了两个深度神经网络。然后我们让他们互相斗争,无休止地试图彼此做对。在这个过程中,他们都变得更强大。
让我们假装第一个深度神经网络是一个全新的警察,正在接受培训,以发现假币。它的工作是看一张照片并告诉我们这张照片是否包含真钱。
由于我们正在寻找图片中的对象,我们可以使用标准的卷积神经网络来完成这项工作。如果您不熟悉ConvNets,可以阅读我之前的帖子。但基本思想是神经网络接收图像,通过几层识别图像中越来越复杂的特征,然后输出单个值 - 在这种情况下,无论图像是否包含真实图像钱。
第一个神经网络称为判别器
现在让我们假装第二个神经网络是一个全新的伪造者,他正在学习如何创造假钱。对于第二个神经网络,我们将在正常的ConvNet中反转层,以便一切都向后运行。因此,它不是接收图片并输出值,而是接收值列表并输出图片。
第二个神经网络叫做Generator:
Generator
所以现在我们有一名警察(判别者,Discriminator)正在寻找假钱和伪造者(Generator)正在打印假币。让他们战斗吧!
在第一轮,发电机将创造可怜的伪造,几乎不像钱,因为它完全不知道钱应该是什么样子:
Generator生成第一个(可怕的)假美元
但是现在鉴别者在识别金钱方面同样可怕,所以它不会知道区别:
鉴别器(Discriminator)以为美元是真的
在这一点上,我们介入并告诉判别者这个美元钞票实际上是假的。然后我们向它展示一个真正的美元钞票,并询问它与假钞的看法有何不同。Discriminator寻找新的细节,以帮助它将真实的和真假的分开。
例如,判别者可能会注意到真钱有一个人的照片,假钱没有。使用这些知识,鉴别器学习如何从真实的假人那里告诉假货。它的工作变得更好一些:
鉴别器(Discriminator)升级了!它现在可以发现非常糟糕的假美元。
现在我们从第2轮开始。我们告诉伪造者(Generator)它的钱图像突然被拒绝为假,所以它需要加强它的游戏。我们还告诉它,鉴别者现在正在寻找面孔,所以混淆鉴别者的最好方法是在账单上加油:
伪造者(Generator)使假币价格略微好一些
假票再次被接受为有效!因此,现在鉴别者必须再次关注真正的美元并找到一种新的方式来区分它与假货。
伪造者(Generator)和鉴别器之间的这种来回游戏持续数千次,直到两个网络都是专家。最终,伪造者(Generator)正在生产近乎完美的假冒产品,并且鉴别器已经变成了一名主侦探,寻找最轻微的错误。
当两个网络都经过充分训练以便人们对假图像印象深刻时,我们可以将假图像用于我们想要的任何目的。
Part8: 如何故意欺骗神经网络
几乎只要程序员编写计算机程序,计算机黑客就一直在想办法利用这些程序。恶意黑客利用程序中最微小的漏洞闯入系统,窃取数据并且通常会造成严重破坏。
但是,深度学习算法驱动的系统应该不受人为干扰,对吗?黑客如何通过受TB级数据训练的神经网络?
事实证明,即使是最先进的深度神经网络也很容易被愚弄。通过一些技巧,您可以强制他们预测您想要的任何结果:
我修改了这张猫图片,因此它被认为是烤面包机。
因此,在您启动由深度神经网络驱动的新系统之前,让我们确切地了解如何打破它们以及您可以采取哪些措施来保护自己免受攻击者攻击。
神经网络作为安全卫士
让我们想象一下,我们经营一个像Ebay这样的拍卖网站。在我们的网站上,我们希望阻止人们销售违禁物品 - 如活体动物。
如果您有数百万用户,那么执行这些规则很难。我们可以雇佣数百人手动审查每一个拍卖品,但这样做会很昂贵。相反,我们可以使用深度学习来自动检查拍卖照片中的违禁物品,并标记违反规则的物品。
这是典型的图像分类问题。为了构建这个,我们将训练一个深度卷积神经网络来告诉禁止的项目除了允许的项目,然后我们将通过它运行我们网站上的所有照片。
首先,我们需要来自过去拍卖列表的数千张图像的数据集。我们需要允许和禁止物品的图像,以便我们可以训练神经网络来区分它们:
image.png为了训练神经网络,我们使用标准的反向传播算法。这是一个算法,我们传入训练图片,传递该图片的预期结果,然后走回神经网络中的每一层,稍微调整它们的权重,使它们更好地为该图片生成正确的输出:
image.png我们用数千张照片重复这几千次,直到模型以可接受的准确度可靠地产生正确的结果。
最终结果是一个可以可靠地分类图像的神经网络:
image.png注意:如果您想了解卷积神经网络如何识别图像中对象的更多细节,请参阅第3部分。
但事情并不像他们看起来那么可靠......
卷积神经网络是强大的模型,在对其进行分类时会考虑整个图像。它们可以识别复杂的形状和图案,无论它们出现在图像中的哪个位置。在许多图像识别任务中,它们可以等于甚至超过人类的表现。
使用这样的花哨模型,将图像中的几个像素更改为更暗或更亮应该不会对最终预测产生很大影响,对吧?当然,它可能会略微改变最终可能性,但它不应该将图像从“禁止”翻转到“允许”。
我们的期望:输入照片的微小变化只会导致最终预测的微小变化。但在2013年一篇名为神经网络的迷人属性的着名论文中,人们发现这并非总是如此。如果您确切地知道要更改哪些像素以及确切地更改它们的数量,您可以有意地强制神经网络预测给定图片的错误输出,而不会非常改变图片的外观。
这意味着我们可以有意识地制作一幅明显是禁止物品但完全愚弄我们神经网络的图片:
image.png为什么是这样?机器学习分类器通过在它试图区分的事物之间找到分界线来工作。以下是一个简单的二维分类器在图表上的样子,该分类器学会将绿点(可接受)与红点分开(禁止):
image.png现在,分类器可以100%准确地工作。它找到了一条线,将所有绿点与红点完美分开。
但是,如果我们想把它误将其中一个红点分类为绿点呢?我们可以移动一个红点以将其推入绿色领域的最低金额是多少?
如果我们在边界旁边的红点的Y值上添加一小部分,我们几乎可以将它推到绿色区域:
image.png因此,为了欺骗分类器,我们只需要知道哪个方向轻推这个点就可以了解它。如果我们不想过于明显地表现出邪恶,理想情况下我们会尽可能少地提出这一点,这样看起来就像是一个诚实的错误。
在使用深度神经网络的图像分类中,我们分类的每个“点”是由数千个像素组成的整个图像。这为我们提供了数以千计的可能值,我们可以调整这些值来推动决策线的重点。如果我们确保以一种对人类来说不太明显的方式调整图像中的像素,我们可以欺骗分类器而不会使图像看起来被操纵。
换句话说,我们可以拍摄一个物体的真实照片并稍微改变像素,以便图像完全欺骗神经网络,使其认为图片是其他东西 - 我们可以准确地控制它检测到的对象:
image.png<figcaption style="box-sizing: border-box; display: block;">把猫变成烤面包机。图像检测来自Keras.js基于Web的演示</figcaption>
如何欺骗神经网络
我们已经讨论了训练神经网络对照片进行分类的基本过程:
- 喂养训练照片。
- 检查神经网络的预测,看看距离正确答案有多远。
- 使用反向传播调整神经网络中每层的重量,使最终预测略微接近正确答案。
- 用几千张不同的训练照片重复步骤1-3几千次。
但是,如果不是调整神经网络层的权重,而是调整输入图像本身直到我们得到我们想要的答案呢?
因此,让我们采用已经训练过的神经网络并再次“训练”它。但是让我们使用反向传播来调整输入图像而不是神经网络层:
image.png所以这是新算法:
- 输入我们要破解的照片。
- 检查神经网络的预测,看看我们想要为这张照片得到的答案离我们有多远。
- 使用反向传播调整我们的照片,使最终预测稍微接近我们想要得到的答案。
- 使用相同的照片重复步骤1-3几千次,直到网络给我们想要的答案。
在这结束时,我们将有一个图像,愚弄神经网络而不改变神经网络本身内部的任何东西。
唯一的问题是,通过允许任意单个像素进行调整而没有任何限制,对图像的更改可能非常激烈,您将看到它们。它们会出现变色点或波浪状区域:
image.png<figcaption style="box-sizing: border-box; display: block;">一个被黑客攻击的图像,对像素的调整量没有限制。你可以看到猫周围的绿色斑点和白墙上的波浪图案。</figcaption>
为了防止这些明显的扭曲,我们可以为我们的算法添加一个简单的约束。我们会说,被黑客图像中的任何一个像素都不会被原始图像中的一小部分变化 - 比方说0.01%。这迫使我们的算法以一种仍然欺骗神经网络的方式调整图像,而不会看起来与原始图像有太大的不同。
以下是添加该约束时生成的图像的样子:
image.png<figcaption style="box-sizing: border-box; display: block;">生成的黑客图像限制了可以更改任何单个像素的数量。</figcaption>
即使该图像看起来与我们相同,它仍然愚弄神经网络!
让我们编码吧
为了编码,首先我们需要一个预先训练好的神经网络来愚弄。我们不是从头开始训练,而是使用谷歌创建的。
Keras是一种流行的深度学习框架,它带有几个预先训练好的神经网络。我们将使用其经过预先训练的Google的Inception v3深度神经网络副本来检测1000种不同类型的对象。
这是Keras中使用这个神经网络识别图片中的内容的基本代码。在运行之前,请确保安装了Python 3和Keras:
当我们运行它时,它正确地检测我们的图像为波斯猫:
<pre style="box-sizing: border-box; font-size: 13px; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; display: block; padding: 9.5px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; color: rgb(51, 51, 51); border: 1px solid rgb(204, 204, 204); background-color: rgb(250, 250, 250); border-radius: 3px; margin: 20px 0px; overflow: auto;">$ python3 predict.py这是一个有85.7%置信度的Persian_cat!</pre>
现在让我们通过调整图像直到它愚弄神经网络来欺骗它以为这只猫是烤面包机。
Keras没有内置的方法来训练输入图像而不是训练神经网络层,所以我不得不有点棘手并且手动编写训练步骤。
这是代码:
如果我们运行它,它最终会吐出一个会欺骗神经网络的图像:
<pre style="box-sizing: border-box; font-size: 13px; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; display: block; padding: 9.5px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; color: rgb(51, 51, 51); border: 1px solid rgb(204, 204, 204); background-color: rgb(250, 250, 250); border-radius: 3px; margin: 20px 0px; overflow: auto;">$ python3 generated_hacked_image.py 模型预测图像是烤面包机的可能性:0.00072%[......数千行训练....] 模型预测图像是烤面包机的可能性:99.4212%</pre>
注意:如果您没有GPU,则可能需要几个小时才能运行。如果您确实使用Keras和CUDA*正确配置了GPU *,则运行时间不应超过几分钟。
现在让我们再次测试刚刚通过原始模型运行的被攻击图像:
<pre style="box-sizing: border-box; font-size: 13px; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; display: block; padding: 9.5px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; color: rgb(51, 51, 51); border: 1px solid rgb(204, 204, 204); background-color: rgb(250, 250, 250); border-radius: 3px; margin: 20px 0px; overflow: auto;">$ python3 predict.py 这是一台98.09%信心的烤面包机!</pre>
我们做到了!我们欺骗神经网络以为猫是烤面包机!
我们可以用黑客图像做什么?
创建这样的被黑客图像称为“生成对抗性示例”。我们故意制作一个数据,以便机器学习模型对它进行错误分类。这是一个巧妙的技巧,但为什么这在现实世界中很重要?
研究表明,这些被黑客攻击的图像具有一些令人惊讶的特性:
- 黑客图像即使在纸上打印出来也仍然可以欺骗神经网络!因此,您可以使用这些被黑客攻击的图像来欺骗物理相机或扫描仪,而不仅仅是直接上传图像文件的系统。
- 欺骗一个神经网络的图像倾向于欺骗具有完全不同设计的其他神经网络,如果它们是在类似数据上训练的话。
因此,我们可以利用这些被黑客入侵的图片做很多事情!
但是我们如何创建这些图像仍然存在很大的局限性 - 我们的攻击需要直接访问神经网络本身。因为我们实际上正在“训练”反对神经网络以欺骗它,我们需要它的副本。在现实世界中,没有公司会让你下载他们训练好的神经网络的代码,这意味着我们无法攻击他们......对吗?
不!研究人员最近表明,你可以训练自己的替代神经网络来探测另一个神经网络,探测它是如何表现的。然后你可以使用你的替代神经网络生成被盗的图像,这些图像仍然经常欺骗原始网络!这称为黑盒攻击。
黑盒攻击的应用是无限的。以下是一些似是而非的例子:
- 哄骗自驾车看到停车标志为绿灯 - 这可能导致车祸!
- 欺骗内容过滤系统,通过提供攻击性/非法内容。
- 欺骗ATM检查扫描仪认为检查上的笔迹说检查的数量实际上是更大的数量(如果你被抓住可能会有合理的拒绝!)
而这些攻击方法并不仅限于图像。您可以使用相同类型的方法来欺骗处理其他类型数据的分类器。例如,您可以欺骗病毒扫描程序将您的病毒识别为安全代码!
我们如何保护自己免受这些攻击?
所以现在我们知道可以欺骗神经网络(以及所有其他机器学习模型),我们如何防御这种情况?
简短的回答是,没有人完全确定。防止这类攻击仍然是一个持续不断的研究领域。跟上最新发展的最佳方法是阅读由该领域最有影响力的两位研究人员Ian Goodfellow和Nicolas Papernot维护的聪明人博客。
但到目前为止我们确实知道一些事情:
- <mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">如果您只是创建大量被黑客入侵的图像并将其包含在您的训练数据集中,那么这似乎会使您的神经网络更能抵御这些攻击。这称为对抗训练</mark> 并且可能是现在考虑采用的最合理的防守。
- 还有另一种称为防御蒸馏的有效方法,您可以训练第二个模型来模仿原始模型。但这种方法是新的,相当复杂,所以除非你有专门的需求,否则我不会投资。
- 迄今为止,研究人员尝试过的其他任何想法都无法帮助预防这些攻击。
由于我们还没有任何最终答案,因此值得考虑使用神经网络的场景,以便至少可以降低此类攻击会对您的业务造成损害的风险。
例如,如果您将单个机器学习模型作为授予对受限资源的访问权限的唯一防线,并假设它不能被愚弄,那可能是个坏主意。但是如果你将机器学习作为一个仍然需要人工验证的过程中的一个步骤,那可能就好了。
换句话说,在您的架构中处理机器学习模型,就像任何其他可能被绕过的组件一样。想一想如果用户故意开始愚弄他们并想出减轻这些情况的方法会发生什么的影响。