NLP中模型的一些总结


1. 各种交叉熵损失函数的比较:
sparse_softmax_cross_entropy_with_logits(logits=net, labels=y):labels可以是直接的数字标签,会将其做one-hot操作
softmax_cross_entropy_with_logits中 labels接受one-hot标签 。相当于sparse_softmax_cross_entropy_with_logits 对标签多做一个one-hot动作

softmax 和log_softmax:
log_softmax 是在softmax的基础上再做log,目的是为了增加负采样

nn.CrossEntropyLoss() 与 NLLLoss():NLLLoss()接受做了log_softmax的数据和目标标签。nn.CrossEntropyLoss()会做softmax。若是数据需要负采样可以采用NLLLoss()

tf.nn.sigmoid_cross_entropy_with_logits(logits=net, labels=y):net和y需要具有相同的type(float)和shape(tensor),适用于 类别互不排斥的情况,比如一个样本[0,1,1,0],该样本可能属于两个类别,但这两类别互不排斥
tf.nn.weighted_cross_entropy_with_logits(labels,logits, pos_weight, name=None) 计算具有权重的sigmoid交叉熵sigmoid_cross_entropy_with_logits(),
如:其实是直接正例样本的权重系数:targets * -log(sigmoid(logits)) * pos_weight + (1 - targets) * -log(1 - sigmoid(logits))

2.各种激活函数比较:使用激活函数的作用:通过非线性函数的叠加,使神经网络有足够的能力来抓取复杂的特征,若是不使用激活函数,神经网络输出都是输入的线性函数,多层神经网络也相当于一层。
Sigmoid函数:0-1 区间
优点:1.便于求导的平滑函数。2.压缩数据,保证数据幅度不会特别大。3.适用于前向传播 
缺点:1.容易梯度消失,激活函数接近饱和区时,导数为0,根据链式求导法则,后向传播时,需要之前各层导数的乘积,导数结果接近0,导致梯度消失,无法完成深程度训练。
      2.sigmod的输出不是0均值的,会对梯度产生影响。比如 sigmod(wx+b) 对w求导,总是正数和负数,导致在反向传播时,要么往正方向跟新,要么往负方向跟新,导致捆绑效果,收敛缓慢。
      3.幂运算缓慢
tanh函数:-1 - 1 区间 : 解决了sigmod非0均值的问题,但也存在梯度消失和幂运算缓慢问题
relu函数:max(0,x),斜的直线,大于0
优点:1.SGD算法的收敛速度比sigmod和tanh快,不会有梯度消失问题
      2.计算复杂度低,不涉及指数运算。
      3.适合用于后向传播。
缺点:1.输出不是0均值的。2.不会对数据幅度做压缩,因此数据维度会随着模型层数的增加不断扩张。
    3.神经元坏死现象:某些神经元不会被激活(在负数部分,梯度为0)。产生原因:1.参数初始化问题(解决:每一层输出的方差应该尽量相等)。2.学习率调节太高,导致参数变化太大(解决:动态调节学习率)

3.过拟合和欠拟合
欠拟合:训练集和测试集效果均不好,模型过于简单,增加模型复杂度,调整模型参数等。
过拟合:1.训练集准确率高,测试集准确率底。2.准确率增加到一定层度后又下降等
解决方法:1.增加样本数量、增加噪音数据。2.dropout.3.加入正则化系数,L1,L2范数等。4.发现过拟合后终止模型训练

4.优化损失函数:
Adam:1.自适应学习率。2.算法高效。3.所需内存少。4.适用于解决包含很高噪声或稀疏梯度的问题。(稀疏梯度:梯度为0,神经元不会训练)
    1.Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变。
而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率
    2.Adam算法的高效性

