对比学习
好的,我们通过一个具体的数字例子来解释 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
不同的负样本,使得模型能够在训练时区分正样本和负样本。