数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
- 线性模型
- 支持向量机
- 朴素贝叶斯
- 决策树
- knn
- 集成学习
- 梯度提升树
- 数据预处理
- 模型评估
- 降维
- 聚类
- 半监督学习
- EM 算法
- 最大熵算法
- 隐马尔可夫模型
- 概率图与条件随机场
- 边际概率推断
- 主题模型
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- 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
- CRF ++
- lightgbm
- xgboost
- xgboost 使用指南
- scikit-learn
- spark
- numpy
- matplotlib
- matplotlib 使用指南
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
十、Normalization
10.1 batch normalization
-
batch normalization
是优化神经网络的一大创新。- 它并不是一个优化算法,而是一个自适应的、调整参数模型的方法。
- 它试图解决训练非常深的神经网络的困难。
-
深度神经网络训练困难的一个重要原因是:深度神经网络涉及很多层的叠加,而每一层的参数更新会导致上一层的输入数据分布发生变化。这会带来两个问题:
-
下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
-
通过层层叠加,高层的输入分布变化会非常剧烈。这就使得高层需要不断去适应底层的参数更新变化。
这就要求我们需要非常谨慎的设定学习率、初始化权重、参数更新策略。
-
10.1.1 白化
-
在机器学习中,如果数据是独立同分布的,则可以简化模型的训练,提升模型的预测能力。所以通常需要对输入数据进行白化
whitening
。 白化主要实现两个目的:- 去除特征之间的相关性。即:特征之间尽可能的独立。
- 使得所有特征都具有相同的均值和方差。即:特征之间尽可能的同分布。
-
白化操作:
- 首先将输入执行
PCA
降维,这称作PCA
处理。 - 然后在新的空间中,对输入数据的每一维进行标准差归一化处理。
- 首先将输入执行
-
理论上可以对神经网络的每一层的输入执行白化来解决输入数据分布的问题。但是有两个困难:
-
白化操作代价高昂,算法复杂度太大。因为
PCA
处理涉及到协方差矩阵 $ \mathbf X^T\mathbf X $ 的特征值求解,而计算协方差矩阵的算法复杂度为 $ O(N^2\times n^2) $ (不考虑Strassen
算法优化),其中 $ N $ 为数据集样本数量, $ n $ 为特征数量。对于神经网络的训练集,通常 $ N $ 都数以万计甚至百万计,如果在每一层、每一次参数更新都执行白化操作,则不可接受。
-
白化操作不可微,这样反向传播算法无法进行。
因此
batch normalization
就退而求其次,执行简化版的白化:将神经网络的每一层的输入的分布限定其均值和方差。 -
10.1.2 深层网络的参数更新
-
对于一个深层的神经网络,如果同时更新所有层的参数,则可能会发生一些意想不到的后果。
假设有一个深层神经网络,一共有 $ l $ 层,每层只有一个单元,且每个隐层不使用激励函数。则输出为:
$ \hat y=xw_1w_2\cdots w_l $其中 $ w_i $ 为第 $ i $ 层的权重。第 $ i $ 层的输出为: $ h^{}=h^{
}w_i $ 。 令 $ \mathbf{\vec g}=(g_1,g_2,\cdots,g_l)^T=\nabla_{\mathbf{\vec w}}\hat y $ ,其中:
$ g_i=\frac{\partial \hat y}{w_i} = x\prod_{j=1,j\ne i}^{l}w_j $利用梯度下降法更新参数,则有: $ \mathbf{\vec w}\leftarrow \mathbf{\vec w}-\epsilon \mathbf{\vec g} $
-
如果使用 $ \hat y $ 的一阶泰勒近似,则有: $ f(\mathbf{\vec w}-\epsilon \mathbf{\vec g})-f(\mathbf{\vec w})\approx-\epsilon \mathbf{\vec g}^{T}\mathbf{\vec g} $ 。即: $ \hat y $ 的值下降了 $ \epsilon \mathbf{\vec g}^{T}\mathbf{\vec g} $ 。因此梯度下降法一定能够降低 $ \hat y $ 的值。
如果直接按多项式乘法展开,则会考虑 $ \epsilon $ 的二阶、三阶甚至更高阶的项,有:
$ f(\mathbf{\vec w}-\epsilon \mathbf{\vec g})-f(\mathbf{\vec w})=x(w_1-\epsilon g_1)(w_2-\epsilon g_2)\cdots (w_l-\epsilon g_l)-xw_1w_2\cdots w_l\\ = -\epsilon x \sum_{i=1}^{l}\left(g_i\prod_{j=1,j\ne i}^{l}w_j\right)+\epsilon^{2} x \sum_{i=1}^{l}\sum_{j=i}^{l}\left(g_ig_j\prod_{k=1,k\ne i,k\ne j}^{l}w_k\right)+\cdots $考虑到 $ g_i=x\prod_{j=1,j\ne i}^{l}w_j $ ,则有:
$ f(\mathbf{\vec w}-\epsilon \mathbf{\vec g})-f(\mathbf{\vec w})=-\epsilon \mathbf{\vec g}^{T}\mathbf{\vec g}+\epsilon^{2} x \sum_{i=1}^{l}\sum_{j=i}^{l}\left(g_ig_j\prod_{k=1,k\ne i,k\ne j}^{l}w_k\right)+\cdots\\ $-
如果 $ w_i $ 都比较小,则 $ \prod_{k=1,k\ne i,k\ne j}^{l}w_k $ 很小,则二阶项可以忽略不计。
如果 $ w_i $ 都比较大,则该二阶项可能会指数级大。此时很难选择一个合适的学习率,使得 $ f(\mathbf{\vec w}-\epsilon \mathbf{\vec g})-f(\mathbf{\vec w})\lt 0 $ 。
因此某一层中参数更新的效果会取决于其他所有层(即:其它层的权重是不是较大)。
-
虽然二阶优化算法会利用二阶项的相互作用来解决这个问题,但是还有三阶项甚至更高阶项的影响。
-
10.1.3 BN 算法
-
batch normalization
解决了多层之间协调更新的问题,它可以应用于网络的任何输入层或者隐层。 -
设 $ \mathbb H_{mini-batch} = \{\mathbf{\vec h}_1,\mathbf{\vec h}_2,\cdots,\mathbf{\vec h}_m\} $ 为神经网络某层的一个
mini-batch
的输入, $ n $ 为输入的维度。-
首先计算这个
$ \vec \mu= \frac 1m \sum_{i=1}^m \mathbf{\vec h}_i\\ \vec\sigma ^2 = (\sigma_{1}^2,\sigma_{2}^2,\cdots,\sigma_{n}^2)^T,\quad \sigma_{j}^2 = \frac 1m \sum_{i=1}^m (h_{i,j}-\mu_{j})^2 $mini-batch
输入的均值和每维特征的标准差: -
然后对输入进行归一化:
$ \mathbf{\vec h}_i^{<1>} = \frac{\mathbf{\vec h}_i-\vec\mu}{\sqrt{\vec\sigma^2+\epsilon}} $其中 $ \frac{1}{\sqrt{\vec\sigma^2+\epsilon}} $ 表示逐元素的除法: $ h_{i,j}^{<1>}=\frac{h_{i,j}-\mu_j}{\sqrt{\sigma_j^2+\epsilon}},j=1,2,\cdots,n $ 。
-
最后执行缩放: $ \mathbf{\vec h}_i^{<2>} =\vec\gamma \odot \mathbf{\vec h}_i^{<1>}+\vec\beta $ 。其中 $ \vec \gamma,\vec\beta $ 是网络从数据中自动学习到的参数,用于调整 $ \mathbf{\vec h}_i^{<2>} $ 的均值和方差, $ \odot $ 为逐元素积。
虽然 $ \mathbf{\vec h}_i^{<2>} $ 的每个维度不是零均值、单位方差的,但是可以保证它的每个维度的均值、方差不再依赖于低层的网络。
-
-
归一化一个神经元的均值和标准差会降低包含该神经元的神经网络的表达能力。
若每个神经元的输出都是均值为0、标准差为 1 ,则会产生两个问题:
-
无论底层的神经元如何学习 ,其输出在提交给上层神经元处理之前,都被粗暴的归一化。导致底层神经元的学习毫无意义。
-
sigmoid
等激活函数通过区分饱和区、非饱和区(线性区),使得神经网络具有非线性计算的能力。输入归一化使得数据几乎都被映射到激活函数的线性区,从而降低了模型的表达能力。
因此执行缩放的原因是:保证模型的容量不会被降低。
当网络学到的参数且好是 $ \vec\gamma = \sqrt{\vec\sigma^2+\epsilon},\vec\beta=\vec\mu $ 时, $ \mathbf{\vec h}_i^{<2>} = \mathbf{\vec h}_i $ ,因此
BN
可以还原原来的输入。这样,模型既可以改变、也可以保持原输入,这就提升了网络的表达能力。 -
-
batch normalization
算法-
输入:
- 网络中某层的一个
mini-batch
的输入 $ \mathbb H_{mini-batch} = \{\mathbf{\vec h}_1,\mathbf{\vec h}_2,\cdots,\mathbf{\vec h}_m\} $ - 参数 $ \vec\gamma,\vec\beta $ (它们是由神经网络自动学习到的)
- 网络中某层的一个
-
输出:经过
batch normalization
得到的新的输入 $ \mathbb H_{mini-batch}^{<2>} = \{\mathbf{\vec h}_1^{<2>},\mathbf{\vec h}_2^{<2>},\cdots,\mathbf{\vec h}_m^{<2>}\} $ -
算法步骤:
-
计算输入的每个维度的均值和方差:
$ \vec \mu= \frac 1m \sum_{i=1}^m \mathbf{\vec h}_i\\ \vec\sigma ^2 = (\sigma_{1}^2,\sigma_{2}^2,\cdots,\sigma_{n}^2)^T,\quad \sigma_{j}^2 = \frac 1m \sum_{i=1}^m (h_{i,j}-\mu_{j})^2 $ -
对输入的每个维度执行归一化:
$ \mathbf{\vec h}_i^{<1>} = \frac{\mathbf{\vec h}_i-\vec\mu}{\sqrt{\vec\sigma^2+\epsilon}} $ -
执行缩放: $ \mathbf{\vec h}_i^{<2>} = \vec\gamma \odot \mathbf{\vec h}_i^{<1>}+\vec\beta $
-
-
-
根据梯度的链式法则,反向传播规则为(假设代价函数为 $ \mathcal L $ ):
-
$ \nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L = \vec\gamma \odot \nabla_{\mathbf{\vec h}_i^{<2>}} \mathcal L $
-
考虑到 $ \vec \gamma,\vec\beta $ 出现在 $ \mathbf{\vec h}_1^{<2>} ,\cdots, \mathbf{\vec h}_m^{<2>} $ 中,因此有:
$ \nabla_{\vec\beta} \mathcal L = \sum_{i=1}^m \nabla_{\mathbf{\vec h}_i^{<2>}} \mathcal L,\quad \nabla_{\vec \gamma} \mathcal L = \sum_{i=1}^m (\nabla_{\mathbf{\vec h}_i^{<2>}} \mathcal L)\odot \mathbf{\vec h}_i^{<1>} $ -
由于 $ \vec\mu,\vec\sigma^2 $ 出现在 $ \mathbf{\vec h}_1^{<2>} ,\cdots, \mathbf{\vec h}_m^{<2>} $ 中,因此有:
$ \nabla_{\vec\mu} \mathcal L= \sum_{i=1}^m\left (\frac{\partial \mathbf{\vec h}_i^{<1>} }{\partial \vec\mu}\right)^T \nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L= \sum_{i=1}^m - \frac{\nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L}{\sqrt{\vec\sigma^2+\epsilon}}\\ \nabla_{\vec\sigma^2} \mathcal L = \sum_{i=1}^m\left (\frac{\partial \mathbf{\vec h}_i^{<1>} }{\partial \vec\sigma^2}\right)^T \nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L= \sum_{i=1}^m -\frac 12 \frac{\mathbf{\vec h}_i-\vec\mu}{(\vec\sigma^2+\epsilon)^{3/2}}\odot (\nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L) $ -
由于 $ \mathbf{\vec h}_i $ 出现在多条路径中,因此有:
$ \nabla_{\mathbf{\vec h}_i} \mathcal L= \left(\frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf{\vec h}_i}\right)^T\nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L + \left(\frac{\partial \vec\mu}{\partial \mathbf{\vec h}_i}\right)^T\nabla_{\vec\mu} \mathcal L + \left(\frac{\partial \vec\sigma^2}{\partial \mathbf{\vec h}_i}\right)^T\nabla_{\vec\sigma^2} \mathcal L\\ = \frac{\nabla_{\mathbf{\vec h}_i^{<1>}} \mathcal L}{\sqrt{\vec\sigma^2+\epsilon}}+\frac{\nabla_{\vec\mu} \mathcal L}{m}+\frac 2m (\mathbf{\vec h}_i-\vec\mu)\odot \nabla_{\vec\sigma^2} \mathcal L $
-
-
大多数神经网络隐层采用 $ \phi(\mathbf X\mathbf W+\mathbf{\vec b}) $ 的形式,其中 $ \phi $ 是非线性激励函数(如
relu
)。在
batch normalization
中推荐使用 $ \phi(\mathbf X\mathbf W) $ ,因为参数 $ \mathbf{\vec b} $ 会被batch normalization
中的参数 $ \vec\beta $ 吸收:无论 $ \mathbf{\vec b} $ 的值是多少,在归一化的过程中它将被减去。
10.1.4 BN 内部原理
-
BN
表现良好的一个解释是:内部协方差偏移Internal Covariate Shift:ICS
会对训练产生负面影响,BN
能够减少ICS
。 -
内部协方差偏移:低层网络的更新对当前层输入分布造成了改变。
统计学习中一个经典假设是源空间
source domain
和目标空间target domain
的数据分布一致。协方差偏移covariate shift
就是分布不一致假设之下的一个分支问题。它指的是:源空间和目标空间的条件概率是一致的,但是其边缘概率不同。即:对所有的 $ x \in \mathcal X $ ,有 $ P_s(Y\mid X=x) = P_t(Y\mid X=x) $ ,但是 $ P_s(X) \ne P_t(X) $ 。在神经网络中经过各层的作用,各层输出与其输入分布会不同。这种差异随着网络深度的增大而增大,但是它们能够“指示”的样本标记仍然不变,这就符合
covariate shift
的定义。由于是对层间信号的分析,这就是
internal
的由来。ICS
带来的问题是:各个神经元的输入数据不再是独立同分布的。- 上层参数需要不断适应新的输入数据分布,降低了学习速度。
- 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
- 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
-
论文
《How Does Batch Normalization Help Optimization》 2018 Shibani Santurkar etc.
说明BN
对训练带来的增益与ICS
的减少没有任何联系,或者说这种联系非常脆弱。研究发现:BN
甚至不会减少ICS
。论文说明
BN
的成功的真正原因是:它使得优化问题的解空间更加平滑了。这确保梯度更具有预测性,从而允许使用更大范围的学习率,实现更快的网络收敛。
10.1.5 BN 性质
-
BN
独立地归一化每个输入维度,它要求每个mini batch
的统计量是整体统计量的近似估计。因此
BN
要求每个mini-batch
都比较大,而且每个mini-batch
的数据分布比较接近。所以在训练之前,需要对数据集进行充分混洗,否则效果可能很差。 -
当验证或者测试的
batch size
较小时(如:只有一个测试样本),此时无法得到mini batch
的统计量,或者mini batch
统计量无法作为整体统计量的近似估计。此时的做法是:先通过训练集上得到的所有
mini batch
的统计量的移动平均值,然后将它们作为验证或者测试时的mini batch
的统计量。但是当训练数据、验证数据、测试数据的数据分布存在差别时(如:训练数据从网上爬取的高清图片,测试数据是手机拍照的图片),训练集上预先计算好的
mini batch
的统计量的移动平均值并不能代表验证集、测试集的相应的统计量。这就导致了训练、验证、测试三个阶段存在不一致性。 -
BN
存在两个明显不足:-
高度依赖于
mini batch
的大小。它要求每个mini-batch
都比较大,因此不适合batch size
较小的场景,如:在线学习(batch size=1
)。 -
不适合
RNN
网络。因为不同样本的
sequence
的长度不同,因此RNN
的深度是不固定的。同一个batch
中的多个样本会产生不同深度的RNN
,因此很难对同一层的样本进行归一化。
-
-
设 $ \mathbf{\vec h}_i= \mathbf W \mathbf{\vec x}_i $ ,则
BN
具有权重伸缩不变性,以及数据伸缩不变性。-
权重伸缩不变性:假设 $ \tilde {\mathbf W}=\lambda\mathbf W $ ,则有:
$ \tilde{\mathbf{\vec h}}_i = \lambda \mathbf{\vec h}_i,\quad \tilde{\vec \mu} = \lambda\vec\mu,\quad \tilde{\vec\sigma}_2 = \lambda^2 \vec\sigma_2 $其中因为 $ \epsilon $ 很小几乎可以忽略不计,因此有 $ \tilde{\mathbf{\vec h}}_i^{<1>} = \mathbf{\vec h}_i^{<1>} $ ,则有: $ \nabla_{\tilde{\mathbf{\vec h}}_i^{<1>} }\mathcal L = \nabla_{ \mathbf{\vec h}_i^{<1>}} \mathcal L $ 。
$ \frac{\partial \tilde{\mathbf{\vec h}}_i^{<1>}}{\partial \mathbf{\vec x}_i} = \frac{\tilde {\mathbf W}}{\sqrt {\tilde {\vec\sigma}^2+\epsilon}} = \frac{\mathbf W}{\sqrt {\vec\sigma^2+\epsilon}} = \frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf{\vec x}_i} $因此权重缩放前后, $ \nabla_{\mathbf{\vec x}_i} \mathcal L $ 保持不变。 $ \mathbf{\vec x}_i $ 是
BN
层的输入, $ \nabla_{\mathbf{\vec x}_i} \mathcal L $ 就是高层流向低层的梯度,因此权重缩放不影响梯度的流动。另外,由于 $ \frac{\partial \tilde{\mathbf{\vec h}}_i^{<1>}}{\partial \tilde{\mathbf W}} = \frac 1\lambda \frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf W} $ ,因此权重越大,则该权重的梯度越小,这样权重更新就越稳定。这相当与实现了参数正则化的效果,避免了参数的大幅震荡。
通常并不会把
batch normalization
当作一种正则化的手段,而是作为加速学习的方式。 -
数据伸缩不变性:假设 $ \tilde{\mathbf{\vec x}}_i=\lambda \mathbf{\vec x}_i $ ,同理有:
$ \frac{\partial \tilde{\mathbf{\vec h}}_i^{<1>}}{\partial \mathbf W} = \frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf W},\quad \frac{\partial \tilde{\mathbf{\vec h}}_i^{<1>}}{\partial \tilde{\mathbf {\vec x}}_i} = \frac 1\lambda \frac{\partial \mathbf{\vec h}_i^{<1>}}{\partial \mathbf {\vec x}_i} $因此数据的伸缩变化不会影响到对该层的权重更新,简化了对学习率的选择。
-
-
究竟是在激活函数之前、还是之后进行
batch normalization
, 这个问题在文献中有一些争论。实践中,通常都是在激活函数之前进行的。
-
在测试阶段,如果需要对单一样本评估,此时测试集只有单个样本,无法给出均值和标准差。
解决的方式为:将 $ \vec\mu,\vec\sigma $ 设置为训练阶段收集的运行均值(或者是指数加权均值)。
10.2 其它 normalization
-
除了
batch normalization
之外,还有layer normalization、 instance normalization、group normalization、 weight normalization
。下图给出了
BN、LN、IN、GN
的示意图(出自论文《Group Normalization》 Kaiming He etc.
)。其中蓝色部分表示:通过这些蓝色区域计算均值和方差,然后蓝色区域中的每个单元都使用这些均值、方差来归一化。注意:这里的
BN
是网络某层中,对每个通道进行归一化;而前面的BN
是对每个神经元进行归一化。如果是对每个神经元进行归一化,则
BN
示意图中,蓝色区域只有最底下的一行。
10.2.1 layer normalization
-
与
BN
不同,LN
是对单个样本的同一层的神经元进行归一化,同层神经元使用相同的均值和方差。对于该层神经元,不同样本可以使用的均值和方差不同。
与之相比,
BN
是对每个神经元在mini batch
样本之间计算均值和方差。对每个神经元,mini batch
中的所有样本在该神经元上都使用相同的均值和方差。但是不同神经元使用不同的均值和方差。因此
LN
不依赖于batch size
,也不依赖于网络深度。因此它适合在线学习,也适合于RNN
网络。 -
设神经网络第 $ l $ 层的输入为 $ \mathbf{\vec h} $ , $ \mathbf{\vec h}=(h_1,\cdots,h_n)^T $ , $ n $ 为该层神经元的数量。则
LN
的步骤为:-
首先计算该层所有神经元的均值和方差:
$ \mu = \frac 1n \sum_{i=1}^n h_i,\quad \sigma^{2} = \frac 1 n\sum_{i=1}^n(h_i-\mu)^2 $ -
然后对神经元进行归一化:
$ \mathbf{\vec h}^{<1>} = \frac{\mathbf{\vec h}-\mu}{\sqrt{\sigma^{2}+\epsilon}} $其中 $ \mu ,\sigma^{2} $ 都是标量。
-
最后执行缩放: $ \mathbf{\vec h}^{<2>}= \vec\gamma \odot \mathbf{\vec h}^{<1>} +\vec\beta $ 。
与
BN
相同, $ \vec \gamma,\vec\beta $ 也是网络从数据中自动学习到的参数,用于调整 $ \mathbf{\vec h}^{<2>} $ 的均值和方差, $ \odot $ 为逐元素积。这一步的作用也是提升神经网络的表达能力。
-
-
layer normalization
算法-
输入:
- 网络中第 $ l $ 层的输入 $ \mathbf{\vec h} $
- 参数 $ \vec\gamma,\vec\beta $ (它们是由神经网络自动学习到的)
-
输出:经过
layer normalization
得到的新的输入 $ \mathbf{\vec h}^{<2>} $ -
算法步骤:
-
计算该层所有神经元的均值和方差:
$ \mu = \frac 1n \sum_{i=1}^n h_i,\quad \sigma^{2} = \frac 1 n\sum_{i=1}^n(h_i-\mu)^2 $ -
对该层神经元进行归一化:
$ \mathbf{\vec h}^{<1>} = \frac{\mathbf{\vec h}-\mu}{\sqrt{\sigma^{2}+\epsilon}} $ -
执行缩放: $ \mathbf{\vec h}^{<2>}= \vec\gamma \odot \mathbf{\vec h}^{<1>} +\vec\beta $
-
-
-
根据梯度的链式法则,反向传播规则为(假设代价函数为 $ \mathcal L $ ):
$ \nabla_{\mathbf{\vec h}^{<1>} } \mathcal L = \vec\gamma \odot \nabla_{\mathbf{\vec h}^{<2>} } \mathcal L\\ \nabla_{\vec\beta} \mathcal L = \nabla_{\mathbf{\vec h}^{<2>} } \mathcal L\\ \nabla_{\vec \gamma} \mathcal L = (\nabla_{\mathbf{\vec h}^{<2>}} \mathcal L)\odot \mathbf{\vec h}^{<1>} \\ \nabla_{\mu} \mathcal L = -\frac{1}{\sqrt{\sigma^{2}+\epsilon}}\sum_{i=1}^n \frac{\partial \mathcal L}{\partial h_i^{<1>}}\\ \nabla_{\sigma^{2}} \mathcal L = -\frac 12 \times\frac{1}{(\sigma^{2}+\epsilon)^{3/2}}\sum_{i=1}^n \frac{\partial \mathcal L}{\partial h_i^{<1>}}\times (h_i-\mu)\\= \frac{-1}{2(\sigma^{2}+\epsilon)^{3/2}}(\nabla_{\mathbf{\vec h}^{<1>} } \mathcal L )^T (\mathbf{\vec h}-\mu) $由于 $ \mathbf{\vec h} $ 出现在多条路径中,因此有:
$ \nabla_{\mathbf{\vec h}} \mathcal L= \left(\frac{\partial \mathbf{\vec h}^{<1>}}{\partial \mathbf{\vec h}}\right)^T\nabla_{\mathbf{\vec h}^{<1>}} \mathcal L + \left(\frac{\partial \mu}{\partial \mathbf{\vec h}}\right) \nabla_{\mu} \mathcal L + \left(\frac{\partial \sigma^{2}}{\partial\mathbf{\vec h}}\right)\nabla_{\sigma^{2}} \mathcal L\\ = \frac{\nabla_{\mathbf{\vec h}^{<1>} } \mathcal L}{\sqrt{\sigma^{2}+\epsilon}}+\frac{ \nabla_{\mu} \mathcal L}{n}+\frac{2(\nabla_{\sigma^{2}} \mathcal L)\times (\mathbf{\vec h}-\mu)}{n} $其中出现标量与向量的加法,它等价于将标量扩充为向量,扩充向量在每个维度上的取值就是该标量。如: $ \frac 1n \rightarrow (\frac 1n,\frac 1n,\cdots,\frac 1n)^T $ 。
其计算图如下所示,与
BN
相同。 -
LN
的特点是:针对单个样本进行,不依赖于mini batch
中的其它样本。
10.2.2 instance normalization
-
与
IN
与LN
相同,它们都是对单个样本进行操作。与LN
不同的是:IN
对同一层神经元中的同一个通道进行归一化。IN
主要用于图像处理任务中,此时每一层网络都有N、H、W、C
四个维度。其中N
代表batch
维度,H、W
代表feature map
的宽度和高度,C
代表通道数量。LN
使得同一层神经元中的同一个通道上的神经元使用相同的均值和方差。对于该通道中的神经元,不同的样本使用的均值和方差不同。 -
设单张图片在网络第 $ l $ 层的输入张量为 $ \mathbf X =(X_{i,j,k}) \in \mathbb R^{C\times H\times W} $ 。 为了防止名字冲突,这里用 $ \mathbf X $ 标记第 $ l $ 层的输入。其中 $ C $ 为通道数, $ H,W $ 为
feature map
的高度和宽度。三个索引分别代表: $ i $ 代表通道维的索引, $ j,k $ 分别代表高度和宽度维度的索引。
则
LN
的步骤为:-
首先计算样本在第 $ i $ 个通道的神经元的均值和方差:
$ \mu_{i} = \frac {1}{H\times W} \sum_{j=1}^H\sum_{k=1}^W X_{i,j,k},\quad \sigma^{2}_{i} = \frac {1}{H\times W} \sum_{j=1}^H\sum_{k=1}^W(X_{i,j,k}-\mu_{i})^2 $ -
然后对神经元进行归一化:
$ X_{i,j,k}^{<1>} = \frac{X_{i,j,k}-\mu_{i}}{\sqrt{\sigma_{i}^2+\epsilon}}, \quad j=1,\cdots,H;k=1,\cdots,W $ -
最后执行缩放:
$ X_{i,j,k}^{<2>} =\gamma_{i,j,k} \times X_{i,j,k}^{<1>} +\beta_{i,j,k} $其中 $ \gamma_{i,j,k},\beta_{i,j,k} $ 表示第 $ i $ 个通道位于 $ (j,k $ ) 的神经元的缩放因子和平移因子。
-
-
instance normalization
算法-
输入:
- 网络第 $ l $ 层的输入张量为 $ \mathbf X =(X_{i,j,k}) \in \mathbb R^{ C\times H\times W} $
- 参数张量 $ (\gamma_{i,j,k}),(\beta_{i,j,k})\in \mathbb R^{C\times H\times W} $
-
输出:经过
instance normalization
得到的新的输入 $ \mathbf X^{<2>} $ -
算法步骤:
-
计算样本在第 $ i $ 个通道的神经元的均值和方差:
$ \mu_{i} = \frac {1}{H\times W} \sum_{j=1}^H\sum_{k=1}^W X_{i,j,k},\quad \sigma^{2}_{i} = \frac {1}{H\times W} \sum_{j=1}^H\sum_{k=1}^W(X_{i,j,k}-\mu_{i})^2 $ -
对神经元进行归一化:
$ X_{i,j,k}^{<1>} = \frac{X_{i,j,k}-\mu_{i}}{\sqrt{\sigma_{i}^2+\epsilon}}, \quad j=1,\cdots,H;k=1,\cdots,W $ -
执行缩放: $ X_{i,j,k}^{<2>} =\gamma_{i,j,k} \times X_{i,j,k}^{<1>} +\beta_{i,j,k} $ 。
-
-
-
instance normalization
的反向传播规则的推导类似layer normalization
。 -
BN
对mini batch
中所有图片求均值和方差,计算得到的统计量会受到mini batch
中其它样本的影响。而IN
是对单个图片求均值和方差,与其它样本无关。- 对于
GAN
、风格迁移这类任务上,IN
效果要优于BN
。其普遍解释为:这类生成式方法,每张图片自己的风格比较独立,不应该与batch
中其它图片产生太大联系。 IN
也不依赖于batch size
,也不依赖于网络深度。因此它适合在线学习,也适合于RNN
网络。
- 对于
10.2.3 group normalization
-
GN
首先将通道分组。假设有C
个通道,分成G
个组,则:通道1,...,C/G
为一个组,通道C/G+1,...,2C/G
为一个组.... 。然后
GN
对每个通道组进行归一化。因此可以看到:
GN
介于LN
和IN
之间。如果G=1
,即只有一个分组,则GN
就是LN
;如果G=C
,即每个通道构成一个组,则GN
就是IN
。 -
group normalization
算法-
输入:
- 网络第 $ l $ 层的输入张量为 $ \mathbf X =(X_{i,j,k}) \in \mathbb R^{ C\times H\times W} $
- 分组的组数 $ G $
- 参数张量 $ (\gamma_{i,j,k}),(\beta_{i,j,k})\in \mathbb R^{G\times H\times W} $
-
输出:经过
group normalization
得到的新的输入 $ \mathbf X^{<2>} $ -
算法步骤:
-
计算每个分组的通道数 $ n_G =\frac{C}{G} $
-
计算样本在第 $ i $ 个分组的神经元的均值和方差:
$ \mu_{i} = \frac {1}{n_G\times H\times W} \sum_{i^\prime=(i-1)*n_G+1}^{i*n_G}\sum_{j=1}^H\sum_{k=1}^W X_{i^\prime,j,k}\\ \sigma^{2}_{i} = \frac {1}{n_G\times H\times W} \sum_{i^\prime=(i-1)*n_G+1}^{i*n_G} \sum_{j=1}^H\sum_{k=1}^W(X_{i^\prime,j,k}-\mu_{i})^2 $ -
对神经元进行归一化:
$ X_{(i-1)*n_G+g,j,k}^{<1>} = \frac{X_{(i-1)*n_G+g,j,k}-\mu_{i}}{\sqrt{\sigma_{i}^2+\epsilon}}\\ j=1,\cdots,H;k=1,\cdots,W;i=1,\cdots,G;g=1,\cdots,n_G $ -
执行缩放: $ X_{i,j,k}^{<2>} =\gamma_{i,j,k} \times X_{i,j,k}^{<1>} +\beta_{i,j,k} $ 。
-
-
-
GN
有效的可能原因是:在网络的每一层中,多个卷积核学到的特征并不是完全独立的。某些特征具有类似的分布,因此可以被分到同一组。
10.2.4 比较
-
根据论文
《Group Normalization》 Kaiming He etc.
得到的结论:-
BN
很容易受到batch size
的影响,而GN
不容易受到batch size
的影响。如下图/表 所示为
BN
和GN
的比较,模型为resnet-50
、训练集为ImageNet
、训练硬件为8个带GPU
的worker
、指标为它们在验证集上的验证误差。batch size 32 16 8 4 2 BN 23.6 23.7 24.8 27.3 34.7 GN 24.1 24.2 24.0 24.2 24.1 提升 0.5 0.5 -0.8 -3.1 -10.6 -
在较大的
batch size
上,BN
的表现效果最好。resnet-50
模型在ImageNet
训练中,当采用batch size=32
时,采取各种normalization
的模型的表现(验证误差)为:BN LN IN GN 验证误差 23.6 25.3 28.4 24.1 相比 BN 的提升 - -1.7 -4.8 -0.5 下图为这些模型在各个
epoch
事训练、验证的表现:
-
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论