轻松理解CBOW模型

引言

前面我分析了Word2vec的一种模型叫做skip-gram模型。在这篇文章中,我将讲述另一个word2vec模型——连续词袋模型(CBOW)模型。如果你理解skip-gram模型,那么接下来的CBOW模型就更好理解了,因为两者模型互为镜像。我们先来看看CBOW模型与skip-gram模型对比图:
word2vec
如何,这是不是镜像关系?所以接下来的讲解也会和skip-gram那篇文章极其类似。

前向传播

接下来我们来看下CBOW神经网络模型,CBOW的神经网络模型与skip-gram的神经网络模型也是互为镜像的
cbownero
在上图中,该模型的输入输出与skip-gram模型的输入输出是相反的。这里输入层是由one-hot编码的输入上下文{ x 1 x_1 x1,…, x C x_C xC}组成,其中窗口大小为C,词汇表大小为V。隐藏层是N维的向量。最后输出层是也被one-hot编码的输出单词 y y y。被one-hot编码的输入向量通过一个 V × N V\times N V×N维的权重矩阵 W W W连接到隐藏层;隐藏层通过一个 N × V N\times V N×V的权重矩阵 W ′ W^{'} W连接到输出层。
接下来,我们假设我们知道输入与输出权重矩阵的大小。

  • 第一步就是去计算隐藏层 h h h的输出。如下:
    h = 1 C W ⋅ ( ∑ i = 1 C x i ) ( 1 ) h = \frac{1}{C}W\cdot (\sum_{i=1}^C x_i)\tag{$1$} h=C1W(i=1Cxi)(1)
    该输出就是输入向量的加权平均。这里的隐藏层与skip-gram的隐藏层明显不同。
  • 第二部就是计算在输出层每个结点的输入。如下:
    u j = v w j ′ T ⋅ h ( 2 ) u_{j}=v^{'T}_{wj}\cdot h\tag{$2$} uj=vwjTh(2)
    其中 v w j ′ T v^{'T}_{wj} vwjT是输出矩阵 W ′ W^{'} W的第 j j j列。
  • 最后我们计算输出层的输出,输出 y j y_j yj如下:
    y c , j = p ( w y , j ∣ w 1 , . . . , w c ) = e x p ( u j ) ∑ j ′ = 1 V e x p ( u ′ j ) ( 3 ) y_{c,j} =p(w_{y,j}|w_1,...,w_c) = \frac{exp(u_{j})}{\sum^V_{j^{'}=1}exp(u^{'}j)}\tag{$3$} yc,j=p(wy,jw1,...,wc)=j=1Vexp(uj)exp(uj)(3)

通过BP(反向传播)算法及随机梯度下降来学习权重

在学习权重矩阵 W W W W ′ W^{'} W过程中,我们可以给这些权重赋一个随机值来初始化。然后按序训练样本,逐个观察输出与真实值之间的误差,并计算这些误差的梯度。并在梯度方向纠正权重矩阵。这种方法被称为随机梯度下降。但这个衍生出来的方法叫做反向传播误差算法。
具体推导步骤就不详写了:

  • 首先就是定义损失函数,这个损失函数就是给定输入上下文的输出单词的条件概率,一般都是取对数,如下所示:
    E = − l o g p ( w O ∣ w I ) ( 4 ) E = -logp(w_O|w_I)\tag{$4$} E=logp(wOwI)(4)
    = − v w o T ⋅ h − l o g ∑ j ′ = 1 V e x p ( v w T j ′ ⋅ h ) ( 5 ) = -v_{wo}^T\cdot h-log\sum_{j^{'}=1}^Vexp(v^T_w{_{j^{'}}}\cdot h)\tag{$5$} =vwoThlogj=1Vexp(vwTjh)(5)
    接下来就是对上面的概率求导,具体推导过程可以去看BP算法,我们得到输出权重矩阵 W ′ W^{'} W的更新规则:
    w ′ ( n e w ) = w i j ′ ( o l d ) − η ⋅ ( y j − t j ) ⋅ h i ( 6 ) w^{'(new)} = w_{ij}^{'(old)}-\eta\cdot(y_{j}-t_{j})\cdot h_i\tag{$6$} w(new)=wij(old)η(yjtj)hi(6)
    同理权重 W W W的更新规则如下:
    w ( n e w ) = w i j ( o l d ) − η ⋅ 1 C ⋅ E H ( 7 ) w^{(new)} = w_{ij}^{(old)}-\eta\cdot\frac{1}{C}\cdot EH\tag{$7$} w(new)=wij(old)ηC1EH(7)

参考文献

[1] Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.(这篇文章就讲了两个模型:CBOW 和 Skip-gram)
[2] Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.(这篇文章针对Skip-gram模型计算复杂度高的问题提出了一些该进)
[3] Presentation on Word2Vec(这是NIPS 2013workshop上Mikolov的PPT报告)

### 大模型中的词嵌入技术及其实现方法 #### 1. 词嵌入技术的核心意义 词嵌入是一种将词汇从离散的符号表示转换为连续向量的技术,其核心在于通过高维空间中的位置关系来表达词语间的语义相似度和关联性[^4]。这种技术使得机器可以更好地理解自然语言数据,并成为现代自然语言处理(NLP)的基础。 #### 2. 常见的词嵌入方法 以下是几种常见的词嵌入技术和其实现方式: ##### 2.1 Word2Vec Word2Vec 是一种由 Google 提出的经典词嵌入算法,主要分为两种模式:CBOW 和 Skip-Gram。该方法基于神经网络的思想,在训练过程中通过对上下文中单词的关系建模,生成固定长度的词向量[^3]。 可以通过 Python 的 Gensim 库轻松实现 Word2Vec 模型: ```python from gensim.models import Word2Vec sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]] model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4) print(model.wv["cat"]) ``` ##### 2.2 GloVe GloVe(Global Vectors for Word Representation)是由斯坦福大学提出的另一种经典词嵌入方法。它通过构建全局共现矩阵并对其进行低秩分解,得到每个词的向量表示。相比 Word2Vec 更注重于统计特性而非局部上下文依赖。 虽然 GloVe 不像 Word2Vec 那样直接支持动态更新,但在某些场景下表现更优。可借助 `gensim` 或者原生工具包完成 GloVe 训练过程。 ##### 2.3 FastText FastText 是 Facebook 推出的一个扩展版本,不仅考虑单个字面含义还兼顾子字符特征提取功能。这使其特别适合多语言环境或者稀疏词汇表情况下的任务需求。同样也可以利用开源框架快速部署: ```python from gensim.models import FastText corpus = [['this', 'is', 'a', 'sentence'], ['another', 'example']] ft_model = FastText(corpus, vector_size=100, window=5, min_count=1, epochs=10) print(ft_model.wv['example']) ``` ##### 2.4 BERT 及 Transformer 类模型 随着深度学习的发展,预训练语言模型逐渐占据主导地位。其中最具代表性的当属 BERT (Bidirectional Encoder Representations from Transformers),这是一种双向编码器结构,采用自注意力机制捕获长距离依赖关系,进而生成更加精准且具有上下文感知特性的词嵌入[^2]。下面展示了一个简单的例子说明如何加载 Hugging Face 提供的预训练权重文件用于下游微调操作: ```python from transformers import BertTokenizer, BertModel import torch tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') text = "Replace me by any text you'd like." encoded_input = tokenizer(text, return_tensors='pt') output = model(**encoded_input) last_hidden_states = output.last_hidden_state print(last_hidden_states.shape) # 输出形状应类似于 [batch size, sequence length, hidden dimension] ``` #### 3. 在大模型中的实际应用 对于超大规模的语言模型而言,传统的静态词嵌入已经无法满足日益增长的需求。因此当前主流做法是结合动态调整策略与高效计算资源共同打造端到端解决方案。例如 OpenAI 开发的 GPT 系列产品就是典型实例之一;而阿里巴巴达摩院推出的 M6 则进一步探索了跨模态领域内的可能性边界[^1]。 #### 4. 总结 综上所述,无论是早期经典的无监督学习路径还是如今依托强大算力支撑起来的高度定制化方案,每种类型的词嵌入都有各自适用范围及局限之处。研究者们正不断尝试突破现有瓶颈并向更高层次迈进——即让计算机真正具备人类般灵活自如的语言交流能力!
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roaring Kitty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值