深度学习

理解和使用深度学习网络

使用深度学习的内容自动分类

这篇文章来自MathWorks的开发人员Anshul Varma,他将讨论一个项目,其中MATLAB用于实际生产应用程序:应用深度学习对MATLAB答案进行分类。

在2019年的春天,我遇到了一个严重的问题。我刚刚接到了一个任务MATLAB答案分类为新的帮助中心它将不同的文档和社区资源集成到一个单一的、基于类别的设计中。类别有助于根据主题组织内容,并使您能够轻松查找信息。

让我给你举个例子:这里有一个与方差分析统计分析相关的答案:

我把它放在方差分析的类别下人工智能、数据科学和统计学>统计学和机器学习工具箱>方差分析>方差和协方差分析。很简单,对吧?

这并不难,除了一件事:我有超过300000个MATLAB答案,需要分成3500多个类别。

MathWorks产品文档超过40000页,分布在MathWorks提供的90多个产品中。这些文档页面被组织为3500多个类别,以便于查找和分析主题和参考页面。在查看文档页下载188bet金宝搏面时,您可能在左侧导航中使用了这些类别:

构建帮助中心需要集成300000多个MATLAB答案,并按类别将其与现有文档页面对齐。

显然,手动为300000多个答案分配类别不是一个现实的解决方案:

  • 如何在短时间内完成数千个答案?
  • 我如何从了解整个类别分类的内容专家那里获得帮助?
  • 我如何手动对每周创建的数千个新答案进行分类,并使其成为一个可伸缩的过程?

我需要很多帮助。幸运的是,我需要的帮助就在这里:深度学习工具箱和文本分析工具箱。与我的团队合作,我们制定了一个计划,在短时间内完成这项了不起的壮举,自动对数千个答案进行分类。成功了!它的效果甚至比我们所希望的还要好。

让我告诉你我们是如何做到的。。。

自动分类的深度学习

我选择MATLAB和深度学习和文本分析工具箱来构建我的解决方案,因为以下两个主要原因:

解决一个经典问题有三个步骤监督学习文本分类问题,我们希望将文本内容分类到最相关的类别:

  1. 准备用于培训的数据
  2. 使用训练数据训练模型
  3. 验证训练后的模型

步骤1:准备培训数据

我使用了以下MathWorks资源,这些资源将内容分类为类别(手动策划),用于构建模型:

我使用文本分析工具箱进行数据准备。文本数据准备管道的第一部分主要用于数据清理,我们可以将HTML实体解码为字符,将文档转换为小写,擦除HTTP和HTTPS URL,擦除HTML和XML标记,最后从文本中删除所有电子邮件地址:

