Base-llm 1.2.2 向量表示

一、为什么需要词向量?

以文本分类为例,jieba分词无法理解语义, 需要使用机器学习和深度学习模型。 这些模型的输入都是数值形式。
解决自然语言和数学模型之间的鸿沟。
词向量表示:将一段文字,分词得到词元序列,转换为一个或一组数字。
不仅要能转换为数字,还要向量本身能够蕴含词语的寓意信息。例如国王和女王的向量距离小于国王和香蕉的距离。

二、离散表示

2.1 独热编码 one-hot encoding

也称为哑编码
(1)原理:每个词元看做一个独立的类别。
步骤: 构建词典,收集语料库出现过的唯一词语,构建一个词典。 每个词是一类,并构建索引。
创建向量: 用词典大小的向量表示每个词, 索引位置是1,其余为0.


image.png

(2) 优缺点
优点:简单, 清晰地将词语分开
缺点:

  1. 维度灾难: 太稀疏了,浪费资源
  2. 语义鸿沟:所以词之间都是正交的,丢失了语义信息。

2.2 词袋模型 Bag-of-Words, BoW

one-hot编码表示的是单个词,实际上通常要表示整个句子或文档。
词袋模型,是表示文档级别特征最常用的方法之一。

2.2.1 基本思想与实现

词袋模型思想:忽略文本中的词序和语法,将其仅仅视作一个装满词的袋子,用袋子中每个词出现的统计量来表示整个文档。
可以理解为将每个文档中所有词的独热向量相加,得到一个最终向量。这个向量维度等于词典大小。
实际计算的时候: 直接统计词频,然后放到对应索引位置即可。


image.png

例如上边两句话的向量, 语义相近。
这样相似的话的向量也相近,可以用余弦相似度统计。

2.2.2 余弦相似度计算

计算的是两个向量夹角的余弦值。对于词袋模型生成的是非负向量,取值范围为【0,1】,越接近1越相似。
[图片上传失败...(image-ddefdc-1773993540517)]

如果A,B两个都做归一化了,也就是|A|和|B| 都为1, 那么余弦相似度计算则退化为 A · B

2.2.3 不同统计方式

词袋模型每一维的值可以采用不同策略。
频数方式:使用频数,单词在文档中出现次数,但是会导致数值偏高。
频率方式:为了缓解文档长度的影响,可以使用频率, 单词在文档中出现次数除以文档总次数。
二进制方式: 只记录某个单词是否出现过,忽略次数。

优点: 实现简单,只能判断文档中有什么词
缺点:忽略了词与词之间的关系,丢失词序,一些停用词会高频。

2.3 TF-IDF

用来衡量一个词的重要性。

提升文档在向量空间中的区分度,解决常见词权重过高导致的文档混淆问题。

TF-IDF的理念是一个词的重要性与其在当前文档中出现的次数成正比,而其在整个语料库中出现的频率成反比。 简言之:一个词在当前文档里越常见,但在其他文档里越罕见,它的权重就越高。

(1)算法组成:
TF: 词频, 频数除以文档总次数
IDF: 逆文档率, log[语料库中总文档数/ 包含词t的文档数]

TF-IDF(t,d,D)= TF(t,d)x IDF(t,d) 也就是词频和逆文档率的乘积。

通俗语言:
TF-> 词频-> 词的频数/ 当前文档总词数
IDF-> 逆文档率 , 也就是 这个词所在文档越少说明命中概率越大,那么反比就越大。
-> log[语料库中总文档数/ 包含词t的文档数]
IDF计算依赖于外部语料库
TF-IDF= 词频* 逆文档率 (两个值越高,代表词所在文档越相关)

(2)实际应用
a. 常用语关键词提取, 计算文章中每个词的TF-IDF值,降序排列,排在最前边的便是关键词。
b. 文本相似度计算, 通过构建两篇文档TF-IDF向量并计算其余弦相似度来判断内容是否相近。

2.4 N-gram 模型

词袋模型和TF-IDF 最大的局限是彻底丢失了词序信息。N-gram 通过统计连续词组的方式弥补了这个短板。是对传统方法的改进,也是最早引入预测下一个词的思想。

2.4.1 预测下一个词

