2018年8月5日星期日

称霸Kaggle的十大深度学习技巧

作者 Samuel Lynn-Evans@王小新 编译自 FloydHub Blog量子位 出品 | 公众号 QbitAI

在各种Kaggle竞赛的排行榜上,都有不少刚刚进入深度学习领域的程序员,其中大部分有一个共同点:

都上过Fast.ai的课程。

这些免费、重实战的课程非常鼓励学生去参加Kaggle竞赛,检验自己的能力。当然,也向学生们传授了不少称霸Kaggle的深度学习技巧。

是什么秘诀让新手们在短期内快速掌握并能构建最先进的DL算法?一位名叫塞缪尔(Samuel Lynn-Evans)的法国学员总结了十条经验。

他这篇文章发表在FloydHub官方博客上,因为除了来自Fast.ai的技巧之外,他还用了FloydHub的免设置深度学习GPU云平台。

接下来,我们看看他从fast.ai学来的十大技艺:

1. 使用Fast.ai库

from fast.ai import *

Fast.ai库是一个新手友好型的深度学习工具箱,而且是目前复现最新算法的首要之选。

每当Fast.ai团队及AI研究者发现一篇有趣论文时,会在各种数据集上进行测试,并确定合适的调优方法。他们会把效果较好的模型实现加入到这个函数库中,用户可以快速载入这些模型。

于是,Fast.ai库成了一个功能强大的工具箱,能够快速载入一些当前最新的算法实现,如带重启的随机梯度下降算法、差分学习率和测试时增强等等,这里不逐一提及了。

下面会分别介绍这些技术,并展示如何使用Fast.ai库来快速使用它们。

这个函数库是基于PyTorch构建,构建模型时可以流畅地使用。

Fast.ai库地址:fastai/fastai

2. 使用多个而不是单一学习率

差分学习率(Differential Learning rates)意味着在训练时变换网络层比提高网络深度更重要。

基于已有模型来训练深度学习网络,这是一种被验证过很可靠的方法,可以在计算机视觉任务中得到更好的效果。

大部分已有网络(如Resnet、VGG和Inception等)都是在ImageNet数据集训练的,因此我们要根据所用数据集与ImageNet图像的相似性,来适当改变网络权重。

在修改这些权重时,我们通常要对模型的最后几层进行修改,因为这些层被用于检测基本特征(如边缘和轮廓),不同数据集有着不同基本特征。

首先,要使用Fast.ai库来获得预训练的模型,代码如下:

from fastai.conv_learner import *  # import library for creating learning object for convolutional #networks model = VVG16()  # assign model to resnet, vgg, or even your own custom model PATH = './folder_containing_images'  data = ImageClassifierData.from_paths(PATH)  # create fast ai data object, in this method we use from_paths where  # inside PATH each image class is separated into different folders  learn = ConvLearner.pretrained(model, data, precompute=True)  # create a learn object to quickly utilise state of the art # techniques from the fast ai library

创建学习对象之后(learn object),通过快速冻结前面网络层并微调后面网络层来解决问题:

learn.freeze()  # freeze layers up to the last one, so weights will not be updated.  learning_rate = 0.1 learn.fit(learning_rate, epochs=3)  # train only the last layer for a few epochs

当后面网络层产生了良好效果,我们会应用差分学习率来改变前面网络层。在实际中,一般将学习率的缩小倍数设置为10倍:

learn.unfreeze()  # set requires_grads to be True for all layers, so they can be updated  learning_rate = [0.001, 0.01, 0.1] # learning rate is set so that deepest third of layers have a rate of 0.001, # middle layers have a rate of 0.01, and final layers 0.1.  learn.fit(learning_rate, epochs=3) # train model for three epoch with using differential learning rates

3. 如何找到合适的学习率

学习率是神经网络训练中最重要的超参数,没有之一,但之前在实际应用中很难为神经网络选择最佳的学习率。

Leslie Smith的一篇周期性学习率论文发现了答案,这是一个相对不知名的发现,直到它被Fast.ai课程推广后才逐渐被广泛使用。

这篇论文是:

Cyclical Learning Rates for Training Neural Networks[1506.01186] Cyclical Learning Rates for Training Neural Networks

在这种方法中,我们尝试使用较低学习率来训练神经网络,但是在每个批次中以指数形式增加,相应代码如下:

learn.lr_find() # run on learn object where learning rate is increased  exponentially  learn.sched.plot_lr() # plot graph of learning rate against iterations

同时,记录每个学习率对应的Loss值,然后画出学习率和Loss值的关系图:

learn.sched.plot() # plots the loss against the learning rate

通过找出学习率最高且Loss值仍在下降的值来确定最佳学习率。在上述情况中,该值将为0.01。

4. 余弦退火

在采用批次随机梯度下降算法时,神经网络应该越来越接近Loss值的全局最小值。当它逐渐接近这个最小值时,学习率应该变得更小来使得模型不会超调且尽可能接近这一点。

余弦退火(Cosine annealing)利用余弦函数来降低学习率,进而解决这个问题,如下图所示:

从上图可以看出,随着x的增加,余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。

learn.fit(0.1, 1) # Calling learn fit automatically takes advantage of cosine annealing

我们可以用Fast.ai库中的learn.fit()函数,来快速实现这个算法,在整个周期中不断降低学习率,如下图所示:

同时,在这种方法基础上,我们可以进一步引入重启机制。

5. 带重启的SGD算法

在训练时,梯度下降算法可能陷入局部最小值,而不是全局最小值。

梯度下降算法可以通过突然提高学习率,来"跳出"局部最小值并找到通向全局最小值的路径。这种方式称为带重启的随机梯度下降方法(stochastic gradient descent with restarts, SGDR),这个方法在Loshchilov和Hutter的ICLR论文中展示出了很好的效果。

这篇论文是:

SGDR: Stochastic Gradient Descent with Warm RestartsStochastic Gradient Descent with Warm Restarts

用Fast.ai库可以快速导入SGDR算法。当调用learn.fit(learning_rate, epochs)函数时,学习率在每个周期开始时重置为参数输入时的初始值,然后像上面余弦退火部分描述的那样,逐渐减小。

每当学习率下降到最小点,在上图中为每100次迭代,我们称为一个循环。

cycle_len = 1 # decide how many epochs it takes for the learning rate to fall to # its minimum point. In this case, 1 epoch  cycle_mult=2 # at the end of each cycle, multiply the cycle_len value by 2  learn.fit(0.1, 3, cycle_len=2, cycle_mult=2) # in this case there will be three restarts. The first time with # cycle_len of 1, so it will take 1 epoch to complete the cycle. # cycle_mult=2 so the next cycle with have a length of two epochs,  # and the next four.

利用这些参数,和使用差分学习率,这些技巧是Fast.ai用户在图像分类问题上取得良好效果的关键。

Fast.ai论坛有个帖子专门讨论Cycle_mult和cycle_len函数,地址在这里:Understanding cycle_len and cycle_mult

