自然语言处理
机器学习
- 学习一个函数来通过输入得到输出
判别垃圾邮件
- 对于数据打标签
-
特征工程:选择V个词作为特征,表示为V维向量
- 垃圾邮件和正常邮件用词方面不同
- 经典机器学习时代,将研究对象特征化,一种归纳偏置
-
例如学习一个函数,大于0表示不是,小于0表示是垃圾邮件
-
经典机器学习通常假设该函数为线性函数,为特征的加权线性组合
- 为每一个特征设定一个权重
- 一个有用的假设
-
模型学习:
- 模型参数 \(\theta = (w, b)\)
- 选择导致训练集上损失最小的函数
- 如何设计损失?
- 0-1损失:模型结果和人工标记完全一致为0,不一致为1
- 很容易算出错误率,错多少个错误率就是多少
- 但基本不采用,因为该函数不连续,不可导
- 连续、可导很重要?
- \(y * f(x) >= 0\) 正确分类,\(<= 0\) 表示错误分类
- 定义如下损失:\(max\{0, -y * f(x)\}\),感知机损失
- 可以证明是 \(\theta\) 的连续函数?
- 0-1损失:模型结果和人工标记完全一致为0,不一致为1
-
模型训练
- 梯度下降,就是寻找极值点?
- 最优化问题
- 往哪个方向变?数学上负梯度的方向
- 损失下降最快的方向
- 梯度下降法
- 按照一定的步幅(学习率)沿该方向逼近最小值
-
基于训练集得到的模型能处理未来数据吗?有无gap?经验数据这条路子有无问题?
- 有!都基于独立同分布假设
- 未来邮件和已标注邮件统计规律和特征应该是一致的
- 所有数据实例源自同一个概率分布
- 实例和实例之间是独立的
- 最应该关注的能力?泛化能力
- 衡量推广能力,将标注数据分为两个部分,训练集和测试集
- 为什么两个集合符合独立同分布但是有些时候测试集上表现不佳?
- 可能学到了没有普适推广价值的规律
- 过拟合!
- 理想状况:
- 低训练集错误率
- 低测试集错误率
- 不能单纯基于训练集损失最小的求解模型
- 训练时,监控模型在测试集中的错误率?
- 选择测试集较小的模型?
- 测试集是代表未来数据,不能基于此决定推广能力
- 扭曲了模型推广能力
- 标准配置?标注数据划分为三部分,训练集、开发集(验证集)、测试集
- 训练时监控开发集的错误率!
- 开发集错误率上升时提前终止训练,即早停止策略,避免过拟合
- 用测试集错误率衡量模型的推广能力
- 分配比例?没有标准,不过训练集最好大一些
-
线性模型总是好的模型吗?
- 经典XOR问题,无法使用线性模型分类
- 模型表达能力不够:高训练集错误率,高测试集错误率,欠拟合现象!
- 模型容量:模型拟合复杂关系的能力。
- 非线性模型的容量高于线性模型
- 非线性覆盖了线性,理论上也能学到线性特征
- 可以学到非线性关系
- 正如参数多、特征多模型容量高于少的
- 我们应该追求高容量吗?
- 四个参数可以描绘出大象,五个参数可以使得大象甩鼻子
- 模型容量过小,欠拟合现象
- 模型容量过大,过拟合现象
- 更容易学到训练集的特征
- 低训练集错误率,高测试集错误率
- 现在大模型?容量大数据量大,相辅相成
-
奥卡姆剃刀原则
- 吝啬原则
- 如无必要,勿增实体
- 两个模型在训练集上都很好,选择简单的模型
- 可以很好地避免过拟合现象
-
控制模型的复杂度?正则化
- 两个目标:
- 求解参数,尽量让损失最小
- 求解参数,尽量让模型简单
- 加入正则项表达偏好,多关注某方面
- 优化目标:两者和更小,\(\lambda\) 控制复杂度的重要性比重
L1和L2正则,绝对值、平方和- 还有很多其他正则技术
L1正则稀疏化,相当于缩减了特征的数量,故而模型容量下降L2正则稀疏化,过小和过大的影响太大,削减这些特征
- 两个目标:
-
常见的损失函数有哪些?
- 损失函数需要是参数的连续函数
- 铰链损失(Hinge Loss)
- 二分类:要求提高了,
>1才行,\(max\{0, 1 - y * f(x)\}\) - 多分类:预测为正确标签的概率应该比其他标签大
- 鼓励最中立的分类
- 二分类:要求提高了,
- 交叉熵损失
- 可以衡量两个概率分布的相似程度
- 例:
- 真实分布:one-hot的概率分布
- 预测分布
- 让上述两个分布足够接近,即去算交叉熵
- 背后动机:调整参数使预测分布逼近真实分布
- 交叉熵损失只适用于概率型模型(模型输出是概率分布)
- 也称为负对数似然损失
-
梯度下降的效率:从梯度下降到随机梯度下降
- 梯度下降消耗大
- 随机梯度下降:偷懒的方法,例如100w个中随机挑100个,以此代表全部,每次都随机挑100个更新
- 梯度是训练集中例子损失梯度的期望
- 用样本的梯度平均值近似估算训练集梯度期望
- 每次更新无需逐个例子计算梯度,提高了效率
-
自然语言处理中有哪些类型的机器学习?
- 对自然语言处理而言,大多数任务都没有明确的算法解,需要使用机器学习方法。
- 常用任务类型:
- 分类任务、序列标注任务、结构预测任务、序列转写任务
- 序列标注任务
- 输入对象和输出对象都是序列,长度相等
- 例如汉语分词、词类标注
-
结构预测任务
- 输出例如是树
- 例如句法分析,输入是句子,输出是句子的句法结构
-
序列转写模式
- 输入对象是序列,输出对象也是序列,但长度不相等
- 机器翻译、文本摘要……
- 没有免费的午餐
- 不追求所有任务上都表现最好的绝对最好方法
- 针对具体任务,寻求表现优异的方法
n元模型
- 语言建模
- 统计角度看,可以由任何词串组成,该概率不同
- 语言是种概率分布?可能性的问题,不存在对错?
- \(P(s_1) > P(s_2)\)
- 利用给定语言样本(语料库)估计\(P(s)\)的过程称作语言建模。
- 语言模型给句子赋以概率。
- 把数学方法引入符号系统。
-
语言模型
- 语音识别、汉语分词、机器翻译、语言生成
- 例如可以将识别出的多个语音句子算不同的概率,给出最终概率最高的是最可能的结果。
- 机器翻译一般由一个翻译模型一个语言模型组成,语言模型负责筛选。
-
如何统计句子的概率?
- 统计语料库中句子s出现的次数,不太行,比较长的句子可能根本找不到
- 应用链式规则,分解计算\(P(s)\)
-
马尔可夫假设
- \(w_i\)的出现只和之前的
n-1个词有关。不看前面的长串,而是只考虑这n个词组成的片段。 - 相当于在之前的链式规则上做了缩减。
- 一元模型:词袋模型,假定句子中某个词出现概率与其他词都无关
- 二元模型:与前一个词有关
- 三元模型:与前两个词有关
- \(w_i\)的出现只和之前的
-
n元模型的参数是什么?从语料库中学出的这些因子概率
- \(|V|\)、\(|V|^2\)、\(|V|^3\)……
- n越大,模型需要的参数越多,参数数量指数增长。
- 历史信息的作用
- 句子中前面出现的词对后面可能出现的词有很强的预示作用。
- 词的历史信息对其后出现的词有选择限制作用
- 历史信息越多,选择限制越强
-
n的选择
- n较大时,语境具有区别性,但代价大,需要语料库大
- n较小时,不具区别性,但参数个数小、计算代价小
-
如何建立n元模型
- 数据准备
- 确定训练语料
- 对语料进行词例化tokenization或切分
- 句子边界标记,增加两个特殊标记
<bos>和<eos>- 需要
<eos>,否则相加概率不为1
- 需要
- 相对频率法计算条件概率
- 就是数数除法?也是最优化问题?只是藏起来了?最大似然估计
- 原则:选择使得训练样本似然值(概率)最大的参数。
- 该优化问题具有解析解,参数最大似然的估计值就等于参数相对频率估计值
- 数据准备
-
计算句子概率:
- 避免下溢,可采用对数
-
数据稀疏
- 若n元组在语料库中没有出现,则该n元组的概率必定是0
- 最大似然估计法给训练样本中未出现的事件赋0概率
- 由于训练样本不足造成的分布不可靠的问题称为数据稀疏
-
Zipf定律
- 词频和序号之间的关系
-
若某个词w的词频是f,且该词在词频表中序号为r,则
f * r大致为一个常数k,只是一种统计经验 -
语言中只有很少的常用词
- 语言中大部分词都是低频词
-
词的分布是长尾分布,n元组的分布亦是如此
-
语料库扩大,主要是高频词例的增长,不能从根本上解决稀疏问题
-
数据稀疏解决方法?
- 解决方法?平滑,引入二次分配
- 把训练样本中出现的事件的概率适当减少,将多出的概率质量分布给未出现的。
- 也称为减值法
-
加法平滑
- 最简单?
- 不同的减值策略 -> 不同的平滑方法
- 加1平滑,规定n元组比真实出现次数多一次
- 没有出现过的n元组概率不再是0,而是一个很小的概率值,实现了概率质量的重新分配
- 矫枉过正?给没有出现过的n元组分配了太多概率(次数)
- 改进,加\(\delta\),在0-1之间,而不是加1
-
平均分配
- 留一部分概率给那些没有出现的进行平均分配
- 改进?组合平滑方法,抛弃平均
-
组合平滑
- 分配方法:回退策略和插值策略
- 回退策略:只有D、E参与分配,回退到一元模型,看在一元模型中出现的概率进行再分配
- 插值策略:A、B、C、D、E都参与再次分配,补偿一些
-
绝对减值法
-
如何折减?对出现过的进行折减绝对频次,\(\delta\)在0-1之间,否则原本出现1次的剪成负的了。
-
将折扣出的概率质量根据低阶模型分配
- 如何选择\(\delta\)
- 选择0.75
- 对出现次数更多的减少更大
- 或者计算公式
-
-
KN平滑引导
- e人i人?e词i词?
- 低阶模型决定概率重分配的权重,合理的低阶模型很重要
- KN是对绝对减值的改进,修改了低阶模型的定义
- 按照低阶模型分配不一定好,
p(w)大,但不一定愿意跟在H后面,而我们的目标其实是找到最愿意跟在H后的词。 - 衡量出现在陌生环境中的能力?e词就多分配一些概率,根据前驱词的总数来评估
-
熵:如何评价语言模型好坏?不依赖于应用的评价方法?
- 衡量一个随机变量的不确定性
- \(H(X) = - Σ [ P(x) × log_a(P(x)) ]\)
- 通常a取2,此时熵的单位为比特
- 等概率不确定性最大?由确定性事件转向不确定性事件,熵增
- 熵的基本性质
- \(H(X)>=0\),等号表明确定场(无随机性)的熵最小。
- \(H(X)<=log|X|\),等号表明等概场的熵最大。
- 概率越小的事件蕴含越大的信息量
- 人咬狗 vs. 狗咬人
- 熵描述了随机变量的平均信息量
- 霍夫曼编码?
-
联合熵和条件熵
-
相对熵
- \(D_KL(P || Q) = Σ [ P(x) × log(P(x)) ] - Σ [ P(x) × log(Q(x)) ]\)
- 统计手段近似的和真实分布,减完以后得到的增加的熵
- 描述同一个随机变量的不同分布的差异程度
- 描述了错用分布密度而增加的信息量
-
交叉熵
- 上面公式相对熵的存在常数,将非常数部分抽取出即为交叉熵
- 因此可以直接使用交叉熵比较两个模型对于真实数据的模拟好坏
- 语言模型的评价——交叉熵
- 交叉熵越小,语言模型质量越好
- 虽然我们无法获知\(P(x)\),但我们可以使用测试语料进行估算。
-
困惑度
- 交叉熵小,困惑度就小
- 只是增加的幅度更大,显得改进显著
- 物理意义?根据n元模型,正确采样\(w_i\)的平均(几何平均)采样次数
- 猜对次数的平均,一个个词往后猜。
- 语言模型更准确,自然猜的就会少,困惑度低。
隐马尔科夫模型和词类标注
- 词类标注是什么
- 判断每个词的词类并给予标记的过程。
-
词类的划分标准
- 形态标准
- 词缀?带词缀方面相似,可以将其划分为一类。
- 分布标准
- 词的位置以及周边出现的词也有一定共性,可以将其划分为一类。
- 大模型?
- 意义标准(×)
- 划分为名词、动词是为了研究句子结构?而不是为了句子意义。
- 形态标准
-
英语中词的分类
- 名词、动词……
- closed:介词、连词…… open:动词、名词……
- 虚词和实词:虚词用以组装实词
-
汉语中词的分类
- 汉语的分类依据
- 缺乏形态,形态特征不能用作分类依据。
- 词的分类特征,或者该词的语法特征。
- 多种流派
- 词无定类?
- 汉语的分类依据
-
做词类划分必须有词类标注集
- 一般不使用之前的词类划分,因为类太少,是面向人类的。
- 使用的一般是类别很多的标注集,更严格地遵循了特征和分布的划分。
- 得考虑到真实文本中可能出现的各种词,例如列表标记、专有名词、专有名词复数、美元符号……
- 汉语词类标记集:成语、语素?
- 考察?一次考察?
- 词无定类:既可以做动词也可以做名词
- 词有定类:必须作为动词
- 作动词还是名词?名动词
- 工程角度需要兼顾不同的体系?
- 兼类问题
- 同一个词具有不同词类的语法功能,则认为属于不同的类,称为兼类
- 英文40%的词是兼类词?
- 词类自动标注
- 难点所在就是标注兼类词
- 标注的方法:
- 早期:基于规则的词类标注
- 基于统计的词类标注
- 基于隐马尔可夫模型
- 基于条件随机场
- 基于深度学习
-
隐马尔科夫模型 Hidden
- 马尔科夫模型的一种拓展
- 马尔科夫模型与上一讲概念相同,只是将词拓展到状态
- 状态与输出是一对一的关系
- 根据观察到的输出序列可以唯一确定状态转换序列
-
坛子与小球?
- N个坛子,每个里面M个小球,每个坛子中小球颜色概率分布不同
- 小精灵随机选择坛子、随机选择小球,每次放回
- 以当前坛子为条件选择下一个坛子?
- 房门将选择的过程藏起来了?
- 概念:
- 令坛子对应状态,令小球的颜色对应状态的输出
- 可用一阶马尔可夫过程描述选择坛子的过程
- 状态与输出之间不是一一对应的关系
- 给定一个观察序列,不能直接确定状态转移序列
- 双重随机过程,选坛子和选小球,前者不能直接观察,后者可以由输出观察到
- 隐马尔可夫模型是生成模型
- 解决不同问题的状态是不同的,找到了状态和观察序列可将其转为隐马尔可夫模型
- 例如可以将类别看作状态坛子,我们并不可见。
- 每个词类中的词作为小球
- 最终输出我们可见的语言序列
- 抛掷硬币
- 问题一:观察到下列抛掷结果的概率如何计算?
- 问题二:给定一个观察序列,最可能的选择序列是什么?
- 问题三:模型参数未知时如何根据观察序列估计?
- 依据采用最大似然估计?
-
问题一:
- 抛硬币:一共3 _ 3 _ 3 * 3 = 81种抛掷方法(状态转移路径)
- 是某个选择转移路径的概率是多少,典型的一阶马尔可夫模型过程
- 该路径能得到对应输出序列的概率
- 每种情况概率相加即可
- 问题?
- 似乎可以通过穷举来解决?事实上并不现实
- 计算数量级太大了
- 向前算法:动态规划的思路解决?
- 向前变量\(\alpha_t(i)\),表示时刻\(t\),处在状态\(i\)的概率。
- 后一时刻的向前变量都可以用前一时刻的的向前变量的基础上表示出来。
- 向前算法:初始化、迭代、终止
- 向后算法?
- 与向前算法对称?(×)
- 为啥要定义一个向后算法?解决第三个问题时需要使用。
- 向后变量\(\beta_t(i)\),定义时不包括当前时刻
- 计算的最后还要将当前时刻的概率考虑在内
-
问题二:求解最佳状态转换序列
- 计算能够最好解释观察序列的状态转移序列。
- 直接找第一个问题概率最大的那一个,求和问题变为求最大值问题
- 还是需要更为高效的方法。还是根据动态规划——维特比算法
- 贪心?每次选取最大概率的选择?
t时刻终止于状态i的最佳路径。 - 维特比变量\(\sigma_t(i)\),观察到输出序列的最佳状态转换序列的概率。
- 下一时刻从上一时刻到达各个状态的最好状态转移中选取到达当前时刻状态的的最佳转移路径。
- 词类标注使用的其实就是维特比算法?
- 贪心?每次选取最大概率的选择?
-
问题三:模型参数未知或不准确,如何根据观察序列求得模型参数或调整模型参数
- 最大似然估计原则?
- 有指导的参数学习
- 状态是隐变量看不到怎么办?
- 那就看到!如果给定观察序列的同时,也给定了状态转换序列,可通过有指导方法学习模型参数
- 统计方法解决问题
- 缺点:状态信息未知时无法使用,或者需要人工标注状态信息,代价高
- 无指导的参数学习
- 仅仅给定观察序列
- 无指导学习方法,没有解析方法
- 迭代解
- 期望?平均次数?\(i -> j\)在状态转移路径上出现次数的期望
- 利用期望频次代替频次进行计算?
- Baum-Welch算法
- 一种EM算法
- E-step:依赖当前参数计算,数学期望
- M-step:根据上一步估计模型参数
- 终止条件:前后两次误差\(log\)在一个很小的范围内
-
基于隐马尔可夫模型的词类标记
- 第二类问题,求解最可能的状态转移序列,维特比算法
-
未登录词
- 视为兼类词,可能是任何一个词类
- 依照出现一次的词的规律处理
- 更可能是名词
- 将出现一次的词的分布平均为未登录词
- 英文等语言可利用形态特征、拼写特性进行判定