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()

Algorithm Sort

Algorithm Sort

记录各种排序操作,暂时不补充最基础的排序方式和理论,只记录排序算法的拓展应用。

在理论分析的部分主要使用cpp进行撰写,而在具体使用的时候,目前会主要按照python来进行编写,这主要是面向的场景不同决定的。

基础的排序理论,包括快排等等算法的分析在另一篇文章中记录(当初实习准备的时候有整理过,后续重新整理出来)

排序算法和理论

placeholder

排序算法应用

placeholder

同步排序

常用于Machine Learning中,将数据集中的数据和标签进行同步排序,避免打乱其中的对应关系。

使用numpy的 argsort功能来进行排序:

1
2
3
idx = np.argsort(labels)
labels = labels[idx]
datas = datas[idx,...]


UniFramework 01
Hungarian

Hungarian

@AikenHong 2021
@Code: Scipy(repo)
@Reference: 匈牙利算法&KM算法

该篇笔记用来介绍匈牙利算法和KM算法(Kuhn-Munkres Algorithm),这两个算法通常用来做目标之间的匹配问题。
常用于:多目标跟踪,和深度聚类中的标签匹配问题。

Method

这两种方法实际上解决的问题都是: 二分图的最大匹配问题;
首先需要对二分图有个基本的了解:

二分图

实际上就是将数据分为两组,各组的每一个点都去另一个组找对应的匹配,我们希望将两组中,相关的数据尽可能的准确的匹配起来。

可以想象成,是同一个数据在不同的映射下的不同表征需要做这样的匹配关系。

解决这种问题的方式就是使用匈牙利算法或者KM算法

匈牙利算法

匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法

匈牙利算法可以将二分图中的连线,看成是我们认为可能是相同的目标(不带权值),实际上就是从上到下假想成立,然后进行唯一匹配的搜索,有点像BackTrack的过程。

整体算法的成功率或者准确率实际上十分依赖与连线的准确率,对算法输出预测的准确度要求更高。


Cherno的cpp教程笔记

Cherno的cpp教程笔记

this notebook is based on Cherno‘s Video Class in YouTube;if there is sth get confused,I can recheck the video which talk about it, or just google it.

  • this is not totally for newbie, so some basic information we should search it
  • And this is a important websize to tell us basic info about C++.

Survey for Few-Shot Learning

Survey for Few-Shot Learning

@aikenhong 2020
@h.aiken.970@gmail.com

另一个综述文章:https://zhuanlan.zhihu.com/p/61215293
对该文中一些内容有一些补充,可以看看

FSL简介:https://blog.csdn.net/xhw205/article/details/79491649

GCN用于FSL:https://blog.csdn.net/qq_36022260/article/details/93753532

Abstract

FSL的根本目的就是弥合人工智能和人类之间的鸿沟,从少量带有监督信息的示例中学习。像人类一样有很高的泛化能力。这也能解决在实际应用场景中,数据难以收集或者大型数据难以建立的情景。

FSL的核心问题是:经验风险最小化器不可靠;那么如何使用先验知识去解决这个问题?

三个主要的角度:

  1. 数据:使用先验知识增强数据的监督经验
  2. 模型:使用先验知识来降低假设空间
  3. 算法:使用先验知识来改变搜索最佳假设(来进行搜索?)

现阶段针对FSL提出的一些相关的机器学习方法:
meta-learning; embedding learning; generative modeling etc.

本文的主要工作:


FSL前期调研
IL-MgSvF

IL-MgSvF

@Author & Paper:Arxiv
@Note:Aikenhong 2021/11/12

Other’s Note 1

Intro

旧知识的缓慢忘记和新知识的快速适应的困境:主要探讨Incremental中的Old和New的相互牵制和适应的问题,

旧知识的缓慢遗忘会导致对新任务的欠拟合,而快速适应会导致灾难性的遗忘,如何对这两种策略之间进行权衡,是一个重要的问题。

image-20211112110043089

多尺度混合的解决这个问题:

  • Intra-space: 新类别的特征在同一个特征空间中
  • inter-saoce:新旧类别的特征在不同的特征空间中

本文提出的多粒度策略

  1. 提出了一种频率感知的正则化操作,加速空间内的增量学习能力
  2. 新的特征空间组合操作,提升空间间的学习性能