文本分类流程及可能遇到的问题

2023-10-27

文本分类整体流程及可能遇到的问题


文本分类是一个常见的任务,垃圾邮件分类、评论情感极性分析、舆情分析、新闻分类等等,在网上随便搜索都会出现满屏的解决方案和已有模型。在工作或学习中,接到一个分类任务,可能我们就直接套用已有的模型、方法开始尝试,如果效果还不错,那么这个问题就跳过开始下一个问题了;但一般效果可能不太理想:各种指标(auc、f1、accuracy)达不到目标值,这时候我们才回过头来分析怎么去提升,可能这是大家常用的求解思路。

那么,我们跳出具体的任务从整体上思考如下两个问题:

  • 一个分类任务的完整流程大概是什么样的?
  • 求解过程中,可能遇到哪些问题以及对应的求解方向是什么?

针对上述两个问题,结合自己在工作中遇到的问题,有如下的总结,个人经验,不喜轻喷

备注:本文仅讨论文本分类,其他的分类任务可能有共通之处,但也可能存在不同,没有免费的午餐,不能一法解万题

分类任务的整体流程

从我们接到一个任务开始,到最终满意的解决这个任务结束,这中间要经历的过程大致如下:

  • 对于接到的任务,我们首先需要明确任务的目标和评估方式:实现或者提升指标到某个程度。这里的指标一般是和业务相关的,例如患癌症病例分类中,正负样本极度不平衡这时候评估accuracy可能意义就不大。由于业务背景和关注点的不同,即使同一个分类任务的关注点和评估维度也是不同的:召回率、精确率、F1、auc、影响面等
  • 明确我们的目标后,需要进行数据的获取收集,有时候数据是比较容易获取的,例如点击率数据、评论数据等,有些领域的标注数据可能获取成本比较大,这时候会面临一些小样本甚至无样本的难题
  • 无论我们通过什么方式获取了一批模型训练数据后,直接扔进模型一般不是太好的做法,无论是人工标注还是自动收集的数据,都会存在噪声、错误的数据。需要通过一定的数据清洗工作后得到模型训练的初版数据
  • 针对文本分类问题,LSTM、TextCNN、Bert、ERNIE等模型都是不错的解决方案,如何结合业务需求进行模型的选型是当前步骤需要考虑的问题,cpu还是gpu训练和推理、离线还是在线应用、数据规模、平均响应时间要求等都是我们考虑模型的因素
  • 敲定模型后的实验过程,如何保证实验的科学性是我们方案有效与否的关键点,无效或错误的对比指标或实验过程,会带来无休止的返工,实验过程常见错误包括编码错误(代码逻辑bug)、数据错误(收集的数据错位、缺失等)、评估错误(不具有可比性)等
  • 离线评估的必要性是因为直接线上实验具有较大的代价和风险,离线评估进行的前提是,离线评估环境和线上环境是等价的
  • 最后是部署和上线,这是一个算法和工程结合的过程,在不同公司、不同岗位上要求是不同的,主要涉及机器资源、特征校验、模型上线等过程

对于一个文本分类任务,大概的流程如上所描述,但每个步骤中,会存在许许多多奇奇怪怪可能遇到的问题。

可能遇到的问题及求解思路

搞机器学习和算法的,应该都听过一句话:数据和特征决定了上限,模型只是在逼近这个上限。从这句话可以看出,数据和特征是一个任务的重中之重,而任务中可能遇到的问题,也大都出现在数据和特征上。

数据:小样本问题

目前针对文本分类而言,几乎所有的任务都是有监督的,少部分是无监督+有监督结合,这就导致对标注数据存在极大的需求。对于比较普遍、通用的任务而言,可以借助公开的数据进行辅助模型训练,而小众领域的任务,标注数据缺失的问题太普遍了。

针对标注数据不多的问题,一般有两个思考方向:

  • 增加数据
  • 增强模型

前者是通过各种手段,例如采样、生成、变换、EDA等,扩大标注数据的规模;后者是仅利用已有的数据,通过迁移学习、预训练、Prompt等方式,提前学习一些通用的知识,在特定领域进行微调。两种方式效果再特定任务上可能存在难易程度、资源、耗时等差异,需要结合具体的任务,酌情选择。

