
一个神经网络结构通常包含输入层、隐藏层、输出层。输入层是我们的 features (特征),输出层是我们的预测 (prediction)。神经网络的目的是拟合一个函数 f*:features -> prediction。在训练期间,通过减小 prediction 和实际 label 的差异的这种方式,来更改网络参数,使当前的网络能逼近于理想的函数 f*。
神经元(Neural Cell)
神经网络层的基本组成成员为神经元,神经元包含两部分,一部分是上一层网络输出和当前网络层参数的一个线性乘积,另外一部分是线性乘积的非线性转换。(如果缺少非线性转换,则多层线性乘积可以转化为一层的线性乘积)

图一
浅层神经网络( Neural Network )
只有一层隐藏层的,我们称为浅层网络。

图二
深度学习网络(Multilayer Perceptron)
相对于浅层网络结构,有两层、三层及以上隐藏层的我们就可以称为深度网络。

图三
在通常的理解中,一个足够宽的网络,是能够拟合任何函数的。而一个深层网络,则能够用更少的参数来拟合该函数,因为深层的神经元可以获取比浅层神经元更复杂的特征表示。
在图二及三所示网络,我们称为全连接网络,也就是隐藏层的神经元会和上一层所有的神经元输出相关。和全连接网络相对应的,是只和上一层部分神经元输出连接的网络,如下文介绍的卷积网络。
卷积网络(CNN)
卷积网络神经元只和上一层的部分神经元输出是连接的。(在直觉上,是因为人的视觉神经元触突只对局部信息敏感,而不是全局所有信息都对同一个触突产生等价作用)

同一个卷积核从左到右,从上到下和输入做乘积,得到了不同强度的输出。从直觉上来理解,卷积核对原始数据的不同数据分布的敏感度是不一样的。如果把卷积核理解为是某种 pattern,那么符合这种 pattern 的数据分布会得到比较强的输出,而不符合这种 pattern 的输出则得到弱的,甚至是不输出。

一个卷积核是一个 pattern 提取器, 多个卷积核就是多个 pattern 提取器。通过多个特征提取器对原始数据做特征提取转换,就构成了一层卷积。

Alex Net, 因为 GPU 内存的原因,Alex 使用了两块 GPU 对模型做了切割,本质上的卷积层是用于特征提取, 最大池化层用于提取强特征及减少参数,全连接层则是所有高级特征参与到最后分类决策中去。
循环神经网络(RNN)
CNN 是对空间上特征的提取, RNN 则是对时序上特征的提取。

在 RNN 中,x1 , x2, x3, xt 是在时序上不一样的输入,而 V, U, W 三个矩阵则是共享。同时 RNN 网络中保存了自己的状态 S。 S 随着输入而改变,不同的输入/不同时刻的输入或多或少影响 RNN 网络的状态 S。而 RNN 网络的状态 S 则决定最后的输出。
在直觉上,我们理解 RNN 网络是一个可模拟任何函数的一个神经网络( action ),加上同时有一份自己的历史存储( memory ),action+memory 两者让 RNN 成为了一个图灵机器。
长短期记忆网络( LSTM )
RNN 的问题是非线性操作 σ 的存在且每一步间通过连乘操作传递,会导致长序列历史信息不能很好的传递到最后,而有了 LSTM 网络。

在 lstmcell 中, 包含了通常意义上的遗忘门(点乘,决定什么要从状态中去除),输入更新门(按位相加,决定什么要添加到状态中去),输出门(点乘,决定状态的输出是什么?)虽然看起来很复杂,本质上是矩阵的运算。
为了简化运算,后面有 lstm 的变种 GRU, 如下图:

文本卷积网络 (TextCNN)
CNN 在计算机识别领域中应用广泛,其捕捉局部特征的能力非常强,为分析和利用图像数据的研究者提供了极大的帮助。TextCNN 是 2014 年 Kim 在 EMNLP 上提出将 CNN 应用于 NLP 的文本分类任务中。
从直观上理解,TextCNN 通过一维卷积来获取句子中 n-gram 的特征表示。TextCNN 对文本浅层特征的抽取能力很强,在短文本领域如搜索、对话领域专注于意图分类时效果很好,应用广泛,且速度快,一般是首选;对长文本领域,TextCNN 主要靠 filter 窗口抽取特征,在长距离建模方面能力受限,且对语序不敏感。

卷积核( filter )→ n-gram 特征
文本卷积与图像卷积的不同之处在于只在文本序列的一个方向做卷积。对句子单词每个可能的窗口做卷积操作得到特征图( feature map )。

