我在text8数据集上演习了一个skip-gram模型。然后,我用Tensorboard来设想这些Embedding,Embedding实在便是一个映射,将单词从原来所属的空间映射到新的多维空间中,也便是把原来词所在空间嵌入到一个新的空间中去。Tensorboard许可你通过利用PCA选择3个主轴来投射数据,从而查看全体词云(world cloud)。你可以输入任何一个单词,它就会显示它的相邻的词语。你也可以把离它最近的101个点分离出来。请不雅观看下面的动图:
代码:https://github.com/priya-dwivedi/Deep-Learning/blob/master/word2vec_skipgram/Skip-Grams-Solution.ipynb
为了可视化演习,我还研究了最靠近预测的单词,并将其与一组随机的单词进行了比较。在第一次迭代中最靠近的预测词看起来很随意,但这却很故意义,由于所有的词向量都是随机初始化的。

Nearest to cost: sensationalism, adversity, ldp, durians, hennepin, expound, skylark, wolfowitz,Nearest to engine: vdash, alloys, fsb, seafaring, tundra, frot, arsenic, invalidate,Nearest to construction: dolphins, camels, quantifier, hellenes, accents, contemporary, colm, cyprian,Nearest to http: internally, chaffee, avoid, oilers, mystic, chappell, vascones, cruciger,
在演习结束的时候,这个模型在探求单词之间的关系方面变得更好了。
Nearest to cost: expense, expensive, purchase, technologies, inconsistent, part, dollars, commercial,Nearest to engine: engines, combustion, piston, stroke, exhaust, cylinder, jet, thrust,Nearest to construction: completed, constructed, bridge, tourism, built, materials, building, designed,Nearest to http: www, htm, com, edu, html, org, php, ac,CBOW模型和Skip-gram模型
创建词向量是指获取大量文本的过程,并为每个单词创建一个向量,这样在语料库中共享公共高下文的词就位于向量空间中彼此相邻的位置。
这些单词向量可以很好地捕捉单词之间的高下文关系(例如,玄色、白色和赤色的示例向量是紧密联系在一起的),我们利用这些向量来得到更好的性能,而不是像文本分类或新文本天生这样的自然措辞处理任务。
有两个紧张的模型可以天生这些词向量——CBOW模型和skip-gram模型。CBOW模型考试测验预测给定高下文词的中央词,而skip-gram模型试图预测给定中央词的高下文词。下面有一个大略的例子:
CBOW:猫吃了___。添补空缺,在这种情形下中,空缺处应为“食品”。
Skip-gram:___ ___食品。完成单词“食品”的上文。在这种情形下,空缺处应为”猫吃了”
各种各样的论文都创造Skip-gram模型会产生更好的词向量,以是我准备把重点放在实现Skip-gram模型上。
在Tensorflow中实现Skip-gram模型在这里,我将列出构建模型的紧张步骤。详细实现过程请参阅:https://github.com/priya-dwivedi/Deep-Learning/blob/master/word2vec_skipgram/Skip-Grams-Solution.ipynb
1.预处理数据
首先要洗濯我们的数据。删除任何标点、数字,并将文本拆分为单个单词。由于程序对整数的处理要比单词好得多,以是我们通过创建一个单词到int字典来将每个单词映射到int。代码如下:
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.二次抽样(Subsampling)
常常涌现的词语,如“我的”、“你的”和“他的”,无法给附近的单词供应太多的高下文信息。如果我们放弃个中的一些单词,我们就可以从我们的数据中移除一些噪声(noise),以得到更快的演习和更好的表现。这一过程被称为“二次抽样”(详细内容请看下面链接)。对付演习集里的每一个单词,我们将用它的相反的频率丢弃它。
二次抽样:https://arxiv.org/pdf/1301.3781.pdf
3.创建输入和目标
Skip-gram模型的输入是每个单词(编码为int),目标是窗口(window)周围的单词。如果这个窗口的大小是可变的,那么更频繁地对中央词进行采样的话,性能会更好。
“由于较远的词常日不与当前词干系,以是通过从我们演习样本中的这些词汇给较远间隔的词少量的权重…如果我们将窗口大小(window size)设置为5,那么对付每个演习的单词我们将随机选择一个1到窗口大小(5)之间的数字R,然后利用当前词的R个历史单词和R个未来单词作为精确的标签。”
R = np.random.randint(1, window_size+1)start = idx — R if (idx — R) > 0 else 0stop = idx + Rtarget_words = set(words[start:idx] + words[idx+1:stop+1])
4.构建模型
从下面博客中,我们可以看到我们将要构建的一样平常构造的网络。
博客地址:http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
我们将表示一个像“ants”这样的输入词,它是一个独热向量。这个向量将有10,000个组件(一个用于我们的词汇表中的每个单词),我们将在这个位置放置一个“1”,对应于“ants”这个词0。
网络的输出是一个单一的向量(也包含10,000个组件),对付我们词汇表中的每个词来说,随机选择附近单词的概率是字汇词(vocabulary word)。
在演习的末了,隐蔽层将会有演习过的词向量。隐蔽层的大小对应于向量中空间的数量。在上面的例子中,每个单词都有一个长度为300的向量。
你可能已经把稳到,Skip-gram神经网络包含了大量的权重。对付我们的例子来说,如果我们现在想用300个特色来表示一个单词(即每个词可以被表示为300维的向量)。那么隐层的权重矩阵该当为10000行,300列(隐层有300个结点)。在大型数据集上进行演习是不可能的,因此word2vec的作者引入了一些调度,使演习变得可行。详情如下:
调度:http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/
5.可视化利用Tensorboard
你可以利用Tensorboard上的embeddings projector来可视化嵌入。要做到这一点,你须要做以下几件事:
在检讨点(checkpoint)目录的演习结束时保存你的模型
创建一个元数据tsv文件,它将每个int的映射回到单词上,这样,Tensorboard将显示单词而不是ints。在相同的检讨点目录中保存这个tsv文件
运行这段代码:
from tensorflow.contrib.tensorboard.plugins import projectorsummary_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)
本文为编译文章,转载请注明出处。
来源:atyun_com
来源网址:http://www.atyun.com/14019_一文教你实现skip-gram模型,演习并可视化词向量.html