Transformer encoder层的使用

今天,由于实验需要,所以要尝试encoder层的使用,但是呢,发现两个问题:

1.许多人的实现都是不一致的,有的人qkv是直接用x赋值,有的人是全连接层,有的人是矩阵乘积,后面两个应该是一个意思,但是第一个我是看不懂的。

2.正常的tansformer-encoder是三维数据输入(batchsize,seq,feature)或者是位置不同,而我的是(batchsize,feature)这需要想一想改如何转换。

首先看,vit_pytorch这个不错的开源库中的实现

Transformer encoder层的使用_第1张图片

Transformer encoder层的使用_第2张图片

Transformer encoder层的使用_第3张图片

解析:

首先大的架构是,根据depth调整encoder个数,先进行layernorm,再输入到attention层,然后再与输入前的x相加,得到结果后进行layernorm,输入到feedforward,再加上之前的x。

或许print出来layers更加清晰

Transformer encoder层的使用_第4张图片

其中,我的问题是layernorm为什么是在输入前实现呢,跟原版bert编码器的并不是很一样,不过其实也不是很影响,然后多头的矩阵实现是挺有意思的,可以之后多研究研究。

最终我采用的方案是:将feature,reshape成一个二维的矩阵输入。其实还有fackbook的fairseq框架和pytorch官方实现的encoder,但其实都大差不差,因为已经解决了,我就不继续深入,后续有时间可以继续研究。

相关资料:

pytorch:TransformerEncoder — PyTorch 1.13 documentation

Vit-pytorch:lucidrains/vit-pytorch: Implementation of Vision Transformer, a simple way to achieve SOTA in vision classification with only a single transformer encoder, in Pytorch (github.com)

你可能感兴趣的:(python,pytorch,深度学习,transformer)