其中,。对 feature map 做最大池化( max-pooling )操作,取中最大值 max{c} 作为 filter 提取出的 feature。通过选择每个 feature map 的最大值,可捕获其最重要的特征。
每个 filter 卷积核产生一个 feature ,一个 TextCNN 网络包括很多不同窗口大小的卷积核,如常用的 filter size ∈{3,4,5} 每个 filter 的 featuremaps=100。
增强序列推理模型(ESIM)
ESIM (Enhanced Sequential Inference Model) 为短文本匹配任务中常用且有力的模型。它对于 LSTM 的加强主要在于:将输入的两个 LSTM 层( Encoding Layer) 通过序列推理交互模型输出成新的表征。

图片来源:paper《Enhanced LSTM for Natural LanguageInference》
如图所示,ESIM 为图的左边部分。整体网络结构其实比较明确,整条通路大致包括三个步骤。
步骤一:编码层。该步骤每个 token 将预训练的编码通过 Bi-LSTM 层,从而获取了“新的编码”,其目的是通过 LSTM 学习每个 token 的上下文信息。
步骤二:局部推理层。步骤二本质是一个句间注意力( intra-sentence attention )的计算过程。通过将两句在步骤一中获取的结果做 intra-sentence attention 操作,我们在这里可以获取到一个新的向量表征。接下来对向量的前后变化进行了计算,该做法的目的是进一步抽取局部推理信息在 attention 操作的前后变化,并捕捉其中的一些推理关系,如前后关系等。
步骤三:组合推理 &预测层。再次将抽取后的结果通过 Bi-LSTM,并使用 Avarage&Maxpooling 进行池化(其具体操作就是分别进行 average 和 max pooling 并进行 concat),最后加上全连接层进行 Softmax 预测其概率。
ELMo
直观上来讲,ELMo(Embedding from Language Model) 解决了一词多义的问题,例如询问“苹果”的词向量是什么,ELMo 会考虑是什么语境下的“苹果”,我们应该去询问“苹果股价”里的“苹果”词向量是什么。ELMo 通过提供词级别、携带上下文信息的动态表示,能有效的捕捉语境信息。ELMo 的提出对后面的的 GPT 和 BRET 有一个很好的引导和启发的作用。一个好的词向量,应满足两个特点:
能够反映出语义和语法的复杂特征。
能够准确对不同上下文产生合适语义。
传统的 word2vec 对每个 word 只有一个固定的 embedding 表达,不能产生携带上下文信息的 embedding,对多义词无法结合语境判断。ELMo 中的每个单词都要先结合语境通过多层 LSTM 网络才得到最后的表达,LSTM 是为捕获上下文信息而生,因而 ELMo 能结合更多的上下文语境,在一词多意上的效果比 word2vec 要好。
ELMo 预训练时的网络结构图与传统语言模型有点类似,直观理解为将中间的非线性层换成了 LSTM,利用 LSTM 网络更好的提取每个单词在当前语境中的上下文信息,同时增加了前向和后向上下文信息。.
预训练
给定包含 N 个词的序列,前向语言模型通过前 k-1 个词预测第 k 个词。在第 k 个位置,每个 LSTM 层输出上下文依赖的向量表达 , j=1,2,…,L。顶层 LSTM 层的输出 利用交叉熵损失预测下一个位置。

后向语言模型对序列做反序,利用下文的信息去预测上文的词。与前向类似,给定经过 L 层的后向深层 LSTM 网络预测得到第 j 层的隐层输出。

双向语言模型拼接前向语言模型和后向语言模型,构建前向和后向联合最大对数似然。

其中,为序列词向量层参数,为交叉熵层参数,在训练过程中这两部分参数共享。
嵌入式语言模型组合利用多层 LSTM 层的内部信息,对中心词,一个 L 层的双向语言模型计算得到 2L+1 个表达集合。

Fine-tune
在下游任务中,ELMo 将多层的输出整合成一个向量,将所有 LSTM 层的输出加上 normalized 的 softmax 学习到的权重 s=Softmax(w),使用方法如下所示:

直观上来讲,biLMs 的较高层次的 LSTM 向量抓住的是词汇的语义信息, biLMs 的较低层次的 LSTM 向量抓住的是词汇的语法信息。这种深度模型所带来的分层效果使得将一套词向量应用于不同任务有了可能性,因为每个任务所需要的信息量是不同的。另外 LSTM 的层数不宜过多,多层 LSTM 网络不是很容易 train 好,存在过拟合问题。如下图是一个多层 LSTM 用在文本分类问题的实验结果,随着 LSTM 层数增多,模型效果先增加后下降。

