在自然语言处理领域中,将单词或词语映射到向量空间中可以很容易就得到单词之间的相似度,因为向量空间中两个向量的相似度很容易求得,比如余弦相似度。这可以用于自动语音识别以及机器翻译等。
提到word2vec,不得不提skip-gram模型,其结构如下
它可以预测比较临近的单词。给定单词序列w1,w2,...,wT, skip-gram的目标在于最大化下面的函数
其中c用来衡量上下文的长度,c越大,训练样本越多,精度越高,耗时越多。上面的概率函数基于softmax函数,具体如下:
其计算复杂度跟W成正比,W是词汇量,词汇量的量级一般在十万到千万级别。
Hierachical softmax利用二叉树来表示输出层,其中W个单词作为叶节点,每个节点表示它的子节点的相对概率,事实上,这就定义了一种随机游走,并且对单词赋予了概率。
用 n(w, j) 表示从根节点到单词w是第j个节点,并且用L(w)来表示这个路径的长度,则 n(w, 1) 就是根节点,n(w, L(w)) = w。对于每个内部节点n,用ch(n)表示节点n的任意一个子节点。则:
其中
负采样可以定义如下
可以用它来代替skip-gram模型中的目标函数
。
目的在于将目标单词利用逻辑回归从噪声分布Pn(w)中采样出来,其中k是样本点的负样本。对于小的训练样本集,k的取值范围一般在5到20,对于大样本集,可以取小一点,比如2到5。
次采样是为了缩减少见词与频繁词的不平衡性,次采样定义形式如下,训练集中的每个单词以一定概率舍弃:
其中 f(wi) 是单词 wi 出现的频率,t 是事先选定的阈值,通常取值约为0.00001。 .这使得出现频率大的单词采样率变小,同时保持词语频率的原有排序。次采样可以加速训练速度,甚至可以提高少见词的精度。
word2vec可以看作Skip-gram模型的一种扩展。word2vec在训练过程中对经常出现的词进行了下采样,这可以大大提升训练的速度,差不多在2-10倍,而skip-gram单机版模型一天就可以训练多达千亿单词量级的模型;并且,word2vec对出现频次比较少的单词或词语的表示也比较精准。
下面介绍基于tensorflow的word2vec实践
首先安装Anaconda
然后创建conda 环境
conda create -n tensorflow python=3.5
结果如下:
然后激活刚刚创建的环境
activate tensorflow
安装tensorflow
pip install --ignore-installed --upgrade tensorflow
结果如下:
最后执行 python word2vec_basic.py
其中word2vec_basic文件来源为
https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/examples/tutorials/word2vec/word2vec_basic.py
第一步下载数据
数据来源 http://mattmahoney.net/dc/
文件名 text8.zip
第二步 构建字典,并且将稀缺词替换为'UNK'
字典大小 50000
第三步 为skip-gram模型生成训练批
第四步 构建并且训练skip-gram模型
参数如下
batch_size = 128 # 批的大小
embedding_size = 128 # 嵌入向量的维度
skip_window = 1 # 考虑前后单词的个数
num_skips = 2 # 几次利用同一个输入生成相应的标签.
num_sampled = 64 # 负样本采样个数
第五步 训练模型
迭代步数: 100001
第六步 可视化