自监督学习教程:使用 pytorch lightning 实现 SimCLR

了解如何实现臭名昭著的对比自监督学习方法 SimCLR。在 PyTorch 和 PyTorch-lightning 中逐步实现

来源:AI夏令营

在本动手教程中,我们将为您提供 SimCLR 自监督学习方法的重新实现,用于预训练稳健的特征提取器。此方法相当通用,可应用于任何视觉数据集以及不同的下游任务。

在之前的教程中,我写了一些关于自监督学习领域的背景知识。现在是时候开始您的第一个项目了,在一个名为 STL10 的包含 100K 张未标记图像的小型数据集上运行 SimCLR。

上一个教程, STL10
代码可在 Github 上找到。

代码可在 Github 上找到。

可在 Github 上获取

SimCLR 方法:对比学习

让 sim(u,v)sim(u,v)sim(u,v) 表示 2 个归一化 uuu 和 vvv 向量之间的点积(即余弦相似度)。

sim(u,v)sim(u,v)sim(u,v) sim(u,v)sim(u,v)sim(u,v) sim(u,v)sim(u,v) sim(u,v)sim(u,v) sim(u,v)sim(u,v) sim(u,v) s i m ( u , v ) sim(u,v) sim(u,v) sim(u,v) s i m ( u , v ) uuu uuu uu uu uu div> u u u u u u vvv vvv vv vv vv v v v v v v 那么一对正样本 (i,j) 的损失函数定义为: ℓi,j=−log⁡exp⁡(sim⁡(zi,zj)/τ)Σk =12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ)\ell_{i, j}=-\log \frac{\exp \left(\operatorname{sim}\left(\boldsymbol{z}_{i}, \boldsymbol{z}_{j}\right) / \tau\right)}{\sum_{k=1}^{2 N} \mathbb{1}_{[k \neq i]} \exp \left(\operatorname{sim}\left(\boldsymbol{z}_{i}, \boldsymbol{z}_{k}\right) / \tau\right)}ℓi,j​=−log∑k=12N​1[k=i]​exp(sim(zi​,zk​)/τ)exp(sim(zi​,zj​)/τ)​ ℓi,j=−log⁡exp⁡(sim⁡(zi,zj)/τ)∑k=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ)\ell_{i, j}=-\log \frac{\exp \left(\operatorname{sim}\left(\boldsymbol{z}_{i}, \boldsymbol{z}_{j}\right) / \tau\right)}{\sum_{k=1}^{2 N} \mathbb{1}_{[k \neq i]} \exp \left(\operatorname{sim}\left(\boldsymbol{z}_{i}, \boldsymbol{z}_{k}\right) / \tau\right)}ℓi,j​=−log∑k=12N​1[k=i]​exp(sim(zi​,zk​)/τ)exp(sim(zi​,zj​)/τ)​ ℓi,j=−log⁡exp⁡(sim⁡(zi,zj)/τ)Σk=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ) ℓi,j ℓ i,j i , j div> = − log ⁡ exp⁡(sim⁡(zi,zj)/τ)Σk=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ) exp⁡(sim⁡(zi,zj)/τ) exp ⁡ (sim⁡(zi,zj)/τ) ( sim ⁡ (zi,zj) ( zi z i , zj z j ) / τ ) Σk=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ) Σk=12N Σ k=1 k = 1 2N 2 N 1[k≠i] 1 [k≠i] [ k ≠ i ] ⁡ ( u u u u u u vvv vvv vv vv vv v v v v v v

那么一对正样本 (i,j) 的损失函数定义为:

ℓi,j=−log⁡exp⁡(sim⁡(zi,zj)/τ)Σk =12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ)\ell_{i, j}=-\log \frac{\exp \left(\operatorname{sim}\left(\boldsymbol{z}_{i}, \boldsymbol{z}_{j}\right) / \tau\right)}{\sum_{k=1}^{2 N} \mathbb{1}_{[k \neq i]} \exp \left(\operatorname{sim}\left(\boldsymbol{z}_{i}, \boldsymbol{z}_{k}\right) / \tau\right)}ℓi,j​=−log∑k=12N​1[k=i]​exp(sim(zi​,zk​)/τ)exp(sim(zi​,zj​)/τ)​ ℓi,j=−log⁡exp⁡(sim⁡(zi,zj)/τ)∑k=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ)\ell_{i, j}=-\log \frac{\exp \left(\operatorname{sim}\left(\boldsymbol{z}_{i}, \boldsymbol{z}_{j}\right) / \tau\right)}{\sum_{k=1}^{2 N} \mathbb{1}_{[k \neq i]} \exp \left(\operatorname{sim}\left(\boldsymbol{z}_{i}, \boldsymbol{z}_{k}\right) / \tau\right)}ℓi,j​=−log∑k=12N​1[k=i]​exp(sim(zi​,zk​)/τ)exp(sim(zi​,zj​)/τ)​ ℓi,j=−log⁡exp⁡(sim⁡(zi,zj)/τ)Σk=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ) ℓi,j i,j i , j div> = − log ⁡ exp⁡(sim⁡(zi,zj)/τ)Σk=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ) exp⁡(sim⁡(zi,zj)/τ) exp ⁡ (sim⁡(zi,zj)/τ) ( sim ⁡ (zi,zj) ( zi z i , zj z j ) / τ ) Σk=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ) Σk=12N Σ k=1 k = 1 2N 2 N 1[k≠i] 1 [k≠i] [ k ≠ i ] ⁡ ( = log exp⁡(sim⁡(zi,zj)/τ)Σk=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ) exp⁡(sim⁡(zi,zj)/τ) exp (sim⁡(zi,zj)/τ) ( sim (zi,zj) ( zi z i , zj z j ) / τ ) Σk=12N1[k≠i]exp⁡(sim⁡(zi,zk)/τ) Σk=12N Σ k=1 k = 1 2N 2 N 1[k≠i] 1 [k≠i] [ k i ] (