Transformer
曾经有人说,想要提升 LSTM 效果只要加一个 attention 就可以。但是现在 attention is all you need。Transformer 解决了 NLP 领域深层网络的训练问题。
Attention 此前就被用于众多 NLP 的任务,用于定位关键 token 或者特征,比如在文本分类的最后加一层 Attention 来提高性能。Transformer 起源自注意力机制(Attention),完全抛弃了传统的 RNN,整个网络结构完全是由 Attention 机制组成。Transformer 可以通过堆叠 Transformer Layer 进行搭建,作者的实验是通过搭建编码器和解码器各 6 层,总共 12 层的 Encoder-Decoder,并在机器翻译中取得了 BLEU 值的新高。
整个流程的可视化如图:以 N=2 示例,实际 Transformer 的 N=6。
Encoder 阶段:输入“Thinking Machines”,对应词向量,叠加位置向量 Positional Encoding,对每个位置做 Self-Attention 得到;Add&Norm 分两步,residual connection 即,layer Normalization 得到新的,对每个位置分别做 feed forward 全连接和 Add&Norm,得到一个 Encoder Layer 的输出,重复堆叠 2 次,最后将 Encoder Layer 输出到 Decoder 的 Encoder-Decoder Layer 层。

Decoder 阶段:先是对 Decoder 的输入做 Masked Self-Attention Layer,然后将 Encoder 阶段的输出与 Decoder 第一级的输出做 Encoder-Decoder Attention,最后接 FFN 全连接,堆叠 2 个 Decoder,最后接全连接+Softmax 输出当前位置概率最大的的词。

Transformer 的结构上比较好理解,主要是里边的细节比较多,如 Mult-HeadAttention, Feed Forward, Layer Norm, Positional Encoding 等。
Transformer 的优点:
并行计算,提高训练速度。这是相比 LSTM 很大的突破,LSTM 在训练的时候 ,当前步的计算要依赖于上一步的隐状态,这是一个连续过程,每次计算都需要等之前的计算完成才能展开,限制模型并行能力。而 Transformer 不用 LSTM 结构,Attention 机制的每一步计算只是依赖上一层的输出,并不依赖上一词的信息,因而词与词之间是可以并行的,从而训练时可以并行计算, 提高训练速度。
一步到位的全局联系捕捉。顺序计算的过程中信息会丢失,尽管 LSTM 等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM 依旧无能为力。Transformer 使用了 Attention 机制,从而将序列中的任意两个位置之间的距离是缩小为 1,这对解决 NLP 中棘手的长期依赖问题是非常有效的。
总结对比 CNN、RNN 和 Self-Attention:
CNN:只能看到局部领域,适合图像,因为在图像上抽象更高层信息仅仅需要下一层特征的局部区域,文本的话强在抽取局部特征,因而更适合短文本。
RNN:理论上能看到所有历史,适合文本,但是存在梯度消失问题。
Self-Attention:相比 RNN 不存在梯度消失问题。对比 CNN 更加适合长文本,因为能够看到更远距离的信息,CNN 叠高多层之后可以看到很远的地方,但是 CNN 本来需要很多层才能完成的抽象,Self-Attention 在很底层就可以做到,这无疑是非常巨大的优势。
BERT
BERT (Bidirectional Encoder Representations from Transformers) 本质来讲是 NLP 领域最底层的语言模型,通过海量语料预训练,得到序列当前最全面的局部和全局特征表示。
BERT 网络结构如下所示,BERT 与 Transformer 的 Encoder 网络结构完全相同。假设 Embedding 向量的维度是,输入序列包含 n 个 token,则 BERT 模型一个 layer 的输入是一个的矩阵,而它的输出也同样是一个的矩阵,所以这样 N 层 BERT layer 就可以很方便的首尾串联起来。BERT 的 large model 使用了 N=24 层这样的 Transformer block。

目标函数
★ 1. Masked Language Model, MLM
MLM 是为了训练深度双向语言表示向量,BERT 用了一个非常直接的方式,遮住句子里某些单词,让编码器预测这个单词是什么。具体操作流程如下图示例:先按一个较小概率 mask 掉一些字,再对这些字利用语言模型由上下文做预测。

BERT 具体训练方法为:随机遮住 15%的单词作为训练样本。
其中 80%用 masked token 来代替。
10%用随机的一个词来替换。
10%保持这个词不变。
直观上来说,只有 15%的词被遮盖的原因是性能开销,双向编码器比单向编码器训练要慢;选 80% mask,20%具体单词的原因是在 pretrain 的时候做了 mask,在特定任务微调如分类任务的时候,并不对输入序列做 mask,会产生 gap,任务不一致;10%用随机的一个词来替换,10%保持这个词不变的原因是让编码器不知道哪些词需要预测的,哪些词是错误的,因此被迫需要学习每一个 token 的表示向量,做了一个折中。

★ 2. Next Sentence Prediction
预训练一个二分类的模型,来学习句子之间的关系。预测下一个句子的方法对学习句子之间关系很有帮助。
训练方法:正样本和负样本比例是 1:1,50%的句子是正样本,即给定句子 A 和 B,B 是 A 的实际语境下一句;负样本:在语料库中随机选择的句子作为 B。通过两个特定的 token[CLS]和[SEP]来串接两个句子,该任务在[CLS]位置输出预测。

