使用ML 和 DNN 建模的技巧总结

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
简介: 使用ML 和 DNN 建模的技巧总结

数据预处理(Data Preparation)

处理原始数据(Process Your Own Data)

640.png

因为消费者可能不知道开展数据处理和特征工程,所以数据分析师需要在模型内进行数据预处理。

  • 以文本分类问题为例,使用BERT进行分类。数据分析师不能要求客户进行标记处理和特征整理。
  • 以回归问题为例,时间是特征之一。在初始模型中,数据分析师只能使用星期几(如星期四)作为特征。经过几次迭代之后,星期几不再是一个好的特征因素,数据分析师只想使用日期(如31号)作为特征。而客户可能只提供了星期几的信息,而没有具体日期的信息,因此需要进行数据预处理。
  • 以语音识别为例,消费者只能向数据分析师发送音频,而不能发送诸如Mel Cepstral Coefficient(MFCC)等经典特征数据。

因此,建议在代码中嵌入数据预处理,而不是要求客户机进行预处理。

使用张量(Use Tensor)

张量是一个N维数组,用于多维计算。它比使用Python字典或数组要快,深度学习框架(例如PyTorch或TensorFlow)的对象数据格式是tensor。

数据扩充(Data Augmentation)

缺少标记数据是从业者通常面临的挑战之一。迁移学习是克服这一问题的途径之一,计算机视觉从业者可以考虑使用ResNet,自然语言处理从业者可以考虑BERT。另一方面,可以生成合成数据以增加标记数据。albumentationsimgaug可以生成图像数据,而nlpaug可以生成文本数据。

如果你了解你的数据,你应该量身设计数据扩充方法。请记住,数据科学的黄金法则是garbage in garbage out

数据采样(Sampling Same Data)

640.png

大多数情况下,我们希望随机抽取数据,以保持样本数据在训练集、测试集和验证集之间的概率分布是一致的。同时,也希望保持这种“随机”行为,使得我们可以在不同的时刻获得相同的训练集、测试集和验证集。

  • 如果数据带有日期属性,则可以按日期拆分数据。
  • 否则,可以更改随机种子,使其具有一致的随机行为。
importtorchimportnumpyasnpimportrandomseed=1234random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)

模型训练(Model Training)

存储中间状态(Saving Intermediate Checkpoint)

只是在训练完成后保存模型,通常具有以下几个缺点:

  • 由于模型的复杂性、计算资源和训练数据的大小,整个模型训练过程可能需要几天或几周的时间。如果没有中间状态被存储,这将是非常危险的,因为机器可能会被意外关闭。
  • 一般来说,较长训练能够获得更好的结果(例如,损失更少)。然而,可能会发生过度拟合。在大多数情况下,最后一个模型状态并不能提供最佳结果。我们大部分时间都需要使用中间状态的模型来进行生产。
  • 使用检查-停止机制能够节省资金。注意到一个模型在几个周期内并没有改进,我们可以早点停止它以节省时间和资源。

理想情况下,我们可以连续性存储模型(例如,在每个epoch之后保存模型),但它需要大量的存储。事实上,我们建议只保留最好的模型(或最好的三个模型)和最后一个模型。

虚拟周期(Virtual Epoch)

Epoch是模型训练中一个非常常见的参数。如果初始化不正确,可能会影响模型性能。

例如,如果我们有100万条记录,我们设置了5个epoch,那么总共有500万条的训练数据。三周后,我们又得到了50万条记录。如果我们使用相同的epoch进行模型训练,总训练数据将达到750万。问题是:

  • 难以确定模型性能的改进是由于特定数据的数量增加还是总体数据的数量增加。
  • 新的50万条数据使训练时间延长1小时甚至几天。它增加了机器故障的风险。

建议用虚拟epoch代替原始静态epoch。虚拟epoch可以根据训练数据的大小、期望epoch、批大小来计算得到。

通常的静态epoch如下:

