@tombkeeper爆料:有人发了个钢铁侠的九宫格,结果中间鼻子部分那张没了。我估计是被微博的鉴黄系统鉴别成另一个身体部位了。
人工智能鉴黄原理
辨别一张图是不是黄图,从机器学习的角度看,本质上是一个分类问题:给定一张图片,让机器判断是不是“黄图”。我们要做的就是研发一个“分类器”,它能根据输入的图片计算出该图片属于“黄图”类别的概率,然后再根据这个概率值输出一个“是”或者“否”的结果。众所周知,电脑擅长的是数学运算,所以我们要把这个“分类器”先抽象成某种数学模型,这样才有可能用电脑来运算。
为了方便理解,我们把数学模型定义为:y=f(x)。即给定图片x,我们要找到一个函数f,通过计算f(x)可以得到这个图片的黄图概率y。很简单吧!理论上这个数学模型可以解决所有的分类问题。好了,那这个看似简单的工作到底应该怎么实现呢?我们按下面的步骤慢慢来:
一、给出定义
既然你要教机器分类,自然要有明确的分类标准,如果标准都没有,那机器计算出来的值就没有意义了。很自然的,我们先把露点的图片归类到黄图,再明确一点,就是男性露下体,女性露乳房或者下体的图。不过,多年的实践经验告诉我们只根据是否漏点来判断图片类别是远远不够的。比如这张图:
【介于图片尺度问题,无法公开,大家可以想象一张裸体XXOO但不露点的侧身图】
▲图1: 没露点的色情
它并没有露点,但是很明显不能认为它是一个正常图片。(不考虑政策监管因素,仅从学术研究的角度讲,也应该把这个图片归类到黄图的一种)。反之,也并不是所有露点的图片都是黄图,比如图2:
▲图2 :特殊但合理
然而,意识到这些仅仅是定义工作的开始,在真实世界的数据形态和政策法规的约束下,更多的图片需要被分类,比如图3、图4等等:
▲图3: 低俗
▲图4 :泳装
通过上面的例子是为了让大家明白,仅靠“黄图”这样一个笼统的定义是无法满足实际情况的。我们得把一个“二分类问题”演进成更加复杂的“多分类问题”,并且尽量把定义和标准清晰化,这显然是一个庞大和繁杂的工作。我们组建了专门的运营团队对数据和政策法规进行研究,根据实际情况积累了许多的分类定义和标准。
二、收集样本
有了定义之后,我们就要根据定义来收集样本数据。幸好我们之前多年的审核工作积累了大量的图片数据,其中有很多经过了人工审核确认是黄图的,所以我们从里面筛选出部分图片作为训练的数据。由于定义的分类数量非常多,我们不得不开发专门的分类标签系统并组建额外的人工标注团队,把训练数据做进一步的筛选。训练数据的质量好坏对效果的影响非常大,所以我们必须很有耐心地投入到训练数据准备的工作中。这个工作消耗了大量的时间和人力成本,并且还一直在持续进行中。由于都是违禁的图片,为了避免二次传播,我们也难以像ImageNet一样通过众包的形式来完成。
三、训练模型
回到一开始的数学模型y=f(x),训练模型的目的就是为了得到f。我们通过前面的两步得到了标注好的图片样本集,把标注的结果定义为y*,图片为x,现在我们要想办法找到一个f,可以对样本集中所有的图片计算得到的y跟y*最接近,也就是得到使|y- y*|的值最小的f。我们可以把|y- y*|定义为损失函数。如何找一个函数的最小值在数学界已经有成熟的算法。一般采用梯度下降法去寻找合适的f。
虽然所有图片数据在电脑看来也都是0和1的二进制数据,比如下图就是前面图1的二进制形态的片段。但是直接拿这些0和1的数据计算,容易导致运算量过大,图片特征提取的效率和准确度都难以保证。
▲图5 :图片的二进制值
如何高效地提取出特征数据来代表图片x是很关键的一步。技术上称之为特征提取。幸好许多前辈科学家已经做了大量的研究,近些年来,基于深度学习的神经网络模型在各种图像识别的比赛中获得了突破性的进展。所以我们选用了CNN(卷积神经网络)、GoogLeNet、ResNet(残差网络)三种深度网络模型结构作为研究的基础。通过这些模型,我们就可以更加高效地把图片数据转变成了可以运算的数学模型,使我们可以更快更好地得到f。
当然实际情况下f是一个非常复杂的函数,为了简化运算,我们把f拆分成了fn(fn-1(fn-2(f…(f2(f0))…)),每一个f可以理解为神经网络的一层,n个f就是n层,这种层层递进的关系就是算法名称中“深度”的由来。理论上我们可以搭建任意深度(层次)的神经网络模型。把f拆分之后,我们用倒推的办法就能得到每一层的f。
我们以图4为例,经过不同层次的f运算得到的结果,如下图6:
▲图6: 不同网络层次特征结果
每一个层次的f可能会得到许多特征结果,有一些是模型对应特征的响应(对应图中有高亮的部分),有一些没有响应(图中黑色部分)。最终经过所有层级的f运算所得结果经过Sigmoid函数映射到0-1之间,得到的就是y值了。y越接近1,那么它命中类别的概率就越大。演化到多分类的问题上,y就是一个多维度的数,理论上每个维度都可以得到一个0-1之前的值,我们按照一定算法选择某一个维度的y作为结果输出即可(一般按照y值大的)。
四、验证
经过前面3步运算我们得到了f。(其实是n层神经网络的参数,也就是所谓的“黄图”模型)。f的可视化结果可以参看图7(以GoogLeNet为例),图7展示了10个224*224的RGB图片作为输入,在第二个卷积层的时候就需要64*3*3*64=36864个f的参数。当然这个是在计算一个非常简单的图示情况下的数据量,实际情况的输入数据和网络深度都要远远大于图片所展示的。我们常说的算法调参,就是指调整这些f的上万甚至上百万个参数。
▲图7 :神经网络结构模型
接下来我们需要有一个验证的图片集来测试f的效果。由于f是根据训练集生成的,那么直接用训练集不足以反映它在真实环境下的效果。得益于我们大量的历史样本数据集,我们专门挑选一些图片作为验证使用。通过一个自动化的测试平台不停地对迭代出来的f做验证。在准确率达到更优的程度之后再更新上线。