更多关于学习率的详细内容可参考这个Fast.ai课程:http://course.fast.ai/lessons/lesson2.html

6. 人格化你的激活函数

Softmax只喜欢选择一样东西;

Sigmoid想知道你在[-1, 1]区间上的位置,并不关心你超出这些值后的增加量;

Relu是一名俱乐部保镖,要将负数拒之门外。

……

以这种思路对待激活函数,看起来很愚蠢,但是安排一个角色后能确保把他们用到正确任务中。

正如fast.ai创始人Jeremy Howard指出,不少学术论文中也把Softmax函数用在多分类问题中。在DL学习过程中,我也看到它在论文和博客中多次使用不当。

7. 迁移学习在NLP问题中非常有效

正如预训练好的模型在计算机视觉任务中很有效一样,已有研究表明,自然语言处理(NLP)模型也可以从这种方法中受益。

在Fast.ai第4课中,Jeremy Howard用迁移学习方法建立了一个模型,来判断IMDB上的电影评论是积极的还是消极的。

这种方法的效果立竿见影,他所达到的准确率超过了Salesforce论文中展示的所有先前模型,详见:Salesforce research

这个模型的关键在于先训练模型来获得对语言的一些理解,然后再使用这种预训练好的模型作为新模型的一部分来分析情绪。

为了创建第一个模型,我们训练了一个循环神经网络(RNN)来预测文本序列中的下个单词,这称为语言建模。当训练后网络的准确率达到一定值,它对每个单词的编码模式就会传递给用于情感分析的新模型。

在上面的例子中,我们看到这个语言模型与另一个模型集成后用于情感分析,但是这种方法可以应用到其他任何NLP任务中,包括翻译数据提取

而且,计算机视觉中的一些技巧,也同样适用于此,如上面提到的冻结网络层和使用差分学习率,在这里也能取得更好的效果。

这种方法在NLP任务上的使用涉及很多细节,这里就不贴出代码了,可访问相应课程和代码。

课程:Deep Learning For Coders-36 hours of lessons for free

代码:

fastai/fastai

8. 深度学习在处理结构化数据上的优势

Fast.ai课程中展示了深度学习在处理结构化数据上的突出表现,且无需借助特征工程以及领域内的特定知识。

这个库充分利用了PyTorch中embedding函数,允许将分类变量快速转换为嵌入矩阵。

他们展示出的技术比较简单直接,只需将分类变量转换为数字,然后为每个值分配嵌入向量:

在这类任务上,传统做法是创建虚拟变量,即进行一次热编码。与之相比,这种方式的优点是用四个数值代替一个数值来描述每一天,因此可获得更高的数据维度和更丰富的关系。

这种方法在Rossman Kaggle比赛中获得第三名,惜败于两位利用专业知识来创建许多额外特征的领域专家。

相关课程:Deep Learning For Coders-36 hours of lessons for free

代码:

fastai/fastai

这种用深度学习来减少对特征工程依赖的思路,也被Pinterest证实过。他也提到过,他们正努力通过深度学习模型,期望用更少的工作量来获得更好的效果。

9. 更多内置函数:Dropout层、尺寸设置、TTA

4月30日,Fast.ai团队在斯坦福大学举办的DAWNBench竞赛中,赢得了基于Imagenet和CIFAR10的分类任务。在Jeremy的夺冠总结中,他将这次成功归功于fast.ai库中的一些额外函数。

其中之一是Dropout层,由Geoffrey Hinton两年前在一篇开创性的论文中提出。它最初很受欢迎,但在最近的计算机视觉论文中似乎有所忽略。这篇论文是:

Dropout: A Simple Way to Prevent Neural Networks from Overfitting:https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf

然而,PyTorch库使它的实现变得很简单,用Fast.ai库加载它就更容易了。

Dropout函数能减弱过拟合效应,因此要在CIFAR-10这样一个相对较小的数据集上取胜,这点很重要。在创建learn对象时,Fast.ai库会自动加入dropout函数,同时可使用ps变量来修改参数,如下所示:

learn = ConvLearner.pretrained(model, data, ps=0.5, precompute=True) # creates a dropout of 0.5 (i.e. half the activations) on test dataset.  # This is automatically turned off for the validation set

有一种很简单有效的方法,经常用来处理过拟合效应和提高准确性,它就是训练小尺寸图像,然后增大尺寸再次训练相同模型。

# create a data object with images of sz * sz pixels  def get_data(sz):      tmfs = tfms_from_model(model, sz)     # tells what size images should be, additional transformations such     # image flips and zooms can easily be added here too      data = ImageClassifierData.from_paths(PATH, tfms=tfms)     # creates fastai data object of create size      return data  learn.set_data(get_data(299)) # changes the data in the learn object to be images of size 299 # without changing the model.  learn.fit(0.1, 3) # train for a few epochs on larger versions of images, avoiding overfitting

还有一种先进技巧,可将准确率提高若干个百分点,它就是测试时增强(test time augmentation, TTA)。这里会为原始图像造出多个不同版本,包括不同区域裁剪和更改缩放程度等,并将它们输入到模型中;然后对多个版本进行计算得到平均输出,作为图像的最终输出分数,可调用learn.TTA()来使用该算法。

preds, target = learn.TTA()

这种技术很有效,因为原始图像显示的区域可能会缺少一些重要特征,在模型中输入图像的多个版本并取平均值,能解决上述问题。

10. 创新力很关键

在DAWNBench比赛中,Fast.ai团队提出的模型不仅速度最快,而且计算成本低。要明白,要构建成功的DL应用,不只是一个利用大量GPU资源的计算任务,而应该是一个需要创造力、直觉和创新力的问题。

本文中讨论的一些突破,包括Dropout层、余弦退火和带重启的SGD方法等,实际上是研究者针对一些问题想到的不同解决方式。与简单地增大训练数据集相比,能更好地提升准确率

硅谷的很多大公司有大量GPU资源,但是,不要认为他们的先进效果遥不可及,你也能靠创新力提出一些新思路,来挑战效果排行榜。

事实上,有时计算力的局限也是一种机会,因为需求是创新的动力源泉。

关于作者

Samuel Lynn-Evans过去10年一直在教授生命科学课程,注意到机器学习在科学研究中的巨大潜力后,他开始在巴黎42学校学习人工智能,想将NLP技术应用到生物学和医学问题中。

原文:Ten Techniques Learned From fast.ai

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI· 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 https://ift.tt/2ONqinF
RSS Feed

RSS5

IFTTT

如何改善你的训练数据集?(附案例)

这张幻灯片是Andrej Karpathy 在Train AI 演讲的一部分,我很赞同它表达的观点。它充分体现了深度学习在研究和应用上的差异。学术论文几乎全部集中在新的和改进的模型上,使用的数据集是从公共数据集中选出的一小部分。相反,我认识的将深度学习作为实际应用的一部分人,他们大部分时间都在思考如何改善训练数据。

