结论:
会被训练
测试代码:
import torch
from torch.nn import Embedding
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.emb = Embedding(5, 10)
def forward(self,vec):
input = torch.tensor([0, 1, 2, 3, 4])
emb_vec1 = self.emb(input)
print(emb_vec1) ### 输出对同一组词汇的编码
output = torch.einsum('ik, kj -> ij', emb_vec1, vec)
return output
def simple_train():
model = Model()
vec = torch.randn((10, 1))
label = torch.Tensor(5, 1).fill_(3)
loss_fun = torch.nn.MSELoss()
opt = torch.optim.SGD(model.parameters(), lr=0.015)
for iter_num in range(100):
output = model(vec)
loss = loss_fun(output, label)
print('iter:%d loss:%.2f' % (iter_num, loss))
opt.zero_grad()
loss.backward(retain_graph=True)
opt.step()
if __name__ == '__main__':
simple_train()
代码作用:
model中的参数就是一个embedding,前向传播总是编码同一个词汇表,然后乘上输入的向量。
经过训练之后embedding乘上向量可以得到全为3的向量。
优化器中的参数仅有embedding,所以embedding是会被训练的。
具体训练策略,不太清楚,估计就是对这个参与运算的embedding(tensor)进行梯度更新。