赞
踩
首先简要介绍下bert中涉及到的有关技术点 ,Self-Attention、Multi-Headed、Positional Embedding、Layer normalization。
Self-Attention,主要是构建三个矩阵Query,Key,Value来确定当前位置的字或词(以下均以字代替)对句子所起的权重,换一句话说就是根据当前位置和句子进行点积相似度的计算(),然后为了减小维度除以进行Softmax得到当前字对句子的权重,最后再乘以矩阵V便得到了和句子紧密相关的当前位置的字向量表征。
不管在自然语言中还是图片中,神经网络进行特征提取,我们无法保证每一次都能提取到我们想要的特征。或者说就自然语言的分类任务而言,我们自己在评判一句话属于哪一类时,是分多次提取的。举一个例子,一句话中,可能第一次提取到运动相关的人名“姚明”,然后再看一次又看到了“篮球”,又看一次“火箭队”......多次之后,我们有很多把握将其归为运动一类。所以Bert当中通过初始化多组(Q,K,V)矩阵来进行特征提取,也就是我们说的Multi-Headed了。
在自然语言中,时序特征是很重要的。而Self-Attention并没有引入时序信息,所以Bert使用Positional Embedding来进行时序特征的引入。在论文中阐述了两种构造位置向量的方法,一种是通过正余弦公式直接构造位置向量,在偶数位置,使用了正弦编码,而奇数位置则使用了余弦编码;另一种方法则是对句子进行id编码,例如将句子根据句子长度seq_len,进行1~seq_len编号,构造权重矩阵W,然后进行one_hot查表W就能得到每个位置的位置向量了。
Layer normalization(LN),normalization的目的是为了防止每一层学到的数据不一致,从而导致数据偏差越来越大。层归一化和批量归一化(Batch normalization, BN)有所不同,BN是在一个batch基础上进行归一化,而LN是在一个样本基础上进行归一化。而对于这两个归一化方法,均有归一化、变换重构两步。归一化是使得每一层输入的数据保持在一个稳定的分布中,而归一化破坏了上一层对数据提取的特征,所以进行变换重构以保证数据提取的特征没有被破坏掉。有兴趣的可以详细了解一下。
Bert中主要涉及到的内容就是这些了。顺便说一下Bert中采取了残差连接的技巧,这是为了解决深度学习的退化问题。简而言之,深度学习的深层网络按道理效果一定要比浅层网络大于或者等于,因为浅层网络如果提取特征足够,后面的层保持不学习的状态便是和浅层的效果一致。浅层提取的不足,深层一定会在浅层的基础上进一步提取。然而实际上,我们让深层网络中的后面几层保持不学习是很难的。而我们知道神经网络如果不引入非线性因素(激活函数),再多层也只是复合函数的线性变换,其效果与单层神经网络无异。所以所谓的残差连接就是对于某一层的输入是由上一层的输入+上一层的输出叠加得到的。
最后我使用了tensorflow进行Bert预训练+cnn做了文本分类,欢迎大家自行取用。https://github.com/Xu22/tensorflow-nlp/tree/master/text-classification。这里所使用的数据集是复旦文本分类数据集。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。