【万字长文】Word2Vec计算详解(一)CBOW模型
【万字长文】Word2Vec计算详解(一)CBOW模型
写在前面
本文用于记录本人学习NLP过程中,学习Word2Vec部分时的详细过程,本文与本人写的其他文章一样,旨在给出Word2Vec模型中的详细计算过程,包括每个模块的计算过程,模块形状变化等,最后给出了Word2Vec的两种优化方法----负采样与分层(层次)Softmax,下面开始介绍。
写到一半时发现字数过多,需要拆分文章QAQ,那就分层三期把,分别介绍CBOW模型,Skip-gram模型,和优化部分。
【万字长文】Word2Vec计算详解(一)CBOW模型 markdown行 9000+
【万字长文】Word2Vec计算详解(二)Skip-gram模型 markdown行 12000+
【万字长文】Word2Vec计算详解(三)分层Softmax与负采样 markdown行 18000+
背景
在自然语言处理(NLP)领域,理解和表示单词之间的语义关系是一个长期存在的问题。传统上,这一挑战通过诸如one-hot编码等简单方法来解决。
one-hot局限性
1. one-hot向量是高维稀疏向量: \textbf{one-hot向量是高维稀疏向量:} one-hot向量是高维稀疏向量:
在one-hot编码中,每个单词都被表示为一个非常长的向量,这个向量的长度等于词汇表中的单词总数。在这个向量中,表示当前单词的位置被标记为1,其余位置均为0。这种表示方法导致了极高的维度和稀疏性。例如,如果词汇表包含10,000个单词,每个单词就会被表示为一个有10,000个元素的向量,其中只有一个元素是1,其余都是0。
2. 无法捕获词之间的语义相似性: \textbf{无法捕获词之间的语义相似性:} 无法捕获词之间的语义相似性:
由于每个单词的向量在只有一个维度上有值,而其他所有维度均为零,因此任何两个不同的单词的向量之间的距离(无论是欧氏距离、余弦相似性还是其他度量)都是相同的。这意味着one-hot编码无法表达单词间的语义关系或相似性。例如,“狗”和“猫”在现实世界中具有较高的语义相似性,因为它们都是宠物,但在one-hot编码中,它们之间的距离与“狗”和“冰箱”之间的距离完全相同。
3. 无法利用上下文信息: \textbf{无法利用上下文信息:} 无法利用上下文信息:
one-hot编码仅仅关注单词的标识,忽略了单词在句子中的上下文环境。单词的语义往往依赖于其使用的上下文,但是one-hot编码无法捕捉这种依赖关系。
随后,更复杂的统计方法被开发出来,用于解决one-hot向量出现的问题 (待补充 o n e − h o t 到 W o r d 2 V e c 之间的一些统计方法 \textcolor{red}{(待补充one-hot到Word2Vec之间的一些统计方法} (待补充one−hot到Word2Vec之间的一些统计方法。这些方法旨在通过分析词在大量文本中的共现信息来推断词义,但这些方法往往计算量大,效率低,且仍然难以充分捕捉词义的丰富性。
常用的两种Word2Vec模型
2013年,Google开源了一款用于词向量计算的工具——Word2Vec,引起了工业界和学术界的关注。首先,Word2Vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。Word2Vec算法或模型,其实指的是其背后用于计算word vector的 CBOW 模型和 Skip-gram 模型。Word2Vec 利用浅层神经网络从大量文本中学习低维且密集的词向量表示,这些向量能够有效地捕捉词之间的语义和语法关系。与之前的方法相比,Word2Vec 不仅提高了表示的质量,还显著提升了训练速度和效率。Word2Vec 通过提供一种高效、有效的词表示方法,解决了长期存在的词义表示问题,其影响深远,不仅改进了词义的捕捉能力,也为 NLP 的进一步研究和应用开辟了新的道路。下面将具体介绍 Word2Vec 中的两个模型。
CBOW模型
CBOW(continuous bag-of-words) \textbf{CBOW(continuous bag-of-words)} CBOW(continuous bag-of-words)模型的核心思想是利用一个词的上下文(即周围的词)来预测这个词本身。在自然语言处理(NLP)领域,理解单词的含义常常需要考虑其上下文,因为上下文提供了关于单词用法和语义的重要线索。
模型结构
CBOW模型的输入是上下文文本单词的one-hot向量,通过线性变换压缩成一个单词向量,然后再通过一次线性变换得到一个单词得分表,最后经过多分类得到要预测的单词。CBOW的模型结构如图下所示。
预处理
在正式介绍模型输入前,需要简单介绍模型输入前的处理。给定一个语料库 text,我们要将其处理成能够用于模型输入的 one-hot 向量。首先去重,然后将单词与标点符号按读入顺序放入集合corpus,并另外存储一份单词与索引直接查询的字典:word_to_id 和 id_to_word。参考代码程序见附录Word2Vec(一)中的preprocess函数。
随后是将单词集合corpus也就是词汇表Vocabulary转换为 one-hot 表示,具体函数如附录Word2Vec(一)中的convert_one_hot函数。
其中 corpus是单词集合,vocab_size 是单词集合的大小也就是 len(corpus)。这样我们得到了语料库的 one-hot编码。
模型输入
在模型中,将一个词的上下文词表示为独热编码(one-hot encoding)向量然后并作为模型的一个输入。上下文的词的多少取决于窗口大小 C C C,例如当窗口大小为2时,上下文为目标单词的前两个词和后两个词,共4个词。于是我们的输入
X = ( x i − c , x i − c + 1 , … , x i − 1 , x i + 1 , … , x i + c ) ∈ R V × 2 C X = (x_{i-c}, x_{i-c + 1}, \dots, x_{i - 1}, x_{i + 1}, \dots, x_{i + c}) \in \mathbb{R}^{V \times 2C} X=(xi−c,xi−c+1,…,xi−1,xi+1,…,xi+c)∈RV×2C
其中, x i x_i xi为目标单词,其中 x i ∈ R V × 1 x_i \in \mathbb{R}^{V \times 1} xi∈RV×1, X X X 。例如,目标单词索引 i i i为 3 3 3时且窗口大小为 2 2 2时, X = ( x 1 , x 2 , x 4 , x 5 ) X = (x_1, x_2, x_4, x_5) X=(x1,x2,x4,x5)。
权重输入层
在这一层,我们将目标单词 x i x_i xi的上下文的 one-hot 编码与隐藏层的权重输入矩阵 W W W 相乘再加上置偏值 b ∈ R D × 1 b \in \mathbb{R}^{D \times 1} b∈RD×1 得到 x j ′ x_j' xj′,即 X j ′ = W X j + b X_j' = W X_j + b Xj′=WXj+b, 其中 x j ′ ∈ R D × 1 x_j' \in \mathbb{R}^{D \times 1} xj′∈RD×1, j = ( i − C , i − C + 1 , … , i − 1 , i + 1 , … , i + C ) j = (i-C,i-C+1,\dots,i-1,i+1,\dots,i+C) j=(i−C,i−C+1,…,i−1,i+1,…,i+C)。写成矩阵的形式为
X ′ = W X + b X' = WX+b X′=WX+b
其中, X = [ x i − C , x i − C + 1 , … , x i − 1 , x i + 1 , … , x i + C ] X = [x_{i-C}, x_{i-C+1},\dots,x_{i-1}, x_{i+1},\dots, x_{i+C}] X=[xi−C,xi−C+1,…,xi−1,xi+1,…,xi+C], X ′ = [ x i − C ′ , x i − C + 1 ′ , … , x i − 1 ′ , x i + 1 ′ , … , x i + C ′ ] X' = [x_{i-C}', x_{i-C+1}',\dots,x_{i-1}', x_{i+1}',\dots, x_{i+C}'] X′=[xi−C′,xi−C+1′,…,xi−1′,xi+1′,…,xi+C′]。
加权平均层
我们将输入层得到的所有 X j ′ X_j' Xj′ 进行加权平均得到 h h h。
h = ∑ j = i − C , j ≠ i i + C x j ′ = 1 2 C ( x i − C ′ + … x i − 1 ′ + x i + 1 ′ + ⋯ + x i + C ′ ) h = \sum\limits^{i+C}_{j = i-C,j \ne i} x_j'= \frac{1}{2C}(x_{i-C}' + \dots x_{i - 1}' + x_{i + 1}' + \dots + x_{i + C}') h=j=i−C,j=i∑i+Cxj′=2C1(xi−C′+…xi−1′+xi+1′+⋯+xi+C′)
其中 C C C 是窗口大小, h ∈ R D × 1 h \in \mathbb{R}^{D \times 1} h∈RD×1。写成矩阵的形式为
h = 1 2 C X ′ j ⃗ h = \frac{1}{2C} X'\vec{j} h=2C1X′j
其中 j ⃗ = [ 1 , 1 , … , 1 , 1 ] \vec{j}=[1,1,\dots,1,1] j=[1,1,…,1,1]为 2 C 2C 2C行 1 1 1列的向量。
权重输出层
我们将得到 h h h 与隐藏层的权重输出矩阵 W ′ W' W′ 相乘再加上置偏值 b ′ ∈ R V × 1 b'\in \mathbb{R}^{V \times 1} b′∈RV×1 得到每个单词得分的向量 P P P。 P = ( P 1 , P 2 , … , P V ) T P = ( P_1, P_2, \dots, P_V)^T P=(P1,P2,…,PV)T, P i ∈ R P_i \in R Pi∈R 表示为位置索引为 i i i 处的单词的得分。 P ∈ R V × 1 P \in \mathbb{R}^{V \times 1} P∈RV×1。写成矩阵的形式为
P = W ′ h + b ′ P = W'h + b' P=W′h+b′
Softmax层
我们将输出层得到的的得分用 Softmax 处理为概率 P ′ P' P′。 P ′ = ( p 1 ′ , p 2 ′ , … , p V ′ ) T P' = (p_1', p_2', \dots, p_V')^T P′=(p1′,p2′,…,pV′)T, p i ′ p_i' pi′ 表示位置索引为 i i i 处的单词的概率。其中 P ′ ∈ R V × 1 P' \in \mathbb{R}^{V \times 1} P′∈RV×1。计算公式如下所示。
p i ′ = softmax ( p i ) = exp ( p i ) ∑ k = 1 V exp ( p k ) p_i' = \text{softmax}(p_i) = \frac{\exp(p_i)}{ \sum\limits_{k=1}^{V} \exp(p_k)} pi′=softmax(pi)=k=1∑Vexp(pk)exp(pi)
其中 P = ( p 1 , p 2 , … , p V ) T P = ( p_1, p_2, \dots, p_V)^T P=(p1,p2,…,pV)T, p i p_i pi 为 P P P 中的某一项。 P ′ = ( p 1 ′ , p 2 ′ , … , p V ′ ) T P' = (p_1', p_2', \dots, p_V')^T P′=(p1′,p2′,…,pV′)T, p i ′ p_i' pi′ 为 P ′ P' P′ 中的某一项。
模型输出
模型的输出是在 P ′ P' P′ 中取出最大概率对应位置的值设为1,其他位置设置为0,我们将得到一个one-hot编码。从该one-hot编码我们可以找到对应的单词,我们将其作为预测结果单词。这就是CBOW模型的输出。
简单的CBOW例子
下面给定一个例子来解释 CBOW 模型的计算。假设语料库为 text = 'The cat plays in the garden, and the cat chases the mouse in the garden.'我们使用预处理给处给出的函数 preprocess 和 convert_one_hot 进行处理,分别得到以下结果。
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
x i x_i xi | x 0 x_0 x0 | x 1 x_1 x1 | x 2 x_2 x2 | x 3 x_3 x3 | x 4 x_4 x4 | x 5 x_5 x5 | x 6 x_6 x6 | x 7 x_7 x7 | x 8 x_8 x8 | x 9 x_9 x9 |
word | the | cat | plays | in | garden | , | and | chases | mouse | . |
preprocess 函数得到后的结果(词汇表)
由上表展示了词汇表的信息,我们得到词汇表的大小 V = 10 V = 10 V=10。下面是 转换得到的one-hot矩阵我们标记其为 X X X。 X X X 中对应的一列为相应索引单词的 one-hot向量,即用 x i x_i xi表示该索引位置为 i i i 的one-hot向量。例如 x i = ( 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) x_i=(0,1,0,0,0,0,0,0,0) xi=(0,1,0,0,0,0,0,0,0) 代表“the”。
X o n e h o t = ( x 0 , x 1 , x 2 , x 3 , x 4 , x 5 , x 6 , x 7 , x 8 , x 9 ) [ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 ] X_{onehot} = (x_0, x_1, x_2,x_3,x_4,x_5,x_6, x_7,x_8,x_9) \begin{bmatrix} 1&0&0&0&0&0&0&0&0&0\\ 0&1&0&0&0&0&0&0&0&0\\ 0&0&1&0&0&0&0&0&0&0\\ 0&0&0&1&0&0&0&0&0&0\\ 0&0&0&0&1&0&0&0&0&0\\ 0&0&0&0&0&1&0&0&0&0\\ 0&0&0&0&0&0&1&0&0&0\\ 0&0&0&0&0&0&0&1&0&0\\ 0&0&0&0&0&0&0&0&1&0\\ 0&0&0&0&0&0&0&0&0&1 \end{bmatrix} Xonehot=(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9) 1000000000010000000000100000000001000000000010000000000100000000001000000000010000000000100000000001
我们假设窗口大小 C = 2 C = 2 C=2,隐藏层的维数 D = 4 D = 4 D=4 ,并且要给定 “plays” 的上下文进行预测。我们可以得到模型输入是 x 0 x_0 x0 , x 1 x_1 x1 , x 3 x_3 x3 , x 0 x_0 x0,对应单词分别为 the、cat、in、the。则 X = ( x 0 , x 1 , x 3 , x 0 ) X = (x_0, x_1, x_3, x_0) X=(x0,x1,x3,x0),在下方展示。 我们对输入权重权重矩阵 W W W 进行初始化, W W W初始值是 [ 0 , 1 ) [0,1) [0,1)之间的随机数,包含0,不包含1。
X = ( x 0 , x 1 , x 3 , x 0 ) = [ 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] , b = [ 0.0513 − 1.1577 0.8167 0.4336 ] X = (x_0, x_1, x_3, x_0) = \begin{bmatrix} 1&0&0&1\\ 0&1&0&0\\ 0&0&0&0\\ 0&0&1&0\\ 0&0&0&0\\ 0&0&0&0\\ 0&0&0&0\\ 0&0&0&0\\ 0&0&0&0\\ 0&0&0&0 \end{bmatrix} , b = \begin{bmatrix} 0.0513 \\ -1.1577\\ 0.8167 \\ 0.4336 \end{bmatrix} X=(x0,x1,x3,x0)= 1000000000010000000000010000001000000000 ,b= 0.0513−1.15770.81670.4336
W = [ − 0.2047 0.4789 − 0.5194 − 0.5557 1.9657 1.3934 0.0929 0.2817 0.769 1.2464 1.0071 − 1.2962 0.2749 0.2289 1.3529 0.8864 − 2.0016 − 0.3718 1.669 − 0.4385 − 0.5397 0.4769 3.2489 − 1.0212 − 0.577 0.1241 0.3026 0.5237 0.0009 1.3438 − 0.7135 − 0.8311 − 2.3702 − 1.8607 − 0.8607 0.5601 − 1.2659 0.1198 − 1.0635 0.3328 ] W = \begin{bmatrix} -0.2047 & 0.4789 & -0.5194 & -0.5557 & 1.9657 & 1.3934 & 0.0929 & 0.2817 & 0.769 & 1.2464\\ 1.0071 & -1.2962 & 0.2749 & 0.2289 & 1.3529 & 0.8864 & -2.0016 & -0.3718 & 1.669 & -0.4385\\ -0.5397 & 0.4769 & 3.2489 & -1.0212 & -0.577 & 0.1241 & 0.3026 & 0.5237 & 0.0009 & 1.3438\\ -0.7135 & -0.8311 & -2.3702 & -1.8607 & -0.8607 & 0.5601 & -1.2659 & 0.1198 & -1.0635 & 0.3328 \end{bmatrix} W= −0.20471.0071−0.5397−0.71350.4789−1.29620.4769−0.8311−0.51940.27493.2489−2.3702−0.55570.2289−1.0212−1.86071.96571.3529−0.577−0.86071.39340.88640.12410.56010.0929−2.00160.3026−1.26590.2817−0.37180.52370.11980.7691.6690.0009−1.06351.2464−0.43851.34380.3328
接下来是权重输入层的运算。我们将 W W W 与 X X X 进行矩阵乘法运算再加上置偏值 b b b,计算得到 X ′ X' X′。
X ′ = W X + b = [ − 0.1533 0.5302 − 0.5043 − 0.1533 − 0.1506 − 2.4539 − 0.9288 − 0.1506 0.277 1.2936 − 0.2044 0.277 − 0.2798 − 0.3974 − 1.427 − 0.2798 ] X' = WX + b = \begin{bmatrix} -0.1533 & 0.5302 & -0.5043 & -0.1533\\ -0.1506& -2.4539 & -0.9288& -0.1506\\ 0.277 & 1.2936 & -0.2044 & 0.277 \\ -0.2798 & -0.3974 & -1.427 & -0.2798 \end{bmatrix} X′=WX+b= −0.1533−0.15060.277−0.27980.5302−2.45391.2936−0.3974−0.5043−0.9288−0.2044−1.427−0.1533−0.15060.277−0.2798
接下来进行加权平均层的计算,也就是将 X ′ X' X′每行中的 4 4 4个值进行相加,得到 4 × 1 4 \times 1 4×1 的向量 h h h 。
h = 1 4 X ′ = 1 4 [ − 0.1533 + 0.5302 − 0.5043 − 0.1533 − 0.1506 − 2.4539 − 0.9288 − 0.1506 0.277 + 1.2936 − 0.2044 + 0.277 − 0.2798 − 0.3974 − 1.427 − 0.2798 ] = [ − 0.0701 − 0.9209 0.4108 − 0.596 ] h = \frac{1}{4} X' = \frac{1}{4} \begin{bmatrix} -0.1533 + 0.5302 - 0.5043 - 0.1533\\ -0.1506 - 2.4539 -0.9288 -0.1506 \\ 0.277 + 1.2936 - 0.2044 + 0.277\\ -0.2798 -0.3974 -1.427 -0.2798 \end{bmatrix} = \begin{bmatrix} -0.0701\\ -0.9209\\ 0.4108\\ -0.596 \end{bmatrix} h=41X′=41 −0.1533+0.5302−0.5043−0.1533−0.1506−2.4539−0.9288−0.15060.277+1.2936−0.2044+0.277−0.2798−0.3974−1.427−0.2798 = −0.0701−0.92090.4108−0.596
接下来是权重输出层。我们将 W ′ W' W′ 进行初始化。然后进行运算 W ′ h W'h W′h,然后再加上置偏值 b ′ b' b′ 得到评分 P P P。
W ′ = [ − 2.3594 − 0.1995 − 1.5419 − 0.9707 − 1.307 0.2863 0.3779 − 0.7538 0.3312 1.3497 0.0698 0.2466 − 0.0118 1.0048 1.3271 − 0.9192 − 1.5491 0.0221 0.7583 − 0.6605 0.8625 − 0.01 0.05 0.6702 0.8529 − 0.9558 − 0.0234 − 2.3042 − 0.6524 − 1.2183 − 1.3326 1.0746 0.7236 0.69 1.0015 − 0.503 − 0.6222 − 0.9211 − 0.7262 0.2228 ] , b ′ = [ 1.0107 1.8248 − 0.9975 0.85059 − 0.1315 0.9124 0.1882 2.1694 − 0.1149 2.0037 ] W' =\begin{bmatrix} -2.3594 & -0.1995 & -1.5419 & -0.9707\\ -1.307 & 0.2863 & 0.3779 & -0.7538\\ 0.3312 & 1.3497 & 0.0698 & 0.2466\\ -0.0118 & 1.0048 & 1.3271 & -0.9192\\ -1.5491 & 0.0221 & 0.7583 & -0.6605\\ 0.8625 & -0.01 & 0.05 & 0.6702\\ 0.8529 & -0.9558 & -0.0234 & -2.3042\\ -0.6524 & -1.2183 & -1.3326 & 1.0746\\ 0.7236 & 0.69 & 1.0015 & -0.503 \\ -0.6222 & -0.9211 & -0.7262 & 0.2228 \end{bmatrix}, b' = \begin{bmatrix} 1.0107\\ 1.8248\\ -0.9975\\ 0.85059 \\ -0.1315\\ 0.9124\\ 0.1882\\ 2.1694\\ -0.1149 \\ 2.0037 \end{bmatrix} W′= −2.3594−1.3070.3312−0.0118−1.54910.86250.8529−0.65240.7236−0.6222−0.19950.28631.34971.00480.0221−0.01−0.9558−1.21830.69−0.9211−1.54190.37790.06981.32710.75830.05−0.0234−1.33261.0015−0.7262−0.9707−0.75380.2466−0.9192−0.66050.6702−2.30421.0746−0.5030.2228 ,b′= 1.01071.8248−0.99750.85059−0.13150.91240.18822.1694−0.11492.0037
P = W ′ h + b ′ = [ 1.0107 1.8248 − 0.9975 0.8505 − 0.1315 0.9124 0.1882 2.1694 − 0.1149 2.0037 ] P = W'h + b' = \begin{bmatrix} 1.0107 \\ 1.8248 \\ -0.9975 \\ 0.8505 \\ -0.1315\\ 0.9124 \\ 0.1882 \\ 2.1694 \\ -0.1149 \\ 2.0037 \end{bmatrix} P=W′h+b′= 1.01071.8248−0.99750.8505−0.13150.91240.18822.1694−0.11492.0037
接下来是 Softmax 层,计算公式如下公式所示,计算过程如下:
P ′ = S o f t m a x ( P ) = P ∑ k = 1 V exp ( P k ) = [ e 1.0107 e 1.8248 e − 0.9975 e 0.8505 e − 0.1315 e 0.9124 e 0.1882 e 2.1694 e − 0.1149 e 2.0037 ] T e 1.0107 + e 1.8248 + e − 0.9975 + e 0.8505 + e − 0.1315 + e 0.9124 + e 0.1882 + e 2.1694 + e − 0.1149 + e 2.0037 = [ 0.0714 0.185 0.0017 0.0536 0.0375 0.0313 0.2076 0.1661 0.0177 0.2276 ] T P' = Softmax(P) = \frac{P}{\sum\limits_{k=1}^{V} \exp(P_k)} = \frac{ \begin{bmatrix} e^{1.0107} & e^{1.8248} & e^{-0.9975}& e^{0.8505} & e^{-0.1315} & e^{0.9124}& e^{0.1882} & e^{2.1694}& e^{-0.1149} & e^{2.0037} \end{bmatrix}^T}{e^{1.0107} + e^{1.8248} + e^{-0.9975}+ e^{0.8505} + e^{-0.1315} + e^{0.9124} + e^{0.1882} + e^{2.1694} + e^{-0.1149} + e^{2.0037}} = \begin{bmatrix} 0.0714 & 0.185 & 0.0017 & 0.0536 & 0.0375 & 0.0313 & 0.2076 & 0.1661 & 0.0177 & 0.2276 \end{bmatrix}^T P′=Softmax(P)=k=1∑Vexp(Pk)P=e1.0107+e1.8248+e−0.9975+e0.8505+e−0.1315+e0.9124+e0.1882+e2.1694+e−0.1149+e2.0037[e1.0107e1.8248e−0.9975e0.8505e−0.1315e0.9124e0.1882e2.1694e−0.1149e2.0037]T=[0.07140.1850.00170.05360.03750.03130.20760.16610.01770.2276]T
根据 P ′ P' P′,我们了解到概率最大的值为 0.2276 0.2276 0.2276,也就是索引位置在 9 9 9位置的单词,对应的one-hot向量为 [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] T [0,0,0,0,0,0,0,0,0,1]^T [0,0,0,0,0,0,0,0,0,1]T,也就是单词 “.”(句号)。于是我们输出预测的单词是 “.”(句号)。
下面依据上面模型结构中的例子继续,用来解释损失函数的计算。
损失函数
损失函数是在 CBOW 模型结构中的 CrossEntropyError 模块中,意为计算交叉熵损失。交叉熵损失的计算公式会在下面展示。CrossEntropyError 的输入是 Softmax 层计算得到的概率向量 P ′ P' P′,和正确的监督标签 T T T ,其中 P ′ = ( P 1 ′ , P 2 ′ , … , P V ) T P' = (P_1', P_2', \dots, P_V)^T P′=(P1′,P2′,…,PV)T,正确的监督标签 T = ( t 1 , t 2 , … , t V ) T T = (t_1, t_2, \dots, t_V)^T T=(t1,t2,…,tV)T 就是正确答案单词的 one-hot 向量。
Loss = − ∑ i = 1 V t i log ( P i ′ ) \text{Loss} = - \sum_{i = 1}^{V} t_i\log(P_i') Loss=−i=1∑Vtilog(Pi′)
这里我们可以直观地进行理解,one-hot 向量在正确的索引位置上才是 1 ,其他位置都是 0 ,那么上面的公式表示提取出正确答案的概率,由于输出是概率,取值值在 [0,1]之间,在使用 log 函数的时候得到值是负的,而且概率越高,log 后的值越大,取负号可以很好的表示损失。
小结
CBOW 模型训练的基本步骤包括:
1.将上下文词进行 one-hot 表征作为模型的输入
X = ( x i − C , x i − C + 1 , … , x i − 1 , x i , … , x i + C − 1 , x i + C ) ∈ R V × 2 C X = (x_{i-C},x_{i-C+1},\dots, x_{i-1}, x_{i}, \dots, x_{i+C-1}, x_{i+C})\in \mathbb{R}^{V \times 2C} X=(xi−C,xi−C+1,…,xi−1,xi,…,xi+C−1,xi+C)∈RV×2C
其中 i i i为目标单词的位置词 , C C C为上下文单词数量, V V V为汇表的维度;
2.然后将所有上下文词汇的 one-hot 向量分别乘以权重输入层的权重输入矩阵 W ∈ R D × V W \in \mathbb{R}^{D \times V} W∈RD×V 在加上置偏值 b b b得到加权平均层输入 X ′ ∈ R V × 2 C X' \in \mathbb{R}^{V \times 2C} X′∈RV×2C,即
X ′ = W X + b X' = WX + b X′=WX+b
3.将上一步得到的 X ′ X' X′,对各个列向量 x i x_i xi相加取平均作为隐藏层向量 h ∈ R D × 1 h \in \mathbb{R}^{D \times 1} h∈RD×1,即
h = 1 2 C X ′ j ⃗ h = \frac{1}{2C} X'\vec{j} h=2C1X′j
其中 D D D 为隐藏层的维数, j ⃗ = [ 1 , 1 , … , 1 , 1 ] \vec{j}=[1,1,\dots,1,1] j=[1,1,…,1,1]为 2 C 2C 2C行 1 1 1列的向量。
4.随后将隐藏层向量 h h h 乘以隐藏层到输出层的权重 W ′ W' W′再加上置偏值 b ′ b' b′得到单词得分向量 P ∈ R V × 1 P \in \mathbb{R}^{V \times 1} P∈RV×1,即
P = W ′ h + b ′ P = W'h + b' P=W′h+b′
5.将计算得到的得分向量 P P P通过 Softmax 激活处理得到 V V V 维的概率分布 P ′ ∈ R V × 1 P' \in \mathbb{R}^{V \times 1} P′∈RV×1,即
P ′ = Softmax ( P ) P' = \text{Softmax}(P) P′=Softmax(P)
6.通过概率分布取概率最大的索引作为预测的目标词。通过概率分布和one-hot 监督标签用交叉熵损失计算损失。
我们的目标是通过梯度下降让损失函数变小,使模型学习到如何根据上下文的信息推断出最可能的目标词,训练结束得到的 W W W 或 W ′ W' W′ 作为训练的副产物就是我们的词向量(矩阵)。
附录
预处理的参考程序代码
def preprocess(text):text = text.lower()text = text.replace('.', ' .')text = text.replace(',', ' ,')text = text.replace('!', ' !')words = text.split(' ')word_to_id = {}id_to_word = {}for word in words:if word not in word_to_id:new_id = len(word_to_id)word_to_id[word] = new_idid_to_word[new_id] = wordcorpus = np.array([word_to_id[w] for w in words])return corpus, word_to_id, id_to_word
预处理转换为one-hot表示程序代码
def convert_one_hot(corpus, vocab_size): N = corpus.shape[0] if corpus.ndim == 1:one_hot = np.zeros((N, vocab_size), dtype=np.int32)for idx, word_id in enumerate(corpus):one_hot[idx, word_id] = 1 elif corpus.ndim == 2:C = corpus.shape[1]one_hot = np.zeros((N, C, vocab_size), dtype=np.int32)for idx_0, word_ids in enumerate(corpus):for idx_1, word_id in enumerate(word_ids):one_hot[idx_0, idx_1, word_id] = 1 return one_hot
其中 corpus是单词集合,vocab_size 是单词集合的大小也就是 len(corpus)。
相关文章:

【万字长文】Word2Vec计算详解(一)CBOW模型
【万字长文】Word2Vec计算详解(一)CBOW模型 写在前面 本文用于记录本人学习NLP过程中,学习Word2Vec部分时的详细过程,本文与本人写的其他文章一样,旨在给出Word2Vec模型中的详细计算过程,包括每个模块的计…...
React Native源码学习
核心组件 基础组件:View、Text、Image、TextInput、ScrollView(性能没有FlatList好,因为它会一次性把子元素渲染出来)、StyleSheet交互组件:button列表视图:FlatList(优先渲染屏幕上可见的元素&…...

【计网】从零开始认识https协议 --- 保证安全的网络通信
在每个死胡同的尽头, 都有另一个维度的天空, 在无路可走时迫使你腾空而起, 那就是奇迹。 --- 廖一梅 --- 从零开始认识https协议 1 什么是https协议2 https通信方案2.1 只使用对称加密2.2 只使用非对称加密2.3 双方都使用非对称加密2.4 …...
Ubuntu安装 MySQL【亲测有效】
在Ubuntu上安装MySQL数据库的步骤通常包括更新软件包列表、安装MySQL服务器、启动并配置MySQL服务等。以下是一个详细的安装指南: 一、更新软件包列表 首先,打开终端并输入以下命令来更新Ubuntu的软件包列表: sudo apt update二、安装MySQ…...

Unity 从零开始搭建一套简单易用的UGUI小框架 扩展与优化篇(完结)
一个通用的UGUI小框架就算是写完了,下面是一步步的思考与优化过程 Unity 从零开始搭建一套简单易用的UGUI小框架 基础分析篇-CSDN博客 Unity 从零开始搭建一套简单易用的UGUI小框架 功能撰写与优化篇-CSDN博客 从使用者的角度来整理一下可能会发出的疑问 0. Panel…...
MySQL多表操作--外键约束多表关系
外键约束介绍 Mysql外键约束(foreign key)是表的一个特殊字段,常与主键约束一起使用。外键约束是一种用于维护两个表之间数据一致性的方法。它确保引用表中的每个值都存在于主表中的某个列中。外键约束通常用于实现数据库的参照完整性。对于两…...
【python入门到精通专题】8.装饰器
装饰器是python语言中的语法糖,可以通过装饰器对函数的功能进行拓展。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello():print("hello!")def say_goodbye():print("hello!") # 此处应打印go…...

Halcon Blob分析提取小光斑
文章目录 算子complement 返回一个区域的补集select_region_point 选择包含指定像素的所有区域intensity 计算灰度值的均值和偏差 案例 算子 complement 返回一个区域的补集 complement(Region : RegionComplement : : )Region (输入对象):这指的是输入的一个或多…...
Lua
1.声明一个变量 只要赋值一个变量,就相当于新建了一个变量,默认全局变量,加一个local前缀之后,这个变量就变成了局部变量 a1//全局变量 local b2//局部变量2.nil类型 在Lua里没有被声明过的变量都是nil,nil是一种类…...

模型 总观效应
系列文章 分享 模型,了解更多👉 模型_思维模型目录。超越自我,洞见生命之渺小。 1 总观效应的呈现和应用 1.1 回首创业路,星辰大海的启示 陈浩是一名连续创业者,他的创业历程充满了起伏和挑战。在经历了几次失败后&a…...

【HarmonyOS NEXT】实现页面水印功能
关键词:鸿蒙、水印、Watermark、页面、触摸问题 注:本期文章同样适用 OpenHarmony 的开发 在app开发过程中时常会出现敏感信息页面,为保护信息安全和及时的数据追踪,通常会采用给页面加水印的形式,那么本期文章会介绍…...

selenium自动化测试之Junit
1. 常用的注解 将junit的索引添加到pom文件: <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…...

【氮化镓】基于氮化镓的互补逻辑集成电路[Nature Electronics]
【摘要】本文介绍了一种基于氮化镓(GaN)的互补金属氧化物半导体(CMOS)逻辑集成电路,该电路利用氧等离子体处理技术实现了增强型n沟道和p沟道GaN场效应晶体管的单片集成。研究者们展示了包括反相器、与非门、或非门和传输门在内的基本逻辑门,以及多级逻辑电路,如锁存器和…...

Linux之如何找回 root 密码?
1、启动系统,进入开界面,在界面中按“e"进入编辑界面 2、进入编辑界面,使用键盘上的上下键把光标往下移动,找到以”Linux16“开通内容所在的行数,在行的最后面输入:init/bin/sh 3、输入完成后&…...
后端参数校验方式
1. 使用Hibernate Validator进行注解校验 这是Java中最常用的参数校验方式,基于JSR 303/JSR 380规范的实现,通常结合Valid或Validated注解进行参数校验。 使用步骤: 添加依赖(如果使用Spring Boot,通常已经内置了Hi…...

访问控制列表(课内实验)
实验2:访问控制列表 实验目的及要求: 通过实验,进一步的理解标准ACL与扩展ACL的工作原理及执行过程。理解通配符的概念,熟练掌握标准ACL与扩展ACL的配置指令,掌握将访问控制列表应用VTY线路上,并且能够判断…...

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优
处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优 在进行压力测试时,遇到java.lang.OutOfMemoryError: Java heap space错误或者nginx报错no live upstreams while connecting to upstream通常意味着应用的…...
数据分析库Pandas
一、认识Pandas数据分析库 Pandas是一个功能强大的数据分析库,它提供了丰富的数据结构和函数来处理和分析表格数据。在处理类似您提供的Excel文件时,首先需要导入Pandas库并读取数据,然后进行数据清洗和预处理,最后进行数据分析和…...
nginx做负载均衡的策略有哪些和模块
文章目录 策略模块 策略 轮询:轮询是Nginx默认的负载均衡策略,每个请求会按时间顺序分配到不同的后端服务器。这种方式适用于服务器配置相当且无状态的服务场景。加权轮询:在轮询的基础上,通过设置权重来调整不同服务器处理请求的…...

基于SSM社区医院预约转诊管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...