今天终于将CMOW看明白了
参考链接:
https://blog.csdn.net/weixin_40240670/article/details/81203428
https://zhuanlan.zhihu.com/p/55983009
https://blog.csdn.net/u012762419/article/details/79366052
Word2Vec
Word2vec使用单个隐藏层,完全连接的神经网络如下所示。隐藏层中的神经元都是线性神经元。输入层设置为具有与用于训练的词汇中的单词一样多的神经元。隐藏图层大小设置为生成的单词向量的维度。输出图层的大小与输入图层相同。
因此,假设用于学习单词向量的词汇表由V个单词组成并且N为单词向量的维度(每个单词拥有N个特征),则对隐藏层连接的矩阵大小为VxN的矩阵WI表示,其中每行表示词汇单词。以相同的方式,可以通过矩阵WO来描述从隐藏层到输出层的连接大小为NxV。
例子:
具有以下句子的训练语料库:
“The dog saw a cat”,“Dog chasing cat”,“Cat climbed a tree”
语料库词汇有八个单词['a','cat','chasing','climbed','dog','saw','the','tree']。按字母顺序排序后,每个单词都可以通过其索引引用。对于这个例子,我们的神经网络将有八个输入神经元和八个输出神经元。让我们假设我们决定在隐藏层中使用三个神经元。这意味着WI和WO将分别是8×3和3×8矩阵。在训练开始之前,这些矩阵被初始化为随机值,假设WI和WO初始化为以下值:
WI =
WO=
假设我们希望网络学习单词“cat”和“climbed”之间的关系。也就是说,当“cat”输入到网络时,网络应该显示“climbed”的高概率。在单词嵌入术语中,单词“cat”被称为context word,单词“climbed”被称为target word。在这种情况下,输入矢量X将是[0 1 0 0 0 0 0 0]t,目标矢量是[0 0 0 1 0 0 0 0]t。
利用表示“cat”的输入向量,可以将隐藏层神经元的输出计算为:
H = X*WI = [-0.490796 -0.229903 0.065460]
实际上隐藏神经元输出的向量H复制了WI矩阵的第二行的权重,因为输入层是One-hot编码,cat又是第二个word,所以会复制第二行的数值。对隐藏到输出层执行类似的操作,输出层神经元的激活矢量可以写成:
H_ = H*WO = [0.100934 -0.309331 -0.122361 -0.151399 0.143463 -0.051262 -0.079686 0.112928]
由于目标是为输出层中的单词生成概率,因此在输出层后面,我们会采用前文所述的Softmax作为激活函数,将输出向量中的数值转换为概率:
[0.143073 0.094925 0.114441 0.111166 0.149289 0.122874 0.119431 0.144800]
粗体的概率是针对所选择的目标词“climbed”,很显然它不是最大的,所以我们需要改进他,同样是采用我前文所述的交叉熵和BP算法反向改进权重。
从本质上讲,这就是Word2Vec如何学习单词之间的关系,并在此过程中开发语料库中单词的向量表示。
CBOW(continues bag of words)
CBOW的全称是continuous bag of words(连续词袋模型)。其本质也是通过context word(背景词)来预测target word(目标词)。如上述不同的时候,上述target word“climbed”的context word只有一个“cat”作为训练样本,而在CBOW中,可由多个context word表示。
例如,我们可以使用“cat”和“tree”作为“climbed”的context word。这需要修改神经网络架构。如下所示,修改包括将输入层复制C(C的大小就是window的大小)次,以及在隐藏层神经元中添加除以C的操作。相当于一个target word要训练C次神经网络。
自注:
(1) 该词嵌套的求解采用的是一个隐藏层的神经网络,多个词输入(上下文输入)和一个输出(target word),其实很好理解。输入向量大小维度等于最终输出向量的大小维度。