5.模型训练超参数调整总结:
优化类的参数:学习率(learning rates)、mini batch(32,64)、训练代数(epochs)。
    如果选用了Adam和Adagrad的作为优化器(optimizer),则他们自带了可自适应的学习率(adaptive learning rate
模型类的参数:隐含层数(hidden layers)、模型结构的参数(如RNN).
    解决的问题的模型越复杂则用越多hidden units,但是要适度,因为太大的模型会导致过拟合
    可以增加Hidden Units数量直到validation error变差
    通常来说3层的隐含层比2层的好,但是4,5,6层再深就没什么明显效果了
    
6.梯度爆炸和消失
爆炸:导数大于1,神经网络层次太深的话权重参数的跟新会以指数级别增大。 解决方法:1.relu函数,正数时导数均为1。2.梯度截断。3.权重正则化
消失:导数为0。神经网络层次太深的话参数的跟新会以指数级别减小。解决方法:1.relu函数。2.合理初始化权重值,每个神经元不要去极大或极小值。3.lstm、gru

7.准确率、精确率、召回率、f1   AUC值(0.5-1) AUC的值越大,分类器效果越好。
例:1.一个班里有男女生,把女生看成正类,男生看成是负类。TP:正类判定为正类。即女生是女生.FN:正类判定为负类,女生判定为男生
。FP:负类判定为正类,男生判定为女生。TN:负类判定为负类。即男生判定为男生
准确率:acc=(TP+TN)/(TP+TN+FP+FN)  在所有的样本中,实际预测正确的概率
精确率:p = TP/(TP+FP) 在所有预测为正类的样本中,实际预测正确的概率
召回率:r = TP/(TP+FN) 在所有的正类样本中,实际预测正确的概率
f1: f1=2pr/(p+r)   越大越好

8.LSTM结构(解决梯度消失问题): Ct:细胞状态(代表长期记忆)。ht:隐藏状态。Xt:每个时刻的输入内容。细胞状态的作用是决定哪些信息需要被遗忘、跟新。ht是可以包含上一个状态的信息。
1.遗忘门;决定遗忘哪些值。将ht-1和xt相拼接,做线性变换,再做sigmod得到ft,约束到0-1之间。再与Ct-1相乘,值接近0的清除。
2.输入门:决定跟新哪些值。将ht-1和xt相拼接,做线性变换,再做sigmod得到it。将ht和xt相拼接,做线性变换,再做tanh得到Ct~。it*Ct~ 决定跟新哪些值。
3.细胞状态Ct跟新:将Ct-1*ft+it*Ct~  使细胞状态由Ct-1  跟新为 Ct
4.输出门:输出隐藏状态ht。将ht-1和xt相拼接,做线性变换,再做sigmod得到ot。将Ct做tanh变换tanh(Ct),再降ot*tanh(Ct)输出隐藏状态值Ht。


RNN和transformer比较:
1.主要transformer可以并行计算,而RNN需要依赖前一个时刻的输出。


seq2seq + attention
seq2seq:通过输入序列encoder预测输出序列decoder.
attention:Attention机制通过在每个时间输入不同的c来解决这个问题。decoder中的Si-1先和encoder中每个ht分别计算得到一个数值,再用softmax得到encoder中每个时刻输出的权重,做加权求和。
在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。
如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降.

encoder+decoder: encoder的最后输出(会有一个结束标志) 会作为 decoder的输入。


word2vec中工具的使用: 
1.Skip-gram 模型:通过词语作为输入来预测上下文。
2.CBOW 模型:通过上下文作为输入来预测当前词

优化方式:1.多层SOFTMAX。2.负采样
1.多层SOFTMAX:
2.负采样:


gensim中的word2vec 参数:sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法
1.sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法。

2.size是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。

3.window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)。

4.min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。

5.negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。

6.hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。

7.workers控制训练的并行,此参数只有在安装了Cpython后才有效,否则只能使用单核


中文汉字常用字大约是2500到7000之间,词频统计时,有一个词数量的限制。

分词:目的是为了训练好点的语言模型,用了分词是效果不太好
jieba的分词使用和词性标注:
1、开发者可以指定自己自定义的词典,以便包含jieba词库里没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率。 
2、用法:jieba.load_userdict(file_name) # file_name为自定义词典的路径 
3、词典格式和dict.txt一样,一个词占一行;每一行分三部分,一部分为词语,另一部分为词频,最后为词性(可省略),用空格隔开

SVM:支持向量机(Support Vector Machine, SVM)从数据中找出一个数据的分割超平面,将两个类别的数据完全分割开,并且在模型构建的过程中,保证分割区间最大化。
1.硬间隔支持向量机(线性可分支持向量机):当训练数据线性可分时,可以认为线性划分SVM中的距离度量就是硬间隔,在线性划分SVM中,要求函数距离一定是大于1的
2.软间隔支持向量机:当训练数据近似线性可分时,SVM对于训练集中的每个样本都引入一个松弛因子(ξ),使得函数距离加
上松弛因子后的值是大于等于1;这表示相对于硬间隔,对样本到超平面距离的要求放松了
3.非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机

K-MEANS:K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大
首先输入 k 的值,即我们指定希望通过聚类得到 k 个分组;
从数据集中随机选取 k 个数据点作为初始大佬(质心);
对集合中每一个小弟,计算与每一个大佬的距离,离哪个大佬距离近,就跟定哪个大佬。
这时每一个大佬手下都聚集了一票小弟,这时候召开选举大会,每一群选出新的大佬(即通过算法选出新的质心)。
如果新大佬和老大佬之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),可以认为我们进行的聚类已经达到期望的结果,算法终止。
如果新大佬和老大佬距离变化很大,需要迭代3~5步骤