rawTextArray = decodeHTMLEntities (rawTextArray);%将HTML和XML实体转换为字符rawTextArray =低(rawTextArray);%将文档转换为小写rawTextArray = eraseURLs (rawTextArray);%从文本中删除HTTP和HTTPS URLrawTextArray=擦除标签(rawTextArray);%从文本中删除HTML和XML标记rawTextArray=regexprep(rawTextArray,[^@\s]*@[^@\s]*\.[^@\s]*','';%删除电子邮件地址

数据准备的下一步需要清理和保留有关内容的有价值信息,如果我们执行文本分析以删除所有标点符号,这些信息很容易丢失。删除标点符号将完全删除像“c++”这样的术语。在文本数据准备管道的这一部分中,我们保留了特定于编程语言的术语和一些特定于MathWorks数据的术语。从管道这一部分摘录的示例如下所示:

%在删除所有标点符号之前保留编程语言rawTextArray=replace(rawTextArray,'c++','cplusplus');rawTextArray=replace(rawTextArray,'c#','csharp');rawTextArray=replace(rawTextArray、.net、.net');%对特定于MathWorks数据的术语进行更多自定义保存。。。rawTextArray=regexprep(rawTextArray,[\n\r]+','';删除文本中的\n和\rrawTextArray = erasePunctuation (rawTextArray);%从文本中删除标点符号

文本数据准备管道的最后一部分是对文本数据进行标记和分析。我们对文档进行标记,删除停止词,删除短词和长词,最后对这些词进行规范化:

预处理的_标记=标记化文档(rawTextArray,'Language','en');%用于文本分析的标记化文档数组预处理的_标记=移除字(预处理的_标记,停止字);%从文档中删除所选单词preprocessed_tokens = removeShortWords(preprocessed_tokens, 2);%从文档中删除短单词预处理的_标记=removeLongWords(预处理的_标记,15);%从文档中删除长单词输出\u分析的\u文本=规范化记录(预处理的\u标记);%词干或柠檬化词

一旦所有文档都经过预处理,我们就可以使用它们来创建深度学习文本分类器。

步骤2:使用训练数据训练模型

我提到了利用深度学习对文本数据进行分类创建深度学习LSTM文本分类器的示例。我使用预处理和分析的数据来训练模型。

为培训、测试和验证准备数据:

%删除包含空文档的表的行。idxEmpty=strlength(data.preprocessed_text)==0;data(idxEmpty,:)=[];要将数据划分为类,请将这些标签转换为分类。数据。id =分类(data.id);%查找包含少于十个观察值的类。idxLowCounts=类计数<10;稀有类=类名(idxLowCounts);%从数据中删除这些不常见的类。使用removecats从分类数据中删除未使用的类别。idxInfrequent=ismember(data.id,不经常访问);data(idxInfrequent,:)=[];data.id=removecats(data.id);%将数据划分为训练分区和保留分区,以进行验证和测试。cvp=cvpartition(data.id,'Holdout',0.1);数据训练=数据(训练(cvp),:);dataHeldOut=数据(测试(cvp),:);cvp=cvpartition(dataHeldOut.id,'HoldOut',0.5);dataValidation=dataHeldOut(培训(cvp),:);dataTest=dataHeldOut(测试(cvp),:);%从分区表中提取预处理文本数据和标签。documentsTrain=tokenizedDocument(dataTrain.preprocessed_text,'Language','en');documentsValidation=tokenizedDocument(dataValidation.preprocessed_text,'Language','en');documentsTest=标记化文档(dataTest.preprocessed_text,'Language','en');YTrain=dataTrain.id;YValidation=dataValidation.id;YTest=dataTest.id;

培训数据摘录如下所示:

%查看前几个预处理的培训文档。压力(1:5)5×1标记文档:26个标记:integr fire neuron模型simulink integr fire neuron模型simulink 金宝appshufan simulink hdl编码器simulink模型integr fire neuron网络模型simulink integr fire neuron模型33个标记:音频水印selvakarna音频水印selvakarna音频处理selva提取forman频率提取处理波selvakarna matlab simulink dsp系统定点设计matlab编码器信号处理音频水印selvakarna音频水印selvakarna 45标记:simulink Inti schedul simulink Inti sequenti block execut exampl Enable execut Inti schedul sequenti触发器giampiero campa simulink文件包含Siml exampl base Enable子系统block show executsimulink block initi execut block initi sequenti schedul execut不同子系统simulink initi sequenti block execut execut示例10令牌:功率传输限制simul kathir vel simulink simulink simul纸张simul 19令牌:matlab图形simulink技术matlab图形simulink simulink实时脚本mike garriti技术matlab图形simulink模拟

生成一个单词云。

%使用单词云可视化训练文本数据图wordcloud(documentsTrain);标题(“培训数据”)

将文档设置为序列。

创建一个单词编码。enc=文字编码(documentsTrain);%使用doc2sequence将文档转换为数字索引序列。序号长度=300;XTrain=文件序列(enc,文件应变,“长度”,序列长度);XValidation=doc2序列(enc、文件验证、“长度”、序列长度);

准备培训选项,配置LSTM网络层,并执行培训。

%设置训练配置。输入大小=1;嵌入尺寸=300;numHiddenUnits=enc.NumWords;hiddenSize=180;numClasses=numel(类别(YTrain));layers=[…sequenceInputLayer(inputSize)wordEmbeddingLayer(embeddingDimension,numHiddenUnits)Lsmlayer(hiddenSize,'OutputMode','last')dropoutLayer(0.2)fullyConnectedLayer(numClasses)softmaxLayer classificationLayer];选项=培训选项('adam','LearnRateSchedule','Piecedise','LearnRateDropFactor',0.1,'LearnRateDropPeriod',20,'MaxEpochs',30,'GradientThreshold',1,'InitialLearnRate',0.01,'ValidationData','XValidation,YValidation','Plots','training-progress','Verbose',true);%使用trainNetwork功能对LSTM网络进行培训。net = trainNetwork(XTrain, YTrain, layers, options);

步骤3:验证经过训练的模型

我们使用了客观和主观验证来验证模型是否按预期工作。

目的验证

使用测试文件测试LSTM网络的准确性

%%测试LSTM网络%使用具有相同选项的doc2sequence将测试文档转换为序列当创建训练序列时。XTest=文件序列(附件、文件序列、长度、序列长度);%使用训练过的LSTM网络对测试文件进行分类。[YPred, PBScore] = classification (net, XTest);%提取前3个预测。类= net.Layers . class(结束);Classes_matrix = repmat(class, size(class '));创建矩阵来表示所有的类[~, I] = sort(PBScore, 2, '下降');Top3_YPred = classes_matrix(我(1:3));%计算模型精度。model_accuracy = nnz(table2array(rowfun(@ismember, table(YTest, Top3_YPred))))/numel(YPred));

该模型的分类预测精度约为70%。我们通过评估测试文档的类别是否与模型预测的前3个类别中的任何一个匹配来计算准确性。我们选择这种方法来计算精度,因为类别数据是分层的。分类是非常主观的,因为答案可以分为多个类别。在大多数情况下,由于类别和父子关系的性质,分类不是黑白的。我们不能完全依赖精度计算的客观分析进行验证。因此,我们进行了如下所述的主观验证。

主观验证

我们请员工帮忙检验我们预测的准确性。我们进行了无数次的狂欢,用披萨、巧克力和奖品来吸引员工,以确保参与者在统计上是显著的。

测试预测
  1. 首先,我们建立了MATLAB中心社区中客户可能使用的常用短语列表。这些短语来自于客户访问期间捕获的搜索短语。
  2. 然后,我们邀请熟悉我们的产品线、客户群或人工智能工作原理的员工参加一个聚会。我们要求他们使用我们的内部分类工具来搜索特定主题空间中的内容。然后,我们要求他们检查每个结果的建议类别,并对建议的类别做出主观判断。我们要求他们捕获:
    1. 他们在寻找什么。
    2. 将总体预测分为1分为“好建议”,0分为“差建议”。
    3. 总的来说,他们检查的是什么类别。
    4. 还有什么他们想分享的吗。
测试的分类
  1. 我们收集了一个正在使用的类别列表,以及针对该主题自动分类的社区提问问题的数量。
  2. 然后,我们邀请熟悉我们产品线的技术支持人员参加另一场盛金宝app会。这一次,我们要求他们访问该网站并导航到他们拥有技术专长的类别。他们将查看该类别的前10-20个答案,并评估结果是好的、坏的还是不清楚的。他们捕获了:
    1. 他们检查的类别。
    2. 分数为1(好)、0(差)或未知。
    3. 他们选择分数的具体原因。
    4. 如果他们说这个类别分类得很差,就会提出更适用的答案的建议。
在进行主观评估后,我们对采集和识别的数据进行了数值分析:
  • 我们对分类有信心的领域。
  • 算法可以改进的领域。
  • 我们需要额外测试的领域。

我们使用客观和主观验证生成指标并分析数据,以衡量分类的质量。总体而言,我们对结果感到满意。

That's it! We have created a text classification model using MATLAB Deep Learning and Text Analytics Toolboxes that can automatically assign categories to more than 300,000 Answers. Using MATLAB, we can automatically categorize the in-flow of new and updated Answers daily as well. It was a unique solution that helped save us a lot of time and manual effort. It made our processes scalable and manageable.

在结束本博客之前,让我与您分享一些在生产环境中使用AI技术的有趣挑战、专业技巧和资源:

在生产环境中使用人工智能技术的有趣挑战
  • 定期刷新模型以防止模型衰退:MathWorks文档和类别分类每6个月更新一次,作为MATLAB新版本的一部分。我们使用更新的训练数据和类别标签重新训练模型。然后将更新后的模型部署到生产环境中,以便将内容分类到正确的类别中。

  • 确定需要我们关注的类别以获得最佳用户体验:有些类别我们希望增强模型以获得更好的预测结果。我们确定此类类别的一种方法是查看培训数据集。我们发现缺少人工培训输入的类别。此类类别的分类质量次优。我们正在查看此数据集当我们重新培训模型时,我们需要6个月的时间。我们从组织内的内容专家那里获得帮助,以帮助策划。此活动为模型提供反馈,以改进未来的分类。

  • 开发自动质量测量和相关性测试我们正在开发自动化模型验证和分类过程的方法。我们设想一个过程来执行我们的相关性测试套件,自动分析度量标准,如果有异常就通知我们。自动化将帮助我们在数据刷新和模型升级期间节省开发时间。

专业提示
  • 当您考虑在生产中使用AI来解决问题时,我的一般建议是从易于理解和调试的东西开始,然后发展到更复杂的过程(如使用神经网络),如果它产生更好的结果。

  • 原型,原型,原型!不要害怕失败。人工智能可能很复杂。应用人工智能解决复杂问题更难。有时你需要把手伸进泥土里去理解人工智能技术是否适合你。

  • 数据的真实性可能会让你感到惊讶。使用人工智能技术通常会揭示一些有关数据的有趣模式。这些模式有助于识别您可能没有想到的有趣用例/问题。

了解更多信息的资源

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。