平滑处理

csjywu01 / 2024-08-28 / 原文

当然,我可以通过一个简化的例子来解释你提供的代码中的平滑处理操作。

假设和设定

  • 类别数 num_aa_type:假设有 3 个类别(氨基酸类型)。
  • 嵌入向量维度 embed_size:假设每个类别的嵌入向量的维度是 2。
  • smooth_prob:假设对于一个样本的概率分布为 [0.1, 0.7, 0.2]
  • res_embeddings:假设 3 个类别的嵌入向量分别为:
    • 类别 1(0):[1.0, 0.0]
    • 类别 2(1):[0.0, 1.0]
    • 类别 3(2):[1.0, 1.0]

步骤 1:定义 smooth_probres_embeddings

import torch

# 假设的概率分布 (smooth_prob)
smooth_prob = torch.tensor([0.1, 0.7, 0.2])  # [num_aa_type]

# 假设的嵌入矩阵 (res_embeddings)
res_embeddings = torch.tensor([
    [1.0, 0.0],  # 类别 1 的嵌入向量
    [0.0, 1.0],  # 类别 2 的嵌入向量
    [1.0, 1.0],  # 类别 3 的嵌入向量
])  # [num_aa_type, embed_size]

步骤 2:执行平滑处理

# 平滑处理的计算:矩阵乘法
smoothed_embedding = smooth_prob @ res_embeddings  # 形状 [embed_size]

具体计算

现在,让我们详细计算矩阵乘法的结果:

# smoothed_embedding = smooth_prob @ res_embeddings
# smoothed_embedding = [0.1, 0.7, 0.2] @ [[1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]

# 第一个维度的计算 (x 轴的嵌入):
# 0.1 * 1.0 + 0.7 * 0.0 + 0.2 * 1.0 = 0.1 + 0 + 0.2 = 0.3

# 第二个维度的计算 (y 轴的嵌入):
# 0.1 * 0.0 + 0.7 * 1.0 + 0.2 * 1.0 = 0 + 0.7 + 0.2 = 0.9

smoothed_embedding = torch.tensor([0.3, 0.9])  # 最终的平滑嵌入向量

步骤 3:将平滑后的嵌入赋值回去

假设我们有一个嵌入矩阵 H,其形状为 [batch_size, embed_size],并且我们正在处理的样本需要进行平滑处理,那么就将计算得到的 smoothed_embedding 赋值给 H 中对应的行。

H[smooth_mask] = smoothed_embedding

总结

在这个示例中,smooth_prob 是一个表示模型预测概率分布的向量,res_embeddings 是每个类别的嵌入向量。通过将 smooth_probres_embeddings 相乘,我们得到了一个平滑后的嵌入向量 [0.3, 0.9]

  • 0.3 来自对类别 1 和类别 3 的 x 轴嵌入的加权平均。
  • 0.9 来自对类别 2 和类别 3 的 y 轴嵌入的加权平均。

这个平滑后的嵌入向量避免了直接选择某个类别的嵌入向量,而是结合了多个类别的信息,从而使模型在输出时更为稳定和鲁棒。