自然语言处理
机器学习
- 学习一个函数来通过输入得到输出
判别垃圾邮件
- 对于数据打标签
-
特征工程:选择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\)在一个很小的范围内
-
基于隐马尔可夫模型的词类标记
- 第二类问题,求解最可能的状态转移序列,维特比算法
-
未登录词
- 视为兼类词,可能是任何一个词类
- 依照出现一次的词的规律处理
- 更可能是名词
- 将出现一次的词的分布平均为未登录词
- 英文等语言可利用形态特征、拼写特性进行判定
-
最大熵如何由分类扩展到序列标注问题?子序列,彼此独立?都是通过线性模型引入一个概念便于理解?
- 最大熵原则:符合先验知识分布中选择最不确定的分布,也就是最均匀的分布,此分布风险最小,其他分布其实会引入其他先验知识。
- 基于最大熵原则构建的统计模型称为最大熵模型。
- 针对实际问题,一般并不存在解析方法
- 最大熵分布需要满足熵最大且服从样本中已知的知识
- 最大熵方法中的特征表示
- 利用特征表示和提取样本中的已知信息。
- 刻画x和y之间的某种共现关系
- 特征在样本中出现的期望,通过经验分布刻画整体,独立同分布?
- 按照构造的模型计算出的预测情况应该与在训练语料中一致
- 语料中真实数出的期望 = 模型的期望
- 模型分布需要符合样本中的统计证据
- 共有k个特征,则需要满足k个约束
- 这为啥不会什么所谓的过拟合?
- 最大熵更自由?觉得哪个特征重要就可以将哪个约束条件加入模型
- 求解最大熵模型
- 约束最优化问题
- 拉格朗日乘数法
- 变分法求解p(x,y)?
- 对数线性模型?
- 条件最大熵模型
- 上面我们看的都是x和y的联合分布,但实际上更多情况是看条件分布,计算x条件下y的概率
- 最大化条件熵公式中还是有联合分布,如何解决?
- 近似?p(x, y) = p(x) * p(y|x),可以直接数出x,由此通过统计量代替
- 最大熵方法的模型训练
- 采用数值最优化算法,设定优化目标
- 样本熵值最大化
- 样本似然值最大化
- 二者训练结果一致
- 最大熵方法的优点
- 只需针对具体任务,集中精力选择特征
- 特征选择灵活,特征之间无需独立???
- 特征的类型和数量都可以随时调整
- 效果不好可以解释是哪个特征不好
- 深度学习可解释性不强就是特征太过抽象了
- 无需专门考虑平滑问题
- 特征选择
- 存在很多偶然特征,可能导致过拟合
- 截止频率:要求特征在样本中出现频率大于截止频率
- 特征选择算法
- 总的原则:好的特征会使得最大似然增大
- 词类标注中最大熵方法的应用
- 词类标注是一个分类问题,理论上可以考虑整个句子推算某个词的类别,但一般使用窗口的思想
- 前面几个词、当前词、后几个词、前几个词的词类,上述都可以划分到一个特征中去建模
- 最大熵原则:符合先验知识分布中选择最不确定的分布,也就是最均匀的分布,此分布风险最小,其他分布其实会引入其他先验知识。
图模型
- 条件随机场模型是图模型
- 用图描述随机变量及其关系
- 有向图模型:贝叶斯网
- 无向图模型:随机场
- 隐马尔科模型是有向图模型?
- 团:无向图的全联通子图
- 极大团:不能被其他团所包含的团
- 有向图和无向图模型对比
- 共同之处
- 将联合分布分解为多个因子
- 不同之处
- 有向图模型:因子是概率分布,无需全局归一
- 无向图模型:因子是势函数,需要全局归一
- 优缺点
- 无向图势函数设计不受概率分布约束,设计灵活,但全局归一代价高
- 共同之处
- 条件随机场模型
- 增加作为条件的观察变量
- 指数势函数
- 如何联系条件随机场和最大熵?以团为单位?
- 导引角度,线性模型
- 无向图角度
- 最大熵角度
- 解码?动态规划?维特比变量?
依存句法分析介绍
- 语法理论概要
- 短语结构语法,描写句子成分之间的组成关系
- 依存语法,描写句中词和词之间的依存关系
- 面向短语结构语法的句法分析方法
- 基于上下文无关语法(CFG)的句法分析方法
- 依存关系
- 句子中词和词存在一种从属和中心的关系
- 处于中心地位的词,称为中心词,从属词依存于中心词
- 依存关系是一种二元非对称关系,可进一步分为多种类型,如修饰关系、动宾关系
- 句子的依存结构
- 依存图、依存树
- 依存弧可以表示为三元组,依存树可以表示为三元组的集合
- 投影性
- 沿着投影弧可到达的
- 投影依存树
- 依存语法
- 依存语法是一种词语法
- 依存结构中没有短语的概念
- 依存结构比短语结构简练
- 通常认为依存语法更适合描述语序自由的语言
- 语言中大部分结构是投影结构
- 语序自由的语言中含有较多的非投影结构
- 汉语、英语中非投影结构比较少
- 句法歧义
- 依存句法分析
- 分析得到依存句法树
- 主要方法:
- 基于图
- 基于转移
- 模型:寻找得分最高的依存树
- 基于图的依存分析
- 如何建立评分模型?如何搜索得分最高的依存树?
- 主要思想:将依存树分解为子图,子图独立评分,依存树得分定义为子图得分之和。
- 弧分解模型
- 如何定义子图
- 最简单的是弧分解模型
- 弧分解,一阶模型
- 子图定义为依存边,依存树分解为依存边的集合
- 实际上边与边之间不可能毫无关联,但阶数过高复杂度太高了
- 依存边的得分定义为特征向量和权重向量的乘积
- 可以对依存边设计提取特征
- 参数学习
- 结构化参数学习基本思想
- 迭代训练
- 给定句子x及其标准依存树
- 根据当前参数计算得分最高的依存树y'
- 增加出现在y中但未出现在y'中的特征对应的权重
- 降低出现在y'中但未出现在y中的
- 结构化参数学习基本思想
- Eisner算法
- 自底向上的分析算法
- 基于表的分析算法,是动态规划算法
- 单元格中存放的是句子片段对应的最优依存树片段span
- 整个span中心词必须是片段的边界
- span内部的词不存在与span外部词的依存连接,投影性
- 分为两种类型:
- complete span:除了span的中心词,其他词都已经完成分析
- incomplete span:除了span两端的词,span中的其他词都已经完成分析
- 算法基本操作可以结合图形化的想法直观的感受
- span的表示是一个四元组
- 自底向上填表,依次增加处理的span的长度
- 该算法只能生成投影依存树
- 时间复杂度为3阶
- 分析算法
- 最大生成树算法
- 基于转移的依存分析
- 短语结构句法分析中,常采用移入-归纳策略进行
自然语言处理中的文本例化
- 文本例化概要
- 自然语言是通过形式表达意义的系统
- 是由有限基本单位(词汇)组成的符号串
- 基本单位组成的集合叫做词汇表
- 文本是由词汇表中基本单位组成的符号串
- 基本单位承载基本意义
- 文本例化
- 把符号串形式的文本切分为基本组成单位的过程
- 切分所得到的基本单位就是token
- 基本单位的选择
- 词、子词、字符
- 汉语自动切分
- 基于词表的方法
- 规则驱动、数据驱动
- 正向最大匹配法、逆向最大匹配法
- 字序列标记方法
- 无需词表
- 基于词表的方法
- 汉语切分的关键问题
- 切分歧义消解
- 未登录词识别
- 切分歧义类型
- 交集型歧义,AJ/B和A/JB切分
- 交集字段的个数,称为链长
- 组合型歧义AB、A/B两种切分
- 真歧义
- 歧义字段在不同语境中确有多种切分方式
- 伪歧义
- 单独看有歧义,但在真实语境中只有一种切分方法
- 交集型歧义,AJ/B和A/JB切分
- 歧义的发现
- 歧义消解的前提是发现歧义
- MM和RMM都不能发现歧义
- 双向最大匹配可以发现歧义
- 但不能发现所有歧义:
- 不能发现组合型歧义(长词优先)
- 发现组合型歧义
- MM+逆向最小匹配法
- 发现所有切分歧义
- 全切分算法
- 数据结构
- 歧义切分的表示——词图
- 歧义消解
- 基于记忆的伪歧义消解————查表
- 基于规则的歧义消解
- 依据上下文词性指定一系列规则
- 基于统计的歧义消解
- 统计意义上的最佳路径
- 打分选择问题,可以选用概率连乘的策略
- 未登录词
- 训练语料或词表不可能收全所有的词
- 无论中文、英文都有未登录词问题
- 工程上解决方法,引入特殊词例
- 自动切分评价指标
- 准确率、召回率、F-值
- 基于子词的文本例化
- 把文本切分为比词小的单位——子词
- 收集所有子词并习得意义表示
- 词是由语素构成的
- un-happy-ness
- 习得语素的意义推断词的意义
- 实际效果并不好
- 基于训练语料自动提取子词词表
- 子词可能是任意字符组合
- 不要求具有语言学意义
- 子词长度灵活
- 常用词例化为词,利于准确习得意义
- 生僻词分解为子词,利于推断未登录词的意义
- 子词词表的大小可以灵活控制
- BPE子词例化
- 每次合并频率最高的两个子词,并尝试更新词表
- 对于给定文本,可以:
- 顺序执行所习得的合并操作?
- 基于子词词表使用正向最大匹配法
- 确定性切分,只有一种切分结果
- WordPiece子词例化
- BPE选择频率最高的二元子词串合并,WordPiece采用最大似然原则选择合并的子串
- 和BPE相比,运算复杂度较高
- Unigram LM子词例化
- 上述两种子词例化的结果都是确定性的
- 给定子词词表,对给定文本实际存在多种切分可能
- 基于unigram模型,计算概率最大的切分形式
- EM算法计算子词概率?
- 采用删除法构建词表
- 子词删除原则
- 删除后导致训练语料似然值损失较小
- 效果上会删除低频子词
- SentencePiece
- BPE、wordpiece等无法做到语种无关
- 目标是语种无关的子词切分
深度学习基础导引
- 发展概要
- 1943,M&P Model出现还在计算机出现之前
- 1957,感知机模型及算法
- 1969,指出感知机关键缺陷,XOR问题
- 1970s,低潮
- 1980s,复苏,BP算法被关注和应用
- 1990s,低潮
- 2006,神经网络方法重新崛起,一种逐层预训练方法?更名为Deep Learning
- 2012,AlexNet取胜
- 特点
- 非线性学习
- 端到端建模
- 分布式特征表示,one-hot到稠密表示
- 多层表示学习
- 非线性学习
- 神经网络模型y = NN(x)
- 其中,x是输入向量,y是任务相关的输出向量
- 非线性、更强的表达能力,区别于向量机和最大熵
- 表达能力强不等于成功
- 存在未必一定找得到
- 不能保证学到最优的参数(局部最优)
- 端到端建模
- 经典机器学习,需要特征工程,将输入转换为特征向量
- 深度学习中,可以无需特征工程,模型从任务输入到任务输出的映射
- 分布式特征表示
- 经典机器学习:One-hot向量表示
- 高维、稀疏
- 特征和特征之间相互独立正交,w+1是ship和boat没有任何关系
- 深度学习:分布式,向量表示
- 特征表示为低维、稠密向量
- 特征被嵌入d维向量空间,d远远小于向量空间
- 分量不只是0和1,是一个任意实数
- 类似的特征拥有类似的向量表示
- 稠密表示拥有更好的推广能力
- 特征表示被称为word embedding或者feature embedding
- 表示学习、自学习
- 经典机器学习:One-hot向量表示
- 多层表示学习
- 深度学习模型中,对输入数据的特征表示是分层的,每层对应x的一种表示
- 高层特征表示经由底层表示自动习得
- 底层特征对应局部、具体的特征,高层对应全局、抽象特征
- 大量使用预训练技术(自指导学习)
- 深度学习体现为特征表示的层次性
- 自然语言处理的深度学习
- 输入层、表示层、输出层
- 词的向量表示
- 输入层就是查表?一开始随机初始化渐渐收敛到有意义的表示
- 词类、位置等其他特征均可以同样的方式向量化
- 特征综合:拼接、想加(维度可以控制)
前馈神经网络
- 人工神经元
- 神经网络的基本计算单位:神经元
- 特征向量、特征权重、求和加偏置、激活函数
- 就类似于感知机模型?输出大于0表示正值
- 最经典简单的激活函数就是啥也不做
- 无激活函数,线性模型
- sigmoid激活函数,即S型函数,值域在0、1之间
- 前馈神经网络FFN
- 多个神经元逐层互联
- 全连接:每个神经元都与下一层所有神经元有连接
- 网络结构:输入层、隐藏层(n>=0)、输出层
- 隐藏层为0退化
- 又称多层感知机
- 线上的权重和神经元中的偏置是我们需要学习的
- 即权重矩阵和偏置
- 学习输入对象的多层表示
- 激活函数为模型引入了非线性描述能力,否则加多少层都可以用一层表示
- 激活函数有多种选择
- sigmoid函数,0到1
- tanh函数,-1到1
- ReLu函数,分段函数
- 激活函数选定:ReLU > tanh > sigmoid
- 深层网络复合函数如何求梯度?
- BP算法
- 神经网络训练——梯度下降
- 神经网络是复合函数,如何计算梯度?
- 复合函数求导的链式法则
- 深层神经网络的关键问题:梯度消失
- sigmoid函数梯度最大值为0.25,tanh最大值为1,都会使得回传时参数更新缓慢甚至梯度消失
- 自动梯度计算
- 基于计算图的BP算法
卷积神经网络
- 稀疏连接,模仿人类视网膜感受范围?
- 输出单元只和有限个输入单元连接
- 卷积窗口大小k,kernel size,感受野
- 参数共享,w称为filter,只有一组k条边的参数,每组做卷积运算
- 定义多filter感受不同特征?实际w还是一个矩阵,每一行感受一个特征
- 窄卷积和宽卷积
- 输入层两侧填充k-1个0,形成宽卷积
- 不填充,形成窄卷积
- 卷积层可以堆叠
- 参数共享,不同窗口捕获相同模式,同质特征
- 最大池化
- 每一列最大值作为最终结果?
循环神经网络
- 天然适合表示序列?
- 压缩前文信息,天然具备位置信息,不同顺序融合出的结果不同
- 也可用来做序列标注问题
- 串接两个RNN模型来做翻译模型?
- 一个用作encoder,一个用作decoder
- 其实也可用作结构预测,输出处理转换成序列即可
- 双向循环神经网络
- 双向信息,两个历史信息隐状态,左侧和右侧
- 基本看到的循环神经网络都是双向?
- 多层循环神经网络
- 堆叠
- 就是前馈神经网络的序列化?
- 缺陷:梯度消失/爆炸
- 同一个w,会越乘越小或者越大?
- 解决方法?将相乘变为相加,LSTM
- LSTM长短时
- memory向量
- memory cell
- 如果永远累加,信息不断增加,但是我们有时希望忘掉某些之前信息或者当前信息不重要
- Ct对Ct-1的梯度永远为1,因此梯度不会消失
- 门机制,也是向量
- 遗忘门,设为1的可以通过,不过一般不会只设为0和1,密集的数字,控制某些纬度信息通过的量的多少
- 输入门,决定当前信息加还是不加
- 输出门,我们关注的是最终的隐状态,加个门决定最终输出什么
- GRU
- 合并后了遗忘门和输入门?
- 添加了一个reset门?
- LSTM、GRU缓解了梯度消失问题,是比较常用的循环神经网络模型
- CV领域用卷积多,NLP用循环多,前馈是都需要使用到的,很多时候需要拼接多个网络
- 如何设计合理的网络架构?
- 架构工程
预训练词向量回顾
- 输入层:
- 查表,转化为词向量,一开始都是随机初始化的
- 学习完以后,词向量会代表某些意义
- 未登录词不会被学习和更新向量?
- 分词向量作为向量学习的起点?
- 分词向量也有未登录词,如何找到一个学好的作为起点?
- 词的表示
- one-hot表示
- 稀疏、高维、正交
- 不能有效表示词和词的句法语义共性
- 桌子和椅子正交
- 分布式表示
- 低维的语义表示空间
- 词的嵌入表示——词向量
- one-hot表示
- 词向量的习得
- 词义相似性常常反映为分布相似性
- 词的分布假设,根据词的分布规律学习词的表示
- 知道词的环境知道词的意思
- 语义相近的词所处的语境相近
- 基于词的分布特征自动习得词向量
- 大规模未标注语料库
- 分布相似性
- 木头桌子✓
- 木头椅子✓
- 木头苹果×
- 木头学习×
- 一把椅子✓
- 一张桌子✓
- 一个苹果✓
- 一个学习×
- 学的其实不是意义,更多学习的是语境
- 预测式词向量学习模型
- 给定上下文语境预测目标词
- 左侧语境、右侧语境、语境窗口宽度l
- 类似于一个填空任务
- 他坐在 ___ 上看书
- 椅子?桌子?苹果?学习?
- '坐'的上下文中可以有'椅子'
- '坐'的向量表示应该体现出这一点
- 预测式模型
- 目标函数——平均对数似然函数
- 最大似然估计:寻求能使目标函数最大的
- 目标是最终的lookup table
- 类似于建立一个分类模型
- 理论上词表多少维度,输出多少维度
- 其实输出的向量某种意义上也能看出一种词向量,有概率大和概率小的数字
- 计算代价昂贵,无法针对大词表生成词向量
- 如何改进?从目标词预测模型转变为语言片段打分模型
- 学习区分正确的语言片段和错误的语言片段
- 负例生成?将目标词在原来文本中替换为其他词
- 输出为1个分值,将先前庞大的矩阵转化为了一个向量
- Collobert & Weston模型
- CBOW 模型
- 预测模型
- 取消了隐藏层
- 输入层为语境词向量表示求和
- word2vec?
- continue 词袋
- 词向量从拼接改为了相加,语境词序无影响,词袋模型
- 一定程度上退化
- SkipGram
- 反其道行之?给定目标词预测语境中的词
- U每一行实际上也是词向量,表示一种语境和语义关系,输入层词向量和U的词向量
- softmax代价还是很大
- 负采样训练
- 基于整个词表归一,softmax归一代价大
- Negative sampling
- 给定目标词w
- 源自训练数据的样本(w, c)正例
- 随机生成负样本负例
- 二分类:判断是否源自训练数据
- 负例生成
- 排除高频词
- 拉平概率分布,使得都有概率被采样
- 矩阵分解式词向量学习模型
- 共现矩阵M?例如统计次数反映目标词和语境词,共现次数
- 一般为方阵|V| * |V|
- 使用共现次数的话,虚词出现次数太多
- 分布方差巨大,高频词影响评估
- 矩阵分解的动机
- 寻求如下矩阵分解W乘C转置约等于M
- 分解使得词向量压缩表示了词的语义信息
- GloVe
- 回归问题?
- 权重函数?
- 过滤无意义的语境,提升低频次语境权重,抑制极大频次语境权重
- 词向量评价
- 预测具有同样类比关系的词,计算准确率
- 看能否通过词向量计算找出具有相同类比关系的词
- 把词和词之间的关系表达为向量差,应该是≈关系
- 计算两个词的语义相似度(相关度)
- 依据相似度排序,计算与标准(人工)排序的相关性
- 实际不是相似度,而是反映一种相关度
注意力和Transformer
- 注意力机制
- 依据不同处理状态,动态融合信息的神经网络机制
- 注意力机制的包装?K、Q、V
- 将融合看成了一种检索、软查询,模糊匹配
- 计算q和k的匹配度,每个v都要参与贡献,匹配度大则贡献大,加权组合v,产生一个融合向量
- 注意力?类比观察一张图片,任务不同,关注的重点不同
- 如何计算关注度?
- 点积式关注度
- 向量维度扩大时,值越来越大,softmax集中在两侧饱和区?
- 梯度过小,可能出现梯度消失
- 我们希望值尽量落在线性区
- 加法式关注度
- 单隐层神经网络
- 引入了额外参数
- 乘法式关注度
- 也引入了额外参数
- 时间复杂度会增大
- 缩放点积式关注度
- 除以维度的开根
- 减缓梯度消失
- 把值往回拉一拉
- 点积式关注度
- 注意力机制
- 自注意力机制(self-attention)
- 单一序列,单独用于编码器或解码器端
- 用于融合语境信息生成语境敏感的语言表示
- 一般而言,建模单一序列元素之间的依赖关系
- 一般(交叉)注意力机制(attention)
- 两个序列,同时用于编码器端和解码器端
- 翻译任务?
- 解码器端状态向量作为query向量,编码器端向量作为key向量和value向量
- 动态确定编码器端信息对于解码决策的不同影响
- 两者之间的依赖关系
- 注意是后面的解码器查询完整的编码器序列
- 自注意力机制(self-attention)
- 残差连接
- 神经网络是在拟合F(x)
- 通过对残差建模拟合函数
- 残差:R(x) = F(x) - x
- 学出了残差其实就是学出了F(x),变换一下F(x) = R(x) + x
- 加了个跨层连接(恒等映射)
- 本质是为了缓解梯度消失,都是把乘法变成加法计算,LSTM那一节的?
- 假设:深层网络可以通过恒等映射到浅层网络,例如加一层f(x)=x,但事实并非如此,很难不损失
- 问题:增加网络深度并不总能改进拟合精度
- 增加一条直通链路,有助于进行恒等映射
- 缓解梯度消失问题,有助于建立深层网络
- 很多成功应用:ResNet、Transformer
- Layer Normalization
- 输入隐层向量
- 计算均值
- 计算方差
- 向量归一化,分母加个值防止为0
- 缩放平移,每一个维度的处理参数还不一样
- 输出 y = LayerNorm(x)
- 两个视角看待?
- 单层网络输入不变,深层网络每层的输入依赖于前一层的输出,越深的层学的越辛苦,每次都得动态适应前层的变化
- 刚学好了x'的分布,结果输入又变成服从x''的分布,难绷,收敛速度慢
- 如何破局?尽量让分布稳定,进行归一化,学习起来容易
- 带来后果?强行归一化,其实降低了模型容量和复杂度,所以进行一个“逆变换”,要是真要学不稳定的分布就学
- 同样的,经过多层,也会落在饱和区,进行该操作也可以拉回线性区
- Transformer
- 提出动机?
- 回顾循环神经网络
- 时刻t的隐向量h_t是输入的函数,融合了左边的语境信息
- 双向神经网络可以融合左右两边的语境信息
- 很棒的工作
- 循环神经网络的局限性
- 线性,由于梯度消失问题,长距离依赖关系建模存在困难
- 建模x_i和x_i+t需要t步梯度计算
- 主要问题:无法并行计算,token x_i隐状态计算必须先于x_i+1
- 提出动机?
- Transformer
- 编码器-解码器结构
- 编码器、解码器类似但是有差异,均为多层结构
- NLP领域事实上的标准架构
- 编码器、解码器也可以独立使用BERT和GPT
- 编码器
- 多层结构,可由N层组成,堆叠
- 单层组成
- 多头注意力子层
- 前馈神经网络子层
- 子层内部设有残差连接
- 对子层输出应用Layer Normalization
- 多头自注意力子层
- 多头机制:多角度并行生成多组注意力向量
- 多组学习到的W_Q、W_K、W_V权重矩阵
- h组产生了对于x向量的h组不同关注表示,将其拼接起来
- 简单拼接就变成hd维,会膨胀,由于是堆叠多层,故而需要降维融合需要一个融合矩阵
- 前馈神经网络
- 关注向量是线性组合,堆叠多少层都是线性
- 前馈神经网络就是为了引入非线性
- 位置编码
- 自注意力机制丢失了序列顺序信息,是词袋模型
- 引入位置向量p_i,x_i = t_i + p_i
- 如果p_i是训练得到的?缺乏外推能力,训练句子长度不一,测试集中可能出现长句子。
- 直接通过计算得到,而不用训练,每个维度的值通过三角函数计算得到。
- 优美?任何两个位置的内积只和两者间隔即相对距离相关。
- 无需训练,具有外推能力。
- 解码器
- 多层结构,可由N层组成
- 单层组成
- 多头遮蔽自注意力子层
- 多头交叉注意力子层
- 前馈神经网子层
- 子层内部残差连接
- 子层输出LM
- 以自注意力方式关注Y_<i
- 以一般注意力方式关注X
- 多头遮蔽自注意力子层
- 为了并行
- 多头交叉注意力层
- K、V来自于编码器端
- Q来自于解码器端
- 由此融合了编码器端的信息
- weight tying和label smoothing
- weight tying,输入层embedding U,输出层embedding V,令U = V
- label smoothing,标准答案是one-hot分布,使得模型赋予正确类别过大的分数,造成过度拟合,损害推广能力
- 引入soft target分布,给别的词一个机会
- 优点
- 可以并行计算,可以直接计算每个词之间的相关性,残差和LN缓解多层堆叠的梯度消失问题
- 编码器-解码器结构
- Transformer的发展
- 激活函数
- 死亡ReLU问题,改进为平滑版的ReLU,使用GeLU函数
- GEGLU,在GeLU上再加一个线性模块融合,还是缓解梯度消失
- Layer Normalization
- LN位于两个残差模块之间,阻断了跨层信息直通路径
- 改为Pre-LN,将LN放在残差模块内部和子层前段
- 训练更容易,加快收敛速度
- 相对位置编码
- k、v都有相对位置编码变种
- RoPE
- 利用旋转矩阵注入位置信息
- 可以证明q和k内积与输入向量以及m - n 有关
- 注意力机制的稀疏化
- 自注意力机制计算复杂度为平方,需要关注所有token
- 稀疏注意力机制,关注所有token的子集
- 通过传递性关注所有token表示
- 跨步和局部关注交替使用
- 子层并行化
- 标准transformer中,子层计算按照先后串行进行计算
- 进行并行子层?利于加速预训练语言模型和大语言模型预训练语言模型
- 激活函数
预训练语言模型
- 预训练语言模型概要
- 迁移学习
- 利用深度学习建模NLP任务,需要标注数据
- 完成什么任务,标注什么数据,困难、耗时、规模有限
- 回顾人类:能把解决老问题的知识或者经验转移到新问题
- 推到机器:在不同的任务之间进行知识的迁移?富资源任务迁移到贫资源
- 两个阶段:
- 预训练阶段:源任务源数据源任务模型
- 迁移阶段
- 缓解特定任务对标注数据规模的需要
- 自指导学习
- 有指导预训练:还是需要标注数据,先前很多迁移学习都需要
- 自指导预训练:利用无标注数据进行训练,迁移学习兴起
- 存在海量无标注数据
- 并非无指导,还是需要y,先前学习的挖空填词?从语料中可以构建出y
- 需要从未标注数据中提取指导信号,构造自指导任务作为源任务
- 预训练
- 自指导预训练任务
- 自回归语言重构:预测下一个词?
- 降噪自编码任务:MASK掉一部分,让模型恢复出来?感觉有点像SFT?
- 知识迁移
- 迁移架构
- 预训练语言模型 + 目标任务模型结构
- 迁移策略
- 特征提取:预训练模型参数冻结
- 参数精调:预训练模型一并训练
- 迁移架构
- NLP领域中的预训练
- 词向量预训练 lookup table
- 语境敏感向量
- BERT、GPT
- 预训练语言模型
- 搞懂三个部分就能了解一个预训练模型?架构 + 预训练任务 + 如何迁移到目标任务
- 迁移学习
- GPT
- GPT是自回归语言模型
- 构建单向语言模型,(k+1)元的model?理论上循环神经网络可以包含所有历史
- 优化目标:对数似然估计
- 去掉了编码器,由此去掉了交叉注意力子层
- Layer Normalization改用pre-LN
- 输入层和输出层参数共享
- 目标任务输入形式多样,GPT的输入是序列形式
- 结构化输入转换成序列形式,通过添加特殊的token将输入转换为序列形式
- 分类、选择题……服务于特定任务
- BERT
- GPT是单向语言模型
- BERT期望编码双向语境信息,考虑左右两侧
- BERT是降噪自编码语言模型
- 预训练任务1:训练遮蔽语言模型(MLM)
- 类似于完形填空
- 随机15%进行遮蔽,训练模型复原被遮蔽的词例
- 在文本中植入噪音
- 80%置换为MASK,10%替换为其他词例,10%不变
- 预训练任务2:句子接续关系判断(NSP)
- 二分类任务
- 动机是适应以句子对作为输入的目标任务:蕴含关系判断、自然语言推理、问答
- BERT基于编码器
- 输入向量组成:词向量、segment编号、位置编码
- CLS头向量用以判断是上面哪一个预训练任务
- 在目标任务中的应用
- 添加额外任务输出层
- 序列分类任务
- 是通过CLS向量作为整体的表示
- 序列标注任务:基于词例向量
- 提取式阅读理解任务
- 基于词例表示,计算作为答案span开始和结尾的可能性
- 选择合法的得分高的span作为答案
- 多项选择类任务
- 将题干和每个选项拼接成句子对,得到若干句子对
- 将每个句子对输入BERT得到CLS表示
- 基于CLS计算作为正确选择的分值
- 选择分值最高的
- 曾经最为流行的预训练语言模型
- 很多针对性改进
- 去掉NSP预训练任务
- 采用动态遮蔽
- 使用更长的输入序列
- 采用更大的batch size
- 遮蔽连续词
- BART?T5?编码器似乎更能理解,解码器似乎侧重生成,当时两者结合的思路,编码端和解码端不同的预训练任务
- 模型参数规模
- 模型的参数规模越来越大,似乎性能也越来越好?
- 训练数据的规模越来越大,实践中常常基于相同规模的数据训练出不同规模的模型
- 训练模型算力投入也在持续增加
- KM scaling law
- 模型性能较少受到模型结构的影响
- 模型性能主要依赖模型的规模?
- 同时扩大参数规模和数据规模,性能持续提升
- GPT与zero-shot learning
- 不再利用目标任务标注数据进行参数微调
- 将目标任务转写为条件序列生成任务
- 比较模型续写生成positive和negative的概率
- QA任务:计算给定document和question前提下生成每个answer的概率,取其大者作为正确选项
- 指代消解:替换it,分别计算概率
- 模型其实不知道任务是什么,就是看个概率或者预测下一个词
- GPT与task conditioning
- GPT2,通过添加提示明确任务,就有点类似于后面的提示
- 在之前的基础上加了个task
- GPT与few-shot learning
- GPT-3验证了预训练语言模型具备few-shot学习能力
- 模型输入中给定若干示例,模型从输入context中有学习的能力
- GPT
- 随着模型规模的扩大,模型展现出上述能力
- 不需要针对特定任务标注数据进行模型微调
- 预训练语言模型成为通用语言任务模型(AGI)
- 几乎所有任务都转换成条件序列生成任务
- 预训练 + 提示范式
- 提示工程
- 硬提示、软提示
- 提示工程
- 涌现能力
- scaling law的标准是loss
- 实际任务上可能是具体指标,模型规模扩大,性能随机,扩大到一定程度,突然顿悟
- 大模型中的能力涌现,涌现能力无法通过小模型推测