微信扫码
与创始人交个朋友
我要投稿
上篇文章介绍了,token是什么,简述了词表构建,以及分词的一些方法。我们知道了,在构造大模型时,首先会构建一个词表,然后根据词表将输入的句子切分成一个一个的token;但是计算机是怎么理解token的呢,token是如何参与计算的呢?
本文进行解答,本文将包含以下三个部分:
传统编码方法
我 爱 人工智能
我 爱 中国
那么得到的词表是:[我,爱, 人工智能, 中国]
句子"我 爱 中国"中三个token就可以表示为
我 |
爱 | 人工智能 | 中国 |
|
我 |
1 | 0 | 0 | 0 |
爱 |
0 |
1 |
0 | 0 |
中国 | 0 |
0 | 0 |
1 |
简单性:One Hot 编码实现简单,易于理解和应用。
无偏性:它不会引入词之间的任何偏序关系,每个词都是独立的维度。
易于实现:大多数编程语言和库都提供了 One Hot 编码的实现。
维度高:对于词汇量大的语言模型,One Hot 编码会导致非常高的维度,浪费计算资源和内存。
稀疏性:One Hot 编码的数据非常稀疏,大多数元素都是零,这可能会增加存储和计算成本。
丢失语义信息:One Hot 编码不能捕捉词与词之间的语义关系(词都是单独的,不能暗含中国和中华的关系)。
不适合复杂的NLP任务:对于需要理解词义和上下文的任务,One Hot 编码可能不够有效。
向量的编码方式是先设定一个维数(比如4维),那么每个token就是一个4维的向量表示,例如用(0.21, 0.155, 0.64, 0.36)表示上面的 “我”,这样有一个好处,就是不管词表有多大,每个token就是一个4维的向量;如果用onehot,如果词表有1000个词,那么一个token就是1000维的,而且只有它在词表中位置的数为1, 其它为0。
稠密词向量一般初始化一个值,然后通过在大量文本上训练得到的,能够捕捉词义和词与词之间的关系。常用的方法有Word2Vec,Glove,这些都有相应的包可以直接跑,有问题可以私信我。基于这些训练方法,可以得到"king" 和 "queen" 在嵌入空间中可能比 "king" 和 "car" 更接近,这些是以前做词联想和相似度匹配的常用方法。
语义信息:词嵌入能够捕捉词与词之间的语义关系,例如,"king" 和 "queen" 在嵌入空间中可能比 "king" 和 "car" 更接近。
降维:相比于 One Hot 编码,词嵌入通常具有更低的维度,这有助于减少计算复杂度和避免维度灾难。
捕捉词序:词嵌入可以捕捉到词序信息,有助于理解词在句子中的上下文关系。
泛化能力:词嵌入模型通常通过大量文本数据训练得到,具有很好的泛化能力,可以应用于不同的任务和领域。
连续性:词嵌入是连续的向量表示,可以进行向量运算,如向量加法和余弦相似度计算。
训练成本:词嵌入模型需要大量的数据和计算资源来训练,特别是对于大型语料库。
更新困难:一旦模型训练完成,更新词向量以适应新词汇或新领域可能比较困难。
可解释性:词嵌入的向量表示可能不如 One Hot 编码直观,难以解释每个维度的具体含义。
依赖上下文:词嵌入的语义信息依赖于上下文,可能会在某些情况下导致歧义。
大模型中的词嵌入
在大模型中词嵌入先初始化一个大词嵌入矩阵V(行是词表大小,列是向量维数) ,将句子的每个token映射到一个唯一的整数索引,然后使用这个索引在模型的词嵌入矩阵中查找对应的词向量。
token向量化之后,就可以被计算机识别了,参加模型内部的运算(加法和乘法),最后得到在一个输出向量,与词表V中的每一行进行对比计算相似度,随机输出概率高的一些行对应的token就为输出;控制输出尺度也就是调节参数(top_k,top_p),这些在后面将会介绍到,在使用大模型时如何设置超参数得到最理想的效果。
Qwen7B参数分析:词表
{
"architectures": [
"Qwen2ForCausalLM"
],
"attention_dropout": 0.0,
"auto_map": {
"AutoModel": "modeling_qwen.Qwen2Model",
"AutoModelForCausalLM": "modeling_qwen.Qwen2ForCausalLM",
"AutoModelForSequenceClassification": "modeling_qwen.Qwen2ForSequenceClassification"
},
"bos_token_id": 151643,
"eos_token_id": 151643,
"hidden_act": "silu",
"hidden_size": 3584,
"initializer_range": 0.02,
"intermediate_size": 18944,
"max_position_embeddings": 131072,
"max_window_layers": 28,
"model_type": "qwen2",
"num_attention_heads": 28,
"num_hidden_layers": 28,
"num_key_value_heads": 4,
"rms_norm_eps": 1e-06,
"rope_theta": 1000000.0,
"sliding_window": 131072,
"tie_word_embeddings": false,
"torch_dtype": "float32",
"transformers_version": "4.41.2",
"use_cache": true,
"use_sliding_window": false,
"vocab_size": 151646
}
可以看到,两个重要的参数:"vocab_size": 151646,"hidden_size": 3584
词表的大小为151646,词的维数是3584,那么整个词表的参数就为:151646*3584=543499264,Qwen-7B总共70亿参数,词表就占用了5.4亿哦,如果用fp16加载,词表就得占用1G多的内存空间,大家知道在内存紧缺的并行训练阶段词表是怎么参与计算的吗?
接下来的文章中,我们将介绍大模型最重要的部分attention是什么?如何理解它?里面包含多少参数?
如果对内容有什么疑问和建议可以私信和留言,也可以添加我加入大模型交流群,一起讨论大模型在创作、RAG和agent中的应用
欢迎关注我的公众号“哎呀AIYA”,每天一篇大模型(LLM)文章来锻炼我们的思维,简单的叙述,不简单的内涵,提升自己。
推荐阅读
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-13
2024-08-21
2024-07-09
2024-06-13
2024-08-04
2024-04-11
2024-07-18
2024-07-01