数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
五、自适应学习率算法
假设代价函数高度敏感于参数空间中的某些方向,则优化算法最好针对不同的参数设置不同的学习率。
- 代价函数变化明显的参数方向(偏导数较大):学习率较小,使得更新的步长较小。
- 代价函数变化不明显的参数方向(偏导数较小):学习率较大,使得更新的步长较大。
对于标准的
batch
梯度下降优化算法,沿着负梯度的方向就是使得代价函数下降的方向。- 如果不同的方向设置了不同的学习率,则前进的方向不再是负梯度方向,有可能出现代价函数上升。
- 对于
mini-batch
梯度下降,由于对梯度引入了躁扰,因此可以针对不同的方向设置不同的学习率。
选择哪个算法并没有一个统一的共识,并没有哪一个算法表现的最好。
目前流行的优化算法包括:
SGD
,具有动量的SGD
,RMSProp
,AdaDelta
,Adam
。选用哪个算法似乎主要取决于使用者对于算法的熟悉程度,以便调节超参数。
5.1 delta-bar-delta
delta-bar-delta
算法是一个自适应学习率的算法,其策略是:对于代价函数,如果其偏导数保持相同的符号,则该方向的学习率应该增加;如果偏导数变化了符号,则该方向的学习率应该减小。偏导数符号变化,说明更新的方向发生了反向。如果此时降低了学习率,则会对震荡执行衰减,会更有利于到达平衡点(偏导数为0的位置)。
delta-bar-delta
算法只能用于标准的梯度下降中。mini-batch
算法对于梯度的估计不是精确的,因此对于正负号的判断会出现较大偏差。对于
mini-batch
随机梯度下降,有一些自适应学习率的算法。包括:AdaGrad、RMSProp、Adam
等算法。
5.2 AdaGrad
AdaGrad
算法会独立设置参数空间每个轴方向上的学习率。- 如果代价函数在某个方向上具有较大的偏导数,则这个方向上的学习率会相应降低。
- 如果代价函数在某个方向上具有较小的偏导数,则这个方向上的学习率会相应提高。
$ \mathbf{\vec r}\leftarrow \mathbf{\vec r}+\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}}\\ \vec\theta \leftarrow \vec\theta -\frac{\epsilon}{ \sqrt{{\mathbf{\vec r}}}}\odot\hat{\mathbf{\vec g}} $AdaGrad
算法的思想是:参数空间每个方向的学习率反比于某个值的平方根。这个值就是该方向上梯度分量的所有历史平方值之和。其中 $ \odot $ 表示两个向量的逐元素的相乘。
- 用平方和的平方根而不是均值,因为分量可能为负值。
- 用历史结果累加,因为考虑的是该方向上的平均表现,而不仅仅是单次的表现。
AdaGrad
算法:输入:
- 全局学习率 $ \epsilon $
- 初始参数 $ \vec\theta_0 $
- 小常数 $ \delta $ (为了数值稳定,大约为 $ 10^{-7} $ )
算法步骤:
初始化梯度累计变量 $ \mathbf{\vec r}=\mathbf{\vec 0} $
迭代,直到停止条件。迭代步骤为:
从训练集中随机采样 $ m $ 个样本 $ \{\mathbf{\vec x}_1,\mathbf{\vec x}_2,\cdots,\mathbf{\vec x}_m\} $ 构成
mini-batch
,对应的标记为 $ \{y_1,y_2,\cdots,y_m\} $ 。计算
$ \hat{\mathbf{\vec g}}\leftarrow \frac 1m \nabla_{\vec\theta}\sum_{i=1}^{m}L(f(\mathbf{\vec x}_i;\vec\theta),y_i) $mini-batch
上的梯度作为训练集的梯度的估计:累计平方梯度: $ \mathbf{\vec r}\leftarrow \mathbf{\vec r}+\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}} $
计算更新(逐元素): $ \Delta\vec\theta\leftarrow -\frac{\epsilon}{\delta+\sqrt{{\mathbf{\vec r}}}}\odot\hat{\mathbf{\vec g}} $
更新参数: $ \vec\theta \leftarrow \vec\theta+\Delta\vec\theta $
由于随迭代次数的增加, $ r_i $ 的值也会增加,因此 $ \frac{\epsilon}{\delta+\sqrt{{\mathbf{\vec r}}}} $ 随着迭代的推进而降低。这起到了一个学习率衰减的效果。
另一方面,不同方向的分量 $ r_i $ 不同,平均来说梯度分量越大的方向的学习率下降的最快。这起到了一个自适应的效果。
效果:
在凸优化中,
AdaGrad
算法效果较好。AdaGrad
算法在某些深度学习模型上效果不错,但大多数情况下效果不好。在训练深度神经网络模型的实践中发现:
AdaGrad
学习速率减小的时机过早,且减小的幅度过量。因为学习率与历史梯度的平方和的开方成反比,导致过快、过多的下降。
5.3 RMSProp
5.3.1 RMSProp 原始算法
$ \mathbf{\vec r}\leftarrow \rho\mathbf{\vec r}+(1-\rho)\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}}\\ \vec\theta \leftarrow \vec\theta -\frac{\epsilon}{ \sqrt{\mathbf{\vec r}}}\odot\hat{\mathbf{\vec g}} $RMSProp
是AdaGrad
的一个修改:将梯度累计策略修改为指数加权的移动平均。其中 $ \rho $ 为衰减速率,它决定了指数加权移动平均的有效长度。
标准的
RMSProp
算法:输入:
- 全局学习率 $ \epsilon $
- 衰减速率 $ \rho $
- 初始参数 $ \vec\theta_0 $
- 小常数 $ \delta $ (为了数值稳定,大约为 $ 10^{-6} $ )
算法步骤:
初始化梯度累计变量 $ \mathbf{\vec r}=\mathbf{\vec 0} $
迭代,直到停止条件。迭代步骤为:
从训练集中随机采样 $ m $ 个样本 $ \{\mathbf{\vec x}_1,\mathbf{\vec x}_2,\cdots,\mathbf{\vec x}_m\} $ 构成
mini-batch
,对应的标记为 $ \{y_1,y_2,\cdots,y_m\} $ 。计算
$ \hat{\mathbf{\vec g}}\leftarrow \frac 1m \nabla_{\vec\theta}\sum_{i=1}^{m}L(f(\mathbf{\vec x}_i;\vec\theta),y_i) $mini-batch
上的梯度作为训练集的梯度的估计:累计平方梯度: $ \mathbf{\vec r}\leftarrow \rho\mathbf{\vec r}+(1-\rho)\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}} $
计算更新(逐元素): $ \Delta\vec\theta\leftarrow -\frac{\epsilon}{\delta+\sqrt{\mathbf{\vec r}}}\odot\hat{\mathbf{\vec g}} $
更新参数: $ \vec\theta \leftarrow \vec\theta+\Delta\vec\theta $
实践证明
RMSProp
是一种有效、实用的深度神经网络优化算法,目前它是深度学习业界经常采用的优化方法之一。
5.3.2 RMSProp 原始算法性质
假设迭代过程中,梯度刚好是固定的某个量,令 $ \mathbf{\vec c}=\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}} $ 。对于某个方向,假设其分量为 $ c=g^2 $ 。
对于
RMSProp
算法:根据等比数列求和公式,该方向的比例因子为: $ r=c\left(1-\rho^{\tau}\right) $ ,其中 $ \tau $ 为迭代次数。该方向的学习率为:
$ \bar \epsilon=\frac{\epsilon}{\delta+\sqrt{c(1-\rho^\tau)}} $- 随着 $ \tau $ 的增大, $ \bar\epsilon $ 会减小,因为分母在增加。
- $ r $ 在 $ \tau $ 逐渐增大时,从 $ c(1-\rho) $ 增加到 $ c $ ,其取值范围有限。它使得 $ \bar\epsilon $ 取值从 $ \frac{\epsilon}{\delta+\sqrt{c(1-\rho)}} $ 降低到 $ \frac{\epsilon}{\delta+\sqrt{c}} $ 。
当某个方向的导数 $ g $ 相对于 $ \delta $ 较大时,更新步长为(考虑到 $ r=g^2(1-\rho^\tau) $ ):
$ \frac{\epsilon}{\delta+\sqrt{r}}g\sim \frac{\epsilon}{\sqrt{1-\rho^\tau}} $- 它与梯度无关,只与迭代次数 $ \tau $ 有关。
- 随着 $ \tau $ 增大,从 $ \frac{\epsilon}{\sqrt{1-\rho}} $ 降低到 $ \epsilon $ 。
RMSProP
算法确保了在梯度较大时,学习的步长不会很小。
当导数 $ g $ 非常小以至于和 $ \delta $ 相差无几时,此时更新步长与梯度有关。
但是由于此时梯度非常小,算法可能已经收敛。
对于
AdaGrad
算法的情况:根据等差数列的求和公式,该方向的比例因子为: $ r=\tau c $ ,其中 $ \tau $ 为迭代次数。该方向的学习率为:
$ \bar\epsilon=\frac{\epsilon}{\delta+\sqrt{\tau c}} $- 随着 $ \tau $ 的增大, $ \bar\epsilon $ 会减小,因为分母在增加。
- $ r $ 在 $ \tau $ 逐渐增大时,从 $ c $ 增加到 $ +\infty $ 。从而使得 $ \bar\epsilon $ 取值从 $ \frac{\epsilon}{\delta+\sqrt{c}} $ 降低到 $ 0 $ 。
当该方向的梯度对于 $ \delta $ 较大时,更新步长为:
$ \frac{\epsilon}{\delta+\sqrt{r}}g\sim \frac{\epsilon}{\sqrt{\tau}} $它与梯度无关,只与迭代次数 $ \tau $ 有关。随着 $ \tau $ 增大,从 $ \epsilon $ 降低到 $ 0 $ 。
因此,即使此时的梯度仍然较大,学习的步长仍然接近 0 。
RMSProp
算法vs AdaGrad
算法:AdaGrad
算法中,随着迭代次数的增加,其学习率降低到 0。 而RMSProp
算法中,学习率降低到一个较大的渐进值 $ \frac{\epsilon}{\delta+\sqrt{c}} $ 。AdaGrad
算法中,随着迭代次数的增加,更新步长降低到 0 。而RMSProp
算法中,更新步长降低到一个较大的值 $ \epsilon $ 。
5.3.3 RMSProp 动量算法
RMSProp
也可以结合Nesterov
动量算法。本质上
Nesterov
算法(包括其他的动量算法)是关于如何更新参数 $ \vec\theta $ 的算法,它并不涉及任何学习率 $ \epsilon $ 的选取。RMSProp
算法是关于如何选取学习率 $ \epsilon $ 的算法,它并不涉及如何更新参数 $ \vec\theta $ 。因此二者可以结合。RMSProp
动量算法输入:
- 全局学习率 $ \epsilon $
- 衰减速率 $ \rho $
- 动量系数 $ \alpha $
- 初始参数 $ \vec\theta_0 $
- 初始速度 $ \mathbf{\vec v}_0 $
算法步骤:
初始化梯度累计变量 $ \mathbf{\vec r}=\mathbf{\vec 0} $
迭代,直到停止条件。迭代步骤为:
从训练集中随机采样 $ m $ 个样本 $ \{\mathbf{\vec x}_1,\mathbf{\vec x}_2,\cdots,\mathbf{\vec x}_m\} $ 构成
mini-batch
,对应的标记为 $ \{y_1,y_2,\cdots,y_m\} $计算临时更新: $ \tilde {\vec\theta}\leftarrow \vec\theta+\alpha\mathbf{\vec v} $
这是因为
Nesterov
动量算法使用更新后的参数来计算代价函数。如果使用原始的动量算法,则不需要这一步。计算
$ \hat{\mathbf{\vec g}}\leftarrow \frac 1m \nabla_{\tilde{\vec\theta}}\sum_{i=1}^{m}L(f(\mathbf{\vec x}_i;\tilde{\vec\theta}),y_i) $mini-batch
上的梯度作为训练集的梯度的估计:累计平方梯度: $ \mathbf{\vec r}\leftarrow \rho\mathbf{\vec r}+(1-\rho)\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}} $
计算速度更新(逐元素): $ \mathbf{\vec v}\leftarrow \alpha\mathbf{\vec v}-\frac{\epsilon}{\sqrt{\mathbf{\vec r}}}\odot\hat{\mathbf{\vec g}} $
更新参数: $ \vec\theta \leftarrow \vec\theta+\mathbf{\vec v} $
5.3.4 AdaDelta
AdaDelta
也是AdaGrad
的一个修改。AdaDelta
将梯度平方和的累计策略修改为:只考虑过去窗口 $ window $ 内的梯度。RMSProp
可以认为是一种软化的AdaDelta
,衰减速率 $ \rho $ 决定了一个软窗口: $ window = \frac 1{1-\rho} $ 。- 加权梯度平方和主要由 $ window $ 内的梯度决定。
- 更早的梯度由于衰减,其贡献非常小。
5.4 Adam
Adam
来自于Adaptive moments
,它是另一种引入了动量的RMSProp
算法。
5.4.1 Adam 算法
Adam
算法:输入:
- 学习率 $ \epsilon $ (建议默认为 0.001)
- 矩估计的指数衰减速率 $ \rho_1,\rho_2 $ ,它们都位于区间 $ [0,1) $ (建议默认值分别为: 0.9 和 0.999)
- 用于数值稳定的小常数 $ \delta $ (建议默认为 $ 10^{-8} $ )
- 初始参数 $ \vec\theta_0 $
算法步骤:
初始化一阶和二阶矩变量 $ \mathbf{\vec s}=\mathbf{\vec 0,\mathbf{\vec r}=\mathbf{\vec 0}} $
初始化时间步 $ t=0 $
迭代,直到停止条件。迭代步骤为:
从训练集中随机采样 $ m $ 个样本 $ \{\mathbf{\vec x}_1,\mathbf{\vec x}_2,\cdots,\mathbf{\vec x}_m\} $ 构成
mini-batch
,对应的标记为 $ \{y_1,y_2,\cdots,y_m\} $计算
$ \hat{\mathbf{\vec g}}\leftarrow \frac 1m \nabla_{\vec\theta}\sum_{i=1}^{m}L(f(\mathbf{\vec x}_i;\vec\theta),y_i) $mini-batch
上的梯度作为训练集的梯度的估计:$ t\leftarrow t+1 $
更新有偏一阶矩估计: $ \mathbf{\vec s}\leftarrow\rho_1\mathbf{\vec s}+(1-\rho_1)\hat{\mathbf{\vec g}} $ 。
它是梯度的指数加权平均,用于计算梯度。
更新有偏二阶矩估计: $ \mathbf{\vec r}\leftarrow \rho_2\mathbf{\vec r}+(1-\rho_2)\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}} $ 。
它是梯度平方的指数加权平均,用于计算学习率。
修正一阶矩的偏差: $ \hat{\mathbf{\vec s}}\leftarrow \frac{\mathbf{\vec s}}{1-\rho_1^{t}} $ 。
它使得修正之后的结果更接近真实的梯度。
修正二阶矩的偏差: $ \hat{\mathbf{\vec r}}\leftarrow \frac{\mathbf{\vec r}}{1-\rho_2^{t}} $ 。
它使得修正之后的结果更接近真实的梯度平方。
计算更新(逐元素): $ \Delta\vec\theta=- \frac{\epsilon}{\sqrt{\hat{\mathbf{\vec r}}}+\delta} \hat{\mathbf{\vec s}} $
更新参数: $ \vec\theta \leftarrow \vec\theta+\Delta\vec\theta $
RMSProp
算法中,通过累计平方梯度(采用指数移动平均)来修正学习率。而
Adam
算法中,不仅采用同样的方式来修正学习率,还通过累计梯度(采用指数移动平均) 来修正梯度。动量的计算可以类似
Nesterov
动量的思想:计算mini-batch
的梯度时,采用更新后的参数 $ \vec\theta+\Delta\vec\theta $ 。此时称作
NAdam
算法。
5.4.2 Adam 算法性质
假设迭代过程中,梯度刚好是固定的某个量,则有: $ \mathbf{\vec c}=\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}} $ 。对于某个方向,假设其分量为 $ c=g^2 $ ,则对于
$ s=g(1-\rho_1^t)\\ r=c(1-\rho_2^t)\\ \hat s=\frac{s}{1-\rho_1^t}=g\\ \hat r=\frac{r}{1-\rho_2^t}=c\\ \Delta \theta=-\epsilon \frac{\hat s}{\sqrt{\hat r}+\delta}\sim -\epsilon \frac{g}{\sqrt{g^2}}=\epsilon $Adam
算法有:无论梯度的大小如何,
Adam
算法的参数更新步长几乎都是 $ \epsilon $相比较而言,
AdaGrad
和RMSProp
算法的参数更新步长随时间在减少。虽然最终结果不包含 $ \rho_1,\rho_2 $ ,但是这是由于假定梯度保持不变这一特殊情况推导的。
实际中梯度很少保持不变,因此 $ \rho_1,\rho_2 $ 还是比较重要。
Adam
算法之所以需要使用一阶矩的修正和二阶矩的修正,是为了剔除时间因子 $ t $ 的影响。在某些情况下,
Adam
可能导致训练不收敛。主要原因是:随着时间窗口的变化,遇到的数据可能发生巨变。这就使得 $ \sqrt{\hat r} $ 可能会时大时小,从而使得调整后的学习率 $ \hat \epsilon = \frac{ \epsilon}{\sqrt{\hat r}+\delta} $ 不再是单调递减的。这种学习率的震荡可能导致模型无法收敛。
AdaDelta
、RMSProp
算法也都存在这样的问题。解决方案为:对二阶动量的变化进行控制,避免其上下波动(确保 $ r $ 是单调递增的):
$ \mathbf{\vec r}\leftarrow \max \{\rho_2\mathbf{\vec r}+(1-\rho_2)\hat{\mathbf{\vec g}}\odot\hat{\mathbf{\vec g}},\mathbf{\vec r}\} $实践证明,虽然在训练早期
Adam
具有很好的收敛速度,但是最终模型的泛化能力并不如使用朴素的SGD
训练得到的模型好:Adam
训练的模型得到的测试集误差会更大。其主要原因可能是:训练后期,
Adam
的更新步长过小。一种改进策略为:在训练的初期使用
Adam
来加速训练,并在合适的时期切换为SGD
来追求更好的泛化性能。这种策略的缺陷是:切换的时机不好把握,需要人工经验来干预。
5.5 SGD 及其变种的比较
下图为
SGD
及其不同的变种在代价函数的等高面中的学习过程。这里batch-size
为全体样本大小。AdaGrad
、Adadelta
、RMSprop
从最开始就找到了正确的方向并快速收敛。SGD
找到了正确的方向,但是收敛速度很慢。SGD
的动量算法、Netsterov
动量算法(也叫做NAG
) 最初都偏离了正确方向,但最终都纠正到了正确方向。
下图为
SGD
及其不同的变种在代价函数的鞍点上的学习过程。这里batch-size
为全体样本大小。SGD
、SGD
的动量算法、Netsterov
动量算法(也叫做NAG
) 都受到鞍点的严重影响。SGD
最终停留在鞍点。如果采用
mini-batch
,则mini-batch
引入的梯度噪音,可以使得SGD
能够逃离鞍点。SGD
的动量算法、Netsterov
动量算法最终逃离了鞍点。
Adadelta
、Adagrad
、RMSprop
都很快找到了正确的方向。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论