精华内容
下载资源
问答
  • 词嵌入

    2019-10-18 21:15:00
    300维的词嵌入表格 词嵌入可视化 词嵌入与迁移学习 词汇相似度的计算 词汇相似度的作用 因为词汇相似度, 所以当模型遇到不认识的单词时也能做出预测 ...

    300维的词嵌入表格

    1754110-20191018211349743-810140075.png

    词嵌入可视化

    11111

    词嵌入与迁移学习

    1754110-20191018213644436-671675370.png

    词汇相似度的计算

    1754110-20191018220129284-1731016211.png

    词汇相似度的作用

    1754110-20191018220457343-53089830.png

    因为词汇相似度, 所以当模型遇到不认识的单词时也能做出预测

    展开全文
  • 词嵌入初探

    2019-04-13 10:44:56
    词嵌入产生的背景1.1 NLP关键:语言的表示1.2 NLP词的表示方法类型1.2.1 独热表示one-hot1.2.2 词的分布式表示distributed representation1.3 NLP中的语言模型1.4 词的分布表示1.4.1 基于矩阵的分布表示1.4.2 基于...

    目录

    1.词嵌入产生的背景

    1.1 NLP关键:语言的表示

    我们知道,如果我们需要使用计算机去处理一些信息,则必须对这个问题进行数学建模。自然语言处理也是一样,我们如何对我们的文本进行数学建模呢?我们来看一下其他领域是如何处理的。
    我们看看图像和语音是怎么表示数据的
    image
    在语音中,用音频频谱序列向量所构成的matrix作为前端输入喂给NN进行处理,good;在图像中,用图片的像素构成的matrix展平成vector后组成的vector序列喂给NN进行处理,good;那在自然语言处理中呢?噢你可能知道或者不知道,将每一个词用一个向量表示出来!想法是挺简单的,对,事实上就是这么简单,然而真有这么简单吗?可能没这么简单。

    有人提到,图像、语音属于比较自然地低级数据表示形式,在图像和语音领域,最基本的数据是信号数据,我们可以通过一些距离度量,判断信号是否相似,在判断两幅图片是否相似时,只需通过观察图片本身就能给出回答。而语言作为人类在进化了几百万年所产生的一种高层的抽象的思维信息表达的工具,其具有高度抽象的特征,文本是符号数据,两个词只要字面不同,就难以刻画它们之间的联系,即使是“麦克风”和“话筒”这样的同义词,从字面上也难以看出这两者意思相同(语义鸿沟现象),可能并不是简单地一加一那么简单就能表示出来,而判断两个词是否相似时,还需要更多的背景知识才能做出回答。

    那么据上是不是可以自信地下一个结论呢:如何有效地表示出语言句子是决定NN能发挥出强大拟合计算能力的关键前提!

    1.2 NLP词的表示方法类型

    按照现今目前的发展,词的表示分为独热表示one-hot、分布式表示。

    1.2.1 独热表示one-hot

    独热编码和我们平时处理结构化数据中的类别型的数据一样。假设有一个大的词典,词的数目为N,则我们对每个词表示成一个N为的向量,只有在该词出现在词典的位置处的值为1,其余位置处的值为0.

    每个词都是茫茫 0 海中的一个 1。这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。

    现在我们分析他的不当处。1、向量的维度会随着句子的词的数量类型增大而增大;2、任意两个词之间都是孤立的,根本无法表示出在语义层面上词语词之间的相关信息,而这一点是致命的。

    1.2.2 词的分布式表示distributed representation

    统的独热表示( one-hot representation)仅仅将词符号化,不包含任何语义信息。如何将语义融入到词表示中?Harris 在 1954 年提出的分布假说( distributional hypothesis)为这一设想提供了理论基础:上下文相似的词,其语义也相似。Firth 在 1957 年对分布假说进行了进一步阐述和明确:词的语义由其上下文决定( a word is characterized by thecompany it keeps)。

    到目前为止,基于分布假说的词表示方法,根据建模的不同,主要可以分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示。尽管这些不同的分布表示方法使用了不同的技术手段获取词表示,但由于这些方法均基于分布假说,它们的核心思想也都由两部分组成:一、选择一种方式描述上下文;二、选择一种模型刻画某个词(下文称“目标词”)与其上下文之间的关系。

    1.3 NLP中的语言模型

    语言模型即对语言建模的模型。NLP中主要包括文法语言模型和统语言模型。其中文法语言模型因为语法的复杂性,很难建模,用的比较少。目前NLP中用的比较多的是统计语言模型。

    统计语言模型: 统计语言模型把语言(词的序列)看作一个随机事件,并赋予相应的概率来描述其属于某种语言集合的可能性。给定一个词汇集合 V,对于一个由 V 中的词构成的序列S = ⟨w1, · · · , wT ⟩ ∈ Vn,统计语言模型赋予这个序列一个概率P(S),来衡量S 符合自然语言的语法和语义规则的置信度。

    用一句简单的话说,就语言模型就是计算一个句子的概率大小的这种模型。有什么意义呢?一个句子的打分概率越高,越说明他是更合乎人说出来的自然句子。

    就是这么简单。常见的统计语言模型有N元文法模型(N-gram Model),最常见的是unigram model、bigram model、trigram model等等。形式化讲,统计语言模型的作用是为一个长度为 m 的字符串确定一个概率分布 P(w1; w2; :::; wm),表示其存在的可能性,其中 w1 到 wm 依次表示这段文本中的各个词。一般在实际求解过程中,通常采用下式计算其概率值:

    image

    同时通过这些方法均也可以保留住一定的词序信息,这样就能把一个词的上下文信息capture住。

    1.4 词的分布表示

    假设语言满足一个分布,是以一定的概率生成某些词的。

    1.4.1 基于矩阵的分布表示

    基于矩阵的分布表示通常又称为分布语义模型,在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。

    常见到的Global Vector 模型( GloVe模型)是一种对“词-词”矩阵进行分解从而得到词表示的方法,属于基于矩阵的分布表示。

    1.4.2 基于聚类的分布表示

    该方法以根据两个词的公共类别判断这两个词的语义相似度。最经典的方法是布朗聚类(Brown clustering)

    1.4.3 基于神经网络的分布表示,词嵌入(word embedding)

    基于神经网络的分布表示一般称为词向量、词嵌入(word embedding)或分布式表示(distributed representation)

    神经网络词向量表示技术通过神经网络技术对上下文,以及上下文与目标词之间的关系进行建模。由于神经网络较为灵活,这类方法的最大优势在于可以表示复杂的上下文。在前面基于矩阵的分布表示方法中,最常用的上下文是词。如果使用包含词序信息的 n-gram 作为上下文,当 n 增加时, n-gram 的总数会呈指数级增长,此时会遇到维数灾难问题。而神经网络在表示 n-gram 时,可以通过一些组合方式对 n 个词进行组合,参数个数仅以线性速度增长。有了这一优势,神经网络模型可以对更复杂的上下文进行建模,在词向量中包含更丰富的语义信息。

    2.什么是词嵌入技术

    词嵌入是一类将词映射为低维稠密向量的技术统称。最近比较火的是谷歌开源的word2vec技术。

    2.1 概念

    基于神经网络的分布表示又称为词向量、词嵌入,神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。

    前面提到过,为了选择一种模型刻画某个词(下文称“目标词”)与其上下文之间的关系,我们需要在词向量中capture到一个词的上下文信息。同时,上面我们恰巧提到了统计语言模型正好具有捕捉上下文信息的能力。那么构建上下文与目标词之间的关系,最自然的一种思路就是使用语言模型。从历史上看,早期的词向量只是神经网络语言模型的副产品。

    2001年, Bengio 等人正式提出神经网络语言模型( Neural Network Language Model ,NNLM),该模型在学习语言模型的同时,也得到了词向量。所以请注意一点:词向量可以认为是神经网络训练语言模型的副产品。

    2.2 神经网络语言模型与word2vec

    2.2.1 神经网络语言模型

    a) Neural Network Language Model ,NNLM
    b) Log-Bilinear Language Model, LBL
    c) Recurrent Neural Network based Language Model,RNNLM
    d) Collobert 和 Weston 在2008 年提出的 C&W 模型
    e) Mikolov 等人提出了 CBOW( Continuous Bagof-Words)和 Skip-gram 模型

    2.2.2 word2vec与CBOW、Skip-gram

    在这里插入图片描述

    2.2.3 word embedding理解

    现在,词向量既能够降低维度,又能够capture到当前词在本句子中上下文的信息(表现为前后距离关系),那么我们对其用来表示语言句子词语作为NN的输入是非常自信与满意的。

    另外一点很实用的建议,在你做某一项具体的NLP任务时如你要用到词向量,那么我建议你:要么1、选择使用别人训练好的词向量,注意,得使用相同语料内容领域的词向量;要么2、自己训练自己的词向量。我建议是前者,因为……坑太多了。

    3.常用的词嵌入技术有哪些

    3.1 word2vec , GloVe

    在过去的五年里,已经提出了大量可行的词嵌入的方法。 最常用的模型是word2vec和GloVe,它们都是基于分布假设( distributional hypothesis)的无监督方法(出现在相似语境中的词往往具有相似的含义)。
    Word2Vec:https://github.com/dav/word2vec/
    GloVe:https://nlp.stanford.edu/projects/glove/

    3.2 FastText, ELMo

    虽然有些研究工作通过结合对语义或句法知识的监督来增强这些无监督的方法,但在2017-2018年,纯粹的无监督方法获得了有趣的进展,最著名的是:FastText(word2vec的扩展)ELMo(较先进的上下文词向量)。

    FastText
    FastText由Tomas Mikolov团队提出,word2vec框架也是他们在2013年提出的,FastText促进了对于通用词嵌入研究的爆炸式增长。

    FastText对原始word2vec向量的主要改进是包含基于字符的n-gram模型,它允许计算没有出现在训练数据中的单词表示(“词外”字)。

    FastText矢量训练速度超快,可在157种语言的Wikipedia和Crawl训练中使用。 他们是一个很好的基准。

    ELMo
    最近,深层语境化词表征(ELMo)在较好的词嵌入技术基础上有了显著地提升。 它们由艾伦人工智能研究所开发,将于6月初在NAACL 2018展出。

    ELMo知道很多关于文字的上下文

    在ELMo中,每个单词被赋予一个表征,这个表征是它们所属的整个语料库句子的函数。 嵌入是从双层双向语言模型(LM)的内部状态计算出来的,因此名为“ELMo”:Embeddings from Language Models,从语言模型嵌入。

    ELMo的特点:
    ELMo的输入是字符而不是单词。 因此,可以利用子字词单元来计算有意义的表征,即使对于词典外的词(如FastText)也是如此。
    ELMo是由biLMs若干层激活的连接。 语言模型的不同层对单词上的不同类型信息进行编码(例如,词语标注由biLSTM的较低层完成预测,而词义消歧在较高层中更好地编码)。 把所有层连接起来,可以自由组合各种文字表征,以提高下游任务的性能表现。

    展开全文
  • 预训练词嵌入

    2020-09-16 23:23:49
    理解预训练词嵌入的重要性 了解两种流行的预训练词嵌入类型:Word2Vec和GloVe 预训练词嵌入与从头学习嵌入的性能比较 介绍 我们如何让机器理解文本数据?我们知道机器非常擅长处理和处理数字数据,但如果我们向...

    作者|ARAVIND PAI 编译|VK 来源|Analytics Vidhya

    概述

    • 理解预训练词嵌入的重要性

    • 了解两种流行的预训练词嵌入类型:Word2Vec和GloVe

    • 预训练词嵌入与从头学习嵌入的性能比较

    介绍

    我们如何让机器理解文本数据?我们知道机器非常擅长处理和处理数字数据,但如果我们向它们提供原始文本数据,它们是不能理解的。

    这个想法是创建一个词汇的表示,捕捉它们的含义、语义关系和它们所使用的不同类型的上下文。这就是词嵌入的想法,将文本用数字表示。

    预训练词嵌入是当今自然语言处理(NLP)领域中的一个重要组成部分。

    但是,问题仍然存在——预训练的单词嵌入是否为我们的NLP模型提供了额外的优势?这是一个重要的问题,你应该知道答案。

    因此在本文中,我将阐明预训练词嵌入的重要性。对于一个情感分析问题,我们还将比较预训练词嵌入和从头学习嵌入的性能。

    目录

    1. 什么是预训练词嵌入?

    2. 为什么我们需要预训练的词嵌入?

    3. 预训练词嵌入的不同模型?

      1. 谷歌的Word2vec

      2. 斯坦福的GloVe

    4. 案例研究:从头开始学习嵌入与预训练词嵌入

    什么是预训练词嵌入?

    让我们直接回答一个大问题——预训练词嵌入到底是什么?

    预训练词嵌入是在一个任务中学习到的词嵌入,它可以用于解决另一个任务。

    这些嵌入在大型数据集上进行训练,保存,然后用于解决其他任务。这就是为什么预训练词嵌入是迁移学习的一种形式。

    迁移学习,顾名思义,就是把一项任务的学习成果转移到另一项任务上。学习既可以是权重,也可以是嵌入。在我们这里,学习的是嵌入。因此,这个概念被称为预训练词嵌入。在权重的情况下,这个概念被称为预训练模型。

    但是,为什么我们首先需要预训练词嵌入呢?为什么我们不能从零开始学习我们自己的嵌入呢?我将在下一节回答这些问题。

    为什么我们需要预训练词嵌入?

    预训练词嵌入在大数据集上训练时捕获单词的语义和句法意义。它们能够提高自然语言处理(NLP)模型的性能。这些单词嵌入在竞赛数据中很有用,当然,在现实世界的问题中也很有用。

    但是为什么我们不学习我们自己的嵌入呢?好吧,从零开始学习单词嵌入是一个具有挑战性的问题,主要有两个原因:

    • 训练数据稀疏

    • 大量可训练参数

    训练数据稀疏

    不这样做的主要原因之一是训练数据稀少。大多数现实世界的问题都包含一个包含大量稀有单词的数据集。从这些数据集中学习到的嵌入无法得到单词的正确表示。

    为了实现这一点,数据集必须包含丰富的词汇表。

    大量可训练参数

    其次,从零开始学习嵌入时,可训练参数的数量增加。这会导致训练过程变慢。从零开始学习嵌入也可能会使你对单词的表示方式处于不清楚的状态。

    因此,解决上述问题的方法是预训练词嵌入。让我们在下一节讨论不同的预训练词嵌入。

    预训练词嵌入的不同模型

    我将把嵌入大致分为两类:单词级嵌入和字符级嵌入。ELMo和Flair嵌入是字符级嵌入的示例。在本文中,我们将介绍两种流行的单词级预训练词嵌入:

    1. 谷歌的Word2vec

    2. 斯坦福的GloVe

    让我们了解一下Word2Vec和GloVe的工作原理。

    谷歌的Word2vec

    Word2Vec是Google开发的最流行的预训练词嵌入工具之一。Word2Vec是在Google新闻数据集(约1000亿字)上训练的。它有几个用例,如推荐引擎、单词相似度和不同的文本分类问题。

    Word2Vec的架构非常简单。它是一个只有一个隐藏层的前馈神经网络。因此,它有时被称为浅层神经网络结构。

    根据嵌入的学习方式,Word2Vec分为两种方法:

    • 连续词袋模型(CBOW)

    • Skip-gram 模型

    连续词袋(CBOW)模型在给定相邻词的情况下学习焦点词,而Skip-gram模型在给定词的情况下学习相邻词。

    连续词袋模型模型和Skip-gram 模型是相互颠倒的。

    例如,想想这句话:““I have failed at times but I never stopped trying”。假设我们想学习“failed”这个词的嵌入。所以,这里的焦点词是“failed”。

    第一步是定义上下文窗口。上下文窗口是指出现在焦点词左右的单词数。出现在上下文窗口中的单词称为相邻单词(或上下文)。让我们将上下文窗口固定为2

    • 连续词袋模型:Input=[I,have,at,times],Output=failed

    • Skip-gram 模型跳:Input = failed, Output = [I, have, at, times ]

    如你所见,CBOW接受多个单词作为输入,并生成一个单词作为输出,而Skip gram接受一个单词作为输入,并生成多个单词作为输出。

    因此,让我们根据输入和输出定义体系结构。但请记住,每个单词作为一个one-hot向量输入到模型中:

    斯坦福的GloVe

    GloVe嵌入的基本思想是从全局统计中导出单词之间的关系。

    但是,统计数字怎么能代表意义呢?让我解释一下。

    最简单的方法之一是看共现矩阵。共现矩阵告诉我们一对特定的词在一起出现的频率。共现矩阵中的每个值都是一对词同时出现的计数。

    例如,考虑一个语料库:“play cricket, I love cricket and I love football”。语料库的共现矩阵如下所示:

    现在,我们可以很容易地计算出一对词的概率。为了简单起见,让我们把重点放在“cricket”这个词上:

    p(cricket/play)=1

    p(cricket/love)=0.5

    接下来,我们计算概率比:

    p(cricket/play) / p(cricket/love) = 2

    当比率大于1时,我们可以推断板球最相关的词是“play”,而不是“love”。同样,如果比率接近1,那么这两个词都与板球有关。

    我们可以用简单的统计方法得出这些词之间的关系。这就是GLoVE预训练词嵌入的想法。

    案例研究:从头开始学习嵌入与预训练词嵌入

    让我们通过一个案例来比较从头开始学习我们自己的嵌入和预训练词嵌入的性能。我们还将了解使用预训练词嵌入是否会提高NLP模型的性能?

    所以,让我们选择一个文本分类问题-电影评论的情感分析。从这里下载电影评论数据集(https://www.kaggle.com/columbine/imdb-dataset-sentiment-analysis-in-csv-format)。

    将数据集加载到Jupyter:

    #导入库
    import pandas as pd
    import numpy as np
    
    #读取csv文件
    train = pd.read_csv('Train.csv')
    valid = pd.read_csv('Valid.csv')             
    
    #训练测试集分离
    x_tr, y_tr = train['text'].values, train['label'].values
    x_val, y_val = valid['text'].values, valid['label'].values

    准备数据:

    from keras.preprocessing.text import Tokenizer
    from keras.preprocessing.sequence import pad_sequences
    
    tokenizer = Tokenizer()
    
    #准备词汇表
    tokenizer.fit_on_texts(list(x_tr))
    
    #将文本转换为整数序列
    x_tr_seq  = tokenizer.texts_to_sequences(x_tr) 
    x_val_seq = tokenizer.texts_to_sequences(x_val)
    
    #填充以准备相同长度的序列
    x_tr_seq  = pad_sequences(x_tr_seq, maxlen=100)
    x_val_seq = pad_sequences(x_val_seq, maxlen=100)

    让我们看一下训练数据中的单词个数:

    size_of_vocabulary=len(tokenizer.word_index) + 1 #+1用于填充
    print(size_of_vocabulary)

    Output: 112204

    我们将构建两个相同架构的不同NLP模型。第一个模型从零开始学习嵌入,第二个模型使用预训练词嵌入。

    定义架构从零开始学习嵌入:

    #深度学习库
    from keras.models import *
    from keras.layers import *
    from keras.callbacks import *
    
    model=Sequential()
    
    #嵌入层
    model.add(Embedding(size_of_vocabulary,300,input_length=100,trainable=True)) 
    
    #lstm层
    model.add(LSTM(128,return_sequences=True,dropout=0.2))
    
    #Global Max池化
    model.add(GlobalMaxPooling1D())
    
    #Dense层
    model.add(Dense(64,activation='relu')) 
    model.add(Dense(1,activation='sigmoid')) 
    
    #添加损失函数、度量、优化器
    model.compile(optimizer='adam', loss='binary_crossentropy',metrics=["acc"]) 
    
    #添加回调
    es = EarlyStopping(monitor='val_loss', mode='min', verbose=1,patience=3)  
    mc=ModelCheckpoint('best_model.h5', monitor='val_acc', mode='max', save_best_only=True,verbose=1)  
    
    #输出模型
    print(model.summary())

    输出:

    模型中可训练参数总数为33889169。其中,嵌入层贡献了33661200个参数。参数太多了!

    训练模型:

    history = model.fit(np.array(x_tr_seq),np.array(y_tr),batch_size=128,epochs=10,validation_data=(np.array(x_val_seq),np.array(y_val)),verbose=1,callbacks=[es,mc])

    评估模型的性能:

    #加载最佳模型
    from keras.models import load_model
    model = load_model('best_model.h5')
    
    #评估
    _,val_acc = model.evaluate(x_val_seq,y_val, batch_size=128)
    print(val_acc)

    输出:0.865

    现在,是时候用GLoVE预训练的词嵌入来构建第二版了。让我们把GLoVE嵌入到我们的环境中:

    # 将整个嵌入加载到内存中
    embeddings_index = dict()
    f = open('../input/glove6b/glove.6B.300d.txt')
    
    for line in f:
        values = line.split()
        word = values[0]
        coefs = np.asarray(values[1:], dtype='float32')
        embeddings_index[word] = coefs
    
    f.close()
    print('Loaded %s word vectors.' % len(embeddings_index))

    输出:Loaded 400,000 word vectors.

    通过为词汇表分配预训练的词嵌入,创建嵌入矩阵:

    # 为文档中的单词创建权重矩阵
    embedding_matrix = np.zeros((size_of_vocabulary, 300))
    
    for word, i in tokenizer.word_index.items():
        embedding_vector = embeddings_index.get(word)
        if embedding_vector is not None:
            embedding_matrix[i] = embedding_vector

    定义架构-预训练嵌入:

    model=Sequential()
    
    #嵌入层
    model.add(Embedding(size_of_vocabulary,300,weights=[embedding_matrix],input_length=100,trainable=False)) 
    
    #lstm层
    model.add(LSTM(128,return_sequences=True,dropout=0.2))
    
    #Global Max池化
    model.add(GlobalMaxPooling1D())
    
    #Dense层
    model.add(Dense(64,activation='relu')) 
    model.add(Dense(1,activation='sigmoid')) 
    
    #添加损失函数、度量、优化器
    model.compile(optimizer='adam', loss='binary_crossentropy',metrics=["acc"]) 
    
    #添加回调
    es = EarlyStopping(monitor='val_loss', mode='min', verbose=1,patience=3)  
    mc=ModelCheckpoint('best_model.h5', monitor='val_acc', mode='max', save_best_only=True,verbose=1)  
    
    #输出模型
    print(model.summary())

    输出:

    如你所见,可训练参数的数量仅为227969。与嵌入层相比,这是一个巨大的下降。

    训练模型:

    history = model.fit(np.array(x_tr_seq),np.array(y_tr),batch_size=128,epochs=10,validation_data=(np.array(x_val_seq),np.array(y_val)),verbose=1,callbacks=[es,mc])

    评估模型的性能:

    #加载最佳模型
    from keras.models import load_model
    model = load_model('best_model.h5')
    
    #评估
    _,val_acc = model.evaluate(x_val_seq,y_val, batch_size=128)
    print(val_acc)

    输出:88.49

    与从头学习嵌入相比,使用预训练词嵌入的性能有所提高。

    结尾

    预训练词嵌入是有力的文本表示方式,因为它们往往捕捉单词的语义和句法意义。

    在本文中,我们了解了预训练词嵌入的重要,并讨论了两种流行的预训练词嵌入:Word2Vec和gloVe。

    原文链接:https://www.analyticsvidhya.com/blog/2020/03/pretrained-word-embeddings-nlp/

    欢迎关注磐创AI博客站: http://panchuang.net/

    sklearn机器学习中文官方文档: http://sklearn123.com/

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

    展开全文
  • 深度学习:词嵌入Embedding

    万次阅读 多人点赞 2017-07-26 11:08:06
    词嵌入 词嵌入其实就是将数据的原始表示表示成模型可处理的或者是更dense的低维表示(lz)。 One-hot Embedding 假设一共有个物体,每个物体有自己唯一的id,那么从物体的集合到有一个trivial的嵌入,就是把它...

    http://blog.csdn.net/pipisorry/article/details/76095118

    词嵌入

    词嵌入其实就是将数据的原始表示表示成模型可处理的或者是更dense的低维表示(lz)。

    One-hot Embedding

            假设一共有m个物体,每个物体有自己唯一的id,那么从物体的集合到\mathbb R^m有一个trivial的嵌入,就是把它映射到\mathbb R^m中的标准基,这种嵌入叫做One-hot embedding/encoding.

    [数据预处理:独热编码(One-Hot Encoding)]

    一般使用的低维embedding

            应用中一般将物体嵌入到一个低维空间\mathbb R^n(n \ll m) ,只需要再compose上一个从\mathbb R^m\mathbb R^n的线性映射就好了。每一个n\times m 的矩阵M都定义了\mathbb R^m\mathbb R^n的一个线性映射: x \mapsto Mx。当x 是一个标准基向量的时候,Mx对应矩阵M中的一列,这就是对应id的向量表示。

    这个概念用神经网络图来表示如下:

            从id(索引)找到对应的One-hot encoding,然后红色的weight就直接对应了输出节点的值(注意这里没有activation function),也就是对应的embedding向量。

    Note:

    1 M随机初始化并且是可训练的,查找x对应的embedding表示其实 等价于 找x在下面这个网络中的权重,而这些权重是可训练的,且对应于矩阵M。

    2  关于嵌入维度数量(New Embedding维度)的一般经验法则:

    embedding_dimensions =  number_of_categories**0.25

    也就是说,嵌入矢量维数应该是类别数量的 4 次方根。如词汇量为 81,建议维数为 3。

    低维向量嵌入在tensorflow中的实现:tf.nn.embedding_lookup()

        embedding_map = tf.get_variable(  # 默认参数trainable = True,可训练
            name="embedding_map",
            shape=[self.config.vocab_size, self.config.embedding_size],
            initializer=self.initializer)
        seq_embeddings = tf.nn.embedding_lookup(embedding_map, self.input_seqs)

    和下面类似:

    matrix = np.random.random([1024, 64])  # 64-dimensional embeddings
    ids = np.array([0, 5, 17, 33])
    print matrix[ids]  # prints a matrix of shape [4, 64] 

    从id类特征(category类)使用embedding_lookup的角度来讲:

    1、onehot编码神经网络处理不来。embedding_lookup虽然是随机化地映射成向量,看起来信息量相同,但其实却更加超平面可分。

    2、embedding_lookup不是简单的查表,id对应的向量是可以训练的(带有label信息),训练参数个数应该是 category num*embedding size,也就是说lookup是一种全连接层。详见 brain of mat kelcey

    3、word embedding其实是有了一个距离的定义,即出现在同一上下文的词的词向量距离应该小,这样生成向量比较容易理解。autoencode、pca等做一组基变换,也是假设原始特征值越接近越相似。但id值的embedding应该是没有距离可以定义,没有物理意义,只是一种特殊的全连接层。

    4、用embedding_lookup做id类特征embedding由google的deep&wide提出。阿里 第七章 人工智能,7.6 DNN在搜索场景中的应用(作者:仁重) 中提下了面对的困难,主要是参数数量过多(引入紫色编码层)和要使用针对稀疏编码特别优化过的全连接层( Sparse Inner Product Layer )等。

    5、在分类模型中用这种id类特征,主要是希望模型把这个商品记住。但id类特征维度太高,同一个商品的数据量也不大,因此也常常用i2i算法产出的item embedding来替代id特征。

    [tf.nn.embedding_lookup函数原理?]

    [求通俗讲解下tensorflow的embedding_lookup接口的意思?]

    [tf.nn.embedding_lookup]

    [what-does-tf-nn-embedding-lookup-function-do]

    某小皮

            词嵌入有其它很多方法如word2vec,bert等,embedding lookup只是其中一种。我们可以只使用简单的embedding lookup让模型自己去训练;也可以将embedding lookup中的矩阵先通过word2vec训练好进行初始化,再通过embedding lookup训练;或者只使用vord2vec进行初始化后,embedding lookup设置成不训练。

    Word2vec

    [深度学习:词嵌入之word2vec]

    其它的Word Representation

     

    Word level representation from characters embeddings    Bidirectional LSTM on top of word representation to extract contextual representation of each word

    右图中的context应该是指句子的上下文。

    [Sequence Tagging with Tensorflow]

     

    句子embedding

    1 词向量直接求平均或者最大值:对句子中所有单词直接求平均, 每个单词的权重相同, 得到sentence embedding。

    2 使用每个词的TF-IDF值为权重, 加权平均, 得到sentence embedding。

    sif sentence embedding使用预训练好的词向量, 使用加权平均的方法, 对句子中所有词对应的词向量进行计算, 得到整个句子的embedding向量:模型的输入是一个已有的word embedding,然后通过加权求平均的方法求得sentence的embedding,最后使用主成分分析去掉一些special direction,即在完成词加权平均之后,移除所有行为向量的公共主成分:v_s -= u*u^t*v_s。

            其中v_s表示加权平均之后的结果,u表示所有句子向量进行特征分解之后,最大特征值对应的特征向量,相当于所有句子向量的最大主成分,这样就把所有行为链路中彼此相关的一部分去除,只保留反应序列特性的成分。
    [论文阅读 A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SEN- TENCE EMBEDDINGS]

    [A simple but tough-to-beat baseline for sentence embedding]

     

     

    词向量维度的选择

    On the Dimensionality of Word Embedding

    词向量集合的距离度量:PIP loss,基于此可以选择最优词向量维度

    文章分析了LSA, Word2vec, Glove对于不同任务的最优维度


    [On the Dimensionality of Word Embedding]

    from: http://blog.csdn.net/pipisorry/article/details/76095118

    ref: [tensorflow对嵌入概念的解释]

    [深度学习、NLP 和表示法(Chris Olah 的博客)]

    [TensorFlow Embedding Projector]

     

    展开全文
  • 词嵌入教程

    2020-11-02 22:24:05
    作者|Shraddha Anala 编译|VK 来源|Towards Data Science 无论我们是谁,阅读、理解、交流并最终产生新的内容是我们在职业生活中都要做的事情。 当涉及到从给定的文本体中提取有用的特征... 词嵌入是文本中单个单词的密
  • 词嵌入算法

    千次阅读 2018-03-16 10:09:59
    为了克服文字长短不一和将词与词之间的联系纳入模型的困难,人们使用了一种技术——词嵌入。 常见的词嵌入算法有:“Word2Vec”和“Glove” 「词嵌入(word embeddings)」术语,来指代词语在低维度向量空间的稠密...
  • 吴恩达deeplearning Lesson5 Week2 自然语言处理与词嵌入 词嵌入操作+根据文本自动加注Emoji词嵌入使用词嵌入嵌入矩阵学习词嵌入基础模型Word2VecGloVe 词向量情感分析除偏非带性别表征词汇(比如码农)带性别表征...
  • 词嵌入简介

    千次阅读 2018-10-12 15:33:59
    词嵌入简介 1 综述 1.1 是什么 词嵌入就是将词转化成数值向量的方法 1.2 为什么这么做 很多机器学习模型只支持数据数据输入,无法直接处理文本 2 基于频率的词嵌入 2.1 计数向量 语料库C中有D个文本{d1,d2…dD}包含...
  • 词嵌入方法

    千次阅读 2020-03-07 19:57:28
    词嵌入的主要思想是将文本转换为较低维度空间的矢量表示。对于这种转化后的向量有两个重要的要求: 较低维度空间:尽量降低编码词向量产生的稀疏性。 保证上下文相似性:为了使语言模型更好的预测文本的含义。 总...
  • 词嵌入、词向量

    2020-06-09 13:23:46
    词嵌入: https://machinelearningmastery.com/what-are-word-embeddings/ Keras词嵌入模型: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/ 邱锡鹏-面向自然语言处理的...
  • 词嵌入去偏

    2020-12-10 20:19:08
    词嵌入除偏-深度学习第五课《序列模型》-Stanford吴恩达教授 ACL 2020 | 词嵌入性别偏见难以避免?“双硬去偏”新方法来了
  • 词嵌入基础及其使用

    千次阅读 2019-12-02 09:01:07
    使用词嵌入3. 词嵌入的特性4. 嵌入矩阵5.学习词嵌入6. Word2Vec7. 负采样8.GloVe词向量9. 情感分类10.词嵌入除偏 1.词汇表征 2. 使用词嵌入 3. 词嵌入的特性 4. 嵌入矩阵 5.学习词嵌入 6. Word2Vec 7. 负采样 8....
  • 词嵌入矩阵

    2020-04-01 21:23:27
    在nlp任务中,计算机不会直接处理文本信息,而是需要先...词嵌入矩阵就是将单词从one-shot形式转化为固定维数的向量时所需的转换矩阵。 英文单词的oneshot形式可由tokenizer.word_index直接获得,它是一个字典,内...
  • 词嵌入特性

    2018-07-11 14:43:54
    类比特征embedding,词嵌入,将两个相近的词嵌入向量相减,得到的向量中会有很多0。因为这两个词很相近所以他们有很多特征值是接近的。比如用e_man-e_woman 约等于 e_king-e_queen这说明两类事物之间的关系很相似。e...
  • NLP -- 词嵌入模型

    2019-11-14 09:43:40
    NLP – 词嵌入模型
  • 词嵌入 word embedding

    2018-11-01 18:24:36
    词嵌入(word embedding)是一种词的类型表示,具有相似意义的词具有相似的表示,是将词汇映射到实数向量的方法总称。词嵌入是自然语言处理的重要突破之一。 什么是词嵌入词嵌入实际上是一类技术,单个词在...
  • 5.2.5学习词嵌入

    2018-12-14 11:07:38
    答案:学习词嵌入是功能,即向系统输入依次几个单词,系统自动预测出下一个单词是什么,eg a glass of orange ___,系统会自动预测出juice这个单词,我们把系统的这种功能叫做“学习词嵌入”。 2 如何嵌入? 答案:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,104
精华内容 19,241
关键字:

词嵌入