摘要: 从本质上来讲,生成对抗网络(GAN)是一种特殊的损失函数,咱们来深刻探索下这句话的含义。
数据科学家Jeremy Howard在fast.ai的《生成对抗网络(GAN)》课程中曾经讲过这样一句话:安全
“从本质上来讲,生成对抗网络(GAN)是一种特殊的损失函数。”网络
你是否可以理解这句话的意思?读完本文,你会更好的理解这句话的含义。架构
在数学中,咱们能够将函数看作一个“机器”或“黑匣子”,咱们为这个“机器”或“黑匣子”提供了一个或多个数字做为输入,则会输出一个或多个数字,以下图所示:app
通常来讲,咱们能够用一个数学表达式来表示咱们想要的函数。可是,在一些特殊的状况下,咱们就没办法将函数写成一堆加法和乘法的明确组合,好比:咱们但愿拥有这样一个函数,即可以判断输入图像的类别是猫仍是狗。函数
若是不能用明确的用数学表达式来表达这个函数,那么,咱们能够用某种方法近似表示吗?性能
这个近似方法就是神经网络。通用近似定理代表,若是一个前馈神经网络具备线性输出层和至少一层隐藏层,只要给予网络足够数量的神经元,即可以表示任何一个函数。学习
如今,咱们但愿设计一个猫和狗的分类器。但咱们没办法设计一个特别明确的分类函数,因此咱们另辟蹊径,构建一个神经网络,而后一步一步逐渐实现这一目标。编码
为了更好的逼近,神经网络须要知道距离目标到底还有多远。咱们使用损失函数表示偏差。spa
如今,存在不少种类型的损失函数,使用哪一种损失函数则取决于手头上的任务。而且,他们有一个共同的属性,即这些损失函数必须可以用精确的数学表达式来表示,如:设计
1.L1损失函数(绝对偏差):用于回归任务。
2.L2损失函数(均方偏差):和L1损失函数相似,但对异常值更加敏感。
3.交叉熵损失函数:一般用于分类任务。
4.Dice系数损失函数:用于分割任务。
5.相对熵:又称KL散度,用于测量两个分布之间的差别。
在构建一个性能良好的神经网络时,损失函数很是有用。正确深刻的理解损失函数,并适时使用损失函数实现目标,是开发人员必备的技能之一。
如何设计一个好的损失函数,也是一个异常活跃的研究领域。好比:《密度对象检测的焦点损失函数(Focal Loss)》中就设计了一种新的损失函数,称为焦点损失函数,能够处理人脸检测模型中的差别。
上文提到的损失函数适用于分类、回归、分割等任务,可是若是模型的输出具备多模态分布,这些损失函数就派不上用场了。好比,对黑白图像进行着色处理。
如上图所示:
1.输入图像是个黑白鸟类图像,真实图像的颜色是蓝色。
2.使用L2损失函数计算模型输出的彩色图像和蓝色真实图像之间的差别。
3.接下来,咱们有一张很是相似的黑白鸟类图像,其真实图像的颜色是红色。
4.L2损失函数如今尝试着将模型输出的颜色和红色的差别最小化。
5.根据L2损失函数的反馈,模型学习到:对于相似的鸟类,其输出能够接近红色,也能够接近蓝色,那么,到底应该怎么作呢?
6.最后,模型输出鸟类的颜色为黄色,这就是处于红色和蓝色中间的颜色,而且是差别最小化的安全选择,即使是模型之前从未见过黄色的鸟,它也会这样作。
7.可是,天然界中没有黄色的鸟类,因此模型的输出并不真实。
在不少状况下,这种平均效果并不理想。举个例子来讲,若是须要模型预测视频中下一个帧图像,下一个帧有不少种可能,你确定但愿模型输出其中一种可能,然若是使用L1或L2损失函数,模型会将全部可能性平均化,输出一个特别模型的平均图像,这就和咱们的目标相悖。
若是咱们没办法用明确的数学表达式来表示这个损失函数,那么,咱们就可使用神经网络进行逼近,好比,函数接收一组数字,并输出狗的真实图像。
神经网络须要使用损失函数来反馈当前结果如何,可是并无哪一个损失函数能够很好的实现这一目标。
会不会有这样一种方法?可以直接逼近神经网络的损失函数,可是咱们不必知道其数学表达式是什么,这就像一个“机器”或“黑匣子”,就跟神经网络同样。也就是说,若是使用一个神经网络模型替换这个损失函数,这样能够吗?
对,这就是生成对抗网络(GAN)。
咱们来看上面两个图,就能够更好的理解损失函数。在上图中,白色框表示输入,粉色和绿色框表示咱们要构建的神经网络,蓝色表示损失函数。
在vanilla GAN中,只有一个损失函数,即判别器D,这自己就是一个特殊的神经网络。
而在Alpha-GAN中,有3个损失函数,即输入数据的判别器D,编码潜在变量的潜在判别器C和传统的像素级L1损失函数。其中,D和C不是明确的损失函数,而是一种逼近,即一个神经网络。
若是使用损失函数训练生成网络(和Alpha-GAN网络中的编码器),那么,应该使用哪一种损失函数来训练判别器呢?
判别器的任务是区分实际数据分布和生成数据分布,使用监督的方式训练判别器比较容易,如二元交叉熵。因为判别器是生成器的损失韩式,这就意味着,判别器的二进制交叉熵损失函数产生的梯度也能够用来更新生成器。
考虑到神经网络能够代替传统的损失函数,生成对抗网络就实现了这一目标。两个网络之间的相互做用,可让神经网络执行一些之前没法实现的任务,好比生成逼真的图像等任务。
本文为云栖社区原创内容,未经容许不得转载。