AI遮天传 NLP-词表示
Posted 老师我作业忘带了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AI遮天传 NLP-词表示相关的知识,希望对你有一定的参考价值。
本文重点在第三部分“词嵌入”及对Word2vec的介绍,前面的知识主要用于小白对词表示和一些定义、名称的理解,和对一些方法不足的思考。
一、词表示
1.1 词表示的定义
词表示是一种将自然语言中的词转换为机器可理解含义的过程
其中意思(meaning)的定义 (Webster Dictionary) • The thing one intends to convey especially by language • The logical extension of a word
1.2 词表示的目标
计算词与词的相似度 • WR(Star) ≃ WR(Sun) • WR(Motel) ≃ WR(Hotel)
推测词与词的关系 • WR(China) − WR(Beijing) ≃ WR(Japan) - WR(Tokyo) • WR(Man) ≃ WR(King) − WR(Queen) + WR(Woman) • WR(Swimming) ≃ WR(Walking) − WR(Walk) + WR(Swim)
如何表示词的意思,使得机器可以理解?
1.3 过去的一些词表示方法
1.3.1 使用相关词集合,如同义词或上位词来对一个词进行表示
例如:WordNet是一个包含同义词和上位词的词典
同义词/上位词表示的不足:
丢失语义上的细微差别:(“proficient”, “good”) 只在某些特定的上下文中为同义词
无法获得单词的新含义 :Apple (水果 → IT公司) ,Amazon (森林 → IT公司)
具有一定的主观性
数据稀疏
需要人工标注或更新
1.3.2 One-hot表示
将单词视为离散的符号,用单词的ID或one-hot表示,例如:
One-hot表示的不足
维度太高。
,所有向量都互相正交,通过one-hot表示无法计算词与词的相似度
1.3.3 上下文词表示 (Distributional Representation)
核心思想:一个词的意义应通过经常出现在其周围的词进行表示
基于统计学的自然语言处理中成功的想法之一
例如:使用上下文来表示单词stars
共现统计
词嵌入
接下来进行共现统计,基于计数的分布式词表示:
基于计数的分布式词表示其实也有一些细节上的不同:
Term-Term矩阵:矩阵中的数表示一个词出现在另一个词周围的次数
Term-Document矩阵:矩阵中的数表示一个词出现在某文档中的次数
Term-Term矩阵 (共现矩阵)
矩阵中的数表示一个词出现在另一个词周围的次数
𝑛为句子的长度,𝑚为窗口长度
该共现矩阵同时获取句法和语义信息
窗口越小,词表示能包含越多句法信息 (𝑚 ∈ [1,3])
窗口越大,词表示能包含越多语义信息 (𝑚 ∈ [4,10])
例如:
语料
I like deep learning.
I like NLP.
I enjoy flying.
词表
I
Like
Deep
Learning
NLP
Enjoy
Flying
.
则 窗口长度为2时的Term-Term矩阵
Term-Document矩阵
矩阵中的数表示一个词出现在文档中的次数(Document可以看作是一个最大的窗口,语义信息。)
例如:
语料
I like deep learning.
I like NLP.
I enjoy flying.
每个文档都由 中的一个计 数向量 (一列) 表示
每个单词也由 中的一个计 数向量 (一行) 表示
D表示语料中的文档数量,𝑉 表示词表大小
相似度计算
现有2个词向量𝑣和𝑤,可以通过点积计算他们的词间相似度
词向量长度反映该词的频度
词向量长度越长表示该词出现得越频繁,点积值也更大。
可以基于向量长度对点积值进行标准化(不受长度影响),通常使用余弦相似度
基于统计表示的不足
随词表增长规模变大→需要大量存储空间
低频词存在稀疏问题→导致后续语言处理模型表现不稳定
办法1:稠密向量
机器学习中的特征通常为低维稠密向量
稠密向量通常有更好的泛化能力
奇异值分解(SVD)介绍
M为𝑚 × 𝑛矩阵
M可以表示为𝑀 = 𝑈Σ𝑉*
U为𝑚 × 𝑘矩阵,行为原始行,但𝑘列分别为隐式空间中的一个维度,因此𝑘列向量 间两两正交
Σ为𝑘 × 𝑘奇异值对角矩阵,每一维度的值表示该维度的重要性
V*为𝑘 × 𝑛矩阵,列为原始列,但𝑘行分别与各奇异值相关
如果𝑘不够小,可以仅保留最大的𝑘个奇异值 (例如300),采用最小均方误 差逼近𝑀矩阵
SVD可以减小词向量的维度
SVD也可以应用于Term-Term矩阵 (共现矩阵),来得到稠密词向量
𝑋为Term-Term矩阵,𝑊中的每行为每个词w的𝑘维表示
办法2:词嵌入
分布式表示 (Distributed Representation)
通过对大规模文本语料的学习,为每一个词建立一个稠密向量表示
计算方法: word2vec
依旧是低维的稠密向量,思想来源于事物在人脑中的表示:分散在不同的神经元上,激活抑制的状态。单独的一个神经元激活或者一致的状态或许没什么用,但这些神经元组合在一起的激活抑制的状态所形成的低维的向量才有意义(组成某个词/句子意思等)
二、 分布式词表示
先来介绍一下语言模型
2.1 语言模型
关于词序列W的概率分布,即说出这句话/词的概率是多少
计算词序列的联合概率(覆盖率)
计算下一个词𝑤𝑛出现的条件概率
如何计算句子的概率?
假设: 下一个词的概率仅由它前面的词决定
语言模型(下面这个公式的例子就是上面这个图片):
局限性:当句子长度很长时,句子概率的计算过程可能会很慢
办法:N-gram
限制前面的词的数量 (2 or 3)
用Back-off或smoothing方法处理新的单词组合
Markov假设
简化的语言模型
N-gram的不足
没有考虑1-2词之外的上下文信息
没有考虑词与词之间的相似度
The cat is walking in the bedroom
A dog was running in a room
N-gram没有考虑cat和dog,walking和running在语义和语法间的相似度
有鉴于此,我们需要神经语言模型
2.2 神经语言模型
神经语言模型是一种基于神经网络的语言模型,目的是学习词的分布式表示。
为每个词学习一个分布式向量
通过词的特征向量计算词序列的联合概率
学习优化词的分布式向量 (词嵌入矩阵E) 和模型其他参数 (映射矩阵W)
还是根据前面的词预测下一个词,如上图,把t-1、t-2、t-3这样低维的向量拼接在一起形成一个更高维的向量,然后经过非线性去预测下一个词。
首先将每个词与一个低维度的向量联系起来,即找到这个词的向量表示
然后对找出来的前文的响亮的词进行拼接,非线性变换,map,然后就得到下一个词的概率。
双曲正切函数 (tanh)
非线性函数,函数值在【−1,1】 , 图像如下
非线性变换之后要乘以一个映射矩阵加上偏置,得到不同词上的取值。
此时还没有得到下一个词的概率,需要进行softmax进行预测
损失计算 - 交叉熵损失函数
然后可以通过链式法则计算交叉熵损失函数的梯度值,进行反向传播。
可以使用随机梯度下降 (SGD) 等优化算法,训练某个权值𝑊𝑖𝑗来减小损失。同样的,可以对神经模型中各层的参数进行优化。
2.3 神经语言模型的挑战
词表可能会非常大,包含几万甚至几十万个不同的单词
参数过多
查询表 (词嵌入矩阵)
映射矩阵
计算量过大
非线性操作 (tanh)
每步都对每个词做softmax:假设词表中含有10万个单词,每一步都要计算10万次条件概率
word2vec可以作为解决问题的一个选择
三、*词嵌入 Word2vec
Word2vec使用浅层网络学习每个词的分布式向量表示
词向量可以捕捉复杂语义关系,例如
依旧是低维的稠密向量,思想来源于事物在人脑中的表示:分散在不同的神经元上,激活抑制的状态。单独的一个神经元激活或者一致的状态或许没什么用,但这些神经元组合在一起的激活抑制的状态所形成的低维的向量才有意义(组成某个词/句子意思等)
上图我们可以看到比较有意思的一幕,以最右侧国家和首都为例,国家都在左边,首都都在右边,且距离相近,连线也都基本平行。像左边一些表达性别、动词时态等的词也是一样,我们发现存在关系的一些词,在向量空间上也存在着一定的联系。
甚至可以这样计算:
WR(China) − WR(Beijing) ≃ WR(Japan) - WR(Tokyo)
WR(Man) ≃ WR(King) − WR(Queen) + WR(Woman)
WR(Swimming) ≃ WR(Walking) − WR(Walk) + WR(Swim)
又或者 向量German和向量airlines相加,得到的结果和他们的航空公交公司很像...
3.1 典型模型
Word2vec可以采用两种典型结构来获取词的分布式表示
连续词袋模型 (Continuous Bag-of-Words),CBOW
Skip-gram模型
word2vec使用一个固定大小的窗口沿着句子滑动
在每一个窗口中,中间的词作为目标词,其他的词作为上下文
给出上下文词(前后的词),CBOW模型可以预测目标词(中间词)的概率
给出目标词(中间词),skip-gram模型可以预测上下文词(前后的词)的概率
3.1.1 连续词袋模型,CBOW
在CBOW中,给出窗口中上下文的词,模型可以预测目标词
词袋假设:上下文词的顺序不影响模型的预测结果
假设窗口大小为5:��𝑒𝑣𝑒𝑟 𝑡𝑜𝑜 𝑙𝑎𝑡𝑒 𝑡𝑜 𝑙𝑒𝑎𝑟𝑛 ⇒ 𝑃(𝑙𝑎𝑡𝑒|[𝑛𝑒𝑣𝑒𝑟,𝑡𝑜𝑜,𝑡𝑜, 𝑙𝑒𝑎𝑟𝑛])
之前是把单独的词向量拿出来怕拼接在一起,现在是加在一起取平均。降低了向量维度。
然后这个“上下文平均向量”再与目标词(too)向量求点积,softmax,得到概率。
3.1.2 Skip-gram模型
在skip-gram架构中,模型通过窗口中的目标词预测上下文的词
假设窗口大小为5
𝑁𝑒𝑣𝑒𝑟 𝑡𝑜𝑜 𝑙𝑎𝑡𝑒 𝑡𝑜 𝑙𝑒𝑎𝑟𝑛
𝑃([𝑡𝑜𝑜, 𝑙𝑎𝑡𝑒]|𝑁𝑒𝑣𝑒𝑟), never去预测too,never去预测late
窗口继续滑动,𝑃([𝑁𝑒𝑣𝑒𝑟, 𝑙𝑎𝑡𝑒,𝑡𝑜]|𝑡𝑜𝑜), …
Skip-gram每一步预测一个上下文词,训练样例为
𝑃(𝑡𝑜𝑜|𝑁𝑒𝑣𝑒𝑟), 𝑃(𝑙𝑎𝑡𝑒|𝑁𝑒𝑣𝑒𝑟), 𝑃(𝑁𝑒𝑣𝑒𝑟|𝑡𝑜𝑜), 𝑃(𝑙𝑎𝑡𝑒|𝑡𝑜𝑜), 𝑃(𝑡𝑜|𝑡𝑜𝑜), …
3.1.3 CBOW和Skip-gram
用softmax函数进行预测
用交叉熵损失函数衡量预测与真实分布之间的差异
最终用优化算法学习词向量和映射矩阵
完全softmax存在的问题
当词表过大时
每一步都对所有词做softmax,需要大量计算
需要提高计算的效率
word2vec中对此提出两个改进方案
负采样
分级softmax
3.1.4 负采样
词表通常很大,意味着模型在每一步都需要对大量参数进行更新
负采样在每一步中只选择较小比例的噪声词,对其词向量进行更新
将噪声词从目标词的上下文中区别开,专注于学习高质量的词向量
根据已有词表和已知上下文词,可以根据以下公式计算概率,随机选取一些不在上下文中的词
如果词𝑤𝑖 出现在词 𝑤𝑗 的上下文,那么词 𝑤𝑗 的表示相比于其他词的表示,应该更接近于词𝑤𝑖的表示
如下是skip-gram模型训练中的一步,如果不使用负采样,那么输出层中会计算所有词的概率,dim=V
如果使用负采样,假设我们采样了4个负例,dim=5,点积时只需要和这5个点积就行了
然后,我们可以在每一步计算损失,再优化参数 (无需优化全部参数)
假设参数矩阵大小为300 × 10,000,输出向量长度为5
使用负采样,仅需要更新300 × 5个参数,数量仅占全部参数的0.05%
3.1.5 分级softmax
分级softmax使用Huffman树,按词频对每一个词进行分组,将每一步的计算量由𝑉减小到log𝑉
一个词的概率可以按如下方式计算
3.2 其他词嵌入的技巧
下采样 根据低频词更可能携带关键信息的假设,下采样按以下概率丢弃一个词,不学习和更新它的向量
𝑓(𝑤)为词频,𝑡为一个可调整的阈值
Soft滑动窗口 假设滑动窗口对较远的词权值应该更小
将滑动窗口的最大长度定义为𝑆𝑚𝑎𝑥,对每一个训练样例,实际的长度在1和𝑆𝑚𝑎𝑥间随机选择(近的词出现的多,正态分布)
由此,靠近目标词的一些词更有可能出现在窗口中
3.3 其他词向量模型:GloVe
全局向量 (GloVe) 模型采用一种无监督学习的算法,来获取每一个词的向量表示
GloVe模型目的在于将基于统计的矩阵分解(前者是滑动窗口)和基于上下文的skip-gram模型结合在一起
GloVe模型的主要思想是:词共现概率某种程度上暗含了该词的语义信息
Jeffrey Pennington, R Socher, CD Manning. GloVe: Global Vectors for Word Representation. EMNLP 2014
3.4 评估
3.4.1 类比推理
Google类比推理评测数据集
词对间的一种可能的类推关系: a:a* :: b:b* (a之于a* 如 b之于b*)
例如:Tokyo之于Japan 相当于 Paris之于France
14种关系 (其中9种词法,5种语义)
首都;货币;反义 …
如上图,根据Athens和Greece的关系推断Beijing和?的关系。
a*-a=b*-b =》 a*=b*-b+a
Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013). Efficient estimation of word representations in vector space. In Proceedings of International Conference on Learning Representations (ICLR).
3.4.2 词相似度
WordSimilarity-353 (WordSim353)
人工标注353对英语词的相似度
评估指标: Spearman相关性系数,模型计算词对相似度与人工标注词对相似度的相关性系数
Spearman相关性系数:一个无参数的排序相关性评估 (两组排序变量之间的统计独立性)
Model1:-0.5,Model2: 1.0
Finkelstein et al. Placing Search in Context: The Concept Revisited, ACM Transactions on Information Systems, 2002
AI遮天传 ML-回归分析入门
相信大家初高中都学习过求解回归线方程,大学概率论的第九章也有讲,忘记了也不要紧,这里简单回忆一下:
线性回归方程为:
我们可以先求出x、y的均值:
对于系数 :
对于系数 :
例:已知x、y之间的一组数据:
x | 0 | 1 | 2 | 3 |
y | 1 | 3 | 5 | 7 |
求y与x的回归方程:
答案 : 其实连起来就是一条线段
一、什么是回归分析
Regression
回归分析我们通常叫做 Regression ,它其实是一大类方法。我们之前了解到的Predicition它即包括了Regression也包括了Classification,即回归和分类。像是决策树适合的离散型输出,我们一般叫做分类;而对于连续型输出的问题,比如用户的满意度、一个家庭一年的开销或者是用户星级的评价、用户的点击又或是一些概率等等,就要用到这次介绍的Regression方法。
回归分析是描述变量间关系的一种统计分析方法
• 例:在线教育场景
• 因变量 Y:在线学习课程满意度
• 自变量 X:平台交互性、教学资源、课程设计
• 预测性的建模技术,通常用于预测分析
• 预测的结果多为连续值(但也可以是离散值,甚至是二值)
二、简单线性回归
线性回归 (Linear regression)
因变量和自变量之间是线性关系,就可以使用线性回归来建模
线性回归的目的即找到最能匹配(解释)数据的截距和斜率
- 有些变量间的线性关系是确定性的
x | 1 | 2 | 3 | 4 | 5 | 6 |
y | 3 | 5 | 7 | 9 | 11 | 13 |
所以当 x=7时,我们预测为15.
- 然而通常情况下,变量间是近似的线性关系
x | 1 | 2 | 3 | 4 | 5 | 6 |
y | 3 | 2 | 8 | 8 | 11 | 13 |
我们要解决的问题就是如何得到一条直线能够最好地解释数据?
拟合数据
- 假设只有一个因变量和自变量,每个训练样例表示 (𝑥𝑖 , 𝑦𝑖)
- 用 表示根据拟合直线和 x𝑖 对 𝑦𝑖 的预测值:
- 定义 为误差项/残差
这里引入了一个新的定义:误差项,它是用样本的真实值减去样本的估计值。
我们的目标就是得到一条直线使得对于所有训练样例的误差项尽可能小
线性回归的基本假设
我们假设:
- 假设自变量与因变量间存在线性关系
- 数据点之间独立
输出结果y1,y2,y3...没有关系
- 自变量之间无共线性,相互独立
对于走路累不累:如果特征是 伞 和 书包 伞和书包这两个变量没什么关系
如果是 天气 伞 书包 则 天气 和 伞 我们认为并不是相互独立的
- 残差独立、等方差、符合正态分布
error独立、等方差(面对同一个问题,也是同分布的)
根据中心极限定理:设从均值为μ、方差为σ^2;(有限)的任意一个总体中抽取样本量为n的样本,当n充分大时,样本均值的抽样分布近似服从均值为μ、方差为σ^2/n 的正态分布。
三、损失函数(loss function)的定义
多种损失函数都是可行的,凭直觉就可以想到:
- 所有误差项的加和
- 所有误差项绝对值的加和
考虑到优化等问题,最常用的是基于误差平方和的损失函数
• 用误差平方和作为损失函数有很多优点
• 损失函数是严格的凸函数,有唯一解
• 求解过程简单且容易计算
• 同时也伴随着一些缺点
• 结果对数据中的“离群点”(outlier)非常敏感
• 解决方法:提前检测离群点并去除
• 损失函数对于超过和低于真实值的预测是等价的
• 但有些真实情况下二者带来的影响是不同的
我们需要求出合适的参数b1、b2使得误差平方和最小。
最小二乘法(Least Square, LS)
为了求解最优的截距和斜率,可以转化为一个针对损失函数的 凸优化问题,称为最小二乘法:
我们分别对b1、b2求偏导:
这就是我们文章最开始回忆的线性回归方程,我们使用时当然不用去求偏导了,直接用。
梯度下降法(Gradient Descent, GD)
除了最小二乘法,还可以用基于梯度的方法迭代更新截距和斜率:
- 可以随机先初始化 𝑏1, 𝑏2
- 重复:
有了初始化的一组b1、b2,我们就可以得到对应比如样本1的误差项error1,基于误差项去更新b,b=b-a,其中a是系数的更新(和误差有关的函数,比如0.1*error),这样就有了新的b1、b2,用样本2的误差项error2求出a不断更新迭代... 直到收敛。
四、多元线性回归(Multiple Linear Regression)
当因变量有多个时,我们可以用矩阵方式表达
基于以上矩阵表示,可以写为
此时:
注:
- 矩阵X的第一列都是1,其与β相乘表示截距。
- 损失函数结果还是数字
- 通过最小二乘法得到求解β的公式:
例如:
记录了 25 个家庭每年在快销品和日常服务
- 总开销(𝑌)
- 每年固定收入( 𝑋2)、持有的流动资产( 𝑋3)
可以构建如下线性回归模型:
五、线性回归的相协方差、关系数、决定系数
协方差:协方差,描述两个变量 X 和 Y 的线性相关程度
相关系数:取值区间[-1,1]
如:
决定系数:决定系数 ,也称作判定系数、拟合优度
注意:有可能小于0,它不是一个数的平方。
衡量了模型对数据的解释程度
- y的波动有多少百分比能被x的波动所描述
- 𝑅 2越接近1,表示回归分析中自变量对因变量的解释越好
特别注意:变量相关 ≠ 存在因果关系
基于回归分析的世界大学综合得分预测
大学排名是一个非常重要同时也极富挑战性与争议性的问题,一所大学的综合实力涉及科研、师资、学生等方方面面。目前全球有上百家评估机构会评估大学的综合得分进行排序,而这些机构的打分也往往并不一致。在这些评分机构中,世界大学排名中心(Center for World University Rankings,缩写CWUR)以评估教育质量、校友就业、研究成果和引用,而非依赖于调查和大学所提交的数据著称,是非常有影响力的一个。
本任务中我们将根据 CWUR 所提供的世界各地知名大学各方面的排名(师资、科研等),一方面通过数据可视化的方式观察不同大学的特点,另一方面希望构建机器学习模型(线性回归)预测一所大学的综合得分。
数据来源:World University Rankings | Kaggle
数据观察与处理:
import pandas as pd
import numpy as np
data_df = pd.read_csv('./cwurData.csv')
data_df.head(3).T # 观察前几列并转置方便观察
去除其中包含 NaN 的数据
data_df = data_df.dropna()
len(data_df) # 2000
设置矩阵
feature_cols = ['quality_of_faculty', 'publications', 'citations', 'alumni_employment',
'influence', 'quality_of_education', 'broad_impact', 'patents'] # 提取特征值
X = data_df[feature_cols]
Y = data_df['score']
# X Y分别为自变量 因变量矩阵
数据可视化
观察世界排名前十学校的平均得分情况,为此需要将同一学校不同年份的得分做一个平均。我们可以利用groupby()
函数,将同一学校的记录整合起来并通过mean()
函数取平均。之后我们按平均分降序排序,取前十个学校作为要观察的数据。
import matplotlib.pyplot as plt
import seaborn as sns
mean_df = data_df.groupby('institution').mean() # 按学校聚合并对聚合的列取平均
top_df = mean_df.sort_values(by='score', ascending=False).head(10) # 取前十学校
sns.set()
x = top_df['score'].values # 综合得分列表
y = top_df.index.values # 学校名称列表
sns.barplot(x, y, orient='h', palette="Blues_d") # 画条形图
plt.xlim(75, 101) # 限制 x 轴范围
plt.show()
用pairplot
的方法观察变量之间的关联关系,可以从图中看到,少部分变量之间有线性关系;各个变量和结果之间,近似对数关系。
sns.pairplot(data_df[feature_cols + ['score']], height=3, diag_kind="kde")
plt.show()
还可以用热力图的形式呈现相关度矩阵:
构建模型
取出对应自变量以及因变量的列,之后就可以基于此切分训练集和测试集,并进行模型构建与分析。
all_y = data_df['score'].values
all_x = data_df[feature_cols].values
# 取 values 是为了从 pandas 的 Series 转成 numpy 的 array
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(all_x, all_y, test_size=0.2, random_state=2020)
all_y.shape, all_x.shape, x_train.shape, x_test.shape, y_train.shape, y_test.shape # 输出数据行列信息
# ((2000,), (2000, 8), (1600, 8), (400, 8), (1600,), (400,))
from sklearn.linear_model import LinearRegression
LR = LinearRegression() # 线性回归模型
LR.fit(x_train, y_train) # 在训练集上训练
p_test = LR.predict(x_test) # 在测试集上预测,获得预测值
test_error = p_test - y_test # 预测误差
test_rmse = (test_error**2).mean()**0.5 # 计算 RMSE
'rmse: :.4'.format(test_rmse)
# rmse: 3.999
得到测试集的 RMSE 为 3.999,在百分制的预测目标下算一个尚可的结果。从评价指标上看貌似我们能根据各方面排名较好的预估综合得分,接下来我们观察一下学习到的参数,即各指标排名对综合得分的影响权重。
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
sns.barplot(x=LR.coef_, y=feature_cols)
plt.show()
这里会发现综合得分的预测基本被「师资质量」这一自变量主导了,「就业」和「教育质量」这两个因素也有一定影响,其他指标起的作用就很小了。
为了观察「师资质量」这一主导因素与综合得分的关系,我们可以通过 seaborn 中的regplot()
函数以散点图的方式画出其分布。
sns.regplot(data_df['quality_of_faculty'], data_df['score'], marker="+")
plt.show()
以上是关于AI遮天传 NLP-词表示的主要内容,如果未能解决你的问题,请参考以下文章