残差连接中间的层叫啥合适
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了残差连接中间的层叫啥合适相关的知识,希望对你有一定的参考价值。
参考技术A 架构图先来看架构图,如下:
这个架构图很精简,所以不太容易理解。
大体上区分可以分为三层。第一层就是输入层,第二个就是中间处理层,第三个就是输出层。
中间处理层我们可以称之为block,就是画虚线的部分,可以被循环为n次,但是需要注意的是每个block不是共享的,参数是不同的,是独立的,这点需要注意。
2.增强残差连接
其实这个论文比较有意思的点就是增强残差连接这里。架构图在这里其实很精简,容易看糊涂,要理解还是要看代码和公式。
2.1 第一个残差
首先假设我们的句子长度为,然后对于第n个block(就是第n个虚线框的部分)。
它的输入和输出分别是: 和;
首先对一第一个block,也就是,它的输入是embedding层,注意这里仅仅是embedding层;
对于第二个block,也就是,它的输入是embedding层(就是初始的embedding层)和第一个block的输出拼接在一起;
紧接着对于n大于2的情况下,也就是对于第三个,第四个等等的block,它的输入形式是这样的;
理解的重点在这里:在每个block的输入,大体可以分为两个部分,第一部分就是初始的embedding层,这个永远不变,第二个部分就是此时block之前的两层的blocks的输出和;这两个部分进行拼接。
这是第一个体现残差的部分。
2.2第二个残差
第二个残差的部分在block内部:
alignment层之前的输入就有三个部分:第一部分就是embedding,第二部分就是前两层的输出,第三部分就是encoder的输出。
这点结合着图就很好理解了。
3.Alignment Layer
attention这里其实操作比较常规,和ESIM很类似,大家可以去看之前这个文章。
公式大概如下:
这里有一个细节点需要注意,在源码中计算softmax之前,也是做了类似TRM中的缩放,也就是参数,放个代码:
#核心代码 def __init__(self, args, __): super().__init__() self.temperature = nn.Parameter(torch.tensor(1 / math.sqrt(args.hidden_size)))def _attention(self, a, b): return torch.matmul(a, b.transpose(1, 2)) * self.temperature
4.Fusion Layer
融合层,就是对attentino之前和之后的特征进行一个融合,具体如下:
三种融合方式分别是直接拼接,算了对位减法然后拼接,算了对位乘法然后拼接。最后是对三个融合结果进行拼接。
有一个很有意思的点,作者说到减法强调了两句话的不同,而乘法强调了两句话相同的地方。
5.Prediction Layer
Pooling层之后两个句子分别得到向量表达:和
三个表达方式,各取所需就可以:
6. 总结
简单总结一下,这个论文最主要就是掌握残差连接。
残差体现在模型两个地方,一个是block外,一个是block内;
对于block,需要了解的是,每一个block的输入是有两部分拼接而成,一个是最初始的embeddding,一个是之前两层的输出和。
对于block内,需要注意的是Alignment之前,有三个部分的输入一个是最初始的embeddding,一个是之前两层的输出和,还有一个是encoder的输出。
神经网络之全连接层(线性层)
对于神经网络的全连接层,前面已经使用矩阵的运算方式实现过,本篇将引入tensorflow中层的概念, 正式使用deep learning相关的API搭建一个全连接神经网络。下面是全连接神经网络的结构图
其中,x1,x2,x3为输入,a1,a2,a3为输出,运算关系如下:
x1,x2,x3所在的层叫神经网络的输入层,a1,a2,a3所在的层叫神经网络的输出层,如果两层中间还有若干层,那么中间的这些层叫做隐藏层。
那么,如何使用tensorflow去创建这样的层呢?其实非常简单,只需要调用tf.keras.layers API即可,示例如下:
# 模拟生成四张 28*28的图片数据 x = tf.random.normal([4,784]) # 搭建全连层,参数代表神经元个数 net = tf.keras.layers.Dense(512) # 将x喂入net层,得到输出层 out = net(x) print(out.shape) print(net.kernel.shape,net.bias.shape)
net = tf.keras.layers.Dense(10) # 只是声明层结构并不会完成w和b的创建 print(net.get_weights(),net.weights) # 使用build函数创建层 net.build(input_shape=(None,4)) print(net.kernel.shape,net.bias.shape) net.build(input_shape=(None,20)) print(net.kernel.shape,net.bias.shape) net.build(input_shape=(2,4)) print(net.kernel)
如果要实现多层的嵌套,又该怎么做呢?示例如下:
x = tf.random.normal([2,3]) model = keras.Sequential([ keras.layers.Dense(2,activation=‘relu‘), keras.layers.Dense(2,activation=‘relu‘), keras.layers.Dense(2) ]) model.build(input_shape=[None,3]) # summary用来显示网络具体信息,相当于print model.summary() # 通过下面的语句可以查看所有的w和b for p in model.trainable_variables: print(p.name,p.shape)
以上是关于残差连接中间的层叫啥合适的主要内容,如果未能解决你的问题,请参考以下文章