python深度学习进阶(自然语言处理)—word2vec

python深度学习进阶(自然语言处理)—word2vec,第1张

概述python深度学习进阶自然语言处理)—word2vec 摘要基于推理的方法以预测为目标,同时获得了作为副产物的单词的分布式表示。word2vec 是基于推理的方法,由简单的2 层神经网络构成。word2vec 有skip-gram 和CBOW 模型。CBOW 模型从多个单词(上下文)预测1 个单词(目标词)。s

python深度学习进阶(自然语言处理)—word2vec

 

摘要基于推理的方法以预测为目标,同时获得了作为副产物的单词的分布式表示。word2vec 是基于推理的方法,由简单的 2 层神经网络构成。word2vec 有 skip-gram 和 CBOW 模型。CBOW 模型从多个单词(上下文)预测 1 个单词(目标词)。skip-gram 模型反过来从 1 个单词(目标词)预测多个单词(上下文)。由于 word2vec 可以进行权重的增量学习,所以能够高效地更新或添加单词的分布式表示。1. 基于推理的方法和神经网络1.1 基于计数的方法的问题

    基于计数的方法获得单词的分布式表示:使用整个语料库的统计数据(共现矩阵和 PPMI 等),通过一次处理(SVD 等)获得单词的分布式表示。

    基于推理的方法获得单词的分布式表示:使用神经网络,通常在 mini-batch 数据上进行学习。

对于一个 

 的矩阵,SVD 的复杂度是 ,这表示计算量与  的立方成比例增长。如此大的计算成本,即便是超级计算机也无法胜任。实际上,利用近似方法和稀疏矩阵的性质,可以在一定程度上提高处理速度,但还是需要大量的计算资源和时间。

在现实世界中,语料库处理的单词数量非常大。比如,英文的词汇量多达 100w+。如此之大的词汇量,如果使用基于计数的方法就需要生成一个 100w * 100w 的庞大矩阵,对如此庞大的矩阵执行 SVD 显然是不现实的。

    基于计数的方法和基于推理的方法的比较:

图 3-1    基于计数的方法和基于推理的方法的比较

(1)基于计数的方法一次性处理全部学习数据;基于推理的方法使用部分学习数据逐步学习。

(2)神经网络的学习可以使用多台机器、多个 GPU 并行执行,从而加速整个学习过程。

1.2 基于推理的方法的概要

    基于推理的方法的主要 *** 作是 “推理”。如图 3-2 所示,当给出周围的单词(上下文)时,预测 “?” 处会出现什么单词,这就是推理。

图 3-2    基于两边的单词(上下文),预测 “?” 处出现什么单词

    解开图 3-2 中的推理问题并学习规律,就是基于推理的方法的主要任务。通过反复求解这些推理问题,可以学习到单词的出现模式。从 “模式视角” 出发,这个推理问题如图 3-3 所示。

图 3-3    基于推理的方法:输入上下文,模型输出各个单词的出现概率

基于推理的方法的全貌:使用语料库来学习模型,使之能做出正确的预测。另外,作为模型学习的产物,我们得到了单词的分布式表示。

(1)引入某种模型,将神经网络用于此模型;

(2)模型接收上下文信息作为输入,并输出(可能出现的)各个单词的出现概率。

1.3 神经网络中单词的处理方法

    将单词表示为文本、单词ID和 one-hot 表示:

图 3-4    单词、单词 ID 以及它们的 one-hot 表示

    要将单词转化为 one-hot 表示,就需要准备元素个数与词汇个数相等的向量,并将单词 ID 对应的元素设为 1,其他元素设为 0。像这样,只要将单词转化为固定长度的向量,神经网络的输入层的神经元个数就可以固定下来(图 3-5)。

图 3-5    输入层的神经元:各个神经元对应于各个单词。图中神经元为 1 的地方用蓝色绘制,为 0 的地方用白色绘制

如图 3-5 所示,输入层由 7 个神经元表示,分别对应于 7 个单词(第 1 个神经元对应于 you,第 2 个神经元对应于 say)。

    基于神经网络的全连接层的变换:

图 3-6    基于神经网络的全连接层的变换:输入层的各个神经元分别对应于 7 个单词(中间层的神经元暂为3个)

如图 3-6 所示,全连接层通过箭头连接所有节点。这些箭头拥有权重(参数),它们和输入层神经元的加权和成为中间层的神经元。

图 3-7    基于全连接层的变换的简化图示:将全连接层的权重表示为一个 7 x 3 形状的 W 矩阵

    Python 代码实现基于神经网络的全连接层的变换:

import numpy as npclass MatMul:    def __init__(self, W):        self.params = [W]        self.grads = [np.zeros_like(W)]        self.x = None    def forward(self, x):        W, = self.params        out = np.dot(x, W)        self.x = x        return out    def backward(self, dout):        W, = self.params        dx = np.dot(dout, W.T)        DW = np.dot(self.x.T, dout)        self.grads[0][...] = DW        return dx
"""基于神经网络全连接层的变换"""import syssys.path.append("..")import numpy as npfrom common.layers import MatMulC = np.array([[1, 0, 0, 0, 0, 0, 0]])    # 输入W = np.random.randn(7, 3)    # 权重# 方案一h = np.dot(C, W)    # 中间节点print(h)# 方案二layer = MatMul(W)h = layer.forward(C)    # 中间节点print(h)

    

[[-0.00183343 -0.41558399  0.13295223]][[-0.00183343 -0.41558399  0.13295223]]

矩阵 C:one-hot 表示,单词 ID 对应的元素是 1,其他地方都是 0。

    上述代码的 C 和 W 的矩阵乘积相当于 “提取” 权重的对应行向量。

图 3-8    在上下文 C 和权重 W 的矩阵乘积中,对应位置的行向量被提取
2. 简单的 word2vec2.1 CBOW 模型的推理2.2 CBOW 模型的学习2.3 word2vec 的权重和分布式表示3. 学习数据的准备3.1 上下文的目标词3.2 转化为 one-hot 表示4. CBOW 模型的实现5. word2vec 的补充说明5.1 CBOW 模型和概率5.2 skip-gram 模型5.3 基于计数与基于推理 总结

以上是内存溢出为你收集整理的python深度学习进阶(自然语言处理)—word2vec全部内容,希望文章能够帮你解决python深度学习进阶(自然语言处理)—word2vec所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1185983.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存