transformer模型结构
1、基础神经网络
1、CNN:卷积神经网络
包括Cov卷积层、pool池化层,方便并行计算;详细介绍略过。 Cov卷积层:可以定义num_filter个卷积核进行卷积操作,然后将各结果concat; pool池化层:也可以称为下采样,一般包括两种方式:最大值下采样max_pooling、平均值下采样mean_pooling。
2、RNN:循环神经网络
(1)正向单个计算过程网络结构:
x1 , x2 ,…为一个序列化 的输入序列,比如一段文本; 每层参数共享,图中U为输入层和隐藏层之间的权重,V为隐藏层之间的权重,W为隐藏层与输出层之间的权重; RNN可以有一个输出,也可以有多个输出(例如“序列标注”问题),下图是多个输出的过程,若仅一个输出,则只有一个yt ; L为最终的loss; 缺点是,无法并行执行。 (2)与上图对应的公式 隐藏层的计算:ht = fw (ht-1 , xt ) = tanh(V × ht-1 + U × xt ) 输出层的计算:yt = softmax(W × ht )
3、LSTM:长短期记忆神经网络
传统RNN的变种(以下述RNN为例,在h0 后添加忘记门,x1 上添加输入门,h1 之前添加输出门),可解决序列化数据的长期依赖问题; LSTM的模型结构图,其中亮蓝色为忘记门,红色为输入门,黑色为更新当前细胞状态 Ct 操作,绿色为输出门。
LSTM的输入有三个:Ct-1 、ht-1 和xt ,输出有两个:Ct 、ht ; ft 、 it 、ot 的计算方式基本相同,只不过使用的参数不共享,计算过程中 [ht-1 , xt ]的结合过程是直接横向concat,比如ht-1 是128维的向量,xt 为28维的向量,concat后为156维向量。 对于忘记门 : 控制当前细胞需要忘记的上一个细胞状态信息比例。该比例通过ht-1 、xt 作为输入来计算得到, σ一般为sigmoid函数,具体计算公式: ft = σ(Wf · [ht-1 , xt ] + bf ) 对于输入门 : 控制当前细胞需要存什么信息,以及保存这些信息的比例。 tanh操作ht-1 、xt 两个输入来计算需要存的当前细胞状态信息候选值Ct ~ ,σ操作ht-1 、xt 来决定保存的信息比例,具体公式如下: it = σ(Wi · [ht-1 , xt ] + bi ) Ct ~ = tanh(Wc · [ht-1 , xt ] + bc ) 更新当前细胞状态 : 更新当前细胞状态,即计算当前细胞状态需要保留上一细胞状态多少信息,加上当前细胞状态信息候选值的保留比例,具体公式如下:*为矩阵对应元素相乘,非矩阵乘法(点乘) Ct = ft * Ct-1 + it * Ct ~ 对于输出门 : 决定当前细胞输出的内容,以及输出内容的比例。输出内容由tanh操作Ct 来计算得到,输出比例由σ操作ht-1 、xt 计算得到,具体公式如下: ot = σ(Wo · [ht-1 , xt ] + bo ) ht = ot * tanh(Ct )
2、transformer
内容参考自论文《Attention is all you need》
1、attention机制
(1)attention计算过程 在实际计算过程中Q、K、V是作为矩阵同时计算的,所以,整体计算公式表达如原论文中所示:
其中Q∈Rn×dk , K∈Rm×dk , V∈Rm×dv 分别是输入的序列X = (x1 , …, xi , …, xn ),xi ∈Rdx 经过WQ 、 WK 、WV 得到的矩阵;
原文中提到:QKT 点乘后除以√dk 的目的是,当dk 很大时,防止点乘之后结果过大,再经过softmax函数时出现梯度消失问题。
若将上式展开,逐个向量计算,则针对文本序列,以第一个词(字)为例,该词在整个序列中的attention计算过程如下如:
计算公式理解如下: 公式计算过程图形化后如下所示:
处理的文本序列为“我知道”; 其中,dx =5,dv =dk =4,
(2)multi-head attention
流程: ① 定义h个头; ② 将Q、K、V分别使用各个头的参数矩阵(Wi Q 、Wi K 、Wi V )线性映射一下,i∈[1, h],映射h组; ③ 得到h组Q、K、V,分别进行attention操作,得到h个头的注意力计算结果head; ④ 最终将h个head进行concat,然后经过与参数矩阵WO 的计算,得到多头注意力的最终结果。 公式表达如下: ? Multi-Head(Q,K,V) = concat(head1 , head1 ,…, headh )WO ?其中,headi = Attention(QWi Q , KWi K , VWi V )
(3)self-attention
self-attention在序列内部进行attention计算,关注序列内部之间的联系。 具体计算方式是Q=K=V=X,也就是计算Attention(X, X, X)
2、传统transformer结构详细解析
位置编码:在最初的结构中(如下图),位置编码是在输出上使用表示绝对位置信息的“正余弦位置编码”,后续版本优化了attention结构,在其中加入“相对位置编码”(关于位置编码详见词向量训练实战——Word2vector、Glove、Doc2vector、position_embedding ); 位置编码 pos_embd 的维度与输入的编码 inpt_embd 维度相同(与attention部分讲解对应,即为dx ),inpt_embd + pos_embd作为encoder、decoder的输入; 有6个encoder、6个decoder; encoder结构:多头注意力计算 、残差连接、归一化层、全连接前馈网络 、残差连接、归一化层。
Add & Norm: (1)即残差连接 和 归一化,下面提到的Sublayer在encoder中为多头注意力计算和全连接前馈网络; (2)也就是下图中①、②、③、④、⑤所标注的模块; (3)计算方式:LayerNorm(x + Sublayer(x)) ; (4)其实就是,下层的输入 x 与下层的输出 Sublayer(x) 进行向量加法Add操作,然后归一化LayerNorm。(在原作中,为了方便这种残差连接 操作,所有sub-layers的输出,包括embedding的结果,向量维度都为dmodel =512); (5)LayerNorm的操作:a_2 * (X - mean) / (std + eps) + b_2 ,其中a_2、b_2为参数矩阵,X为输入矩阵,mean为X的期望,std为X的标准差,eps=1e-6。 多头注意力计算: 计算过程中,为了使得该层的最终输出维度是dmodel ,每个头的dv =dk =dmodel /h . 全连接前馈网络 : (1)公式:FFN(x) = max(0, xW1 + b1 )W2 + b2 (2)Another way of describing this is as two convolutions with kernel size 1。 decoder结构:加入mask机制的多头注意力计算 、残差连接、归一化层、针对encoder结果的多头注意力计算 、残差连接、归一化层、全连接前馈网络 、残差连接、归一化层。
decoder中对outputs的mask目的:位置 i 处的预测仅依赖于已知的 i 位置之前的输出,mask的目的是防止位置关注后续位置。
CRF:条件随机场模型
1、定义
(1)条件随机场(CRF) 设X、Y为随机变量,P(Y|X)是在给定X的条件下Y的条件概率分布。若随机变量Y构成一个由*无向图G=(V,E)*表示的马尔科夫随机场 ,即 P(Yv |X,Yw ,w≠v) = P(Yv |X,Yw ,w~v) 对任意定点v成立,则称条件概率分布P(Y|X)为条件随机场 。 其中: w~v表示在图G=(V,E)中与顶点v有边连接的所有定点w; w≠v表示除定点v以外的所有顶点; Yv 与Yw 为顶点v与w对应的随机变量。
马尔科夫随机场:具有马尔科夫性的随机场;
随机场:设T是一无限实数集,把依赖于参数t∈T的一簇(无限多个)随机变量称为随机过程;若T为n维空间的某个子集,t则为一个n维向量,此时随机变量又称为随机场; 马尔科夫性:P(Yv |X,Yw ,w≠v) = P(Yv |X,Yw ,w~v) 例如:对于顶点Y1 ,P(Y1 |X,Yw ) = P(Y1 ∣X,Y2 ,Y3 )
(2)线性CRF 设X =(X1 ,X2 ,…,Xn ),Y = (Y1 ,Y2 ,…,Yn )均为线性表示的随机变量序列,若在给定随机变量序列X 的条件下,随机变量序列Y 的条件概率分布P(YIX)构成条件随机场,即满足马尔可夫性 P(Yi lX,Y1 ,…,Yi-1 ,Yi+1 ,…,Yn ) = P(Y|X,Yi-1 ,Yi+1 ) 则称P(YIX)为线性链条件随机场 。 其中i = 1,2,…,n,在i = 1和n 时只考虑单边。
一般(比如NER任务中)随机变量序列X又称为观察序列,Y为状态序列; X、Y之间可以表示为下图,也就是说,在给定X的情况下,当前状态Yi 仅跟与其相连接的状态Yi?1 相关。
2、基于CRF的实践代码(NER)
详见:知识图谱中“三元组”抽取——Python中模型总结实战(基于TensorFlow2.5)5.1小节基于BiLSTM+CRF实现NER