残差连接中间的层叫啥合适

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)

技术图片

 

 

以上是关于残差连接中间的层叫啥合适的主要内容,如果未能解决你的问题,请参考以下文章

水很深的深度学习-Task03前馈神经网络

Deep Learning之感知器

神经网络之全连接层(线性层)

VMware虚拟机里装的Ubuntu如何满屏?全屏之后只有中间一块,求满屏的详细步骤,我装的是英文的。

深度残差网络

UIKit 中的大弹出视图叫啥?