#originalnum_data=1000*1000batch_size=100num_step=14*1000*1000num_checkpoint=20steps_per_epoch=num_step//num_checkpoint#TensorFlow/Kerasmodel.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch,
batch_size=batch_size)

而虚拟epoch如下:

num_data=1000*1000num_total_data=14*1000*1000batch_size=100num_checkpoint=20steps_per_epoch=num_total_data// (batch_size*num_checkpoint)#TensorFlow/Kerasmodel.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch,
batch_size=batch_size)

简化原则(Simple is Beauty)

640.png

从业者通常打算使用最先进的模型来构建初始模型。事实上,我们建议建立一个足够简单的模型作为基线模型。原因是:

  • 我们总是需要一个基线模型来证明所提出的模型是正确的。
  • 基线模型不需要在性能方面非常好,但它必须是可解释的。业务用户总是想知道预测结果的原因。
  • 易于实施是非常重要的。客户不能等一年才能得到一个足够好的模型。我们需要建立一套模型,以便从投资者那里获得动力,在初始模型的基础上建立你的精彩模型。

以下是一些建议的不同领域的基线模型:

  • 语音识别:可以使用经典特征,如mel frequency cepstral coefficient(MFCC)或 mel spectrogram features,而不是训练模型来获得向量表征(如增加嵌入层)。将这些特征传递给一个长短期记忆网络(LSTM)或卷积神经网络(CNN)和一个完全连接的层进行分类或预测。
  • 计算机视觉:TODO。
  • 自然语言处理:使用bag-of-words 或 classic word embeddings嵌入LSTM是一个很好的出发点,然后再转向其它模型,如BERT或XLNet。

调试(Debugging)

简化问题(Simplifying Problem)

有时,分类问题包括100万个数据和1000个类别。当模型性能低于理想值时,很难调试模型。糟糕的性能可能是由模型复杂性、数据质量或bug造成的。因此,建议简化问题,这样我们就可以保证它是无缺陷的。我们可以利用过度拟合问题来实现这一目标。

一开始,不需要对1000个类别进行分类,可以先对10个类别进行抽样,每个类别有100个数据,并训练模型。通过使用相同的训练数据集(或子集)作为评估数据集,能够过度拟合模型并获得良好的结果(例如,80甚至90+的精确度)。在这一基础上进行模型开发能够减少bug的出现。

使用评估模式(Using Eval Mode for Training)

如果评估模式的精度在前几个epoch中没有变化,通常可能是忘记在评估后重置为“训练”模式。

在Pytorch中,需要在训练和评估阶段转换训练模式以及评估模式。如果启用训练模式,批标准化、dropout或其他参数将受到影响。有时,数据分析师可能会在评估模式后忘记启用训练模式。

model=MyModel() #Defaultmodeistrainingmodeforeinrange(epoch):
#mode.train() #forgettoenabletrainmodelogits=model(x_train)
loss=loss_func(logits, y_train)
model.zero_grad()
loss.backward()
optimizer.step()
mode.eval() #enableevalmodewithtorch.no_grad():
eval_preds=model(x_val)

数据转换(Data Shifting)

当训练数据集与评估/测试数据集存在显著差异时,需要进行数据转换。在计算机视觉任务中,可能大部分训练数据是白天的图片,而测试数据是夜间的图片。

640.png

如果发现训练损失/准确度和测试损失/准确度之间存在很大差异,可以从两个数据集中随机抽取一些样本进行检查。为了解决这个问题,可以考虑如下方法:

  • 确保在训练、测试和预测数据集之间保持相似的数据分布。
  • 如果可能,添加更多的训练数据。
  • 通过利用相关库添加合成数据。考虑使用nlpaug(用于自然语言处理和声学任务)和imgaug(用于计算机视觉任务)。

欠拟合问题(Addressing Underfitting)