K-Means是个简单实用的聚类算法,这里对K-Means的优缺点做一个总结。
    K-Means的主要优点有:
    1)原理比较简单,实现也是很容易,收敛速度快。
    2)聚类效果较优。
    3)算法的可解释度比较强。
    4)主要需要调参的参数仅仅是簇数k。
    K-Means的主要缺点有:
    1)K值的选取不好把握
    2)对于不是凸的数据集比较难收敛
    3)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
    4) 采用迭代方法,得到的结果只是局部最优。
    5) 对噪音和异常点比较的敏感。

K值选取:在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10

贝叶斯:
先验概率P(A):在不考虑任何情况下,A事件发生的概率
条件概率P(B|A):A事件发生的情况下,B事件发生的概率
后验概率P(A|B):在B事件发生之后,对A事件发生的概率的重新评估
全概率:如果A和A'构成样本空间的一个划分,那么事件B的概率为:A和A'的概
率分别乘以B对这两个事件的概率之和
朴素贝叶斯:
(1)计算先验概率:求出样本类别的个数 KK 。对于每一个样本 Y=CkY=Ck ,计算出 P(Y=Ck)P(Y=Ck) 。其为类别 CkCk在总样本集中的频率。
(2)计算条件概率:将样本集划分成 KK 个子样本集,分别对属于 CkCk 的子样本集进行计算,计算出其中特征 Xj=ajlXj=ajl 的概率: P(Xj=ajl|Y=Ck)P(Xj=ajl|Y=Ck)。其为该子集中特征取值为 ajlajl 的样本数与该子集样本数的比值。
(3)针对待预测样本 xtestxtest ,计算其对于每个类别 CkCk 的后验概率:P(Y=Ck|X=xtest)=P(Y=Ck)∏nj=1P(Xj=xtestj|Y=Ck)P(Y=Ck|X=xtest)=P(Y=Ck)∏j=1nP(Xj=xjtest|Y=Ck) 。概率值最大的类别即为待预测样本的预测类别。


HMM是是用来描述隐含未知参数的统计模型

HMM:
1.隐含状态S、可观测状态O、初始状态概率矩阵π、隐含状态转移概率矩
阵A、可观测值转移矩阵B(又称为混淆矩阵,Confusion Matrix);
π和A决定了状态序列,B决定观测序列,因此HMM可以使用三元符号表示,称
为HMM的三元素:

若训练数据包含观测序列和状态序列,则HMM的学习问题非常简单,是监督学
习算法。
若训练数据只包含观测序列,则HMM的学习问题需要使用EM算法求解,是非
监督学习算法

概率计算问题:前向-后向算法
给定模型λ=(A,B,π)和观测序列Q={q1,q2,...,qT},计算模型λ下观测到序列Q出现的概
率P(Q|λ)
学习问题:Baum-Welch算法(状态未知)
已知观测序列Q={q1,q2,...,qT},估计模型λ=(A,B,π)的参数,使得在该模型下观测序
列P(Q|λ)最大。
预测问题:Viterbi算法
给定模型λ=(A,B,π)和观测序列Q={q1,q2,...,qT},求给定观测序列条件概率P(I|Q,λ)
最大的状态序列I


分词:
基于词典的统计算法:从词典中进行字符串匹配规则,但是无法解决未登录词。
基于统计的分词算法:jieba分词采用了HMM隐马尔科夫模型和viterbi算法来解决未登录词问题。
HMM,隐马尔科夫模型。隐马尔科夫模型在机器学习中应用十分广泛,它包含观测序列和隐藏序列两部分。对应到NLP中,我们的语句是观测序列,而序列标注结果是隐藏序列。
任何一个HMM都可以由一个五元组来描述:观测序列,隐藏序列,隐藏态起始概率,隐藏态之间转换概率(转移概率),隐藏态表现为观测值的概率(发射概率)。
其中起始概率,转移概率和发射概率可以通过大规模语料统计来得到。从隐藏态初始状态出发,计算下一个隐藏态的概率,并依次计算后面所有的隐藏态转移概率。
我们的序列标注问题就转化为了求解概率最大的隐藏状态序列问题。
jieba分词中使用HMM模型来处理未登录词问题,并利用viterbi算法来计算观测序列(语句)最可能的隐藏序列(BEMS标注序列)


词性标注:难点:1.既可以是动词,也可以是名词
观测序列即为分词后的语句,隐藏序列即为经过标注后的词性标注序列。起始概率 发射概率和转移概率和分词中的含义大同小异,可以通过大规模语料统计得到。
观测序列到隐藏序列的计算可以通过viterbi算法,利用统计得到的起始概率 发射概率和转移概率来得到。得到隐藏序列后,就完成了词性标注过程

1.基于字符串匹配的字典查找算法
2.基于统计的算法
对于分词后识别出来的词语,直接从字典中查找其词性。而对于未登录词,则采用HMM隐马尔科夫模型和viterbi算法来识别


 

你可能感兴趣的:(自然语言处理)