RT,CSDN真好玩全是介绍nn.embedding原理的,属于是人抄人抄人,一个小时没见到把vec转回句子的,就没人有这个问题吗?也不用动脑思考了,就嗯抄XD
nn.embedding不只是 e m b e d d i n g = X A embedding = XA embedding=XA,它还有一个norm的过程,这个norm是未知的。
想要把词向量重新投射回去,首先要右乘一个逆矩阵(embedding_weight是一个奇异矩阵,所以是伪逆),之后还要通过求最小值的下标来获得它在字典中的值。
之后,把字典倒置,(key, value)->(value, key),再查询index对应的word。
给出代码:
# author: Carl_CloudXD
embed = nn.Embedding(28996, 768) # embed_weight: [28996,768]
a = tokenizer.batch_encode_plus(aim_token, # words: [4,77]
padding='max_length',
truncation=True,
max_length=77).input_ids
b = embed(torch.tensor(a)) # [4,77,768]
e = b[0]@torch.linalg.pinv(embed.weight) # 计算第一句话的tokens和embed_weight伪逆的最小余弦投影,也不余弦了直接求积s
voc = tokenizer.get_vocab()
dictionary = dict(zip(voc.values(),voc.keys()))
words = [torch.argmax(i).numpy() for i in e] # 查找余弦投影最小的点位置
words = [int(i) for i in vocs]
sentence = [dictionary[i] for i in vocs]
怎么说呢,挺搞笑的,希望以后啃书的同时也敲敲代码思考一下