NLP复习总结
分词
基于词典的分词方法
FMM
- 从左向右取待切分汉语句的m个字符作为匹配字段,m为大机器词典中最长词条个数。
- 查找大机器词典并进行匹配。
- 若匹配成功,则将这个匹配字段作为一个词切分出来。
- 若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程,直到切分出所有词为止。
RMM
从被处理文档的末端进行扫描,每次取最末端的n个字符,用来和词典中的字段进行匹配,如果匹配成功,则进行切词,否则,去掉匹配字段第一个字,继续匹配,直至匹配字段长度为0。
双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法的到的结果进行比较,从而决定正确的分词方法。
基于统计的分词方法
N-gram
N-gram模型是一种语言模型(Language Model,LM),语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率
bi-gram 和 tri-gram
结巴分词的原理主要分为4步:
- 根据词典构建前缀词典
- 通过分词的语料构建语料的有向无环图(DAG)
- 采用了动态规划思想,查找有向无环图最大概率路径, 找出基于词频的最大切分组合
- 对未登录词(词典中不存在的词),基于隐马尔可夫模型HMM,使用了 Viterbi 算法进行预测
构建前缀字典的目的::后期计算每条路径的概率使用
基于汉字成词能力的HMM(Hidden Markov Model)模型识别未登录词
利用HMM模型进行分词,主要是将分词问题视为一个序列标注(sequence labeling)问题,其中,句子为观测序列,分词结果为状态序列。首先通过语料训练出HMM相关的模型,然后利用Viterbi算法进行求解,最终得到最优的状态序列,然后再根据状态序列,输出分词结果。
viterbi算法其实就是多步骤每步多选择模型的最优选择问题,其在每一步的所有选择都保存了前续所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价的情况下前继步骤的选择。依次计算完所有步骤后,通过回溯的方法找到最优选择路径。
Viterbi算法优势:
- 将每一时刻最优概率路径记录下来,避免了最优路径回溯;
- 提前建立一个当前时刻的状态到上一时刻的状态的映射表,记录每个状态在前一时刻的可能状态,降低计算量。
神经网络基础
神经元细胞要么处于激活状态,要么是抑制状态,按照这个机理设计了二值化激活过程,也就是说超过某一个阈值就取值1,代表激活,低于某个阈值就取值0,代表抑制。这就是著名的阶跃函数
- 输入向量(input),即为用来训练感知器的原始数据
- 阶跃函数(step function),可以通过生物上的神经元阈值来理解,当输入向量和权重相乘之后,如果结果大于阈值(比如0),则神经元激活(返回1),反之则神经元未激活(返回0)
- 权重(weight),感知器通过数据训练,学习到的权向量通过将它和输入向量点乘,把乘积带入阶梯函数后我们可以得到我们期待的结果
梯度下降中的梯度指的是代价函数对各个参数的偏导数,偏导数的方向决定了在学习过程中参数下降的方向,学习率(通常用α表示)决定了每步变化的步长,有了导数和学习率就可以使用梯度下降算法(Gradient Descent Algorithm)更新参数了。
感知机的局限性?
感知机无法处理异或门电路,不能解决非线性问题
感知机可以准确地描述AND和OR,那么,使用两层的感知机就可以描述异或了(神经网络)
当我们说神经元时,激活函数往往选择为sigmoid函数或tanh函数,同时,在使用了sigmoid函数之后,一般使用交叉熵作为损失函数。
反向传播其实也没那么神秘,因为梯度下降就是根据输出的结果和预期值之间的差距,倒推回去修改参数
为什么要用激活函数?
如果不运用激活函数,输出信号仅仅是一个简单的线性函数,此时神经网络就是一个线性回归模型,无法学习和模拟如图像、语言等复杂数据。
tanh为什么比sigmoid表现好
sigmoid函数的微分函数 当x取值为0,其最大值是1/4;当反向传播经过多层之后,梯度会变得非常小,导致参数更新很慢。
(1)当sigmoid中x较大或较小时,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0
(2) Sigmoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16。不同的层次计算出来的梯度的大小不同,越靠前的层的学习速度就越慢。也就是,梯度消失的问题。
而tanh是关于0对称的,可以生成负值,在一定程度上防止梯度总是同为正,或者同为负
激活函数不以零为中心的影响
如果上一级神经元采用 Sigmoid 函数作为激活函数,x0和下一层的x1符号均为相同的。此时,模型为了收敛,不得不向逆风前行的风助力帆船一样,走 Z 字形逼近最优解。
梯度下降是一个最优化算法,梯度下降是迭代法的一种,可以用于求解最小二乘问题,求最小损失函数
反向传播是求解梯度的一种方法。 输入x没有直接链接到输出Y,做一次梯度下降只能到达隐藏层的最后一层;只能计算出来最后一层的参数对输出的影响;这个时候需要一层层地反推回去,计算出来每一层的参数对输出的影响。其实就是根据损失函数对所有的参数进行求导。
词向量
word embedding,就是将单词word映射到另外一个空间,可以认为是单词嵌入,就是把X所属空间的单词映射为到Y空间的多维向量,词义相近的词 词向量也相近
word2vec中,相比于One-hot,维度大大缩减。进行word embedding的主要目的是为了表达词的含义,词汇之间的内在联系,实现对词语更精确的描述。
相比于one-hot编码,word-embedding有何优点?

