GitHub를 참고하시면 CODE와 다양한 페이퍼 리뷰가 있습니다!
아래 링크를 참조하십시오.
(+별표와 팔로우는 사랑입니다.
.!
)
https://github.com/kalelpark/Awesome-ComputerVision
추상적인
최근의 방법은 두 이미지에서 얻은 임베딩 벡터 간의 관계를 찾으려고 합니다.
VICReg임베딩에 두 개의 정규화 용어를 개별적으로 적용하여 정보 접힘을 방지하는 방법을 제안합니다.
VICReg에는 분기, 배치 정규화, 기능 측면, 출력 등이 필요하지 않습니다.
VICReg: 직감
동일한 이미지에서 얻은 임베딩 벡터는 최소화되고 일괄 임베딩 변수의 분산은 임계값 이상으로 유지됩니다.
공분산은 0이 됩니다.
임베딩에는 3개의 완전 연결 레이어가 사용됩니다.
이름에서 알 수 있듯이 이
분산, 불변 및 공분산을 나타냅니다.
불변성: 임베딩 벡터 사이의 거리를 나타냅니다.
분산: 임베딩에서 각 변수의 표준 편차를 임계값 이상으로 유지하는 데 사용됩니다.
공분산: 모든 임베딩 변수 사이의 쌍별 공분산을 0으로 그리는 데 사용됩니다.
내장 변수 간의 역 상관관계로 사용되며 상관관계가 높은 정보가 무너지는 것을 방지합니다.
* 이 논문의 주요 기여는 다음과 같습니다.
분산 보존 항에서 임베딩 벡터가 0으로 축소되는 것을 방지합니다.
공분산은 BarlowTwins 방법을 사용하고 정보가 무너지는 것을 방지합니다.
다시 말하지만, 그것은 많이 언급하지 않습니다.
– 두 브랜치의 가중치를 공유할 필요도 없고, 동일한 아키텍처를 요구하지도 않으며,
입력은 동일한 특성을 가집니다.
– 메모리 뱅크, 비교 샘플, 대량 배치 불필요
– 배치 또는 기능 정규화가 필요하지 않습니다.
– 벡터 양자화나 예측 모듈이 필요하지 않습니다.
관련된 일
대조 학습, 클러스터링 방법, 증류 방법, 정보 극대화 방법
말하는
VICReg: 세부 정보
VICReg는 조인트 임베딩 기반 아키텍처입니다.
여기에서 인코더는 두 가지 역할을 합니다.
두 표현 간의 차이점 정보를 제거합니다.
(불변 항목으로 이해할 수 있음)
비선형성을 확장합니다.
임베딩 벡터 간의 역상관을 얻을 수 있습니다.
그런 다음 위의 3단계를 계속 진행합니다.
방법
실험
구현하다
x = self.projector(self.backbone(x))
y = self.projector(self.backbone(y))
repr_loss = F.mse_loss(x, y)
x = torch.cat(FullGatherLayer.apply(x), dim=0)
y = torch.cat(FullGatherLayer.apply(y), dim=0)
x = x - x.mean(dim=0)
y = y - y.mean(dim=0)
std_x = torch.sqrt(x.var(dim=0) + 0.0001)
std_y = torch.sqrt(y.var(dim=0) + 0.0001)
std_loss = torch.mean(F.relu(1 - std_x)) / 2 + torch.mean(F.relu(1 - std_y)) / 2
cov_x = (x.T @ x) / (self.args.batch_size - 1)
cov_y = (y.T @ y) / (self.args.batch_size - 1)
cov_loss = off_diagonal(cov_x).pow_(2).sum().div( self.num_features)
+ off_diagonal(cov_y).pow_(2).sum().div(self.num_features)
loss = ( self.args.sim_coeff * repr_loss + self.args.std_coeff * std_loss
+ self.args.cov_coeff * cov_loss)
return loss
class FullGatherLayer(torch.autograd.Function):
"""
Gather tensors from all process and support backward propagation
for the gradients across processes.
"""
@staticmethod
def forward(ctx, x):
output = (torch.zeros_like(x) for _ in range(dist.get_world_size()))
dist.all_gather(output, x)
return tuple(output)
@staticmethod
def backward(ctx, *grads):
all_gradients = torch.stack(grads)
dist.all_reduce(all_gradients)
return all_gradients(dist.get_rank())
결론적으로
이 논문에서는 triplet 기반 VICReg를 소개합니다.
VICReg는 많은 다운스트림에서 SOTA를 구현했습니다.
(그런 이유로…?)
분산과 표준편차를 근사하는 것이 참신해 보여서 받아들여지는 것 같습니다.
인용하다