离开深度学习瞎折腾了一段时间后,我终于又回来了。
于是赶紧回顾了下18年之后NLP的发展,基本就是将迁移学习更广泛的用于NLP领域,以及把17年年底的《Attention is all you need》里的思想给发扬光大了,ELMO弥补了传统word2vec多义词表示的不足,GPT使用更强大的特征提取器Transformer取代LSTM,Bert使用双向Transformer进一步改进了GPT成为这两年发展的集大成者。
从Bert模型所带来的NLP界里程碑式的影响和所取得的成就来看,无疑Bert将会是未来两三年NLP应用发展的基石,于是有必要仔细的看看其模型的结构,数据是如何流动的,训练的和测试的。
不得不说现在的学习环境相对几年前好太多了,本文主要参考了以下几篇文章,然后加了点自己的理解:
Dissecting BERT Part 1: The Encoder
The Illustrated Transformer
Dissecting BERT Appendix: The Decoder
它的总体框架同lstm时代的MNT或者是attention is all you need中的 transformer 一样的 encoder-decoder 结构:
我们先来介绍一下Encoder部分。
为了理解这个架构,我们使用一个简单的具体的例子,来看一下 输入 的数据是怎么通过 encoder 一步一步变化让后到 输出 的。
bert的词嵌入由三个嵌入token embedding、segment embedding,和position embedding叠加而成。
这个过程跟以往的RNNs没什么区别,比如给定一个句子:
第一步是先将其标记化:
然后是数字化,将每个标记映射到语料词汇表中的唯一整数编号:
接下来就是得到序列中每个词的词嵌入,也就是将整数映射到一个 维的向量,这个向量是模型在训练时学习的,你可以将其视为一个查表的过程,这些向量的元素作为模型的参数,像其他权重一样通过反向传播进行了优化。
在论文中是使用WordPiece tokenization 来将英文单词转换成768( )维的向量,转化的过程类似这样:
把每个词的向量放到一起,就得到了一个 句子长度x向量维度 ( ) 尺寸的矩阵 Z :
说明一点,我们通常使用 填充 的方式来让输入序列具有相同的长度,比如通过添加"
如果设定 设定为9,那我们就把句子从5填充到了9。
但是,上面的embedding并没有包含词的位置信息。于是,我们的目标是能够根据词在句子中的位置适当调整这个向量,使它带上位置信息。
作者选择的方法是使用预定的(非学习的)正余弦函数将 之间的数字加到前面的embedding中,即通过正余弦函数将位置表示为彼此的线性组合,从而实现网络学习中标记位置之间的相对关系。在Token embedding 获得的矩阵 的基础上加上位置矩阵 。
数学上,用 表示序列中标记的位置,用 表示token embedding特征向量中的位置:
具体来说,对于给定的句子 ,其位置嵌入矩阵为:
作者解释说,使用这种确定性方法的结果和学习位置表示(就像我们对词嵌入那样)的结果差不多,因此这样反而会有一些优势:
因此,添加了位置信息之后的矩阵是:
它是第一个encoder块的输入,尺寸是
共有N个编码器块连接在一起直到生成编码器的输出,特定的块负责查找输入表示之间的关系并将编码在其输出中。
直观地,通过这些块的迭代过程将帮助神经网络捕获输入序列中的词之间的更加复杂的关系,你可以把它理解成一个整体用来捕捉输入序列的语义。
encoder中使用Transformer的多头注意力机制,这意味着它将计算 份不同权重矩阵的自注意力,然后将结果连接在一起。
这些并行注意力计算的结果称之为Head,我们用下标 来表示一个特定的head和相关的权重矩阵。
如上图所示,一旦计算了所有head,它们将被连接起来,得到一个尺寸为 的矩阵,然后将它乘以一个尺寸为 的权重矩阵 进行线性变换,就得到了一个尺寸为 的最终结果,用数学公式表示就是:
其中的 通过 乘以相应权重矩阵 获得,我们通过一个简单的例子来可视化的看一下这个过程。
这图描绘了输入标记通过 token embedding 和 positional encoding ,再输入到Encoder:
接下来,我们再来看下Encoder中的操作过程,先看一下单头的self-attention:
上图描绘了一个Head的 是怎么来的,其中的 的尺寸是 , 因为Q和K需要计算相似性,所以维度应当是相同的, 的尺寸是 , 的维度可以相同也可以不同,在论文中 .
所谓的自注意力,就是 与 的点积进行 的缩放之后通过softmax获得一个概率权重,然后用这些权重分别乘以各自的 即可:
为了加深理解,我们选择其中一个头,通过图形继续可视化的看一下这个变化过程:
然后计算self-attention,
多头的话就是同时有多个上述计算过程在进行:
假设我们有8个Head,那么我们就获得8个 :
但是,显然前馈层只需要一个矩阵 ,怎么处理呢?类似多卷积核的处理,把这8个矩阵连起来,乘以一个权重矩阵 压缩到一个矩阵。
为了有一个更加全面直观的认识,我们把上面整个过程放到一个图里,
显然,第二个encoder块是不需要embedding过程的,只要把第一个encoder块的输出作为输入即可。
经过上面的介绍,你应该对这个过程已经有了足够的了解,但是,为什么可以利用向量点积来计算注意力概率呢?
于是让我们进一步深入来了解其中的原理。
这个结构体系的关键在于:
也就是每个词的q向量与每个词的k向量的点积,套用点积公式:
这意味着 和 的方向越相似,长度越大,点积就越大。词与此之间关联越大,对于理解这个词时得到的关注越大,跟我们的本意是相同的。
我们再看一下最开头的结构示意图,每个encoder块在Multi-Head Attention之后经过一个 Add & Norm层才进入下一个块。于是我们来看一下这一层做了些什么。
Add 实际就是一个残差连接,将输出加上输入,这个在每一块的self-attenton以及FFN之后都会有,然后跟随一个Layer Norm 。
Norm 是一个Layer Normlization,将 正则化,就是把它缩放到一个均值为0方差为1的域里。因为
不过一般在这一层之前,就会有一个dropout层。
每个encoder块都由 mulit-head atteion add & Norm feed forword network add & Norm 这样一个过程,下面来介绍一下这个Feed-Forward Network。
这是一个全连接层,包含两个线性变化和一个非线性函数(实际一般就是ReLu),
对于输入的 (尺寸为 ) ,通过权重矩阵 (尺寸为 )和偏置 线性变换到隐藏层 (尺寸为 ) ,然后**ReLu **激活 ,记下来再用权重矩阵 (尺寸为 ) 和偏置 的线性变换到输出层(尺寸为 ) ,表示成数学公式就是:
在最后一个encoder块输出之后连接到decoder。
Decoder和Encoder的结构是类似的,但是因为可视信息的不同,又有所差别。
Transformer解决的是翻译的问题,将一个句子翻译成另一种语言,我们希望模型能够捕捉到输入句子中词之间的关系,并且将输入句子中包含的信息与每一步已翻译的内容结合起来。继续上面的例子,我们的目标是把一个句子从英文翻译为西班牙文,这是我们获得的序列标记:
我们同之前一样来看看输入到输出数据是如何流动的。
这是我们的解码器的输入标记:
然后这是解码器的期望输出:
但是,这里存在一个问题,比如输入这边我们已经看到了'como' 的后面是'estas', 然后再用它来预测'estas' ,这显然是不合理的,因为模型在测试的时候是看不到后面的词的。
因此,我们需要修改注意力层,防止模型可以看到预测词右边的信息,与此同时,它能利用已经预测的词,即左边的信息。
继续上面的例子,我们将输入标记转换成矩阵的形式,并添加位置信息:
和encoder一样,decoder块的输出也将是大小为 的矩阵,在逐行线性变换+softmax激活后,将生成一个举证,其中每行的最大元素表示下一个单词。也就是说,分配"
但是,在我们使用多头注意力机制的时候,所有的行都会产生交互,因此需要在输入的时候添加遮罩,这个遮罩会在注意力计算之后进行:
这是 self-attention 的计算结果:
然后我们在此基础上添加遮掩,就是把矩阵上三角的位置全部设置为 :
于是,在进行softmax激活之后,矩阵就变成了:
恰好达到了我们的要求,那些需要在训练时忽略的右侧的词的注意力全部变成了0。
当将这个注意力矩阵与 相乘时,预测的词就是模型可以访问元素右边的元素。注意,这里的多头注意力输出将是 维的,因为它的序列长度是 。
这个就是 Decoder 从 target序列 的输入,并经过 Masked Multi-Head Attention 的一个变化得到了 ,decoder的还有一部分输入来自于源语句经过 Encoder 的最终输出 (尺寸是 )。
接下来,就是与encoder一样的 Multi-Head Attention Add and Layer Norm -> FFN 的过程。
只不过,现在的 来自于 ,而 来自于 :
计算每个query相对于key的注意力之后,得到的是一个 的矩阵, 继续咱们的例子,比如注意力矩阵为:
如上图所见,这个注意力是当前Decoder输入与Encoder输出的每个词之间的注意力,咱们用这个矩阵再乘以 ,就得到了一个 的矩阵,每一行代表了源语句相对于当前输入词汇的特征:
h个Head连接起来,尺寸变为 ,它通过 的权重矩阵 线性变换到一个 的输出。
这在多个Decoder之后,最后输出的矩阵通过乘以权重矩阵 ( ) 进行线性变换,变换之后再对每一行的向量softmax, 其中选择值最大位置对应词表索引的词就是预测的词。
损失的话只需要用预测的每个词向量与真实的词的one-hot词表示计算交叉熵即可。
写这篇文章的起因是看ALBERT的时候,对其中参数因式分解,减少参数的方式不理解,后来通过原码来了解原理。后来想到虽然平时基于bert的nlp任务做的挺多的,但对原理还是一知半解的,所以在此记录。后续有时间的话,将常见的,看过的论文做个总结,不然容易忘记。(attention is all your need,bert,albert,roberta,sentence -bert,simcse,consert,simbert,nezha,ernie,spanbert,gpt,xlnet,tinybert,distillbert)从图一可以明显看出,bert主要分为三块。embedding层,encoder层,以及pooler层,本章为embedding层的原码分析。可以看出,输入的input,会先经过tokernizer,会补上cls,sep等特殊字符。然后embedding层会获取句子的token embeddings+segment embeddings+position embeddings作为最终的句子embedding。 1 token embedding:token embedding有两种初始化方式。如果是训练预训练,随机出初始化一个30522*768的lookup table(根据wordpiece算法,英文一共有30522个sub-word就可以代表所有词汇,每个sub-word 768纬)。如果是在预训练模型的基础上finetune,读取预训练模型训练好的lookup table。假设输入的句子经过tokernized长度为16。经过lookup table就是16*768维的句子表示。 2 position embedding:position embedding的lookup table 大小512*768,说明bert最长处理长度为512的句子。长于512有几种截断获取的方式。position embedding的生成方式有两种:1 根据公式直接生成 2 根据反向传播计算梯度更新。其中,transformer使用公式直接生成,公式为: 其中,pos指的是这个word在这个句子中的位置;2i指的是embedding词向量的偶数维度,2i+1指的是embedding词向量的奇数维度。为什么这个公式能代表单词在句子中的位置信息呢?因为位置编码基于不同位置添加了正弦波,对于每个维度,波的频率和偏移都有不同。也就是说对于序列中不同位置的单词,对应不同的正余弦波,可以认为他们有相对关系。优点在于减少计算量了,只需要一次初始化不需要后续更新。 其中, bert使用的是根据反向传播计算梯度更新。 3 segment embedding:bert输入可以为两句话。[cls]....[seq]....[seq]。每句话结尾以seq分割。从embedding的大小可以看出,lookup table由两个768组成,对应第一句和第二句。该参数也由训练得到。 4 LN以及dropout:embeddings = dropout(layernorm(token embeddings+segment embeddings+position embeddings))。Normalization 有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为 0 方差为1的数据。我们在把数据送入激活函数之前进行normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区,发生梯度消失的问题,使得我们的模型训练变得困难。这里不使用bn可以去除batch size对模型的影响。 下一篇为bert核心encoder模块的解析。
论文发表一般需要的时间如下:1、普刊即省级国家级一般安排周期是1到3个月;2、本科学报的安排周期一般为2到4个月;3、北大核心以上级别期刊的安排周期一般为6到8个月,审稿周期为一个月;4、科技核心期刊从投稿到录用发表,一般是3到6个月。
论文从初稿到发看需要三四个月左右。
一般的省级、国家级论文审稿需要1~2天,出刊需要1~3个月。个别快的0.5个月,还有个别慢的需要4~7个月。
质量水平高一些的期刊,还有一些大学学报,投稿的出刊需要6个月左右,快一些的3~4个月。
科技核心期刊审稿需要1~3个月,出刊另需要6~10个月左右,总的算起来大约是1年~1年半。
北核、南核审稿需要3~4个月,出刊另需6~15个月左右,跨度较大总的算起来1年~2年。
综上所述,评职称发表论文一定要对各不同级别论文的发表周期做到心里有数,提前准备,以免时间上赶不及白白错过评审多等一年。尤其是核心论文,一定要提前。
据学术堂了解,论文发表不是随时想法就可以发的,需要杂志社安排版面,如果下个月版面没,那么只能再往后安全了。省级、国家级期刊的职称论文发表需要提前1-3个月准备我们都知道,省级国家级别的刊物算是普刊,它也是职称发表的起跑线,相对来说,从期刊的选择到发表成功收到刊物的时间不需要很久,有些刊物快的话基本1个月左右就收到刊物了,慢点的话也就3个月左右,但是前提是你的论文已经通过审稿并确定版面了。这里还牵扯到论文的投稿数量问题,如果一个刊物虽然说是普刊,但是在业内的影响非常大,那么向其投稿的作者肯定不会少,这就需要作者有足够的耐心等待通知了。核心期刊的职称论文发表需要提前5-10个月准备除了刚讲过的普刊准备时间因素外,如果你自己投稿核心期刊,那么时间方面更是不能用月份单位来形容了,即使是通过代理来投稿,也只是让你的论文更早的呈现在编辑面前,从审稿修改到录取至出刊也需要5个月左右。具体的我来给大家讲解一下,一个核心期刊的每期刊载量是有限的,这就犹如是一个独木桥,都想过去,但是木头只有一根。此时你就需要珍惜编辑看到你论文的机会,用大量的时间来提高自己论文的创新度和针对性,杂志社编辑那里论文如海,如果编辑连你的第一段都没看完就关闭了,可想而知,机会就是这么浪费的,即使编辑能读完你的论文,也不代表就通过,可能论文还需要修改和润色,这种情况也可能会重复的修改来达到要求,这样一去一来的,时间就这么过去了。
省级期刊:普通论文大概需要三到六个月的时间,要提前做好准备。国家级期刊:需要六个月左右,核心期刊难度会更高,六个月以上,甚至更长时间。不同类型的论文,发表时间也不一样,比如,医学类论文,难度会更高,时间也更长。如果自己选择期刊投稿的话,审核时间不稳定或无限延长,加上中间修改时间,成功发表的周期更长。
国际会议,研讨会会议等等《数学建模及其应用》是中国工业与应用数学学会的会刊自创刊以来,杂志坚持刊登以建模为主要内容的应用数学研究成果,用数学建模及方法解决科学、工程技术和经济等应用问题以及建模教学研究的成果,为从事数学建模研究和教学的广大高校师生以及工业界相关专家提供了一个学习、借鉴及交流的平台。注重于数学建模方法和理论方面的学术性研讨,针对目前数学建模竞赛中的热点问题进行专题报告,探讨数学建模的发展趋势,让更多老师参与到数学建模的理论和方法研究,提高各高等学校数学建模研究和教学水平,创新学生数学建模活动,推动数学建模的快速发展。
论文题目:Lexicon Enhanced Chinese Sequence Labeling Using BERT Adapter 论文地址: 这是一篇自表于2021 ACL(NLP顶会)的论文。论文提出将字典融入BERT网络层记作字典加强BERT(Lexicon Enhanced BERT,LEBERT) ,用于提升中文标注效果。新模型在命名实体识别、分词、成份标注实验中均达到了目前最佳水平。 由于存在分词(CWS)问题,中文面临更大的挑战,对多数任务,以字为单位比以词为单位效果更好。 目前大多优化方法都是修改上层(网络末端),而未修改核心网络。文中提出的方法利用字典得到更多可能的分词,动态计算最佳分词方法,并修改了网络的Transformers层,如图-1中的右图所示: 模型的核心结构如图-2所示,相对于BERT,LEBERT有两个明显差别: (1)输入变成了字符特征+字典特征 (2)字典适配层在Transformer层之间 文中方法将基础的字符序列扩展成字符+词对序列,设句S由字符c组成:Sc={c1,c2,c3,...,cn},在字典D中找到在句中包含字符c所有可能的词ws,如图-3所示: 最终生成序列: s_cw={(c1,ws1),(c2,ws2),...(cn,wsn)} 将字符和词信息融入BERT网络的字典适配层,方法如图-4所示: 字典适配层有两个输入:字符和词对,即上图中的h和x,其中h是前一个transformer层输出的字符向量,x是m个可能包含该字符的词组成的词嵌入,其中j是m中的第j个词: 其中e是预训练得到的词向量映射表。 为了对齐长短不一的序列,对词向量进行非线性变换如下: 其中W1是大小为dc-dw的矩阵,W2是大小dc-dc的矩阵,b1和b2是偏移,dw是词向量的维度,c是隐藏层的维度。 由图-3可知,一个字可能对应多个词,对于不同的任务,最匹配的词可能并不相同。 具体算法是使用vi表示第i个字符对应的所有词表,m是该字符可能对应的词个数,计算注意力attention如下: 其中W是注意力权重矩阵。 然后对每个词乘其权重加和,得到位置i对应的词表示: 最终,将词典信息与字符的向量相加,得到了该位置的新向量: 处理后的数据再送入dropout层和归一化层继续处理。 将字符输入词嵌入层,加入token, segment和position信息,然后将该层输出的词嵌入输入Transformer层:输出的 是第l个隐藏层的输出,LN是归一化层,HMAttn是多头注意力机制,FFN是两个前馈网络层,使用ReLU作为激活函数。 在k-th和(k+1)-th Transformer之间加入字典信息考虑到标签的前后关系,使用CRF层来预测最终的标签,将最后一个隐藏层h的输出作为输入,计算输出层O: 然后将输出层代入CRF模型,计算标签y的概率p。 训练时给出句子S和标签Y,计算全句的负对数似然作为误差。 解码时,使用维特比算法计算得分最高的序列。 论文针对命名实体识别NER,分词CWS、位置POS标注进行了实验,实验数据如表-1所示(中文NLP常用实验数据)。 图-5展示了相对于BERT和基于BERT的最新模型,文中模型误差的减少情况。 除了与其它模型比较之外,论文还比较了LEBERT方法与在组装模型的Bert+Word方法的差异。
这个是需要看录用你论文的刊物的现在的刊期,比如你1月份投稿被录用了,如果告诉你录用的是10月份的刊期,那么你就要等9个月,等着10月份见刊。 如果你被录用的刊期是8月份的,就是8月份见刊,你要等7个月。但是没有说,你1月份录用了,2月份就出刊了,极少有这种情况。我之前在淘淘论文网安排的加急发表的,从录用到拿到刊物也是有2个月的时间,这算是比较快的了。
不一定,有的会前发,有的会后发,以前的会议有的会前都是ei检索了的呵呵最近都是会后发,参会的人太少了,或者会务组都不组织参会了如果有问题可以联系我
论文发表一般需要的时间如下:1、普刊即省级国家级一般安排周期是1到3个月;2、本科学报的安排周期一般为2到4个月;3、北大核心以上级别期刊的安排周期一般为6到8个月,审稿周期为一个月;4、科技核心期刊从投稿到录用发表,一般是3到6个月。
论文发表时间是指文章见刊时间。
首先如果论文发表纯属作者个人爱好,那么发表时间就是文章见刊时间。但是如果论文发表是用来评职称晋升的,就需要特别注意一下了,职称论文的发表是以论文被检索为标准的,并不单单是见刊,要见刊并且被检索才行,因此要区分不同的论文来看。
评职称论文发表注意事项:
1、要明确发表那种级别的期刊才可以顺利评过职称,省级以上的、或者要国家级的、核心期刊等。最好是询问你们单位管理职称的部门,评定相应级别的职称是需要发那种级别的期刊。
2、明确职称评定时间。这一点非常重要,写作论文,发表论文前,一定要了解明确职称评定时间,早做准备,因为一般论文发表的时间为3个月左右,长的则半年甚至一年,而职称评定时,有的要求必须通过数据库检索到,论文发表出刊后,几个数据库一般2个月后才能收录进去,因此,还有考虑2个月的收录时间。
肯定算的是9月份发表的。严格意见上来讲,就没有发表时间这一说,都是出版时间,按《出版物管理条例》及其实施细则等,连续出版物是不允许提前出刊的,像这种9月的刊期,8月出版的,都是违法操作的,就是为了评职称提前拿到刊物而操作的。按相关规定,连续出版物一般为当月或次月出版,一般来说,月刊为每月15日出版,旬刊为每月5、15、25日出版,半月刊为每月10日、20日出版。8年专业发表经验,希望我可以帮到您
不一定,有的会前发,有的会后发,以前的会议有的会前都是ei检索了的呵呵最近都是会后发,参会的人太少了,或者会务组都不组织参会了如果有问题可以联系我
你好,根据一般习惯,是以杂志实际出版的日期为准,因为自它印刷并公开发行的时候就已经达到了出版的事实标准。杂志上标注的刊期只是杂志社为了杂志的时效性所以都会把时间往后写,这样当你8月收到9月杂志的时候不会觉得晚。特别是对一些在市场上公开销售的刊物来说,这样能避免读者买杂志总觉得像是买到过期的一样,保持读者的新鲜感。一般杂志从收稿到编辑、校对、印刷、发行都会有不同的时长,刊期越长(月刊、双月刊、季刊)出版周期就越长,特别好的学术期刊,长的甚至半年一年,所以你发表时一定要注意问清杂志的出版时间能不能赶上你的时间需要,以免做了无用功。要发表可以再问我,我就是杂志编辑
不是的,首先可以肯定的是:论文出版论文日期肯定是在开会日期之后,一般会议是开会后2个月内出版论文,少部分会议会拖到开会后4个月甚至更长时间。总之整个流程是这样的:论文写作——投稿——录用——注册会议——开会——论文出版——EI检索。如果还是搞不清楚,建议你百度搜:EI学术会议中心,全是关于EI会议的信息和学习指导资料。