word2vec (CBOW、分层softmax、负采样)
本文介绍
- wordvec的概念
- 语言模型训练的两种模型CBOW+skip gram
- word2vec 优化的两种方法:层次softmax+负采样
- gensim word2vec默认用的模型和方法
未经许可,不要转载。
机器学习的输入都是数字,而NLP都是文字; 为了让机器学习应用在NLP上,需要把文字转换为数字,把文字嵌入到数学空间。
1. 词表示:
词的独热表示:onehot (词之间是孤立的)
- onehot:
- 思想:假设词表大小为N, 则每个单字表示为N维向量; 每个单字只有1位为1,其他为0;茫茫0海中一个1
- 缺点:词之间是孤立的;维度太大
- onehot:
词的分布式表示:(能描述词之间的语义关系)
- 基于矩阵的分布式表示
- 基于聚类的分布式表示
- 基于神经网络的分布表示,词嵌入 word embedding
- 将01表示改为浮点数表述;降维
- word2vec是用神经网络训练语言模型(NNLM)过程中得到的参数.
其他概念
- 语言模型: 就是一段文字成为句子的概率; 经常用的ngram, n=2或3
2. NNLM 神经网络语言模型
用神经网络训练语言模型,常见有两种; 用上下文预测term(CBOW), 用term预测上下文(skip-gram),结构一般是简单三层网络,一个输入层、一个隐含层、一个输出层。
2.1 CBOW 连续词袋模型
- 变量:词表大小V, 要嵌入到N维空间中,C/2是窗口大小,即上下文取几个term(不算当前term);- N一般取50~300
- 步骤:参考自 https://www.zhihu.com/question/44832436
- input layer:窗口内的C个词的onehot表示
- input layer -> hidden layer:(V维表示降到N维表示)
- 通过权重矩阵\(W_{V\times N}\) ,将 \(V \times C\)映射为 $N \times C $
- hidden layer + 激活函数:C个词表示为1个词
- word2vec中激活函数,用了简单取平均;
- hidden layer -> output layer:1个N维词还原到高维V维中;
- 通过权重矩阵\(W_{N\times V}^{'}\) ,将 \(N \times 1\)映射为 \(V\times 1\)
- output layer + softmax 激活函数,将值归一化到0~1之间 y
- 用BP+梯度下降优化cost function y和真实y之间的距离,迭代优化参数 \(W、W^{'}\)
- 收敛result:y是V维向量,每个元素取值0~1, 将最大元素值,还原为onehot编码,就是最终结果了。
2.2 skip-gram 语言模型
思路同CBOW, 只是输入是1个词,输出是C个词;
一般用BP训练得到参数,预测用一次前向传播;
3. word2vec用的优化方法
word2vec结合了CBOW, skip-gram的方法 训练得到参数\(W\), 但在计算中做了很多优化;
可以看到,NNLM计算中,两个问题导致计算量大;
- 词表维度大;
- softmax计算量大;
下面介绍两种优化方法;
3.1 hierarchical softmax 层次softmax
/ˌhī(ə)ˈrärkikəl/
huffman: 带权路径长度最短为目标,可以用log(V)长度的编码表示
带权路径长度WPL:
- 图a: 5 * 2 + 7 * 2 + 2 * 2 +13 * 2 = 54
- 图b:5 * 3 + 2 * 3 + 7 * 2 + 13 * 1 = 48 (huffman, 带权路径长度较小)
- 参考自: https://zhuanlan.zhihu.com/p/56139075
层次softmax
softmax需要对每个词语都计算输出概率,并进行归一化,计算量很大;
进行softmax的目的是多分类,那么是否可以转成多个二分类问题呢, 如SVM思想? 从而引入了层次softmax示意图
为什么有效?
- 1)用huffman编码做词表示
- 2)把N分类变成了log(N)个2分类。 如要预测的term(足球)的编码长度为4,则可以把预测为'足球',转换为4次二分类问题,在每个二分类上用二元逻辑回归的方法(sigmoid);
- 3)逻辑回归的二分类中,sigmoid函数导数有很好的性质,\(\sigma^{'}(x) = \sigma(x)(1-\sigma(x))\)
- 4)采用随机梯度上升求解二分类,每计算一个样本更新一次误差函数
参考自:http://flyrie.top/2018/10/31/Word2vec_Hierarchical_Softmax/
gensim的word2vec 默认已经不采用分层softmax了, 因为$log_2 1000=10 $也挺大的;如果huffman的根是生僻字,则分类次数更多;
3.2 高频词抽样+负采样
为了解决NNLM中softmax过程的计算性能问题,通常有几种优化技巧:
- 将常见的单词组合(word pairs)或者词组作为单个“words”来处理
- 对高频次单词进行抽样来减少训练样本的个数
- 对优化目标采用“negative sampling”方法,这样每个训练样本的训练只会更新一小部分的模型权重,从而降低计算负担
参考自:https://www.jianshu.com/p/56554a63410f
3.2.1 对高频词抽样
主要思想是少训练没有区分度的高频term;
对于我们在训练原始文本中遇到的每一个单词,它们都有一定概率被我们从文本中删掉,而这个被删除的概率与单词的频率有关。词频越高(stopword),抽样越少;
抽样率 \(P(w_{i}) = (\sqrt{\frac{Z(w_i)}{t}}+1)\times \frac{t}{Z(w_i)} = \sqrt{\frac{t}{Z(w_i)}} + \frac{t}{Z(w_i)}\) ,其中
\(Z(w_i)\)是词在语料中的出现概率,反比关系,越高频词抽的越少;
\(t\)是设定的阈值,正比关系,\(t\)越大,不同频率单词的采样概率差异越大; gensim word2vec中默认值是0.001
抽样率直观理解
import numpy as np
import matplotlib.pyplot as plt x = np.array(range(1, 100)) / 1000.0
t1 = 0.001
t2 = 0.0001
y1 = np.power(t1/x, 0.5) + t1/x
y2 = np.power(t2/x, 0.5) + t2/x
plt.plot(x, y1, '-', label='t=0.001')
plt.plot(x, y2, '-', label='t=0.0001')
plt.legend()
3.2.2 负采样 Negative sampling
- 问题:在NNLM中对于每个样本w, 都要更新一次hidden->output的参数阵\(W^{'}_{N\times V}\),计算量很大;比如词表大小V=10000, N=300, 那么权重矩阵有300万个参数;
- 思想:如果每次只更新目标词(正例 positive word)和少数几个负例(negative words), 那么计算量会显著减少; 比如如果我们每次只更新M=1+5个,则更新了6*300=1800, 1800/300万=0.06%; 计算量减少了3个数量级。
- negative words如何选择:根据词表中出现的概率,出现概率越高,被选作负样本的概率越高;
- \(P(w_i) = \frac{f(w_i)^{3/4}}{\sum_{j=0}^{v}{f(w_j)^{3/4}}}\), 其中\(f(w_j)\)是出现的概率,3/4是经验值,比线性关系更弱化了些;
4. gensim word2vec默认参数(CBOW+负采样)
默认用了CBOW模型,采用高频词抽样+负采样进行优化;
from gensim.models import Word2Vec
word2vec.Word2Vec(sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False, callbacks=(), max_final_vocab=None)
- 上下文窗口大小:window=5
- 忽略低频次term:min_count=5
- 语言模型是用CBOW还是skip-gram?sg=0 是CBOW
- 优化方法是用层次softmax还是负采样:hs=0 是负采样
- 负采样样本数: negative=5 (一般设为5-20)
- 负采样采样概率的平滑指数:ns_exponent=0.75
- 高频词抽样的阈值 sample=0.001
word2vec (CBOW、分层softmax、负采样)的更多相关文章
- [DeeplearningAI笔记]序列模型2.7负采样Negative sampling
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.7 负采样 Negative sampling Mikolov T, Sutskever I, Chen K, et a ...
- 通俗易懂的word2Vec负采样理解
理解:http://www.shuang0420.com/2017/03/21/NLP%20%E7%AC%94%E8%AE%B0%20-%20%E5%86%8D%E8%B0%88%E8%AF%8D%E ...
- Hierarchical softmax(分层softmax)简单描述.
最近在做分布式模型实现时,使用到了这个函数. 可以说非常体验非常的好. 速度非常快,效果和softmax差不多. 我们知道softmax在求解的时候,它的时间复杂度和我们的词表总量V一样O(V),是性 ...
- word2vec:CBOW和skip-gram模型
1.CBOW模型 之前已经解释过,无论是CBOW模型还是skip-gram模型,都是以Huffman树作为基础的.值得注意的是,Huffman树中非叶节点存储的中间向量的初始化值是零向量,而叶节点对应 ...
- cs224d 作业 problem set1 (一) 主要是实现word2vector模型,SGD,CBOW,Softmax,算法
''' Created on 2017年9月13日 @author: weizhen ''' import numpy as np def sigmoid(x): return 1 / (1 + np ...
- word2vec的简单理解
word2vec研究如何将词用向量表示,使用的两个重要模型--CBOW模型(Continuous Bag-of-Words Model)和Skip-gram模型(Continuous Skip-gra ...
- 深度解析Word2vec
Word2vec 本质上是一种降维操作--把词语从 one-hot encoder 形式的表示降维到 Word2vec 形式的表示,即Distributed Representation.也就是,通过 ...
- Gensim进阶教程:训练word2vec与doc2vec模型
本篇博客是Gensim的进阶教程,主要介绍用于词向量建模的word2vec模型和用于长文本向量建模的doc2vec模型在Gensim中的实现. Word2vec Word2vec并不是一个模型--它其 ...
- gensim学习笔记
1.词向量建模的word2vec模型和用于长文本向量建模的doc2vec模型 在Gensim中实现word2vec模型非常简单.首先,我们需要将原始的训练语料转化成一个sentence的迭代器:每一次 ...
随机推荐
- 深入理解JAVA虚拟机 高效并发
处理器和缓存 由于计算机的存储设备与处理器的运算速度之间有着几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理之间的缓冲:将运算需要使用的数 ...
- Linux使echo命令输出结果带颜色
echo -e "\033[30m 黑色字 \033[0m"echo -e "\033[31m 红色字 \033[0m"echo -e "\033[3 ...
- java选做猜数字
程序设计思想 第一步:使用随机数生成1-100的数字 第二步:让用户输入数字 第三步:输入的数字与生成数字不同执行下一步,相同执行第五步 第四步:比较两数大小并输出结果,并返回第二步 第五步:输出猜对 ...
- IPython的简单介绍
量化投资与Python 目录: 一.量化投资第三方相关模块 NumPy:数组批量计算 Pandas:表计算与数据分析 Matplotlib:图表绘制 二.IPython的介绍 IPython:和Pyt ...
- 约瑟夫环(CVTE、网易2014.3.16笔试题offerP228)
题目:0,1,2,……,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 法一:用环形链表模拟圆圈的经典算法(时间复杂度O(nm),空间复杂 ...
- mysql——InnoDB 锁
https://www.cnblogs.com/leedaily/p/8378779.html 1.InnoDB锁的实现方式:给索引项加锁,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,I ...
- 【java工具类】下载文件
FileUtil.java /** * 下载文件 * @param file; * @param response */ public static void downloadFile(File fi ...
- JSP如何实现文件断点上传和断点下载?
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- SpringCloud 入门知识篇
SpringCloud 入门 springcloud 学习 7天学会springcloud 教程 https://www.cnblogs.com/skyblog/category/738524.htm ...
- 在Java web模板的上进行编写
要求: 链接:https://pan.baidu.com/s/15NdAt-aiv-X9sRbMSfXYXQ 提取码:7agw web模板: 链接:https://pan.baidu.com/s/1A ...