精华内容
下载资源
问答
  • 向量的发展史
    千次阅读
    2018-12-28 10:31:19

    基本原理和特性

    词向量

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

    什么是好的词向量?

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

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

    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显存(一整张显卡)。
    
    更多相关内容
  • NLP词向量发展历程

    2020-06-18 13:46:32
    文章目录1、tf-idf2、word2vec3、GloVe4、Fasttext5、ELMo6、...这篇文章记录词向量发展历程,包括tf-idf、word2vec、GloVe、ELMo、OpenAI GPT以及Bert,只记录个人认为比较核心的内容,以及一些值得思考的边角细节


    转载来源:https://zhuanlan.zhihu.com/p/108703757
    alt
    这篇文章记录词向量的发展历程, 包括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

    用哈夫曼树来计算词的概率,每个词对应一个叶节点。非叶节点也各自对应一个向量,词的概率可由它到根节点的唯一路径来计算。
    哈夫曼树的构造方法:将词表中的每个词看作只有一个结点的树,用词频来表示它们的权重。选择根节点权重最小的两棵树合并,合并后的父节点权重等于两个子结点之和。下面是一个例子:
    alt
    为了保证概率相加等于1,在路径上采用sigmoid来计算向左或向右(n表示结点,v表示结点向量):​
    p ( n , left ) = σ ( v T h ) p ( n , right ) = 1 − σ ( v T h ) = σ ( − v T h ) \begin{array}{c} p(n, \text {left})=\sigma\left(v^{T} \mathbf{h}\right) \\ p(n, \text {right})=1-\sigma\left(v^{T} \mathbf{h}\right)=\sigma\left(-v^{T} \mathbf{h}\right) \end{array} p(n,left)=σ(vTh)p(n,right)=1σ(vTh)=σ(vTh)
    那么某个词 w o w_{o} wo 出现的概率就是:
    p ( w = w O ) = ∏ j = 1 L ( w ) − 1 σ ( [ [ n ( w , j + 1 ) = ch ⁡ ( n ( w , j ) ) ] ] ⋅ v n ( w , j ) ′ T h ) p\left(w=w_{O}\right)=\prod_{j=1}^{L(w)-1} \sigma\left([[n(w, j+1)=\operatorname{ch}(n(w, j))]] \cdot \mathbf{v}_{n(w, j)}^{\prime} T_{\mathbf{h}}\right) p(w=wO)=j=1L(w)1σ([[n(w,j+1)=ch(n(w,j))]]vn(w,j)Th)
    [[·]]是个1/-1函数,左子结点取1,右子结点取-1。再算cross entropy即可:
    E = − log ⁡ p ( w = w O ∣ w I ) = − ∑ j = 1 L ( w ) − 1 log ⁡ σ ( [ [ ⋅ ] ] v j ′ T h ) E=-\log p\left(w=w_{O} | w_{I}\right)=-\sum_{j=1}^{L(w)-1} \log \sigma\left(\left[\left[\cdot\left]]\mathbf{v}_{j}^{\prime T} \mathbf{h}\right)\right.\right.\right. E=logp(w=wOwI)=j=1L(w)1logσ([[]]vjTh)
    这样就代替了softmax,复杂度从O(N)变成O(log N)。

    • 负采样
      采样概率:在词频上取0.75次幂,减小词频差异带来的采样影响,即
      weight ⁡ ( w ) = count ⁡ ( w ) 0.75 ∑ u count ⁡ ( u ) 0.75 \operatorname{weight}(w)=\frac{\operatorname{count}(w)^{0.75}}{\sum_{u} \operatorname{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\left(v_{w_{o}}^{\prime T} \mathbf{h}\right)-\sum_{w_{N} \in N E G} \log \sigma\left(-v_{w_{N}}^{\prime T} \mathbf{h}\right) 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_{i,j} Xi,j 表示中心词 i 与上下文词 j 的共现次数。同时还定义了衰减函数,令距离为 d 的两个词在计数时乘以 1/d。
    • 确定近似目标
      作者发现可以用概率之比来建模共现关系。定义条件概率 P:
      P i j = P ( j ∣ i ) = X i j X i P_{i j}=P(j | i)=\frac{X_{i j}}{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 r a t i o_{i, j, k}=\frac{P_{i k}}{P_{j k}} 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\left(w_{i}, w_{j}, w_{k}\right)=\frac{P_{i k}}{P_{j k}} 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\left(w_{i}, w_{j}, w_{k}\right) &=\exp \left(\left(w_{i}-w_{j}\right)^{T} w_{k}\right) \\ &=\exp \left(w_{i}^{T} w_{k}-w_{j}^{T} w_{k}\right) \\ &=\frac{\exp \left(w_{i}^{T} w_{k}\right)}{\exp \left(w_{j}^{T} w_{k}\right)}=\frac{P_{i k}}{P_{j k}} \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_{i k}=\exp \left(w_{i}^{T} w_{k}\right) 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 ) \begin{array}{c} P_{i k}=\frac{X_{i k}}{X_{i}}=\exp \left(w_{i}^{T} w_{k}\right) \\ \log P_{i k}=\log \left(X_{i k}\right)-\log X_{i}=w_{i}^{T} w_{k} \\ w_{i}^{T} w_{k}+\log X_{i}=\log \left(X_{i k}\right) \end{array} Pik=XiXik=exp(wiTwk)logPik=log(Xik)logXi=wiTwkwiTwk+logXi=log(Xik)
      l o g X i logX_{i} logXi 看作常数项,再添加一个偏置,目标函数最终形式为:
      w i T w k + b i + b k = log ⁡ ( X i k ) w_{i}^{T} w_{k}+b_{i}+b_{k}=\log \left(X_{i k}\right) 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\left(X_{i k}\right)\left(w_{i}^{T} w_{k}+b_{i}+b_{k}-\log \left(X_{i k}\right)\right)^{2} J=i,k=1Vf(Xik)(wiTwk+bi+bklog(Xik))2
      其中​ f ( X i j ) f(X_{ij}) f(Xij)是关于共现矩阵的权重函数,
      f ( x ) = { ( x / x max ⁡ ) α  if  x < x max ⁡ 1  otherwise  f(x)=\left\{\begin{array}{ll} \left(x / x_{\max }\right)^{\alpha} & \text { if } x<x_{\max } \\ 1 & \text { otherwise } \end{array}\right. f(x)={(x/xmax)α1 if x<xmax otherwise 

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

    Glove 和 Word2vec 比较

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

    4、Fasttext

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

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

    5、ELMo

    之前那些方法构造的都是独立于上下文的 word embedding,也就是无论下游任务是什么,输入的 embedding 始终是固定的,这就无法解决一词多义,以及在不同语境下有不同表现的需求。所以后续的 ELMo,GPT 以及 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}\left(\log p\left(t_{k} | t_{1}, \ldots, t_{k-1} ; \vec{\Theta}_{L S T M}, \Theta_{s}\right)+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \overleftarrow{\Theta}_{L S T M}, \Theta_{s}\right)\right) 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{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{t a s k}=\gamma^{t a s k} \sum_{j=0}^{L} s_{j}^{t a s k} \mathbf{h}_{k j}^{L M} 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 的结构保持一致,只在输入输出形式上有所变化:
    alt
    这是在 NLP 上第一次实现真正的端到端,不同的任务只需要定制不同的输入输出,无需构造内部结构。这样预训练学习到的语言学知识就能直接引入下游任务,相当于提供了先验知识。比如说人在做阅读理解时,先通读一遍全文再根据问题到文章中找回答,这些两阶段模型就类似这个过程。为了防止 fine-tune 时丢失预训练学到的语言知识,损失函数同时考虑下游任务 loss(L_2)和语言模型 loss(L_1):

    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 训练任务

    1、Masked Language Model

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

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

    alt

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

    2、 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 超参数,其余与预训练保持一致即可。
    alt
    预训练好的 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,试图学习更高层面的语言关联性。提供了很好的扩展思路。
    展开全文
  • 向量发展史-共现矩阵-SVD-NNLM-Word2Vec-Glove-ELMo

    万次阅读 多人点赞 2018-12-13 15:47:10
    词嵌入:把词映射为实数域上向量的技术也叫词嵌入(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的发挥。

    详情可见链接

    展开全文
  • 心电图及心电向量图的发展史.pdf
  • 心电图及心电向量图的发展史.doc
  • 2020年(发展战略)心电图及心电向量图的发展史-.pdf
  • 向量发展历程

    2021-12-22 15:57:41
  • 向量的历史

    千次阅读 2014-11-17 21:53:09
    附加给向量的平行四边形法则是如此直观以至于
  • 语言模型和词向量发展史及其原理
  • 你不得不了解的语义分割发展史

    千次阅读 2021-10-19 14:44:25
    好久没写综述之类的文章,本文 的发展史是基于去年和前年读的语义分割的论文,在去年的时候写的。毕业之际将自己手头有的资料分享出来。话不多说开始学习!!! 前言: 你不得不了解的人工智能基础知识 你不得不...
  • 深扒人脸识别60年技术发展史

    千次阅读 2019-11-05 09:25:52
    21世纪的前十年,随着机器学习理论的发展,学者们相继探索出了基于遗传算法、支持向量机(Support Vector Machine, SVM)、boosting、流形学习以及核方法等进行人脸识别。 2009年至2012年,稀疏表达(Sparse ...
  • GPU — NVIDIA GPU 架构发展史

    千次阅读 2022-04-04 00:01:26
    文章目录目录NVIDIA GPU 架构发展史NVIDIA Ampere GPU 架构Multi-Instance GPUNVIDIA Tesla GPU 架构 NVIDIA GPU 架构发展史 NVIDIA Ampere GPU 架构 Multi-Instance GPU Nvidia 最新的 Ampere 架构支持 Multi-...
  • 你不得不了解的目标检测发展史

    千次阅读 2020-02-07 13:03:59
    这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。...
  • 中国计算机发展史

    2021-06-28 07:10:46
    中国计算机发展史以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!1、第一代电子管计算机研制(1958-1964年)我国从1957年在中科院计算所开始研制通用...
  • CoVe 中的 NMT 基础模型 源语言(英语)的 字序列: 目标语言(德语)的 字序列: 源字句的 GloVe 向量: 随机初始化目标字句的嵌入向量: biLSTM 编码器输出隐态序列: 和 。其中前向 LSTM 计算 ,反向计算 附加的...
  • 2020-11-15关于向量的思考以及想法

    热门讨论 2020-11-15 21:24:59
    1.学习向量,让我们掌握一个抽象的能力。 再向量的学习过程中,我们不难发现,在平面内把两个有起点,方向,长度的一条线,我们称之为向量。在我们大部分人的认识里,方向是无法带入计算的,但我们学习了向量 之后...
  • 什么是人工智能? 人工智能在过去达到了什么程度? 人工智能在过去几年中有哪些值得称道的里程碑?...AI发展的第二个冬季   阅读原文请进入:[觉醒向量数据标注官网/资源中心/Blog](http://www.awkvector.com)
  • 经典CNN卷积神经网络发展史

    千次阅读 2021-11-18 11:13:48
    本文详细介绍了CNN卷积神经网络的历史发展历程,以及详细分析了各阶段具有代表性的网络,如LeNet AlexNet VGG GoogLeNet ResNet等
  • inception家族的发展史

    千次阅读 2022-04-12 17:01:46
    下图是我们给的一个例子我们输入的数据,只能对来自同一个channel的数据进行bn操作 u是一个向量,有两个值1和0.5,1是channel1的平均值,即=1,2是channel的平均值,即=0.5,u=[1,0.5],=[1,1.5],1是channel的方差...
  • 深度学习计算框架发展史

    千次阅读 2020-10-19 21:21:57
    被认为是深度学习研究和发展的行业标准。theano毕竟实验团队和企业比起来还是存在弱势,现在基本上不更新了,但历史地位毋容置疑。 keras 以TensorFlow、theano、CNTK为后端的高级框架,是初学者快速入门的首选。已...
  • 你不得不了解的卷积神经网络发展史

    万次阅读 多人点赞 2020-01-13 16:46:35
    01卷积神经网络系列模型发展综述 1.LeNet 2.AlexNet 3.VGG 4.GoogleNet 5.ResNet 6.DenseNet 7.Non-Local Networks 8.Deformable Convolutional Networks 9.Dilated Convolutional Networks 10.SENET 卷积神经网络...
  • 人工智能发展史总结

    2019-05-28 14:00:05
    人工智能发展史总结
  • 原文:张俊林–从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 引言 Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得。那为什么会有这么高...
  • 本文主要讨论CNN的发展,并且引用刘昕博士的思路,对CNN的发展作一个更加详细的介绍,将按下图的CNN发展史进行描述: 上图所示是刘昕博士总结的CNN结构演化的历史,起点是神经认知机模型,此时已经出现了卷积结构...
  • matlab矩阵向量

    千次阅读 2021-04-20 02:51:48
    MATLAB进行数值计算的基本单位是复数数组(或称阵列),这使 的MATLAB高度“向量化”。由于它不需定义数组的维数,并给出矩阵......向量化的代码在matlab中更有效率使用索引和矩阵操作避免循环 2014年6月21日 第34页 ...
  • 所以,首先应该认识量子力学发展开始。 量子力学的发展 理想黑体可以吸收所有照射到它表面的电磁辐射,并将这些辐射转化为热辐射,其光谱特征仅与该黑体的温度有关,与黑体的材质无关,黑体也是理想的发射体。...
  • 人工智能发展史论文TensorFlow:异构分布式系统上的大规模机器学习(TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems) By Google Team由Google团队提供 摘要—(Abstract —) ...

空空如也

空空如也

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

向量的发展史