从独热编码到BERT:一文看懂NLP语义表达的进化之路
今天想跟大家聊聊自然语言处理(NLP)中最基础也最核心的一个话题——语义表达。
很多人问我:“大模型为什么这么聪明?它到底是怎么理解人类语言的?”
要回答这个问题,我们得回到最开始的地方:计算机是怎么“看懂”文字的?
01 问题的起点:计算机不认识字
首先我们要明白一个基本事实:计算机不认识汉字,也不认识英文,它只认识数字。
所以,要让计算机处理语言,第一步就是把文字转换成数字。这个转换过程,就是“语义表达”。
你可以把语义表达想象成一座桥,桥的一头是人类语言,另一头是计算机能计算的向量空间。
最早的转换方式很简单粗暴,叫做独热编码。
什么叫独热编码?假设我们有一个词表,里面有“苹果”、“香蕉”、“电脑”三个词。那么:
-
“苹果” = [1, 0, 0]
-
“香蕉” = [0, 1, 0]
-
“电脑” = [0, 0, 1]
每个词对应一个向量,向量的长度等于词表大小,只有一个位置是1,其他都是0。
这种方法的问题显而易见:词与词之间是正交的,没有远近关系。在计算机看来,“苹果”和“香蕉”的距离,跟“苹果”和“电脑”的距离是一样的——都是互相垂直的向量。
这显然不符合直觉。在人类的认知里,“苹果”和“香蕉”都是水果,应该更相似才对。
这就是稀疏词向量的痛点:能表示词,但不能表示词的含义。
02 破局的关键:分布式语义假设
那怎么让计算机理解词的含义呢?
语言学家Firth在1957年说过一句很有名的话:“You shall know a word by the company it keeps.”(从一个人的朋友,就能了解他是什么样的人;从某个词周围的词,就能理解这个词的含义。)
这就是“分布式语义假设”——一个词的含义由其上下文决定。
这个假设成了词向量技术的理论基石。
什么意思呢?你看,“苹果”这个词,如果它经常和“吃”、“削皮”、“甜”这些词一起出现,那它大概率指的是水果;如果它经常和“手机”、“发布会”、“库克”一起出现,那它大概率指的是公司。
上下文相似的词,语义也相似。
有了这个理论指导,研究者们开始设计具体的训练任务,让模型通过上下文来学习词的含义。
这就引出了几个里程碑式的模型:word2vec、GloVe、FastText。
03 稠密词向量的崛起:word2vec的智慧
2013年,Google推出word2vec,彻底改变了词向量的训练方式。
word2vec的核心思想很简单:把词映射到一个低维连续空间里,让语义相近的词在空间里也靠得近。
它有两种训练方式:CBOW和skip-gram。
CBOW:给定上下文,预测中心词。比如看到“吃___有益健康”,猜中间这个词是“苹果”。
skip-gram:给定中心词,预测上下文。比如看到“苹果”,猜它周围会出现“吃”、“健康”这些词。
两种方法本质上都是在做同一件事:让模型学会词的共现规律。
训练完成后,我们会得到两个权重矩阵,一个是输入层到隐藏层的,一个是隐藏层到输出层的。这两个矩阵都可以作为词向量——通常取前者。
word2vec有个非常神奇的性质:词向量之间可以做加减法。
举个经典的例子:
v(国王) - v(男人) + v(女人) ≈ v(女王)
也就是说,“国王”减去“男人”得到的向量,加上“女人”,结果接近“女王”的向量。
这说明什么?说明模型真的学到了一些语义关系:国王相对于男人的差异,跟女王相对于女人的差异是相似的。
这种语义的线性关系,是稀疏词向量完全做不到的。
04 效率的挑战:大词表下的softmax困境
但是word2vec也有个实际问题:词表太大了怎么办?
假设词表有10万个词,每次计算概率都要对所有10万个词做softmax归一化,计算量太大,根本跑不起来。
研究者想出了两个解决方案:
方案一:层次化softmax
把词表构造成一棵哈夫曼树,每个词对应一个叶子节点。计算某个词的概率,就变成了从根节点走到叶子节点的路径上的二分类概率乘积。
这样,计算量从O(N)降到了O(logN),大幅提升效率。
方案二:负采样
这个方法更有意思。原来的任务是“给定上下文,预测中心词”,需要计算所有词的概率。现在改成:给定一个词和上下文,判断它是不是真的出现在这里。
训练时,我们拿正样本(真的出现在这里的词)加上随机采样的几个负样本(没出现的词),只更新这些样本相关的权重,而不是更新整个词表。
这就好比你本来要从100个人里找出谁是小偷,现在改成只问几个人“你是不是小偷”——效率高多了。
05 word2vec的局限:一词多义怎么办
word2vec很强大,但它有个致命伤:无法处理一词多义。
还是用“苹果”的例子。在训练语料里,“吃苹果”和“苹果公司”都会出现,word2vec会怎么处理?
它会给“苹果”一个固定的向量,这个向量是所有上下文的平均。结果就是:这个向量既不像水果,也不像公司,而是两者的某种折中。
这不是我们想要的。我们希望在“吃苹果”这个句子里,“苹果”的向量偏向水果;在“苹果公司”这个句子里,偏向公司。
词义应该随着上下文动态变化,而不是一成不变。
这个问题,直到BERT出现才得到彻底解决。
06 质的飞跃:BERT的动态词向量
2018年,BERT横空出世,带来了两个革命性变化:
第一,自注意力机制。
BERT在处理某个词时,会计算这个词和句子中所有其他词的相关性,然后用这些相关性加权融合所有词的信息,得到这个词的最终表示。
这就意味着:同一个词,在不同的句子里,因为上下文不同,得到的注意力权重不同,最终向量也不同。
“苹果”在“吃苹果”里,跟“吃”的注意力权重高,得到的向量偏向水果;在“苹果公司”里,跟“公司”的注意力权重高,得到的向量偏向企业。
一词多义问题,就这么解决了。
第二,多头注意力。
BERT有多个注意力头,每个头可以关注不同的特征。有的头关注词性关系,有的头关注句法结构,有的头关注指代关系。
这样一来,BERT输出的词向量,包含了丰富的语言特征:词性、句法、语义,甚至任务相关的特征。
如果说word2vec是二维黑白照片,那BERT就是三维彩色影像——信息密度完全不在一个量级。
07 总结:语义表达的进化之路
回顾这段发展史,我们可以看到一条清晰的脉络:
第一阶段:独热编码——解决了“怎么表示词”的问题,但词与词之间没有语义关系。
第二阶段:word2vec等稠密词向量——基于分布式语义假设,让语义相近的词在向量空间里也靠得近,实现了语义的可计算。
第三阶段:BERT等预训练语言模型——引入自注意力机制,实现了上下文相关的动态词向量,彻底攻克了一词多义难题。
每一步的演进,都是对前一步局限性的突破:
-
独热编码太稀疏 → 稠密向量来压缩
-
静态向量无法表达多义 → 动态向量来适应
-
浅层模型特征有限 → 深层网络来挖掘
今天的大语言模型,本质上还是沿着这条路继续往前走:把词扩展到句子、段落、篇章,把模型规模做大,把训练数据做多,让语义表达更加精准丰富。
理解这些基础的演进逻辑,你就明白了:大模型不是从天而降的魔法,而是一步步解决实际问题的产物。
当你下次听到“语义表达”这个词,希望你能想到:这背后是一代代研究者对“如何让计算机理解语言”这个问题的持续探索,是从“能表示”到“能理解”的漫长进化。
而我写这篇文章的目的,就是希望能帮你理清这条进化路径,让你在面对各种新技术时,能看得更透、想得更深。
通过网盘分享的文件:百面大模型
链接: https://pan.baidu.com/s/10mycZxNYbh1w63onscj4qA?pwd=iqni 提取码: iqni
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)