(转)What the Fuck Python! 一些python特性

(转)What the Fuck Python! 一些python特性

What the f*ck Python! 🐍

一些有趣且鲜为人知的 Python 特性.

English | 中文


WTFPL 2.0 Commit id 996.icu

Python, 是一个设计优美的解释型高级语言, 它提供了很多能让程序员感到舒适的功能特性. 但有的时候, Python 的一些输出结果对于初学者来说似乎并不是那么一目了然.

这个有趣的项目意在收集 Python 中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性, 并尝试讨论这些现象背后真正的原理!

虽然下面的有些例子并不一定会让你觉得 WTFs, 但它们依然有可能会告诉你一些你所不知道的 Python 有趣特性. 我觉得这是一种学习编程语言内部原理的好办法, 而且我相信你也会从中获得乐趣!

如果您是一位经验比较丰富的 Python 程序员, 你可以尝试挑战看是否能一次就找到例子的正确答案. 你可能对其中的一些例子已经比较熟悉了, 那这也许能唤起你当年踩这些坑时的甜蜜回忆 :sweat_smile:

PS: 如果你不是第一次读了, 你可以在这里获取变动内容.

那么, 让我们开始吧…


Linux 基础操作 01

Linux 基础操作 01

学习资源汇总

manual:菜鸟Shell | ExplainShell

收录一些Linux的工具书以及相关的OnLine-Doc,方便后续进行学习和查阅:

  1. 鸟哥的Linux私房菜:相对全面一点但是内容有点太多了
  2. Linux就该这么学:从开始到结束的流程挺完善的,但是这个网站做的是纯傻逼
  3. Linux Tools Quick Tutorial:简单入门教程好像是
  4. Linux命令行于Shell脚本编程大全:本地PDF,在当前文件夹下面进行查看

文件架构&系统信息

Linux各文件夹的含义分析LInux下的文件架构体系,包括最外层的一些系统文件夹的基础作用以及对应的特殊功能等等,帮助我们能够更清楚我们文件的存储体系以及系统文件的存储地址。


Data Augmentation

Data Augmentation

intergrate with those augmentation method.

this doc will

  • Record those theory and the effect after transformation
  • Show the codes for ez use

And the complete .py will be intergrate in my classification pipeline

reference below:arrow_down_small:, if use them,start it for respect for his work.

Principle

Principle 1 of coding: Don’t reinvent the wheel unless it’s needed

  • 具体而言,仅在函数的拓展性较差,无法对其定制化,满足我们的日常需求的时候,我们会自行编写函数从而满足我们的需求,否则我们直接引用已知的库,提升我们的实现效率。

MLFlow

MLFlow

MLFlow 机器学习系统的使用

@Aiken 2020

基于Python开发的DAG数据工作流系统,面向机器学习,支持Spark并行环境和K8S容器集群;

MLFlow主要解决了三个问题,也就是三个我们可能会需要使用的功能:

  1. Tracking:跟踪实验训练结果,记录算法参数,模型结果和运行效果等等;
  2. Projects:对所有的算法项目有一套标准的projects概念,记录下代码版本,参数和运行环境这些东西,并且projects是可以拟合所有的算法框架的;
  3. Models:解决的是打包和部署模型的这样一个行为,提供json接口给后续的flsk框架等等进行使用

基本部署

INSTALL:

DEPLOY:

Tracking 实验版本跟踪

Tracking为本次描述的重点,来做一个训练过程中的版本管理,记录每一次训练的参数和变量信息等等,这样便于后续的恢复和实验信息的整理。便于统计和管理。使用的时候好像也是需要代码嵌入的部分,就是需要在代码中调用MLFlow的API。

但是在Tracking的时候有一个比较重要的点在于,这个方法和Tensorboard对原模型的参数的嵌入和Logging记录中会不会产生冲突,同时两个方法之间是不是有什么overlap;关键的问题:

  • 这两个API能不能进行混合使用
  • 怎么统一和区分两个方法的应用情景

Reference


Hard Task Sampling

Hard Task Sampling

Trick:Hard Task

思路来源于Meta-Tranfer-Learning,基本思路是在Meta-Learning的每一次Meta-Test的时候,会从预训练错误率比较高的Task中再次采样,增加那些task的训练次数。也就是难题多做的策略。

基本思路

对比Adaboost

这样的思路其实和AdaBoost的想法是有一定的异曲同工之妙的,或者说其实就是AdaBoost的思路:

Adaboost

参考笔记,从该笔记中我们可以看到,AdaBoost的基本思路如下:

Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器.

和Meta-Transfer-Learning对比一下,我们可以发现,这个方法实际上就是讲Transfer Learning的与训练网络当成弱学习器1,然后通过弱学习器1的训练样本权重,来增大Hard-Task的配比(也就是增加任务的权重)完全一致。

具体实现

实现上主要是,样本sample的过程,就是如何在进行参数选择后和原本的Dataloader,结合起来。在这里我们主要参考MTL中的方法,进行网络的构建处理。

第一部分:sampler构建,为了后续Dataloader中进行数据的采样,需要构建一个这样的sampler,关键在于index的对应关系,以及最后输出的是index的集合。


并行训练
MIM-V-simMIM

MIM-V-simMIM

@Author: MSRA Zhenda Xie
@Source:ArxivCode TBPBlog_CVer
@Read:AikenHong 2021.11.22

“What I cannot create, I do not understand.” — Richard Feynman

Intro & Simple Conclusion

Conclusion

继MAE和iBoT之后,MSRA也提出了一个图像掩码建模的新框架,SimMIM,该方法简化了最近这些提出的方法,不需要特殊设计,作者也验证了不需要那些特殊设计就已经能让模型展现出优秀的学习能力

  • 采用中等大小的掩码块(32),对输入图像进行随机掩码,能使其成为强大的代理任务(pretext task)
  • 直接回归预测原始像素的RGB值的效果并不比复杂设计的Patch分类方法差
  • Projector Head可以是轻量的Linear Layer,效果并不一定比MLP(多层)的差

Motivation

通过这种MIM方法可以实现在大量无标注的数据上得到一个表征能力up的通用特征模型,这种方式的backbone可以广泛的应用到图像上的各种子任务中(按照NLP)的经验来说,而为了类似的方式在图像上的大放异彩,我们首先需要分析Vision和Language的不同

  1. 图像有更强的局部关系:相互靠近的像素是高度相关和近似的,我们可以通过简单的copy padding复制一部分缺失
  2. 视觉信号是原始,低层次的,而文本分词是高级概念:对低层次信号的预测是否对高层次的视觉识别任务有用呢?
  3. 视觉信号是连续的,而文本的分词是离散的: 如何基于分类的掩码语言建模方法来处理连续的视觉信号

Theoretical Design

掩码选择:同样的掩码的策略还是基于Patch进行的,对于掩码的设计来说,太大的掩码快或者太密集的掩码快,可能会导致找不到附近的像素来预测,实验证明32是一个具有竞争力的size,和文本任务的信息冗余程度不同也带来了覆盖比的选择,NLP通常是0.15,而在V中,32size可以支持0.1-0.7的覆盖率。

任务选择:使用原始像素的回归任务,因为回归任务和具有有序性的视觉信号的连续性很好的吻合。

预测头选择:使用轻量的预测头如(linear),迁移性能与繁琐的预测头相似或者略好,同时训练上更加的块。虽然较大的头或更高的分辨率通常会导致更强的生成能力,但这种更强的能力不一定有利于下游的微调任务


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层原图的维度。