Git 01 入门与常用操作

Git 01 入门与常用操作

参考文献:稀土掘金 | ProGit2

与SVN的区别

SVN是集中式版本控制系统,其所有的版本管理都是集中在某个中央服务器,因此,在干活的时候,首先都需要从中央服务器中获取最新的版本,修改后将版本推送到中央服务器,因此大多数场景下需要进行联网使用。可能会更依托于相应的图形化客户端来进行同步和版本管理,便于管理美术资源等等。

GIT是分布式版本管理系统,每个人的电脑就是一个完整的版本库,可以进行独立的版本管理,多人协作可能依托于github之类的中继节点,将修改同步给对方,解决冲突。

初始化

包含ssh的详细指令在ssh的文档中,这边只介绍设置完这一系列操作之后的git初始化,主要是初始化ssh,并将私钥放到github或者gitee的账户中。
建议用Pc的名字来做标识

1
2
3
4
5
git config --global user.name "YourName"
git config --global user.email "YourEmailAdress"

# 查看相关的配置信息
git config --list

Github 设置

官方文档介绍的一些权限错误的地址:https://docs.github.com/en/github/authenticating-to-github/error-permission-denied-publickey

将本机的ssh公钥(public)放到GITHUB账户下的ssh管理地址,执行测试

1
ssh -T git@github.com

没有问题的话就可以直接进行clone,之类的git操作了

1
2
# 小trick,不拉取历史的commit
git clone --depth=1 REPO_ADRESS

Linux 文件传输和同步

Linux 文件传输和同步

@aikenhong 2022

当我们需要在Server之间进行,或者Server和WSL之间进行文件的传输,以及文件夹的同步的时候,如果要打开Xftp之类的软件进行,有繁琐的操作中转,或者说目录较为庞杂的时候,也显得有些麻烦。

于是我们可能希望使用脚本,来实现更便捷,同时也能设置定时功能,使得操作简单便捷,经过简单的调研,我们目前尝试使用以下几种方法,并取得了成功。

Rsync 同步目录

rsync是借助ssh服务进行的文件传输,为了使用起来方便,我们首先需要配置免密登录,在服务器之间传输SSH密钥,参考[[Envs/SSH]]

此后我们便可以编写同步脚本来同步远程的目录和本地目录,当然也可以执行反向的命令,

1
rsync -azP --delete -e 'ssh -p port' --progress --stats --exclude "big Files or sth" user@ip:source_path target_path >transfer.log

根据progress和stats我们记录传输过程中的日志,并输出到transfer.log,同时使用exclude排除大文件,避免传输过慢。

a: 归档文件模式(保留文件的时间戳等),保括了r的递归
z: 使用压缩文件传输
P: 支持断点续传
delete: 会删除目标文件中多出来的东西,保持同步,使得成为远程的镜像,但是有时候我们可能不需要这点,避免同步损毁

参考:


IL Collection

IL Collection

@AikenHong 2022

[[Draft/IL 总结]]: Thx 2 wyz to provide some clus for learnning Incremental Learning.

In this Doc, we may add some related knowledge distill works which is used to design our Incremental Structure.
在这个文档中,我们可能还会添加一些知识蒸馏的相关工作的文献,这些实际上对于我的增量学习架构有一个比较大的启发

  • DER
  • SPPR 没有 get 到方法到底是怎么做的

Introduction 👿

在很多视觉应用中,需要在保留旧知识的基础上学习新知识,==举个例子==,理想的情况是,我们可以保留之前学习的参数,而不发生==灾难性遗忘==,或者我们基于之前的数据进行协同训练,灾难性遗忘是 IL 中最核心的问题。

Incremental 的基本过程可以表示如下[4]
dsa

我们将模型可以划分为以下的两个部分[1]:backbone 和 classifier
split

从 LWF 中我们可以知道经典的 Paradigm,主要有下面的三种来对$\theta _S$ 和$\theta_o$来进行更新:

  • 仅重新训练分类器:仅更新$\theta_o$
  • 微调特征提取器,重新训练分类器
  • 联合训练

