Transformer

Transformer

@aikenhong 2021

References For Transformer:

  1. NLP The Transformer Family (lilianweng.github.io)
  2. VIT Transformer眼中世界 VS CNN眼中世界
  3. 李沐 NLP Transformer论文精读
  4. Suveys cver1cver2cver3

This blog will divided into several part : lil’s blog, the survey for ViT, we using those article to help us understand the transformer.

综述我们以最新的一篇为准进行阅读,其他的可能后续进行查缺补漏把,如无必要,勿增烦恼。

Intro导言

主要参考文章2来进行我们简单的导入

基本问题

Transformer原本是NLP中的重要模型, 作为LSTM的后继者, 用于处理Seq2Seq的数据类型和情景, 若是要将Transformer运用到Vision的领域中, 首要的问题就是如何:

将Image作为序列化的Token输入Transform中 , 而达成这个目的主要有三种典型的方法:

  • 像素点作为token,
  • 使用VAE离散化图片作为token再输入
  • ViT: 将图片切为一个个Patch在经过线性的projector之后组成一个embedding表示进行交互

图片

CNN的异同分析

差异分析和计算主要靠CKA向量相似度计算来计算模型和表征之间的差异,这里的理论分析暂且不赘述,后续有需求的话可参考论文Similarity of neural network representations revisited或当前文章.


MIM-V-iBOT

MIM-V-iBOT

@Read: AikenHong 2021

@Author: https://arxiv.org/abs/2111.07832

@解读:Machine Heart

基本思想

基于NLP中的MLM(Masked Language Model)的核心训练目标: 也就是遮住文本的一部分, 然后通过模型去预测和补全, 这一过程是模型学到泛化的特征, 使用这种方法来进行大规模的与训练范式.

在基本的思想上和MAE采用的是一样的设计, 但是本文中坐着认为visual tokenizer的设计才是其中的关键.

不同于 NLP 中 tokenization 通过离线的词频分析即可将语料编码为含高语义的分词,图像 patch 是连续分布的且存在大量冗余的底层细节信息。而作者认为一个能够提取图像 patch 中高层语义的 tokenizer 可帮助模型避免学习到冗余的这些细节信息。作者认为视觉的 tokenizer 应该具备两个属性:(a)具备完整表征连续图像内容的能力;(b) 像 NLP 中的 tokenizer 一样具备高层语义。

文中对tokenizer的设计为一个知识蒸馏的过程:

image-20211118151613545

文中使用这种在线tokenizer同时来监督这样的MIM过程, 也就是两部分协同学习, 能够较好的保证语义的同时并将图像内容转化为连续的特征分布, 具体的, tokenizer和目标网络狗狗想网络结构, 有移动平均来得到实际的tokenizer.

该形式近期在 DINO [3]中以自蒸馏被提出,并被用以针对同一张图片的两个不同视野在 [CLS] 标签上的优化:

在该损失函数的基础上, MIM同样也是用这种自蒸馏的方式去优化, 其中在线tokenizer的参数为目标网络历史参数的平均.

基于上述的这些训练目标,提出了一种自监督预训练框架iBOT, 同时优化两种损失函数。


MIM-V-MAE

MIM-V-MAE

@Author:Facebook AI Research-Kaiming He
Kaiming-MAE

Conclusion

总而言之这是一种大模型的训练方法, 通过在少量数据的基础上实现大模型的训练.

整体的架构上是参考了NLP中的AutoEncoder机制,将原图切分patch,用mask掩盖原图,通过少量可见的Patch进行Encoder后和Mask融合,再通过非对称的Decoder进行pixel的还原。

这种设计的有点在于mask的scala是可变的,同时这种mask能减少我们训练过程中对显存和计算复杂度的损耗,同时问题本身是一个比较复杂的问题,得以训练复杂的大模型,这种方式最终呈现的效果就是训练的效率高且效益好。

体现了自监督学习在这方面的优越性,同时这种方法得以实现也是由于ViT模型对于CNN模型的取代,才使得这种序列化切块的方式容易实现和验证。

这种方式在最终体现了自监督学习对于有监督与训练的优越性,使用这种方式能够更好的得到一个模型的通用表征。

在这里论文中也说明了和NLP的不同点以及这样的模型对于decoder的要求实际上是比NLP更高的

image-20211115113542074

experiment

Masking:对于输入的图像进行均匀的切分并均匀的随机采样

MAE encoder: 简单的ViT模型,对输入图像进行编码后和Mask进行混合得到一个完整的令牌集合,从而确保Decode能够得到对应的位置信息。

MAE decoder:轻量级的架构,可以独立于编码器进行设计,我们使用更窄更浅的网络,计算量比编码器10%更小,这样能够更快的进行训练。解码器的最后一层是先行投影,输出的数量==补丁中像素值的数量,最后会resize层原图的维度。


Fluent Python 01 数据模型与结构

Fluent Python 01 数据模型与结构

Chapter 1 数据模型

Se1 magic method