关于研究人员专注于模型架构有很多好的理由,但它确实意味着很少有资源可以引导那些专注于在生产中部署机器学习的人。我在会上的发言是"那些有效到不合常理的训练数据"。在这里我想稍微扩展一下,解释训练数据为什么如此重要,以及一些改进它的实用技巧。

因为工作的原因,我需要与许多研究人员和产品团队紧密合作。我对于改善数据可以带来效果提升的信念来源于我看到它们在构建模型时取得了巨大的成果。现实世界的大部分应用中,运用深度学习的最大障碍就是没有足够高的精度,而我看到提高精度的最快的方法就是改善训练数据集。即使你被困在延迟或存储大小等其他约束上,你可以通过更小的架构来换取一些性能特征,这样可以提高特定模型的准确性。

语音指令

我不能分享我对生产系统的大部分观察,但是我有一个开源例子可以证明同样的道理。去年,我用Tensorflow创建了一个简单的语音识别的例子,但是事实证明,没有现有的数据集可以很容易地用于训练模型。不过在很多志愿者慷慨的帮助下,我收集了60000个由他们说的短语音频片段。在此感谢"开放式语音录制网站"(Open Speech Recording site)的AIY团队帮我发起这个项目。最后得到的模型是可以使用的,但并没有达到我所希望的精度。

为了看看模型设计者的身份对我产生的局限性有多大,我使用相同的数据集发起了一个Kaggle比赛。参赛者的结果要比我最初的模型好很多,但即使有很多团队提出很多不同的方法,最后达到91%精度的只有很少的一部分人。对我来说,这意味着数据有一些根本上的错误,而且参赛者也确实发现了很多错误,比如不正确的标签或者截断的音频。更多的样本开始促使我关注数据集新版本中他们发现的固定的问题。

我查看了错误评价指标,来了解模型中哪些词的问题最多。结果发现"其它"类别(当语音被识别,但单词表不在模型的有限词汇表内)特别容易出错。为了解决这个问题,我增加了我们正在捕获的不同单词的数量,以提供更多样化的训练数据。

因为Kaggle参赛者提出的标签错误,我"众包"了一个额外的验证通道,要求人们听每个剪辑,并确保它可以匹配到期望的标签。另外,他们也发现了一些几乎无声或者被截断的文件,因此我编写了一个实用工具来做一些音频分析,并自动剔除糟糕的样本。尽管删除了一些糟糕的文件,最后我还是将总的说话数量增加到了100000。这要感谢更多志愿者和收费"众包"者的帮助。

为了帮助别人使用这个数据集(并从我的错误中学习),我将所有相关的事情和最新的精度结果写进了一篇论文。最重要的结论是,在不改变模型或测试数据的前提下,第一名的精度提高了4%,从85.4%提高到了89.7%。这个提高让人很激动,并且当人们在Android 或 Raspberry Pi 演示应用中使用该模型时,反映了更高的满意度。我相信如果我花时间在模型架构的调整上,尽管我知道我的模型不如最好的模型,最终我得到的精度的提高肯定没有现在的多。

论文:

https://ift.tt/2qrNFbk

这就是在生产环境中一次又一次地产生伟大结果的过程。但是如果你想做同样的事情,很难知道从哪里开始,你可以从我处理语音数据所使用的技巧中得到一些启发。为了更加明确,这里有一些我发现的有用的方法。

首先,了解你的数据

这似乎是显而易见的,但你的第一步应该是随机浏览你将要开始使用的训练数据。复制一些数据文件到你本地的机器上,然后花费几个小时预览它们。如果你的数据集是图片,可以使用类似MacOS's的查找器来滚动缩略图视图,可以很快的检查完数千张图片。

对于音频,可以使用取景器播放预览,对于文本可以将随机片段转存到终端上。

在第一个版本的语音指令中,我没有花费足够的时间来做这些。这也是为什么Kaggle参赛者一开始使用这个数据集就会发现很多问题。经历这个过程我总觉得有点傻,但事后我再也没有后悔过。每次我做完这个过程,我都会从数据中发现一些重要的事情。比如是否各类别中例子的数量不均衡,损坏的数据(例如,用JPG文件扩展标记的PNG),不正确的标签,或者只是令人惊讶的组合。

Tom White通过观察ImageNet得到了一些奇妙的发现,包括"太阳镜"标签实际上是一个古老的放大阳光的装置,用于"垃圾车"的魅力镜头,对不死女性的"斗篷"偏见。Andrej's的工作是手工从ImageNet中分类照片,这也教会我关于数据集的很多东西。包括即使对于一个人来说,将所有不同品种的狗区分出来是有多难。

你将要做什么取决于你发现了什么。你应该在清洗数据之前总是进行一次这种数据观察,因为,对数据集的直观认识将会有助于你在接下来的流程中做决策。

快速选择一个模型

