精华内容
下载资源
问答
  • 向量模型图
    千次阅读
    2022-04-08 12:52:57

    提示:最近在做文本情感分析,实现Electra预训练模型+BiLstm+attention。在github上找了一些代码,很多都是只有一部分,而且Electra预训练模型没有什么可以参考的代码。所以,记录一下学习过程,有错误的点,大家可以指出来,共同学习。


    一、静态词向量预训练模型

    将一个词在整个语料库中的共现上下文信息聚合至该词的向量表示中,也就是说,对于任意一个词,其向量表示是恒定的,不随其上下文的变化而变化。

    但是,在自然语言中,同一个词语在不同上下文或者语境中可能呈现出多种不同的词义、语法性质或者属性,也就是一词多义的情形。

    具体算法:word2vec算法,glove算法

    为了解决上述问题,提出了上下文相关的词向量,即随上下文而动态变化的,称为动态词向量。

    二、动态词向量预训练模型

    与静态词向量类似, 动态词向量最简单、 直接的应用是作为输入特征供目标任务使用, 而无须改变目标任务已有的模型结构。

    根据《自然语言处理:基于预训练的模型》这本书,其实现在很多预训练模型可以直接调用,相关源码已经开放,比如ELMO模型,利用AllenNLP ELMo接口进行调用,将词语进行向量化表示,然后输入自己的模型中。

    这是上面那本书中的代码示例,可以看一下,直接调用elmo模型,然后得到embedding。

    # ELMO+MLP的代码
    
    import enum
    import torch
    from torch import nn, optim
    from torch.nn import functional as F
    from torch.utils.data import Dataset, DataLoader
    from collections import defaultdict
    from vocab import Vocab
    from utils import load_sentence_polarity
    from allennlp.modules.elmo import elmo,batch_to_ids
    
    class BowDataset(Dataset):
        #data为原始数据
        def __init__(self, data):
            self.data = data
        def __len__(self):
            #返回数据集中样例的数目
            return len(self.data)
        def __getitem__(self, i):
            #返回下标为i的样例
            return self.data[i]
    
    def collate_fn(examples):
        #从独立样本集合中构建各批次的输入输出
        #BowDataset类定义了一个样本的数据结构,即输入标签和输出标签的元组
        #因此,将输入inputs定义为一个张量的列表,其中每个张量为原始句子中标记序列
        #对应的索引值序列 ex[0]
        inputs = [torch.tensor(ex[0]) for ex in examples]
        #输出的目标targets为该批次中全部样例输出结果构成的张量
        targets = torch.tensor([ex[1] for ex in examples], dtype=torch.long)
        #获取一个批次中每个样例的序列长度
        offsets = [0] + [i.shape[0] for i in inputs]
        #根据序列长度,转换为每个序列起始位置的偏移量
        offsets = torch.tensor(offsets[:-1]).cumsum(dim=0)
        #将inputs列表中的张量拼接成一个大的张量
        inputs = torch.cat(inputs)
        return inputs, offsets, targets
    
    #感知器模型
    class ElmoMLP(nn.Module):
        def __init__(self, elmo, hidden_dim, num_class):
            super(ElmoMLP, self).__init__()
            #elmo预训练编码器,可使用allenNLP预训练Elmo模型
            self.elmo=elmo
            #线性变换:词向量层-》隐含层
            self.linear1 = nn.Linear(self.elmo.get_output_dim(), hidden_dim)
            self.activate = F.relu
            #线性变换:隐含层-》输出层
            self.linear2 = nn.Linear(hidden_dim, num_class)
            
        def forward(self, inputs, lengths):
            elmo_output=self.elmo(inputs)
            embeds=elmo_output['elmo_representations'][0]
            mask=elmo_output['mask']
    
            #将每个序列中词的ELMO向量均值作为该序列的向量表示,作为MLP的输入
            embeds=torch.sum(embeds*mask.unsqueeze(2),dim=1)/lengths.unsqueeze(1)
            hidden = self.activate(self.linear1(embeds))
            outputs = self.linear2(hidden)
            log_probs = F.log_softmax(outputs, dim=1)
            return log_probs
    
    # tqdm是一个Python模块,能以进度条的方式显示迭代的进度
    from tqdm.auto import tqdm
     
    # 超参数设置
    embedding_dim = 128
    hidden_dim = 256
    num_class = 2
    batch_size = 32
    num_epoch = 5
    
    # 加载数据
    train_data, test_data, vocab = load_sentence_polarity()
    train_dataset = BowDataset(train_data)
    test_dataset = BowDataset(test_data)
    train_data_loader = DataLoader(train_dataset, batch_size=batch_size, collate_fn=collate_fn, shuffle=True)
    test_data_loader = DataLoader(test_dataset, batch_size=1, collate_fn=collate_fn, shuffle=False)
    
    # 加载模型
    if torch.cuda.is_available():
        print("cuda")
    else:
        print("cpu")
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model = MLP(len(vocab), embedding_dim, hidden_dim, num_class)
    model.to(device) # 将模型加载到CPU或GPU设备
    
    #训练过程
    nll_loss = nn.NLLLoss()
    optimizer = optim.Adam(model.parameters(), lr=0.001) # 使用Adam优化器
    
    model.train()
    for epoch in range(num_epoch):
        total_loss = 0
        for batch in tqdm(train_data_loader, desc=f"Training Epoch {epoch}"):
            inputs, offsets, targets = [x.to(device) for x in batch]
            log_probs = model(inputs, offsets)
            loss = nll_loss(log_probs, targets)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            total_loss += loss.item()
        print(f"Loss: {total_loss:.2f}")
    
    # 测试过程
    acc = 0
    for batch in tqdm(test_data_loader, desc=f"Testing"):
        inputs, offsets, targets = [x.to(device) for x in batch]
        with torch.no_grad():
            output = model(inputs, offsets)
            acc += (output.argmax(dim=1) == targets).sum().item()
    
    # 输出在测试集上的准确率
    print(f"Acc: {acc / len(test_data_loader):.2f}")
    

     

    更多相关内容
  • 一种结合词向量图模型的特定领域实体消歧方法
  • 文章目录向量空间模型(Vector Space Model)0. 概述1. TF(Term frequency ,TF)2. IDF(Inverse document frequency,IDF)3. TF-IDF(Term Frequency-Inverse Document Frequency)4. Similarity Function 相似性函数...

    向量空间模型(Vector Space Model)

    参考文献:

    tf-idf原理以及应用

    coursera:Vector Space Model

    Tf-idf and Cosine Similarity

    向量空间模型

    0. 概述

    向量空间模型(Vector Space Model)概念简单,把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度,直观易懂。当文档被表示为文档空间的向量,就可以通过计算向量之间的相似性来度量文档间的相似性。文本处理中最常用的相似性度量方式是余弦距离。

    我们在对文本内容操作分析之前,我们先要明确几个概念(参考连接

    1. 文档(Document):泛指一般的文本或者文本中的片断(段落、句群或句子)。一般指一篇文章,尽管文档可以是多媒体对象,但是以下讨论中我们只认为是文本对象,本文对文本与文档不加以区别。(最后的章节会有拓展
    2. 项(Term):文本的内容特征常常用它所含有的基本语言单位(字、词、词组或短语等)来表示,这些基本的语言单位被统称为文本的项,即文本可以用项集(Term List)表示为D(T1,T2,...,Tn)其中是Tn是项,1≤k≤n
    3. 项的权重(Term Weight):对于含有n个项的文本D(T1,T2,...,Tn),项常常被赋予一定的权重表示他们在文本D中的重要程度,即 D=D(T1,W1;…;Tn, Wn)。这时我们说项的权重Wk(1≤k≤n)。
    4. 向量空间模型(VSM):给定一文本D=D(T)由于在文本中既可以重复出现又应该有先后次序的关系,分析起来有一定困难。为了简化分析,暂时不考虑的顺序,并要求互异,这时可以把,D看作是一个n维的坐标(向量),而Wn就是n维坐标所对应的值,所以文档D就可以被看作一个n维的向量了。
    5. 相似度(Similarity):两个文本D、Z。D、Z之间的(内容)相关程度(Degree of Relevance)常常用他们之间的相似度Sim(D,Z)来度量,当文本被表示为向量空间模型时,我们可以借助与向量之间的某种距离来表示文本间的相似度常用向量之间的内积进行计算,或者用夹角的余弦值表示:

    可以看出,对向量空间模型来说,有两个基本问题:即特征项的选择项的权重计算。(关于特征项的选择,前面给出的参考博客中给出了比较详尽的描述,这里不做重点讨论,有时间再作为补充补上,我们重点讨论项的权重计算)

    下面就用一个例子,来对项的权重计算进行描述。我们手里有三个文档,分别是d1、d2、d3,内容如下所示,我们希望通过某种方法来描述三个文档之间的关系和相似性,我们便可以进行以下的操作。
    在这里插入图片描述

    1. TF(Term frequency ,TF)

    词频 (term frequency, TF) 指的是某一个给定的词语(项)在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)

    但是, 需要注意, 一些通用的词语对于主题并没有太大的作用, 反倒是一些出现频率较少的词才能够表达文章的主题, 所以单纯使用是TF不合适的。权重的设计必须满足:**一个词预测主题的能力越强,权重越大,反之,权重越小。**所有统计的文章中,一些词只是在其中很少几篇文章中出现,那么这样的词对文章的主题的作用很大,这些词的权重应该设计的较大。IDF就是在完成这样的工作.

    • 计算该词条在文件集中出现的次数
      在这里插入图片描述

    2. IDF(Inverse document frequency,IDF)

    逆向文件频率 (inverse document frequency, IDF) IDF的主要思想是:如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。

    计算公式如下:
    I D F = l o g 2 ( n / t e r m c o u n t ) IDF=log_2(n/termcount) IDF=log2(n/termcount)
    其中n表述所有文件集文档的数目(这里指的3),termcount 是词条在所有文件中出现的次数(即tf),特别的,一说分母为termcount+1,以其可能造成分母为0 的情况
    在这里插入图片描述

    • **NOTE:**为什么这里使用2做底数呢?实际上没有可论证的理由,一种比较有道理的说法是,在计算机领域很多数字都与2的次方有关系。而且IDF的数值与log的底数没有直接的关系,因为log_2(x)=lg(x)*lg2,而显然的,lg2是一个常数,所以对于我们的分析没有较大的差别

    3. TF-IDF(Term Frequency-Inverse Document Frequency)

    • 我们为什么要TF-IDF?
      一个例子:假设100篇文档有10000个词,研究某篇500词文章,“机器学习”出现了20次,“而且”出现了20次,那么他们的TF都是20/500=0.04。再来看IDF,对于语料库的100篇文章,每篇都出现了“而且”,因此它的IDF就是log1=0,他的TFIDF=0。而“机器学习”出现了10篇,那么它的IDF就是log10=1,他的TF-IDF=0.04>0,显然“机器学习”比“而且”更加重要。
      上述例子其实也在告诉我们,我们应该构建一种比较公平的权重,来更加均衡的反映Term的状况。TF-IDF出现的原因也正是如此。

    某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语

    综合以上,我们使用TF-IDF来对核心词进行评估,计算方法为:
    T F − I D F = T F ∗ I D F TF-IDF=TF*IDF TFIDF=TFIDF
    在这里插入图片描述
    (这里也给出了直接计算距离Length的方法来描述两个文件的相似程度,相似程度函数有很多,我们一般使用的是余弦函数,下面我们将介绍这种相似性函数)

    4. Similarity Function 相似性函数

    From each document we derive a vector.The set of documents in a collection then is viewed as a set of vectors in a vector space. Each term will have its own axis. Using the formula given below we can find out the similarity between any two documents.

    • 使用Cosine函数,计算公式如下:
      S i m i l a r i t y = c o s ( θ ) = A ∗ B ∣ ∣ A ∣ ∣ ∗ ∣ ∣ B ∣ ∣ = ∑ i = 1 n A i B i ( ∑ i = 1 n A i 2 ) ( ∑ i = 1 n B i 2 ) Similarity=cos(\theta)=\frac{A*B}{||A||*||B||}=\frac{\sum_{i=1}^{n}{A_iB_i}}{\sqrt(\sum_{i=1}^{n}{A_i^2})\sqrt(\sum_{i=1}^{n}{B_i^2})} Similarity=cos(θ)=ABAB=( i=1nAi2)( i=1nBi2)i=1nAiBi
      在这里插入图片描述

    5. 举例

    举例1:文献中的tf-idf

    在这里插入图片描述

    举例2:完整的代码以及谷歌搜索攥取分析

    举例3:在图像领域的使用

    目前常用向量空间模型对图像进行相似度搜索。人们可以从图像中计算未来。一个常见的特征是散点直方图。考虑一下这里的图像。可以创建红、绿、蓝通道的直方图,其中直方图是具有一定密度值的像素数。这张图片大部分是亮的,所以暗像素的数量相对较小。现在我们可以把直方图看作一个向量。通常,像素值在创建矢量之前会发生弯曲。表中显示的是一个特征向量,其中每一行的数字都与图像的大小进行了标准化,使行和等于1。类似的向量可以计算图像纹理、物体形状和任何其他属性。因此,向量空间模型对非结构化数据具有重要意义。

    一行的数字都与图像的大小进行了标准化,使行和等于1。类似的向量可以计算图像纹理、物体形状和任何其他属性。因此,向量空间模型对非结构化数据具有重要意义。

    在这里插入图片描述

    展开全文
  • 一、前言 ...使用one-hot向量来表示字词,那么一个字词就需要一个词表大小的向量,而NLP任务中的词表往往是上万甚至上百万的,这会极大地增加神经网络中的参数数量。 ② 距离一致。使用one-hot...

    一、前言

    请勿全文复制转载!尊重劳动成果!

            在使用词向量之前,我们往往用one-hot向量来表示一个字词,这样有两个缺点:

                 ① 维度过大。使用one-hot向量来表示字词,那么一个字词就需要一个词表大小的向量,而NLP任务中的词表往往是上万甚至上百万的,这会极大地增加神经网络中的参数数量。

                 ② 距离一致。使用one-hot表示字词,会使得所有字词之间的相似性是一致的,而在我们的认知中,“苹果”和“梨子”要比“苹果”和“英语”更接近。

             而词向量能将原本用one-hot表示的字词压缩到更小的维度,而且相似字词之间的距离更小。那词向量是如何表示字词的这种相似性的呢。很简单,词向量通过字词的上下文语境来表示这个字词,而相似的字词往往拥有相似的上下文语境。比如“苹果”和“梨子”可能都经常和“吃”、“水果”等词一起出现,那么“苹果”和“梨子”的词向量就会比较接近,而“英语”的上下文语境往往是“说”、“学习”等,那么“苹果”、“梨子”与“英语”之间就会差异较大。

            要表达这种相似性,只需要建立这样一个模型:当输入“吃”的时候,模型输出“苹果”的概率较大,输出“英语”的概率较小。即输入一个字词,模型输出与这个字词共同出现的其他字词的概率。模型会学习到这种相似性,并将其体现到隐层权重之上。

           显然,上面的模型与语言模型极其相似,语言模型的任务是根据上下文预测下一个字词。因此我们可以借用语言模型来训练词向量,词向量从一开始就和语言模型是密不可分的。

    二、词向量

            在开始讲解词向量之前,请你先思考这样一个问题:给你一个字词,需要你构建一个最简单的神经网络模型来预测下一个字词是什么。

            对于这个问题,不使用词向量,不使用RNN,我想你最先能想出来的就是下面这个两层的全连接模型了。

    模型使用one-hot向量来表示一个字词,所以input层表示一个one-hot向量的输入,经过一个全连接层后得到一个隐藏层向量,在经过softmax层得到一个概率输出,概率最大对应的字词就是我们预测出的字词。

           实际上,这已经是一个最简单的语言模型了,只不过最早的NNLM的input层是连续的多个字词,而且隐藏层要更多。

    以 “小明不但喜欢吃梨子,还喜欢吃苹果” 为例,观察上述模型。对于这句话,我们可以获得数据集如下:

    (小明,不但)
    (不但,喜欢)
    (喜欢,吃)
    (吃,梨子)
    (还,喜欢)
    (喜欢,吃)
    (吃,苹果)

    将上述数据放入模型训练,毫无疑问当出现“喜欢”时,下一个词大概率会是“吃”,而出现“吃”时,很有可能会是“梨子”或者“苹果”。

           其实,上述模型就是我们用来训练词向量的模型,与语言模型不同的是,语言模型通过前n个词预测下一个词,而词向量通过上下文来预测当前词,或者通过当前词来预测词上下文,而 "前n个词" 不也是上下文的一种吗。

    三、skip-gram

            skip-gram是一种通过当前词预测上下文的词向量训练方法,为了更好地体现不同词之间的依赖情况,显然不能只选取当前词的前一个词作为上下文。为了选定当前词的上下文,skip-gram采取这样一种策略:记当前词为w_i,从[w_i_-_k:w_i_-_1][w_i_+_1:w_i_+_k]中随机选取n个词作为w_i的上下文,即:从当前词的前k个词和后k个词中选择n个。k和n均为超参数,n<=2k。

    注:当语料库较小时,建议采用5-20等较大的k值,当语料库较大时,建议采用1-4等较小的k值。

    以下面这句话为例,假设k为2,n为2,当前词为 “喜欢” 时,从前2个词和后2个词中假设随机选取了“小明”和“梨子”作为上下文,于是得到两组训练数据:(喜欢,小明)、(喜欢,梨子)

    而对大量语句按如上方法提取出训练数据,输入模型训练完毕后,模型就能够学习到具有相似上下文语境的字词表示,训练完成后的W1矩阵就是我们需要的词向量矩阵。为了进一步理解这个概念,我们分析模型的前向传播过程,为了方便理解,假设词表大小为5,模型隐藏层大小为4,该模型描述如下:

    为了简单起见,我使用w1表示权重矩阵W1中的所有元素,使用w2表示权重矩阵W2中的所有元素,使用x1表示隐藏层中间向量中X1的所有元素,使用x2表示softmax输出的X2中的所有元素(大写表示矩阵或向量,小写表示元素)。

    由于许多词的上下文语境可能会很相似,如对于“苹果”和“梨子”,出现下面的(input,label)对的情况可能非常多:

    (梨子,吃)         (苹果,吃)
    (梨子,水果)       (苹果,水果)

    两个词的上下文语境相似,体现在训练数据中就是他们对应的label会有许多重合。观察模型的后半部分,当模型训练完成,W2固定,在softmax output层要输出相似的label,那么softmax output层的输入也要相似,即“苹果”和“梨子”的hidden layer层的输出(即X1)会比较相似。实际上,X1就是我们要求的词向量。

    再观察模型的前半部分,hidden layer层是输入层的one-hot向量与权重矩阵W1做矩阵运算的结果,记输入的one-hot向量为1的元素下标为i,与W1做矩阵运算后的结果实际就是W1的第i行向量,因此,W1就是我们要求的词向量矩阵,它是整个词汇表中的字词的词向量在0轴上的堆叠

    四、负采样

            Softmax的计算公式为:

                                                                                  p(x_i)=\frac{e^{x_i}}{\sum_{j=1}^{voc}e^{x_j}}

    其中,voc是词汇表的长度,而在我们的语料库中,词汇表的的长度往往高达数十万,使用softmax做一个数十万类的分类任务,这个计算量显然太大了,因此,我们需要优化模型中最后的softmax层,而对于一个类别过大的分类任务,我们可以使用负采样技术。

    记词汇表大小为vocab_size,softmax层每次输出一个vocab_size的的向量,向量中的每个元素代表预测是该词的概率,然后我们选取概率最大的作为预测标签,标记为1,其余vocab_size-1个元素全部标记为0,这实际上可以看做是vocab_size个二元分类器的集合,训练的过程就是使得正确标签对应的二元分类器能够输出1,而其他二元分类器输出0。

    而我们的模型要做的,就是对于某个输入,将正确的类别标签与其他标签分离开来。softmax所做的是计算所有标签的可能性,然后增大正确标签所对应的概率、减小其他标签的概率来将其与其他所有标签分离。这是一个非常庞大而且严格的分离过程,为什么说它庞大严格?对于一个词汇表大小为100,000的词向量训练模型来说,每次需要将1个标签与其他99,999个标签分离,这显然很庞大,其次,每次训练都增大其中一个标签的预测概率,而其他99,999个标签的概率全部都减小,这显然是严格的,因为在词向量模型中,同样的输入可能会对应不同的正确输出,如(梨子,吃)和(梨子,水果),当输入梨子时,输出可以是吃,也可以是水果。

    那么,为了将正确标签与其他标签分离开来,我们无需每次都计算所有标签,而是只计算正确标签和一部分其他标签,即从错误标签中随机选取部分,与正确标签作为对照,以将正确标签从其他标签中分离,这就是负采样技术。

    回到词向量中来,仍旧以“小明不但喜欢吃梨子” 为例,当中心词为“喜欢”时,我们得到了(喜欢,小明)和(喜欢,梨子)两组数据。

    我们只看(喜欢,小明)这组数据,对于“喜欢” 来说,“小明”就是他的正标签,而对应的,我们从词汇表中选取num_sample个词作为负标签,以形成对照,于是得到如下训练数据:

    图中示例num_sample=2。记中心词为wi,正标签词为C,负标签词集合为C_{nce},则我们需要最大化以下函数:

                                      J=logQ(label=1|w_i,C)+\sum_{c_i\in C_{nce}}^{ }logQ(label=0|w_i,c_i)

    其中logQ(label=1|w_i,C)是当wi出现时看到C同时出现的概率。

            在tensorflow中提供了tf.nn.nce_loss()函数能够很方便地实现以上功能,在tensorflow中称之为噪声对比估算 (NCE) 损失,它的具体实现原理如下:

            同样的使用的是之前的词向量训练模型,我们只关注后半部分,tf.nn.nce_loss()不会在整个词汇表范围上做计算,而是首先拿出真实标签的下标,并从其他标签中随机选取num_sample个,如图中红色部分标注的真实标签(index=3)和两个随机噪声标签(index=0,index=2),根据选取出来的下标从权重矩阵W2中分理出第0,2,3列,与hidden layer中的X1做矩阵运算,得到x_{2,0},x_{2,2},x_{2,3},之后对x_{2,0},x_{2,2},x_{2,3}使用sigmoid函数激活得到X3,与从true label中分离出来的label计算sigmoid cross entropy,输出loss。

            这也就是为什么有人说使用负采样技术实际上是只更新部分权重,效率比完整的softmax快很多的原因,使用负采样技术后,每次训练迭代更新的都只是真实标签和num_sample个噪声标签所对应的权重。

    然后介绍一下tf.nn.nce_loss()

    def nce_loss(weights,
                 biases,
                 labels,
                 inputs,
                 num_sampled,
                 num_classes,
                 num_true=1,
                 sampled_values=None,
                 remove_accidental_hits=False,
                 partition_strategy="mod",
                 name="nce_loss"):

    参数解释:

    weights:上述W2权重矩阵
    biases:与W2对应的偏移矩阵
    labels:真实标签的对应下标,shape=[batch_size,1]
    inputs:上述hidden layer的输出,其实就是词向量集合,shape=[batch_size, embed_size]
    num_sampled:负采样个数
    num_classes:完整分类数,其实就是词表大小

    因此,在使用tf.nn.nce_loss()函数时,我们的输入数据仍旧是下面这种形式:

    (喜欢,小明)
    (喜欢,梨子)

    函数会自动帮我们针对每一组输入进行负采样,以输出噪声对比估算损失。

    展开全文
  • 向量模型(1)

    万次阅读 2018-08-14 09:55:59
    向量模型 one-hot Vector one-hot vector 最简单的编码方式:假设我们的词库总共有n个词,那我们开一个1*n的高维向量,而每个词都会在某个索引index下取到1,其余位置全部都取值为0。 问题 这种词向量编码...

    词向量模型

    one-hot Vector

    one-hot vector

    最简单的编码方式:假设我们的词库总共有n个词,那我们开一个1*n的高维向量,而每个词都会在某个索引index下取到1,其余位置全部都取值为0。

    问题

    这种词向量编码方式简单粗暴,我们将每一个词作为一个完全独立的个体来表达。遗憾的是,这种方式下,我们的词向量没办法给我们任何形式的词组相似性权衡。因为你开了一个极高维度的空间,然后每个词语都会占据一个维度,因此没有办法在空间中关联起来。

    解决方案

    可以把词向量的维度降低一些,在这样一个子空间中,可能原本没有关联的词就关联起来了。

    基于 SVD 的方法

    SVD

    这是一种构造词嵌入(即词向量)的方法,我们首先会遍历所有的文本数据集,然后统计词出现的次数,接着用一个矩阵 X 来表示所有的次数情况,紧接着对X进行奇异值分解得到一个 USVT 的分解。然后用 U 的行(rows)作为所有词表中词的词向量。对于矩阵 X ,有2种选择:全文或者窗口长度。

    • 词-文档矩阵
      建立一个词组文档矩阵 X,具体是这么做的:遍历海量的文件,每次词组 i 出现在文件 j 中时,将 Xij 的值加1。不过大家可想而知,这会是个很大的矩阵R|V|×M,而且矩阵大小还和文档个数M有关系。所以咱们最好想办法处理和优化一下。word-document的共现矩阵最终会得到泛化的主题(例如体育类词汇会有相似的标记),这就是浅层语义分析(LSA, Latent Semantic Analysis)

    • 基于窗口的共现矩阵 X
      把矩阵X记录的词频变成一个相关性矩阵,对 X 做奇异值分解,观察奇异值(矩阵的对角元素),并根据我们期待保留的百分比来进行截断(只保留前k个维度),把子矩阵 U1:|V|,1:k 视作我们的词嵌入矩阵。也就是说,对于词表中的每一个词,我们都用一个 k 维的向量来表达了。窗口长度容易捕获语法(POS)和语义信息

    对共现矩阵X进行奇异值分解

    特征值分解与奇异值分解
    特征值分解只适用于方阵。当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。我们通过特征值分解得到的前N个特征向量,对应了这个矩阵最主要的N个变化方向。利用这前N个变化方向,可以近似这个矩阵(变换)。也就是 – 提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。
    奇异值分解是一个能适用于任意的矩阵的一种分解的方法,可以通过求特征值得到。

    Python中简单的词向量SVD分解

    问题

    • 矩阵的维度会经常变化(新的词语经常会增加,语料库的大小也会随时变化)。
    • 矩阵是非常稀疏的,因为大多数词并不同时出现。
    • 矩阵的维度通常非常高(≈106×106),需要大量的存储
    • 训练需要O(n2)的复杂度
    • 对于新词或者新的文档很难及时更新
    • 需要专门对矩阵X进行特殊处理,以应对词组频率的极度不平衡的状况

    解决方案:直接学习低维度的词向量

    idea: 将最重要的信息存储在固定的,低维度的向量里:密集向量(dense vector),维数通常是25-1000
    然而,如何降维?

    基于迭代的方法

    创建一个模型,它能够一步步迭代地进行学习,并最终得出每个单词基于其上下文的条件概率。

    n-gram

    基本思想: 一个词出现的概率只与它前面固定数目的词相关。
    主要工作是在预料中统计各种词串出现的次数以及平滑化处理,概率值计算号之后就存储起来,下次需要计算一个句子的概率时,只需找到相关的概率参数,将它们连乘起来就好了。
    建立一个概率模型,它包含已知和未知参数。每增加一个训练样本,它就能从模型的输入、输出和期望输出(标签),多学到一点点未知参数的信息。
    在每次迭代过程中,这个模型都能够评估其误差,并按照一定的更新规则,惩罚那些导致误差的参数。(误差“反向传播”法)。

    CBOW

    以 {“The”, “cat”, “over”, “the”, “puddle”} 为上下文,能够预测或产生它们中心的词语”jumped”。模型输入为 x(c),模型输出为 y,y 就是中心词 ‘jumped’。对于每个词语 wi 学习了两个向量。

    2.jpg

    连续词袋模型(CBOW)中的各个记号:

    • WiWi:单词表 V 中的第 i 个单词, one-hot 向量
    • v∈Rn∗|V|v∈Rn∗|V|:输入词矩阵
    • vivi:V的第i列,n 维 WiWi 的输入向量
    • U∈R|V|∗nU∈R|V|∗n:输出词矩阵
    • UiUi:U 的第 i 行,n 维 WiWi 的输出向量

    把整个过程拆分成以下几步:

    • 对于 m 个词长度的输入上下文,我们产生它们的 one-hot 向量 (xc−m,⋯,xc−1,xc+1,⋯,xc+m)(xc−m,⋯,xc−1,xc+1,⋯,xc+m),作为模型输入。
    • 我们得到上下文的嵌入词向量 (vc−m+1=Vxc−m+1,⋯,vc+m=Vxc+m)(vc−m+1=Vxc−m+1,⋯,vc+m=Vxc+m)
    • 将这些向量取平均 vˆ=Vc−m+Vc−m+1+⋯+Vc+m2mv^=Vc−m+Vc−m+1+⋯+Vc+m2m
    • 产生一个得分向量 z=Uvˆz=Uv^
    • 将得分向量转换成概率分布形式 yˆ=softmax(z)y^=softmax(z)
    • 我们希望我们产生的概率分布 ,与真实概率分布 yˆy^ 相匹配。而 y 刚好也就是我们期望的真实词语的one-hot向量。

    怎样找到矩阵U、V?
    目标函数选交叉熵,用梯度下降法去更新每一个相关的词向量 UcUc 和 VjVj.

    当我们试图从已知概率学习一个新的概率时,最常见的是从信息论的角度寻找方法来评估两个概率分布的差距。其中广受好评又广泛应用的一个评估差异/损失的函数是交叉熵:
    H(yˆ,y)=−∑|V|j=1yjlog(yˆj)H(y^,y)=−∑j=1|V|yjlog(y^j)

    结合我们当下的例子,y 只是一个one-hot向量,于是上面的损失函数就可以简化为:
    H(yˆ,y)=−yjlog(yˆj)H(y^,y)=−yjlog(y^j)

    我们用 c 表示 y 这个 one-hot 向量取值为 1 的那个维度的下标。所以在我们预测为准确值的情况下 yˆc=1y^c=1。于是损失为 −1 log(1) = 0。所以对于一个理想的预测值,因为预测得到的概率分布和真实概率分布完全一样,因此损失为0。相反,当我们的预测结果非常不理想, yˆc=0.01y^c=0.01。计算得到的损失为−1 log(0.01) ≈ 4.605,损失非常大,原本这才是标准结果,可是你给了一个非常低的概率,因此会拿到一个非常大的loss。最终的优化函数为:

    Skip-Gram

    与上面提到的模型对应的另一种思路,是以中心的词语 ”jumped” 为输入,能够预测或产生它周围的词语 ”The”, “cat”, “over”, “the”, “puddle” 等。这里我们叫 ”jumped” 为上下文。我们把它叫做Skip-Gram 模型。

    这个模型的建立与连续词袋模型(CBOW)非常相似,但本质上是交换了输入和输出的位置。我们令输入的 one-hot 向量(中心词)为 x(因为它只有一个),输出向量为 y(j)。U 和 V 的定义与连续词袋模型一样。看一下网络结构图:

    1.jpg

    举个例子,假设现在的数据集如下:

    the quick brown fox jumped over the lazy dog

    这个数据集中包含了词语及其上下文信息。上下文信息(Context)是一个比较宽泛的概念,有多种不同的理解:例如,词语周边的句法结构,词语的左边部分的若干个词语信息,对应的右半部分等。这里,我们使用最原始和基本的定义,即认为词语左右相邻的若干个词汇是该词对应的上下文信息。例如,取左右的词窗口为1,下面是数据集中的(上下文信息,对应的词)的pairs:

    ([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...

    Skip-Gram模型是通过输入的目标词来预测其对应的上下文信息,所以目标是通过[quick]来预测[the]和[brown],通过[brown]来预测[quick]和[fox]… 将上面的pair转换为(inpUt, output)的形式如下:

    (quick, the), (quick, brown), (brown, quick), (brown, fox), ...

    对应到上面部分,我们可以把 Skip-Gram 模型的运作方式拆分成以下几步:

    • 生成 one-hot 输入向量 x。
    • 得到上下文的嵌入词向量 VcVc=VxVx。
    • 因为这里不需要取平均值的操作,所以直接是vˆ=vcv^=vc。
    • 通过U=UVcU=UVc产生 2m 个得分向量 Uc−m,⋯,Uc−1,Uc+1,⋯,Uc+mUc−m,⋯,Uc−1,Uc+1,⋯,Uc+m,如果上下文各取一个词,就是 Uc−1Uc−1, Uc+1Uc+1
    • 将得分向量转换成概率分布形式 y=softmax(u)y=softmax(u)。
    • 我们希望我们产生的概率分布与真实概率分布 yc−m,⋯,yc−1,,yc+1⋯,yc+myc−m,⋯,yc−1,,yc+1⋯,yc+m 相匹配,也就是我们真实输出结果的 one-hot 向量。

    为模型设定一个目标/损失函数。不过不同的地方是我们这里需要引入朴素贝叶斯假设来将联合概率拆分成独立概率相乘。只要给出了中心词,所有的输出词是完全独立的。使用随机梯度下降算法(SGD)来进行最优化求解,并且使用mini-batch方法 (通常batch_size在16到512之间)。可以用随机梯度下降法去更新未知参数的梯度。
    对应的优化函数是

    这里值得一提的是,skipgram 和 PMI 之间是有联系的,Levy and Goldberg(2014) 提到过,skip-gram 在矩阵成为 PMI 的一个 shifted version 时(WW‘T=MPMI−logkWW‘T=MPMI−logk),得到最优解,也就是说,

    Skip-gram is implicitly factoring a shifted version of the PMI matrix into the two embedding matrices.

    我们再次观察一下目标函数,注意到对整个单词表|V|求和的计算量是非常巨大的,任何一个对目标函数的更新和求值操作都会有O(|V|)的时间复杂度。我们需要一个思路去简化一下,我们想办法去求它的近似,可以参照负面采样(Negative Sampling)

    why skip-gram

    在NLP中,语料的选取是一个相当重要的问题。
    首先,语料必须充分。一方面词典的词量要足够大,另一方面尽可能地包含反映词语之间关系的句子,如“鱼在水中游”这种句式在语料中尽可能地多,模型才能学习到该句中的语义和语法关系,这和人类学习自然语言是一个道理,重复次数多了,也就会模型了。
    其次,语料必须准确。所选取的语料能够正确反映该语言的语义和语法关系。如中文的《人民日报》比较准确。但更多时候不是语料选取引发准确性问题,而是处理的方法。
    由于窗口大小的限制,这会导致超出窗口的词语与当前词之间的关系不能正确地反映到模型中,如果单纯扩大窗口大小会增加训练的复杂度。Skip-gram模型的提出很好解决了这些问题。

    我们来看看 skip-gram 的定义。

    Skip-gram 实际上的定义很简单,就是允许跳几个字的意思。依照原论文里的定义,这个句子:

    Insurgents killed in ongoing fighting.

    在 bi-grams 的时候是拆成:

    { insurgents killed, killed in, in ongoing, ongoing fighting }

    在 2-skip-bi-grams 的时候拆成:

    { insurgents killed, insurgents in, insurgents ongoing, killed in, killed ongoing, killed fighting, in ongoing, in fighting, ongoing fighting }

    在 tri-grams 的时候是:

    { insurgents killed in, killed in ongoing, in ongoing fighting }

    在 2-skip-tri-grams 的时候是:

    { insurgents killed in, insurgents killed ongoing, insurgents killed fighting, insurgentsin ongoing, insurgents in fighting, insurgents ongoing fighting, killed in ongoing, killed in fighting, killed ongoing fighting, in ongoing fighting }

    这样就有办法在整篇文章都是用“台湾大学”的情况下以“台大”找到文章,解决一些“同义词”想要解决的问题。Skip-gram 一方面反映了句子的真实意思,另一方面还扩大了语料,2元词组由原来的4个扩展到了9个,3元词组由原来的3个扩展到了10个。

    Word2Vec

    Word2Vec 是一个典型的预测模型,用于高效地学习Word Embedding,实现的模型就是上面提到的两种:连续词袋模型(CBOW)和Skip-Gram模型。算法上这两个模型是相似的

    • CBOW 从输入的上下文信息来预测目标词
    • Skip-gram 模型则是相反的,从目标词来预测上下文信息
      一般而言,这种方式上的区别使得 CBOW 模型更适合应用在小规模的数据集上,能够对很多的分布式信息进行平滑处理;而 Skip-Gram 模型则比较适合用于大规模的数据集上。

    另外一点是,embeddings 可以来捕捉关系!
    3.jpg

    向量空间模型(Vector space models, VSMs)

    将词语表示为一个连续的词向量,并且语义接近的词语对应的词向量在空间上也是接近的。
    分布式假说理论: 该假说的思想是如果两个词的上下文(context)相同,那么这两个词所表达的语义也是一样的;换言之,两个词的语义是否相同或相似,取决于两个词的上下文内容,上下文相同表示两个词是可以等价替换的。

    词向量生成方法主要分两大类:

    • 计数法(count-based methods, e.g. Latent Semantic Analysis)
      在大型语料中统计词语及邻近的词的共现频率,然后将之为每个词都映射为一个稠密的向量表示;
    • 预测法(predictive methods, e.g. neural probabilistic language models)。
      直接利用词语的邻近词信息来得到预测词的词向量(词向量通常作为模型的训练参数)。

    词向量任务评价

    内部任务评价

    内部任务评价的特点如下:

    • 一般是在一个特定的子任务中进行评测
    • 计算很快
    • 有助于理解相关的系统
    • 在实际的NLP任务中表现好坏,可能需要外部关联实际应用

    方法:词向量类比

    我们先输入一组不完整的类比 a:b::c:? 内部任务评价系统找出最大化余弦相似度的词向量
    理想情况下,我们想得到xb−xa=xd−xc(例如,王后–国王 = 女演员 – 男演员)。于是xb−xa+xc=xd, 所以我们只需要找出一个与xb−xa+xc的标准化内积(比如余弦相似度)取最大值的词向量就可以了。

    类比语料示例:

    首都城市1 : 国家1 : : 首都城市2 : 国家2
    Beijing:China::Astana       Kazakhstan
    Beijing:China::Asmara       Eritrea
    ...
    
    比较级
    bad:worst::big            biggest
    bad:worst::easy           easiest
    ...
    
    时态
    dancing:danced::decreased         decreased
    dancing:danced::falling           fell
    ...
    

    评测语料

    方法:相关性评价

    另外一个评测词向量质量的简单方法是人为对两个词的相似度在一个固定区间内打分(比如说 0-10),再跟对应向量的余弦相适度进行对比。
    评测语料

    考虑参数

    • 词向量的维度
    • 资料库的大小
    • 资料源/类型
    • 上下文窗口的大小
    • 上下文的对称性

    一般而言,

    • 精度和使用的模型高度相关,因为这些生成词向量的方法所依据的特性是完全不同的(如同时出现的次数,奇异向量等。)
    • 文集量越大,精度越高,因为例子越多,生成的系统学习到的经验就更丰富。比如在完成词汇类比的例子中,系统如果之前没有接触测试词,就可能会生成错误的结果。
    • 如果维度特别低或特别高,精度就会比较低。低维度词向量无法捕捉文集中不同词语的不同意义。这可以视为我们模型复杂度过低而导致的高偏差。比如 “king”, “queen”, “man”, “woman” 这几个词,我们需要至少2个维度像”gender” 如 “leadership” 来把它们编译成 2-字节 词向量。 过低的维度将无法捕捉四个词之间的语义差别,而过高的维度将捕捉到一些对泛化能力没有用的噪音– 即高方差的问题。

    外部任务评价

    外部任务评价的特点如下:

    • 在一个实际任务中进行评测
    • 需要花很长的时间来计算精度
    • 不太清楚是否是某个子系统或者其他子系统,又或是几个子系统互相作用引起的问题
    • 如果替换原有的子系统后获得精度提升,则说明替换很可能是有效的

    参考链接:
    斯坦福大学课程:深度学习与自然语言处理
    斯坦福大学深度学习与自然语言处理第二讲:词向量

    转自: http://www.shuang0420.com/2016/06/21/%E8%AF%8D%E5%90%91%E9%87%8F%E6%80%BB%E7%BB%93%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AE%80%E6%B4%81%E7%89%88%EF%BC%89/

    展开全文
  • 基于可见度和支持向量机的导波信号模型分类
  • 【NLP】⚠️学不会打我! 半小时学会基本操作 2⚠️词向量模型简介
  • 向量及语言模型

    万次阅读 2018-06-21 10:23:24
    一、词向量向量(word embedding):词的向量表征。很多初识机器学习、深度学习等的同学,包括我,一定对词向量比较迷惑,为什么说前者之前都要提到词向量?答案:为了将输入数据表示成向量,在向量上进行数学建模...
  • SVM是机器学习领域非常知名的模型。本文讲解SVM的最大间隔分类器、模型原理、核函数与核技巧等重要知识点,并附上线性核函数、多项式核函数和高斯核函数的Python代码实践。
  • 大数据-算法-心电向量环微分几何心电数学模型的临床应用.pdf
  • Word2Vec词向量模型代码

    千次阅读 2018-08-31 15:01:27
    Word2Vec也称Word Embedding,中文的叫法是“词向量”或“词嵌入”,是一种计算非常高效的,可以从原始语料中学习字词空间向量的预测模型。Word2Vec可以把一个维数为所有词的数量的高维空间嵌入到一个低维的连续向量...
  • 在向量空间模型的基础上,抽取反映网站结构和内容的文本特征信息,建立网站主题的特征向量模型。在此基础上进行制造企业网站的主题搜索,采用类中心向量法进行了网站主题分析。结果表明:该模型适合于网站主题的特征...
  • 向量空间模型算法(Vector Space Model)

    千次阅读 2019-07-20 12:12:44
    向量空间模型(VSM:Vector Space Model)由Salton等人于20世纪70年代提出,并成功地应用于文本检索系统。 VSM概念简单,把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度,...
  • 数学建模之向量自回归模型

    千次阅读 多人点赞 2020-07-16 13:16:24
    2.向量自回归模型建模流程 1、变量平稳性检验——ADF检验: 原假设H0:序列不平稳 Matlab代码:(现阶段不知道啥意思) [h1,p1,adf,ljz]=adftest(x) h1 = 0 p1 = 0.9982 adf = 2.8923 ljz = -1.9489 2、如果非平稳...
  • 空间向量模型和tf-idf

    千次阅读 2017-09-21 16:56:00
    向量空间模型 向量空间模型是一个把文本文件表示为标识符(比如索引)向量的代数模型,它应用于信息过滤、信息检索、索引以及相关排序。 1 定义 文档和查询都用向量来表示: 每一维都对应于一个个别的词组。...
  • 【转】支持向量机回归模型SVR

    千次阅读 2020-07-09 14:30:31
    SVM回归模型的损失函数度量 SVM回归模型的目标函数的原始形式 SVM回归模型的目标函数的对偶形式 SVM 算法小结 一、SVM回归模型的损失函数度量 SVM和决策树一样,可以将模型直接应用到回归问题中;在SVM的分类...
  • (一些你必须知道的关于机器学习的事):这是一篇好论文,因为它不拘泥于特定的算法,而是偏向于比如特征选取概述和模型简化这些重要的问题上。走对方向并且从一开始就想清楚,都是很好的事情。 上面我只罗列了两...
  •   维基百科中文数据训练word2vec词向量模型——基于gensim库   上文我们使用了 gensim 库中的 Word2vec 模块训练词向量模型,现在我们来用 tensorflow 自己手写代码来训练模型。主要步骤大体如下: 数据准备...
  • 向量空间模型在信息检索中是众所周知的,其中每个文档被表示为向量。矢量分量表示文档中每个单词的权重或重要性。使用余弦相似性度量计算两个文档之间的相似性。 尽管对单词使用矢量表示的想法也已经存在了一段时间...
  • 基于支持向量机的图像分类系统(MATLAB GUI界面版)

    万次阅读 多人点赞 2022-02-22 13:38:04
    算法部分的特征提取过程采用方向梯度直方(HOG)特征,分类过程采用性能优异的核支持向量机(SVM)算法。系统界面清新美观,文中包含完整的代码文件及数据集,开箱即用,适合新手朋友学习参考。
  • 6.4向量空间模型,余弦相似度计算

    千次阅读 2021-11-28 15:43:30
    文章目录向量空间模型关联矩阵文档表示成向量Queries表示成向量向量相似度计算欧式距离?利用夹角代替距离文档长度归一化余弦相似度(query,document)※余弦相似度计算举例 向量空间模型 关联矩阵 二值关联矩阵:词...
  • 摘要:本文介绍了GPT模型的基本概念,讲解了GPT模型所需要的基本知识,包括词嵌入,自注意力机制,Transformer框架和Softmax函数,同时还详细阐述了GPT模型的数学原理和实现过程。对于人们了解并掌握预训练模型具有...
  • 一、词袋模型 将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个词语都是独立的。例如上面2个例句,就可以构成一个词袋,袋子里包括Jane、wants、to、go、Shenzhen、Bob、Shanghai。假设建立一个数组...
  • 向量空间模型算法( Vector Space Model )

    千次阅读 2019-01-16 09:26:24
    向量空间模型(VSM:Vector Space Model)由Salton等人于20世纪70年代提出,并成功 地应用于文本检索系统。 VSM概念简单,把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似 度表达语义的相似度...
  • 字和词语联合训练的词向量模型

    万次阅读 2017-10-03 15:50:01
    今天又读了一篇刘知远老师团队2015年在顶会Ijcai上发表的论文《Joint Learning of Character and Word Embeddings》,同样是有关于在词向量生成部分进行了改进,引入了词语组成成分的单个汉字的信息(论文主要针对的...
  • 把训练好的词向量模型可视化

    千次阅读 2020-02-19 23:29:14
    意思相近的词语,在向量空间中的距离应该越近...输入是一个训练好的词向量模型。输出是一张图片,把每个词都标记在上面。 from gensim.models import Word2Vec from random import sample from pylab import mpl mod...
  • Python提取数字图片特征向量

    万次阅读 多人点赞 2017-11-10 15:40:56
    在机器学习中有一种学习叫做手写数字识别,其主要功能就是让机器识别出图片中的数字,其步骤主要包括:图片特征提取、将特征值点阵转化为特征向量、进行模型训练。第一步便是提取图片中的特征提取。数据的预处理关系...
  • SVM支持向量模型

    万次阅读 2017-12-20 11:43:12
    和感知机模型一样,SVM(支持向量模型)也是旨在求出n维空间的最优超平面将正负类分开。这里的达到的最优是指在两类样本点距离超平面的最近距离达到最大,间隔最大使得它区别于感知机学习,SVM中还有核技巧,这样...
  • 嵌入中节点如何映射到向量

    千次阅读 2022-02-27 11:14:22
    所有的机器学习算法都需要输入数值型的向量数据,嵌入通过学习从的结构化数据到矢量表示的映射来获得节点的嵌入向量。它的最基本优化方法是将具有相似上下文的映射节点靠近嵌入空间。我们可以使用两种正交方法...
  •   在这一部分中,我们将在此基础上介绍神经网络语言模型以及词向量的相关知识。在介绍这些知识之前,我们首先对自然语言处理领域的整体架构进行一些简单的介绍。 1. 自然语言处理架构   首先,我们来看这样一张...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 253,185
精华内容 101,274
关键字:

向量模型图