数据模型在这里的定义是对python框架的描述,他规范了python构建模块的接口;这些接口对应解释器中对一些特殊句法(常用句法)的激活和使用.本章节的核心就在于对这些特殊句法的理解和使用.
特殊方法带来的一些主要交互场景:

  • 迭代
  • 属性访问
  • 集合类
  • 函数和方法的调用
  • 对象的创建和销毁
  • 字符串的表示形式和格式化
  • 上下文管理模块(with模块)

这些特殊方法的存在实际上,是为了让python的解释器调用,除非我们有大量的元编程,否则我们一般不调用他,通过内置的len等函数进行调用的话,他们的速度更快

下面我们通过最典型的__getitem____len__对其有简单的介绍, 并介绍各个魔术方法的使用场景

Se2 using it and show more

最常用也最典型的magic method 不外乎__getitem____len__;

  • len即对当前对象提供对于通用的len()方法的接口,通常用于查看对象的length or size
  • getitem除了提供obj[index]的索引方式的同时,
    • 他也会对python内置的那些迭代方法提供支持for i in range(b)
    • 对于依托于这些迭代的方法也能够得以支持from random import choice
    • 切片操作

Se2.1 overwrite operator


Python01 数据模型和常用数据结构

Python01 数据模型和常用数据结构

个人的《Python Cookbook》 && 《Fluent Python》阅读笔记。

数据模型(Python结构的通用范式)

(Magic method)dunder method:Python特有的双下划线方法,这些方法能够支持Python进行特殊的调用,实现通用方法在新定义的数据结构上的使用,比如最典型的:

  • __len__()后可以支持len(),获得结构的长度
  • __getitem__()后可以支持data[index]来获取相应的元素,切片,等等数组的操作;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 也可以支持类似如下的一些操作
    # 从数据结构中随机选出一个items
    from random import choice
    choice(datas)
    # 也可以支持迭代方法和反迭代方法
    for data in datas:
    ...
    for data in reversed(datas):
    ...
    # 也可以支持sort函数

到这里也就说明了,只要我们在数据结构(class)中定义了相应的dunder method,该class就能支持相应的一系列操作,getitems就可以类比为列表,相应的操作都能够在python解释器下自动的赋予支持。

还有一些好用但不常用的方法:

  • __contain__实现的是in ,当没有实现contain的方法的时候会按照顺序在list中进行搜索
  • __abs__
  • __repr__实现的是输出的format设置,也就是print的时候的输出形式
  • __eq__ 实现的是 == 命令,同时in调用的是eq

下面附上一张特殊方法表:


VsCode's Configuration

VsCode's Configuration

Debug

配置Launch.json 能够帮助我们更好的进行debug的操作,有一些比较特别的文件名和相关编码。

  • ${workspaceFolder} 指代当前运行目录
  • ${file}指代当前文件

找到launch文件并打开,自定义JSON:执行工作文件夹下的main.py进行调试。

1
2
3
4
5
6
7
8
9
{
"name": "experiment",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/main.py",
"console": "integratedTerminal",
"args": ["--data_path","${workspaceFolder}/data",
"--mode","0","--resume","false"]
},

默认 JSON:执行当前文件


Vim 00 Basic Opeation

Vim 00 Basic Opeation

this is the Note record the vimtutor (the basic usage of vim.)
@Aiken 2021

delete command

Most of the command can use NUM to repeat it.
d num command means delete num times with args below:
c means del and change mode to insert:


Vim Configuration 03 Spacevim Setup

Vim Configuration 03 Spacevim Setup

@Aiken 2021 this file is use to record how to config out vim’ by spacevim.
I’ll write this doc with three Parts:

  • Install and envs, Plugins(including the LSP), KeyShort
  • Attention: we have much to do if we want to install some other plugins.
    maybe it not a good way to set the vim.

INSTALL SPACEVIM AND CONFIG IT

Install: SpaceVim via the offical websize:

1
2
The COMMAND is like:
curl -sLf https://spacevim.org/cn/install.sh | bash

SS_OD_SoftTeacher

SS_OD_SoftTeacher

@ Article: ICML from Microsoft & Huazhong Keda
@ Code: Github
@ Noteby: Aikenhong
@ Time: 20210914

Abstrast and Intro

in the session we will using describe the main idea of this article.

这篇文章的重点在于Soft Teacher,也就是用pseudo label做为弱标注,逐步提高伪标签的可靠性。

不同于多阶段的方法,端到端的方法再训练中逐步的提升伪标签的质量从而再去benifit目标检测的质量。
这样E2E的框架主要依赖于两部分技术:

  • soft teacher: 每个未标记边界框的分类损失由教师网络产生的分类分数进行加权
  • box jitter 窗口抖动: 选择可靠的伪框来学习框回归

在目标检测上获得SOTA的效果;

Multi-Stage

在半监督的情况下,关注的主要是基于伪标签的方法,是目前的SOTA,以往的方法采用多阶段的方式。

  1. 使用标记数据训练初始检测器
  2. 未标记数据的伪标记,同时基于伪标签进行重新训练

局限:初始少量标注的局限,初始的检测器的伪标签质量

End to End

Soft Teacher基本思路:对未标记的图像进行标记,然后通过标记的几个伪标签训练检测器.