对比学习
好的,我们通过一个具体的数字例子来解释 c_mi 是如何改变顺序的。
假设例子
假设初始的 c_mi 是一个形状为 ( 4 \times 3 ) 的张量(即有 4 行,3 列),值如下:
[
c_mi =
\begin{bmatrix}
1 & 2 & 3 \
4 & 5 & 6 \
7 & 8 & 9 \
10 & 11 & 12
\end{bmatrix}
]
这个矩阵表示上下文嵌入 c,每一行代表一个特征向量。
代码操作过程
c_mi = torch.cat((c_mi[-2:-1, :], c_mi[:-1, :]), 0)
这个操作由两部分组成:
- 
c_mi[-2:-1, :]:- -2:-1表示取- c_mi的倒数第二行,也就是第3行- [7, 8, 9],这个结果的形状是 ( 1 \times 3 )。
 结果为: 
 [
 \begin{bmatrix}
 7 & 8 & 9
 \end{bmatrix}
 ]
- 
c_mi[:-1, :]:- :-1表示取- c_mi中除了最后一行以外的所有行,即第1行到第3行:
 结果为: 
 [
 \begin{bmatrix}
 1 & 2 & 3 \
 4 & 5 & 6 \
 7 & 8 & 9
 \end{bmatrix}
 ]
- 
torch.cat((c_mi[-2:-1, :], c_mi[:-1, :]), 0):- 使用 torch.cat将这两个部分在第0维(行)方向上进行拼接,结果如下:
 
- 使用 
[
c_mi =
\begin{bmatrix}
7 & 8 & 9 \
1 & 2 & 3 \
4 & 5 & 6 \
7 & 8 & 9
\end{bmatrix}
]
总结
- 
原始 c_mi是:
 [
 \begin{bmatrix}
 1 & 2 & 3 \
 4 & 5 & 6 \
 7 & 8 & 9 \
 10 & 11 & 12
 \end{bmatrix}
 ]
- 
执行完 torch.cat((c_mi[-2:-1, :], c_mi[:-1, :]), 0)后,c_mi变为:
 [
 \begin{bmatrix}
 7 & 8 & 9 \
 1 & 2 & 3 \
 4 & 5 & 6 \
 7 & 8 & 9
 \end{bmatrix}
 ]
这种操作将 c_mi 的倒数第二行移到了最前面,其他行则保持相对顺序不变。这种扰动操作是用来生成一个与原始 c 不同的负样本,使得模型能够在训练时区分正样本和负样本。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号