【万字长文】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之间的一些统计方法} (待补充onehotWord2Vec之间的一些统计方法。这些方法旨在通过分析词在大量文本中的共现信息来推断词义,但这些方法往往计算量大,效率低,且仍然难以充分捕捉词义的丰富性。

常用的两种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=(xic,xic+1,,xi1,xi+1,,xi+c)RV×2C
其中, x i x_i xi为目标单词,其中 x i ∈ R V × 1 x_i \in \mathbb{R}^{V \times 1} xiRV×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} bRD×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} xjRD×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=(iC,iC+1,,i1,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=[xiC,xiC+1,,xi1,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=[xiC,xiC+1,,xi1,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=iC,j=ii+Cxj=2C1(xiC+xi1+xi+1++xi+C)

其中 C C C 是窗口大小, h ∈ R D × 1 h \in \mathbb{R}^{D \times 1} hRD×1。写成矩阵的形式为

h = 1 2 C X ′ j ⃗ h = \frac{1}{2C} X'\vec{j} h=2C1Xj
其中 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} bRV×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 PiR 表示为位置索引为 i i i 处的单词的得分。 P ∈ R V × 1 P \in \mathbb{R}^{V \times 1} PRV×1。写成矩阵的形式为
P = W ′ h + b ′ P = W'h + b' P=Wh+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} PRV×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=1Vexp(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 进行处理,分别得到以下结果。

index0123456789
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
wordthecatplaysingarden,andchasesmouse.

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.05131.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.00710.53970.71350.47891.29620.47690.83110.51940.27493.24892.37020.55570.22891.02121.86071.96571.35290.5770.86071.39340.88640.12410.56010.09292.00160.30261.26590.28170.37180.52370.11980.7691.6690.00091.06351.24640.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.15330.15060.2770.27980.53022.45391.29360.39740.50430.92880.20441.4270.15330.15060.2770.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.53020.50430.15330.15062.45390.92880.15060.277+1.29360.2044+0.2770.27980.39741.4270.2798 = 0.07010.92090.41080.596

接下来是权重输出层。我们将 W ′ W' W 进行初始化。然后进行运算 W ′ h W'h Wh,然后再加上置偏值 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.35941.3070.33120.01181.54910.86250.85290.65240.72360.62220.19950.28631.34971.00480.02210.010.95581.21830.690.92111.54190.37790.06981.32710.75830.050.02341.33261.00150.72620.97070.75380.24660.91920.66050.67022.30421.07460.5030.2228 ,b= 1.01071.82480.99750.850590.13150.91240.18822.16940.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=Wh+b= 1.01071.82480.99750.85050.13150.91240.18822.16940.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=1Vexp(Pk)P=e1.0107+e1.8248+e0.9975+e0.8505+e0.1315+e0.9124+e0.1882+e2.1694+e0.1149+e2.0037[e1.0107e1.8248e0.9975e0.8505e0.1315e0.9124e0.1882e2.1694e0.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=1Vtilog(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=(xiC,xiC+1,,xi1,xi,,xi+C1,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} WRD×V 在加上置偏值 b b b得到加权平均层输入 X ′ ∈ R V × 2 C X' \in \mathbb{R}^{V \times 2C} XRV×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} hRD×1,即
h = 1 2 C X ′ j ⃗ h = \frac{1}{2C} X'\vec{j} h=2C1Xj
其中 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} PRV×1,即
P = W ′ h + b ′ P = W'h + b' P=Wh+b

5.将计算得到的得分向量 P P P通过 Softmax 激活处理得到 V V V 维的概率分布 P ′ ∈ R V × 1 P' \in \mathbb{R}^{V \times 1} PRV×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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/444109.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【redis-06】redis的stream流实现消息中间件

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

Auto-Animate:是一款零配置、即插即用的动画工具,可以为您的 Web 应用添加流畅的过渡效果

嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 用户体验成为了检验产品成功与否的关键因素。而动画效果,作为提升用户体验的重要手段,在网页和应用开发中扮演着举足轻重的角色…

同望OA tooneAssistantAttachement.jsp 任意文件读取漏洞复现

0x01 产品简介 同望OA,即同望科技打造的智企云协同管理系统,是一款高效的企业协同移动办公系统。秉承“互联网++企业管理”理念,定位于以移动互联办公为基础的企业协同管理软件平台。它旨在通过内置常用标准模块与专项管理模块应用,安全快速地打通管理与业务通道,实现管理…

QT 实现QMessageBox::about()信息自定义显示

这是我记录Qt学习过程的第四篇心得文章,主要是方便自己编写的应用程序显示“关于信息”,对QMessageBox::about()输入信息进行规范,可以设置应用程序名称,通过定义宏从pro文件获取应用程序版本号,以及编译程序的QT版本、…

写一个代码:打印100~200之间的素数

我们要输出100-200之间的素数,首先我们先得输出100-200之间的数字,一般用于遍历循环的数字要用到for循环,同时在输出的100~200之间的数字进行判断是不是素数,我们知道素数的判断条件在于当一个数字从1开始到自己本身的时候&#x…

2024年最新(AI绘画)Stable Diffusion4.9下载及安装教程.

软件介绍 Stable Diffusion 是一款在图像生成领域具有重大影响力的软件。 从工作原理上看,它利用深度学习的先进算法,构建起复杂且强大的神经网络架构。其核心在于能够解读用户输入的文本信息,并将这些信息转化为图像的特征与细节。 在使用…

【C++网络编程】(一)Linux平台下TCP客户/服务端程序

文章目录 Linux平台下TCP客户/服务端程序服务端客户端相关头文件介绍 Linux平台下TCP客户/服务端程序 图片来源:https://subingwen.cn/linux/socket/ 下面实现一个Linux平台下TCP客户/服务端程序:客户端向服务器发送:“你好,服务…

攻防世界(CTF)~Reverse-easyRE1

题目介绍 下载附件后一个32位一个64位 64位的放到ExeinfoPE查看一下有无壳子(无壳) 放IDA看一下伪代码,习惯性看一下main函数,直接发现了flag flag{db2f62a36a018bce28e46d976e3f9864}

手撕数据结构 —— 单链表(C语言讲解)

目录 1.为什么要有链表 2.什么是链表 3.链表的分类 4.无头单向非循环链表的实现 SList.h中接口总览 具体实现 链表节点的定义 打印链表 申请结点 尾插 头插 尾删 头删 查找 在pos位置之前插入 在pos位置之后插入 删除pos位置 删除pos位置之后的值 5.完整代码…

理解Web3的互操作性:不同区块链的连接

随着Web3的迅速发展,互操作性成为区块链技术中的一个核心概念。互操作性指的是不同区块链之间能够无缝地交流和共享数据,从而实现更加高效和灵活的生态系统。本文将探讨Web3中互操作性的意义、面临的挑战以及未来的发展趋势。 1. 互操作性的意义 在Web…

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型,其结构结合了FM(因子分解机)与深度神经网络(DNN),实现了低阶与高阶特征交互的有效建模。模型分为以下几层: 1.1 FM部分(因子分解机层&#…

MinIO分片上传超大文件(纯服务端)

目录 一、MinIO快速搭建1.1、拉取docker镜像1.2、启动docker容器 二、分片上传大文件到MinIO2.1、添加依赖2.2、实现MinioClient2.3、实现分片上传2.3.0、初始化MinioClient2.3.1、准备分片上传2.3.2、分片并上传2.3.2.1、设置分片大小2.3.2.2、分片 2.3.3、分片合并 三、测试3…

Vscode+Pycharm+Vue.js+WEUI+django火锅(三)理解Vue

新创建的Vue项目里面很多文件,对于新手,老老实实做一下了解。 1.框架逻辑 框架的逻辑都是相通的,花点时间理一下就清晰了。 2.文件目录及文件 创建好的vue项目下,主要的文件和文件夹要先认识一下,并与框架逻辑对应起…

计算机网络803-(4)网络层

目录 1.虚电路服务 虚电路是逻辑连接 2.数据报服务 3.虚电路服务与数据报服务的对比 二.虚拟互连网络-IP网 1.网络通信问题 2.中间设备 3.网络互连使用路由器 三.分类的 IP 地址 1. IP 地址及其表示方法 2.IP 地址的编址方法 3.分类 IP 地址 (1&#x…

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务 在本项目中,我们使用 Go 语言和 Gin 框架构建了一个简单的 Web 服务,能够管理用户和物品的信息。该服务实现了两个主要接口:根据用户 ID 获取用户名称,以及根据物品 ID 获…

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1,脉冲部分代码2,ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …

EasyExcel读入数字类型数据时出现小数位丢失精度问题

这里写自定义目录标题 问题现象解决方案 问题现象 目前使用easyExcel读取导入文档时发现文档中的小数值4076204076.65会被读取为4076204076.6500001 尝试去查看了excel解压后的文件,发现这条数据在xml里存储的值就是4076204076.6500001,即是excel存储小…

利用 Python 爬虫采集 1688商品详情

1688是中国的一个大型B2B电子商务平台,主要用于批发和采购各种商品。对于需要从1688上获取商品详情数据、工程数据或店铺数据的用户来说,可以采用以下几种常见的方法: 官方API接口:如果1688提供了官方的API接口,那么可…

喜讯!迈威通信TSN产品通过“时间敏感网络(TSN)产业链名录计划”评测,各项指标名列前茅

TSN技术,作为推动企业网络化与智能化转型的关键力量,已成为工业网络迈向下一代演进的共识方向,正加速重构工业网络的技术架构与产业生态。为响应这一趋势,工业互联网产业联盟携手中国信息通信研究院及50余家产学研用单位&#xff…

使用Google开源工具gperftools进行堆内存占用分析

背景:项目中有多卡训练的需求,多进程时每个进程都需要编译,占用内存过大,需要找出内存占用多的点并尝试优化。 目标程序是python的多进程程序,torch_xla多卡训练,程序包含python及c库,尝试过其他…