针对小样本学习,一些常用的解决方案如下:

  • 小样本:https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&mid=2247490516&idx=1&sn=16b1c520f312400ffcad5573d4330e08&scene=21#wechat_redirect
  • 主动学习:https://github.com/km1994/NLP-Interview-Notes/blob/main/Trick/SmallSampleProblem/activeLearn/readme.md
  • 对抗训练:https://github.com/km1994/NLP-Interview-Notes/blob/main/Trick/SmallSampleProblem/AdversarialTraining/AdversarialTraining.md
  • few-shot:https://github.com/oscarknagg/few-shot

针对数据样本不足的一些解决方案如下:

  • EDA:https://github.com/km1994/NLP-Interview-Notes/blob/main/Trick/SmallSampleProblem/EDA/eda.md
  • UDA:https://github.com/google-research/uda

数据:数据噪声问题

获取数据后直接拿过来扔进模型,未尝不可,但可能存在“脏数据”导致模型学到的东西是有偏或者错误的。“脏数据”指的是训练数据中存在的噪声、错误数据。例如词带模型、TF-IDF等统计模型中的停用词问题,文本分类中对于无效字符,例如特殊字符、url链接、乱码等数据的清理。对数据的熟悉程度越高,越能够得到高质量的训练数据。

针对脏数据问题,常见的介绍和解决方案:

  • 脏数据:https://github.com/km1994/NLP-Interview-Notes/blob/main/Trick/noisy_label_learning

数据:正负样本比例失衡问题

获取一批数据后,不论应用统计机器学习模型还是深度网络模型,其大概的本质是对训练数据的拟合,如果训练数据存在某种偏差或不平衡,那么模型极大概率会认为这种不平衡是数据内在的特性而不是数据问题。在癌症、点击等常见场景下,正负样本比例失衡是很常见的问题,处理数据分布不均衡最直接的方法是对数据的采样,例如过采样、下采样等,除此之外,调整模型,例如集成学习、加权学习,甚至调整损失函数,都是对不平衡样本的一种有效策略。

常见处理方案:

  • 类别不平衡:https://blog.csdn.net/vivian_ll/article/details/105201120

特征:文本纠错问题

输入文本是可能存在错误的,例如用户在搜素框中输入“中国首都背景”,错误的类型有多种多样的,例如错写、少写、谐音、网络用语等。错误的输入可能导致完全相反的分类结果,尤其是在文本翻译、语音识别等场景下。针对文本纠错,最常用的思路是通过统计共现情况,实现词汇的纠正:通过共现,计算候选集中可能的词或字的概率。在一般的文本分类中,可能文本纠错不是一个必须考虑的问题。

特征:文本长度问题

我们都知道,无论机器学习还是深度学习,都是接受一定长度的输入(特例除外),而文本分类中,通常我们会设定一个padding的长度,实行“长截短补”的策略:大于padding长度的文本进行阶段,小于padding长度的文本进行填充。对于比较稀疏的文本信息而言,阶段可能会带来一定的错误,例如长文本中信息可能在后半部分,由于阶段这部分数据是看不到的,但无限制的过大模型的输入长度,也会带来时间、资源的增加,因此这是一个多方的平衡。

不扩大长度的情况下,如果获取更多的有效信息,是目前许多研究的重点,常见的思路有:

  • 不同padding方式,采取随机padding、中间padding、等比padding等
  • 压缩输入文本,通过关键词句提取、摘要生成等方式,对长文本保证基本内容下压缩长度

文本长度是文本分类中比较重要的问题,不合理的文本长度设置,可能会导致不如人意的模型效果。

标签:标签问题

标签,是有监督学习的目标,如果标签出现问题,那么可能学到的模型大概率不会有效。这里的标签问题,指的是标签错误漏标、错标问题

针对多标签文本分类,同一个文本具有多个标签情况下,只标注少量标签漏标的标签会被赋予默认值,是一种非常常见的现象;单标签分类情况下,错误标注文本标签,可能误导模型无法收敛或者到达鞍点的局部最优。

但但我们不可能对所有的数据标签进行校验:代叫太大甚至无法校验,这种情况下,对标注数据的标签存有怀疑是一种不错的选择,也就是置信学习或标签平滑

  • 置信学习:https://github.com/subeeshvasu/Awesome-Learning-with-Label-Noise
  • 标签平滑:https://github.com/km1994/NLP-Interview-Notes/blob/main/Trick/LabelSmoothing

模型:模型选型

