今天想跟大家聊聊自然语言处理(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 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