李rumor 3个月学习NLP路线(补充)

Posted on 2024-04-20 20:16  LIN_Lighto  阅读(36)  评论(0编辑  收藏  举报

原视频链接:bilibili 思维导图 

leerumor:nlp_tutorial github 

 

第一个月

1-基础知识

概率论与数理统计、线性代数

python编程、矩阵运算

材料:学习需要2周,建议初学者先看懂线性分类、svm模型、图模型。

教材:李航《统计学习方法》 微信读书 

视频:吴恩达的cS229公开课 bilibili 

林田轩的机器学习基石 bilibili 

shuhuai008的白板推导系列 bilibili 

 

2-经典模型

深度学习基础需要两周,先学会神经网络的前后向推导,再去看这些经典的编码器。先有大致的理解,知道都有什么方法,出于什么理论,解决了什么问题,后续的学习中在不断补足。

邱熙鹏《神经网络与深度学习》教材 github 

吴恩达的深度学习网课 bilibili 

李宏毅的深度学习网课 bilibili 

 

第二个月

3-任务范式与技巧

 

文本分类 SurveyTranslation 

文本分类是NLP应用最多且入门必备的任务,TextCNN堪称第一baseline,往后的发展就是加RNN、加Attention、用Transformer、用GNN了。第一轮不用看得太细,每类编码器都找个代码看一下即可,顺便也为其他任务打下基础。

但如果要做具体任务的话,建议倒序去看SOTA论文,了解各种技巧,同时善用知乎,可以查到不少提分方法。

图源:arxiv 

应用:情感分析(SA),话题标签(TL),新闻分类(NC),问题解答(QA),对话行为分类(DAC),自然语言推断(NLI),事件预测(EP)。

  • 情感分析:sentiment analysis ( SA)
  • 话题标记:topic labeling(TL)
  • 新闻分类:news classification (NC)
  • 问答系统:question answering(QA)
  • 对话行为分类:dialog act classification (DAC)
  • 自然语言推理:natural language inference (NLD)
  • 关系分类:relation classification (RC)
  • 事件预测:event prediction (EP)

浅层学习模型:预处理与数据统计,根据所选特征将表示的文本输入分类器。

  • BOW:用字典大小的向量表示每个文本。向量的单个值表示对应于其在文本中固有位置的词频。
  • N-gram:相邻单词的信息,并通过考虑相邻单词来构建字典。
  • TF-IDF(术语频率倒排文档频率)、BM25:使用单词频率并反转文档频率来对文本建模。
  • word2vec:使用本地上下文信息来获取单词向量。
  • GloVe:具有局部上下文和全局统计功能-训练单词-单词共现矩阵中的非零元素。

分类器:知乎

  • 概率图模型(PGM-based methods)表示图中特征之间的条件依赖关系,如:贝叶斯网络、隐马尔可夫网络。
  • K近邻算法(KNN-based Methods)对一个未标记的样本进行分类,在最近接K的标记样本上找到样本数量最多的类别。
  • 支持向量机算法(SVM-based Methods)在一维输入空间或者特征空间中构建最优超平面,是超平面与两类训练集之间的距离最大化,从而达到最佳的泛化能力。目标是使范畴边界沿垂直于超平面的方向的距离最大。
  • 决策树算法(DT-based Methods)是为了确定类与属性之间的相关性,进一步用于预测未知类型的记录类别。
  • 集成算法(Integration-based Methods)旨在聚合多种算法的结果,以获得更好的性能和解释。传统的集成算法是引导聚合,如 RF,增强如自适应提升 (AdaBoost) 和 XGBoost 和堆叠(stackin)。

 深度学习模型:ReNN、CNN、RNN、GNN、MLP、Attention、Transformer、BERT(RoBERTa等)

 

 

文本匹配

双塔模型:先看SiamCNN,了解完结构后,再深入优化编码器的各种方法;

基于匹配:句子表示间的交互,了解BERT那种TextA+TextB拼接的做法之后,可以再看看阿里的RE2这种轻量级模型

序列标注

序列标注主要是对Embedding、编码器、结果推理三个模块进行优化,

可以先读懂Bi-LSTM+CRF这种经典方案的源码,再去根据需要读论文改进。

 

文本生成

文本生成是最复杂的,具体的SOTA模型我还没梳理完。

可以先了解Seq2Seq的经典实现,比如基于LSTM的编码解码+Attention、纯Transformer、GPT2以及T5,

再根据兴趣学习VAE、GAN、RL等。

 

语言模型

了解BERT肯定是必须的,有时间的话再多看看后续改进,很经典的如XLNet、ALBERT、ELECTRA还是不容错过的。

除了上述常用模型之外,还有Capsule Network、TextGCN等红极一时的模型。

BERT分类的优化可以尝试:

  1. 多试试不同的预训练模型,比如RoBERT、WWM、ALBERT
  2. 除了 [CLS] 外还可以用 avg、max 池化做句表示,甚至可以把不同层组合起来
  3. 在领域数据上增量预训练
  4. 集成蒸馏,训多个大模型集成起来后蒸馏到一个上
  5. 先用多任务训,再迁移到自己的任务
 
 

技巧

文本分类是工业界最常用的任务,同时也是大多数NLPer入门做的第一个任务。快速选型的建议:

数据集构建

标签体系的构建拿到任务时自己先试标一两百条,看有多少是难确定(思考1s以上)的,如果占比太多,那这个任务的定义就有问题。可能是标签体系不清晰或者是要分的类目太难了。

训练评估集的构建:可以构建两个评估集,一个是贴合真实数据分布的线上评估集,反映线上效果,另一个是用规则去重后均匀采样的随机评估集,反映模型的真实能力。

训练集则尽可能和评估集分布一致,有时候我们会去相近的领域拿现成的有标注训练数据,这时就要注意调整分布,比如句子长度、标点、干净程度等,例如做到分不出句子是否是本任务的。

数据清洗:

  1. 去掉文本强pattern:比如做新闻主题分类,一些爬下来的数据中带有的XX报道、XX编辑高频字段就没有用,可以对语料的片段或词进行统计,把很高频的无用元素去掉。还有一些会明显影响模型的判断,比如之前我在判断句子是否为无意义的闲聊时,发现加个句号就会让样本由正转负,因为训练预料中的闲聊很少带句号(跟大家的打字习惯有关),于是去掉这个pattern就好了不少
  2. 纠正标注错误:这个我真的屡试不爽,生生把自己从一个算法变成了标注人员。简单的说就是把训练集和评估集拼起来,用该数据集训练模型两三个epoch(防止过拟合),再去预测这个数据集,把模型判错的拿出来按 abs(label-prob) 排序,少的话就自己看,多的话就反馈给标注人员,把数据质量搞上去了提升好几个点都是可能的

长文本

任务简单的话(比如新闻分类),直接用fasttext就可以达到不错的效果。

想要用BERT的话,最简单的方法是粗暴截断,比如只取句首+句尾句首+tfidf筛几个词出来;或者每句都预测,最后对结果综合

另外还有一些魔改的模型可以尝试,比如XLNet、Reformer、Longformer。

如果是离线任务且来得及的话还是建议跑全部,让我们相信模型的编码能力。

少样本

自从用了BERT之后,很少受到数据不均衡或者过少的困扰,先无脑训一版。

如果样本在几百条,可以先把分类问题转化成匹配问题,或者用这种思想再去标一些高置信度的数据,或者用自监督、半监督的方法

鲁棒性

在实际的应用中,鲁棒性是个很重要的问题,否则在面对badcase时会很尴尬,怎么明明那样就分对了,加一个字就错了呢?

这里可以直接使用一些粗暴的数据增强加停用词加标点、删词、同义词替换等,如果效果下降就把增强后的训练数据洗一下。

当然也可以用对抗学习对比学习这样的高阶技巧来提升,一般可以提1个点左右,但不一定能避免上面那种尴尬的情况。

总结

实际上,落地时主要还是和数据的博弈。数据决定模型的上限,大多数人工标注的准确率达到95%以上就很好了,而文本分类通常会对准确率的要求更高一些,与其苦苦调参想fancy的结构,不如好好看看badcase,做一些数据增强提升模型鲁棒性更实用。

 

Copyright © 2024 LIN_Lighto
Powered by .NET 9.0 on Kubernetes