常用的神经网络结构。 全连接(FC) 全连接层(FC层)MLP(Multilayer Perceptron)多层感知机的基本结构,本质上为权重矩阵与输入矩阵简单相乘并叠加非线性激活函数的运算形式。当前的神经网络机构的运算范式的基础。下面就是它的公式:其中W T 代表该层的参数,X 表示输入,这个输入必须是2维的(加上B a t c h 的话是3维)。全连接层一般会组成一个前馈网络用作最后一层。
y = σ ( W T X + B ) 卷积 卷积可以可以看做是FC层在二维上的扩展。卷积层的输入是一个三维的数据C × H × W (不包括B a t c h )。相当于将全连接层权重进行了二维排布,组成一个卷积核。
且卷积神经网络拥有的权值共享的特性。也就是说对于单个通道是共用的(大白话就是使用一个卷积核卷积一整个图像)。
卷积的输出大小计算公式是:N 表示输出的宽度,W 表示图像的宽度,F 表示卷积核的宽度,P 表示填充的大小(一般为1),S 表示卷积的步长
N = ⌊ x ( W − F + 2 P ) / S ⌋ + 1 RNN 普通RNN RNN 相比与FCN的区别在于,RNN会保存当前一次的输出状态,并将该输出状态作为下一次的输入和新的数据输入一起参与新一轮的计算。它的公式为: H t 表示的是当前时刻的输出,[ ] 表示的是拼接运算。初始时刻的H t − 1 可以为0。RNN的本质上与FCN是一样的,只不过多了将上一个时刻的输出作为一部分输入输入到了神经网络。
H t = σ ( W T [ X t − 1 , H t − 1 ] + B ) LSTM 普通RNN存在的缺点是当输入的时间序列信息特别长的时候由于不相关的信息太多会造成网络非常难以训练。LSTM ( Long Short-Term Memory)的提出就是为了解决这样的问题,LSTM通过引入更多的计算部件控制当前时刻的输入以及上一个时刻输入对于输出结果的影响。它的计算则相对更加复杂一点。计算分为三个门:
其中W f , W i , W o , W c 均为可学习的参数矩阵,B f , B i , B o , B c 为可学习的偏置参数。
遗忘门:
F t = σ ( W f T [ H t − 1 , X t ] + B f ) 输入门:
I t = σ ( W i T [ H t − 1 , X t ] + B i ) 输出门:
O t = σ ( W o T [ H t − 1 , X t ] + B o ) 除了H t 需要记录,LSTM还需要维护多一个细胞状态 作为下一次计算的输入:⊙ 表示Element-Wise 的相乘。
C ~ t = tanh ( W c T [ H t − 1 , X t ] + B c ) C t = F t ⊙ C ~ t − 1 + I t ⊙ C ~ t tanh 的函数图像为如下图,输出的范围为( − 1 , 1 )
最终的输出 为:
H t = O t ⊙ tanh ( C t ) GRU GRU(Gated Recurrent Unit)可以视为简化版的LSTM。GRU只使用了两个门控单元:
更新门 :
Z t = σ ( W z T [ H t − 1 , X t ] + B z ) 重置门 :
R t = σ ( W r T [ H t − 1 , X t ] + B r ) 最终输出 :
H ~ t = tanh ( W h T ( R t ⊙ [ H t − 1 , X t ] ) + B h ) H t = ( 1 − Z t ) ⊙ H t − 1 + Z t ⊙ H ~ t Attention Scaled Dot-Product Attention 注意力机制(Attention)相对于本质普通的神经网络还是有比较大的区别。它的计算过程设计得非常精细,对于长序列数据的处理能力相比RNN更加强大(主观判断)。 它的输入为一排 向量,输出也是一排向量,输出的向量是综合了序列中所有信息之后得到的表达。
首先需要先根据输入计算三个矩阵Q K V , 分别对应Query、Key和Value,它们都是输入X ∈ R d × L ,X 是一个由L 个维度为d 的向量组成的输入矩阵。计算三个矩阵的过程为:
Q = W Q X K = W K X V = W V X 其中, W Q , W K , W V ∈ R d × d 均为可学习的参数矩阵。
K 和V 会组合在一起运算得到注意力分数Attention Score 矩阵A ∈ R L × L ,它表示了其中第( i , j ) 个元素表示位置i 与位置j 之间的相关性得分,计算公式为:
A i j = s o f t m a x ( Q i T K j d ) 其中 1 d 是为了环节是为了缓解点积得分可能较大的问题,同时可以使梯度更加稳定。A 矩阵的每一列对应的就是输出的 A t t e n t i o n S c o r e ,因为过了s o f t m a x 所以有
∑ A j = ∑ i A i j = 1 使用矩阵A 对Value矩阵V 进行加权求和j就得到了输出矩阵 O ~ ∈ R d × L 。这个输出再经过一个线性变换就得到了最终的输出O 。
O ~ = V A O = W O O ~ Multi-head self-attention GOOGLE关于Transformer的原始论文中使用的是多头注意力机制。多头注意力机制是单头注意力机制的改良版本,可以允许模型同时关注在不同位置的表达子空间上的不同信息。
它的公式是,h 表示头的个数:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , h e a d 2 , . . . , h e a d h ) 每个头的Q K V 计算和普通自注意力计算是一样,只是在还需要再经过没个头专属的线性映射矩阵后再进行每个头的注意力机制的计算:
h e a d i = A t t e n t i o n ( W Q i Q , W K i K , W V i V ) 最终的输出为
O = W O × M u l t i H e a d ( Q , K , V ) = W O × C o n c a t ( h e a d 1 , h e a d 2 , . . . , h e a d h ) 因为 C o n c a t 得到的矩阵大小为h d × L ,W O 的大小为d × h d 。所以最终输出的O 仍然是d × L 。