针对文本分类任务,现在可选的模型太多了,堪比古代全国选秀,简单点的xgb、CNN、RNN、LSTM,复杂点的TextCNN、Fasttext、TextRCNN等,再到大模型Bert、AlBert、RoBert系列等,无论是经典树模型,还是深度网络模型,都可以是解决这个问题的备选方案,面对如此繁多的备选项,合适的才是最好的

  • 数据量
    • 如果数据量较少,可以选择预训练模型,省事效果也不错
    • 如果数据量足够,可以选择轻量模型TextCNN等
  • 耗时、资源
    • 如果资源足够、耗时允许,那么模型直接奔着大模型去了
    • 如果资源还可以,但耗时要求很高,那么可能就需要离线模型训练,然后蒸馏提升速度
    • 如果资源和耗时都比较现实,老老实实做数据和特征,用小模型也是一个比较好的选择

模型:超参数优化问题

现在随便一个网络模型,可选项组合起来都是吓死人级别的,bn、dropout、lr、l1、l2、batch_size、channel、……面对这么多的参数,可能我们大多数时候,都是默认参数,或者祈祷幸运女神临幸你,自己为数不多的调参下,能够达到比较好的效果,哈哈哈哈。

这么多的参数,自动化的参数调优有一些框架可用,但对任务和数据的了解,能够帮助我们极大的提高调参效率

  • batch size:https://github.com/km1994/NLP-Interview-Notes/blob/main/Trick/batch_size
  • 早停:https://github.com/km1994/NLP-Interview-Notes/blob/main/Trick/EarlyStopping
  • NNI:https://nni.readthedocs.io/zh/stable/index.html

模型:模型耗时问题

随着模型规模的越来越大,模型效果也越来越好,但随之而来的是同等情况下,资源消耗越来越大、耗时越来越高。对大模型的轻量化也是目前研究的重点,主要有三个方向:

  • 模型蒸馏:https://zhuanlan.zhihu.com/p/71986772
  • 模型量化:https://zhuanlan.zhihu.com/p/132561405
  • 模型剪枝:https://nni.readthedocs.io/zh/stable/tutorials/pruning_quick_start_mnist.html

三个方向难易程度以及成熟程度不尽相同,目前而言在保证效果情况下,模型蒸馏可能是最佳的选择。

模型:模型评估问题

我们累死累活的获取数据、处理数据、挑选模型、模型优化后,那最终如何评估模型效果呢?用accuracy评估点击率?很多时候评估指标的确定要结合业务背景,但通用的auc和f1指标适用了大多数情况,对于比较稀有的领域可能有自己的指标,例如覆盖面、影响面,甚至是多指标结合情况:xx影响面下的xx召回率等。

对于模型的效果,我们需要给出一个合理的解释,这个解释就是指标,说明为什么我们做的是比之前优的。

总之,在文本分类过程中,从接手到完成的过程中,可能会遇到许许多多的问题,来自数据、特征、模型、评估、资源等各个维度,不同的问题需要考虑的点也不尽相同,希望随着经验、知识的增多,能够解决问题更加得心应手。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文本分类流程及可能遇到的问题 的相关文章

