对比学习

好的,我们通过一个具体的数字例子来解释 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)

这个操作由两部分组成:

  1. c_mi[-2:-1, :]:

    • -2:-1 表示取 c_mi 的倒数第二行,也就是第3行 [7, 8, 9],这个结果的形状是 ( 1 \times 3 )。

    结果为:
    [
    \begin{bmatrix}
    7 & 8 & 9
    \end{bmatrix}
    ]

  2. c_mi[:-1, :]:

    • :-1 表示取 c_mi 中除了最后一行以外的所有行,即第1行到第3行:

    结果为:
    [
    \begin{bmatrix}
    1 & 2 & 3 \
    4 & 5 & 6 \
    7 & 8 & 9
    \end{bmatrix}
    ]

  3. 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 不同的负样本,使得模型能够在训练时区分正样本和负样本。

posted @ 2024-09-23 15:20  GraphL  阅读(14)  评论(0编辑  收藏  举报