一、CBOW模型图
CBOW模型是一种基于神经网络的词向量表示学习方法。CBOW模型的结构如下图所示:
<svg width="550" height="200">
<rect x="10" y="10" width="100" height="30" fill="#c7fffa" />
<rect x="130" y="10" width="100" height="30" fill="#c7fffa" />
<rect x="250" y="10" width="100" height="30" fill="#c7fffa" />
<rect x="370" y="10" width="100" height="30" fill="#c7fffa" />
<rect x="490" y="10" width="50" height="30" fill="#c7fffa" />
<rect x="10" y="70" width="100" height="30" fill="#c7fffa" />
<rect x="130" y="70" width="100" height="30" fill="#c7fffa" />
<rect x="250" y="70" width="100" height="30" fill="#c7fffa" />
<rect x="370" y="70" width="100" height="30" fill="#c7fffa" />
<rect x="490" y="70" width="50" height="30" fill="#c7fffa" />
<line x1="60" y1="40" x2="130" y2="40" stroke="black" stroke-width="1" />
<line x1="180" y1="40" x2="250" y2="40" stroke="black" stroke-width="1" />
<line x1="300" y1="40" x2="370" y2="40" stroke="black" stroke-width="1" />
<line x1="420" y1="40" x2="490" y2="40" stroke="black" stroke-width="1" />
<polyline points="25,80 90,80 90,100 60,100 60,110 90,110 90,130 25,130" fill="#c7fffa" />
<polyline points="145,80 210,80 210,100 180,100 180,110 210,110 210,130 145,130" fill="#c7fffa" />
<polyline points="265,80 330,80 330,100 300,100 300,110 330,110 330,130 265,130" fill="#c7fffa" />
<polyline points="385,80 450,80 450,100 420,100 420,110 450,110 450,130 385,130" fill="#c7fffa" />
<line x1="515" y1="80" x2="540" y2="80" stroke="black" stroke-width="1" />
<line x1="515" y1="95" x2="540" y2="95" stroke="black" stroke-width="1" />
<line x1="515" y1="110" x2="540" y2="110" stroke="black" stroke-width="1" />
<line x1="515" y1="125" x2="540" y2="125" stroke="black" stroke-width="1" />
<text x="45" y="25">w(t-2)</text>
<text x="165" y="25">w(t-1)</text>
<text x="285" y="25">w(t+1)</text>
<text x="405" y="25">w(t+2)</text>
<text x="525" y="25">w(t)</text>
<text x="57" y="103">w(t-2)</text>
<text x="177" y="103">w(t-1)</text>
<text x="297" y="103">w(t+1)</text>
<text x="417" y="103">w(t+2)</text>
<text x="527" y="103">→</text>
<text x="150" y="160">Embedding Layer</text>
<text x="320" y="160">Sum Layer</text>
<text x="510" y="160">Softmax Layer</text>
</svg>
CBOW模型的输入是一个固定大小的窗口,将上下文中的词表示成向量,向量之间进行加和或者平均操作,其输出则是中心词的概率分布。模型的学习目标是最大化训练数据中每个样本中间词对应的概率。
二、CBOW模型公式
CBOW模型可以表示成以下的式子:
p(w_t | w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}) = softmax\left(\frac{1}{C}\sum_{-C\le j \le C,j\ne 0}\textbf{v}_{t+j}\right)
其中,$w_t$表示中心词,$\textbf{v}_{t}$表示第$t$个词的词向量,$C$表示上下文窗口大小,$softmax(x_i)=\frac{e^{x_i}}{\sum_{j}e^{x_j}}$是softmax函数。
三、CBOW模型详解
1. 输入层
输入层将上下文中的每个词对应的词向量相加或者平均,然后送入下一层。
2. Embedding层
该层是一个映射层,将每个输入的词向量映射到一个低维的空间中,这个空间是可以通过训练来优化的。该层的参数是每个词的词向量表示,是模型需要学习的目标之一。
3. Sum层
该层将每个词的Embedding向量进行累加(或者平均),然后输出中心词的向量表示。
4. Softmax层
该层接收Sum层的输出,将其映射为一个概率分布,分布的每个元素表示中心词为该元素对应的单词的概率。
四、CBOW模型训练词向量的过程
CBOW模型和skip-gram模型都是基于神经网络的词向量表示学习方法,其中训练词向量的过程是一样的。以CBOW模型为例,训练的流程如下:
1. 数据准备
准备好原始的文本数据,然后将其转化为词汇表并统计词频。在CBOW模型中,需要一个固定大小的窗口,即上下文的词数(一般设置为3-5),然后将这个窗口作为一个样本。
2. 初始化参数
首先,要将训练数据中的每个词映射到一个低维空间中,使得该空间中的向量可以表示这些词的语义含义。这样做的一个目的是在低维空间中保留语义上的相似性。通常来说,这个低维空间的维度在几百到几千之间,这个维度也称为向量的长度或者特征数。初始参数可以随机生成。
3. 迭代训练
CBOW模型的训练过程是迭代的,对于每个样本,模型将预测中心词的概率最大化。这个最大化的过程可以用最小化negative log likelihood来实现:
-log p(w_c|w_o) = -log \frac{e^{u_c^T v_o}}{\sum_{w\in vocab} e^{u_w^T v_o}} = - u_c^T v_o + log \sum_{w \in vocab}e^{u_w^T v_o}
其中,$u_c$表示中心词,$v_o$表示上下文中的一个词,$vocab$表示整个词汇表。通过梯度下降法来最小化negative log likelihood,同时更新参数。
五、CBOW模型和skipgram的区别
两者的区别在于输入和输出的不同。在CBOW模型中,输入是上下文中的多个词,输出是中心词的概率分布。而skipgram模型中,输入是中心词,输出是上下文中多个词的概率分布。因此,两者是对称的。
另外,CBOW模型的训练速度比skipgram快,但在大型语料库上表现可能会略逊于skipgram模型。