word2vec中的多词模型分为CBOW(Continuous Bag-of-Words 与Skip-Gram两种模型
CBOW模型的训练输入是某一个特征词的上下文(context)相关的词对应的词向量,而输出就是这特定的一个词(目标单词target)的词向量。
使用huffman树
得到Huffman树后我们会对叶子节点进行Huffman编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短。
使用Huffman树之后,从隐藏层到输出的softmax层的计算量就得到了极大的改进。这样就避免了计算所有词的softmax概率,变成了一棵二叉Huffman树之后,softmax概率计算只需要沿着树形结构进行就可以了。


skig-gram为何比CBOW慢?
而skip-gram进行预测的次数是要多于cbow,因为每个词在作为中心词时,都要对上下文词预测一次,都要进行2C次的预测、调整,当数据量较少,或者词为生僻词出现次数较少时, 这种多次的调整会使得词向量相对的更加准确。
在Huffman树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为"Hierarchical Softmax"。
如何“沿着霍夫曼树一步步完成”呢?在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。
循环神经网络
RNN为什么会有记忆功能呢?
RNN的主要思想就是把隐藏层/输出层的值保存在memory中,参与到新的输入的计算中。因为在下一次的计算中,隐藏单元也和输入一起参与了运算。我们知道隐藏单元是输入的计算结果;因此可以在一定程度上保留输入的信息。

seq2seq
基础的Seq2Seq有一些缺点,因为Encoder将输入编码为固定大小状态向量的过程实际上是一“信息有损压缩”的过程,如果信息量越大,那么这个转化向量的过程对信息的损失就越大,基础的模型连接Encoder和Decoder模块的组件仅仅是一个固定大小的状态向量,这使得Decoder无法直接去关注到输入信息的更多细节。相当于是在输入一句话之后,看完一遍,立刻要求进行翻译;对于人而言,长句子的效果也不会很好。
attention流程
attention解码器RNN接收嵌入以及初始解码器隐藏状态作为输入。
RNN处理其输入,产生新的隐藏状态向量(h4)
attention计算步骤:使用编码器隐藏状态和h4向量来计算该时间步长的上下文向量(C4)。
将h4和C4连接成一个向量。
通过前馈神经网络传递此向量。
前馈神经网络的输出指示该时间步长的输出字。
重复下一步的步骤
self-attention流程
| 准备输入 |
|---|
| 生成key,query和value |
| 计算输入1的attention score |
| 计算softmax |
| 将分数与值相乘 |
| 对加权值求和以获得输出1 |
| 对输入2和输入3重复步骤4–7 |

浙公网安备 33010602011771号