输入表示
Input:每个输入序列的第一个 token [CLS]专门用来分类,直接利用此位置的最后输出作为分类任务的输入 embedding。

从直观上来说,在预训练时,[CLS]不参与 mask,因而该位置面向整个序列的所有 position 做 attention,[CLS]位置的输出足够表达整个句子的信息,类似于一个 global feature;而单词 token 对应的 embedding 更关注该 token 的语义语法及上下文信息表达,类似于一个 local feature。
Position Embeddings:transformer 的 PositionEncoding 是通过 sin,cos 直接构造出来的,PositionEmbeddings 是通过模型学习到的 embedding 向量,最高支持 512 维。
Segment Embeddings:在预训练的句对预测任务及问答、相似匹配等任务中,需要对前后句子做区分,将句对输入同一序列,以特殊标记 [SEP] 分割,同时对第一个句子的每个 token 添加 Sentence A Embedding, 第二个句子添加 Sentence BEmbedding,实验中让 EA =1, EB =0。
Fine-tune
针对不同任务,BERT 采用不同部分的输出做预测,分类任务利用[CLS]位置的 embedding,NER 任务利用每个 token 的输出 embedding。

BERT 的主要贡献有以下几个方面:
预训练的有效性:这方面来说 BERT 改变了游戏规则,是因为相比设计复杂巧妙的网络结构,在海量无监督数据上预训练得到的 BERT 语言表示+少量训练数据微调的简单网络模型的实验结果取得了很大的优势。
网络深度:基于 DNN 语言模型 (NNLM,CBOW 等) 获取词向量的表示已经在 NLP 领域获得很大成功,而 BERT 预训练网络基于 Transformer 的 Encoder,可以做的很深。
双向语言模型:在 BERT 之前,ELMo 和 GPT 的主要局限在于标准语言模型是单向的,GPT 使用 Transformer 的 Decoder 结构,只考虑了上文的信息。ELMo 从左往右的语言模型和从右往左的语言模型其实是独立开来训练的,共享 embedding,将两个方向的 LSTM 拼接并不能真正表示上下文,其本质仍是单向的,且多层 LSTM 难训练。
目标函数:对比语言模型任务只做预测下一个位置的单词,想要训练包含更多信息的语言模型,就需要让语言模型完成更复杂的任务,BERT 主要完成完形填空和句对预测的任务,即两个 loss:一个是 Masked Language Model,另一个是 Next Sentence Prediction。
总结
我们在做 NLU 意图分类任务中实践了以上主流模型,包括 Xgboost、TextCNN、LSTM、BERT 及 ERNIE 等,下边是在前期模型调研阶段,在选型测试数据上的对比实验,BERT 模型表现出极大的优势。

同时在我们部署上线的过程中,对 BERT 时耗做了测试,在压测实验数据上的测试结果供参考。针对我们的问答 query:
(1 ) BERT layer 的层数与时耗基本成线性关系,多头数目增加对时耗增加不明显;
(2) 针对短文本 query 的意图理解,更多依赖浅层语法语义特征,因而 BERT 层数对模型准召影响较小;
(3) attention 多头决定了可以从多少个角度理解 query,在我们的实验里降低多头数比降低层数对准召的影响略大,而时耗无明显降低。

图像领域,Alexnet 打开了深度学习的大门,Resnet 是图像领域深度学习的殿堂标志。
随着 Transformer, Bert 兴起,网络也在往 12 层,24 层发展,得到了 SOTA. Bert 证明了在 nlp 领域,深层网络的效果要优于浅层网络。
自然语言领域,Transformer 打开了深层网络的大门,BERT 也成为了自然语言处理领域的殿堂标志。
关于我们
我们是蚂蚁金服财富对话算法团队,致力于用最新的算法,做最好的模型,造就更智能的对话系统,摘取 AI 皇冠上的明珠,欢迎讨论、转发。团队最近正在大力招聘 NLP、推荐、用户画像方面的算法专家(P6-P9),欢迎联系:
参考:
Kim Y. Convolutional neural networks for sentence classification[J]. arXivpreprint arXiv:1408.5882, 2014.
Hochreiter S, Schmidhuber J. LSTM can solve hard long time lagproblems[C]//Advances in neural information processing systems. 1997: 473-479.
Vaswani A, Shazeer N, Parmar N, et al. Attention is all youneed[C]//Advances in neural information processing systems. 2017: 5998-6008.
本文转载自公众号阿里技术(ID:ali_tech)。
原文链接:
https://mp.weixin.qq.com/s/wrqxuMidw7HvgTVUvTBGng
评论