零、写在前面
这里是《自然语言处理基础》简称 FNLP 在 26 春季的课程笔记。上个学期的笔记或多或少都烂尾了,这次必须整好!(然而并没有,本笔记截止至期中考试前的部分。这部分倒是挺完整的,可以挂网站上)
本课有两个小报告,大概是寻找大语言模型目前难以解决的问题;同时有几个 lab,这两件事加起来 60 分;期中考试 30 分;平时分 10 分。
本课需要先修概率与统计相关知识、基础语法知识、以及神经网络的基础。
教学大纲如下:
- 词汇层面:分类任务——词义消歧
- 词汇层面:序列模型——词性标注、中文分词、命名实体识别
- 语义层面:词汇表示(词向量等)
- 语言建模:n元语法模型、神经语言模型及其发展
- 神经模型(一):卷积神经网络、循环神经网络、长短期记忆网络、注意力机制……
- 信息检索
- 句法层面:树结构与形式语法——上下文无关文法、概率上下文无关文法、依存句法分析、组合语义学
- 神经模型(二):序列到序列模型、注意力机制、Transformer
- 应用:问答系统、信息抽取、机器翻译……
- 神经模型(三):大型语言模型、数据、评测……
- 嘉宾讲座
一、引言
语言是人类交流的渠道,要掌握一门语言,标准应当是是否能与人交流。自然语言处理(Natural Language Processing,NLP)的任务就是帮助计算机实现将人类语言作为输入或输出来处理任务。作为输入时,相当于帮它理解,比如自动打标签、提取文本信息等;作为输出时,相当于让它实现生成,比如文本总结、内容规划等。计算模型经历了长期的发展,从最早的基于明确的规则和逻辑的符号模型(Symbolic models),到基于概率统计的统计模型(Statistical models),再到最终的基于神经网络的神经模型(Neural models,也经过了从预训练语言模型到大语言模型的发展)。
自然语言处理的应用较为广泛。
- 自动语音识别(Automatic Speech Recognition,ASR)是把语音转成文字;
- 文本转语音合成(Text To Speech Synthesis,TTS)就是把文字转成语音;
- 信息提取,给定一段文字,要求从中提取信息。对于同名人名、行话等处理较为薄弱;
- 情感分析,给定一段评价,判断其情感或者对一项事物的正负面评价;
- 交流,不仅是当今的大语言模型,还有搜索引擎、知乎问答等等类型的交流,机器能根据文本内容和你的需求提供相应的内容;
- 对话与智能机器人交互。比如 SIRI,小爱同学等。大语言模型也能划分到这个方向;
- 文本总结,比如自动对新闻进行摘要;
- 新闻撰写,诗歌撰写、翻译;
- 等等。
为什么说语言很复杂呢?
- 语言的层次很丰富,不仅需要理解单个单词的意思、读法等,还要了解句子组成的语法,还有整个句子的含义,总结完这些以后还得组织语言回复;
- 语言总是充满了歧义,比如一词多义、断句问题、句子结构理解歧义、说话没说清楚、不同语境下的不同意思,诸如此类;
- 世界上的语言太多种了;
- 根据齐夫定律(Zipf’s Law),语言中绝大部分词都是低频词;
- 等等。
二、词义消歧
1. 啥是词义消歧?
语言中的歧义非常多,比如:
- 一词多义;
- 中文里的多音字,还需要判断声调(英文里也有不同意思不同发音的情况);
- 专有名词、地名、人名等;
词义消歧(Word Sense Disambiguation,WSD)的任务就是,给定一个有歧义的词语以及它的上下文,判断哪个含义是正确的。对于计算机,输入包括目标词、文本、以及可能的意思选项;需要构建一个能提取目标词特征,并与自身的知识库去比较的模型,输出的就是词语的含义。
我们称目标词所有可能的含义为词义清单(Sense Inventory),它可能包括标准的词典中的记录,也可能会有未收录于词典的引申义或新含义等,被手动标注进词义清单。网络上已经有很多现成资源,如 WordNet, HowNet 等。
- WordNet 是大型英文词汇数据库,按照同义词集分组,并按照语义关系组成网络。常常搭配 SensEval 这个数据集使用,这个数据集包括一系列带有人工标注正确答案的句子,可以用于训练或测试。
- BabelNet 支持更多语言且更加全面,是目前词汇量最大的语义网络之一。
现在的问题是如何构建模型,很明显需要进行机器学习。
2. 简单回忆机器学习的基础知识
监督学习将其当做一个分类任务,需要已知词义清单和带有标签的训练数据。基本的做法是使用训练数据来找到一个数学模型,它能够根据句子的特征来判断词语的含义。其优点是算法的选择多样,并且在数据够多的情况下表现非常好。但缺点就是它比较依赖数据质量。
半监督学习的核心思想是,只利用小部分的带有标签的数据,通过自举的方式从无标注数据中挖掘新训练样本。举个例子,可能只有 1000 个种子数据,训练出一个初步的分类器。下一步就是从大量无标注的数据中找出更多训练数据,有两种方法:
- 使用现有分类器,把置信度最高的预测结果加入训练集;
- 或是从自然对齐的数据集中提取,比如中英平行的语料库。说白了就不是单个单词的翻译,而是整句话的翻译。
反复执行上述过程,就能让模型越来越好。这个方法的优点是不需要特别多的初始训练数据,而缺点就是更加依赖数据质量了,并且还依赖寻找新训练数据的方法效果。
无监督学习顾名思义就是不存在带有标签的训练数据,只能把意思相近的词语放在同一个组里,形成聚类。优点很明显,完全不需要训练数据了;缺点就是只能聚类不能翻译。
目前用的比较多的还是监督学习,前面也说到它的选择很多样。提取句子特征的方法包括:
- 相邻词(neighboring words)提取目标词语周围的单词;
- 相邻的连续 $N$ 个词(neighbording N-grams)与局部搭配(local collocations)更关注周围的短语搭配;
- 词性标注(POS tags)获取目标词的词性,如名词、动词等;
- 相邻词的词性标注获取周围单词的词性序列;
- 分布式语义模型(distributional semantic models)将句子表示为一个低维稠密向量,也是现在最常用的方法,它能捕捉词语的语义相似性。
模型的选择也很多样,比如:
- 朴素贝叶斯(Naïve Bayes):基于贝叶斯原理,并假设特征之间相互独立,它计算每个类别下特征出现的条件概率,然后根据概率预测新样本的类别;
- 线性模型、神经网络等等。
作为起步,我们先详细介绍朴素贝叶斯模型。
3. 我是朴素贝叶斯模型,正片开始了
贝叶斯原理的公式很简单,$P(A\vert B)=\frac{P(A)P(B\vert A)}{P(B)}$。我们先假设目标单词为 $w$,词义清单为 $S$,其中包括多个语义 $s_1,s_2,\cdots,s_n$。$C$ 是语句,其中包含 $v_1,\cdots,v_j$ 这些单词。为了确定正确语义,我们选取能使得 $P(s\vert C)$ 最高的结果 $s^*$。根据贝叶斯公式,有:
\[s^*=\arg\max_{s_k}P(s_k|C)=\arg\max_{s_k}P(C|s_k)P(s_k)\]我们简单将 $P(C\vert s_k)$ 估计为 $C$ 中每个词在 $s_k$ 出现时也出现的概率之积:
\[P(C|s_k)=P({v_x|v_x\in C}|s_k)=\prod_{v_x\in C}P(v_x|s_k)\]它简单地认为了单词间是独立的,虽然这不对,但简单估计还是没问题的。而 $P(s_k)$ 可以用 $s_k$ 是 $w$ 的意思的频率来估计,即:
\[P(s_k)=\frac{Count(s_k)}{Count(w)}\]因此就能根据上述式子求出目标语义了。总结一下,对于词义清单里的每个词义 $s_k$,我们先求出它自身的概率 $P(s_k)$,也就是它出现的次数占目标词的比例;然后再求它出现的情况下这个句子出现的概率 $P(C\vert s_k)$,也就是对句子中的每个词 $v$,求当 $s_k$ 出现时 $v$ 也出现的频率。最后把它们乘起来,取最大的 $s_k$ 即可。
4. 衡量模型的指标
衡量一个模型的准确率也很简单,求准确判断的数量占总数的比例即可。但是除此以外,还有三个衡量模型在某一个语义下的指标,一个叫精确率(Precision),是在所有“你判断为该语义”的句子中,有多少真的是这个语义;一个叫召回率(Recall),是在所有“真的是这个语义”的句子中,该模型答对了多少;而综合这两者的评价指标为 F 值,它取精确率和召回率的调和平均,公式为:
\[F_\beta=\frac{1+\beta^2}{\frac{1}{Pre}+\frac{\beta^2}{Rec}}=\frac{(\beta^2+1)Pre\cdot Rec}{\beta^2\cdot Pre+Rec}\]当 $\beta=1$ 时就是调和平均。而综合考虑所有语义,又有两种考虑方式,第一种是将所有语义视作同等重要,称为宏平均(Macro F1),就是把所有词义的 F1 值求平均。第二种不是按照类别,而是将所有样本视作同等重要,求出整体的精确率和召回率,再求 F 值,此时称为微平均(Micro F1)。
如果你没听懂,请看下表:
| 你以为的\真实值 | Positive(确实是该词义) | Negative(确实不是该词义) |
|---|---|---|
| Positive(预测为该词义) | tp | fp |
| Negative(预测不是该词义) | fn | tn |
横向为真实值,纵向为预测值,tp 和 tn 是预测正确的部分,因此准确率 Accuracy $=\frac{tp+tn}{tp+fp+fn+tn}$。对正类的精确率 Precision $=\frac{tp}{tp+fp}$,召回率 Recall $=\frac{tp}{tp+fn}$。而对多语义,宏平均就是先算出每个语义的 F1 再求平均,微平均是:先针对每个词义,把四个小值求出来;然后把所有小值相加,再求 F1。
现在理论上我们已经可以完成词义消歧的任务了,对于一篇文章,我们既可以对指定的少量词汇进行 WSD,这些词汇叫 Lexcial-Sample;也可以对所有词都判断词义。对于第二种情况,需要训练的分类器就超级超级多了。
5. Done?
然而,在实际场景下,我们面对很多现实问题:
- 我们没有那么多标注数据;
- 语言是不断演变的;
- 可能有全新的语言需要处理。
此时我们的训练模型难以完成任务,因此我们需要一些基础的假设。
- 最常见义项(Most Frequent Sense,MFS):如果一个单词猜不出意思,就直接用最常见的意思。
- 一个文章一个含义(One Sense per Discourse):一篇文章中反复出现的单词大概率是同一个意思。
- 一种搭配一个含义(One Sense per Collocation):一个单词在一种搭配中大概率是同一个意思。
- Lesk 算法:一个词的词义与其上下文中出现的词语,应该与该词在词典中的释义(gloss)有较高的词语重叠度。所以将词语的上下文与词典中的释义和例句对比,重复的词语越多,越可能是这个意思。
上述的逻辑都是早期研究学者们所使用的,后来出现了 It Makes Sense(IMS),它采取了更复杂的提取特征的方法。后来,神经网络、Attention 等更复杂的模型出现了。时至今日,预训练模型已经垄断了整个市场。
不过,词义消歧目前仍然有未解决的问题。首先是很多的模型没有迁移能力,碰到一个比较小众的语言,数据不够多就出问题了。目前的解决方法是将模型改成:比较两个句子中的关键词是不是同一个意思,这两个句子可以不同语言。其次是一些民间词语的意思,这个需要广泛收集语义数据。
在本节的最后考考你有没有掌握评估指标:
Lexi 是一名全科医生,她的主要工作之一是倾听患者的主要抱怨,并迅速决定该患者是否有中风的高风险,以及是否应立即送往急诊科。你认为哪种评估指标对 Lexi 来说是最佳选择?
——明显是召回率,医生不希望看到真的患病的人没有被救治。
Leave a comment