文本分类:
- 单文本分类任务:对于文本分类任务,BERT模型在文本前插入一个[CLS]符号,并将该符号对应的输出向量作为整篇文本的语义表示,用于文本分类,如下图所示。可以理解为:与文本中已有的其它字/词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个字/词的语义信息。
- 语句对分类任务:该任务的实际应用场景包括:问答(判断一个问题与一个答案是否匹配)、语句匹配(两句话是否表达同一个意思)等。对于该任务,BERT模型除了添加[CLS]符号并将对应的输出作为文本的语义表示,还对输入的两句话用一个[SEP]符号作分割,并分别对两句话附加两个不同的文本向量以作区分,如下图所示。
一、数学知识
1、样本空间:所有基本事件的集合,记作
2、样本点:样本空间的元素,记作
例子:一枚硬币的样本空间{正,反}
两枚硬币的样本空间{(正,正),(正,反),(反,正),(反,反)}
3、条件概率:在样本空间中,有A,B两个事件,P(B)>0,在B已经发生的条件下A发生的概率,即A对B的条件概率,记作P(A|B)。
例子:男生有50人,女生有50人。成绩及格的学生:男生20人,女生30人。求及格的学生中女生占:30/50=3/5
P(A|B)==
n是样本点,n=100;是AB共同发生的样本点,即30;
=50。
4、乘法公式 P(A)>0,P(B)>0
P(A|B)= P(AB)=P(B)P(A|B)
P(B|A)= P(AB)=P(A)P(B|A)
P(...
)=P(
)P(
|
)P(
|
)...P(
|
)
5、全概率公式
事件、
、...、
构成一个完备事件组,即它们两两互不相融,并和为
。P(
)>0,则对任一事件B有:P(B)=
例子:将100人分成三队,分别是40、50、10,每一队的男生数量分别是:15、10、5。求男生的概率:P(B)=
6、贝叶斯公式
全概率公式:因果
贝叶斯公式:果因 (发烧由感冒引起的概率有多大)
例子:有四条生产线,生产产品占比分别为:15%、20%、30%、35%,生产不合格产品的概率为:0.05、0.04、0.03、0.02。
解:令、
、
、
为四条生产线,B为生产不合格事件
(全概率公式)
(贝叶斯公式)
7、概率和似然的区别
概率:描述一个事件发生的可能性
似然性:正好相反,一个事件已经发生了,反推在什么参数条件下,这个事件发生的概率最大。
二、梯度下降
梯度下降是通过迭代找到目标函数的最小值,或收敛到最小值。
假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法了。
梯度下降的基本过程:与下山场景类似。首先,有一个可微函数,求函数的最小值。先找到给定点的梯度,沿着梯度相反的方向,就能让函数值下降的最快。(因为梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向。)
微分
1.单变量的微分
2.多变量微分
梯度下降数学公式
J是关于Θ的一个函数,初始点为Θ0,沿着梯度反方向找到最小值,α为步长。
例子:
函数
求微分
设初始点Θ0=1,步长α=0.4
梯度前加负号,表示沿着梯度反方向前进
如图,经过四次的运算,也就是走了四步,基本就抵达了函数的最低点,也就是山底
三、BTM模型
BTM(Biterm topic model)是一个针对短文本的主题模型,还有一个常见的主题模型是LDA,但更适用于长文本。
这里有一句话“清风明月,草长莺飞,杨柳依依”,分词后得到三个词
['清风明月', '草长莺飞', '杨柳依依']
那么,这句话就包括三个biterm
['清风明月','草长莺飞'] ['杨柳依依','草长莺飞']['清风明月','杨柳依依']
再举一个例子,“今天天气不错,适合出游”,分词后得到
['今天','天气','不错','适合','出游']
则有10个词对
['今天','天气'],['今天','不错'],['今天','适合'],['今天','出游'],['天气','不错'],
['天气','适合'],['天气','出游'],['不错','适合'],['不错','出游'],['适合','出游']
采用吉布斯抽样(Gibbs sampling)方法进行推断,得到每个词对b=()的条件概率:
四、bert模型
特点:使用self-attention实现并行计算。同一词在不同语境中可能表达不同的意思,则它对应的词向量也不同。
Self-Attention:
例子:The animal didn't cross the street because it was too tired.
The animal didn't cross the street because it was too narrow.
这两句话中it分别指代什么,animal还是street?在第一句中,animal、tired权重占比大,it指代animal。第二句中street、narrow权重大,it指代street,所以it词向量不同。
五、ERNIE
2019年由百度提出的模型,是基于bert进行改进的。
根据github进行复现:
1、模型热启动:消除第⼀次⾼延迟的请求,模型加载后的第一个请求一般会进行形状推导等,这些操作耗时很⾼,比之后请求的 latency 可能会高出几个数量级。
六、知识蒸馏
知识蒸馏(Knowledge distillation)是一种模型压缩方法,是一种基于“教师-学生网络思想”的训练方式。"teacher"是“知识”的输出者,"student"的”知识“的接收者。知识蒸馏的过程分为两个阶段:
1、原始模型训练:训练”teacher模型“,简称为Net-T,它的特点是模型相对复杂,也可以由多个分别训练的模型集成而成。我们对"teacher模型"不做任何关于模型架构、参数量、是否集成方面的限制,唯一的要求就是,对于输入X,其都能输出Y,其中Y经过softmax的映射,输出值对应类别的概率值。
2、精简模型训练:训练"student模型",简称为Net-S,它是参数量较小、模型结构相对简单的单模型。同样的,对于输入X,其都能输出Y,Y经过softmax映射后同样能输出对应类别的概率值。
softmax函数:
改进后的函数:
T表示温度。
温度:温度的高低改变的是Net-S训练过程中对负标签的关注程度。温度较低时,对负标签的关注,尤其是那些显著低于平均值的负标签的关注较少;而温度较高时,负标签相关的值会相对增大,Net-S会相对多地关注到负标签。
七、最大匹配分词算法
向前最大匹配(forward-max matching)
例子:我们经常有意见分歧
词典:[“我们”,“经常”,“有”,“有意见”,“意见”,“分歧”]
假设变量max-len=5,我们取前面5个词“我们经常有”跟词典进行比对,发现词典中没有这个词,则取4个词“我们经常”跟词典比对,以此类推……直到“我们”这个词可以和词典中匹配上,就把“我们”划分成一个词。
向后最大匹配(backward-max matching)
用上面的例子:取最后面的5个词“有意见分歧”跟词典进行比对。
这两个算法的缺点:
①采用贪心策略,时间复杂度高
②out of vocabulary
③没有考虑语义、上下文、单词之间的关系
八、Pytorch
1、Tensor(张量)
是一种数据结构,单个元素叫标量(scalar),一个序列叫向量(vector),多个序列组成的平面叫矩阵(matrix),多个平面组成的立方体叫张量(tensor)
九、语法任务:
word level
①morphological analysis(形态划分)一般针对于英文、阿拉伯、德语
(English) walking walk + ing
(Arabic) wktAbnA (意思:and our book) w(and) + ktAb(book) +A(our)
②word segmentation(分词) 一般针对于中文、泰文
中国外企业务 中国 外企 业务
其中国外企业 其中 国外 企业
③tokenization(词语切分) 一般针对于英文,与中文分词类似
Mr.Smith visited Mr. Smith visited
Wendy's new house Wendy 's new house
④POS tagging(词性标注)英文词性标注import nltk,中文词性标注import jieba,中英文标注词表不一样。
标注词表:
名词:NN,NNS,NNP,NNPS
代词:PRP,PRP$
形容词:JJ,JJR,JJS
数词:CD
动词:VB,VBD,VBG,VBN,VBP,VBZ
副词:RB,RBR,RBS
I can open this can. I(PRP) can(MD) open(VB) this(DT) can(NN)
标注词表:
普通名词:n
人名:nr
形容词:a
副词:d
猪肉 n 一直
d
Sentence level
①constituent parsing(成分句法)
②dependency parsing(依存句法)
十、N-gram
N-gram是一种基于统计语言模型的算法,基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度为N的字节片段序列。
1、Unigram一元组 : hello , bag
由m个词组成的一句话,这句话的概率为:
out-of vocabulary(OOV)训练集里未出现的词,称为未登录词,即便出现在词汇表里,用训练集计算词频时,概率为0
P(OOV)=0
当一句话中出现未登录词,这句话的概率会变成0,解决办法为add-one smoothing:把词汇表里每一个词在训练集里出现的次数都+1,来重新估算每一个词的概率。
P(w)=(某词在训练集的次数+1) / (训练集的数量+词汇表的数量)
2、Bigram二元组: eat pizza , come on
3、Trigram三元组:cat eat mouse , mouse eat cat
当词语比较稀疏,可采用回退法(backoff),一般不采用平滑(add-n smoothing),因为会把少量的非0频率分配到未登录词,导致频率下降,出现分类偏差。
平滑算法:
①add-n smoothing
②KNessay-Ney Smoothing
③Good-Turning Smoothing
十一、朴素贝叶斯文本分类
十二、意图识别
①语义槽填充:理解一段文字的一种方法是标记那些对句子有意义的单词或记号。作用 : 将用户隐式的意图转化为显式的指令从而让计算机理解。
举例:
- 帮我订张机票,从杭州出发。
这里就应该填充了两个槽,把『机票』、『杭州』填入名为『交通工具』、『目的地』。
那么在对话系统钟就可以让reboot理解用户是想要买一张去往杭州的机票,由于缺少出发地点,可能还会有一轮询问的对话。
最后reboot根据补充的信息,生成指令,调用接口购买从xx去往杭州的机票。
经典方法
CRF: 条件随机场。通过设置各种特征函数来给序列打分。——(CRF)
深度方法
一、RNN 槽填充
二、RNN Encoder-Decoder 槽填充
三、Bi-GRU + CRF
四、Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling (比较经典,论文是意图识别和槽填充共同训练),加入了对齐信息和attention
对 BIO的解释
“B-X”表示此元素所在的片段属于X类型并且此元素在此片段的开头。
“I-X”表示此元素所在的片段属于X类型并且此元素在此片段的中间位置。
“O”表示不属于任何类型。
② 槽与槽位
槽是由槽位构成的,举个例子,出发地点槽,是打车必填的,要填充这个槽,可以通过历史对话取得值,也可以通过询问用户取得值,还可以通过GPS定位取得值等等。
这里的必填是槽的属性,而不同的取值方式是不同槽位的属性
十三、在Jupyter添加虚拟环境
进入到指定的虚拟环境中: activate 环境名
conda install nb_conda
conda install ipykernel
ipython kernel install --user --name=环境名
安装完成后输入: jupyter notebook进入
如果安装了nb_conda,在jupyter notebook中,会出现Python[conda env:环境名],其实Python[conda env:pytorch1-hug]和pytorch1-hug是同一个虚拟环境,但是在Python[conda env:pytorch1-hug]中可以import torch,在pytorch1-hug不能import torch,我也不知道为什么。
如果没有出现Python[conda env:环境名],从开始菜单点击Jupyter Notebook
###名词解释
1、软标签、硬标签、伪标签
伪标签(Pseudo Label
)对未标注数据进行预测,进行二次训练
软标签(Soft Label
)对标签转为离散值,进行二次训练,适用于大规模无监督的蒸馏模型
硬标签(hard Label)实际label值 ,过于绝对,适用于非黑即白的任务
2、学习率:将输出误差反向传播给网络参数,以此来拟合样本的输出,本质上是最优化的一个过程,逐步趋向于最优解,但是每一次更新参数利用多少误差,就需要通过一个参数来确定,这个参数就是学习率,也称步长。
学习率设置过小时,步长太小,下降速度太慢,要花很久才能找到最小值。
学习率设置过大时,步长太大,虽然收敛得速度很快,但是容易跨过或忽略了最小值,导致一直来回震荡而无法收敛。
3、batch_size
批次大小,表示单次传递给程序用以训练的数据(样本)个数。比如我们的训练集有1000个数据。这是如果我们设置batch_size=100,那么程序首先会用数据集中的前100个数据,即第1-100个数据来训练模型。当训练完成后更新权重,再使用第101-200的个数据训练,直至第十次使用完训练集中的1000个数据后停止。
我们在神经网络训练过程中,往往需要将训练数据划分为多个batch
;而具体每一个batch
有多少个样本,那么就是batch size
指定的了。
4、epoch
一个epoch就是等于使用训练集中的全部样本训练一次的过程,所谓训练一次,指的是进行一次正向传播(forward pass)和反向传播( back pass )。
当一个epoch的样本(也就是训练集)数量太过庞大的时候,进行一次训练可能会消耗过多的时间,并且每次训练都使用训练集的全部数据是不必要的。因此,我们就需要把整个训练集分成多个小块,也就是就是分成多个Batch来进行训练。
一个epoch由一个或多个batch构成,batch为训练集的一部分,每次训练的过程只使用一部分数据,即一个batch。我们称训练一个batch的过程为一个iteration。
5、step
一般叫做“步骤”,表示在一个epoch中模型进行一次参数更新的操作。在神经网络训练过程中,每次完成对一个batch
数据的训练,就是完成了一个step
。很多情况下,step
和iteration
表示的是同样的含义。
6、Iteration
一般叫做“迭代”,多数情况下就表示在训练过程中经过一个step
的操作。一个iteration
包括了一个step
中前向传播、损失计算、反向传播和参数更新的流程。当然,在某些情况下,step
和iteration
可能会有细微的区别——有时候iteration
是指完成一次前向传播和反向传播的过程,而step
是指通过优化算法对模型参数进行一次更新的操作。但是绝大多数情况下,我们就认为二者是一样的即可。
假设,有个训练集,样本数量为20000,如果我们把这20000条数据全部训练一次,就是一个epoch。如果要将其分为多个batch,其中我们决定1批训练500条数据,则batch_size=500,那么把数据全部训练完需要训练40批,batch=step=iteration=40。
如果我们要训练多次,也就是多个epoch。假如epoch=3,把20000条数据训练三次,则step、batch、iteration也会改变,等于3*40。
7、上下位关系
概括性较强的单词叫做特定性较强的单词的上位词,特定性较强的单词叫做概括性较强的单词的下位词。
例如, 猩红色、鲜红色、胭脂红、绯红色都是“红色 ”的下位词,而红色则是猩红色的上位词。