如何理解word2vec,以及相应库的使用

word2vec博客

简书word2vec博客

具体参数求解推导

1.什么是word2vec

  • 如果用一句比较简单的话来总结,word2vec是用一个一层的神经网络(即CBOW)把one-hot形式的稀疏词向量映射称为一个n维(n一般为几百)的稠密向量的过程。

  • 在 NLP 中,把 x 看做一个句子里的一个词语,y 是这个词语的上下文词语,那么这里的 f,便是 NLP 中经常出现的『语言模型』(language model),这个模型的目的,就是判断 (x,y) 这个样本,是否符合自然语言的法则,更通俗点说就是:词语x和词语y放在一起,是不是人话。

  • Word2vec 正是来源于这个思想,但它的最终目的,不是要把 f 训练得多么完美,而是只关心模型训练完后的副产物——模型参数(这里特指神经网络的权重),并将这些参数,作为输入 x 的某种向量化的表示,这个向量便叫做——词向量。

2.CBOW和Skip-Gram

  • word2vec里面有两个重要的模型-CBOW模型(Continuous Bag-of-Words Model)与Skip-gram模型。

如何理解word2vec,以及相应库的使用_第1张图片

  • CBOW就是根据某个词前面的C个词或者前后C个连续的词,来计算某个词出现的概率
  • 其中CBOW很好理解,输入是窗口内的其他的词的one-hot,输出是中间的词的one-hot
  • Skip-Gram Model相反,是根据某个词,然后分别计算它前后出现某几个词的各个概率
  • Skip-Gram输入输出数据如下图:

3.Skip-Gram的训练数据

如何理解word2vec,以及相应库的使用_第2张图片

3.CBOW的训练过程

如何理解word2vec,以及相应库的使用_第3张图片

词向量最简单的方式是1-of-N的one-hot方式。onehot对于同学们来说都很熟悉了,也就是从很大的词库corpus里选V个频率最高的词(忽略其他的) ,V一般比较大,比如V=10W,固定这些词的顺序,然后每个词就可以用一个V维的稀疏向量表示。

  • 在上图中

    1. Input layer是输出层:是上下文单词的one-hot表示。假设单词向量空间的维度为V,即整个词库corpus大小为V,上下文单词窗口的大小为C。
    2. 假设最终词向量的维度大小为N,则图中的权值共享矩阵为W。W的大小为 V * N,并且初始化。
    3. 假设语料中有一句话”我爱你”。如果我们现在关注”爱”这个词,令C=2,则其上下文为”我”,”你”。模型把”我” “你”的one-hot形式作为输入。易知其大小为1*V。C个1*V大小的向量分别跟同一个V * N大小的权值共享矩阵W相乘,得到的是C个1*N大小的隐层hidden layer。
    4. C个1*N 大小的hidden layer求和之后取平均,得到一个1 * N大小的向量,即图中的Hidden layer。
    5. 输出权重矩阵W’为N * V,并进行相应的初始化工作。
    6. 将得到的Hidden layer向量 1*N与W’相乘,并且用softmax处理,得到1*V的向量,此向量的每一维代表corpus中的一个单词。概率中最大的index所代表的单词为预测出的中间词。
    7. 与原始预料中的one-hot比较,迭代求损失的极小值。
  • 该模型训练过程中得出的权值矩阵 W V × N W_{V \times N} WV×N就是我们最后需要的词向量表示。

gensim库

class gensim.models.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, 
                                      cbow_mean=1, 
                                      hashfxn=<built-in function hash>,
                                      iter=5,
                                      null_word=0, 
                                      trim_rule=None, 
                                      sorted_vocab=1, 
                                      batch_words=10000)
  • 参数
参数 含义
sentences 可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
sg 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
size 是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
window 表示当前词与预测词在一个句子中的最大距离是多少
alpha 是学习速率
min_alpha 最小的学习率,训练的过程中学习率会递减到这个值
seed 用于随机数发生器。与初始化词向量有关。
min_count 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
max_vocab_size 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
sample 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
workers 参数控制训练的并行数。
hs 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
negative 如果>0,则会采用negative samping,用于设置多少个noise words。通常在[5-20]。如果是0则没有negative sampling使用。
cbow_mean 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
hashfxn hash函数来初始化权重。默认使用python的hash函数
iter 迭代次数,默认为5
trim_rule 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。
sorted_vocab: 如果为1(defaut),则在分配word index 的时候会先对单词基于频率降序排序。
batch_words 每一批的传递给线程的单词的数量,默认为10000
  • 关于词向量负采样训练模式可见下面博客

    云熙社区讲解word2vec负采样训练

  • 关于哈夫曼树训练见下面博客

    哈夫曼树训练

你可能感兴趣的:(深度学习,自然语言处理,python)