【机器学习的Tricks】随机权值平均优化器swa与pseudo-label伪标签
文章来自公众号【机器学习炼丹术】
1 stochastic weight averaging(swa)
- 随机权值平均
- 这是一种全新的优化器,目前常见的有SGB,ADAM,
【概述】:这是一种通过梯度下降改善深度学习泛化能力的方法,而且不会要求额外的计算量,可以用到Pytorch的优化器中。
随机权重平均和随机梯度下降SGD相似,所以我一般吧SWa看成SGD的进阶版本。
1.1 原理与算法
swa算法流程:
【怎么理解】:
- 对\(w_{swa}\)做了一个周期为c的滑动平均。每迭代c次,就会对这个\(w_{swa}\)做一次滑动平均。其他的时间使用SGD进行更新。
- 简单的说,整个流程是模型初始化参数之后,使用SGD进行梯度下降,迭代了c个epoch之后,将模型的参数用加权平均,得到\(w_{SWA}\),然后现在模型的参数就是\(w_{SWA}\),然后再用SGD去梯度下降c个epoch,然后再加权平均出来一个新的\(w_{SWA}\).
SWA加入了周期性滑动平均来限制权重的变化,解决了传统SGD在反向过程中的权重震荡问题。SGD是依靠当前的batch数据进行更新,寻找随机梯度下降随机寻找的样本的梯度下降方向很可能并不是我们想要的方向。
论文中给出了一个图片:
- 绿线是恒定学习率的SGD,效果并不好,直到SGD在训练的过程中所见了学习率,才可以得到一个收敛的结果;
- 而使用Stochastic weight averaging可以在学习率恒定的情况下,快速收敛,而且过程平稳。
1.2 python与实现
这里讲如何在pytorch深度学习框架中加入swa作为优化器:
from torchcontrib.optim import SWA
# training loop
base_opt = torch.optim.SGD(model.parameters(), lr=0.1)
opt = torchcontrib.optim.SWA(base_opt, swa_start=10, swa_freq=5, swa_lr=0.05)
for _ in range(100):
opt.zero_grad()
loss_fn(model(input), target).backward()
opt.step()
opt.swap_swa_sgd()
如果使用了swa的话,那么lr_schedule这个方法就不需要在使用了,非常的方便。
【关于参数】:
使用swa的时候,就直接通过
torchcontrib.optim.SWA(base_opt,swa_start,swa_greq,swa_lr)
来封装原来的优化器。
- swa_start:是一个整数,表示经过swa_start个steps后,将学习率切换为固定值swa_lr。(在swa_start之前的step中,lr是0.1,在10个steps之后,lr变成0.05)
- swa_freq:在swa_freq个step优化之后,会将对应的权重加到swa滑动平均的结果上,相当于算法中的c;
- 使用opt.swap_swa_sgd()之后,可以将模型的权重替换为swa的滑动平均的权重。
1.3 关于BN
这里有一个问题就是在BatchNorm层训练的时候,BN层中也是有两个训练参数的,使用\(w_{swa}\)重置了模型参数,但是并没有更新BN层的参数,所以如果有bn层的话,还需要加上:
opt.bn_update(train_loader,model)
2 Pseudo-Label
- 伪标签
- 这是一种半监督的方法。其实非常简单,就是对于未标记的数据,许纳泽预测概率最大的标记作为该样本的pseudo-label,然后给未标记数据设置一个权重,在训练过程中慢慢增加未标记数据的权重。
这个方法的loss如下:
非常好理解了,前面一项就是训练集的loss,后面是测试集的loss,然后用一个\(\alpha(t)\)来做权重。
然后这个\(\alpha(t)\)就是随着训练的迭代次数增加而慢慢的线性增加(如果按照原来的论文中的描述):
【一些关于pseudo-label的杂谈】
这个方法提出在2013年,然后再2015年作者用entropy信息熵来证明这个方法的有效性。但是证明过程较为牵强。这个伪标签我在2017年的一个项目中想到了,但是不知道可行不可行自己当时也无法进行证明,就作罢了,没想到现在看到同样的方法在2013年就提出来了。有点五味杂陈哈哈。
参考文献:
Izmailov, Pavel, et al. "Averaging weights leads to wider optima and better generalization." arXiv preprint arXiv:1803.05407 (2018).
Grandvalet, Yves, and Yoshua Bengio. "Semi-supervised learning by entropy minimization." Advances in neural information processing systems. 2005.
【机器学习的Tricks】随机权值平均优化器swa与pseudo-label伪标签的更多相关文章
- 区间第k大问题 权值线段树 hdu 5249
先说下权值线段树的概念吧 权值平均树 就是指区间维护值为这个区间内点出现次数和的线段树 用这个加权线段树 解决第k大问题就很方便了 int query(int l,int r,int rt,int k ...
- UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)
题意: 给定一个n个点m条边的带权有向图,求平均权值最小的回路的平均权值? 思路: 首先,图中得有环的存在才有解,其次再解决这个最小平均权值为多少.一般这种就是二分猜平均权值了,因为环在哪也难以找出来 ...
- GA:GA优化BP神经网络的初始权值、阈值,从而增强BP神经网络的鲁棒性—Jason niu
global p global t global R % 输入神经元个数,此处是6个 global S1 % 隐层神经元个数,此处是10个 global S2 % 输出神经元个数,此处是4个 glob ...
- The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp
文件链接 Karp在1977年的论文,讲述了一种\(O(nm)\)的算法,用来求有向强连通图中最小平均权值回路(具体问题请参照这里) 本人翻译(有删改): 首先任取一个节点 \(s\) ,定义 \(F ...
- POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)
$ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-cifar10图片分类(代码) 1.tf.nn.lrn(局部响应归一化操作) 2.random.sample(在列表中随机选值) 3.tf.one_hot(对标签进行one_hot编码)
1.tf.nn.lrn(pool_h1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) # 局部响应归一化,使用相同位置的前后的filter进行响应归一化操作 参数 ...
- 机器学习:集成学习:随机森林.GBDT
集成学习(Ensemble Learning) 集成学习的思想是将若干个学习器(分类器&回归器)组合之后产生一个新学习器.弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
随机推荐
- python读取EXCEL是去掉空白行和表头全部重命名
当读取进来的表格如图所示,转换成图2. import pandas as pd # header:指定作为列名的行,默认0,即取第一行的值为列名.数据为列名行以下的数据:若数据不含列名, # 则设定 ...
- day18 装饰器(下)+迭代器+生成器
目录 一.有参装饰器 1 前提 2 如何使用有参装饰器 3 有参装饰器模板 4 修正装饰器 二.迭代器 1 什么是迭代器 2 为什么要有迭代器 3 如何用迭代器 3.1 可迭代对象 3.2 可迭代对象 ...
- Java面向对象详解-下
一. static static:静态的,可以用来修饰属性.方法.代码块(或初始化块).内部类 static修饰属性(类变量): 由类创建的所有的对象,都共用这一个属性 当其中一个对象对此属性进行修改 ...
- JVM 专题一:虚拟机(一)
1. 虚拟机 1.1 什么是虚拟机? 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. 所谓虚拟机,就是一台虚拟的计算机.它是 ...
- linux专题(六):Vim编辑器
http://dwz.date/UDf 什么是Vim编辑器 Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 简单的来说, vi 是 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- Ethical Hacking - Web Penetration Testing(8)
SQL INJECTION WHAT IS SQL? Most websites use a database to store data. Most data stored in it(userna ...
- 高效C++:模板和泛型编程
模板和泛型编程的关注重点在编译期,所有的行为都在编译期确定,因此其规则和玩法也有自己特殊的一套,和其他模块不通用. 了解隐式接口和编译期多态 元编程------编译器多态,决定哪个重载函数被调用 cl ...
- 利用Serverless应用搭建Hexo博客
本文将介绍如何使用火爆的Serverless应用,15分钟快速搭建Hexo博客.以腾讯云提供的Serverless应用–云开发为例: 步骤1:安装 CloudBase CLI 以及本地部署 Hexo ...
- 题解 洛谷 P4492 【[HAOI2018]苹果树】
考虑生成一颗二叉树的过程,加入第一个节点方案数为\(1\),加入第二个节点方案数为\(2\),加入第三个节点方案数为\(3\),发现生成一颗\(n\)个节点的二叉树的方案数为\(n!\). 所以题目中 ...