不要在选择模型上花费太多时间。如果你在做图片分类,可以参考AutoML,或者看看类似Tensorflow的模型库,再或者从Fast.AI搜集的例子中找一个解决类似问题的模型(http://www.fast.ai/)。重要的是尽快开始迭代,这样你就可以提前和真实用户一起尝试你的模型。你总是可以在以后得出一个改进的模型,并且也许可以得到更好的结果,但是你首先要得到数据。深度学习仍然遵循'垃圾入,垃圾出'("garbage in, garbage out")的基本计算法则,所以即使是最好的模型也会受到训练集缺陷的限制。通过挑选一个模型并测试它,你将能够得知这些缺陷是什么并且开始改进它们。

AutoML

https://cloud.google .com/automl/

Fast.AI:

http://www.fast.ai/

为了加快你的迭代速度,可以尝试从一个已经在一个大的现有数据集上预先训练的模型开始,然后使用迁移学习在你收集的数据集(可能很小)上进行微调。

这通常比只在较小的数据集上进行训练的效果要好得多,而且速度快得多,并且你可以快速地了解如何调整数据收集策略。最重要的是,你可以把你的结果反馈到你的收集过程中,以适应你学习的情况,而不是在训练之前把收集数据作为一个单独的阶段来进行。

成为它之前先假装它

研究模型和生产模型的最大区别在于研究通常在开始时有明确的问题陈述,但是实际应用的要求被锁定在用户的意识行为中,并且只能随着时间的推移而被提取。

例如,在Jetpac中我们想要找到一张好的照片去展现在城市自动旅行指南中。我们开始时要求评价人给他们认为好的照片打一个标签,但最后我们看到了很多微笑的人的照片,因为他们就是这样解释这个问题的。我们把这些放在产品的模型中,看看测试用户是如何反应的。结果是他们没有留下深刻的印象,也没有被这些照片所鼓舞。

为了解决这个问题,我们重新定义了提问的问题:"这张照片会让你想去它所展示的地方吗?"。这使我们得到了更好的结果,但也反应出我们使用的工人是东南亚人,他们认为会议照片看起来令人很惊异,因为大饭店里充满了穿西装和拿红酒杯的人。

这种不匹配及时提醒了我们生活在"泡沫"里,但这也确实是一个现实的问题,因为我们美国的目标观众看到这些会议照片会感到沮丧和没有理想。最后,我们在JETPAC团队中的六个人手动评估了超过二百万张照片,因为我们比我们可以训练的任何人都要熟悉标准。

这是一个极端的例子,但是它证明了标记过程很大程度上取决于应用的需求。对大多数生产用例来说,存在一个要为模型找合适的问题去回答的过程,而且这才是关键所在。如果你用你的模型回答了错误的问题,你将永远无法在这个糟糕的基础上建立一个可靠的用户体验。

Thomas Hawk拍摄

我已经告诉你询问正确问题的唯一方法就是模仿你的应用,而不是一个人陷在机器学习循环中。因为有一个人在幕后,这有时被称为'Wizard-of-Oz-ing'。我们让人们手动选择一些旅行指南的样本照片,而不是训练一个模型,然后使用来自测试用户的反馈来调整我们挑选图片的标准。

一旦我们从测试用户那里得到可靠的正向反馈,为了得到数百万张照片的训练集,我们会把制定的挑选照片的规则转换为标签集。然后,它训练了能够预测数十亿张照片质量的模型,但是它的DNA来自我们开发的原始手工规则。

在真实的数据上训练

在Jetpac,我们用来训练我们模型的图像来自相同的数据源(大部分来自Facebook和Instagram) ,也是我们想用在模型上的图像。我所看到的一个常见问题是训练数据集在重要的方面与模型最终会在生产中看到的输入不同。

目前世界上图像识别最大的数据库ImageNet

例如,我经常会看到团队在ImageNet上训练一个模型,但当他们试图在无人机或机器人中使用时就会碰到问题。原因ImageNet都是人拍摄的照片,这些照片有很多共同之处。它们是用手机或静态相机拍摄的,使用中性透镜,在大致的高度,白天或人工照明的条件下,把对象标记在中心突出的位置。

机器人和无人机使用的摄像机通常是高视野镜头。无论是从地面还是从上方,照明都很差,没有任何对象的智能框架,因此它们通常被裁剪。这种差异意味着如果你只接受一个从ImageNet的照片中训练出来的模型,并将其部署在这些设备上,那么你就会发现精确度不高。

有关你的训练数据偏离模型本来应该需要的训练数据,还存在很多微妙的形式。想象一下,你正在建造一个相机来识别野生动物,并利用世界各地的动物数据集进行训练。如果你只在Borneo丛林中部署,那么企鹅标签的正确率肯定是极低的。

如果南极照片被包含在训练数据中,那么它将有更高的几率将其他东西误认为企鹅,所以你的总错误率会比你排除那些训练中的图像更糟糕。有一些方法可以根据已知的先验信息来校准你的结果(例如,在丛林环境下大规模的企鹅的概率),但是使用一个反映产品实际遇到的情况的训练集更容易和更有效。

我发现,最好的方法是使用直接从实际应用程序得到的数据,这些数据与上面提到的Wizard of Oz方法很好地联系在一起。循环中的人成为初始数据集的打标签者,即使收集的标签数量很小,它们也会反映实际使用情况,并且对于迁移学习的一些初步实验应该是足够的。

遵循指标

当我在做语音指令的例子时,看到的最频繁的报告就是训练过程中的混淆矩阵。这里有一个例子,展示了如何在控制台中显示:

这看起来可能很吓人,但实际上它只是一张表格,显示了网络所犯的错误的细节。这里有一份更漂亮的标签版本:

表格中的每一行代表一组样本,其中真实的标签是相同的。每一列代表样本被预测为对应标签的次数。例如,高亮显示的一行代表所有实际上是无声的音频样本,如果你从左读到右,你可以看到那些预测正确的标签,每一个都落在预测无声的列中。

这告诉我们,这个模型可以很好地发现真正的无声样本,并且没有负样本。如果我们看一下展示有多少将音频预测为无声的一整列,就可以发现一些音频片段实际上是误分到无声的一列中的,这一列有很多假正例。

事实证明这个是很有帮助的,因为它可以让我更加仔细地分析那些被错误地归类为无声的片段,从而发现他们大部分是极其安静的录音。根据混淆矩阵提供的线索,我清除了低音量的音频片段,这帮助我提高了数据质量。

虽然大多数结果是有用的,但是我发现混淆矩阵是一个很好的折衷,因为它比仅仅一个精确值给的信息要多,却又没有呈现太多复杂的细节。在训练过程中观察数字的变化是很有用的,因为它可以告诉你模型正在努力学习的类别,并且可以让你在清理和扩展数据集时集中精力。

相似的方法

我最喜欢的一种理解我的模型如何解释训练数据的方法就是可视化。TensorBoard可以很好的支持这种探索,虽然它经常用来可视化词嵌入,但是我发现它几乎对每一层都很有用,工作原理也像词嵌入。例如,图像分类网络通常在最后一层的全连接层或者softmax之前有一层网络可以用来作为嵌入(这就是简单的迁移学习的例子,和TensorFlow for Poets(地址如下)工作流程很像)。

这些并不是严格意义上的嵌入,因为在训练过程中并没有任何机制去保证真正的嵌入布局中有理想的空间属性,但是对它们的向量进行聚类确实可以产生很多有趣的东西。

链接:

https://ift.tt/2OensqC

举一个实际的例子,我合作的一个团队对某些动物的图像分类模型的高错误率感到很困惑。他们使用聚类可视化去观察训练数据中不同的类别是如何分布的。当他们在看"捷豹"这个类别时,很清楚的看到数据被分为两组之间的距离。

图片来自djblock99Dave Adams

这是他们看到的一幅图,一旦每个聚类的照片都显示出来,就可以很明显的发现许多捷豹品牌的汽车都被错误地贴上了捷豹猫的标签。如果团队成员知道了这些,那么就会去关注标注过程,并且可以意识到工人的方向和用于标注的用户界面不够完善。

有了这些信息,他们就能够改进标注者(人)的培训过程并且去修复标注工具。这可以将所有的汽车图像从捷豹类别中移除,并为这一类别提供了一个更好的模型。

聚类通过让你对训练集进行深刻的了解,可以让你得到与你探索数据相似的好处。但是,网络实际上是按照它自己的学习理解将输入数据排序分组,然后指导你探索数据。

人类很擅长在视觉信息中发现异常,因此将我们的直觉和计算机处理大量数据的能力结合起来是一种非常灵活的追踪数据集质量的解决方案。关于如何使用TensorBoard来做这件事超出了本文的范围(文章已经足够长了,我很感激你还在继续读下去)。但是如果你真的想提高你的结果,我强烈建议你熟悉这个工具。

收集数据不能停

我从来没有见过收集更多的数据不能提高模型准确性的例子,而且也有很多研究可以支持我的经验。

这张图片来自"重新审视那些有效到不合常理的训练数据",并且展示了即使数据集已经增长到了数亿,图像分类模型的精度依然不断增加。

Facebook最近更加深入的使用大数据量,例如,在ImageNet分类中使用了数十亿个带有标签的Instagram图片,以达到新的记录精度。这表明,即使对于大型、高质量数据集的问题,增加训练集的大小仍然可以提高模型结果。

这意味着只要用户可以从更高精度的模型中受益,你就需要一个不断改善数据质量的策略。如果可以的话,找到一种创造性的方法,利用即使微弱的信号也可以得到更大的数据集。Facebook使用Instagram标签就是一个很好的例子。

还有一种方法是提高标注"管道"的智能性,例如通过增加由初始模型预测的建议标签的工具,这样可以使打标签的人快速做决定。这在刚开始可能有风险,但是在实际应用中受益往往超过了这种风险。

通过雇佣更多的人来给新的训练数据贴上标签来解决这个问题通常也是一项有价值的投资。不过因为这种花费通常没有预算,组织过程中会有很多困难。如果是一个非盈利的组织,则可以让你的支持者通过某种公共工具自愿贡献数据,这是一种在不花费钱的同时提高数据集规模的好方式。

当然任何组织都希望有一个产品,当它在正常使用时可以生成标注数据。

我不会太执着于这样的想法,它不符合很多现实世界的用例。即人们只是想尽快得到一个答案而并不涉及标签的复杂问题。如果你是一家创业公司,这是一个很好的投资项目,因为它就像是一台用于改进模型的永动机。

但是在清理或增加你接收到的数据时,几乎总是会有一些单位成本,因此,最后花的钱往往最终看起来更像是一个廉价版的商业众包,而不是真正免费的东西。

通往危险区域的高速公路

模型错误对产品用户的影响往往要大于由损失函数捕捉到的错误。你应该提前想到可能发生的最糟糕的结果,并为模型设计一个辅助程序来避免发生。这也许是一个你永远都不想预测的类别黑名单,因为假正例的代价太大。

或者你仅仅有一套简单算法去保证发生的结果不会超过你已经设定的参数边界。例如,你可能会保留一个永远不希望文本生成器输出的粗俗语言的列表,即使它们在训练集中,因为它们不适合出现在产品中。

因为我们不能总是知道未来可能会出现什么不好的结果,所以学习现实世界中的错误是很重要的。如果你有了合适的产品或市场,那么从现实中学习最简单的办法就是使用错误报告。

另外,当用户使用你的应用程序出现他们不想要的东西时,应该给用户一个便捷的反馈路径。如果可以的话,获取模型的全部输入,但是如果数据是敏感数据,那么仅仅知道错误的输出是什么也可以帮助你调查原因。这些类别可以用来决定收集更多什么样的数据,并且这些类别可以让你理解当前标签的质量。

一旦你对模型进行了新的修改,就会有一组先前产生了坏结果的输入,并且除了正常的测试集之外,还对它们进行单独的评估。这个有点像一个回归测试,并给你一个方法追踪你改进用户体验的效果如何,因为单一的模型精度度量永远不会完全捕捉到人们关心的一切。

通过看一些过去引起强烈反应的例子,你就有了一些独立证据表明你实际上是在为你的用户做得更好。如果在一些情况下因为数据太敏感而不能得到输入数据,可以使用内部测试或者内部实验来确定什么样的输入会产生这些错误,然后代替回归数据集中的那些数据。

故事是什么,昙花一现?

我希望我已经说服你花更多的时间在你的数据上,并且给你了一些关于如何投入精力改进它的想法。对数据领域的关注并没有它值得的那么多,而且我真的觉得我在这里的建议仅仅是涉及数据表面。

我很感谢所有与我分享他们的策略的人,另外我希望我可以从更多的人那里听到你已经取得成功的方法。我认为会有越来越多的机构将工程师团队专门用于数据集的改进,而不是让机器学习研究人员来推动进展。我期待着看到整个领域的发展。

我总是惊叹于即使是在有着严重缺陷训练数据的情况下模型依然可以运作良好。因此我迫不及待的想看看随着我们数据集质量的提高我们可以做些什么。

]]> 原文: https://ift.tt/2LVH1HT
RSS Feed

