以下(以上)内容(参考):
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()