embedding经过分词,文本就可以分解成用数字表示的token序列。对于一个句子,最直接的表示法就是one-hot编码。假如词汇表【我,喜,欢,吃,面】,此时词汇大小(vocab_size)大小为5,那句子“我喜欢”用one-hot编码如下图。当词汇表特别大时(llama词汇大小是3万多),句子的向量(n*vocab_size)表示也就变的比较大;另外,“喜欢”这个词出现在一起的频率其实比较高,但one-hot编码也忽略了这个特性。embedding就是将句子的向量表示压缩,具体就是词汇表的每个词映射到一个高维(d维)的特征空间。# 一般embedding在语言模型的最开始,也就是词token操作之后# vocab_size 词汇表大小,hidden_size 隐藏层维度大小word_embeddings= nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)# input_ids是句子分词后词id,比如上述的“我喜欢”可转换成为[0,1,2],数字是在词汇表【我,喜,欢,吃,面】中的索引,即token idembeddings = word_embeddings(input_ids) # embeddings的shape为[b,s,d],b:batch,s:seq_len,d:embedding sizeembedding的每维特征都可以看出词的一个特征,比如人可以通过身高,体重,地址,年龄等多个特征表示,对于每个词embedding的每个维度的具体含义,不用人为定义,模型自己去学习。这样,在d维空间上,语义相近的词的向量就比较相似了,同时embedding还能起到降维的作用,将one-hot的[s,vocab_size]大小变成了[s,d]。