Transformer 模型中的positional encoding(位置编码)计算理解(2)

发布时间 2023-05-09 22:34:16作者: emanlee

 

 

 

 

 

 

 

 以下(以上)内容来自(参考):

https://www.bilibili.com/video/BV1Di4y1c7Zm?p=2&vd_source=6292df769fba3b00eb2ff1859b99d79e

 

 

import numpy as np

def getPositionEncoding(seq_len,dim,n=10000):
    ## seq_len: 序列长度
    ## dim 词向量的维度
    ## n 为固定的值
    PE = np.zeros(shape=(seq_len,dim)) ## 为序列的每一个词算一个位置向量 seq_len*dim
    for pos in range(seq_len): ## 为序列的每一个词算一个位置向量
        #print("词的位置为", pos) ## 0,1,2,3.。。
        for i in range(int(dim/2)): ## 每次循环计算两个值,因此,循环次数要减半
            #print("i=",i)
            denominator = np.power(n, 2*i/dim)
            PE[pos,2*i] = np.sin(pos/denominator) #; print("PE[pos,2*i]=",PE[pos,2*i])
            PE[pos,2*i+1] = np.cos(pos/denominator)#; print("PE[pos,2*i+1]=",PE[pos,2*i+1])

    return PE


import matplotlib.pyplot as plt
P = getPositionEncoding(seq_len=100, dim=512, n=10000)
cax = plt.matshow(P)
plt.gcf().colorbar(cax)
plt.show()

 

 

import numpy as np

def getPositionEncoding(seq_len,dim,n=10000):
    ## seq_len: 序列长度
    ## dim 词向量的维度
    ## n 为固定的值
    PE = np.zeros(shape=(seq_len,dim)) ## 为序列的每一个词算一个位置向量 seq_len*dim
    for pos in range(seq_len): ## 为序列的每一个词算一个位置向量
        #print("词的位置为", pos) ## 0,1,2,3.。。
        for i in range(int(dim/2)): ## 每次循环计算两个值,因此,循环次数要减半
            #print("i=",i)
            denominator = np.power(n, 2*i/dim)
            PE[pos,2*i] = np.sin(pos/denominator) #; print("PE[pos,2*i]=",PE[pos,2*i])
            PE[pos,2*i+1] = np.cos(pos/denominator)#; print("PE[pos,2*i+1]=",PE[pos,2*i+1])

    return PE


import matplotlib.pyplot as plt
P = getPositionEncoding(seq_len=300, dim=512, n=10000)
cax = plt.matshow(P)
plt.gcf().colorbar(cax)
plt.show()