自从电脑诞生后,人类就有一个梦想,让它像人类一样思考。随着人工智能技术的飞速发展,计算机的思考能力突飞猛进,在很多方面已经通过了所谓的“图灵测试”。特别是在深度学习这一领域技术上,电脑不但具备了很多原以为人类才可能具备的能力,而且某些认知能力已经超过了人的水平,例如在神经网络技术的支持下,电脑在图片识别上的准确率已经超过了人类。
然而电脑目前只具备识别力很难具有像人一样的创造力。识别力是你能知道这是个什么东西,然而创造力要求你在某个东西还没存在前你就能想象它,同时你还能将它创造出来,就像乔布斯创造iPhone那样。随着技术不断进步,人类在识别能力上与计算机比拼时会节节败退,唯有创造力领域计算机暂时还无法撼动,但这种情况正在发生变化。
近年来兴起一种全新深度学习技术叫生成型对抗性网络,它能让计算机具备创造力。前不久流行一种人工智能应用叫“变老相机”,用它给现在的你拍摄一张照片,它能够显示出你七八十岁的样子。同时现在还有一种天衣无缝的换脸技术,你对着摄像头说一段话,然后可以把你的脸换成任何一个人,而且这张脸能像你一样说相同的话,面部表情,脸部肌肉,嘴型变化跟你一模一样,也就是几乎没有人能发觉其中的猫腻,除了你之外,这种技术也引发了有关公共安全的广泛担忧。
本课程的目的就是想要以通俗易懂的方式将这种技术介绍给你,通过步步为营的方式让你扎实的掌握这种先进的前沿人工智能技术。首先我们比较一下这种技术与以前能识别图片的技术有什么区别。传统神经网络的功能在于,当它经过大量的数据训练后,它能够认知新数据,例如给定大量的猫狗图片给网络训练后,以后传给他新的图片时,它就能识别图片中是猫还是狗:
生成型网络在于,把大量猫狗图片对他进行训练后,它能够绘制出一只猫或狗的图片,图片里的猫或狗跟它用于训练时的图片不一样,这意味着它在原来识别过图片的基础上进行了创新,就像乔布斯从原来电话形态中创新出iPhone一样,iPhone是一种电话,但与以前的电话又决然不同,例如让网络识别很多人脸图片后网络能创造出不存在但你根本无法识别出它是假的人脸图片:
如上图,我告诉你左边三张大图所示的人脸是计算机虚拟出来的,你会不会觉得异常震惊。接下来我们看看网络是如何构造让人根本无法分辨真假的原理来的。假设我们现在有50个不同类型的人偶,如下图:
人偶主要有几个特征不同,第一是发型,第二是头发颜色,第三是眼镜类型,第四是衣服颜色,第五是衣服类型。根据观察发型有7中不同类别,头发颜色有6种类别,眼镜有3种类别,衣服的类型有4种,衣服颜色有8种,因此总共可以形成的搭配总数有7*6*3*4*8=4032种,那么我们怎么生成新类型的人偶呢,诀窍在于“混搭”,也就是从不同特征中选择一种形成当前图片中没有的风格。
但是“混搭”可不是蒙着眼睛随便乱来,我们需要在当前给定情况下进行合理搭配。当前有50个人偶,于是给定样本量就是50,我们先统计不同类型特征占据样本量中的比率,光头有7个因此比率为7/50=0.14,长披肩发有23个,比率为23/50=0.46,黑头发有7个对应比率为7/50=0.14,红色头发有8个,比率为8/50=0.16,其他的特征依次类推来统计相应特征在样本量中的比率。
接下来我们就得按照比率出现的情况来混搭,当某种比率出现几率越大,混搭时选择它的概率就越大。我们先看如何生成新人偶的头发,首先我们在区间[0,1]内生成一个随机数,如果随机数的值处于范围[0,0.14],我们就让新人偶对应光头,如果随机数处于区间[0.14, 0.14 0.46]之内,我们就让人偶对应长披肩发,其他不同特征也如此以随机化的方式来选择,这种依靠样本量呈现的概率统计对不同特征进行混搭而形成的最终情况就是我们所说的“生成”。由此我们对应50个人偶,通过给定混搭方式得到的新人偶如下:
我们要特别注意到,混搭算法具有不确定性。也就是你第一次执行混搭算法得到一种情况,第二次执行算法又得到不同情况,这是因为我们会以不同概率来选择不同特征,唯一可以确定的是,相应特征在给定样本量的情况下出现的概率越大,在执行混搭算法时它被选择的可能性就越大。
在很多情况下,混搭没那么简单。例如对于人脸生成来说,图片中每一个像素的取值对应于一种特征,如果图片的规格为32*32=1024,那么它对应于1024种特征,如果每个像素点有256种取值,这意味着每种特征有256种不同变化。如果我们按照前面描述的方式来对像素点进行“混搭”,那是不可能生成新的人脸来。
原因在于我们在对人偶进行混搭时,我们假设各个特征的出现情况与其他特征无关,但对于图片来说,某个像素点的取值与它周围像素点的取值高度相关,因此我们不能对单一像素点像前面那样进行随机化选择,但问题在于我们如何得知一个像素点与其他像素点的相互影响关系呢,这就需要使用深度学习技术来挖掘出像素点之间的相互影响关系。
在很多时候,我们不需要把所有特征都记录下来而是只要记录关键特征,例如下面图形所表示的圆柱体:
最简单的方法是记住图片中每个像素点的数值,如果图片大小为28*28,那么我们就需要记录784个特征,实际上我们不需要记录这么多信息,我们只需要记录圆柱底部圆心的左边,半径的大小,以及高度即可,这些信息合在一起形成一个向量[x,y,r,h],这个向量将关键向量,在英语中成为latent vector。一旦掌握这些信息,我们完全可以把圆柱绘制出来。
如果把上面圆柱全部换成人脸也是同样的道理。只不过对于人脸我们无法抽取出关键向量,这时候就得需要神经网络来完成,在后面章节中我们将介绍如何使用神经网络识别人脸以及构造出虚拟人脸。