如何把nn.embedding产生的词向量投影回文本空间

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]

怎么说呢,挺搞笑的,希望以后啃书的同时也敲敲代码思考一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值