机器知心

IFTTT

AI以假乱真怎么办?TequilaGAN教你轻松辨真伪

本期推荐的论文笔记来自 PaperWeekly 社区用户 @TwistedW。本文来自 UC Berkeley,GAN 生成的样本在视觉方面已经达到与真实样本很相近的程度了,有的生成样本甚至可以在视觉上欺骗人类的眼睛。区分生成样本和真实样本当然不能简单的从视觉上去分析,TequilaGAN 从图像的像素值和图像规范上区分真假样本,证明了真假样本具有在视觉上几乎不会被注意到的属性差异从而可以将它们区分开。

关于作者:武广,合肥工业大学硕士生,研究方向为图像生成。

■ 论文 | TequilaGAN: How to easily identify GAN samples

■ 链接 | https://ift.tt/2NTZ3a3

■ 作者 | Rafael Valle / Wilson Cai / Anish Doshi

GAN 和 GAN 的变种已经将图像生成质量达到了以假乱真的效果,虽然生成的一部分图像可以用肉眼去分辨,但是仍然有一部分由 GAN 生成的图像在视觉上很难和真实图像区分开。区分真假图像对于分析 GAN 的生成上具有一定的意义,同时也说明了 GAN 在生成上与真实图像的不同所在。TequilaGAN: How to easily identify GAN samples 一文将从视觉以外的方面去区分生成样本和真实赝本之间的差距。

论文引入

使用 GAN 框架生成的假样本在一定程度上骗过了人类和机器,使他们相信生成样本与实际样本无法区分。虽然这可能适用于肉眼和被发生器愚弄的判别器,但生成样本不可能在数值上与实际样本无法区分。TequilaGAN 一文正是通过真实样本和生成样本在数值上的分析可以判断出真假

GAN 的生成数据的评判标准一直没有很好的统一,大部分的评估是在定性的方面作分析,定量上 Inception Score [1] 一直被广泛使用,但是 A Note on the Inception Score [2] 一文也指出了 Inception Score 未能为 GAN 模型的评估提供系统指导。 

在已验证的人工智能的背景下,很难系统地验证模型的输出是否满足其训练的数据的规范,特别是当验证取决于感知有意义的特征的存在时。例如,考虑一个生成人类图像的模型,尽管可以比较真实样本和假样本的颜色直方图,但还没有强大的算法来验证图像是否遵循从解剖结构得出的规范。 

TequilaGAN 涉及假样本的系统验证,重点是比较假样本和真实样本的数值特性。除了比较统计汇总之外,还研究了 Generator 如何逼近实际分布中的统计模式,并验证生成的样本是否违反了从实际分布中得出的规范。总结一下 TequilaGAN 的主要贡献: 

  • 证明了假样本在视觉上和真实样本具有几乎不会被注意到的属性 

  • 这些属性可用于识别数据来源(真实或生成) 

  • 证明了假样本违反了从真实数据中学习的正式规范