随机推荐

  • Python教程:第2章(Python进阶)2.8-2.11

    文章目录 2 8 四大数据结构 2 8 1 单向队列 List 2 8 2 双向队列 Queue 2 8 3 栈 Stack 2 8 4 链表 Link 2 9 八大基础算法 2 9 0 算法复杂度 2 9 1 穷举算法 2 9 2 归纳
  • sqli-labs 38-45

    第38关 堆叠注入 简单理解就是一条语句结束后再连接一条语句 这就叫堆叠注入 举几个最简单的例子 查询数据并创建一个数据库 select from users creat database test 查询数据并删除一个数据库 select
  • java实现成绩及格的判定( true & false )

    成绩及格的判定 代码思想 1 使用条件语句 大于60及格 否则不及格 代码如下 List item IF else语句执行 import java util Scanner public class Test02 public static
  • Spring Boot中的Actuator是什么?Spring Boot中的Starter依赖是什么?

    Spring Boot中的Actuator是什么 在Spring Boot中 Actuator是一种用于监控和管理应用程序的工具 它提供了一些额外的端点和功能 使开发人员能够更好地了解和控制他们的应用程序 Actuator提供了以下功能 指
  • 【计算机视觉

    文章目录 一 分割 语义相关 6篇 1 1 Consistency guided Meta Learning for Bootstrapping Semi Supervised Medical Image Segmentation 1 2
  • Qt Creater创建项目时无法选择Kit选项 No suitable kits found

    项目场景 初步学习Qt编程 Qt Creator 安装 问题描述 创建工程时无法选择Kit套件 原因分析 No suitable kits found 没有找到合适的kits套件 在安装Qt Creator时没有安装MinGW 最直接的办法
  • 使用QT RemoteObject让两个软件(.exe)之间进行通信(VS2019+QT5.15)

    博主将两个软件进行通信是因为项目中出现调用的库只有32位的DLL和LIB 而自己写的软件却是64位 导致我的软件无法使用这个库 让我没办法控制 然后想到解决方法是写一个专门的32位软件调用这个库 然后通过与我现在写的软件进行通信 类似信号和
  • Gradle 入门之 Groovy 语言详解

    Gradle 核心是基于 Groovy 脚本语言 Groovy 脚本基于 Java 且拓展了 Java 因此 Gradle 需要依赖 JDK 和 Groovy 库 快速安装 Groovy 可以通过 Bash 命令如下 curl s get
  • 【数据结构】栈和队列的实现及应用

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 一 栈的概念 二 Stack h 三 Stack c 1 栈的初
  • centos 6.8 es安装

    配置操作系统参数 1 切换到root用户修改配置sysctl conf vi etc sysctl conf 添加下面配置 vm max map count 655360 1并执行命令 sysctl p 配置es参数 bootstrap m
  • C++ 数组

    C 支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 数组的声明并不是声明一个个单独的变量 比如 number0 number1 number99 而是声明一个
  • STM32CubeIDE 集成的cube MX配置寄存器,IDE入门上手

    1 STM32CubeIDE属于一站式工具 本文带你体验它的强大 strongerHuang的博客 CSDN博客 STM32CubeIDE是一个多功能的集成开发工具 集成了TrueSTUDIO和STM32CubeMX 它是STM32Cube
  • ZYNQ QFLASH MX25L256 调试笔记

    该QFlash是32MB的 而ZYNQ的控制器是16MB的 所以想使用后半部分时 必须要使用4byte地址模式或者扩展模式 先调试扩展模式 在QFlash手册里面有一个写扩展模式命令 C5 写命令的时候 然后再读扩展模式寄存器 C8 就可以
  • Java项目:博客系统西瓜社区(springboot+mybatis-plus+thymeleaf)

    西瓜社区文档 项目全部源码百度网盘地址在文档中 仔细阅读就可发现 前端 社区目前基于开源的markdown框架editorme进行开发的问答和博客的两个功能 后端 springboot mybatis plus swagger2 thyme
  • 记Springboot项目中@Service(或@Component)注解失效的问题解决方法

    一 问题描述 今天基于SpringBoot写好的一个项目程序 启动时 报如下错误 2020 04 07 14 04 41 420 WARN o s b w s c AnnotationConfigServletWebServerApplic
  • 预测数值型数据:回归

    本文传送机 用线性回归找到最佳拟合直线 局部加权线性回归 通过缩减系数来 理解 数据 岭回归 lasso 前向逐步回归 用线性回归找到最佳拟合直线 线性回归 优点 结果易于理解 计算上不复杂 缺点 对非线性的数据拟合不好 适用数据类型 数值
  • 使用WIFI连接新大陆云平台(基于RT_Thread操作系统)

    前言 使用RT Thread Studio 连接WIFI 首先我们需要配置WIFI 具体的配置参考上面这篇文章 下面将会讲述使用WIFI连接到新大陆云平台 相关的AT指令 1 设置WIFI为Station模式 AT CWMODE 1 2 重
  • 拜托!别再问我hashmap是否线程安全

    拜托 别再问我hashmap是否线程安全 一 糟糕的面试 面试官 小王 你说说HashMap的是线程安全的吗 小王 HashMap不安全 在多线程下 会出现线程安全问题 他兄弟HashTable 线程是安全的 但是出于性能考虑 我们往往会选
  • 刷脸支付商家更有针对性地与目标群体互动

    现在我们外出买东西付款 已经有了非常便捷的扫码支付功能 这个功能不仅是年轻人喜欢使用 就连中老年人也跟上的时代的步伐 许多超市 便利店已经菜市场 都能够看到二维码的身影 但是随着时代不断地进步 扫码付款这一新兴方式 接二连三地被曝出许多风险
  • 文本分类流程及可能遇到的问题

    文本分类整体流程及可能遇到的问题 文本分类是一个常见的任务 垃圾邮件分类 评论情感极性分析 舆情分析 新闻分类等等 在网上随便搜索都会出现满屏的解决方案和已有模型 在工作或学习中 接到一个分类任务 可能我们就直接套用已有的模型 方法开始尝试