-
2020-11-27 16:26:50
在机器学习中,经常需要对为随机优化计算loss function的梯度,有时这些loss function会写成期望的形式。比如在变分推断中,需要计算ELBO loss(包含期望的项)的导数(derivative)。另外就是强化学习的Policy Gradient算法中的目标函数(也就是loss function)就是算期望的reward。
但是一般是不能直接计算期望的梯度的,而REINFORCE和Reparameterization就是两种常见的trick,用来计算这些期望函数的梯度,注意这两个trick基于假设以及用处是不同的。问题设定
给定随机变量 x x x和参数分布 p θ p_{\theta} pθ,即 x ∼ p θ ( x ) x \sim p_{\theta}(x) x∼pθ(x),我们需要求出函数 f f f的期望,即:
∇ θ E x ∼ p θ ( x ) [ f ( x ) ] (1) \nabla_{\theta} \mathbb{E}_{x \sim p_{\theta}(x)}[f(x)] \tag{1} ∇θEx∼pθ(x)[f(x)](1)
这里函数 f f f通常就是目标函数或者损失函数(loss function),比较棘手的问题就是前面讲了我们很难直接算出这个期望然后求梯度,所以就可以用REINFORCE或者Reparameterization这两种trick来将问题转换求解。REINFORCE
REINFORCE有时会也叫score function estimator或者likelihood ratio estimator,它主要用了一个对数微分的trick,如下:
∇ θ p θ ( x ) = p θ ( x ) ∇ θ p θ ( x ) p θ ( x ) = p θ ( x ) ∇ θ log p θ ( x ) (2) \nabla_{\theta} p_{\theta}(x)=p_{\theta}(x){\frac{\nabla_{\theta} p_{\theta}(x)}{p_{\theta}(x)}}=p_{\theta}(x) \nabla_{\theta} \log p_{\theta}(x) \tag{2} ∇θpθ(x)=pθ(x)pθ(x)∇θpθ(x)=pθ(x)∇θlogpθ(x)(2)
利用这个trick我们来推导公式(1),就可以得到:
∇ θ E x ∼ p θ ( x ) [ f ( x ) ] = ∇ θ ∫ f ( x ) p θ ( x ) d x = ∫ f ( x ) ∇ θ p θ ( x ) d x = ∫ f ( x ) p θ ( x ) ∇ θ log p θ ( x ) d x = E x ∼ p θ ( x ) [ f ( x ) ∇ θ log p θ ( x ) ] (3) \begin{aligned} \nabla_{\theta} \mathbb{E}_{x \sim p_{\theta}(x)}[f(x)] &=\nabla_{\theta} \int f(x) p_{\theta}(x) d x \\ &=\int f(x) \nabla_{\theta} p_{\theta}(x) d x \\ &=\int f(x) p_{\theta}(x) \nabla_{\theta} \log p_{\theta}(x) d x \\ &=\mathbb{E}_{x \sim p_{\theta}(x)}\left[f(x) \nabla_{\theta} \log p_{\theta}(x)\right] \end{aligned} \tag{3} ∇θEx∼pθ(x)[f(x)]=∇θ∫f(x)pθ(x)dx=∫f(x)∇θpθ(x)dx=∫f(x)pθ(x)∇θlogpθ(x)dx=Ex∼pθ(x)[f(x)∇θlogpθ(x)](3)
进一步使用蒙特卡洛采样就可以得到:
E x ∼ p θ ( x ) [ f ( x ) ∇ θ log p θ ( x ) ] ≈ 1 N ∑ i = 1 N f ( x i ) ∇ θ log p θ ( x i ) (4) \mathbb{E}_{x \sim p_{\theta}(x)}\left[f(x) \nabla_{\theta} \log p_{\theta}(x)\right]\approx \frac{1}{N} \sum_{i=1}^{N} f\left(x_{i}\right) \nabla_{\theta} \log p_{\theta}\left(x_{i}\right) \tag{4} Ex∼pθ(x)[f(x)∇θlogpθ(x)]≈N1i=1∑Nf(xi)∇θlogpθ(xi)(4)
注意这是一个无偏估计,也就是方差会很大(可以搜索trade-off bias and variance),也有一些方法可以减少方差比如 Importance Sampling或者Rao-Blackwellization,具体参考这本书的8,9,10章。Torch中的REINFORCE
以强化学习的Policy Gradient算法算法为例,这里的函数 f f f对应着reward function,参数分布
p θ p_{\theta} pθ就对应着策略 π θ \pi_{\theta} πθ(输出为action),代码如下:# from torch.distributions import Bernoulli from torch.distributions import Categorical probs = policy_network(state) # Note that this is equivalent to what used to be called multinomial m = Categorical(probs) action = m.sample() next_state, reward = env.step(action) loss = -m.log_prob(action) * reward loss.backward()
其中
policy_network
是一个神经网络,输入为当前的state
,输出一个当前动作的概率,动作action服从Categorical分布,当然也可以是Bernoulli分布或者正态分布,看实际需求。reward函数可以通过环境的env.step
给出,然后根据公式(4)就可以算出loss fucntion,最后通过loss.backward()
进行反向传播了。Reparameterization trick
回顾公式(1):
∇ θ E x ∼ p θ ( x ) [ f ( x ) ] (1) \nabla_{\theta} \mathbb{E}_{x \sim p_{\theta}(x)}[f(x)] \tag{1} ∇θEx∼pθ(x)[f(x)](1)
我们可以把这里的参数分布 π θ \pi_{\theta} πθ重写为一个带有噪声变量 ϵ \epsilon ϵ的分布,也就是Reparameterization,该变量独立于原来的 θ \theta θ,如下:
ε ∼ q ( ε ) x = g θ ( ε ) ∇ θ E x ∼ p θ ( x ) [ f ( x ) ] = ∇ θ E ε ∼ q ( ε ) [ f ( g θ ( ε ) ) ] = E ε ∼ q ( ε ) [ ∇ θ f ( g θ ( ε ) ) ] \begin{aligned} \varepsilon & \sim q(\varepsilon) \\ x &=g_{\theta}(\varepsilon) \\ \nabla_{\theta} \mathbb{E}_{x \sim p_{\theta}(x)}[f(x)] &=\nabla_{\theta} \mathbb{E}_{\varepsilon \sim q(\varepsilon)}\left[f\left(g_{\theta}(\varepsilon)\right)\right] \\ &=\mathbb{E}_{\varepsilon \sim q(\varepsilon)}\left[\nabla_{\theta} f\left(g_{\theta}(\varepsilon)\right)\right] \end{aligned} εx∇θEx∼pθ(x)[f(x)]∼q(ε)=gθ(ε)=∇θEε∼q(ε)[f(gθ(ε))]=Eε∼q(ε)[∇θf(gθ(ε))]
其中随机参数分布 π θ \pi_{\theta} πθ转换为一个噪声分布 q q q, q q q可以是标准的正态分布。比如 x x x被reparameterize成从分布 x ∼ N ( μ , σ ) x \sim \mathcal{N}(\mu, \sigma) x∼N(μ,σ)中采样,那么:
g θ ( ε ) = μ θ + ε σ θ g_{\theta}(\varepsilon)=\mu_{\theta}+\varepsilon \sigma_{\theta} gθ(ε)=μθ+εσθ
其中 ε ∼ N ( 0 , 1 ) \varepsilon \sim \mathcal{N}(0,1) ε∼N(0,1),如下图可以表示Reparameterization:
注意图中的 z z z就是这里的 x x x,通过引入一个stochastic的变量 ϵ \epsilon ϵ并结合以上公式就可以把期望的梯度写成:
∇ θ E x ∼ p θ ( x ) [ f ( x ) ] ≈ 1 N ∑ i = 1 N ( ∇ θ f ( g θ ( ε i ) ) ) \nabla_{\theta} \mathbb{E}_{x \sim p_{\theta}(x)}[f(x)] \approx \frac{1}{N} \sum_{i=1}^{N}\left(\nabla_{\theta} f\left(g_{\theta}\left(\varepsilon_{i}\right)\right)\right) ∇θEx∼pθ(x)[f(x)]≈N1i=1∑N(∇θf(gθ(εi)))
然后就可以方便地计算梯度了,注意Reparameterization比REINFORCE拥有更低的方差(variance)但是只适用于可微分的模型。Torch中的Reparameterization
同样针对强化学习中的Policy Gradient算法,如下
params = policy_network(state) m = Normal(*params) # Any distribution with .has_rsample == True could work based on the application action = m.rsample() next_state, reward = env.step(action) # Assuming that reward is differentiable loss = -reward loss.backward()
这里的
params
指 ϵ \epsilon ϵ,Normal
指上面的分布q,采样出 ϵ \epsilon ϵ后可以直接通过torch中的rsample()函数(对应 g θ g_{\theta} gθ)得到相应的action,最后代入到f(对应程序中的env.step
)就可以以-reward为loss进行梯度下降了Refs
更多相关内容 -
Trick
2019-10-24 23:53:34Trick -
trick:特技模拟环境。 Trick提供了一组通用的仿真功能和实用程序,可以自动构建仿真
2021-05-12 10:17:59由NASA约翰逊航天中心开发的Trick仿真环境是一个功能强大的仿真开发框架,使用户能够为航天器开发的所有阶段构建应用程序。 特里克(Trick)加快了仿真的创建过程,以进行早期飞行器设计,性能评估,飞行软件开发,... -
Team Spirit Hattrick (TS-H):估计他的 Hattrick 俱乐部在整个赛季中的 TS 变化。-开源
2021-07-01 23:40:42该文件用于估算在 Hattrick 比赛的整个赛季 (http://www.hattrick.org) 期间贵俱乐部的团队精神 (TS = Team Spirit) 的自然和强制变化。 因此,您可以计划“安静”、“正常”或“赛季最佳”的正式比赛,并查看您的... -
支持向量机之Kernel Trick.pdf
2021-01-17 19:58:19支持向量机之Kernel Trick.pdf -
Hattrick Economy-开源
2021-07-05 01:38:56Hattrick Economy (haec) 是一种用于分析和预测 Hattrick 在线足球经理 (www.hattrick.org) 的经济数据的工具。 -
Hattrick Commons-开源
2021-07-09 18:10:42Hattrick Commons 是一组实用程序,将有助于为在线游戏 Hattrick 开发应用程序。 它包括大多数应用程序将使用的通用功能。 -
Open Online Football Manager (O2FM):像Hattrick这样的开源在线足球经理-开源
2021-04-29 06:21:48像hattrick这样的开源在线足球经理,请在Twitter上关注我们:@open_ofm。 -
Hattrick Organizer Plugins-开源
2021-07-22 07:59:47Hattrick Organizer java 插件集 -
The Kernel Trick.pdf
2019-07-08 22:45:13机器学习中为什么需要 Kernel Trick 以及 Kernel Trick 的证明。 -
python-trick
2019-02-21 12:23:57Python-trick,上传的事pdf文档 -
红蓝对抗—来自红队的一些trick.pdf
2021-08-24 06:12:59红蓝对抗—来自红队的一些trick 安全管理 安全 安全测试 信息安全研究 信息安全 -
Hattrick Target Scores - USA-crx插件
2021-04-06 21:50:09语言:English (United States) 在HattrickPortal Tracker页面上显示美国目标技能得分和AMTS值。 用户必须有权使用播放器技能。 在HattrickPortal Tracker页面上显示美国目标技能得分和AMTS值。 ... -
trick17:用于 Windows 故障排除的实用程序-开源
2021-06-29 12:32:51*测试 Internet 连接 *清除 DNS 解析器缓存 *添加多个本地 Windows 用户帐户 *可以下载任意或选定的第 3 方实用程序 *Windows 更新缓存重置 *无需设置。 注意:仅限 64 位 Windows -
Trick-Rpc-Framework:一个简单的RPC框架的实现
2021-03-27 09:39:04特技-Rpc-框架一个简单的RPC框架的实现 -
linux shell trick
2018-10-09 20:28:29linux shell trick -
booking_trick
2021-03-21 14:34:25待办事项:删除此内容和上面的文字,并描述您的宝石安装将此行添加到您的应用程序的Gemfile中: gem 'booking_trick'然后执行: $ bundle或将其自己安装为: $ gem install booking_trick用法待办事项:在此处写下... -
神经网络训练Trick 训练技巧.docx
2019-06-07 19:37:43神经网络训练Trick,帮助炼丹!!!! -
值得收藏的深度学习模型训练trick
2021-07-09 00:15:10Deep learning 在训练的时候往往有很多 trick ,不可否认这些 trick 也是 DL 成功的关键因素之一,所谓 “the devil is in the details”...Deep learning 在训练的时候往往有很多 trick ,不可否认这些 trick 也是 DL 成功的关键因素之一,所谓 “the devil is in the details” 。
除了 batch 大小的改变以及初始化等 trick ,还有哪些提升 performance 的利器?
我整理了一些知乎上看到的高赞回答和文章,希望对你有所帮助。
回答一
作者:DOTA
https://zhuanlan.zhihu.com/p/352971645
Focal Loss
针对类别不平衡问题,用预测概率对不同类别的loss进行加权。Focal loss对CE loss增加了一个调制系数来降低容易样本的权重值,使得训练过程更加关注困难样本。
loss = -np.log(p) loss = (1-p)^G * loss
Dropout
随机丢弃,抑制过拟合,提高模型鲁棒性。
Normalization
Batch Normalization 于2015年由 Google 提出,开 Normalization 之先河。其规范化针对单个神经元进行,利用网络训练时一个 mini-batch 的数据来计算该神经元的均值和方差,因而称为 Batch Normalization。
x = (x - x.mean()) / x.std()
relu
用极简的方式实现非线性激活,缓解梯度消失。
x = max(x, 0)
Cyclic LR
每隔一段时间重启学习率,这样在单位时间内能收敛到多个局部最小值,可以得到很多个模型做集成。
scheduler = lambda x: ((LR_INIT-LR_MIN)/2)*(np.cos(PI*(np.mod(x-1,CYCLE)/(CYCLE)))+1)+LR_MIN
With Flooding
当training loss大于一个阈值时,进行正常的梯度下降;当training loss低于阈值时,会反过来进行梯度上升,让training loss保持在一个阈值附近,让模型持续进行"random walk",并期望模型能被优化到一个平坦的损失区域,这样发现test loss进行了double decent。
flood = (loss - b).abs() + b
Group Normalization
Face book AI research(FAIR)吴育昕-恺明联合推出重磅新作Group Normalization(GN),提出使用Group Normalization 替代深度学习里程碑式的工作Batch normalization。一句话概括,Group Normbalization(GN)是一种新的深度学习归一化方式,可以替代BN。
def GroupNorm(x, gamma, beta, G, eps=1e-5): # x: input features with shape [N,C,H,W] # gamma, beta: scale and offset, with shape [1,C,1,1] # G: number of groups for GN N, C, H, W = x.shape x = tf.reshape(x, [N, G, C // G, H, W]) mean, var = tf.nn.moments(x, [2, 3, 4], keep dims=True) x = (x - mean) / tf.sqrt(var + eps) x = tf.reshape(x, [N, C, H, W]) return x * gamma + beta
Label Smoothing
Label smoothing将 hard label 转变成 soft label ,使网络优化更加平滑。标签平滑是用于深度神经网络(DNN)的有效正则化工具,该工具通过在均匀分布和hard标签之间应用加权平均值来生成soft标签。它通常用于减少训练DNN的过拟合问题并进一步提高分类性能。
targets = (1 - label_smooth) * targets + label_smooth / num_classes
Wasserstein GAN
彻底解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度
基本解决了Collapse mode的问题,确保了生成样本的多样性训练过程中终于有一个像交叉熵、准确率这样的数值来指示
训练的进程,数值越小代表GAN训练得越好,代表生成器产生的图像质量越高
不需要精心设计的网络架构,最简单的多层全连接网络就可以做到以上3点。
Skip Connection
一种网络结构,提供恒等映射的能力,保证模型不会因网络变深而退化。
F(x) = F(x) + x
回答二
作者:永无止境 https://www.zhihu.com/question/30712664/answer/1341368789
在噪声较强的时候,可以考虑采用软阈值化作为激活函数:
软阈值化几乎是降噪的必备步骤,但是阈值τ该怎么设置呢?
阈值τ不能太大,否则所有的输出都是零,就没有意义了。而且,阈值不能为负。
针对这个问题,深度残差收缩网络提供了一个思路,设计了一个特殊的子网络来自动设置:
文章一
作者:DLing
https://zhuanlan.zhihu.com/p/359960152
作为一个CV算法工程师,当一只脚踏入这一行大门的时候,你的领路人就会像神父一样,非常庄重的跟你说:“X先生,从今天开始,你就要和这一堆堆数据‘结婚’了,以后无论对方是否漂亮,干净,整洁,你都会不离不弃,永远爱她,维护着她,对她负责吗?”我相信,一个个激情满满的萌新算法工程师们想都不会想,一口一个“我会的,我对她们至死不渝。”每每想到这,我的心情就会像那个神父一样,嘴上祝福,心里想:我看你能坚持到什么时候?
算法工程师和数据之间的相爱相杀,一直是行业的共识,“成也数据,败也数据”其实是件很难受的事情,让算法工程师们饱受折磨和挫败感。虽然说现在搞深度学习的烂大街,但是其实门槛还是挺高的,一般公司,做这一块的基本是硕士起步,好一点的公司,可能还得名校硕士起步。但是处理数据,却是行业需要面临的通用问题,一个个憧憬进入各自行业大展拳脚,用“毕生所学”为社会发光发热的天之骄子们,最后发现工作中30%以上的时间是在看数据,筛数据,时间一久,肯定心性就被磨没了。
我自己也是个算法工程师,深知这里面有多少辛酸,所以,工作之余,我就在想,难道这东西就没有解决办法吗?拿这么长的时间去研究新技术,提升工程性能不香吗?天天看数据,看着看着就睡着了,还要被领导怼。终于,有一天灵光一闪,打比赛的时候,经常有人累死累活调一个模型,但是提交结果的时候,准确率不理想,而有些人使用模型融合,随便训几个模型,轻轻松松指标就很高,最后拿奖,导致很多比赛都禁止使用多模型融合的方法了。既然模型融合那么有效,我是不是可以把他用在数据挑选与清洗中?最后在工程实践中,发现确实是行之有效的。
正常的模型优化中,有以下两个方向是经常会碰到的:模型加数据迭代优化以及模型数据清洗。今天就以这两个方向为例,细致的讲一下,如何使用模型融合的方式去自动做,并达到不错的效果,节约算法工程师宝贵的时间。
模型加数据迭代优化
一般一个项目为了快速上线,初始模型效果不会特别好,基本功能能用就上,美其名曰“勤发版,勤迭代,小步快跑”,所以后续的持续优化必不可少。项目上线后,可以拿到的数据源源不断,但是怎么高效的从海量数据中找到自己想要的去优化模型却是件很值得思考的事。一般情况下,算法工程师往训练集里加数据优化模型会有两个套路,一个是无差别添数据,来多少加多少,不是说模型效果不好么?来来来,给你加十万,看你好不好;还有一个是只添外部反馈错误数据,项目上或者测试反馈了有一批错误数据,你看看要不要优化一下?但是这两种方式都各有弊端:
1) 无差别添数据;这种方式最大的弊端就是成本太高,不管是给数据标注的经济成本,还是等待数据标注的时间成本都很高,而且这种方式会给数据集带来很多的无用数据(就是目前模型效果已经很好的数据),让数据集变的臃肿,后期维护和训练起来,都更麻烦。
2) 只添外部反馈错误数据;这种方式也有弊端,就是模型迭代的很慢,而且也很被动,会永远被项目牵着走,没有主动性。
而这部分要讲的方法,就可以同时解决以上两种问题,可以将提前发现问题,并且提升算法工程师的工程效率,节约项目成本。下文以分类模型做示例:
前期需要准备两种模型,第一种是工程中在使用的模型,这个比较简单,工程中拿来用就行。重要的是第二种,用于进行模型融合的模型,这个模型的数量任意,理论上越多越好(本文示例用俩),建议模型结构之间拥有一定的差异,然后就是用选好的模型在原有模型数据集上进行训练,得到新的用于模型融合的模型,然后结合海量用于优化的数据,就可以开启高效的模型迭代优化了,具体方法如下:
根据数据集特性,对原始训练数据集进行一定的扩增,一般的crop,旋转,颜色抖动等就可以,主要还是看数据集是否合适这样的扩增;
使用选择好的模型,在上步中的数据集上进行训练,并得到相应的模型;
准备好用于优化模型的候选数据,然后一条条处理,按照上面训练模型时候的数据扩增方式,将img扩展成img1,...,imgn,然后分别用步骤2得到的模型进行推理,得到特征feature11,...,feature1n,feature21,...,feature2n; 当然,这个特征是指模型最后输出的特征,是使用softmax之前的特征还是softmax之后的概率随意,我个人喜欢用之前的特征;
将上一步获取到的特征进行融合(加权平均融合,不同模型不同权重都随意,我是喜欢简单点,加权平均),得到新的特征, 然后对新得到的特征进行softmax计算,得到最后的融合概率(上步直接取softmax后的概率的话,就不用求融合概率了);
后面就是依据上一步得到的每一类的概率以及工程模型推理的结果,如果工程模型得到的结果和融合模型一致,且得分很高,则认为工程中的模型对这条数据已经预测的很好了,不加进训练集训练也没啥问题;其余的则需要单独拎出来,并使用融合模型的结果给其打上标签,到时候人工复核下标签后,加入模型训练;
以上的步骤,在初始模型得到后,运行个几次,基本就能得到一个泛化能力还不错,准确率也还不错的模型,后面再定期迭代,基本可以保证这个模型长期的效果。
模型数据集清洗
除了模型的正常迭代,在模型优化过程中,还有一个特别重要的任务,这就是模型数据集的清洗。限于不同人对任务的理解,数据标注人员的标注质量,模型各届负责人的做事方法与责任心等等原因,算法工程师接到一个模型优化任务后,经常发现模型指标一直上不去,最后找来找去才发现是数据集问题,里面一堆的问题数据,但是一看数据集,动则几十万的数据集后,即使想清理,也是有心无力。这个时候,融合模型就又可以派上大用处了,具体方法如下:
和上文一样,准备N个模型,正常两个即可;然后将模型的原始数据集分成K(K>1)份,用于后续的模型训练和数据清洗;
每次使用K份中的一份作为训练集,其余作为测试集,训练集按照上文的方法进行数据扩增和模型训练,即最后可以获取到K组模型,每份模型中都有N组子模型;
依据上步得到的模型组合,对数据集进行K轮清洗,每一轮清洗的数据为当前子模型对应的测试集。当当前测试数据通过该组子模型融合后的结果与其标签一致(具体融合方法见上文),且得分超过设定阈值,则认为此数据标签正确,否则,需要把这个数据单独拎出;
经过K轮测试后,相当于原始数据中每一条数据都被各自的融合模型测试了K-1次,此时设置一个阈值,在整个测试过程中,该条数据被拎出的次数小于阈值,则认为该数据标签确认正确,否则由人工确认。
各种 trick,都是靠着经验积累,总结得来的,多学多练。公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
个人微信
备注:昵称+学校/公司+方向
如果没有备注不拉群!
拉你进AI蜗牛车交流群
-
深度学习有哪些trick?
2021-07-05 10:51:54作者丨DOTA、永无止境、冯迁来源丨知乎问答编辑丨极市平台导读Deep learning在训练的时候往往有很多trick,不可否认这些trick也是DL成功的关键因素之一,所谓“the ...作者丨DOTA、永无止境、冯迁
来源丨知乎问答
编辑丨极市平台
导读
Deep learning在训练的时候往往有很多trick,不可否认这些trick也是DL成功的关键因素之一,所谓“the devil is in the details”。除了batch大小的改变以及初始化等trick,还有哪些提升performance的利器?
问答来源:https://www.zhihu.com/question/30712664
# 回答一
作者:DOTA
京东算法工程师
来源链接:https://zhuanlan.zhihu.com/p/352971645
还是蛮多的,之前总结过一次,在这里搬运一下,DOTA:大道至简:算法工程师炼丹Trick手册
https://zhuanlan.zhihu.com/p/352971645
Focal Loss
针对类别不平衡问题,用预测概率对不同类别的loss进行加权。Focal loss对CE loss增加了一个调制系数来降低容易样本的权重值,使得训练过程更加关注困难样本。
loss = -np.log(p) loss = (1-p)^G * loss
Dropout
随机丢弃,抑制过拟合,提高模型鲁棒性。
Normalization
Batch Normalization 于2015年由 Google 提出,开 Normalization 之先河。其规范化针对单个神经元进行,利用网络训练时一个 mini-batch 的数据来计算该神经元的均值和方差,因而称为 Batch Normalization。
x = (x - x.mean()) / x.std()
relu
用极简的方式实现非线性激活,缓解梯度消失。
x = max(x, 0)
Cyclic LR
每隔一段时间重启学习率,这样在单位时间内能收敛到多个局部最小值,可以得到很多个模型做集成。
scheduler = lambda x: ((LR_INIT-LR_MIN)/2)*(np.cos(PI*(np.mod(x-1,CYCLE)/(CYCLE)))+1)+LR_MIN
With Flooding
当training loss大于一个阈值时,进行正常的梯度下降;当training loss低于阈值时,会反过来进行梯度上升,让training loss保持在一个阈值附近,让模型持续进行"random walk",并期望模型能被优化到一个平坦的损失区域,这样发现test loss进行了double decent。
flood = (loss - b).abs() + b
Group Normalization
Face book AI research(FAIR)吴育昕-恺明联合推出重磅新作Group Normalization(GN),提出使用Group Normalization 替代深度学习里程碑式的工作Batch normalization。一句话概括,Group Normbalization(GN)是一种新的深度学习归一化方式,可以替代BN。
def GroupNorm(x, gamma, beta, G, eps=1e-5): # x: input features with shape [N,C,H,W] # gamma, beta: scale and offset, with shape [1,C,1,1] # G: number of groups for GN N, C, H, W = x.shape x = tf.reshape(x, [N, G, C // G, H, W]) mean, var = tf.nn.moments(x, [2, 3, 4], keep dims=True) x = (x - mean) / tf.sqrt(var + eps) x = tf.reshape(x, [N, C, H, W]) return x * gamma + beta
Label Smoothing
abel smoothing将hard label转变成soft label,使网络优化更加平滑。标签平滑是用于深度神经网络(DNN)的有效正则化工具,该工具通过在均匀分布和hard标签之间应用加权平均值来生成soft标签。它通常用于减少训练DNN的过拟合问题并进一步提高分类性能。
targets = (1 - label_smooth) * targets + label_smooth / num_classes
Wasserstein GAN
彻底解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度
基本解决了Collapse mode的问题,确保了生成样本的多样性训练过程中终于有一个像交叉熵、准确率这样的数值来指示
训练的进程,数值越小代表GAN训练得越好,代表生成器产生的图像质量越高
不需要精心设计的网络架构,最简单的多层全连接网络就可以做到以上3点。
Skip Connection
一种网络结构,提供恒等映射的能力,保证模型不会因网络变深而退化。
F(x) = F(x) + x
参考文献
https://www.zhihu.com/question/427088601
https://arxiv.org/pdf/1701.07875.pdf
https://zhuanlan.zhihu.com/p/25071913
https://www.zhihu.com/people/yuconan/posts
# 回答二
作者:永无止境
来源链接:
https://www.zhihu.com/question/30712664/answer/1341368789在噪声较强的时候,可以考虑采用软阈值化作为激活函数:
软阈值化几乎是降噪的必备步骤,但是阈值τ该怎么设置呢?
阈值τ不能太大,否则所有的输出都是零,就没有意义了。而且,阈值不能为负。
针对这个问题,深度残差收缩网络[1][2]提供了一个思路,设计了一个特殊的子网络来自动设置:
Zhao M, Zhong S, Fu X, Tang B, Pecht M. Deep residual shrinkage networks for fault diagnosis. IEEE Transactions on Industrial Informatics. 2019 Sep 26;16(7):4681-90.
参考:
^深度残差收缩网络:从删除冗余特征的灵活度进行探讨 https://zhuanlan.zhihu.com/p/118493090
^深度残差收缩网络:一种面向强噪声数据的深度学习方法 https://zhuanlan.zhihu.com/p/115241985
# 回答三
作者:冯迁
来源链接:https://www.zhihu.com/question/30712664/answer/1816283937
赞比较多的给了些,损失函数(focal),模型结构(identity skip),训练方面(strategy on learning rate),稳定性方面(normalization),复杂泛化性(drop out),宜优化性(relu,smooth label)等,这些都可以扩展。
focal 可以扩展到centernet loss,结构有尺度fpn,重复模块,堆叠concatenate,splite,cross fusion等,训练方面有teaching,step learning,对抗(本身是个思想),多阶段优化,progress learning,稳定性方面,batch normal,instance normal,group normal之外,还有谱范数等,复杂性还有正则l1/2等,宜优化性,可以扩展到检测的anchor等。
dl你得说优化器吧,把动量,一二阶考虑进来,梯度方向和一阶动量的折中方向,把随机考虑进来sgd
以上可能带来最多10的收益,你得搞数据啊
数据方面的处理clean,various ,distribution,aug data等更重要(逃…
“理论”在收敛速度,稳定,泛化,通用,合理等方面着手,性能在数据方面着手,也许
本文仅做学术分享,如有侵权,请联系删文。
下载1
在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。
下载2
在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。
下载3
在「3D视觉工坊」公众号后台回复:相机标定,即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配,即可下载独家立体匹配学习课件与视频网址。
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~
-
trick-plugin:将Trick整合到Jenkins中
2021-05-14 07:13:57dev分支是Trick插件的主要开发分支。 从dev克隆以创建功能/主题分支是首选方法。 为插件做贡献 插件源代码托管在。 新功能建议和错误修复应作为提交。 在GitHub上克隆存储库,准备对本地存储库的更改,然后提交拉取... -
深度学习调参trick 调参技巧
2021-12-17 18:01:54深度学习调参trick 调参技巧|公|众|号| 包包算法笔记
事情的起因其实这样,实验室老同学的论文要冲分,问我有没有啥在NN上,基本都有用的刷点方法,最好是就是短小精悍,代码量不大,不需要怎么调参。
一般通用的trick都被写进论文和代码库里了,
像优秀的优化器,学习率调度方法,数据增强,dropout,初始化,BN,LN,确实是调参大师的宝贵经验,大家平常用的也很多。
除了这些,天底下还有这样的好事?
确实有一些这样的方法的,他们通用,简单。根据我的经验,在大多数的数据上都有效。
一、对抗训练
第一个,对抗训练。
对抗训练就是在输入的层次增加扰动,根据扰动产生的样本,来做一次反向传播。
以FGM为例,在NLP上,扰动作用于embedding层。
给个即插即用代码片段吧,引用了知乎id:Nicolas的代码,写的不错,带着看原理很容易就明白了。
# 初始化 fgm = FGM(model) for batch_input, batch_label in data: # 正常训练 loss = model(batch_input, batch_label) loss.backward() # 反向传播,得到正常的grad # 对抗训练 fgm.attack() # 在embedding上添加对抗扰动 loss_adv = model(batch_input, batch_label) loss_adv.backward() # 反向传播,并在正常的grad基础上,累加对抗训练的梯度 fgm.restore() # 恢复embedding参数 # 梯度下降,更新参数 optimizer.step() model.zero_grad()
具体FGM的实现
import torch class FGM(): def __init__(self, model): self.model = model self.backup = {} def attack(self, epsilon=1., emb_name='emb.'): # emb_name这个参数要换成你模型中embedding的参数名 for name, param in self.model.named_parameters(): if param.requires_grad and emb_name in name: self.backup[name] = param.data.clone() norm = torch.norm(param.grad) if norm != 0 and not torch.isnan(norm): r_at = epsilon * param.grad / norm param.data.add_(r_at) def restore(self, emb_name='emb.'): # emb_name这个参数要换成你模型中embedding的参数名 for name, param in self.model.named_parameters(): if param.requires_grad and emb_name in name: assert name in self.backup param.data = self.backup[name] self.backup = {}
二、EMA
第二个,EMA(指数滑动平均)
移动平均,保存历史的一份参数,在一定训练阶段后,拿历史的参数给目前学习的参数做一次平滑。这个东西,我之前在earhian的祖传代码里看到的。他喜欢这东西+衰减学习率。确实每次都有用。
代码引用博客:https://fyubang.com/2019/06/01/ema/
# 初始化 ema = EMA(model, 0.999) ema.register() # 训练过程中,更新完参数后,同步update shadow weights def train(): optimizer.step() ema.update() # eval前,apply shadow weights;eval之后,恢复原来模型的参数 def evaluate(): ema.apply_shadow() # evaluate ema.restore()
具体EMA实现,即插即用:
class EMA(): def __init__(self, model, decay): self.model = model self.decay = decay self.shadow = {} self.backup = {} def register(self): for name, param in self.model.named_parameters(): if param.requires_grad: self.shadow[name] = param.data.clone() def update(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.shadow new_average = (1.0 - self.decay) * param.data + self.decay * self.shadow[name] self.shadow[name] = new_average.clone() def apply_shadow(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.shadow self.backup[name] = param.data param.data = self.shadow[name] def restore(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.backup param.data = self.backup[name] self.backup = {}
三、TTA
第三个,TTA。
这个一句话说明白,测试时候构造靠谱的数据增强,简单一点的数据增强方式比较好,然后把预测结果加起来算个平均。
这个实现实在是比较简单,就不贴代码了。
四、伪标签
第四个,伪标签学习。
这个也一句话说明白,就是用训练的模型,把测试数据,或者没有标签的数据,推断一遍。构成伪标签,然后拿回去训练。注意不要leak。
下面那个老图,比较形象。
五、特定样本处理
第五个,特定样本处理。
说这个通用勉强一点,但确实在这类数据上基本都有效。
就是小样本,长尾样本,或者模型不太有把握的样本。把分类过程为根据特征检索的过程。
用向量表征去查找最近邻样本。
这块,有个ICLR2020的文章写的比较好,facebook的老哥把几种典型的方法整理了一下,具体可以参考:
https://arxiv.org/abs/1910.09217
历史精彩文章:
Kaggle GM qrfaction:数据竞赛方法论看这一篇就够了
-
trick
2019-01-11 11:43:511、一般说的BN操作是指caffe中的BatchNorm+Scale use_global_states:默认是true【在src/caffe/caffe.proto】表示是否使用caffe内部的均值和方差 训练时:use_global_states:false 测试时:use_global_states:... -
强化学习待解决问题和主流Trick整理
2021-05-15 21:59:04文章目录一、待解决问题二、DRL主流Trick2.1 主流Trick应用场景2.1 序贯决策导致的非独立同分布问题2.2 Policy随Target震荡而震荡问题2.3 Target过估计从而影响策略问题2.4 数据采样效率问题三、典型DRL算法总结四、... -
Hat_Trick_The Catch Game.unitypackage
2018-02-26 10:43:02Hat Trick是Unity官方商店提供的5.5.0版本以上的一款游戏Demo。 -
【毕设】基于CycleGAN的风格迁移【四】训练模型的Trick
2022-05-04 16:34:09Trick1:Label平滑 如果有两个目标label:Real=1 和 Fake=0,那么对于每个新样本,如果是real,那么把label替换为0.7~1.2之间的随机值;如果样本是fake,那么把label替换为0.0~0.3之间的随机值。 在models/... -
魏秀参CNN book trick深度学习调参技巧
2018-10-08 23:17:29魏秀参CNN book, 以及cnn trick。深度学习书和调参技巧ppt -
神经网络训练trick总结
2020-04-25 11:03:00这里讲一些最简单的trick,肯定不全面,欢迎大家留言补充。因为我也是新手! 下面介绍一些值得注意的部分,有些简单解释原理,具体细节不能面面俱到,请参考专业文章。 那我们直接从拿到一个问题决定用神经网络说起... -
B Card Trick
2022-05-24 10:11:32Card Trick time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Monocarp has just learned a new card trick, and can’t wait to present it to you. ...