研究方法

实验主要集中在三点:第一点表明,假样本具有视觉检查难以察觉的特性,此特性与可微分的要求密切相关;第二个表明,从可用于识别数据的真实和假样本中提取的特征计算的统计矩之间存在数值差异;第三个表明假样本违反了从真实数据中学到的正式规范。 

数据集 

实验使用 MNIST,CIFAR10 以及从网上下载的 389 个 Bach Chorales 的 MIDI 数据集和 NIST 2004 电话会话语音数据集的子样本。 

特征 

特征光谱质心[3] 是音频领域常用的特征,它代表光谱的重心。MNIST 和 Mel-Spectrograms 的特征光谱质心如下图所示示例。对于图像中的每一列,通过对列总和进行归一化,将像素值转换为行概率,然后获取预期的行值,从而获得光谱质心。

试验中同时表示了谱斜率图:

GAN框架选取 

GAN 框架使用最小二乘 GAN(LSGAN)和改进的 Wasserstein GAN(IWGAN / WGAN-GP)网络搭建使用 DCGAN 架构。还比较了使用快速梯度符号法(FGSM)生成的对抗性 MNIST 样本。在生成器的输出和其他变换(例如缩放的 tanh 和身份)上评估常用的非线性,sigmoid 和 tanh。

MNIST实验

这部分着重于显示由 GAN 伪造的 MNIST 样品的数值特性以及肉眼未知的特征。首先将通过 MNIST 训练集计算的特征分布与其他数据集进行比较,包括 MNIST 测试集,使用 GAN 生成的样本和使用 FGSM 计算的对抗样本。将训练数据缩放到 [0,1],并且从伯努利分布采样随机基线,概率等于 MNIST 训练数据中像素强度的平均值 0.13。

从上图生成的样本表明,IWGAN 似乎比 LSGAN 产生更好的样本。在 Kolgomorov-Smirnov(KS)双样本检验和 Jensen-Shannon Divergence(JSD)上,LSGAN 和 IWGAN 生成的样本如表一所示与标准数据集还是有一定的不同。

下图中的经验 CDF 可以理解这些数值现象,使用 GAN 框架生成的样本的像素值分布主要是双模态的,并且渐近地接近实数据中的分布模式值 0 和 1。

此外,光谱质心的统计矩的分布图表明假图像比真实图像更嘈杂。

最后,下图显示 GAN 生成的样本平滑地接近分布模式,这种平滑近似与训练和测试集有很大不同。虽然在感知上没有意义,但这些属性可用于识别数据源。 

对分布模式的平滑逼近的解释上,第一个假设是网络搭建采用随机梯度下降和渐近收敛激活函数(例如 sigmoid 或 tanh),为了验证这一假设,保持判别器固定,在发生器的输出端采用不同的激活函数,包括线性和缩放的 tanh。如下图所示,使用线性或缩放 tanh 激活训练的模型能够部分地生成类似于 MNIST 训练数据和像素强度分布的图像,仍然具有平滑的曲线。

另一个假设是平滑行为是由于训练数据本身的像素强度的平滑性,为了验证这一点,首先通过在 [0,1] 之间对其进行缩放,然后将其设置为 0.5 来对实际数据进行二值化。通过这种改变,实数据的像素强度的分布变为完全双模态,模式为 0 和 1,从下图结果显示假设是合理的。

根据上述实验可知,随机梯度下降和方向传播的应用使得生成的图像分布上是平滑的,这是区分真假样本的一个重要依据。

CIFAR-10实验

CIFAR-10 的实验主要是在 MNIST数据集的基础上将像素扩展到 3 通道的彩色图像上,实验结果如下:

可以看出生成样本仍然是平滑分布。

Bach Chorales和Speech实验

这两种数据集都是在语音数据下比较的,Bach Chorales(巴赫合唱)音乐是复调的音乐作品,通常为 4 或 5 种声音编写,遵循一系列规范或规则。例如,全局规范可以声明只有一组持续时间有效;本地规范可以声明只有状态(音符)之间的某些转换才有效,具体取决于当前的和声。

实验中,将 Bach Chorales 数据集转换为钢琴卷,钢琴卷是一种表示,其中行表示音符编号,列表示时间步长,单元格值表示音符强度。实验的目的是为了证明生成的样本是否违反了 Bach 合唱的规范。下图为真实和生成的样本数据,表 2 为打破规则的次数:

虽然图 11 显示的生成样本看起来与实际数据类似,但 IWGAN 样本有超过 5000 次违规,比测试集多 10 倍!违反规范是一个有力的证据,表明假样本不是来自与真实数据相同的分布。 

在语音(speech)域中,实验研究了 Mel-Spectrogram 特性。将 NIST 2004 数据集划分为训练和测试集,将语音转换为 Mel-Spectrogram 图,得到的生成样本如下:

经验 CDF 的对比结果如下:

总结

TequilaGAN 研究了用对抗方法生成的样本的数值特性,特别是生成对抗网络。实验发现假样本在视觉具有与真实样本几乎无法注意到的特性,即由于随机梯度下降和可微分性的要求,假样本平滑地接近分布的主导模式。

实验还对真实数据与其他数据之间差异的统计度量,结果表明,即使在简单的情况下,例如像素强度的分布,训练数据和伪数据之间的差异对于测试数据而言是大的,并且假数据严重违反了实际数据的规范。

参考文献

[1]. Tim Salimans, Ian J. Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, and Xi Chen. Improved techniques for training gans. CoRR, abs/1606.03498, 2016.

[2]. Shane Barratt and Rishi Sharma. A note on the inception score. arXiv preprint arXiv: 1801.01973, 2018.

[3]. Geoffroy Peeters. A large set of audio features for sound description (similarity and classifica- tion) in the cuidado project. Technical report, IRCAM, 2004.

]]> 原文: https://ift.tt/2OKYuQU
RSS Feed

机器知心

IFTTT

深思考获SMP2018-ECDT两项任务第一名,解读中文语义理解技术

中文语义理解技术长期以来被誉为"人工智能皇冠上的明珠",是人工智能领域最难攻克的堡垒。SMP2018-ECDT由中国中文信息学会(人工智能自然语义理解、自然语言处理最权威学会)主办,旨在评测中文语义理解与人机交互的最高水平。近日SMP2018-ECDT结果公布,据机器之心了解深思考人工智能(iDeepWise.AI)作为上届全国冠军,继续成功加冕,包揽任务一、任务二两项大奖,再次斩获中文语义理解与多轮人机交互全国第一名,蝉联2017、2018两届全国冠军。

由中国中文信息学会社会媒体处理专委会主办、哈尔滨工业大学承办的第七届全国社会媒体处理大会(SMP 2018)于 2018 年 8 月 2 日 - 4 日在哈尔滨召开。8月3日,SMP2018举行了中文人机对话技术评测(ECDT)颁奖仪式,深思考人工智能首席机器学习科学家王泳博士受邀参加,并现场分享深思考人工智能SMP2018用户意图领域分类技术报告与特定域任务型人机对话在线评测技术报告。