欠拟合是指训练误差大于期望误差。换言之,模型无法达到预期的性能。造成大误差的因素很多。要解决这个问题,可以从一个更简单的模型或者方法开始,看看它是否可以解决。

  1. 执行错误分析。通过LIME、SHAP或Anchor来解释你的模型,这样你就可以感觉到问题所在。
  2. 初始模型可能过于简单。增加模型的复杂性,例如增加长短期记忆(LSTM)层、卷积神经网络(CNN)层或完全连接(FC)层。
  3. 通过减少正则化层,稍微过拟合模型。Dropout和降低权重则可以防止过拟合。然后可以尝试移除这些正则化层,看看是否可以解决问题。
  4. 采用最先进的模型架构。考虑在自然语言处理(NLP)中使用转换器(如BERT或XLNet)。
  5. 引入合成数据。生成更多数据有助于提高模型性能,而无需任何人工操作。理论上,生成的数据应该共享同一个标签。它允许模型“看到”更多不同的数据,并最终提高鲁棒性。可以利用nlpaug和imgaug来执行数据扩充。
  6. 分配更好的超参数和优化器。可以考虑执行超参数调整,而不是使用默认/常规学习速率、epoch、batch size。考虑使用波束搜索、网格搜索或随机搜索来识别更好的超参数和优化器。这种方法相对简单,只需改变超参数,但可能需要较长的时间。
  7. 重新查看数据并引入额外的特征。

过拟合问题(Addressing Overfitting)

除了欠拟合,你还可能面临着过拟合的问题。过度拟合意味着你的模型太适合你的训练集,而对其他数据没有足够的适用性。换句话说,训练集准确性比验证集准确性要好。考虑以下解决方法:

  1. 执行错误分析。通过LIME、SHAP或Anchor来解释你的模型,这样你就可能发现问题所在。
  2. 增加更多的训练数据。
  3. 引入正则化层。Dropout(正则化层)和批处理标准化(normalization layer)通过删除一些输入和平滑输入来帮助减少过度拟合。
  4. 引入合成数据。生成更多数据有助于提高模型性能,而无需任何人工操作。
  5. 分配更好的超参数和优化器。
  6. 移除部分特征。
  7. 模型可能太过于复杂。可以减少模型复杂度。

生产(Production)

元数据联系(Meta Data Association)

在模型推出后,需要检查一些例外数据。一种方法是生成ID并将添加到数据库中。然而,它伴随着几个问题,也增加了故障排除的难度。以下是一些缺点:

  • 影响系统的灵活性。从体系结构设计的角度来看,解耦是构建高柔性系统的途径之一。如果我们生成ID并将带有此ID的预测结果传递给客户,那么客户需要在其数据库中持久使用它。如果我们更改了格式或数据类型,需要通知所有使用者更新他们的数据库。
  • 我们可能需要根据使用者的关键数据收集更多的元数据。额外的关键数据增加了连接的复杂性和存储消耗。

为了克服这个问题,预测结果应该直接与使用者的关键数据相关联。

转换为推理模型(Switch to Inference Mode)

使用Pytorch时,在将模型部署到生产环境中时,需要注意几个设置。前面提到了Pytorch中的eval,它使这些层(如Dropout、BatchNorm)在推理模式下工作,例如在推理阶段内不应用任何Dropout操作。它不仅能加快你的进程,而且能把所有的信息输入神经网络。

mode.eval() #enableevalmodewithtorch.no_grad():
eval_preds=model(x_val)

计算成本(Scalling Cost)

当尝试扩展API以处理更大的数据量时,有时可能会考虑使用GPU。的确,GPU虚拟机比CPU贵得多。然而,GPU带来了一些优势,例如计算时间更少,并且需要较少的VM来维持相同的服务级别。数据分析师应该试着评估一下GPU是否能节省一些钱。

无状态化(Stateless)

试着使你的API无状态化,这样你的API服务可以很容易地调整。无状态意味着不在API服务器(内存或本地存储)中保存任何中间结果。只需保持API服务器的简单性,并将结果返回给客户端,而无需在内存或本地存储中存储任何内容。

