# Chap 1 简介
- 本文是《speech and language processing 2020.12》图书的阅读摘要
# Chap2 正则表达式&文本规范化&编辑距离
# 2.1 正则表达式
# 2.1.1 基础正则表达式
# 2.1.2 分隔、分组、符号优先级
正则表达式的匹配是贪心的,如 [a-z]*
会覆盖尽可能多的串,如once这个词,会完全覆盖
若需要非贪心匹配,使用*?
和+?
符号,尽可能少地匹配文本
# 2.1.3 更多操作符
# 2.1.4 替换,捕获分组,提前观察
替换:
分组重现:
提前观察:
# 2.2 字词
语料集(corpus / corpora)
- 文本语料集:
- 标点符号(punctuation):有利于区分语段(句号、逗号),识别特定含义(引号、问号、冒号)
- 语音语料集:
- 碎片(fragment):说错话或说一个词卡壳
- 停顿(filled pause):语气词等、作为讲着思想的重启,可用于预测后续词,也可根据停顿习惯识别讲者身份
语言统计学三大定律:
- Zipf law:在给定的语料中,对于任意一个词,其频度(freq)的排名(rank)和freq的乘积大致是一个常数
- Heaps law:在给定的语料中,其词汇集 与语料大小 ,存在大致关系
, - Benford law:在进位制中,以数起头的数出现概率为
,常用于检测数据是否造假
# 2.3 语料集
语料集说明文档
- 动机:为何建立这个语料集,谁建的,谁出钱支持
- 情况:文本的写/说 是在何种环境下进行的,是专门的任务吗,文本是对话还是印刷稿/社交媒体通信/独白或对白
- 语言:语言种类,包括地域方言
- 讲者特征:性别/年龄等
- 收集过程:数据量大小,若是采样数据(如何采样?)数据采集被同意否,数据如何被预处理,是否有元数据
- 标注过程:标注是什么,标注者的特征是什么,标注者经过如何的训练,数据如何被标注
- 分发限制:是否有版权或存在私人财产限制
# 2.4 文本规范化
文本规范化(text normalization)
- 标记化(tokenization):多语言、表情和标签
- 词形还原(lemmatization):判断词语的词根是否一致,如 sing(sang、sung、singing)
- 词干提取(stemming):朴素的词形还原方法,通常剪去后缀
- 句子划分(sentence segmentation)
# 2.4.1 使用Unix工具进行简易标记化
- 词频统计
- Linux tr (opens new window) 命令用于转换或删除文件中的字符
- Linux sort (opens new window) 命令用于将文本文件内容加以排序
- Linux uniq (opens new window) 命令检查及删除文本文件中重复出现的行列,配合sort使用
# 2.4.2 词标记
命名实体识别(NER):处理价格,日期,链接,邮箱地址,专业长词时需要整体标记
缩写还原:what's = what is
词标记是自然语言处理的第一步,所以需要高效处理,标准的方法是使用正则表达式编译出的有限状态机去决定每个标记,python中可以使用nltk.regexp_tokenize()函数
- 对于汉字,使用单字作为标记单位更佳,因为单字是大多数场景下的语义单位能避免大量陌生词的出现,
# 2.4.3 Byte Pair Encoding(BPE)算法
- tokenization模式
- token learner:从训练语料中归纳出词汇表(token的集合)
- token segmenter:将测试语料标记化
- tokenization常用算法(参考 (opens new window))
- byte-pair encoding(BPE,2016)
- unigram language modeling(2018)
- WordPiece(2012)
- SentencePiece(2018)
- byte-pair encoding(BPE,2016)
# 2.4.4 word normalization, lemmatization, stemming
Word normalization: 将 words/tokens 变成标准格式(如 US,USA)
Lemmatization:将词的词干和词缀分离,简易的方法叫stemming,直接砍掉后缀
Porter stemmer (opens new window) 是1980年提出的,至今广泛使用的stemming方法,此法基于重写规则,较为简单,但可能会遇到误判(commission不同的判为相同,omission相同的判为不同),如下
# 2.4.5 sentence segmentation
# 2.5 最小编辑距离
两个字符串的最小编辑距离:一个字符串通过插入,删除,替换操作变成另一字符串的最小次数
动态递推式:
例子(记录backtrace)
自然语言处理中的动态规划
- Viterbi算法:最小编辑距离的概率扩展,计算maximum probability alignment(https://zhuanlan.zhihu.com/p/40208596)
- CKY算法
# Chap3 N-gram 语言模型
动机:如何预测下一个词
方法:通过模型为接下来可能出现的词分配概率
场景:语音识别中的纠错,文本语法纠错,机器翻译的正确表达,输入法提示
术语定义:
- 语言模型(LM):为词序列分配概率的模型
- n-gram:一个包含n个单词的序列(n=2,bigram;n=3,trigram)
# 3.1 N-Grams
- 使用全部上文进行估计
- 公式:
- 问题:数据集中可能没有包含新奇句子的样本,导致分子或分母为0
- 公式:
- 使用历史距离最近的N-1个词,形成N个词的小组,来进行近似估计
- 公式:
- 链式法则:
- 问题:一直相乘会导致长句的概率极小,导致数值无法被表示(underflow),
- 改良方法:使用对数概率
- 公式:
# 3.2 评价语言模型
- 数据集切分:80%训练,10%验证,10%测试
- 评价指标:迷惑度(Perplexity, PP)
- 公式:$ PP(W)=P(w_1w_2, \dots w_N)^{-\frac{1}{N}} = \sqrt[N]{\prod\limits_{i=1}^{N}\frac{1}{P(w_i \vert w_1 \dots w_{i-1})}} \approx \sqrt[N]{\prod\limits_{i=1}^{N}\frac{1}{P(w_i \vert w_{i-n+1} \dots w_{i-1})}}$
- 思想:测试集中的句子都是正常的句子,那么训练好的模型在测试集上的概率越高越好,即最大化
,最小化 - 注意事项:
- 1、词表相同的模型对比才有意义
- 2、涉及句首词预测需要增加前置padding
# 3.3 泛化、零概率问题
假设一个语料库长度为,有个不同的词汇,n较大时,按概率生成的句子效果较好,但也有一些问题
- 存储空间占用较大,n-gram模型需要计算的概率有
个 - 稀疏性问题(较多的概率值为0),当测试集出现训练集未曾出现过的词串模式时,会导致整体预测概率变为0,PP无穷大
- 训练数据需要与测试数据具有相同的体裁,方言,语言模型才会表现得好
- 存储空间占用较大,n-gram模型需要计算的概率有
稀疏性问题
- 定义:当测试集出现训练集未曾出现过的词串模式时,会导致整体预测概率变为0
- 原因及处理办法
- 情况一:测试集出现未知词汇
- 处理办法:使用固定的词典,使用
代表训练集中不在词典的词(或出现次数小于阈值的词),将 当成一个普通词,用同样的方法预测概率
- 处理办法:使用固定的词典,使用
- 情况二:测试集中出现了训练集不存在的上下文模式
- 处理办法:平滑化、减少n-gram的n值(backoff)
- 情况一:测试集出现未知词汇
# 3.4 平滑
k-平滑:
- 公式:$ \frac{C(w_{n-N+1:n})}{C(w_{n-N+1:n-1})} \rightarrow \frac{C(w_{n-N+1:n})+k}{C(w_{n-N+1:n-1})+kV}$ (
时又叫拉普拉斯平滑) - 评价:对于语言模型而言效果不好,概率分布的方差不好,不合适的平滑
- 公式:$ \frac{C(w_{n-N+1:n})}{C(w_{n-N+1:n-1})} \rightarrow \frac{C(w_{n-N+1:n})+k}{C(w_{n-N+1:n-1})+kV}$ (
使用低阶n-gram的概率做插值来达到高阶n-gram的效果
公式:
评价:使用EM算法来学习
的最优值,有一种叫Katz backoff
Kneser-Ney 平滑
- 公式:
- C_{KN}(.) = \begin{cases} count(.) \quad for \ the \ highest\ order \\ continuation-count(.) \quad for \ the \ lower \ cases \end{cases}
- 评价:最常用、表现最好的n-gram平滑方法之一
- 例子:https://medium.com/@dennyc/a-simple-numerical-example-for-kneser-ney-smoothing-nlp-4600addf38b8
- 改良版:modified Kneser-Ney Smoothing(对于n-gram的不同n,使用不同的discount,而非原版固定的discount)
- 公式:
# 3.5 大语言模型和stupid backoff
- n-gram模型在语料库很大时需要考虑效率问题,有一些改良办法
- 将单词本身的存储改成int64型的哈希值
- 剪枝
- 设置n-gram计数的阈值,仅存储大于阈值的n-gram
- 用布隆过滤器设置近似的语言模型
- 大语言模型下,一个名为stupid backoff 的简单算法往往就足够了。
- S(w_i \vert w_{i-k+1}^{i-1}) = \begin{cases} \frac{count(w_{i-k+1}^{i})}{count(w_{i-k+1}^{i-1})} \quad if \ count(w_{i-k+1}^{i})>0 \\ \lambda S(w_i \vert w_{i-k+2}^{i-1}) \quad otherwise \end{cases}
- 起始条件unigram:
- 经验值:
# 3.6 Perplexity 和 Entropy 的关系
熵(Entropy):
- 给定一个随机变量,其分布的集合为
,概率函数为 ,定义熵为 - 将语言看作一个生成词序列的随机过程,则
- 假设语言具有平稳性(概率与序列时刻无关,实际并不是的)和遍历性,可近似简化为
- 给定一个随机变量,其分布的集合为
交叉熵(Cross-Entropy):
- 在我们不知道数据生成的概率分布p时,依然有用,可以衡量简单模型和复杂的概率分布之间的交叉熵,并通过最小化这个值使模型去拟合
Perplexity 和 Cross-Entropy的关系
# Chap 4 朴素贝叶斯和情绪分类
# 4.1 贝叶斯分类器
- 多元贝叶斯分类器(multinomial naive Bayes Classifier)
- 贝叶斯推断公式:
- 两个假设
- 词袋假设:词的作用与词所处位置无关
- 朴素贝叶斯假设:特征
互相独立
- 给定类别集合 ,对于由特征
表示的文档 ,预估分类 - 若特征 即为词本身,则
- 实际运算时常采用对数形式以提速且避免溢出:
- 贝叶斯推断公式:
# 4.2 训练朴素贝叶斯分类器
使用最大似然估计,用频率估计概率
假设
为训练数据中类别为 的文档个数, 为训练集中文档总数,则 同理,有
但为了避免0概率的问题,使用Laplace平滑,有
对于测试集中发现的,训练集词表中没有的新词,忽略之
对于无意义的高频词,忽略之
# 4.3 情绪分类优化
改进1:一个词在文档中是否出现,比它出现多少次重要,故限制词频在每个文档的取值为0或1
改进2:否定词的出现可能会翻转整个句子的情感类别,故在词正则化阶段,对否定词后的词语添加NOT_前缀,直到出现标点符号
改进3:对于标注的训练数据不足时,可从专用的情绪词汇表中抽取正负倾向情绪特征来使用,四大流行情绪词表为 General Inquirer(1966),LIWC(2007),opinion lexicon(2004),MPQA Subjectivity Lexicon(2005);MPQA中包含6885个词语,2718个正向、4912个负向;使用词表的时候,添加特征“该词出现在(正/负)向词表中”;当训练数据稀疏且与测试集分布差异较大时,可使用“出现在正负向词表中的词的个数”来代替单个词语的特征,以达到更好的泛化效果
# 4.4 朴素贝叶斯用于其他分类任务
- 对于垃圾邮件分类,使用预定义的短语作为特征,并结合一些非语言学特征,如HTML中的text部分占比,能达到更好的效果
- 对于语言种类分类,使用字母n-grams是比单个词汇更有效的特征
- 对于句子情感分类,使用基于单词的朴素贝叶斯即可
# 4.5 评价指标:准确率,召回率,F-指标
MacroAveraging:计算每个分类的性能指标,再求平均作为总体性能指标(类别重要性一致,更合适)
MicroAveraging:收集所有类至一个混淆矩阵,然后计算准确率和召回率(受大类影响较大)
使用训练-验证-测试集划分,并使用交叉验证技术来衡量模型性能
# 4.6 统计显著性检测
- 在测试数据集x上,用评价指标M,比较两个分类器A和B的表现:
- 形式化两个假设
- NLP领域有两个常用的非参数化检验: approximate randomization(1989),bootstrap test(1993)
# 配对bootstrap test
- 考虑一个文档二分类问题,给定真实测试集中包含10个文档,给定两个分类器A和B,A和B对于文档存在分类正确错误的4种组合情况,构造b个虚拟测试集的方法是每次从真实测试集中随机抽样并放回,如下表所示
,若该值小于一定阈值,则表明 足够显著,可以说明两个分类器表现的好和坏
# Chap 5 逻辑回归
- 逻辑回归是NLP分类问题中的baseline算法,是判别式的分类器,它包含两部分
- 训练:使用随机梯度下降(SGD)算法和交叉熵损失函数(cross-entropy loss)来训练
- 测试:给定测试样例 ,模型计算
,并返回较高概率的类别
# 5.1 分类:sigmoid
输入样例 可以表示为一个特征向量
逻辑回归学习一个权重向量
和截距 - 使用sigmoid函数将实数域输入映射到
区间的输出
逻辑回归方法需要手工设计特征交叉,对于大多数任务,我们需要大量特征(从特征模版中构建出来),为了避免特征设计的人力浪费,NLP中有专门研究表示学习的方向,使用无监督方法自动学习输入的特征
逻辑回归对于特征相关性强的问题较为鲁棒,而贝叶斯方法假设特征互不相关;故对于大数据集,逻辑回归表现一般较好,对于小数据集,朴素贝叶斯一般表现较好;朴素贝叶斯易于实现且训练快速(无需优化步骤),在某些情况下,依然是合理的方法
# 5.2 交叉熵损失函数
:衡量模型估计值 与真实值 的差异 通过学习权重,最大化正确标签的概率
,这是一个伯努利分布,
# 5.3 梯度下降
求解目标是一组参数,使得
对于逻辑回归,损失函数是凸的,仅有一个极小值点为全局最小值
但对于神经网络,损失函数是非凸的,故容易陷入局部极小值点而无法找到全局最小值
拓展到多维空间,学习过程为
- 梯度:\nabla_\theta L(f(x;\theta),y) = \left[ \begin{matrix} \frac{\partial}{\partial w_1}L(f(x;\theta),y) \\ \frac{\partial}{\partial w_2}L(f(x;\theta),y) \\ \dots \\\frac{\partial}{\partial w_n}L(f(x;\theta),y) \end{matrix} \right]
- 学习率:
,过大则训练阶段损失函数的值不收敛,过小则学习时间过长
使用mini-batch training,梯度下降方向为当前batch样例梯度的算术平均
# 逻辑回归的梯度
# 随机梯度下降算法
# 5.4 正则化
训练集中,若某特征仅恰巧在单一类别中出现,它在逻辑回归的训练过程中,会被赋予很大的权重,而这有可能是巧合,从而导致过拟合问题,为了避免过拟合,在目标函数中引入正则项
正则项可以分为L2正则和L1正则,L2正则的逻辑回归又称岭回归,L1正则的逻辑回归又称Lasso回归;L2回归因为连续可导而易于优化,L1在零点不连续;L2的结果一般是多项小权重向量,L1的结果一般是一些权重值较大,一些权重值为0的权重向量
L2正则:
L1正则:
L1正则化可通过假设权重w的先验分布为拉普拉斯分布,由最大后验概率估计导出
L2正则化可通过假设权重w的先验分布为高斯分布,由最大后验概率估计导出
# 5.5 多元逻辑回归
softmax操作:
损失函数:
(其中k是正确类别)
梯度:
# Chap 6 向量语义和嵌入表示
# 6.1 词汇语义
- 词相似度:SimLex-999数据集(2015)给词对赋予0-10的相似度分值
- 词相关性:两个词是否属于一个语义场,如医院(医生,护士,急救)
- 语义帧和角色:语义帧是某个特定活动的观点和参与者构成的词集合,语义帧中存在角色,句子中的词可以扮演这些角色,如A从B那里买了一本书(A是买家,B是卖家)
# 6.2 词向量语义学
词向量语义学的任务是在多维语义空间中找到一个点来表示词语,这个词语在多维空间中的向量表示叫做嵌入(embeddings)
信息检索:给定文档集 和查询 ,从文档集中返回最佳适配的文档 ;
# 6.3 词和向量
词-文档矩阵:行数为词表大小
,列数为文档个数 , 表示词 在文档 中出现的次数 - 从词语的角度而言,battle可以表示为向量[1,0,7,13]
- 从文档的角度而言,As you Like It 可以表示为向量 [1, 114,36,20]
词-词共现矩阵:行列数均为词表大小,
表示词 和词 在上下文(篇章、段落、句子等粒度皆可)中同时出现的次数 矩阵稀疏程度非常高
# 6.4 相似性衡量指标:余弦函数
- 内积:
- 向量越长,则内积越大,但为了衡量相似性,需要对其进行归一化
- 余弦:
- 对于单位向量,它们的余弦相似度即为它们的内积
# 6.5 TF-IDF
- 算法
- 词频(Term Frequency,TF) = 某个词在文档中出现的次数 / 文档的总词数 (在Lucene的实现中对TF开根号归一化)
- 逆文档频率(Inverted Document Frequency,IDF) = log(语料库文档总数/(包含该词的文档数+1))
,代表某个词在某个文档中的权重值(比直接用词频效果好)
- 应用
- 在摘要场景下,根据文档中所有词语的TF-IDF值的大小,可以确定文档的关键词
- 在搜索场景下,可根据查询 涉及的关键词
在文档 中的TF-IDF值,建立相似度函数, - 常用做NLP任务的baseline算法
# 6.6 Pointwise Mutual Information(PMI)
点互信息:衡量两个事件的相关性
对于两个低概率事件,训练样本集不一定有同时出现的样本,容易导致
趋向负无穷,所以提出改进,正点互信息
正点互信息
例子:词-词共现矩阵(上面的是频率,下面的是PPMI)
计算过程
能反应较好的词-词关联性,但存在一定偏见,即对于罕见事件,会赋予较高的PPMI值
改良
取经验值
能在大多数下游任务中改善模型表现,本质是降低了罕见事件的 值 另一个方法是对词频采用k-smoothing再进行PPMI计算,经验值是0.1~3
# 6.7 TF-IDF和PPMI向量模型的应用
- TF-IDF模型常用于衡量两个文档的相似度,将文档的所有词向量做算术平均得到文档向量,再使用余弦相似度衡量两个文档向量的相似度;用于信息检索、作弊检测、新闻推荐等下游任务
- PPMI模型可以寻找语料集中的近义词
# 6.8 Word2vec
embeddings是较短的,稠密的向量,而非之前提及的维度为词汇表大小或文档集基数的稀疏向量;但embeddings并没有直观的解释
稠密向量需要学习较少的权重值,且对于同义的捕获更为鲁棒
word2vec是一个运用自监督方法的语言向量表示方法
- skip-gram的思想:
- 1、将目标词和它的邻居上下文词作为正样本
- 2、从词汇表中随机采样其他词作为负样本(下图正负样本采样比例为2)
- 3、使用逻辑回归去训练一个二分类器
- 4、使用学习好的权重作为embedding
- 1、将目标词和它的邻居上下文词作为正样本
- skip-gram的思想:
Word2vec可以看作是PPMI矩阵的一个隐式优化版本
# 分类器
skip-gram 模型:
假设:一个词 若经常出现在目标词 周围,则 的词嵌入和 的词嵌入是相似的
算法:给定一个目标词,和它的上下文窗口里的 个词(该超参数需要调节,小了容易捕获句法相关,大了容易捕获话题相关)
结果:得到两类embedding,一类是作为目标词的,一类是作为上下文词的;每一类embedding都包含
个词,实际中,可以将两类embedding加起来,或者抛弃上下文词embedding,作为最终embedding
负采样
- 根据加权的unigram-frequency进行负采样:
- 经验值
表现较好,因为它能给罕见的词语赋予较高的概率,
- 根据加权的unigram-frequency进行负采样:
训练目标:最大化正样本对的相似度,最小化负样本对的相似度
损失函数:
求解梯度:
# 其他静态词嵌入
fasttext(2017)使用subword models 去处理未知词汇和稀疏性问题,如where可以表示为自身和连续的n-gram组合 <wh, whe, her, ere, re>;对于每个连续的n-gram,通过skipgram学习它的embedding,最后,将该词所有n-gram的embedding加起来作为该词的embedding;fasttext (opens new window)提供157种语言的预训练embeddings
Glove(2014),Global Vectors的简称,是广泛使用的embedding模型,Glove是基于词词共现矩阵中的概率分布,结合如PPMI的count-based 模型,且能捕获线性结构
# 6.9 词嵌入可视化
- 最简单的办法:根据词嵌入向量的相似性分数,列出最相近的词语列表
- 另一种办法:使用聚类算法反应词嵌入空间中的层次化表示
- 最常用的办法:使用t-SNE等投影算法,将高维向量投影到二维空间
# 6.10 评价词向量模型
- 相似度测试:WordSim-353数据集(2002),SimLex-999数据集(2015)
- 上下文测试:Stanford Contextual Word Similarity数据集(2012),Word-in-Context数据集(2019)
- 类比测试: 给定 a-b,求解a* - b*的问题,如SemEval-2012 Task 2 dataset
- 考虑到词向量模型训练的随机性,可以通过在文档中采取bootstrap sampling训练多个embeddings,并求平均的方法,以达到更好的效果
# Chap 7 神经网络和神经语言模型
# 7.1 神经元和前向神经网络
激活函数
- 常见种类:
- Sigmoid:
- Tanh:
- Relu:
- Sigmoid:
- 常见问题:
- 关注斜率,太靠近0会导致梯度消失问题,如sigmoid和tanh都会有该问题
- 异或问题是线性不可分的,单个神经元不能解决这个问题
- 常见种类:
前向神经网络(feedforward network):无环的多层网络,又名多层感知机(MLP)
计算图:
# 7.2 神经语言模型
- 一般使用one-hot encoding 作为原始输入,通过反向传播去train一个one hot encoding到特定维数embedding的矩阵E
- 训练过程为
# Chap 8 词性标注和命名实体识别
# 8.1 英语词汇分类
- closed class:多为语法上的功能词汇,较短,高频出现
- open class:能被持续创造或引申
- 另一种词性分类体系
# 8.2 词性标注
词性标注:给定序列
,和标签集,输出每个元素对应的标签 考虑到某些词,如book,既可以是名词,也可以是动词,词性标注就是通过上下文来精确定性词汇,避免模棱两可的情况
对于词性标注任务,HMMs,CRFs,BERT等算法和人类表现基本一致,准确率约为97%
给定测试集中一个词,选择它在训练集中最频繁的标注类型,准确率能有92%(baseline)
# 8.3 命名实体和命名实体识别
- 命名实体识别(NER):寻找特定类型实体
- BIO 标注方法(1995):将寻找离散实体段的任务转化为序列连续标注任务
# 8.4 隐马尔可夫模型(HMM)
马尔可夫假设:未来与过去无关,仅与当下相关
马尔可夫链:包含状态集、转移概率矩阵、初始概率分布三个要素
隐马尔可夫模型
- 很多情况下,我们关注的事件是隐藏的,隐马尔可夫模型允许我们将观测到的事件和隐藏的事件作为概率模型的作用因子,它是一个生成式模型
- 隐马尔可夫模型组成元素
隐马尔可夫标签模型
标签tag转移概率
(频率估计概率),常从大语料集中抽取出来 HMM表示的两部分,A为标签转移概率矩阵,用于计算先验概率,B为与每个标签关联的词语观测概率
标签转移概率矩阵A(从大语料集中获得,通用)
标签关联词语观测概率B(从训练集中获得)
两个假设及序列估计公式
- 假设一:一个词出现的概率依赖于它自己的标签,和上下文的词和标签无关:
- 假设二:一个词的标签仅依赖于上一个词的标签(bigram)
- 序列估计(最后分别对应概率矩阵A和B):$\hat{t_{1:n}}=\arg \max\limits_{t_1 \dots t_n}P(t_1 \dots t_n|w_1 \dots w_n) = \arg \max\limits_{t_1 \dots t_n} \frac{P(w_1 \dots w_n|t_1 \dots t_n)P(t_1 \dots t_n)}{P(w_1 \dots w_n)} \ = \arg \max\limits_{t_1 \dots t_n} P(w_1 \dots w_n|t_1 \dots t_n)P(t_1 \dots t_n) \ \approx \arg \max\limits_{t_1 \dots t_n}\prod\limits_{i=1}^{n}P(w_i | t_i)P(t_i | t_{i-1}) $
- 假设一:一个词出现的概率依赖于它自己的标签,和上下文的词和标签无关:
不足之处
- 需要对概率矩阵做平滑处理;难以融合其他特征;无法处理未知词汇
维特比算法:通过动态规划的方式寻找最优标签序列(先将概率从左推到右,再回溯产生最大概率的标签路径)
# 8.5 条件随机场(CRFs)
- 条件随机场:判别式模型,直接计算,概率是 个全局特征 的加权softmax值,每个全局特征是由对应的函数 在运用完整输入 ,窗口为2的标签序列,标签位置求和得到的,这种又叫线性链随机场,局部特征函数 可以自由定义并组合多种人工特征
# Chap 9 序列处理的深度学习架构
# 9.1 循环神经网络(RNN)
结构特点:网络连接中有环,训练较难
数学表达:
- 给定词表大小
,输入维度 ;隐藏层维度 ;输出维度 ;one-hot输入 权重矩阵 $ E \in \mathbb{R}^{|V| \times d_{in}} \quad W \in \mathbb{R}^{d_h \times d_{in}}U \in \mathbb{R}^{d_h \times d_h}V \in \mathbb{R}^{d_{out} \times d_h}$
- 给定词表大小
自回归
序列分类:使用最后一个隐状态作为分类器的输入,可进行端到端训练
Stacked RNNs
Bidirectional RNNs
# 9.2 管理RNN的上下文:LSTMs 和 GRUs
朴素RNN的两个问题:难以同时为当前节点提供决策支持且携带信息用于后续节点决策;容易出现梯度消失的问题
关键应对措施是学习如何管理上下文,而非将一种策略硬编码进网络结构中
LSTM通过在结构中加入显式的上下文层,起到管理上下文的作用;通过使用特殊的神经元(通过门的方式控制信息流入流出)
LSTM unit示意图,输入为上一时刻的上下文向量
,上一时刻的隐状态向量 ,当前时刻的输入 ,输出当前上下文向量 ,当前隐状态向量 遗忘门:删除上下文中不再需要的信息。计算上一个隐藏层和当前输入的加权和,过sigmoid,然后再将结果与上下文向量相乘
加法门:选择信息加在当前上下文上面,得到新的上下文向量
(计算单元)
输出门:决定当前隐藏状态需要什么信息(即需要为未来决策保留何种信息)
LSTM引入了相当多的附加参数(8组),
,导致训练成本较高,GRU则通过分离上下文向量,并将门的个数精简为2来缩减训练成本,包括一个重置门,和一个更新门 - 重置门:决定过去隐状态中哪些信息是与当前上下文相关,哪些信息可以被忽略
- 更新门:
(计算单元)
- 重置门:决定过去隐状态中哪些信息是与当前上下文相关,哪些信息可以被忽略
前向神经网络,普通RNN,LSTM,GRU的单元结构图
# 9.3 自注意力网络:Transformers
RNNs通过循环结构传递信息会导致信息丢失且难以训练,且序列一步一步的推断不允许并行计算,这些问题使得Transformers结构得以发展,消除循环结构,回归全连接网络
自注意力机制允许网络从任意长度的上下文中直接抽取信息并使用,无需通过中间的循环连接结构;自注意力机制的核心是能够比较一个实体对于实体集中其他实体的兴趣程度,从而揭示上下文的相关性,但这种简单的机制不能用于学习,需要设定不同role
Transformer中的Self-Attention机制
给定
,则 , , 使用向量形式表达:
(记住要mask掉上三角,避免使用未来函数)
Transformer中的Multihead Attention
- 两个词之间可能存在多种关系,一个单独的transformer block难以同时捕捉这些关系,故使用多个head(即self-attention layer) ,将不同head的输出concat起来,在使用一个线性投影矩阵恢复成原来的维度
- $ MultiHeadAttn(Q,K,V)=W^O (head_1 \oplus head_2 \dots \oplus head_n)$
Transformer中的Block
- 包括自注意力力层,正则化层,前向层,以及残差连接
训练一个Transformer语言模型
Transformer语言模型完成摘要任务
# Chap10 上下文嵌入
- 原书还没更新本章,跳过
# Chap 11 机器翻译和编解码模型
# 11.1 编解码模型
encoder-decoder模型
- encoder的作用是对输入生成一个带有上下文信息的表示
基于RNN的encoder-decoder架构
描述:以encoder最后的隐状态代表encoder和decoder的桥梁,即context,并用于decoder的初始隐状态,并通过自回归生成输出序列,但生成过程中会导致信息丢失,一个改良办法是将context变量引入到每一步推断中
架构图:
数学公式:
训练方法:使用标准译文作为decoder的输入,而不选用上一时刻decoder的输出
# 11.2 注意力机制
基于RNN的ecoder-decoder架构中,context变量始终是一个information bottleneck,对于长句,context变量不能保存长距离信息,注意力机制是一个解决办法,使用encoder所有隐状态向量的加权和来作为context变量,权重由每个encoder state与当前decoder的隐状态
的相关性分数决定,评分函数可以更复杂一些 decoder翻译时,权重使得decoder更关注输入的特定部分,在decode过程中,context vector是动态变化的
# 11.3 Beam Search
greedy decoding:decode的过程中,选择经过softmax运算后的单个最高概率的token
greedy decoding不是最优的,不一定能找到最大概率的完整翻译;但像viterbi算法等动态规划方式并不适用,保证最优结果只有穷举这种办法;但实际操作中,会过慢
对于序列生成问题,常用的方法叫做beam search,decode的每步保留k个可能的token,k叫做beam width,下一步decode时,会出现
个待选序列,根据概率裁剪剩k个即可,故能一直保持k个假设序列。当某个序列到达终止符时,k减1,然后继续搜索,直到k=0为止;下图为k=2的beam search实例 beams search的k值一般取5到10,生成的最终k个假设序列可能会出现长度不一致的问题,采用长度归一化的方式选出最终的结果
# 11.4 基于Transformers的编解码模型
# 11.5 开发机器翻译系统的实用细节
使用BPE或wordpiece算法生成一个词典,包括现有语言和目标语言的词汇
段落对齐(sentence alignment)
Backtranslation:使用反向翻译的句对增强训练数据集
- https://blog.csdn.net/feifei3211/article/details/103344445
- https://arxiv.org/pdf/1808.09381.pdf
# 11.6 机器翻译评估方法
翻译结果可以使用两个维度去进行评价,恰当性(adequacy)和流畅性(fluency)
人工的评估方法可以根据恰当行和流畅性等指标进行绝对打分或相对排序
自动的评估方法中,最流行的是BLEU(BiLingual Evaluation Understudy,2002),它是基于一个假设:好的机器翻译会包含正确人工翻译中的词语和短语;故考察真实翻译和候选机翻的n-gram准确率(n=1,2,3,4的加权平均),以及根据候选翻译和参考翻译的句子长度的关系作为惩罚因子
计算过程讲解:https://blog.csdn.net/guolindonggld/article/details/56966200
局限性:BLEU具有局部性,难以评价跨句段的翻译效果
自动评估方法中,Bertscore: Evaluating text generation with BERT. ICLR 2020. 提出可以使用BERT去评价真实翻译和候选翻译的语义相似度BERTScore,作为一种新的自动评估指标;后续衍生工作包括BLEURT ACL2020,MoverScore等
文本生成评价指标的进化
- https://blog.csdn.net/hwaust2020/article/details/106997321
# Chap 12 成分结构语法
- 本章比较理论化,跳过
# Chap 13 成分结构解析
- 本章比较理论化,跳过
# Chap 14 依赖解析
- 本章比较理论化,跳过
# Chap 15 句义的逻辑表示
- 本章比较理论化,跳过
# Chap 16 计算语义学和语义解析
- 本章尚未更新