留言与评论(共有 0 条评论) |
发布时间:2020-04-12 08:42:45
在本教程中,我想向你展示如何在 tensorflow 中实现一个 skip gram 模型,以便为你正在处理的任何文本生成单词向量,然后用 tensorboard 对它们进行可视化。我发现这个练习首先对于我理解 skip gram 模型是如何工作的非常有帮助;其次,你后续在 CNN 或 RNN 中使用它们之前,能够形成对于向量捕获你的文本关系的直观感受。
我在 text8 数据集上训练了一个 skip gram 模型,这个数据集是英文维基百科文章的集合。我用 Tensorboard 来可视化这些嵌入。Tensorboard 允许您通过使用 PCA 选择 3 主轴来投影数据来看到整个文字云。超级酷!你可以输入任何单词,它会显示相邻的单词。你也可以隔离最靠近它的 101 个点。
看看下面的片段。
你可以在我的 Github 存储库中找到完整的代码。
为了可视化训练过程,我还持续跟踪一组随机单词在模型中最靠近的预测单词。在第一次迭代中,最接近的预测单词看起来非常随机。这很合理,因为所有单词向量都是随机初始化的。
距离花费(cost)最近的有:哗众取宠(sensationalism)、逆境(adversity)、自民党(ldp)、榴莲(durians)、hennepin、解释(expound)、云雀(skylark)、wolfowitz
距离引擎(engine)最近的有:推导符(vdash)、合金(alloys)、联邦安全局(fsb)、航海业(seafaring)、冻土(tundra)、frot、砒霜(arsenic)、作废(invalidate)
距离建设(construction)最近的有:海豚(dolphins),骆驼(camels),量词(quantifier),希腊人(hellenes),口音(accents),当代(contemporary),colm,放荡的(cyprian)
距离超文本传输协议(http)最近的有:内部地(internally)、chaffee、避免(avoid)、加油器(oilers)、神秘(mystic)、chappell、vascones、cruciger
在训练结束的时候,这个模型已经能更好地找到单词之间的关系。
距离花费(cost)最近的有:开销(expense)、昂贵(expensive)、购买(purchase)、技术(technologies)、不一致(inconsistent)、部分(part)、美元(dollars)、商业(commercial)
距离引擎(engine)最近的有:发动机(engines)、燃烧(combustion)、活塞(piston)、冲程(stroke)、排气(exhaust)、汽缸(cylinder)、喷气(jet)、推力(thrust)
距离建设(construction)最近的有:完成的(completed)、建造(constructed)、桥梁(bridge)、旅游(tourism)、建筑(built)、材料(materials)、建筑(building)、设计(designed)
距离超文本传输协议(http)最近的有:www、htm、com、edu、html、org、php、ac
Word2Vec 和 Skip Gram 模型
创建单词向量是一个过程,基于巨大的文本语料库,并为每个单词创建一个向量。创建的标准是,在语料库中语境相似的单词对应的向量会在向量空间中非常接近。
这些单词向量可以很好地捕捉单词之间的上下文关系(例如,黑色、白色和红色的示例向量会紧密地结合在一起),而且使用这些向量而不是单词本身来完成像文本分类或新文本生成这样的自然语言处理(NPL)任务,我们会得到更好的结果。
有两个主要的模型来生成这些单词向量——连续单词包 (CBOW) 和 Skip Gram 模型。CBOW 模型试图在给定语境词后预测中心词,而 skip gram 模型试图在给定中心词时预测语境词。我们可以看一个简化的例子:
CBOW:这只猫吃了________。(句子填充)本例中,应该填「食物」。
Skip-gram:_______________食物。(造句)本例中,可以填「这只猫吃了」
如果您有兴趣对这两种方法进行更详细的比较,请参见此链接。(链接:https://iksinc.wordpress.com/tag/continuous-bag-of-words-cbow/)
众多论文发现,Skip gram 模型能产生更好的单词向量,所以我将重点放在实现这个模型上。
在 Tensorflow 中实现 Skip Gram 模型
在这里,我只列出构建模型的主要步骤。请在我的 Github 上查看详细的实现。(链接:https://github.com/priya-dwivedi/Deep-Learning/blob/master/word2vec_skipgram/Skip-Grams-Solution.ipynb)
1、数据预处理
我们首先清理我们的数据。删除任何标点、数字,并将文本分割成单个单词。由于比起单词,程序能更好地处理整数,因此我们通过创建一个「词汇转整数」字典来将每个单词映射到一个整数上。代码如下。
counts = collections.Counter(words)
vocab = sorted(counts, key=counts.get, reverse=True)
vocab_to_int = {word: ii for ii, word in enumerate(vocab, 0)}
2、次级采样
经常出现的单词,例如「the」、「of」和「for」,并没有给附近的单词提供太多的语境。如果我们丢弃其中的一些,我们可以消除我们的数据中的部分噪声,并且能够更快地训练并获得更好的表示结果。这个过程被 Mikolov 称为次级采样(subsampling)。对于训练集中的每一个单词,我们以它出现频率的倒数给出的概率来丢弃他。
3、创建输入和目标
Skip gram 模型的输入是每个单词(编码成为的整数),而目标是围绕该窗口的单词。Mikolov 等人发现,如果这个窗口的大小是可变的,同时更接近中心单词的单词采样次数较多时,性能会更好。
「由于距离更远的词通常不如距离更近的词与目标单词的关系那么紧密,我们通过在训练我们的样本时更少对远距离的词采样,以减少其权重……如果我们选择窗口大小= 5,我们将为每一个训练词随机选择一个 1 和窗口大小 5 之间的数字 R,然后将目标单词在句子中的前后 R 个单词纳入训练,作为正确的标签。」
R = np.random.randint(1, window_size+1)
start = idx—R if (idx—R) > 0 else 0
stop = idx + R
target_words = set(words[start:idx] + words[idx+1:stop+1])
4、建立模型
从 Chris McCormick 的博客,我们可以看到我们将要建立的网络的一般结构。
我们将把一个「蚂蚁」之类的输入词表示为一个独热向量。这个向量将有 10,000 个分量(每个分量都对应于我们词汇表中的一个单词),我们将对应单词「ants」的分量设为「1」,所有其他分量都对应 0。
网络的输出是一个单向量(也包含 10,000 个分量)。这个向量包含的分量大小即对应于我们随机选择的附近单词正好是这个词汇表单词的概率。
在训练结束时,隐藏层将会有经过训练的单词向量。隐藏层的大小相当于我们向量中的维数。在上面的例子中,每个单词都有一个长度为 300 的向量。
你可能已经注意到,skip-gram 神经网络包含大量的权重数……在我们的例子中有 300 特性和 10000 个单词的词汇表,也就是说在隐藏层和输出层都有 3 百万个权重数!在一个大数据集上进行这样的训练将会是令人望而却步的,因此 word2vec 的作者引入了一些调整来使训练变得可行。你可以在这个链接(http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/)中看到更多关于它们的信息。Github 上的这些代码(https://github.com/priya-dwivedi/Deep-Learning/blob/master/word2vec_skipgram/Skip-Grams-Solution.ipynb)实现了这些优化以加速训练。
5、用 Tensorboard 来进行可视化
您可以使用 Tensorboard 中的「嵌入投影机」可视化嵌入。要实现这个功能,你需要完成以下步骤:
在检查点目录的训练结束时保存您的模型
创建一个 metadata.tsv 文件包含每个整数返回单词的映射关系,这样 Tensorboard 就会显示单词而不是整数。将这个 tsv 文件保存在同一个检查点目录中
运行这段代码:
from tensorflow.contrib.tensorboard.plugins import projector
summary_writer = tf.summary.FileWriter(『checkpoints』, sess.graph)
config = projector.ProjectorConfig()
embedding_conf = config.embeddings.add()
# embedding_conf.tensor_name = 『embedding:0』
embedding_conf.metadata_path = os.path.join(『checkpoints』, 『metadata.tsv』)
projector.visualize_embeddings(summary_writer, config)
打开 tensorboard,将其指向检查点目录
大功告成!
如果你喜欢这个推送请帮我点赞!希望你能弄明白这些代码并自己尝试运行一下。如果你对这个话题有其他想法,请在这篇文章下留言或者发邮件到 priya.toronto3@gmail.com (mailto:priya.toronto3@gmail.com)
我的其他文章:https://medium.com/@priya.dwivedi/
PS:我住在多伦多,正想跳槽到深度学习领域。如果你喜欢我的文章而且能帮我联系到合适的岗位,我会超级感激!我的邮件地址是 priya.toronto3@gmail.com (mailto:priya.toronto3@gmail.com)
在本教程中,我想向你展示如何在 tensorflow 中实现一个 skip gram 模型,以便为你正在处理的任何文本生成单词向量,然后用 tensorboard 对它们进行可视化。我发现这个练习首先对于我理解 skip gram 模型是如何工作的非常有帮助;其次,你后续在 CNN 或 RNN 中使用它们之前,能够形成对于向量捕获你的文本关系的直观感受。
我在 text8 数据集上训练了一个 skip gram 模型,这个数据集是英文维基百科文章的集合。我用 Tensorboard 来可视化这些嵌入。Tensorboard 允许您通过使用 PCA 选择 3 主轴来投影数据来看到整个文字云。超级酷!你可以输入任何单词,它会显示相邻的单词。你也可以隔离最靠近它的 101 个点。
留言与评论(共有 0 条评论) |
全站搜索