Skip to content

Commit

Permalink
bert 技巧
Browse files Browse the repository at this point in the history
  • Loading branch information
km1994 committed Oct 4, 2022
1 parent 2e7b2f6 commit 74259a4
Show file tree
Hide file tree
Showing 6 changed files with 152 additions and 2 deletions.
98 changes: 98 additions & 0 deletions NLPinterview/textclassifier/Retrieval2Classifier/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# 【关于 用检索的方式做文本分类 】 那些你不知道的事

> 作者:杨夕
>
> 论文:
>
> 论文地址:
>
> github:
>
> 论文出处:
>
> 项目地址:https://github.com/km1994/nlp_paper_study
>
> NLP 面经地址:https://github.com/km1994/NLP-Interview-Notes
>
> 推荐系统 百面百搭:https://github.com/km1994/RES-Interview-Notes
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
- [【关于 用检索的方式做文本分类 】 那些你不知道的事](#关于-用检索的方式做文本分类--那些你不知道的事)
- [一、动机](#一动机)
- [二、基于检索的方法做文本分类思路](#二基于检索的方法做文本分类思路)
- [2.0 基于检索的方法做文本分类 整体思路](#20-基于检索的方法做文本分类-整体思路)
- [2.1 检索的方法的召回库如何构建](#21-检索的方法的召回库如何构建)
- [2.2 检索的方法 的 训练阶段 如何做?](#22-检索的方法-的-训练阶段-如何做)
- [2.3 检索的方法 的 预测阶段 如何做?](#23-检索的方法-的-预测阶段-如何做)
- [2.3.1 **把标签集作为召回库** 的预测思路](#231-把标签集作为召回库-的预测思路)
- [2.3.2 **把训练数据作为召回** 的预测思路](#232-把训练数据作为召回-的预测思路)
- [三、用检索的方式做文本分类 方法 适用场景](#三用检索的方式做文本分类-方法-适用场景)
- [参考](#参考)

## 一、动机

1. 标签类别较多:常规的分类模型只是预测10几个 label,但是真实工业界有时需要预测的 label 可能上百个,这种情况 一方面标注数据会存在严重不均衡现象,另一方面模型的预测结果也存在偏差性严重问题;
2. 标签类别不固定:面对业务需求需要不断添加新标签时,容易导致每次新增标签都面临重新训练分类器模型问题;
3. 语义信息丢失:以前的分类任务中,标签信息作为无实际意义,独立存在的one-hot编码形式存在,这种做法会潜在的丢失标签的语义信息;

那有什么方法可以解决该问题么?

答案:**基于检索的方法做文本分类**

## 二、基于检索的方法做文本分类思路

### 2.0 基于检索的方法做文本分类 整体思路

把文本分类任务中的标签信息转换成含有语义信息的语义向量,将文本分类任务转换成向量检索和匹配的任务。

### 2.1 检索的方法的召回库如何构建

因为采用 检索的方法 去做 文本分类,首先就是需要考虑如果 构建 召回库 问题,构建方法:

1. 把标签集作为召回库;
2. 把训练数据作为召回库;

### 2.2 检索的方法 的 训练阶段 如何做?

无论是 **把标签集作为召回库** 还是 **把训练数据作为召回库**,其训练阶段的方法都是相同的,都可以采用 **双塔模型**

1. 塔构建思路:

- 一个塔(模型):用于对 输入句子 进行 encoding;
- 一个塔(模型):用于对 输入标签 进行 encoding;

2. 目标:通过训练拉近句子和标签的[CLS]输出特征表示之间距离;

### 2.3 检索的方法 的 预测阶段 如何做?

**把标签集作为召回库****把训练数据作为召回库** 思路存在不同。

### 2.3.1 **把标签集作为召回库** 的预测思路

1. 把标签作为召回集,每个标签的向量表示(也即[CLS]输出特征表示)是固定的;
2. 然后构建一个标签向量库;
3. 用待预测的句子的向量在标签向量库进行检索,找到特征相似度最大的标签,也即为待预测句子的标签。

### 2.3.2 **把训练数据作为召回** 的预测思路

1. 把训练数据作为召回集,构建一个训练集文本的向量库;
2. 用待预测的句子的向量表示(也即[CLS]输出特征表示)在文本向量库进行检索,找到特征相似度最大的训练集文本,待预测句子的标签也即召回文本的标签。

## 三、用检索的方式做文本分类 方法 适用场景

1. 对于一些类别标签不是很固定的场景,或者需要经常有一些新增类别的需求的情况非常合适;
2. 对于一些新的相关的分类任务,这种方法也不需要模型重新学习或者设计一种新的模型结构来适应新的任务。

总的来说,这种基于检索的文本分类方法能够有很好的拓展性,能够利用标签里面包含的语义信息,不需要重新进行学习。这种方法可以应用到相似标签推荐,文本标签标注,金融风险事件分类,政务信访分类等领域。

## 参考

1. [【NLP从零入门】预训练时代下,深度学习模型的文本分类算法(超多干货,小白友好,内附实践代码和文本分类常见中文数据集)](https://zhuanlan.zhihu.com/p/562448431)







16 changes: 14 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@
- [5.4 【关于 早停法 EarlyStopping 】那些你不知道的事](#54-关于-早停法-earlystopping-那些你不知道的事)
- [5.5 【关于 标签平滑法 LabelSmoothing 】那些你不知道的事](#55-关于-标签平滑法-labelsmoothing-那些你不知道的事)
- [5.6 【关于BERT如何处理篇章级长文本】那些你不知道的事](#56-关于bert如何处理篇章级长文本那些你不知道的事)
- [5.7 【关于 Bert 未登录词处理】 那些你不知道的事](#57-关于-bert-未登录词处理-那些你不知道的事)
- [5.7 【关于 Bert Trick】 那些你不知道的事](#57-关于-bert-trick-那些你不知道的事)
- [5.7.1 【关于 Bert 未登录词处理】 那些你不知道的事](#571-关于-bert-未登录词处理-那些你不知道的事)
- [5.7.2 【关于BERT在输入层引入额外特征】 那些你不知道的事](#572-关于bert在输入层引入额外特征-那些你不知道的事)
- [六、【关于 Python 】那些你不知道的事](#六关于-python-那些你不知道的事)
- [七、【关于 Tensorflow 】那些你不知道的事](#七关于-tensorflow-那些你不知道的事)

Expand Down Expand Up @@ -953,6 +955,7 @@
- 6.6 小模型大智慧
- 6.6.1 模型蒸馏
- 6.6.2 数据蒸馏
- [【关于 用检索的方式做文本分类 】 那些你不知道的事](NLPinterview//textclassifier/Retrieval2Classifier/)

#### 4.4 [【关于 文本匹配】那些你不知道的事](NLPinterview/TextMatch/)

Expand Down Expand Up @@ -1319,7 +1322,9 @@
- [3.4.1 从 模型角度 处理 介绍](#341-从-模型角度-处理-介绍)
- [3.4.2 从 模型角度 处理 模型思路介绍](#342-从-模型角度-处理-模型思路介绍)

#### 5.7 [【关于 Bert 未登录词处理】 那些你不知道的事](Trick/Bert_UNK_process/)
#### 5.7 [【关于 Bert Trick】 那些你不知道的事](Trick/Bert_trick/)

##### 5.7.1 [【关于 Bert 未登录词处理】 那些你不知道的事](Trick/Bert_trick/Bert_UNK_process/)

- 动机
- 中文预训练BERT 对于 英文单词覆盖不全问题。由于 中文预训练BERT 主要针对中文,所以词表中英文单词比较少,但是一般英文单词如果简单的直接使用tokenize函数,往往在一些序列预测问题上存在一些对齐问题,或者很多不存在的单词或符号没办法处理而直接使用 unk 替换了,某些英文单词或符号失去了单词的预训练效果;
Expand All @@ -1337,6 +1342,13 @@
- 方法三:
- 优点:对于一些 占位符(eg:<e></e>),方法一和方法二可能都无法生效,因为 <, e, >和 <e></e>均存在于 vocab.txt,但前三者的优先级高于 <e></e>,而 add_special_tokens会起效,却会使得词汇表大小增大,从而需另外调整模型size。但是,如果同时在词汇表vocab.txt中替换[unused],同时 add_special_tokens,则新增词会起效,同时词汇表大小不变。


##### 5.7.2 [【关于BERT在输入层引入额外特征】 那些你不知道的事](Trick/Bert_trick/Bert_import_new_features/)

1. 邱锡鹏老师的flat : 他简单来说呢,是把词典拼在原文的输入的后面,然后和前面的词典的位置共享一个position的embedding。相当于呢是词典对原文进行了一种提示,引入了外部的知识。
2. 在底层增加一个embedding层,就像bert原生的一样,从input-id-embedding、token-type-embedding和mask-embedding变成input-id-embedding、token-type-embedding、mask-embedding和keyword-embedding。输入,lookup之后,输出进行加和即可。这样的话,只需要随机初始化keyword-embedding就行,其他参数都可以加载原始参数;
3. 在关键词前后加上特殊的标识符,让模型强行去学习,关键词的信息。

### 六、[【关于 Python 】那些你不知道的事](python/)

- [【关于 Python 】那些你不知道的事](python/)
Expand Down
File renamed without changes.
File renamed without changes.
40 changes: 40 additions & 0 deletions Trick/Bert_trick/Bert_import_new_features/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# 【关于BERT在输入层引入额外特征】 那些你不知道的事

> 作者:杨夕
>
> 介绍:研读顶会论文,复现论文相关代码
>
> NLP 百面百搭 地址:https://github.com/km1994/NLP-Interview-Notes
>
> 推荐系统 百面百搭 地址:https://github.com/km1994/RES-Interview-Notes
>
> 搜索引擎 百面百搭 地址:https://github.com/km1994/search-engine-Interview-Notes 【编写ing】
>
> NLP论文学习笔记:https://github.com/km1994/nlp_paper_study
>
> 推荐系统论文学习笔记:https://github.com/km1994/RS_paper_study
>
> GCN 论文学习笔记:https://github.com/km1994/GCN_study
>
> **推广搜 军火库**https://github.com/km1994/recommendation_advertisement_search
![](other_study/resource/pic/微信截图_20210301212242.png)

> 手机版笔记,可以关注公众号 **【关于NLP那些你不知道的事】** 获取,并加入 【NLP && 推荐学习群】一起学习!!!
> 注:github 网页版 看起来不舒服,可以看 **[手机版NLP论文学习笔记](https://mp.weixin.qq.com/s?__biz=MzAxMTU5Njg4NQ==&mid=100005719&idx=1&sn=14d34d70a7e7cbf9700f804cca5be2d0&chksm=1bbff26d2cc87b7b9d2ed12c8d280cd737e270cd82c8850f7ca2ee44ec8883873ff5e9904e7e&scene=18#wechat_redirect)**
## 一、动机



## 二、方法


1. 邱锡鹏老师的flat : 他简单来说呢,是把词典拼在原文的输入的后面,然后和前面的词典的位置共享一个position的embedding。相当于呢是词典对原文进行了一种提示,引入了外部的知识。
2. 在底层增加一个embedding层,就像bert原生的一样,从input-id-embedding、token-type-embedding和mask-embedding变成input-id-embedding、token-type-embedding、mask-embedding和keyword-embedding。输入,lookup之后,输出进行加和即可。这样的话,只需要随机初始化keyword-embedding就行,其他参数都可以加载原始参数;
3. 在关键词前后加上特殊的标识符,让模型强行去学习,关键词的信息。


## 参考

1. [BERT在输入层如何引入额外特征?](https://www.zhihu.com/question/470540809/answer/2691234148)

0 comments on commit 74259a4

Please sign in to comment.