深度学习

理解和使用深度学习网络

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

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

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

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

我把它放在方差分析的类别下AI, Data Science, and Statistics >统计学和机器学习工具箱> ANOVA >方差和协方差分析。足够简单,对吗?

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

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

构建帮助中心需要集成超过30万个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 = 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 = erasePunctuation (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 =分类(data.id);找到包含少于10个观察值的类。idxLowCounts = classCounts < 10;infrequentClasses =一会(idxLowCounts);从数据中删除这些不常见的类。使用removecats从分类数据中删除未使用的类别。idxInfrequent = ismember(数据。id, infrequentClasses);:数据(idxInfrequent) = [];数据。id = removecats (data.id);%将数据划分为训练分区和保留分区,用于验证和测试。本量利= cvpartition(数据。id,“坚持”,0.1);dataTrain =数据(训练(cvp):);dataHeldOut =数据(测试(cvp):);本量利= cvpartition (dataHeldOut。id,“坚持”,0.5);dataValidation = dataHeldOut(培训(cvp):);人数(= dataHeldOut(测试(cvp):);%从分区表中提取预处理文本数据和标签。documentsTrain = tokenizedDocument (dataTrain。preprocessed_text,“语言”,“en”);documentsValidation = tokenizedDocument (dataValidation。preprocessed_text,“语言”,“en”);documentsTest = tokenizedDocument(人数(。preprocessed_text,“语言”,“en”);YTrain = dataTrain.id;YValidation = dataValidation.id;欧美= dataTest.id;

训练数据摘录如下:

%查看前几个预处理的培训文档。documentsTrain(1:5) 5×1 tokenizedDocument: 26 tokens: integr fire神经元模型simulink 金宝appintegr fire神经元模型simulink shufan simulink hdl coder simulink模型integr fire神经元网络模型simulink integr fire神经元模型33 tokens:音频水印selvakarna音频水印selvakarna音频处理selva提取forman频率提取过程selvakarna matlab simulink DSP系统fixedpoint设计matlab编码器信号处理音频水印selvakarna音频水印selvakarna 4金宝app5令牌:金宝appSimulink inititi schedul Simulink inititi sequenti block execute exampl enable execute inititi schedul sequenti trigger giampiero campa Simulink file contains simpl exampl base enable subsystem block show execute Simulink block inititi execute block inititi sequenti schedule execute differ子系统Simulink inititi sequenti block execute exampl 10令牌:功率传输限制仿真kathir vel simulink仿真纸simulink金宝app仿真19令牌:matlab图形simulink technik matlab图形simulink simulink live script mike garriti technik matlab图形simulink simulk

生成单词云。

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

将文档设置为序列。

创建一个单词编码。内附= wordEncoding (documentsTrain);%使用doc2sequence将文档转换为数字索引序列。seq_length = 300;XTrain = doc2sequence(enc, documentsTrain, 'Length', seq_length);XValidation = doc2sequence(enc, documentsValidation, 'Length', seq_length);

准备训练选项,配置LSTM网络层,进行训练。

%设置训练配置。inputSize = 1;embeddingDimension = 300;numHiddenUnits = enc.NumWords;hiddenSize = 180;numClasses =元素个数(类别(YTrain));图层=[…]sequenceInputLayer(inputSize) wordEmbeddingLayer(embedddingdimension,numHiddenUnits) lstmLayer(hiddenSize,'OutputMode','last') dropoutLayer(0.2) fullconnectedlayer (numClasses) softmaxLayer classificationLayer];options = trainingOptions('adam',…“LearnRateSchedule”、“分段”,…“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 = doc2sequence(enc, documentsTest, 'Length', seq_length);%使用训练过的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. 然后,我们邀请了熟悉我们产品线的技术支持人员参加另一个金宝appbash。这一次,我们要求他们去网站,并导航到一个他们有技术专长的类别。他们要看这一类别的前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계정에로그인하거나계정을새로만드십시오。