深度学习

理解和使用深度学习网络

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

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

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

让我给你一个例子:这是一个与ANOVA统计分析相关的答案:

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

这并不难,除了一件事:我有超过30万个MATLAB答案,需要被划分到3500多个类别中。

MathWorks的产品文档超过40,000页,分布在MathWorks提供的90多个产品中。s manbetx 845这些文档页面被组织成超过3500个类别,使主题和参考页面易于查找和解析。在浏览文档页面时,你可能在左侧导航中使用过这些分类:

Building Help Center需要集成超过30万个MATLAB答案,并按类别将它们与现有的文档页面对齐。

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

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

我需要很多帮助。幸运的是,我需要的帮助就在这里:深度学习工具箱和文本分析工具箱。与我的团队合作,我们制定了一个计划,在很短的时间内完成这一非凡的壮举,自动分类数千个答案。它成功了!它比我们预期的还要好。

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

用于自动分类的深度学习

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

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

  1. 准备要用于培训的数据
  2. 使用训练数据训练一个模型
  3. 验证训练好的模型

步骤1:准备培训数据

我使用了以下MathWorks资源,这些资源将内容分类为不同的类别(手动管理)来构建模型:

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

rawTextArray = decodeHTMLEntities(rawTextArray);将HTML和XML实体转换为字符rawTextArray = lower(rawTextArray);将文档转换为小写rawTextArray = eraseURLs(rawTextArray);从文本中删除HTTP和HTTPS urlrawTextArray = eraseTags(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',' dotnet ');对特定于MathWorks数据的术语进行更多自定义保存…rawTextArray = regexprep(rawTextArray, '[\n\r]+',' ');从文本中删除\n和\rrawTextArray = eraspunctuation (rawTextArray);从文本中删除标点符号

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

preprocessed_tokens = tokenizedDocument(rawTextArray, 'Language', 'en');用于文本分析的标记文档数组preprocessed_tokens = removeWords(preprocessed_tokens, stopWords);从文档中删除所选单词preprocessed_tokens = removeShortWords(preprocessed_tokens, 2);从文档中删除简短的单词preprocessed_tokens = removeLongWords(preprocessed_tokens, 15);从文档中删除长单词output_analyzed_text = normalizeWords(preprocessed_tokens);词干或词根化单词

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

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

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

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

删除表中空文档的行。idxEmpty = strlength(data.preprocessed_text) == 0;data(idxEmpty,:) = [];要将数据划分为类,请将这些标签转换为类别。数据。Id = categorical(data.id);找到包含少于10个观测值的类。。idxLowCounts = classCounts < 10;infrequentClasses = classNames(idxLowCounts);从数据中删除这些不常见的类。使用removecats从分类数据中删除未使用的类别。idxinfrequency = ismember(数据。id, infrequentClasses);data(idxinfrequency,:) = [];数据。Id = removecats(data.id);将数据划分为训练分区和用于验证和测试的预留分区。。CVP = cvpartition(数据。id,“坚持”,0.1);dataTrain = data(training(cvp),:);dataHeldOut = data(test(cvp),:);cvp = cvpartition(dataHeldOut. cvp = cvpartition。id,“坚持”,0.5);dataValidation = dataHeldOut(training(cvp),:);dataTest = dataHeldOut(test(cvp),:);从分区表中提取预处理文本数据和标签。documentsTrain = tokenizedDocument(dataTrain。preprocessed_text, 'Language', 'en');documentsValidation = tokenizedDocument(数据验证。preprocessed_text, 'Language', 'en');documentsTest = tokenizedDocument(dataTest. documentsTest = tokenizedDocument)preprocessed_text, 'Language', 'en');YTrain = dataTrain.id;YValidation = datvalidid;YTest = dataTest.id;

训练数据摘录如下:

查看前几个预处理的培训文档。。documentsTrain(1:5) 5×1 tokenizedDocument: 26个token: integr fire neuron model s万博1manbetximulink integr fire neuron model simulink shufan simulink hdl coder simulink model integr fire neuron network model simulink integr fire neuron model 33个token:音频水印selvakarna音频水印selvakarna音频处理selva提取forman频率提取过程波selvakarna matlab simulink DSP系统定点设计matlab编码器信号处理音频水印selvakarna音频水印selvakarna 45令牌:万博1manbetx万博1manbetxSimulink initi schedul Simulink initi sequenti block execute exampl enable execute initi schedul sequenti trigger giampiero campa Simulink文件包含simpl exampl base enable subsystem block show execute Simulink block initi execute block initi sequenti schedul execute differ subsystem Simulink initi sequenti block execute exampl 10 token: power transfer limit simul kathir vel Simulink simul paper simul 19 token:Matlab图形simulin万博1manbetxk技术Matlab图形simulink simulul图形simulink live脚本mike garriti技术Matlab图形simulink simul

