精华内容
下载资源
问答
  • BERT是怎样炼成的--词向量发展史

    千次阅读 2018-12-28 10:31:19
    向量 预训练词向量对于很多计算机语言模型至关重要。如何得到优质的词向量是非常热门的研究主题。 什么是好的词向量? 反映出语义和语法的复杂特征 适应不同上下文进行变换 历史回顾-如何用向量表示词语? one ...

    基本原理和特性

    词向量

    预训练词向量对于很多计算机语言模型至关重要。如何得到优质的词向量是非常热门的研究主题。

    什么是好的词向量?

    • 反映出语义和语法的复杂特征
    • 适应不同上下文进行变换

    历史回顾-如何用向量表示词语?

    one hot vector

    有序词典V,包括n个单词。

    每一个单词用长度为n的向量表示。这个向量仅于单词在V词典中索引序号位置为1,其余位置为0。这是一种非常稀疏的向量。

    缺点:

    1.维度非常高。
    2.这种向量无法表示词与词之间的关系,无法衡量相似度。
    

    word2vec

    用低维度密集向量表示单词,通常维数为100-300。

    在训练过程中,要求计算机学习根据当前单词预测其周围单词。或根据周围单词预测当前单词。

    模型收敛后,得到单词与向量映射表。

    优点:

    1.相比one hot维度变低,利于计算。
    2.词向量可以表达词语关系:相同上下文环境的词,会具有相似的向量值。
    3.无需人工标注,可以利用丰富的语料库自动抽取特征。
    

    缺点:

    1.无法区分近义词与反义词,它们会具有相似的向量。
    2.单词和向量是一一对应关系,而实际上单词在不同文本环境下,会具有不同的含义,向量无法适应上下文而变换。如下两句,词朝阳会被用相同的向量表达。
    我在朝阳上班。
    这是个朝阳行业。
    

    ELMo

    论文点我

    动态词向量技术,词向量不再用固定的映射表来表达。

    ELMo训练出一个神经网络模型,它接受输入一个句子,输出句子中每个单词的向量序列。

    网络结构:

    训练过程:输入句子 - embedding层(512) - 双向lstm层(2*512) - 双向lstm层(2*512) - softmax层(vocab_size)
    
    预测过程:输入句子 - embedding层(512) - 双向lstm层(2*512) - 双向lstm层(2*512) - 拼接前三层各自的输出(3*1024)
    

    训练任务:

    分别从句子的正反两个方向encode,预测下一个单词。

    我爱北京天安门。

    正向:
    输入 我 爱 北京 天安门
    预测 爱 北京 天安门 。

    反向:
    输入 。 天安门 北京 爱
    预测 天安门 北京 爱 我

    优点:

    1.继承了word2vec的所有优点
    2.动态词向量,解决了不同上下文环境下向量不可变的问题。
    

    缺点:

    1.用两个单向模型(双向lstm)表示双向语言模型。每一个单向模型只能注意到它前面的所有词语,而无法接触到它后面的词语。
    

    BERT

    论文点我

    为了弥补ELMo的不足,BERT真正实现了双向语言模型。

    此外,BERT还增加了一个特性,使神经网络学习句子之间是否连贯的关系,最终能在智能问答等领域得到最佳结果。

    网络结构:

    训练过程:输入句子 - embedding层(768) - position_embedding层(768) - transformer层(768) * 12 - masked_lm层 - next_sentence层
    预测过程:输入句子 - embedding层(768) - position_embedding层(768) - transformer层(768) * 12
    

    训练任务:

    1.遮蔽单词预测(masked lm)

    在原句中随机选择单词做遮蔽处理。

    由于训练过程,语料含有遮蔽的词,而训练后将模型应用于实际任务时,语料没有遮蔽词。这种不匹配问题,用下面的方式来解决:

    挑选15%的词。这些被选中的词中,80%直接替换成[MASK],10%被随机替换成另一个语料中的词,10%不做任何处理。

    Transformer编码器不知道最终要预测哪个词,更不知道输入句子对里哪个词是被随机替换成其他词了,所以它必须保留每个词语的语境表达分布信息。此外,这种随机替换的概率只有15%*10%=1.5%,因此它不会严重破坏语言模型的理解能力。

    由于task1中只对15%的遮蔽词做预测,这样的任务需要更多的训练步骤才能达到收敛。但它对模型精度提升的收益远大于训练时间成本。

    2.句子对[A, B]关系预测(next_sentence)
    许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于理解两个句子之间的关系。通过上述语言模型,无法直接获得这种信息。

    为了训练一个理解句子关系的模型,解决方法为:训练一个二分类任务,判断句子对[A,B]是否连贯的上下文。

    生成句子对[A,B]时,50%概率是连贯的上下句,50%概率是随机摘取的不相关句子。

    优点:

    1.在NLP领域各项任务中取得突破性成绩。
    2.训练完毕后,稍加调整即可用于具体任务。
    

    缺点:

    1.训练过程非常耗时,谷歌公布的训练时间是在4-16个TPU集群上训练了4天,如果用GPU训练可能需要一周以上。
    好在谷歌开源了训练好的中文模型。
    2.模型参数量大,约为110M,需占用11G显存(一整张显卡)。
    
    展开全文
  • 词嵌入:把词映射为实数域上向量的技术也叫词嵌入(word embedding)。 词向量的分类表示: 一、共现矩阵  通过统计一个事先指定大小的窗口内的word共现次数,以word周边的共现词的次数做为当前word的vector。...

    话不多说,直接上干货。

    首先介绍相关概念:

    词嵌入把词映射为实数域上向量的技术也叫词嵌入(word embedding

    词向量的分类表示

    一、共现矩阵

           通过统计一个事先指定大小的窗口内的word共现次数,以word周边的共现词的次数做为当前wordvector具体来说,我们通过从大量的语料文本中构建一个共现矩阵来定义word representation

           例如,有语料如下

    I like deep learning.
    I like NLP.
    I enjoy flying.

          得到共现矩阵X如下:

    此时选的窗口大小为3,选择在该窗口内词汇的共现频率作为vector

    矩阵定义词向量的优点:在一定程度上缓解了one-hot向量相似度为0的问题,但依旧没有解决数据系数和维度灾难的问题。

    二、SVD(奇异值分解)

           既然基于共现矩阵得到的离散词向量存在着高维和稀疏性的问题,一个自然而然的解决思路是对原始词向量进行降维,从而得到一个稠密的连续词向量。

           首先,统计一个词语的共生矩阵XX是一个|V|×|V| 大小的矩阵,Xij表示在所有语料中,词汇表V中第i个词和第j个词同时出现的词数,|V|为词汇表的大小。X做矩阵分解(如奇异值分解)得到矩阵正交矩阵U,对U进行归一化得到矩阵,即视为所有词的词向量:

    SVD得到了word的稠密(dense)矩阵,该矩阵具有很多良好的性质:语义相近的词在向量空间相近,甚至可以一定程度反映word间的线性关系。

    但这样的传统做法有很多问题:

    1. 由于很多词没有出现,导致矩阵极其稀疏,因此需要对词频做额外处理来达到好的矩阵分解效果;
    2. 矩阵非常大,维度太高
    3. 需要手动去掉停用词(如although, a,...),不然这些频繁出现的词也会影响矩阵分解的效果。

    奇异值分解可见本专栏的博客

    三、神经网络语言模型(NNLM

    NNLMBengio等人提出,他的主要想法就是:

    1. 把字典里的每一个单词对应一个词特征向量

    2. 把单词序列表示成联合概率函数

    3. 自动学习词特征向量和概率函数的参数

    NNLM中,每一个单词为向量空间中的一个点,而且特征的数目要比字典的大小要小,它的概率函数表示为在给定前一个词下,后一个词的条件概率的乘积。

    输入:

    (1)首先是对整个词汇表建立一个索引,每个单词对应一个索引号,其实就是one-hot编码

    (2)one-hot编码建立索引矩阵D,维度为 (n−1)×|V|,即每一行代表一个单词的one hot

    (3)而矩阵C每一行为一个单词的词向量,这样D⋅C就抽取出对应单词的向量了,这就是图中的table look-up in c

    (4)找出对应的词向量后,将这些词向量拼接在一起,形成一个 (n−1)m维的列向量x

    (5)经过隐含层tanh函数的激活,再经过softmax输出层的输出,这就得到了函数g的输出向量。

    输出:

           函数g把输入的上下文单词的特征向量(C(wt−n+1),...,C(wt−1))映射为下一个单词wt的条件概率分布函数,当然,这个单词wt在字典V中。

    四、Word2Vec

           2013年,Google团队发表了word2vec工具word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种近似训练法:负采样(negative sampling)和层序softmaxhierarchical softmax)。值得一提的是,word2vec的词向量可以较好地表达不同词之间的相似和类比关系。    

          在skip-gram模型中,我们用一个词来预测它在文本序列周围的词。

          在cbow模型中,我们用周围词来预测核心词。

          word2vec详情可参考我的这篇博客

     

    五、Glove

          Glove是斯坦福大学Jeffrey Pennington等人提出的他们认为虽然skip-gram模型在计算近义词方面比较出色,但它们只是在局部上下文窗口训练模型,并且它很少使用语料中的一些统计信息,因此Jeffrey Pennington等人又提出了一个新型模型GloVe

           首先给一些说明,词-词共现计数矩阵可以表示为X,则Xij为单词j出现在单词i上下文中的次数。Xi=ΣkXik表示任何词出现在单词i上下文中的次数,Pij=P(j|i)=Xij/Xi表示单词j出现在单词i上下文中的比率

           使用一个例子来说明是怎样从共现概率中抽取确定的意思,其实也就是说,和哪个上下文单词在一起的多,那么这个单词与这个上下文单词在一起要比与其他词在一起意义要大。

           例如i=ice, j=steam,假设有共现词k,但是kice的联系要比与steam的联系强,也就是说单词kice出现的概率比与 steam出现的概率大,比如说k=solid,那么我们认Pik/Pjk会很大。

           相似地,如果单词ksteam的联系比与ice的联系强,例如k=gas,那么Pik/Pjk的比率会很小,对于其他的单词kwater, fashionice,steam联系都强或都不强的话,则Pik/Pjk的比率会接近1

           这个比率就能区别相关词(solid, gas)和不相关词(water, fashion),并且也能区别这两个相关的词(solid, gas)。那么得到的向量可能为ice-steam=solid-gas,这与word2vec相似。

            word2vecglove的区别:

            Omer Levy等人对基于计数的方法和基于embedding的方法做了对比,发现它们之间并没有非常大的差距,在不同的场景各个模型发挥不同的作用,它们之间并没有谁一定优于谁,相比于算法而言,增加语料量,进行预处理以及超参数的调整显得非常重要。特别指出,基于negtive samplingskip-gram模型可以作为一个基准,尽管对不同的任务它可能不是最好的,但是它训练快,占用内存和磁盘空间少。

    六、ELMo-动态词向量

            艾伦研究所开发,并于6月初在NAACL 2018年发布ELMo(深度语境化的单词表示)。ELMo(Embeddings from Language Models) ,被称为时下最好的通用词和句子嵌入方法,来自于语言模型的词向量表示,也是利用了深度上下文单词表征,该模型的优势:
    1)能够处理单词用法中的复杂特性(比如句法和语义)
    2)这些用法在不同的语言上下文中如何变化(比如为词的多义性建模)

           ELMoword2vecglove最大的不同:即词向量不是一成不变的,而是根据上下文而随时变化,这与word2vec或者glove具有很大的区别

    举个例子:针对某一词多义的词汇 w="苹果"
    文本序列1=“ 买了 六斤 苹果。
    文本序列2=“ 买了一个 苹果 7
    上面两个文本序列中都出现了苹果这个词汇,但是在不同的句子中,它们的含义显示是不同的,一个属于水果领域,一个属于电子产品呢领域,如果针对苹果这个词汇同时训练两个词向量来分别刻画不同领域的信息呢?答案就是使用ELMo

            ELMo是双向语言模型bilm的多层表示的组合,基于大量文本,ELMo模型是从深层的双向语言模型(deep bidirectional language model)中的内部状态(internal state)学习而来的,而这些词向量很容易加入到QA、文本对齐、文本分类等模型中,后面会展示一下ELMo词向量在各个任务上的表现。

           它首先在大文本语料库上预训练了一个深度双向语言模型(bilm),然后把根据它的内部状态学到的函数作为词向量。实验表明,这些学到的词表征可以轻易地加入到现有的模型中,并在回答问题、文本蕴含、情感分析等 6 个不同的有难度的 NLP 问题中大幅提高最佳表现。实验表明显露出预训练模型的深度内部状态这一做法非常重要,这使得后续的模型可以混合不同种类的半监督信号。

           使用ELMo获得词向量替换Glove的词向量作为多项特定NLP模型的输入,在ELMO实验论文中表明具有一定的效果提升:

    ps:

    elmo很厉害,但并不是说在中文语料的表现上比word2vec好很多。据哈工大的研究表明,从句发任务的角度出发,在OOV比例高的数据中ELMO效果好。哈工大分析了OOV、traning data size、morphological richness等因素。在多国语法任务中,OOV rate与ELMo带来的提升的相关性最高。(当然,这些因素之间实际上不是正交的,traning data size比较小的往往OOV rate也高,morphology rich的数据OOV往往更多)。

    回到中文的问题,ELMo能否比word2vec好以及好多少,和实际任务关系可能很大。

    如果是训练数据很少或者接近zero-shot,one-shot这种settings,ELMo很可能表现得更好。如果训练数据很好(比如其他答案中提到的dureader数据),ELMo可能没什么效果。

    除此之外,中文是形态不丰富的语言,这点可能会影响ELMo的发挥。

    详情可见链接

    展开全文
  • 什么是人工智能? 人工智能在过去达到了什么程度? 人工智能在过去几年中有哪些值得称道的里程碑?...AI发展的第二个冬季   阅读原文请进入:[觉醒向量数据标注官网/资源中心/Blog](http://www.awkvector.com)

    什么是人工智能? 人工智能在过去达到了什么程度? 人工智能在过去几年中有哪些值得称道的里程碑? 5年、20年、50年或100年后,人工智能将解决什么问题? 人工智能的未来会是什么样子?

    觉醒向量带你秒懂AI发展史
     
         关于人工智能的话题不胜枚举,在探讨这些话题之前,我们不妨来聊聊人工智能的历史。
     

    罗森的RUR

     
         1920年,捷克作家卡雷尔•恰佩克发表了一部名为罗森的通用机器人的科幻小说,也被称为RUR。该剧中引入了“机器人”这个词。RUR的背景是一家工厂,该工厂创造了一个名为机器人的人造人。它们与今天的机器人术语不同,它代表的不是机器人的现代概念。在RUR中,机器人是生物,与克隆的术语更为相似。RUR中的机器人首先为人类工作,但随后出现了机器人叛乱,导致人类灭绝。
     
         文学和电影中的人工智能本身就是一个很大的话题。RUR的例子应该表明人工智能对社会的重要性和影响力。
     

    艾伦•图灵

     
         艾伦•图灵1912年6月23日出生于伦敦。众所周知,图灵在科学界特别在数理逻辑和计算机科学方面,取得了举世瞩目的成就,他的一些科学成果,构成了现代计算机技术的基础。
     
         在第二次世界大战结束几年后,图灵引入了他广为人知的图灵测试,这是一次智能定义机器的尝试。其想法是测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘)向被测试者随意提问。进行多次的测试后,如果有超过30%的测试者不能确定出被测试者是人还是机器,那么这台机器就通过了测试,并被认为具有人类智能。
     

    达特茅斯会议

     
         1956年,在美国汉诺斯小镇宁静的达特茅斯学院中,来自卡内基梅隆大学(CMU),麻省理工学院(MIT)和IBM员工的研究人员齐聚一堂,会议围绕着一个主题——用机器来模仿人类学习以及其他方面的智能。会议开了两个月之久,最后他们给会议内容起了一个名字:人工智能。随后共同创立了AI研究,因此1956年也被成为人工智能元年。
     
         “20年后,机器将能够完成人类可以做的任何工作” – Herbert A. Simon(CMU)
     
         “在一代人之内……创造‘设计智慧’的问题将基本得到解决” – 马文明斯基(麻省理工学院)
     
         然而毕竟是在20世纪60年代。在接下来的几年里,进展非常缓慢。由于没有认识到任务的难度,承诺被打破了。
     

    第一个AI冬天

     
         在1974年左右,由于过度乐观的想法以及后来也没有什么突破性的进展,美国和英国政府中断了对人工智能的探索×××。热情褪去后,没有人想资助人工智能研究,人工智能的宣传兴趣也随之减少了。接下来的几年被称为第一个AI冬季。
     

    专家系统

     
         在第一次AI冬季之后,人工智能以一种所谓的“专家系统”的形式回归。
     
         “专家系统是一个智能计算机程序系统,其内部含有大量的某个领域专家水平的知识与经验,能够利用人类专家的知识和解决问题的方法来处理该领域问题。”他们模仿特定分支中的专家并按规则解决问题。专家系统中有两种类型的引擎:首先是知识库。知识库包含解决问题相关的领域知识。在基于规则的专家系统中,知识用一组规则来表达。其具有IF(条件)THEN(行为)结构,当规则的条件被满足时,触发规则,继而执行行为。其次是推理引擎,推理引擎执行推理,专家系统由此找到解决方案。推理引擎链接知识库中的规则和数据库中的事实。
     
    接下来人工智能将进入第二个冬天。
     
    由于篇幅原因,后续文章内容请阅读——AI发展的第二个冬季
     

      阅读原文请进入:[觉醒向量数据标注官网/资源中心/Blog](http://www.awkvector.com)
    展开全文
  • NLP词向量发展历程

    2020-02-25 17:25:43
    这篇文章记录词向量发展历程,包括tf-idf、word2vec、GloVe、ELMo、OpenAI GPT以及Bert,只记录个人认为比较核心的内容,以及一些值得思考的边角细节。 1、tf-idf tf-idf是一种比较传统的文本表示方法,它首先为每...

    这篇文章记录词向量的发展历程,包括tf-idf、word2vec、GloVe、ELMo、OpenAI GPT以及Bert,只记录个人认为比较核心的内容,以及一些值得思考的边角细节。

    1、tf-idf

    tf-idf是一种比较传统的文本表示方法,它首先为每个词计算出一个值,再组成向量来表示当前文档。它的大小等于词表数。首先tf是词频,也就是当前词在文档中出现的次数,通常会除以文档总词数来做归一化。idf的计算方法是log(语料库中总文档数 / 包含当前词的文档数),可见分子是固定值,idf将随着包含当前词的文档数的增加而减小,也就是说常见词的idf值会相对较小,而当前文档比较有代表性的词发挥更大的作用。tf-idf的缺点是它是词袋模型,无法考虑词的位置信息,上下文信息以及一些分布特征。

    2、word2vec

    实际上tf-idf就是one-hot的一种优化,还是存在维度灾难以及语义鸿沟的问题。因此后来的工作着重于构建分布式低维稠密词向量。word2vec就是它们的开山之作。我们知道NNLM(语言模型)是一种自监督训练的模型,用上文来预测下一个词的概率,那么词向量就可以作为它的副产物学习到这种基于序列共现的语境信息。word2vec基于这种思想提出了更专注于词向量学习的模型(比如舍弃隐藏层),用滑动窗口来指定固定大小的上下文,试图用当前词来预测上下文(skip-gram)或用上下文来预测当前词(CBOW)。具体细节可以参考这篇论文

    word2vec的两种加速训练策略

    • 分层softmax
      用哈夫曼树来计算词的概率,每个词对应一个叶节点。非叶节点也各自对应一个向量,词的概率可由它到根节点的唯一路径来计算。
      哈夫曼树的构造方法:将词表中的每个词看作只有一个结点的树,用词频来表示它们的权重。选择根节点权重最小的两棵树合并,合并后的父节点权重等于两个子结点之和。下面是一个例子:
      在这里插入图片描述
      为了保证概率相加等于1,在路径上采用sigmoid来计算向左或向右(n表示结点,v表示结点向量):
      p ( n , l e f t ) = σ ( v T h ) p(n, left) = \sigma (v^T\mathbf{h}) p(n,left)=σ(vTh) p ( n , r i g h t ) = 1 − σ ( v T h ) = σ ( − v T h ) p(n, right) = 1 - \sigma (v^T\mathbf{h}) = \sigma (-v^T\mathbf{h}) p(n,right)=1σ(vTh)=σ(vTh)
      那么某个词 w o w_o wo 出现的概率就是:

      [[·]]是个1/-1函数,左子结点取1,右子结点取-1。 再算cross entropy即可:

      这样就代替了softmax,复杂度从O(N)变成O(log N)。

    • 负采样

      采样概率:在词频上取0.75次幂,减小词频差异带来的采样影响,即
      w e i g h t ( w ) = c o u n t ( w ) 0.75 ∑ u c o u n t ( u ) 0.75 weight(w) = \frac{count(w)^{0.75}}{\sum_u count(u)^{0.75}} weight(w)=ucount(u)0.75count(w)0.75那么损失函数为:
      E = − log ⁡ σ ( v w o ′ T h ) − ∑ w N ∈ N E G log ⁡ σ ( − v w N ′ T h ) E = -\log \sigma(v'^T_{w_o} \mathbf{h}) - \sum_{w_N \in NEG} \log \sigma(-v'^T_{w_N} \mathbf{h}) E=logσ(vwoTh)wNNEGlogσ(vwNTh) w o w_o wo 是目标词, w I w_I wI 是输入词。对于skip-gram, h = v w I \mathbf{h} = v_{w_I} h=vwI,对于CBOW, h = 1 C ∑ c = 1 C v w c \mathbf{h} = \frac{1}{C}\sum_{c=1}^{C} v_{w_c} h=C1c=1Cvwc

    word2vec只能抽取局部特征,词的上下文信息局限于滑动窗口大小。

    3、GloVe

    细节推荐这篇博客。主要的几个步骤包括:

    • 构建共现矩阵
      GloVe指定特定大小的上下文窗口,通过滑动该窗口统计共现矩阵X(|V|*|V|), X i j X_{ij} Xij 表示中心词i与上下文词j的共现次数。同时还定义了衰减函数,令距离为d的两个词在计数时乘以1/d。

    • 确定近似目标
      作者发现可以用概率之比来建模共现关系。定义条件概率P:
      P i j = P ( j ∣ i ) = X i j X i P_{ij} = P(j|i) = \frac{X_{ij}}{X_i} Pij=P(ji)=XiXij表示词j出现在i上下文的概率。而用词k出现在i的上下文与它出现在j上下文的概率之比
      r a t i o i , j , k = P i k P j k ratio_{i,j,k} = \frac{P_{ik}}{P_{jk}} ratioi,j,k=PjkPik来表示i,j,k三个词之间的共现关系。当i,k和j,k相关程度近似时,该比率趋近于1;i,k相关度大于j,k相关度时该比率值较大,反之则较小。GloVe的目标就是使学习到的词向量满足这样的规律,既有自身上下文信息,又能和其它词联系起来。目标函数:
      F ( w i , w j , w k ) = P i k P j k F(w_i,w_j,w_k) = \frac{P_{ik}}{P_{jk}} F(wi,wj,wk)=PjkPik要同时满足三个词的约束关系,训练复杂度会变得很高。作者通过一系列变(硬)换(凑),把上式转换成了两个词的约束目标:
      F ( w i , w j , w k ) = exp ⁡ ( ( w i − w j ) T w k ) = exp ⁡ ( w i T w k − w j T w k ) = exp ⁡ ( w i T w k ) exp ⁡ ( w j T w k ) = P i k P j k \begin{aligned} F(w_i,w_j,w_k) &= \exp((w_i - w_j)^Tw_k) \\ &= \exp(w_i^Tw_k - w_j^Tw_k) \\ &= \frac{\exp (w_i^Tw_k)}{\exp (w_j^Tw_k)} = \frac{P_{ik}}{P_{jk}} \end{aligned} F(wi,wj,wk)=exp((wiwj)Twk)=exp(wiTwkwjTwk)=exp(wjTwk)exp(wiTwk)=PjkPik由此
      P i k = exp ⁡ ( w i T w k ) P_{ik} = \exp (w_i^Tw_k) Pik=exp(wiTwk)成为新的目标函数。然而这种内积计算方式具有对称性,为了避免这种错误的性质,作者继续变(硬)换(凑):
      P i k = X i k X i = exp ⁡ ( w i T w k ) log ⁡ P i k = log ⁡ ( X i k ) − log ⁡ X i = w i T w k w i T w k + log ⁡ X i = log ⁡ ( X i k ) P_{ik} = \frac{X_{ik}}{X_i} = \exp (w_i^Tw_k) \\ \log P_{ik} = \log (X_{ik}) - \log X_i = w_i^Tw_k \\ w_i^Tw_k + \log X_i = \log (X_{ik}) Pik=XiXik=exp(wiTwk)logPik=log(Xik)logXi=wiTwkwiTwk+logXi=log(Xik) log ⁡ X i \log X_i logXi看作常数项,再添加一个偏置 b k b_k bk,目标函数最终形式为:
      w i T w k + b i + b k = log ⁡ ( X i k ) w_i^Tw_k + b_i + b_k = \log(X_{ik}) wiTwk+bi+bk=log(Xik)其中 X i k X_{ik} Xik 是共现矩阵中的值。

    • 构造损失函数(平方损失)
      J = ∑ i , k = 1 V f ( X i k ) ( w i T w k + b i + b k − log ⁡ ( X i k ) ) 2 J = \sum_{i,k=1}^V f(X_{ik}) (w_i^Tw_k + b_i + b_k - \log(X_{ik}))^2 J=i,k=1Vf(Xik)(wiTwk+bi+bklog(Xik))2其中 f ( X i j ) f(X_{ij}) f(Xij) 是关于共现矩阵的权重函数,

      也就是说,共现次数越少,对它们的相关性约束越小。

    推导过程见这篇博客原论文

    Glove和Word2vec比较

    • word2vec面向局部特征,基于滑动窗口,而GloVe综合了全局语料。
    • word2vec可以增量学习,而Glove是由固定语料计算的共现矩阵。

    4、Fasttext

    Fasttext最早其实是一个文本分类算法,后续加了一些改进来训练词向量。概括了几点:

    • fasttext在输入时对每个词加入了n-gram特征,在输出时使用分层softmax加速训练。
    • fasttext将整篇文章的词向量求平均作为输入得到文档向量,用文本分类做有监督训练,对输出进行softmax回归,词向量为副产品。
    • fasttext也可以无监督训练词向量,与CBOW非常相似。

    5、ELMo

    之前那些方法构造的都是独立于上下文的word embedding,也就是无论下游任务是什么,输入的embedding始终是固定的,这就无法解决一词多义,以及在不同语境下有不同表现的需求。所以后续的ELMo,GPT-2以及BERT都是针对于这类问题提出的,通过预训练和fine-tune两个阶段来构造context-dependent的词表示。

    ELMo使用双向语言模型来进行预训练,用两个分开的双层LSTM作为encoder。biLM的loss是:
    L = ∑ k = 1 N ( log ⁡ p ( t k ∣ t 1 , . . . , t k − 1 ; Θ → L S T M , Θ s ) + log ⁡ p ( t k ∣ t k + 1 , . . . , t N ; Θ ← L S T M , Θ s ) ) L = \sum_{k=1}^N (\log p(t_k|t_1,...,t_{k-1};\overrightarrow{\Theta}_{LSTM},\Theta_s) + \log p(t_k|t_{k+1},...,t_{N};\overleftarrow{\Theta}_{LSTM},\Theta_s)) L=k=1N(logp(tkt1,...,tk1;Θ LSTM,Θs)+logp(tktk+1,...,tN;Θ LSTM,Θs))
    其中 Θ s \Theta_s Θs 是softmax层参数。作者认为第一层学到的是句法信息,第二层学到的是语义信息。这两层LSTM的隐状态以及初始的输入加权求和就得到当前词的embedding。ELMo还设置了一个参数,不同的下游任务可以取特定的值,来控制ELMo词向量起到的作用。总体来说第k个token得到的预训练embedding就是:
    E L M o k t a s k = γ t a s k ∑ j = 0 L s j t a s k h k j L M \mathbf{ELMo}_k^{task} = \gamma^{task} \sum_{j=0}^{L}s_j^{task} \mathbf{h}_{kj}^{LM} ELMoktask=γtaskj=0LsjtaskhkjLM
    在面对具体下游任务时,首先固定biLM的参数得到一个词表示,再与上下文无关的词表示(word2vec,或者charCNN获得的表示)拼接作为模型输入,在反向传播时fine-tune所有参数。

    原文中提到的一些细节:

    • biLM不同层的activation分布不同,在加权求和之前使用layer normalization有时会很有效。
    • 增加dropout和L2正则化可能会有用,这对ELMo的权重提出了一个归纳偏差,使其接近所有biLM层的平均值。
    • 在获得上下文无关词表示时,原文采用的方式是先用2048个charCNN卷积核做卷积,再过两层highway networks,然后用一个线性层把输出降到512维。

    6、OpenAI GPT

    GPT和BERT与ELMo不同,ELMo使用LSTM作为编码器,而这两个用的是编码能力更强的Transformer。

    GPT也是用语言模型进行大规模无监督预训练,但使用的是单向语言模型,也就是只根据上文来预测当前词。它实现的方式很直观,就是Transformer的decoder部分,只和前面的词计算self-attention来得到表示。在下游任务上,之前的ELMo相当于扩充了其它任务的embedding层,各个任务的上层结构各不相同,而GPT则不同,它要求所有下游任务都要完全与GPT的结构保持一致,只在输入输出形式上有所变化:

    这是在NLP上第一次实现真正的端到端,不同的任务只需要定制不同的输入输出,无需构造内部结构。这样预训练学习到的语言学知识就能直接引入下游任务,相当于提供了先验知识。比如说人在做阅读理解时,先通读一遍全文再根据问题到文章中找回答,这些两阶段模型就类似这个过程。为了防止fine-tune时丢失预训练学到的语言知识,损失函数同时考虑下游任务loss( L 2 L_2 L2)和语言模型loss( L 1 L_1 L1):
    L 3 ( C ) = L 2 ( C ) + λ L 1 ( C ) L_3(C) = L_2(C) + \lambda L_1(C) L3(C)=L2(C)+λL1(C)
    个人认为GPT的最大创新:

    • 用足够复杂的模型结构担任不同NLP任务的中间框架,启发了统一的端到端实现策略。
    • 第二阶段保留语言模型的loss。

    7、BERT

    推荐这篇博客(这位大佬的其它文章质量也超高,尤其Transformer那篇估计是好多人的入门必看)

    GPT虽然效果很好,但它在预训练时使用的是transformer的decoder部分,也就是单向语言模型,在计算attention时只能看见前面的内容,这样embedding获得的上下文信息就不完整。ELMo虽然是双向语言模型,但实际上是分开执行再组合loss,这就会带来一定的损失。

    7.1 Bert预训练

    与GPT不同的是,bert在预训练时除了语言模型loss以外,还增加了一个“next sentence prediction”任务,即两个句子组成sentence pair同时输入,预测第二句是否是第一个句子的下文,是一个二分类任务。

    7.1.1 输入

    • 每个位置的输入:
      • wordpiece-token 词向量,这里的wordpiece是将token拆分成子词。
      • position emb 位置向量
      • segment emb 句子标识,属于第一个句子则为0,第二个句子则为1
    • 整体输入:[CLS] ; sent1 ; [SEP]; sent2 ;[SEP]

    7.1.2 训练任务

    • Masked Language Model

      • 所谓双向LM,就是在预测当前词时同时考虑上文和下文,也就是
        p ( t k ∣ t 1 , . . . , t k − 1 , t k + 1 , . . . , t N ) p(t_k | t_1, ..., t_{k-1}, t_{k+1}, ...,t_N) p(tkt1,...,tk1,tk+1,...,tN)
        但LM是要逐词预测的,用这种概率计算方法会导致信息泄露,也就是当前词已经在之前的预测中作为下文而暴露了。作者由此提出了MASK策略,只选取15%的词进行预测,在输入时用[MASK]标记替代,而仍然以原词作为训练target。类似于阅读理解中的Cloze任务。当然,预测的词少了,模型收敛速度就会变慢,需要的训练step也要相应增加。

      • mask解决了信息泄露问题,但实际输入(也就是fine-tune阶段)不会包含这种标记,导致两阶段不一致,对训练效果产生影响。作者的解决方案是在这随机选取的15%词当中,80%的概率替换为[MASK],10%的概率替换成其它词(负采样) ,10%的概率保留原词。这样有一个好处是,模型不知道当前要预测的词是否被篡改了,迫使其更关注上下文,学习到上下文相关的表示,这正是我们的目的。

        作者还在附录里给出了一个扩展实验,对比不同的预训练mask策略对后续结果的影响:

        可以看到至少在这两个任务中,结果对不同的mask法是鲁棒的,差别不大。但从最后两条可以看出,直接去掉[MASK],80%或100%取负样本的效果相比之下差了很多。按理说使用负样本相当于构建去噪自编码器,到底比MASK差在哪?思考了一下,原因很可能是负采样词作为其它词的上下文输入,使得这些词学到的embedding融合了错误的信息,对训练造成影响;而[MASK]本身并没有任何含义,它从未作为target出现过,也就没有特定的出现语境,因此其embedding没有实际意义,对其它词的影响也就相对较小。

    • Next Sentence Prediction

      0/1分类任务。从语料中选取两个片段AB(注意这里是两个“span”,而不是实际意义上的“句子”,因为希望输入尽可能长)作为一条输入,50%的概率AB连续(1),50%不连续(0)。输出在[CLS]处取FFNN+Softmax做二分类预测。输入的最大长度是512,超过则直接截断。

    7.1.3 训练细节

    • 预训练数据及规模
      BooksCorpus (800M words) 加 Wikipedia (2,500M words)

    • 参数设置

      • batch_size: 256 sequences(256*512 tokens) , step 1,000,000 (40 epochs on 3.3 billion word corpus)
      • Adam优化器。lr=1e-4, β 1 \beta_1 β1=0.9, β 2 \beta_2 β2=0.999,l2 weight decay=0.01
      • learning rate warmup:10,000 steps,lr线性缩减
      • 所有层均设dropout=0.1
      • 激活函数:gelu
    • 训练loss
      masked LM与NSP的log likelihood之和

    7.2 Bert Fine-tune

    fine-tuning的任务主要分成基于句子的和基于token的。基于句子的一般取[CLS]的embedding输出预测,基于token的则直接取对应位置的输出进行预测。

    一般需根据特定的任务重新设置batch_size, learning rate, epochs超参数,其余与预训练保持一致即可。

    训练

    fine-tuning的任务主要分成基于句子的和基于token的。基于句子的一般取[CLS]的embedding输出预测,基于token的则直接取对应位置的输出进行预测。

    一般需根据特定的任务重新设置batch_size, learning rate, epochs超参数,其余与预训练保持一致即可。

    预训练好的Bert除了用于fine-tuning以外,还可以像ELMo一样作为特征抽取器,也就是直接用学习到的word embeddings当做其它模型的输入。目前看来最好的选择是最后四层向量拼接。

    Bert与GPT的区别:

    • GPT与Bert训练数据不同,GPT使用BooksCorpus (800M words); BERT是BooksCorpus (800M words)加Wikipedia (2,500M words)。
    • GPT在预训练时没有[CLS]和[SEP],在下游任务时才有
    • GPT在fine-tuning时加入LM的loss,而Bert是完全使用任务特定的目标函数。
    • GPT的lr在两阶段保持一致,Bert认为任务特定的lr效果更好

    Bert最大的创新:

    • 用mask策略实现了双向语言模型,非常巧妙。
    • 预训练除了语言模型,还加入了next sentence prediction,试图学习更高层面的语言关联性。提供了很好的扩展思路。
    展开全文
  • 你不得不了解的目标检测发展史

    千次阅读 2020-02-07 13:03:59
    这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。...
  • 21世纪的前十年,随着机器学习理论的发展,学者们相继探索出了基于遗传算法、支持向量机(Support Vector Machine, SVM)、boosting、流形学习以及核方法等进行人脸识别。 2009年至2012年,稀疏表达(Sparse ...
  • 好久没写综述之类的文章,本文 的发展史是基于去年和前年读的语义分割的论文,在去年的时候写的。毕业之际将自己手头有的资料分享出来。话不多说开始学习!!! 前言: 你不得不了解的人工智能基础知识 你不得不...
  • 人工智能发展史总结

    多人点赞 2019-04-20 15:47:33
    什么是人工智能人工智能(Aritificial Intelligence, AI)是...人工智能发展史 人工智能在发展过程中产生了很多的流派,符号主义、连接主义和行为主义。这些流派的相辅相成推进了人工智能的发展。 如果你想要系统地...
  • CPU发展史和相关品牌介绍 CPU发展已经有40多年的历史了。我们通常将其分成 六个阶段。 (1)第一阶段 (1971年-1973年) 。这是4位和8位低档微处理器时代,代表产品是Intel 4004处理器。 1971年,Intel生产的4004微...
  • 深度学习发展史

    2019-08-19 15:10:48
    本文从4个方面(张量、生成模型、序列学习、深度强化学习)追踪深度学习几十年的发展史。 主要按最早研究出现的时间,从4个方面来追踪深度学习的发展史。 1、张量 1958年Frank提出感知机,但后来被一些学者发现因...

空空如也

空空如也

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

向量的发展史