基于蒸馏架构的方法


WYZ-IL-Collection

WYZ-IL-Collection

: hammer: 王耀智

Regularization 系列方法

这类方法旨在添加一些正则化损失来解决 catastrophic forgetting 的问题。

Weight Regularization

这类方法一般是对网络中每个参数的重要性进行评估,根据每个参数的重要性和梯度信息更新参数。

典型的文章为 EWC .

PS: 这类文章我也没有读过。

Data Regularization

这类方法专注于记住特征表示,通常是结合 Hinton 的知识蒸馏损失函数使得模型记住旧类别的知识,解决 catastrophic forgetting。

推荐以下几篇文章:

  • LwF(Learning without forgetting),这篇文章在我看来是增量学习的开山之作,第一次给增量学习找到了一个比较好的方向,也是第一次将知识蒸馏应用到增量学习上;
  • PODNet CVPR2020 ,这篇文章最大的贡献在我看来是设计了一个全新的蒸馏损失函数,最终结果也是达到了当时的sota,甚至目前也是几个榜单的sota。

Rehearsal 系列方法

这类方法主要的想法是使用一些旧类别的数据,在新类别到来时使用新旧数据一起训练模型,根据旧类别数据的真假分为以下两种方法。


LT Collection

LT Collection

LT-Collections

@AikenHong 2021

Code of must of those methods
We will analysis those tricks on LT situation, and Analysis why it works.
在进行LT矫正的任务中,有几种常见的trick在各种模型中被使用,我们会对这几种不同的trick进行介绍和分析。

其实在数据量少这一方面LT和Few-Shot是有一定的OverLap的,可以参考以下那边的思路perhaps

Introduction

LT
通常情况下这种严重的类别不平衡问题会使得模型严重过拟合于头部,而在尾部欠拟合

首先介绍 bag of tricks 这篇论文中总结了一些常用的Trick,并组合出了最佳的一套trick