批处理(Batch Process)

预测一组数据通常比逐个预测更快。大多数现代机器学习或深度学习框架优化了预测性能(在速度方面)。你可能会注意到,切换到批处理模式预测对于效率有很大的改进。

使用C++

虽然Python是机器学习领域中的主流语言,但与其他编程语言(如C++)相比,Python可能太慢了。如果希望低延迟的计算推理时间,可以考虑使用TorchScript。一般的方案是,你仍然可以在Python中训练你的模型,但是通过使用它生成C++兼容的模型。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
机器学习/深度学习 TensorFlow 算法框架/工具
ML之LiR&DNN&EL:基于skflow的LiR、DNN、sklearn的RF对Boston(波士顿房价)数据集进行回归预测(房价)
ML之LiR&DNN&EL:基于skflow的LiR、DNN、sklearn的RF对Boston(波士顿房价)数据集进行回归预测(房价)
ML之LiR&DNN&EL:基于skflow的LiR、DNN、sklearn的RF对Boston(波士顿房价)数据集进行回归预测(房价)
|
机器学习/深度学习 算法 PyTorch
OpenCV-图像着色(采用DNN模块导入深度学习模型)
OpenCV-图像着色(采用DNN模块导入深度学习模型)
184 0
来自OpenCv的DNN模块助力图像分类任务
来自OpenCv的DNN模块助力图像分类任务
186 0
来自OpenCv的DNN模块助力图像分类任务
|
机器学习/深度学习 数据库 SQL
|
机器学习/深度学习
DNN 模块MVP 模式学习中的一些问题
为了让View部分可以测试,我们使用interface来分离View和业务逻辑的耦合。 我的问题是: Q:对于在aspx.design.cs中声明的控件,我们也需要在interface中声明吗?如果要声明,那么在aspx.design.cs中的控件声明是不是就是interface的实现? 我们不能在interface直接声明跟aspx.design.cs控件同名的变量,我们应该认为aspx.design.cs中的控件就是view的一部分,我们无法控制。
500 0
|
机器学习/深度学习 前端开发
介绍一些免费的DNN模块
网址:http://oliverhine.com/DotNetNuke.aspx Administration Advanced Control Panel Free fully featured ajax enabled control panel replacement for Dot...
851 0
|
机器学习/深度学习
如何使用NAnt 自动打包DNN模块 之一
一、安装NAnt 每次开发完毕一个DNN模块的版本,打包DNN模块是一件很繁琐的事情。更重要的是,为每一个发布的版本做一个安装包如果用手工管理和容易出错。这里介绍一下如何使用NAnt自动打包模块。 首先需要下载NAnt,http://sourceforge.net/projects/nant/ 下载之后解压这个ZIP包 解压之后的目录重名名为NAnt,拷贝到c:下面。
973 0
|
机器学习/深度学习 SEO
介绍几个DNN SEO模块,可免费试用的
iFinity Url Master - Get the best SEO results by taking control of your DNN urls iFinity Tagger - Tag your DNN content and create specific, target...
632 0
|
XML 机器学习/深度学习 数据格式
DNN Navisuite菜单模块原始XML文件的格式
DNN 比较好用的一个菜单模块式Navsuite模块,这个模块因为使用XML+XSL的技术手段,可以灵活的生成各种各样的菜单样式。 你可以通过修改style目录下的xsl文件来创建自己的菜单样式,但有一个问题是这个模块没有非常详细的手册,生成的XML是什么格式我们并不熟悉,我这里把生成的XML贴出来给大家参考。
819 0
|
机器学习/深度学习 内存技术
DNN免费模块集锦
注:本贴还在更新中。 Text/HTML 整站内容替换模块 DNN Text/HTML Replacement Tool  站点计数器模块 Free Visitor Counter CounterXP  Google Analytics 模块 iFinity Google Analyt...
755 0

热门文章

最新文章

下一篇
无影云桌面