Stanford CS224N 第二课: word2vec踩坑经验分享

word2vec模型

  word2vec 模型有两种: Continuous Skip-gram Model 和 Continuous Bag of Words Model (CBOW)。关于这两个模型的描述可以参考大神Mikolov的论文Efficient Estimation of Word Representations in Vector Space

  本文不详细介绍 Word2vec 的机制, 关于这方面的内容推荐查看 Stanford CS224N 的公开课, 结合视屏和PPT, 将课后作业做一遍,对 word2vec的理解会很深刻。 另外推荐 Word2Vec Tutorial - The Skip-Gram Model, 文章直观地讲解了如何从神经网络中得到词向量。

踩坑经验一: Softmax Cross Entropy VS Negative Sampling Loss 

  对于一个初步入门了深度学习的小伙伴, 交叉熵要容易理解一点。交叉熵就是让模型(比如神经网络)的分布尽可能地拟合真实数据的分布, 说起来也挺玄乎的,  这里面有不少的奇技淫巧(调参数), 相信做过深度学习的小伙伴一定有深刻的体会。然而对于Word2vec这样的任务, 一个Vocabulary(不知道词典 Vocabulary 为何物的小伙伴, 第一次接触到这个英文单词的时候, 我也是一脸懵逼 :), Vocabulary 就是一个集合, 集合的内容是一个个单词)中有hundreds or billions of words, 当有几万到几个亿的单词时, 使用交叉熵是费时间的, 因为每一次计算交叉熵都要遍历整个Vocabulary, 计算量很大。

  Negative Sampling Loss (负采样) 就是用来解决交叉熵比较慢这个问题的。 仔细观察负采样函数的形式, 我对它的粗略理解是让word pairs (词对)中的两个单词的向量尽可能的接近,其它词向量与中心词向量尽可能的远。负采样中最难理解的是 noise distribution(噪声分布)函数, 至今仍然没有Get到其中的精髓。 不过大佬说了, 这是根据实验结果来确定的。 

踩坑经验二: 在 Windows + python 3.0 环境下实现作业要求

  课堂作业的提示代码是为linux环境写的, 用的是python 2.0版本。然而我的电脑用的是windows系统, 装的是python 3.0版本。在实现作业的时候, 发现在对字符串进行编码和解码操作的时候, 总是不对, 改了一个下午和一个晚上, 也没有改成功。 还没有在虚拟机里面试过, 不过据说虚拟机里面不能用显卡。这次下定决心搭建一个ubuntu系统, 写代码方便一点。

sentences += [[w.lower().decode("utf-8").encode('latin1') for w in splitted]]

  这行代码在 treebank.py 里面。

  在python 3.0 版本下面运行这行代码的时候会报错, 因为在python 3.0 当中, 字符串是没有解码操作的。 在 python 2.0 当中字符串等于 bytes, 可以进行 decode(解码操作)。哪位大佬要是成功解决了这个问题, 请留言,感激不尽。

  今天就暂时说这么多, 以后想到别的,再添加。

原文地址:https://www.cnblogs.com/yangkang77/p/8544517.html