经过该文实验总结,Trick组合应该是[1]`

  • 在前几个epoch应用input mixup数据增强,然后后面fine-tuning;
  • (基于CAM的)重采样来重新训练分类器;

实际上就是MixUp + Two-Stage的策略,后续对Mix-up这个策略带来的作用要进行补充了解一下

Rebalance


Loss-NCE

Loss-NCE

@AikenHong 2021

Noise Contrastive Estimation Loss = NCE Loss 噪声对比估计损失,这里的Noise实际上就是Negative Samples.
该损失被广泛的用于对比学习的任务,而对比学习广泛的作为自监督学习的无监督子任务用来训练一个良好的特征提取器,于是对于对比学习的目标和效用的理解十分关键。

What’s NCE Loss

在介绍NCE之前我们可以将其和CE进行一个简单的对比,虽然名称上不是同一个CE,但是在数学表达上却有很相近的地方(softmax-kind of loss)

首先softmax,他保证所有的值加起来为一,结合onehot的ce,实际上j==gt的情况下外层+log也就是ceLoss,也就是 $logSoftmax$

然后看infoNCE,基础的对比学习损失可以写成:

其中 $f_x^T f_y^T$ 为 $sim(x,y)$ 时即转化为带$T$的NCE,即InforNCE.

分子是正例对的相似度,分母是正例对+所有负例对的相似度,最小化infoNCE loss,就是去最大化分子的同时最小化分母,也就是最大化正例对的相似度,最小化负例对的相似度。

从该形式上看,和soft的CE形式上是统一的,当我们把分母看作概率和自身以及和其他的相似性,这样和NCE在形式上和简化后的CE实现了统一。

但是我不认为这和label smooth 后的CE有相关性,而是和原始的CE经由One-hot简化后结构上有相似性。

How it Works

NCE的思想是拉近相似的样本,推开不相近的样本,从而学习到一个好的语义表示空间,这一点上实际上和度量学习的思想是一样的,只是对比学习通常作用在无监督或者自监督的语境中,度量学习这是有监督的。

考虑之前人脸匹配的研究,使用 “Alignment and Uniformity on the Hypersphere”中的Alignment and Uniformity,就是一个更好理解他的角度


Loss-Smooth(Sharpen)

Loss-Smooth(Sharpen)

@AikenHong 2021
@topic

  • smooth label (inception v2)
  • when does label smoothing help (nips 2019)
  • sharpen in semi-supervised in the future
  • offical code github

不是一个通用的方法,在很多的任务上反而会导致掉点的现象,可以简单分析一下,汲取一下思想和Sharpen做对比,在这篇文章中,我们可以结合之前的人脸对比损失来进行分析。

What’s the smooth label

首先介绍在图像分类任务中对logits和Hard label做ce得到我们的损失,可以表现为如下的形式:

由于我们的标签是一个hard label,实际上可以转化成一个one-hot,即

而soft label实际上做的是将 1的位置变为$1-\alpha$,其他位置设置为$\alpha/(K-1)$,然后再去求CE,

Hinton论文中给出该损失对特征分布的作用测试图:


Training Strategy

Training Strategy

@Aiken 2020,

主要针对神经网络的训练过程中的一些基础策略的调整,比如当训练的曲线出现一定的问题的时候,我们应该怎么去调整我们训练过程中的策略。

参数调整过程中最重要的就是优化器(优化或者说是下降算法)和学习率(优化算法的核心参数),此外像是数据增强策略还是Normalization策略,都能极大的影响一个模型的好坏。

优化器

Some Material
实际上虽然有很多的优化算法,但是到最后最常用的还是 SGD+Mon 和 Adam两种:

Adam主要的有事在于自适应学习率,他对我们设计的学习率实际上没有那么敏感,但是在具体实验中往往不会有调的好的SGD那么好,只是在SGD的参数调整中会比较费劲。

但是有了根据patient调整lr的scheduler后,我们基本上可以使用SGD做一个较为简单的调整,只要设计好初始的lr的实验以及用来调整学习率的参数值。

学习率

$\omega^{n} \leftarrow \omega^{n}-\eta \frac{\partial L}{\partial \omega^{n}}$ 其中的权重就是学习率lr,

==Basic==

学习率大 学习率小
学习速度
使用情景 刚开始训练时 一定的次数过后
副作用 1. Loss爆炸 2.振荡 1.过拟合 2.收敛速度慢

学习率的基本设置


PyTorch Handbook 00 (Archive)
Loss-WhyZero

Loss-WhyZero

Loss :Why Zero Loss?

@Comments: ICML2020 《Do We Need Zero Training Loss After Achieving Zero Training Error》

@Noteby:AikenHong2021

如何解决训练损失下降,但是验证损失上升的问题(过拟合like)的问题,该文章实际上可以作为我们损失设计中的一个trick,只需要简单的一行代码,来提升代码的泛化能力;

img

这张图体现了本文的灵魂(思路),主要体现在我们在算法趋于稳定后继续训练可能验证损失会反而上升;

所以本文提出了一种flooding方法,当我们training loss 大于阈值的时候我们使其正常下降,当低于阈值的时候,flooding的设计会反过来使得梯度上升,让训练损失保持在flooding附近,让模型持续进行random walk,希望模型最终能优化到一个平坦的损失区域,这样发现test loss进一步的进行下降。

理解:

当我们的训练损失低到一定的程度,然后随着lr的下降,模型会很难跳出当前的极小值,这种情况下我们的泛化能力也会被限制住,采用这种方法在牺牲测试精度的同时能提升算法的泛化能力。

损失公式表示如下

v2-084a8f00d7349a94540fc7ad3a9433b0_r

具体的代码表示只需要添加一层:

1
2
3
4
5
b = the flood num 
new_loss = (loss - b).abs() + b
optimizer.zero_grad()
new_loss.backward()
optimizer.step()