核心是基于马尔可夫假设, 认为一个词出现的概率只取决于俄它前面N-1个词。
这种简化降低了建模复杂度,并且是基于前文预测后续内容,被认为是生成式AI的雏形。

计算方法:P(当前词 | 前面n-1个词) = count(完整n-gram) / count(前n-1个词组成的(n-1)-gram)

2.4.2 N-gram挑战

虽然N-gram找回了词序,但是付出了巨大代价。

  1. 指数级爆炸,词典越多,bigram和trigram种类越多,维度灾难。
  2. 数据稀疏问题, 巨大多数词组合根本永远不会出现,导致概率为0.
    传统NLP 发展出了复杂的平滑技术以及通过将词聚类来减少参数的基于类的N-gram模型。

为了从根本上解决这个限制,后续诞生了词向量和神经网络语言模型。

三、序列化表示

将文本转换为最基础的整数ID序列,然后把“学习词语的含义和重要性”这个复杂任务,交给模型自己去完成。

3.1 序号化过程

序号化: 也叫整数编码,将分词后的词元序列转换为深度学习模型能够处理的整数序列的核心步骤。

(1)构建词典: 从训练预料中构建一个词典。 深度学习中,词典通常是字粒度或者子词粒度。
(2) 增加特殊词元:词典中加入一下特殊token,主要包括[PAD]和[UNK].
[PAD]的ID通常为0,用于短句子填充至同一批次内最长长度。
[UNK] 的ID通常为1, 用于表示所有词典中未出现过的词。
根据任务需求,还可能加入[CLS](分类)、[SEP](分隔)等特殊词元
(3) ID映射:将文本序列中的每个词元,直接映射为其在词典中的整数ID。

实践中,通常直接使用BERT、GPT这类预训练模型官方提供的词典文件(vocab.txt)。这些词典通常包含了数万个字、子词、符号等,实在海量通用预料上构建的。

序号化实例

  1. 词典:
{'[PAD]': 0, '[UNK]': 1, '比': 2, '方': 3, '说': 4, '我': 5, '先': 6, '挣': 7, '它': 8, '一': 9, '个': 10, '亿': 11}
  1. 对下边句子进行分词,同时找到分词对应的ID号,未出现过的则为[UNK] ,ID为1
句子1 (我挣一个亿): 我 (5), 挣 (7), 一 (9), 个 (10), 亿 (11) -> [5, 7, 9, 10, 11]
句子2 (比方说我): 比 (2), 方 (3), 说 (4), 我 (5) -> [2, 3, 4, 5]
句子3 (我先挣钱): 我 (5), 先 (6), 挣 (7), 钱 (不在词典中) -> [5, 6, 7, 1]
  1. 对上述结果进行Padding填充。
序列1 (长度5): [5, 7, 9, 10, 11]
序列2 (长度4→5): [2, 3, 4, 5, 0]
序列3 (长度4→5): [5, 6, 7, 1, 0]

  1. 输出3x5的矩阵
# 最终输入模型的张量(Tensor)
[[5, 7, 9, 10, 11],
 [2, 3, 4, 5,  0],
 [5, 6, 7, 1,  0]]

注意:整数ID之间没有语义关系,所以序号化本身没有解决语义问题。后续嵌入层会对这些

总结

  1. 为什么需要向量:作为模型的输入,需要将字符转为数字,并希望数字能体现语义关系。

  2. 离散表示:
    2.1 独热向量:每个词都是单独向量,有维度爆炸问题, 向量稀疏。
    2.2 词袋模型: 词频统计作为向量, 缺点是无法体现词序信息
    2.3 TF-IDF: 词频*逆文档率(词频越高越重要,词相关文档在语料库中越少见,说明越重要), 可以衡量词在文档中的重要性, 同样无法体现词序信息。
    2.4 N-Gram:指计算前边n-1个词发生的情况下,第n个词发生的概率,用来预测下一个词。
    记录了词序信息,缺点是会因词典过大而有指数爆炸问题,同时会有数据稀疏问题,多数词语组合概率为0.

  3. 序列化表示: 过程就是为了将文本转化为数字表示,语义关系通过模型来学习。通过构建词典,将文本分词后,用词典ID表示每个词,经过padding统一长度后输出最终文档。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容