精华内容
下载资源
问答
  • 6.4 PyTorch实现Skipgram模型

    千次阅读 2020-02-15 19:45:50
    :语料一方面用于构建词典,另一方面需要预处理成模型可以读入的训练对(x,y), skipgram是输入中心词,预测上下文词,因此其数据对应为(center_word, contenx_word),且需要转换成索引形式(center_word_ix, contenx...

    欢迎订阅本专栏:《PyTorch深度学习实践》
    订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html

    • 第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础。
    • 第三章:学习PyTorch如何读入各种外部数据
    • 第四章:利用PyTorch从头到尾创建、训练、评估一个模型,理解与熟悉PyTorch实现模型的每个步骤,用到的模块与方法。
    • 第五章:学习如何利用PyTorch提供的3种方法去创建各种模型结构。
    • 第六章:利用PyTorch实现简单与经典的模型全过程:简单二分类、手写字体识别、词向量的实现、自编码器实现。
    • 第七章:利用PyTorch实现复杂模型:翻译机(nlp领域)、生成对抗网络(GAN)、强化学习(RL)、风格迁移(cv领域)。
    • 第八章:PyTorch的其他高级用法:模型在不同框架之间的迁移、可视化、多个GPU并行计算。

    skipgram是很经典的词向量模型,在大量的语料上进行训练,得到每个词的嵌入向量。

    相关论文

    • “Distributed Representations of Sentences and Documents”
    • “Efficient estimation of word representations in vector space”

    相关博客

    • 网上搜索“word2vec","skipgram"一搜一大把
    • 对词向量的系统了解可以参考我的博客:https://blog.csdn.net/sinat_33761963/article/details/53521149

    现在来看看PyTorch如何实现Skipgram并训练后获取词向量。

    6.4.1 准备数据

    准备语料:一般情况下语料会存储在文本文件中,一句话为一行,用python都进来后存放在一个list中,每个元素是文本中的一行。接着对每行为本做分词,英文可以直接按照空格分,中文就需要用到分词器了,分割后就得到了以下代码中的corpus_list。

    构建词典:这一步不可或缺,我们要将每个词都转换成数字代表的索引,方便模型识别,而模型输出的索引,也需要再转变为文字,方便人查看。因此,需要建立两个dict, 一个是{索引:词}, 一个是{词:索引},即代码中的ix2word, word2ix。

    构建训练对:语料一方面用于构建词典,另一方面需要预处理成模型可以读入的训练对(x,y), skipgram是输入中心词,预测上下文词,因此其数据对应为(center_word, contenx_word),且需要转换成索引形式(center_word_ix, contenx_word_ix)

    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    
    # 准备语料
    corpus = ['he is a king',
              'she is a queen',
              'he is a man',
              'she is a woman',
              'warsaw is poland capital',
              'berlin is germany capital',
              'paris is france capital']
    corpus_list = [sentence.split() for sentence in corpus]
    
    
    # 构建词典
    word2ix = {}
    for sentence in corpus:
        for word in sentence.split():
            if word not in word2ix:
                word2ix[word] = len(word2ix)  # 为每个词都匹配一个索引
    ix2word = {v:k for k, v in word2ix.items()}  # 将dict中的key与value互换位置
    voc_size = len(word2ix)
    
    
    # 构建训练对
    WINDOWS = 2  # 取左右窗口的词作为context_word
    pairs = []  # 存放训练对
    
    for sentence in corpus_list:
        for center_word_index in range(len(sentence)):
            center_word_ix = word2ix[sentence[center_word_index]]
            for win in range(-WINDOWS, WINDOWS+1):
                contenx_word_index = center_word_index + win
                if 0 <= contenx_word_index <= len(sentence)-1 and contenx_word_index != center_word_index:
                    context_word_ix = word2ix[sentence[contenx_word_index]]
                    pairs.append((center_word_ix, context_word_ix))
    

    6.4.2 构建SkipGram网络结构

    x: 输入的x是一个大小为voc_dim的one-hot向量[0,0,…,1,…0]

    嵌入矩阵:构建一个嵌入矩阵,它的大小是(emb_dim, voc_dim),emb_dim是词向量的维度, voc_dim是词典的大小。这个矩阵中的值是我们最终要求取的数据,因此它是参数,可以用nn.Parameter()来创建这个矩阵参数。
    该矩阵乘以x会得到一个emb_dim大小的向量,就是forward函数中的变量emb

    线性计算:参数W乘以emb,是一个线性计算的过程,输出voc_dim大小的向量

    softmax计算:线性计算的输出再经过一个softmax后,输出大小与输入保持一致,但向量中的值变成了0-1的概率,即得到了词典中所有词作为输出x的下文词的概率。

    前向计算结束。

    注意:torch.nn.init.xavier_normal是初始化参数的一种方式,以避免参数过大或过小而阻碍正常训练。

    class SkipGram(nn.Module):
        def __init__(self, voc_dim, emb_dim):
            super(SkipGram, self).__init__()
            # 初始化参数
            self.embedding_matrix = nn.Parameter(torch.FloatTensor(emb_dim, voc_dim))
            self.W = nn.Parameter(torch.FloatTensor(voc_dim, emb_dim))
            torch.nn.init.xavier_normal(self.embedding_matrix)
            torch.nn.init.xavier_normal(self.W)
    
        def forward(self, x):
            emb = torch.matmul(self.embedding_matrix, x)
            h = torch.matmul(self.W, emb)  # [voc_dim]
            log_softmax = F. log_softmax(h)  # [voc_dim]
    
            return log_softmax
    

    6.4.3开始训练

    还是老套路。

    注意,这是一个为了演示的小例子,所以epoch, embedding_dim都设置的很小,在实际训练中要根据实际效果去设置,embedding_dim一般可以设置为100.

    # 提前设置超参数
    epoch = 10
    lr = 1e-2
    embedding_dim = 5
    
    # 模型、优化器、损失
    model = SkipGram(voc_size, embedding_dim)
    optim = torch.optim.Adam(model.parameters(), lr=lr)
    loss_f = torch.nn.NLLLoss()  
    
    # 这是将索引变成词典大小的One-Hot向量的方法
    def get_onehot_vector(ix):
        one_hot_vec = torch.zeros(voc_size).float()
        one_hot_vec[ix] = 1.0
        return one_hot_vec
    
    # 迭代
    for e in range(epoch):
        epoch_loss = 0
    
        for i, (center_ix, context_ix) in enumerate(pairs):
            optim.zero_grad()
    
            # 预处理好数据结构
            one_hot_vec = get_onehot_vector(center_ix)
            y_true = torch.Tensor([context_ix]).long()
    
            # 前向
            y_pred = model(one_hot_vec)
            loss = loss_f(y_pred.view(1, -1), y_true)
    
            # 后向
            loss.backward()
            epoch_loss += loss.data.item()
    
            # 梯度更新
            optim.step()
    
        if e % 2 == 0:
            print('epoch: %d, loss: %f' % (e, epoch_loss))
      
    
    C:\Users\CC\Anaconda3\lib\site-packages\ipykernel_launcher.py:7: UserWarning: nn.init.xavier_normal is now deprecated in favor of nn.init.xavier_normal_.
      import sys
    C:\Users\CC\Anaconda3\lib\site-packages\ipykernel_launcher.py:8: UserWarning: nn.init.xavier_normal is now deprecated in favor of nn.init.xavier_normal_.
      
    C:\Users\CC\Anaconda3\lib\site-packages\ipykernel_launcher.py:13: UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to include dim=X as an argument.
      del sys.path[0]
    
    
    epoch: 0, loss: 190.530474
    epoch: 2, loss: 178.796980
    epoch: 4, loss: 153.809181
    epoch: 6, loss: 134.125972
    epoch: 8, loss: 126.447176
    

    6.4.4 预测

    以上训练结束,我们得到了嵌入矩阵model.embedding_matrix,它的每一列代表一个词的嵌入向量。可以通过以下方式获取。

    # # 3.预测:预测单词的向量并计算相似度
    v1 = torch.matmul(model.embedding_matrix, get_onehot_vector((word2ix['he'])))
    v2 = torch.matmul(model.embedding_matrix, get_onehot_vector((word2ix['she'])))
    v3 = torch.matmul(model.embedding_matrix, get_onehot_vector((word2ix['capital'])))
    
    print(v1)
    print(v2)
    print(v3)
    
    s_v1_v2 = F.cosine_similarity(v1, v2, dim=0)
    s_v1_v3 = F.cosine_similarity(v1, v3, dim=0)
    print(s_v1_v2)
    print(s_v1_v3)
    
    tensor([ 0.7496, -1.2529, -1.1052,  0.3301, -0.9289], grad_fn=<MvBackward>)
    tensor([ 0.2016, -1.9385, -0.7472,  0.0589, -0.8677], grad_fn=<MvBackward>)
    tensor([-1.1139, -0.1073,  0.2193,  1.3546, -0.8456], grad_fn=<MvBackward>)
    tensor(0.8998, grad_fn=<DivBackward1>)
    tensor(0.0710, grad_fn=<DivBackward1>)
    
    展开全文
  • CBOW 与 skip-gram

    千次阅读 2020-05-15 15:21:26
    skip-gram结构是利用中间词预测邻近词 cbow模型是利用上下文词预测中间词 一、CBOW 1、 CBOW之所以叫连续词袋模型,是因为在每个窗口内它也不考虑词序信息,因为它是直接把上下文的词向量相加了,自然就损失了...

    skip-gram是利用中间词预测邻近词

    cbow是利用上下文词预测中间词

    一、CBOW

    1、continues bag of words。其本质是通过context来预测word

    CBOW之所以叫连续词袋模型,是因为在每个窗口内它也不考虑词序信息,因为它是直接把上下文的词向量相加了,自然就损失了词序信息。CBOW抛弃了词序信息,指的就是在每个窗口内部上下文直接相加而没有考虑词序。

    2、CBOW过程

    简单介绍如下(实际算法会用到哈夫曼编码等降维技巧,这里仅以理解为目的简介基本原理):

    如上图所示,首先语料库内的每个word都可以用one-hot的方式编码。假设选取Context Window2,那么模型中的一对inputtarget就是:

    • inputHeisone-hot编码
    • targetaone-hot编码
    1. 输入为CV维的vector。其中C为上下文窗口的大小,V为原始编码空间的规模。例如,示例中的C=2V=4.两个vector分别为4维的Heisone-hot编码形式;
    2. 激活函数相当简单,在输入层和隐藏层之间,每个input vector分别乘以一个VxN维度的矩阵,得到后的向量各个维度做平均,得到隐藏层的权重。隐藏层乘以一个NxV维度的矩阵,得到output layer的权重;
    3. 隐藏层的维度设置为理想中压缩后的词向量维度。示例中假设我们想把原始的4维的原始one-hot编码维度压缩到2维,那么N=2
    4. 输出层是一个softmax层,用于组合输出概率。所谓的损失函数,就是这个outputtarget之间的的差(outputV维向量和input vectorone-hot编码向量的差),该神经网络的目的就是最小化这个loss
    5. 优化结束后,隐藏层的N维向量就可以作为Word-Embedding的结果。

    如此一来,便得到了既携带上下文信息,又经过压缩的稠密词向量(维度经过压缩便于运算)。

    输入层(C × V)——> 输入*矩阵W(V × N)得到隐藏层——> 平均 ——> * W' (N × V)——> 输出层 ——> softmax 

    3、

    CBOW模型窗口内部抛弃了词序信息,对语言来说语序是很重要的,‘我爱你’的词袋特征是‘我’ ‘爱’ ‘你’ ,‘你爱我’的词袋特征是‘你’ ‘爱’ ‘我’,这两个句子的特征是完全相同的,但是这两个句子的语义是不一样的,如果在CBOW窗口内加入n-gram特征(比如2-gram)就会得到额外的信息,第一个句子的2gram特征是‘我爱’和‘爱你’,第二个句子的特征是‘你爱’ 和‘爱我’,这样就把上下文完全相同的两个句子区分开了,这种做法就是fastText的做法。

    二、skip-gram

    1、核心:

            通过查看所有语料的词作为中心词时,其(中心词)与上下文的2m个词语的所有共现情况,这样就得到我们要逼近的中心词与上下文对应关系的条件概率分布(这个概率分布是忽视掉了上下文词语间的顺序的),我们通过模型去训练出词典中心词向量矩阵和词典上下文词向量矩阵(这两个矩阵就是存储了语料中中心词与其上下文的对应关系信息)。

    2、【窗口大小(上下文词语数量m)】

      即指定中心词后我们关注的上下文数量定为该中心词前m个词和后m个词(一共2m个上下文词)。

    3、【词典中心词向量矩阵(下图d×V维的 W 矩阵)】

      通俗来说词典中心词向量矩阵是由词典中的一个单词的词向量组合而成的(每一列就是词典中的一个单词的词向量),而每一个词的词向量就是假设我们的词典包含了d个维度的抽象信息。

    4、【词典上下文词向量矩阵(下图的V×d维的 W' 矩阵)】

      类似词典中心词向量矩阵,但这里的词向量中d个维度储存的抽象信息,是作为上下文的词而言,它与中心词之间的对应关系信息。

    5、【最后Softmax归一化后输出的概率向量(下图p(x|c)】

      就是词典中每个词成为当前指定中心词的上下文的概率。我们要让这个概率向量,逼近真实语料中基于指定中心词基础上这些上下文词语出现的条件概率分布。

    6、举例

    设 y 是 x 的上下文,所以 y 只取上下文里一个词语的时候,语言模型就变成:用当前词 x 预测它的下一个词 y

    第一步:x的输入,one-hot encoder形式,本质上是用一个只含一个 1、其他都是 0 的向量来唯一表示词语。

    假设全世界所有的词语总共有 V 个,则x1, x2, … xk … xv。

    输出y 是在这 V 个词上输出的概率,y1,y2,… yj …yv。

    第二步:Skip-gram 的网络结构

    第三步:当模型训练完后,最后得到的其实是神经网络的权重

    比如现在输入一个 x 的 one-hot encoder: [1,0,0,…,0],对应刚说的那个词语『吴彦祖』,则在输入层到隐含层的权重里,只有对应 1 这个位置的权重被激活,这些权重的个数,跟隐含层节点数(N)是一致的,从而这些权重组成一个向量 vx 来表示x,而因为每个词语的 one-hot encoder 里面 1 的位置是不同的,所以,这个向量 vx 就可以用来唯一表示 x。

    7、总结:

    输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax回归。当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

    Skip-gram每一轮指定一个中心词的2m个上下文词语来训练该中心词词向量和词典上下文词向量,下一轮则指定语料中下一个中心词,查看其2m个上下文词语来训练。

    参考资料:【原创】关于skip-gram的个人理解 - 海上流星 - 博客园

    Word Embedding的发展和原理简介 - 简书

    最终优化:https://www.jianshu.com/p/8e291e4ba0da

    展开全文
  • 二 模型 Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,从算法角度看,这两种方法非常相似,其区别为CBOW根据源词上下文词汇预测input word,Skip-Gram是给定input word来预测上下文。 如果想深入了解word2vec...

    一背景

    非专业,业务又有这方面需要,强迫自己看一下NLP相关的背景知识。数学不高,不奢望能看懂,要是有大神能从小白的角度去讲解就好了。

    NLP 入门整理(不定期更新)

    Word2Vec前序 语言模型学习

    相关知识点:

    要知道词向量:神经网络只能接受数值输入,而且不同词汇之间可能存在的关联信息也需要挖掘。为啥不用one hot编码,维度太大计算量太大。

       还有计算相似度的有一种方法就是利用夹角余弦。

    词嵌入:word embedding,相关理论:上下文相似的词,其语义也相似。而word embedding是一个将词向量化的概念。

    向量空间模型:向量空间模型 (VSMs)将词汇表达(嵌套)于一个连续的向量空间中,语义近似的词汇被映射为相邻的数据点。常见分类有基于统计的、基于神经概率化语言模型预测的。

    简单概括下:

    Word2Vec其实就是通过学习文本来用词向量的方式表征词的语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。

    要是还觉得抽象,那就用网上常见的例子,cat这个单词和kitten(小猫)属于语义上很相近的词,而dog和kitten则不是那么相近,iphone这个单词和kitten的语义就差的更远了。

    二 模型

      Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,从算法角度看,这两种方法非常相似,其区别为CBOW根据源词上下文词汇预测input word,Skip-Gram是给定input word来预测上下文。

    如果想深入了解word2vec及其内部的数学推导,可以看大神peghoty的博客,这是我见过最全的word2vec原理讲解,下面是peghoty大神的文章节选。

    要是数学好,你那就直接看peghoty大神那种带着数学推导的解释原理的就行。我看不懂,就先看一些偏直观一些的扫盲文章。

    Skip-gram

    方便理解,也是3层结构。也是input word和output word都是one-hot编码的向量。最终模型的输出是一个概率分布。注意这是skip-gram模型的一个理解,Word2Vec的实际实现的输出层是Huffman Tree,不是简单的softmax.

    来看下隐层。如果我们现在想用300个特征来表示一个单词(即每个词可以被表示为300维的向量)。那么隐层的权重矩阵应该为10000行,300列(隐层有300个结点)。

    看下面的图片,左右两张图分别从不同角度代表了输入层-隐层的权重矩阵。左图中每一列代表一个10000维的词向量和隐层单个神经元连接的权重向量。从右边的图来看,每一行实际上代表了每个单词的词向量。

    上面我们提到,input word和output word都会被我们进行one-hot编码。仔细想一下,我们的输入被one-hot编码以后大多数维度上都是0(实际上仅有一个位置为1),所以这个向量相当稀疏,它会消耗相当大的计算资源,为了高效计算,它仅仅会选择矩阵中对应的向量中维度值为1的索引行。

    按照矩阵乘法的规则计算方式是十分低效的。为了有效地进行计算,这种稀疏状态下不会进行矩阵乘法计算,可以看到矩阵的计算的结果实际上是矩阵对应的向量中值为1的索引,这样模型中的隐层权重矩阵便成了一个”查找表“(lookup table),进行矩阵计算时,直接去查输入向量中取值为1的维度下对应的那些权重值。隐层的输出就是每个输入单词的“嵌入词向量”。

       输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),这些所有输出层神经元结点的概率之和为1。

    模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。直观来看,下面的图中给出了一些我们的训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。

    我们的模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“Soviet“,”Union“)这样的训练样本对,而对于(”Soviet“,”Sasquatch“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词”Soviet“作为输入,输出的结果中”Union“或者”Russia“要比”Sasquatch“被赋予更高的概率。

       可以这样理解:比如对于同义词“intelligent”和“smart”,我们觉得这两个单词应该拥有相同的“上下文”,就是窗口词很相近。那么通过我们的模型训练,这两个单词的嵌入向量将非常相似。

    两个加速优化方法

    上面我们了解skip-gram的输入层、隐层、输出层。然而,每当计算一个词的概率都要对词典里的V个词计算相似度,然后进行归一化,这基本上时不现实的。为此,Mikolov引入了两个加速手段:层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。普遍认为Hierarchical Softmax对低频词效果较好;Negative Sampling对高频词效果较好,向量维度较低时效果更好。

    简单来说,Hierarchical Softmax是一种对输出层进行优化的策略,输出层从原始模型的利用softmax计算概率值改为了利用Huffman树计算概率值。

    Huffman树

    Huffman编码又称为最优二叉树,表示一种带权路径长度最短的二叉树。带权路径长度,指的就是叶子结点的权值乘以该结点到根结点的路径长度。而我们需要构造的Huffman树结构,是以词表为根结点,每一个子节点为父节点的不相交子集,词为叶节点的结构。我们将叶节点的权值转化为词频,则带权路径长度指的就是词频乘以路径的大小,带权路径最小的条件使得构造出来的霍夫曼树中,高频词离根结点更近,而低频词离根结点更远。其构造的Huffman树如下所示

    在构建Huffman树的同时,会为每一个非叶子节点初始化一个向量,该向量用于与预测向量求条件概率,从根节点出发到叶子节点,走到指定叶子节点  的过程,就是一个进行  次二分类的过程:路径上的每个非叶子节点都拥有两个孩子节点,从当前节点 n(w,j)n(w,j) 向下走时共有两种选择,走到左孩子节点  就定义为分类到了正类,走到右孩子节点就定义为分类到了负类。

    公式不贴了,效果就是把 N 分类问题变成 log(N)次二分类。代价是人为增强了词与词之间的耦合性(实际上大部分呢业务场景你能满足,不用纠结)

    负采样(Nagative Sampling)

    NCE算法改造的是模型的似然函数,Skip-gram模型其原始的似然函数对应着一个多项分布。怎么计算推导过程我不贴了,主要是看不懂。

    不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。

    直观感受:当我们用训练样本 ( input word: "fox",output word: "quick") 来训练我们的神经网络时,“ fox”和“quick”都是经过one-hot编码的。如果我们的vocabulary大小为10000时,在输出层,我们期望对应“quick”单词的那个神经元结点输出1,其余9999个都应该输出0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们称为“negative” word。

      当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的“positive” word进行权重更新(在我们上面的例子中,这个单词指的是”quick“)。

      作者给出的经验参考值:小规模选择5-20个,大规模选择2-5个。

    回忆一下我们的隐层-输出层拥有300 x 10000的权重矩阵。如果使用了负采样的方法我们仅仅去更新我们的positive word-“quick”的和我们选择的其他5个negative words的结点对应的权重,共计6个输出神经元,相当于每次只更新300*6=1800个权重。对于3百万的权重来说,相当于只计算了0.06%的权重,这样计算效率就大幅度提高。

    一个单词被选作negative sample的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words。

    word2vec的局限性

    总的来说,word2vec通过嵌入一个线性的投影矩阵(projection matrix),将原始的one-hot向量映射为一个稠密的连续向量,并通过一个语言模型的任务去学习这个向量的权重,而这个过程可以看作是无监督或称为自监督的,其词向量的训练结果与语料库是紧密相关的,因此通常不同的应用场景需要用该场景下的语料库去训练词向量才能在下游任务中获得最好的效果。这一思想后来被广泛应用于包括word2vec在内的各种NLP模型中,非常经典,局限性如下:

    1. 在模型训练的过程中仅仅考虑context中的局部语料,没有考虑到全局信息;
    2. 英语不需要考虑分词,中文需要考虑(我们在训练词向量之前首先要解决分词的问题,分词直接影响词向量的质量)。

      参考:

    https://www.cnblogs.com/peghoty/p/3857839.html

    https://zhuanlan.zhihu.com/p/27234078

    https://zhuanlan.zhihu.com/p/33799633

    https://zhuanlan.zhihu.com/p/28894219

     

    展开全文
  • word2vec skip gram 直观理解 目标 根据给定的单词预测与该单词同处一个窗口内其他每个单词出现的概率 目标损失函数:针对每个窗口内非target word 的context word,构建 C(θ)=−∑wi∑c=1Clogp(wO,c∣wI)C(\theta...

    word2vec skip gram 直观理解

    • 目标
      根据给定的单词预测与该单词同处一个窗口内其他每个单词出现的概率
    • 目标损失函数:
      针对每个窗口内非target word 的context word,构建
      C ( θ ) = − ∑ w i ∑ c = 1 C l o g p ( w O , c ∣ w I ) C(\theta) = - \sum_{w_i}\sum_{c=1}^Clogp(w_O,c | w_I) C(θ)=wic=1Clogp(wO,cwI)损失函数并利用最大似然估计进行求解。在这里插入图片描述
    • 网络结构
      第一层为输入的单词one-hot向量,维度为1xV,V代表词表中所有词的个数。
      中间为隐层,神经元个数代表了压缩后每个词向量的维数N,常见个数有100,200,300。
      隐层和输入层间的矩阵V维度为VxN,待学习完成后,每一行的向量对应着词表中每个词作为target词时的词向量。
      隐层和输出层间的矩阵N维度为NxV,待学习完成后,每一列的向量对应着词表中每个词每个词作为context 词时的词向量。
      在这里插入图片描述
    • 隐层权重矩阵V
      我们用h代表输入词的one-hot向量x和V矩阵点积之后的结果,对应V矩阵中的第k行,x中等于1的那行为k,k的取值范围是整个词表的大小V。

    在这里插入图片描述

    • 隐层权重矩阵N
      wj为窗口内任意一个context词,其向量 v w j ′ v'_{w_j} vwj为N矩阵中的一列。 s j c s_{jc} sjc代表输入词和一个窗口内的context词点积后的结果,对该结果进行softmax操作即可得知输入一个target word,窗口内每个context word 的输出概率 p ( w j = w O , c ∣ w I ) p(wj = w_{O,c} | w_I) p(wj=wO,cwI)
      在这里插入图片描述

    训练过程

    • 损失函数
      在这里插入图片描述

    从第一步到第二步是将联合概率写为C个 p ( w j = w O , c ∣ w I ) p(w_j = w_{O},c \mid w_I) p(wj=wO,cwI)乘积的形式

    • SGD update for W ′ W^{\prime} W

    在这里插入图片描述
    t j c t_{jc} tjc起到指示作用,当 w j c w_{jc} wjc不在window内时为0,此时产生误差 e j c e_{jc} ejc

    • SGD update for W W W
      值得注意的是在计算 ∂ C ( θ ) ∂ h i \frac{\partial C(\theta)}{\partial h_{i}} hiC(θ)时需要对所有的 s j s_{j} sj计算偏导数,这与更新 W ′ W^{\prime} W ∂ C ( θ ) ∂ s j c \frac{\partial C(\theta)}{\partial s_{jc}} sjcC(θ)时不同,因为后者只需要考虑context word的向量而非所有词典中词的向量
      在这里插入图片描述

    通过用向量表示求和过程,可以得到输出词向量和输入词向量对应的 v w j ′ v'_{w_j} vwj v w I v_{w_I} vwI的更新公式
    在这里插入图片描述

    需要注意的是在更新 v w I v_{w_I} vwI时需要遍历词典中的每个词,会造成计算的不便,于是优化方法hierarchical softmax 和negative sampling被提出

    负采样

    相比于原始模型每次更新所有的输入词向量 v w I v_{w_I} vwI,负采样在每次更新时只选取一些输出词而不是整个词典,即 w j ∈ { w O } ∪ W n e g w_{j} \in\left\{w_{O}\right\} \cup \mathcal{W}_{\mathrm{neg}} wj{wO}Wneg
    在这里插入图片描述

    参考资料:台大《应用深度学习》

    展开全文
  • NLP之---word2vec算法skip-gram原理详解

    万次阅读 多人点赞 2019-05-19 16:21:45
    1.词嵌入(word2vec) 自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。顾名思义,词向量是用来表示词的向量,也可被认为是词的特征向量或...假设词典中不同词的数量(词典大小)为NNN...
  • Skip-Gram模型深度解析

    千次阅读 2019-05-07 10:30:58
    Skip-Gram模型的深度解析: 本文转载于简书,地址: https://www.jianshu.com/p/da235893e4a5 如有冒犯,请来联系,还望谅解。 什么是Word2Vec和Embeddings?   Word2Vec是从大量文本语料中以无监督的方式学习...
  • 二、Skip-Gram模型 skip-gram是给定输入的单词来预测上下文,实际上分为两部分:建立模型和通过模型获取嵌入词向量。建模过程会先基于训练数据构建一个神经网络,当模型训练好后,我们不会用训练好的模型处理新任务...
  • word2vec(一)——skip-gram原理理解

    千次阅读 2020-08-28 23:47:57
    目录 1 什么是word2vec 2 skip-gram模型 2.1 skip-gram模型用来做什么 2.2 什么是Fake Task? 2.3 skip-gram模型细节 2.3.1 输入层 2.3.2 隐层 2.3.3 输出层 2.4 skip-gram公式推导 3 其他补充 1 什么是word2vec ...
  • 详解 Word2vec 之 Skip-gram 模型

    千次阅读 2021-10-07 16:37:04
    Skipgram是一种获得词嵌入的模型,也是 Word2VecWord2Vec最基础的方法之一。
  • 目录 前言 一、什么是Skip-gram算法 ...四、skipgram代码实现 4.1 如何把词转换为向量 4.2 CBOW和Skip-gram的算法实现 Skip-gram的理想实现 Skip-gram的实际实现 4.3 使用Pytorch实现Skip-gram .
  • 理解 Word2Vec 之 Skip-Gram 模型

    千次阅读 2019-07-28 15:42:14
    Word2Vec 之 Skip-Gram 模型 1 什么是Word2Vec和Embeddings? 2 模型(结构篇) 2.1 The Fake Task 2.2 模型细节 2.3 隐层 2.4 输出层 3 直觉上的理解 4 如何在skip-gram模型上进行高效的训练(训练篇) ...
  • CBOW 和 Skip-Gram

    2020-05-30 20:00:49
    在 Word2Vec 中,Embedding 是一个映射,将词从原先所属的空间映射到新的多维空间中,也就是把词从原先所在空间嵌入到一个新的...本文介绍的 CBOW 和 Skip-Gram 是生成 Embedding 矩阵比较著名的两种无监督训练方法。
  • 【Keras】word2vec_skipgram

    千次阅读 2018-08-14 21:56:36
    对每个句子提取出3个连续单词组成一个tuple=(left,center,right),skipgram模型(假设词窗大小为3)的目标是从center预测出left、从center预测出right。 因此对于每个tuple=(left,center,right)的数据,整理...
  • [gensim中word2vec python源码理解(一)初始化构建...gensim中word2vec python源码理解(二)Skip-gram模型训练 本文是在上一篇《使用Hierarchical Softmax方法构建单词表》的基础上,继续记录对word2vec源码的...
  • word2vec中Skip-Gram和CBOW

    千次阅读 2019-06-11 15:55:19
    Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,本文将详细介绍这两种模型。 CBOW CBOW全称是Continuous Bag of Words Model,即连续词袋模型,模型如下图(图为七月在线NLP课程截图) 由图可看出,CBOW的...
  • 不过无论是 CBOW 还是 SkipGram 都无法规避一个问题,就是过高的词典容量。正常情况下,英语词典的容量在 3000 ~ 4000 上下,因此当训练语料很大时会造成巨大的计算负担。为了权衡质量和效率,目前最常用的方法就是...
  • 作者:猫猫 CSDN:猫猫玩机器学习导读word2vec主要实现方法是Skip-gram和CBOW,CBOW的目标是根据上下文来预测当前词的...
  • (>﹏),而且有些代码有错误,这里记录一些学习代码过程中的问题,这里构建的方式是Skip-Gram,代码不全部写出,只写一些觉得重要的地方。 首先,如果想要了解详细的数学原理,可以移步word2vec中的数学原理,文档...
  • "\\text8.train.txt" with open(path,"r") as fin: text = fin.read() text = word_tokenize(text) vocab = dict(Counter(text).most_common(MAX_VOCAB_SIZE - 1))#建立词典,最后一位留给不常用或者没出现过的单词 ...
  • 这是一个关于 Skip-Gram 模型的系列教程,共分为结构、训练和实现三个部分,本文为最后一部分:实现篇。 前言 上一篇的专栏介绍了Word2Vec中的Skip-Gram模型的结构和训练,如果看过的小伙伴可以直接开始动手用...
  • 举个例子,在skip-gram模型中,训练样本为(inputword, outputword)单词对,模型的输入为inputword,是用one-hot表示的向量,模型的输出为一个概率分布,也就是词典中每个词被预测为outputword的概率。 假设输入为...
  • 这个博客初衷是学习word2vec,实现skip-gram模型。但学习过程中遇到了很多不会的,就补一补其它的知识,实践时也遇到了一些命令语句不懂是什么意思,现在对学习时遇到的问题以及参考资料做一个总结,供大家参考。 ...
  • Skip-Gram模型理解

    2019-03-05 17:44:20
    Skip-Gram模型理解 什么是Word2Vec和Embeddings?   Word2Vec是从大量文本语料中以无监督的方式学习语义知识的一种模型,它被大量地用在自然语言处理(NLP)中。那么它是如何帮助我们做自然语言处理呢?Word2Vec...
  • word2vec中提出了两种模型来进行word embedding,分别是Skip-gram 和 CBOW(continuous bag of words),这两种模型的概念在Word2vec之前就已经提出来了。 下面先对两种模型做个简要的介绍: Skip-gram : 给定...
  • 一文详解 Word2vec 之 Skip-Gram 模型(结构篇)

    万次阅读 多人点赞 2018-05-25 09:40:20
    这次的分享主要是对Word2Vec模型的两篇英文文档的翻译、理解和整合,这两篇英文文档都是介绍Word2Vec中的Skip-Gram模型。下一篇专栏文章将会用TensorFlow实现基础版Word2Vec的skip-gram模型,所以本篇文章先做一个...
  • 非语言模型之SkipGram与CBOW

    千次阅读 2020-02-24 09:09:53
    1、条件概率: ...根据上面4个词组成的一句话, 那么这句话的概率根据skipgram, windows=1的情况下来计算的 p(w2| w1)p(w1| w2)p(w3| w2)p(w2| w3)p(w4| w3)p(w3| w4)   可参考: ...
  • 如果词典如下 V=(apple,going,I,home,machine,learning) V = (apple, going, I, home, machine, learning) V=(apple,going,I,home,machine,learning) apple=(1,0,0,0,0,0)machine=(0,0,0,0,1,0)learning=(0,0,0,0,0,...
  • Word2vec之Skip-gram理解

    2020-03-06 09:49:29
    将文本语料以无监督的方式来进行语义知识的学习工具, 主要包含 skip-gram,**CBOW(Continuous bag of word)**二种模型, 本质是通过文本学习来用词向量表征词的语义信息,通过嵌入空间使词语义相似的词距离相近, ...
  • Word2vec 算法之 Skip-gram(跳字)模型 一、skip-gram模型图 二、skip-gram模型图示例说明 举个例子来说明这个图在干嘛: 1、假设我们的文本序列有五个词,["the", "man", "loves", "his", "son"]。 2...
  • 前言上一篇的专栏介绍了Word2Vec中的Skip-Gram模型的结构和训练,如果看过的小伙伴可以直接开始动手用TensorFlow实现自己的Word2Vec模型,本篇文章将利用TensorFlow来完成Skip-Gram模型。还不是很了解Skip-Gram思想...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,399
精华内容 959
关键字:

skipgram词典