在init函数里写 需要用到的东西,如softmax、buffer;在forward里写怎么执行的,具体怎么做的
导入库
import numpy as np
import torch
from torch import nn
from einops import rearrange, repeat
from einops.layers.torch import Rearrange
求位置编码的类
思路:
给每个位置加上一个不同的偏置值,以此区别相同的词在不同位置上的不同含义,给输入带上位置信息。得到所有元素的位置编码表(是一系列预生成的东西,不是通过训练得到的)。
如何计算位置编码?----每个位置的x加上当前位置的偏置值
偏置值的计算:
相邻维度(偶数用正弦,奇数用余弦)共享同一频率,但相位不同,使模型能捕捉位置间的相对关系。分母 1000 0 2 i / d h i d 10000^{2i/d_hid} 100002i/dhid 随着维度索引 i = hid_j//2 增大而指数级增长,导致位置编码的频率逐渐降低。(其中10000是经验值)
class PositionalEncoding(nn.Module):
# d_hid(隐藏状态的维度)和 n_position(位置的数量)
def __init__(self, d_hid, n_position=200):
super(PositionalEncoding, self).__init__() # 继承父类nn.Module
self.register_buffer('pos_table', self._get_sinusoid_encoding_table(n_position, d_hid))
# 求所有输入元素位置编码表的方法
def _get_sinusoid_encoding_table(self, n_position, d_hid)