SMP2018深思考人工智能用户意图领域分类技术报告

摘要:本文介绍深思考人工智能公司开发的用户意图领域分类系统。针对本次测评所关注的31个类别,我们采用了领域关键词的识别方式和多分类器的领域分类相结合的方案,领域关键词主要来源于数据集的统计和外部网络资源的采集,多分类器采用了长短期记忆网络(LSTM)的变体GRU。在本次测评中,领域分类效果较为出色,达到预期结果。

1 引言

近年来,人机对话技术受到了学术界和产业界的广泛关注。在学术界,人机对话相关技术不断发展,如语音识别、对话管理、自然语言生成等。在产业界,多家公司开发出了许多人机对话产品,如聊天机器人siri、情感陪护机器人小忆等。人机对话主要分为目标驱动型(或任务驱动型)和非目标驱动型对话,其中典型的任务驱动型人机对话系统主要包含自然语言理解(NLU)、对话管理(DM)、自然语言生成(NLG)三个模块。

自然语言理解(NLU)应用在我们的日常生活中变得越来越重要,其主要目标是识别用户输入话语的领域和意图,例如:用户说:"我要买一张下周去上海的飞机票,国航的",这时,NLU需要准确识别出这句话所属的领域是机票,才能给用户返回正确的回复结果。领域分类[1]属于文本分类,常见的传统领域分类方法有SVM[2]随机森林、KNN等,随着深度学习的不断发展,深度学习的技术也逐渐应用到自然语言理解领域,如卷积神经网络CNN、循环神经网络RNN[3]以及长短期记忆网络LSTM[4]等。

2 用户意图领域分类系统

2.1 技术架构

图1是用于解决意图分类问题的总体技术架构。在这个架构中用到了31分类器、领域关键词词典、领域句子词典共同来决策句子的意图。

(1)31类领域分类器:采用GRU(Gated Recurrent Unit)神经网络训练31类分类器,并用K折交叉验证用于评估模型效果。

(2)领域关键词词典:基于数据的领域关键词提取,并结合人工知识对领域关键词进行了扩展。

图1 技术架构

2.2 关键词识别

基于数据集,我们统计了其中的各个领域的特有关键词,经人工筛选后加入关键词词典;基于外部网络资源,我们搜集了个别类的常见关键词,如股票领域、彩票领域、疾病领域等。

2.3 基于GRU的领域分类

长短期记忆网络(LSTM)是一种特殊的RNN类型,通过门控机制使循环神经网络不仅能记忆过去的信息,同时还能选择性地忘记一些不重要的信息而对长期语境等关系进行建模,缓解了RNN的梯度消失问题,而GRU作为LSTM的变体,在保持了LSTM的效果的同时又使结构更加简单,所以在某些任务上更为流行。本文针对同一数据集,验证了不同模型的分类效果,如传统分类模型LR、KNN、SVM、RF等,深度学习模型ICDCNN、FastText、GRU等。

3 实验方案

3.1 数据集及任务介绍

此次用户意图领域分类任务包括闲聊和垂类两大类,其中垂类分为天气(weather)、航班(flight)、火车(train)等30小类,总共31个类别,数据分为训练集、测试集、验证集,在官方的数据(train:2299,dev:770)基础上,我们对31个类别分别进行了数据扩展,扩展后训练集每个类的数据如图2所示。

图2 扩展后类别数据

3.2 实验结果与分析

我们在同一训练集和开发集的情况下尝试了不同的分类模型,如传统分类模型LR、KNN、SVM、RF等,深度学习模型ICDCNN、FastText、GRU等,表1是各个模型的结果。

表1 各模型结果

从上表可看出,传统的分类模型在这个数据集上表现并不出色。在深度学习模型中,GRU比ICDCNN、FastText表现都要好很多,F1值比它们高了3.81和5.15个百分点,原因是文本属于一种序列化结构,而GRU由于其特殊的网络结构,比较适合处理序列化问题。所以,我们最终选择了GRU模型。

在GRU模型的基础上,我们比较了扩展数据前后的F1值,结果如表2所示。

表2 扩展前后的F1值

从上表可看出,扩展数据对模型的效果提升十分明显。

最后,我们在GRU模型的基础上,使用了关键词词典,F1值提升了约1个百分点,结果如表3所示。

表3 加关键词前后的F1值

4 总结

自然语言处理/理解是人工智能的一个终极目标,在人机对话产品方面,深思考人工智能iDeepWise机器人已经实现了在音乐、天气、酒店、美食、火车票、机票、医疗问诊、医疗领域智能客服、车载等多个垂直领域的多轮人机交互引擎。本文介绍的基于GRU模型的领域分类系统,并在模型之上加入关键词词典,在处理人机对话中的短文本上有较好的效果。

参考文献

[1] Ravuri S, Stolcke A. A comparative study of recurrent neural network models for lexical domain classification C]// Proceedings of the 41th IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP 2016), 2016: 6075-6079.

[2] Haffner P, Tur G, Wright J H. Optimizing SVMs for complex call classification[C]// Proceedings of the 28th IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP 2003), 2003: I-632-I-635.

[3] Xu P, Sarikaya R. Contextual domain classification in spoken language understanding systems using recurrent neural network[C]// IEEE International Conference on Acoustics, Speech and Signal Processing. IEEE, 2014:136-140.

[4] Suman Ravuri and Andreas Stolcke, "Recurrent neural network and LSTM models for lexical utterance classification," in Proc. Interspeech, Dresden, Sept. 2015.

深思考人工智能SMP2018特定域任务型人机对话在线评测技术报告

摘要:本文主要介绍了深思考人工智能机器人科技(北京)有限公司的研发团队针对SMP2018特定域任务型人机对话评测任务所研发的系统,并详细介绍了该系统的技术实现细节。本次评测任务的特定领域包括:机票类、火车票类、酒店类3个垂直领域,相比于上一届特定域任务型人机对话在线评测任务,本届评测的最大变化就是加入了多意图识别以及多意图场景下的预定或查询任务。为了实现多意图场景下的多轮人机交互,深思考人工智能团队重点进行了多意图场景下的多标签分类、意图理解与推理以及对话管理模块的研究和设计。最终评测结果显示,利用上述技术的人机对话系统能够取得理想的效果。

引言

SMP2018中文人机对话技术评测(ECDT)的任务二是特定域任务型人机对话在线评测任务,本次评测任务的特定领域包括:机票类、火车票类、酒店类3个垂直领域,系统通过与测试人员实时在线对话完成相应的预定或查询任务,从而满足测试人员的需求。相比于上一届特定域任务型人机对话在线评测任务,本届评测的最大变化就是加入了多意图识别以及多意图场景下的预定或查询任务。

本次评测扩充的多意图场景下的意图识别和相应的预定或查询任务相比较于单意图的处理在难度上有了很大的提升,这里面涉及到意图的多标签分类、意图间关系的推理以及意图之间属性特征的推理。为了实现多意图场景下的多轮人机交互,深思考人工智能团队重点进行了多意图场景下的多标签分类、意图理解与属性推理以及对话管理模块的研究和设计。

1 系统实现

我们首先将工作重心主要放在意图的层次分类中,将多意图看做是一个大类,对多意图进行多标签分类。其次进行多意图问句和单意图问句的属性抽取以及多意图的属性推理。然后在对话管理模块中通过深度强化学习Deep Reinforcement Learning进行信息和状态的处理。最后各个业务模块的逻辑处理,从而实现多任务场景下的多轮交互。系统的总体框架图如图-1所示:

图-1人机多轮交互系统总体框架

1.1 输入预处理

在特定域任务型人机对话在线评测系统中,首先需要对用户输入的问句进行纠错,其次还需要进行分词、词性标注,最后进行补全和指代消解。

1.2 意图分类

在多领域的人机交互系统中,意图分类是整个系统的核心。当用户说了一句话时,首先要知道这句话是哪个领域的问题,才能交给这个领域的业务处理模块进行处理。因为本次测评加入了多意图识别,这属于一个多标签分类问题,和传统的意图分类有很大的差别。

在这里我们采用层次分类的思想,首先利用GRU模型对意图进行粗粒度划分,从而划分出多意图,然后在多意图中利用胶囊网络进行多标签分类从而识别出多意图中的子意图。长短期记忆网络(LSTM)是一种特殊的RNN类型,通过门控机制使循环神经网络不仅能记忆过去的信息,同时还能选择性地忘记一些不重要的信息而对长期语境等关系进行建模,缓解了RNN的梯度消失问题,而GRU作为LSTM的变体,在保持了LSTM的效果的同时又使结构更加简单,所以在某些任务上更为流行。首先我们选用了基于GRU模型的领域分类系统,并在模型之上加入关键词词典,在处理人机对话中的短文本上有较好的效果。胶囊网络[1]是Hitton针对卷积神经网络的缺陷而提出的,卷积神经网络的核心在卷积层,它能够抽取出更高维的特征,但是在抽象过程中没能够将低层特征之间的位置关系考虑进去。而胶囊网络作为一个新的神经网络框架,它是由胶囊而不是由神经元构成的,其中一个胶囊就是一个向量神经元,它的输出是一个向量,所以我们利用胶囊网络实现多标签分类。

1.3 属性抽取与推理

属性抽取也可以称为序列标注,可以以字为单位进行序列标注,也可以以词为单位进行序列标注,经过实验验证发现,利用字为单位进行序列标注可以取得比较好的效果。我们一个设计了13个待标注标签,分别是:time、to_address、address、num_day、room_type、hotel_name、quantity、money、seat_type、train_type、berth_type、airline_company、flight_no。其中标注采用的是BIEO。B表示一个待标注标签的起始字;I表示一个待标注标签的非起始非末尾字;E表示一个待标注标签的末尾字;O表示非待标注标签字,该模块我们采用Bi-LSTM+CRF[2]进行序列标注,其中Bi-LSTM能够充分的捕捉上下文特征信息,而CRF中有转移特征,即它会考虑输出label之间的顺序性。

多意图问句中会涉及到属性的推理与共享,其中时间属性和地点属性的推理最常见,依存句法分析能够分析出各个语义角色之间的依存关系,从而可以利用这些依存关系进行属性间的推理,而意图间的属性是否可以共享则根据意图之间的关系确定。比如:

预订明天北京上海的机票经济舱价格五百元左右再预定第二天返程的火车票动车二等座

其中这里面第二个意图的时间属性"第二天"需要根据第一个意图的时间属性"明天"进行推理。此外第二个意图的地点属性也需要根据第一个意图的地点属性来进行推理。

1.4 对话管理

在多轮交互时,我们设计了对话管理模块,该模块需要识别出本轮意图已经进行到哪一步,因为用户有时会跳出该意图,该模块可以将跳出的意图恢复,从而实现多轮交互。并且可以实现多任务的衔接和信息的共享。

对话管理模块的决策器中采用了深度强化学习Deep Reinforcement Learning中的Deep Q Learning算法来训练一个最佳上下文决策模型。其中决策过程为一个马尔可夫决策过程(MDPs),反复在会话中间节点状态S、会话话术行为A、回报R、状态S...之间轮换直到一次多轮对话结束,最终获得最佳回报即能够正确完成任务的Q network模型,该模型从而可以决策当前的会话由哪个业务模块去处理。

1.5 意图理解及处理

当对话管理模块将当前会话交给某个领域业务处理模块进行处理时,该模块就需要对这句话中用户的意图进行理解。虽然在这些特定的任务型领域,用户的意图相对比较确定,但人们的语言却是无法限定的,所以即使同一个意图的表达,不同的人、不同的场景、不同的时间,所用的文字话术多少会有些不同。

我们使用了文本匹配模型进行用户的意图理解,为了达到良好的匹配效果,所以使用双边多角度文本匹配模型Bimpm[3]进行用户问句与FAQ中话术的匹配(如图-2)。

图-2 Bimpm模型框架图

1.6 业务领域及逻辑处理

对于每个领域,该领域的业务逻辑处理模块需要确定该领域业务所需的信息点。每个领域的业务逻辑处理模块会根据当前会话的意图理解结果,将抽取解析到的信息,填充或者更新到对应的槽位。并根据当前各槽位的缺失情况进行交互引导,从而完善业务处理所需信息,进而完成用户的任务请求。

2 应用与意义

基于上述技术,深思考研发团队推出了新一代ideepwise交互机器人,该交互机器人可以在特定领域场景下达到近似于人一样流畅的交流,其中最为核心的是可以有效识别多意图问句中的多个子意图并对子意图的属性值进行准确的推理,此外在对话管理模块中通过深度强化学习Deep Reinforcement Learning进行信息和状态的处理,从而实现特定域任务型多轮语义交互。

参考文献

[1] Zhao W, Ye J, Yang M, et al. Investigating Capsule Networks with Dynamic Routing for Text Classification[J]. arXiv preprint arXiv:1804.00538, 2018.

[2] Dong C, Zhang J, Zong C, et al. Character-Based LSTM-CRF with Radical-Level Features for Chinese Named Entity Recognition[C]//International Conference on Computer Processing of Oriental Languages. Springer International Publishing, 2016: 239-250.

[3] Wang Z, Hamza W, Florian R. Bilateral multi-perspective matching for natural language sentences[J]. arXiv preprint arXiv:1702.03814, 2017.

]]> 原文: https://ift.tt/2AKAieJ
RSS Feed

机器知心

IFTTT

DeepSeek + Pi 王炸组合跑赢 Claude Code?-InfoQ每周精要No.935

「每周精要」 ...