为什么Bert的三个Embedding可以进行相加?

本文深入探讨BERT模型中三个Embedding(Token、Position、Segment)相加的意义,解析其作为特征交叉而非池化的作用,及如何平衡泛化与个性化表达,提升神经网络的上下文感知能力。

这个问题是知乎的这个问题:为什么Bert的三个Embedding可以进行相加?

我觉得解释合理的是这个回答,这个回答解释的是相加的意义

这里的相加是特征交叉而不是特征池化。

神经网络中相加是构造特征交互的方法,类似的还有elementwise乘,减法。

Bert这类的方法一个极大的优势就是通过BPT和字级别把词向量空间的稀疏性压缩下来,如果你在普通的embedding+nn里做这件事情,是有得有失的,好处是长尾的词变得更稠密了,使网络容易学习,对应的缺点就是损失了学的好的词的个性化。这样的操作更有利于神经网络的泛化。

我们怎么在其中找一个平衡点呢?通过特征的交叉,分别是token,position,segment。高阶的交叉带来更强的个性化表达能力,即带来丰富语义的变化。规避了transformer因为位置信息丢失造成的上下文语义感知能力。既能高速并行,又能上下文敏感,这简直让lstm羡慕死了。

而相加,是神经网络特征交叉的一种形式,注意,多个enbedding的向量空间是不同的,不然,相加和池化就没有区别了,只带来信息的聚合,而不是个性化的表达。

这套方法论起源于因子分解机FM。核心是寻找泛化和记忆的平衡,而搞定长尾是又是解决大部分NLP问题的有效方法。预训练又是另外一大神器,结合这个问题想想为什么ELMo没有取得这么好的效果,不得不不说,太妙了。

其他的回答如苏剑林的回答,回答了为什么可以相加。

现在我们将token,position,segment三者都用one hot表示,然后concat起来,然后才去过一个单层全连接,等价的效果就是三个Embedding相加

 

### BERT模型中的Embedding层含义及作用 在自然语言处理领域,BERT(Bidirectional Encoder Representations from Transformers)模型中的Embedding层是模型输入表示的重要组成部分。Embedding层的作用是将离散的文本数据(如单词或子词单元)转换为连续的向量表示,以便模型能够有效地捕捉语义信息并进行后续的计算。 #### 1. Embedding层的组成 BERT模型中的Embedding层由三部分组成[^1]: - **Token Embedding**:每个输入单词或子词单元对应的向量表示。这部分通过预训练获得,用于捕捉词汇级别的语义信息。 - **Segment Embedding**:用于区分句子对中的不同句子(例如,在句子对分类任务中,标记句子A和句子B)。这有助于模型理解上下文关系。 - **Position Embedding**:由于Transformer架构本身不具有序列顺序的概念,因此需要显式地加入位置信息。Position Embedding为每个输入token提供其在序列中的位置信息。 这三部分的向量表示会被相加,形成最终的输入Embedding表示[^1]。 #### 2. Embedding层的作用 Embedding层的主要作用是将原始的文本数据转换为适合神经网络处理的数值形式。具体来说: - 它将离散的文本符号映射到连续的向量空间,使得模型能够利用这些向量捕捉语义相似性。 - Token Embedding负责表达词汇本身的语义信息,而Position Embedding则确保模型能够感知序列中的顺序关系。 - Segment Embedding帮助模型区分不同的句子,这对于涉及句子对的任务(如问答、自然语言推理)尤为重要。 #### 3. 与传统Embedding方法的区别 相比于传统的静态Embedding方法(如Word2Vec或GloVe),BERTEmbedding层结合了上下文信息,生成的是动态的、基于上下文的词向量表示。这种特性使得BERT能够在不同的语境下为同一个单词生成不同的向量表示。 此外,BERT还引入了Masked Language Model(MLM)等创新机制,进一步增强了模型对语义的理解能力[^2]。 ```python # 示例代码:如何从Hugging Face库加载BERT模型的Embedding层 from transformers import BertModel, BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') text = "Hello, how are you?" tokens = tokenizer(text, return_tensors="pt") embeddings = model.embeddings(input_ids=tokens['input_ids']) print(embeddings) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值