ToB企服应用市场:ToB评测及商务社交产业平台
标题:
【机器学习】机器学习的基天职类-自监督学习-对比学习(Contrastive Learni
[打印本页]
作者:
慢吞云雾缓吐愁
时间:
2025-1-1 18:04
标题:
【机器学习】机器学习的基天职类-自监督学习-对比学习(Contrastive Learni
对比学习
是一种自监督学习方法,其目的是学习数据的表征(representation),使得在表征空间中,相似的样本距离更近,不相似的样本距离更远。通过设计对比损失函数(Contrastive Loss),模型能够有效捕捉数据的语义结构。
焦颔首脑
对比学习的关键在于:
正样本(Positive Pair)
:具有相似语义或来源的样本对,例如同一图像的差别加强版本。
负样本(Negative Pair)
:语义差别或来源差别的样本对,例如差别图像。
通过对比正负样本对,模型能够学习区分差别数据点的特征。
方法流程
数据加强
:对一个样本 x 应用两种差别的加强方法,生成
,作为正样本对。
特征提取
:通过编码器(如卷积神经网络)将数据映射到潜在特征空间,得到表征
。
对比损失
:设计损失函数,使正样本对的表征距离最小化,负样本对的表征距离最大化。
对比学习的损失函数
1.
对比损失(Contrastive Loss)
对比损失鼓励正样本对的距离更小,负样本对的距离更大。
:样本对是否为正样本(1 表现正样本,0 表现负样本)。
:样本对在表征空间中的距离(通常使用欧氏距离)。
m:负样本对的最小距离(margin)。
2.
InfoNCE 损失
用于最大化正样本对的相似性,同时将负样本对的相似性最小化。
:余弦相似度。
:温度参数,用于控制分布的平滑水平。
N:批量中样本数目。
典范方法
1.
SimCLR
SimCLR 是对比学习的经典方法之一:
焦颔首脑:通过数据加强生成正样本对,并使用 InfoNCE 损失函数进行优化。
数据加强:随机裁剪、颜色抖动、模糊等。
2.
MoCo(Momentum Contrast)
通过维护一个动态更新的“字典”,办理负样本数目不敷的问题。
焦颔首脑:使用动量编码器(momentum encoder)生成更多的负样本。
3.
BYOL(Bootstrap Your Own Latent)
无需显式的负样本,通过自回归(self-prediction)学习特征表征。
焦颔首脑:一个在线网络(Online Network)和一个目的网络(Target Network)协同练习。
4.
SWAV(Swapping Assignments Between Views)
联合聚类和对比学习,使用图像的多视图表征。
焦颔首脑:通过在线分配伪标签,避免显式使用负样本。
示例代码:SimCLR
以下是一个实现 SimCLR 的示例代码:
import tensorflow as tf
from tensorflow.keras import layers, models
# 图像增强函数
def augment_image(image):
image = tf.image.random_flip_left_right(image)
image = tf.image.random_crop(image, size=(32, 32, 3))
image = tf.image.random_brightness(image, max_delta=0.5)
return image
# 定义编码器
def create_encoder():
base_model = tf.keras.applications.ResNet50(include_top=False, pooling='avg', input_shape=(32, 32, 3))
return models.Model(inputs=base_model.input, outputs=base_model.output)
# SimCLR 模型
class SimCLRModel(tf.keras.Model):
def __init__(self, encoder, projection_dim):
super(SimCLRModel, self).__init__()
self.encoder = encoder
self.projection_head = tf.keras.Sequential([
layers.Dense(256, activation='relu'),
layers.Dense(projection_dim)
])
def call(self, x):
features = self.encoder(x)
projections = self.projection_head(features)
return tf.math.l2_normalize(projections, axis=1)
# 构建模型
encoder = create_encoder()
simclr_model = SimCLRModel(encoder, projection_dim=128)
# InfoNCE 损失
def info_nce_loss(features, temperature=0.5):
batch_size = tf.shape(features)[0]
labels = tf.range(batch_size)
similarity_matrix = tf.matmul(features, features, transpose_b=True)
logits = similarity_matrix / temperature
return tf.reduce_mean(tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True))
# 训练
(X_train, _), _ = tf.keras.datasets.cifar10.load_data()
X_train = tf.image.resize(X_train, (32, 32)) / 255.0
def preprocess_data(image):
return augment_image(image), augment_image(image)
train_data = tf.data.Dataset.from_tensor_slices(X_train)
train_data = train_data.map(preprocess_data).batch(32)
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
for epoch in range(10):
for x1, x2 in train_data:
with tf.GradientTape() as tape:
z1 = simclr_model(x1)
z2 = simclr_model(x2)
loss = info_nce_loss(tf.concat([z1, z2], axis=0))
gradients = tape.gradient(loss, simclr_model.trainable_variables)
optimizer.apply_gradients(zip(gradients, simclr_model.trainable_variables))
print(f"Epoch {epoch + 1}, Loss: {loss.numpy()}")
复制代码
输出结果
Epoch 1, Loss: 3.465735912322998
Epoch 2, Loss: 3.465735912322998
Epoch 3, Loss: 3.465735912322998
Epoch 4, Loss: 3.465735912322998
Epoch 5, Loss: 3.465735912322998
复制代码
对比学习的上风与寻衅
上风
无需标签数据
:适用于大规模无标签数据集。
高质量特征
:学习的表征具有很强的迁移能力。
通用性强
:适用于图像、文本、语音等多种模态。
寻衅
负样本选择
:负样本数目和质量对性能影响大。
计算本钱
:对比学习必要大量计算资源,尤其是在大规模数据上练习。
超参数调解
:温度参数等对模型表现至关重要。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4