repeat可以完成指定维度上的复制,通过不同的复制方法以及与view的混用,能完成向量之间的两两交互,在与推荐系统有关实际使用中,repeat可以这样用:
假设有一个item_emb矩阵,形状是[2,2,4],代表了2位用户,每个用户有2个感兴趣的商品,每个商品可以用4维向量表示:
item_emb:
tensor([
[[0.5764, 0.8429, 0.5437, 0.9735],
[0.8917, 0.5450, 0.7866, 0.6392]],
[[0.4026, 0.7241, 0.6565, 0.0908],
[0.2610, 0.4071, 0.0021, 0.4405]]
])
现在令:
repeat1=item_emb.repeat(1,1,2)
repeat2=item_emb.repeat(1,2,1)
repeat1=repeat1.view(2,-1,4)
可以得到repeat1:repeat1表示2位用户有4个感兴趣的商品,每两个相邻的商品是重复的。
repeat1:
tensor([
[[0.5764, 0.8429, 0.5437, 0.9735],
[0.5764, 0.8429, 0.5437, 0.9735],
[0.8917, 0.5450, 0.7866, 0.6392],
[0.8917, 0.5450, 0.7866, 0.6392]],
[[0.4026, 0.7241, 0.6565, 0.0908],
[0.4026, 0.7241, 0.6565, 0.0908],
[0.2610, 0.4071, 0.0021, 0.4405],
[0.2610, 0.4071, 0.0021, 0.4405]]
])
类似的,repeat2:也表示2位用户对4个商品感兴趣,但是这次商品的排列就不同了,请和item_emb对比一下。
repeat2
tensor([
[[0.5764, 0.8429, 0.5437, 0.9735],
[0.8917, 0.5450, 0.7866, 0.6392],
[0.5764, 0.8429, 0.5437, 0.9735],
[0.8917, 0.5450, 0.7866, 0.6392],
],
[[0.4026, 0.7241, 0.6565, 0.0908],
[0.2610, 0.4071, 0.0021, 0.4405],
[0.4026, 0.7241, 0.6565, 0.0908],
[0.2610, 0.4071, 0.0021, 0.4405]]
])
经过了repeat操作,得到的两个矩阵repeat1和repeat2,如果相乘(repeat1*repeat2按位乘),就能得到一个新的[2,4,4]的矩阵,
其中的第一项是[1,4,4]的,1代表用户1,第二个‘4’代表每个物品的维度;**第一个‘4’代表用户1感兴趣的商品的两两交互(逐元素乘),因为用户有两个感兴趣物品,所以两两交互有4项,**如果用户有3个感兴趣商品,那么第一个‘4’就应该换成9.