生成一个词云。

使用文字云可视化训练文本数据。图wordcloud (documentsTrain);标题(“训练数据”)

将文档设置为序列。

创建一个单词编码。enc = worddencoding (documentsTrain);使用doc2sequence将文档转换为数值索引序列。Seq_length = 800;XTrain = doc2sequence(enc, documentsTrain, 'Length', seq_length);XValidation = doc2sequence(enc, documentsValidation, 'Length', seq_length);

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

创建并训练LSTM网络设置培训配置。inputSize = 1;embeddingDimension = 100;numHiddenUnits = c. numwords;hiddenSize = 180;numClasses = nummel(类别(YTrain));层=[…]sequenceInputLayer(inputSize) wordEmbeddingLayer(embeddingDimension, numHiddenUnits) lstmLayer(hiddenSize, 'OutputMode', 'last') dropoutLayer(0.4) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];选项= trainingOptions('adam',…“LearnRateSchedule”,“分段”,…' learnratdropfactor ', 0.1,… 'LearnRateDropPeriod', 20, ... 'MaxEpochs', 25, ... 'GradientThreshold', 1, ... 'InitialLearnRate', 0.01, ... 'ValidationData', {XValidation, YValidation}, ... 'Plots', 'training-progress', ... 'Verbose', true, ... 'shuffle', 'every-epoch');使用trainNetwork功能对LSTM网络进行训练。net = trainNetwork(XTrain, YTrain,图层,选项);

步骤3:验证训练好的模型

我们同时使用客观和主观验证来验证模型是否如预期的那样工作。

目的验证

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

%%测试LSTM网络使用具有相同选项的doc2sequence将测试文档转换为序列就像创建训练序列一样。XTest = doc2sequence(enc, documentsTest, 'Length', seq_length);使用训练好的LSTM网络对测试文档进行分类。[YPred, PBScore] = category (net, XTest);提取前3个预测。classes = net.Layers(end).Classes;Classes_matrix = repmat(类,大小(类的));创建矩阵来表示所有的类[~, I] = sort(PBScore, 2, ' descent ');Top3_YPred = classes_matrix(I(:,1:3));计算模型精度。model_accuracy = nnz(rowfun(@ismember, table(YTest, Top3_YPred))))/ nummel (YPred);

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

主观验证

我们请员工帮忙测试我们预测的准确性。我们进行了大量的狂欢活动,用披萨、巧克力和奖品来吸引员工,以确保参与者在统计上具有显著意义。

测试的预测
  1. 首先,我们建立了一个常用短语列表,这些短语可能会被我们的MATLAB中心社区的客户使用。这些短语来自客户访问期间捕获的搜索短语。
  2. 然后,我们邀请了熟悉我们的产品线、客户群或AI工作原理的员工来参加一次聚会。我们要求他们使用我们内部的分类工具来搜索特定主题空间中的内容。然后,我们要求他们检查每个结果的建议类别,并对提出的类别做出主观判断。我们要求他们捕捉:
    1. 他们在寻找什么。
    2. 为整体预测打分,1为“好建议”,0为“差建议”。
    3. 一般来说,他们研究的是哪一类。
    4. 还有什么他们想分享的观察结果吗。
测试的分类
  1. 我们收集了一份正在使用的类别列表,以及针对该主题自动分类的社区提问的数量。
  2. 然后,我们邀请了熟悉我们产品线的技术支持人员参加了另一万博1manbetx次bash。这一次,我们要求他们访问网站,并导航到他们有技术专长的类别。他们要看这个类别的前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技术的有趣挑战、专业技巧和资源来结束这篇博客:

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

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

  • 开发自动质量测量和相关性测试:我们正在开发自动验证模型和分类过程的方法。我们设想了一个执行相关性测试套件的流程,以自动分析指标,并在出现异常时通知我们。自动化将帮助我们在数据刷新和模型升级期间节省开发时间。

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

  • 原型,原型,还是原型!不要害怕失败。人工智能可能很复杂。应用人工智能来解决复杂的问题就更难了。有时候你需要亲自动手去了解人工智能技术是否能为你工作。

  • 数据的真相可能会让你大吃一惊。使用人工智能技术通常会揭示数据的一些有趣模式。这些模式可以帮助识别您可能没有考虑过的有趣的用例/问题。

获取更多资源

  • 创建简单的文本分类模型是开始使用简单文本分类模型的一个极好的示例。它是一个简单的文本分类器,使用单词袋模型。
  • 使用深度学习分类文本数据是使用LSTM网络对文本数据进行分类的另一个很好的例子。它是一个复杂的文本分类器,但即使对于冷启动问题也可以返回一些很好的结果。
|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。