今天,由于实验需要,所以要尝试encoder层的使用,但是呢,发现两个问题:
1.许多人的实现都是不一致的,有的人qkv是直接用x赋值,有的人是全连接层,有的人是矩阵乘积,后面两个应该是一个意思,但是第一个我是看不懂的。
2.正常的tansformer-encoder是三维数据输入(batchsize,seq,feature)或者是位置不同,而我的是(batchsize,feature)这需要想一想改如何转换。
首先看,vit_pytorch这个不错的开源库中的实现
解析:
首先大的架构是,根据depth调整encoder个数,先进行layernorm,再输入到attention层,然后再与输入前的x相加,得到结果后进行layernorm,输入到feedforward,再加上之前的x。
或许print出来layers更加清晰
其中,我的问题是layernorm为什么是在输入前实现呢,跟原版bert编码器的并不是很一样,不过其实也不是很影响,然后多头的矩阵实现是挺有意思的,可以之后多研究研究。
最终我采用的方案是:将feature,reshape成一个二维的矩阵输入。其实还有fackbook的fairseq框架和pytorch官方实现的encoder,但其实都大差不差,因为已经解决了,我就不继续深入,后续有时间可以继续研究。
相关资料: