文章目录
- 深度学习
-
- 1.讲一讲faster_rcnn
- 2.你了解哪些激活函数?分别有什么用?
- 3.批梯度下降、随机梯度下降和mini-batch梯度下降的区别?
- 4.CNN里有哪些常见的梯度下降方法?
- 5.池化层是怎样进行反向传播的?
- 6.深度学习不适合哪些应用场景?
- 7.浅层神经网络和深层神经网络的差别?
- 8.什么是过拟合?防止过拟合的方法?
- 9.为什么负梯度方向是函数局部值最快的方向?
- 10.为什么图像处理中一般用最大池化而不用平均池化?
- 11.softmax loss和cross entropy的区别?
- 12.全连接层的作用
- 13.训练不收敛(loss不下降)怎么办?
- 14.怎么计算感受野(receptive field)?
- 15.详细介绍一下Batch Normalization(怎么计算均值、方差,怎么反向传播等)
- 16.RNN和LSTM有什么不同?
- 17. 为什么RNN不用Relu函数而要用tanh函数?
- 18.写一下卷积的实现
- 19.空洞卷积的思想?或者说相比如标准卷积有什么改进?
- 机器学习
- 图像处理
- 数据结构/算法
- 操作系统/计算机网络/数据库
- Python/C++
-
- 1.Python中is和==的区别?
- 2.Python中range和xrange的区别?
- 3.Python多线程为什么是鸡肋?
- 4.Python赋值、浅拷贝和深拷贝的区别?
- 5.python传参会改变参数值吗(python是值传递还是引用传递)?
- 6.Python装饰器?
- 7.Python生成器?
- 8.C++的多态是什么?怎么实现的?
- 9.C++中的static、external、register这些关键字
- 10.结构体占多少字节?
- 11.写一下lower_bound和upper_bound的实现。
- 12.指针和引用的区别?
- 13.你用过哪些C++11的特性?
- 14.sizeof和strlen的区别?
- 15.C++中的const关键字。
- 16.了解vector的实现吗?
- 17.getline的用法
- 18.重写与重载的区别?
- 19.define和const的区别?
- 20. 结构和联合的区别?
- 21.C++单例模式了解吗?
- Linux/Spark
- 数学/思维
-
- 1.一个骰子,6面,1个面是 1, 2个面是2, 3个面是3, 问平均掷多少次能使1,2,3都至少出现一次?
- 2.给10x10的棋盘,扫雷,随机放置10个点作为雷,如何保证随机放置?
- 3.有54张牌,分3组,大王小王同在一组的概率?
- 4.站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?
- 5.一个四位数abcd,满足abcd * 4 = dcba,求这个数。
- 6.一个圆上随机三个点组成锐角三角形的概率?
- 7.100个人坐100个座位,第一个人随机坐,后面每个人如果能做自己的座位就坐自己的座位,不能的话就随机坐,问第100个人坐自己的座位的概率?
- 项目相关
- HR面
深度学习
1.讲一讲faster_rcnn
RCNN
首先从rcnn讲起,rcnn可以称得上是用深度学习进行目标检测的开山之作。其方法是首先用Selective Search算法选出约2000-3000个候选区域(region proposal),然后将这些区域图块归一化成227*227的图像,再通过CNN提取特征,得到4096维的特征。接下来分为两步:对上面每一个区域得到的特征都用一个二分类SVM分类器判断候选区域是否是目标(在SVM中正负样本数差别悬殊,可通过增大数量少的样本的C值来增大“少数样本误分类”带来的影响,避免被多数样本掩盖);如果候选区域属于某个类别,用线性脊回归器对该候选进行位置精修。
详见博客:【目标检测】RCNN算法详解
Fast RCNN
RCNN主要存在三个问题:
- 训练时速度慢
- 测试时速度慢
- 训练所需空间大
Fast RCNN分别针对这三个问题进行了改进:
- RCNN训练时速度慢是因为对每一个候选框都要使用CNN进行特征提取,而各个候选框之间大量重叠,因此造成大量冗余计算。而Fast RCNN先将一整张图片送入网络,然后再送入候选区域,因此前几层不需要再重复计算,提高了计算速度。
- RCNN测试时速度慢原因同上,而Fast RCNN将一整张图归一化后送入网络,在邻接时才送入候选框,只需要在后基层处理候选框就行。
- RCNN中分类器和回归器都需要大量的特征作为训练数据,而Fast RCNN统一用深度学习网络进行类别估计和位置精修,不需要额外存储。
总的来说,Fast RCNN的的流程就是先将图片归一化为224*224大小,然后用基础网络提取特征,在基础网络的输出层加入候选区域(例如VGG16就是在最后一层池化层加入候选区域,将每个候选区域均匀分成M*N块,再用max_pool将候选区域调整到大小一致,再送入下一层),通过全连接层得到4096维的数据。在用多任务学习,同时学习候选区域是否属于某一类以及对照该类的标签框精修候选区域位置。
详情参见:【目标检测】Fast RCNN算法详解
** Faster RCNN**
主要解释Proposal层:
- 生成anchors,利用bbox_regression分支得到的(tx, ty, tw, th)参数对anchors进行修正。
- 对anchors按foreground_softmax_scores从高到低进行排序,取top_n(eg: 6000)的留下,从而获得修正后的positive_anchors
- 对超出边界的positive_anchors进行修剪
- 剔除太小的positive_anchors
- nms
- 对nms后的positive_anchors再次按foreground_softmax_scores从高到低排序,留下top_n(eg: 300)的positive_anchors。
- 现在还留下的anchors就是proposals
2.你了解哪些激活函数?分别有什么用?
激活函数的主要作用是引入非线性变换,如果没有激活函数的话,神经网络层数再多,也只是简单的线性变换,无法处理图像、语音等复杂的任务。
1.阶跃函数
用于二分类,但导数始终为0,不能用于反向传播,理论意义大于实际意义。
2.sigmoid函数
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+e−x1
同样用于二分类,X靠近0的时候,一点小小的值变化也能引起Y的很大变化,这说明函数区域将数值推向极值,很适合二分类。而X远离0的时候,X值变化对Y起作用很小,函数的导数变化也很小,在反向传播中几乎起不到更新梯度的作用;且sigmoid函数只能得到正值,在很多情况下不适用。
3.tanh函数
f ( x ) = e x − e − x e x + e − x f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} f(x)=ex+e−xex−e−x
对sigmoid函数的改进,函数值在(-1, 1)之间,改善了sigmoid函数只能得到正值的缺点,其他特点与sigmoid函数一模一样。
4.ReLU函数
ReLU函数是近年来神经网络使用最广泛的激活函数,它的一大优点就是当输入值是负值的时候,输出值为0,这意味着一段时间内只有部分神经元被激活,神经网络的这种稀疏性使其变得高效且易于计算。但X小于0时函数的梯度为0,这就意味着在反向传播的时候权重得不到更新,那么正想传播过程中输出值为0的神经元永远得不到激活,变成了死神经元。
5.Leaky ReLU函数
解决了死神经元的问题。
6.Softmax函数
Softmax函数也可以看作是用作多分类的激活函数,将神经网络的输出值编程概率。
此外还有线性激活函数,效果等同于未激活,在Keras中不激活时就是用f(x)=x这一激活函数。
二分类时用sigmoid函数和tanh函数,但存在梯度消失问题时应避免使用这两种函数。ReLU函数适用于绝大多数情况,如果存在梯度不更新的问题时可以用Leaky ReLU函数替代。
3.批梯度下降、随机梯度下降和mini-batch梯度下降的区别?
- 批梯度下降是每次使用所有数据用于更新梯度,使得梯度总是朝着最小的方向更新,但数据量很大的时候更新速度太慢,而且容易陷入局部最优。
- 随机梯度下降是每次使用一条数据来更新梯度,在梯度更新过程中梯度可能上升也可能下降,但总的来说梯度还是朝着最低的方向前进;最后梯度会在极小值附近徘徊。随机梯度下降的梯度更新速度快于批梯度下降,且由于每次梯度的更新方向不确定,陷入局部最优的时候有可能能跳出该局部极小值。
- mini-batch梯度下降介于批梯度下降和随机梯度下降之间,每次用若干条数据更新梯度。mini-batch梯度下降可以使用矩阵的方式来计算梯度,因此速度快于随机梯度下降,且同样具有跳出局部最优的特点。
4.CNN里有哪些常见的梯度下降方法?
这个问题一般是问有哪些优化器
GradientDescent
g t = ▽ f ( θ t − 1 ) △ θ t = − η ∗ g t g_t=\bigtriangledown f(\theta_{t-1})\\ \bigtriangleup \theta_t=-\eta*g_t gt=▽f(θt−1)△θt=−η∗gt
其中 g t g_t gt表示梯度, η \eta η表示学习率。如果算力和时间足够,用SGD训练出的神经网络效果最好。
Momentum
m t = μ ∗ m t − 1 + ( 1 − μ ) g t △ θ t = − η ∗ m t m_t = \mu * m_{t-1}+(1-\mu)g_t\\ \bigtriangleup \theta_t = -\eta * m_t mt=μ∗mt−1+(1−μ)gt△θt=−η∗mt
借用物理学中动量的概念,积累之前的动量代替真正的梯度进行更新。如果本次梯度衰减方向与上一次相同,则可以加速梯度下降;如果不一致,则抑制梯度的改变。
RMSprop
n t = ν n t − 1 + ( 1 − ν ) g t 2 △ θ t = − η n t + ϵ ∗ g t n_t = \nu n_{t-1} + (1-\nu)g_t^2\\ \bigtriangleup \theta_t = -\frac{\eta}{\sqrt{n_t+\epsilon}}*g_t nt=νnt−1+(1−ν)gt2△θt=−nt+ϵη∗gt
用初始学习率除以通过衰减系数控制的梯度平方和的平方根,相当于给每个参数赋予了各自的学习率。梯度相对平缓的地方,累积梯度小,学习率会增大;梯度相对陡峭的地方,累积梯度大,学习率会减小。从而加速训练。
Adam
m t = μ m t − 1 + ( 1 − μ ) g t n t = ν n t − 1 + ( 1 − ν ) g t 2 m t ^ = m t 1 − μ t n t ^ = n t 1 − ν t △ θ t = − η n t ^ + ϵ ∗ m t ^ m_t = \mu m_{t-1} + (1-\mu)g_t\\ n_t = \nu n_{t-1} + (1-\nu)g_t^2\\ \hat {m_t} = \frac{m_t}{1-\mu^t}\\ \hat {n_t} = \frac{n_t}{1-\nu^t}\\ \bigtriangleup \theta_t = -\frac{\eta}{\sqrt{\hat {n_t}+\epsilon}}*\hat {m_t} mt=μmt−1+(1−μ)gtnt=νnt−1+(1−ν)gt2mt^=1−μtmtnt^=1−νtnt△θt=−nt^+ϵη∗mt^
Adam本质上是带有动量项的RMSprop,结合了两者的优点,可以为不同的参数计算不同的自适应学习率,在实践中一般都用Adam优化器。
详见:深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
5.池化层是怎样进行反向传播的?
反向传播在经过池化层的时候梯度的数量发生了变化,例如对于2*2的池化操作,第L+1层梯度数量是L层的1/4,所以每个梯度要对应回4个梯度,而这对于mean_pooling和max_pooling来说存在区别。
mean_pooling
由于mean_pooling正向传播时取周围4个像素的均值,所以反向传播将梯度平均分成4分,再分给上一层。
max_pooling
max_pooling正向传播时取周围4个像素的最大值保留,其余的值丢弃,所以反向传播时将梯度对应回最大值的位置,其他位置取0。一般来说,为了知道最大值的位置,深度学习框架在正向传播时就用max_id来记录4个像素中最大值的位置。
详见博客:深度学习笔记(3)——CNN中一些特殊环节的反向传播
6.深度学习不适合哪些应用场景?
- 日常生活的预测问题或生物学中的小样本问题:在这些问题中使用线性模型往往能比深度学习效果更好,而且速度更快。
- 需要知道变量与结果之间的关系,而不是仅仅给出一个预测值的时候。例如,医生想要知道人口变量对死亡率的影响,这个时候深度学习就不适合。
- 非结构化数据中深度学习不适合。
详见博客:深度学习的先入之见、局限性及其未来
7.浅层神经网络和深层神经网络的差别?
神经网络中,权重参数是给数据做线性变换,而激活函数给数据带来的非线性变换。增加某一层神经元数量是在增加线性变换的复杂性,而增加网络层数是在增加非线性变换的复杂性。
理论上来说,浅层神经网络就能模拟任何函数,但需要巨大的数据量,而深层神经网络可以用更少的数据量来学习到更好的拟合。
8.什么是过拟合?防止过拟合的方法?
过拟合是模型学习能力太过强大,把部分数据的不太一般的特性都学到了,并当成了整个样本空间的特性。在深度学习中主要有以下几个方法防止过拟合:
- L2正则化
原loss是 L 0 L_0 L0,加入L2正则化后loss是 L = L 0 + λ 2 n ∣ ∣ W ∣ ∣ 2 L=L_0+\frac{\lambda}{2n}||W||^2 L=L0+2nλ∣∣W∣∣2
所以L的梯度是 ∂ L ∂ W = ∂ L 0 ∂ W + λ n W \frac{\partial{L}}{\partial{W}}=\frac{\partial{L_0}}{\partial{W}}+\frac{\lambda}{n}{W} ∂W∂L=∂W∂L0+nλW
∂ L ∂ b = ∂ L 0 ∂ b \frac{\partial{L}}{\partial{b}}=\frac{\partial{L_0}}{\partial{b}} ∂b∂L=∂b∂L0
可以看出,L2正则化只对W有影响,对b没有影响。而加入L2正则化后的梯度更新:
W = W − α ( ∂ L 0 ∂ W + λ n W ) = ( 1 − α λ n ) W − α ∂ L 0 ∂ W W=W-\alpha(\frac{\partial{L_0}}{\partial{W}}+\frac{\lambda}{n}{W})=(1-\frac{\alpha\lambda}{n})W-\alpha\frac{\partial{L_0}}{\partial{W}} W=W−α(∂W∂L0+nλW)=(1−nαλ)W−α∂W∂L0
相比于原梯度更新公式,改变的是 ( 1 − 2 α λ ) W (1-2\alpha\lambda)W (1−2αλ)W这里,而由于 α 、 λ 、 n \alpha、\lambda、n α、λ、n都是正数,所以 ( 1 − α λ n ) < 1 (1-\frac{\alpha\lambda}{n})<1 (1−nαλ)<1。
因此,L2正则化使得反向传播更新参数时W参数比不添加正则项更小。在过拟合中,由于对每个数据都拟合得很好,所以函数的变化在小范围内往往很剧烈,而要使函数在小范围内剧烈变化,就是要W参数值很大。L2正则化抑制了这种小范围剧烈变化,使得拟合程度“刚刚好”。 - L1正则化
原loss是 L 0 L_0 L0,加入L1正则化后loss是 L = L 0 + λ n ∣ W ∣ L=L_0+\frac{\lambda}{n}|W| L=L0+nλ∣W∣
所以L的梯度是 ∂ L ∂ W = ∂ L 0 ∂ W + λ n ∣ W ∣ \frac{\partial{L}}{\partial{W}}=\frac{\partial{L_0}}{\partial{W}}+\frac{\lambda}{n}|W| ∂W∂L=∂W∂L0+nλ∣W∣
∂ L ∂ b = ∂ L 0 ∂ b \frac{\partial{L}}{\partial{b}}=\frac{\partial{L_0}}{\partial{b}} ∂b∂L=∂b∂L0
可以看出,L2正则化只对W有影响,对b没有影响。而加入L2正则化后的梯度更新:
W = W − α ( ∂ L 0 ∂ W + λ n ∣ W ∣ ) = W − λ n ∣ W ∣ − α ∂ L 0 ∂ W W=W-\alpha(\frac{\partial{L_0}}{\partial{W}}+\frac{\lambda}{n}{|W|})=W-\frac{\lambda}{n}|W|-\alpha\frac{\partial{L_0}}{\partial{W}} W=W−α(∂W∂L0+nλ∣W∣)=W−nλ∣W∣−α∂W∂L0
如果W为正,相对于原梯度就减小;如W为负,相对于原梯度就增大。
所以,L1正则化使得参数W在更新时向0靠近使得参数W具有稀疏性。而权重趋近0,也就相当于减小了网络复杂度,防止过拟合。 - Dropout
Dropout在每次训练时,有一部分神经元不参与更新,而且每次不参与更新的神经元是随机的。随着训练的进行,每次用神经元就能拟合出较好的效果,少数拟合效果不好的也不会对结果造成太大的影响。 - 增大数据量
既然过拟合是学习到了部分数据集的特有特征,那么增大数据集就能有效的防止这种情况出现。 - Early stop
数据分为训练集、验证集和测试集,每个epoch后都用验证集验证一下,如果随着训练的进行训练集loss持续下降,而验证集loss先下降后上升,说明出现了过拟合,应该立即停止训练。 - Batch Normalization(下面另有BN的详细过程,见问题21)
BN的过程中,每次都是用一个mini_batch的数据来计算均值和反差,这与整体的均值和方差存在一定偏差,从而带来了随机噪声,起到了与Dropout类似的效果,从而减轻过拟合。
详见博客:正则化方法:L1和L2 regularization、数据集扩增、dropout
9.为什么负梯度方向是函数局部值最快的方向?
假设存在函数 f ( x ) f(x) f(x), l l l是任意方向的单位向量,要现在的目的就是要找到一个 l l l使得 f ( x + l ) − f ( x ) f(x+l)-f(x) f(x+l)−f(x)的变化值最大。
根据公式有 f ( x + l ) − f ( x ) = < g r a d f , l > f(x+l)-f(x)=<grad_f, l> f(x+l)−f(x)=<gradf,l>,所以原问题变为找到 l l l使得 ∣ g r a d f ∣ ∗ ∣ l ∣ ∗ c o s ( θ ) |grad_f|*|l|*cos(\theta) ∣gradf∣∗∣l∣∗cos(θ)最大(其中 θ \theta θ是 l l l与 g r a d f grad_f gradf的夹角),很明显 θ = 0 \theta=0 θ=0时该值最大,也就是说 l l l方向就是 g r a d f grad_f gradf的方向,从而证明梯度方向是使得函数局布值变化最快的方向。
详见博客:在梯度下降法中,为什么梯度的负方向是函数下降最快的方向?
10.为什么图像处理中一般用最大池化而不用平均池化?
池化的主要目的有两个:(1)保持主要特征不变的同时减小了参数(2)保持平移、旋转、尺度不变性,增强了神经网络的鲁棒性
详见:如何理解CNN中的池化?
而之所以用最大池化而不用平均池化,主要原因是最大池化更能捕捉图像上的变化、梯度的变化,带来更大的局部信息差异化,从而更好地捕捉边缘、纹理等特征。
11.softmax loss和cross entropy的区别?
输入数据经过神经网络后得到的logits是一个[n, 1]向量(n表示进行n分类),此时向量中的数字可以是负无穷到正无穷的任意数字,经过softmax函数后才转换为概率。
softmax函数:
P i = e i ∑ k = 1 n e k P_i=\frac{e^i}{\sum_{k=1}^{n}e^k} Pi=∑k=1nekei
softmax loss:
L = − ∑ i = 1 n y i l o g p i L=-\sum_{i=1}^{n}y_ilogp_i L=−i=1∑nyilogpi
cross entropy:
L = − ∑ i = 1 n y i l o g p i L=-\sum_{i=1}^{n}y_ilogp_i L=−i=1∑nyilogpi
交叉熵函数形式与softmax loss函数几乎一样,当cross entropy的输入是softmax函数函数的输出时,二者就完全一样。
最后看一下logistic regression函数:
L = − y i l o g p i − ( 1 − y i ) l o g ( 1 − p i ) L=-y_ilogp_i-(1-y_i)log(1-p_i) L=−yilogpi−(1−yi)log(1−pi)
12.全连接层的作用
全连接层的作用主要是“分类”,将卷积层提取到的特征进行维数调整,同时融合各通道之间的信息。
还有一个作用就是在迁移学习的过程中,有全连接层的模型比没有全连接层的表现更好。
详见博客:全连接层的作用是什么? - 魏秀参的回答 - 知乎
13.训练不收敛(loss不下降)怎么办?
(1)首先检查是否进行了数据归一化
(2)网络的输出层是否用了正确的激活函数(如果最后一层是回归,最好不要用激活函数)
(3)调整学习率试试
(4)仔细检查自己定义的网络层是否有错误
(5)检查loss是否有错误
(6)调整batch_size试试
(6)如果还不行,试试只用几张图片,去除正则化等优化手段,看是否能过拟合。不能的话可能是网络结构有问题,仔细检查代码是否错误,以及调整网络结构试试。
(7)另外:善用tensorboard可视化训练过程
详见:神经网络不学习的原因
14.怎么计算感受野(receptive field)?
感受野指的是当前层每一个特征对应输入图的区域大小。假设输入特征时5*5特征图(下图中蓝色方块区域),采用kernel_size=3,padding=1, stride=2的方式连续进行两次卷积。第一次卷积后得到3*3特征图(绿色方块区域),再次卷积后得到2*2特征图(橙色方块区域)。下图左列是我们常见的特征图可视化方式,右列是固定大小特征图可视化方式,我们根据固定大小特征图计算感受野。
首先定义几个参数: j j j表示在固定两个特征之间的距离, r r r表示感受野大小, s s s表示stride大小, k k k表示kernel_size。
第一次卷积前后:
j o u t = j i n ∗ s = 1 ∗ 2 = 2 j_{out}=j_{in}*s=1*2=2 jout=jin∗s=1∗2=2
r o u t = r i n + ( k − 1 ) ∗ j i n = 1 + ( 3 − 1 ) ∗ 1 = 3 r_{out}=r_{in}+(k-1)*j_{in}=1+(3-1)*1=3 rout=rin+(k−1)∗jin=1+(3−1)∗1=3
所以第一次卷积后感受野大小为3.
第二次卷积前后(上一层的 j o u t 、 r o u t j_{out}、r_{out} jout、rout作为这一层的 j i n 、 r i n j_{in}、r_{in} jin、rin):
j o u t = j i n ∗ s = 2 ∗ 2 = 4 r o u t = r i n + ( k − 1 ) ∗ j i n = 3 + ( 3 − 1 ) ∗ 2 = 7 j_{out}=j_{in}*s=2*2=4\\ r_{out}=r_{in}+(k-1)*j_{in}=3+(3-1)*2=7 jout=jin∗s=2∗2=4rout=rin+(k−1)∗jin=3+(3−1)∗2=7
因此本例中两次卷积后橙色区域特征图感受野为7*7。
15.详细介绍一下Batch Normalization(怎么计算均值、方差,怎么反向传播等)
神经网络反向传播后每一层的参数都会发生变化,在下一轮正向传播时第 l l l层的输出值 Z l = W ⋅ A l − 1 + b Z^l=W\cdot{A}^{l-1}+b Zl=W⋅Al−1+b也会发生变化,从而导致第 l l l层的 A l = r e l u ( Z l ) A^l=relu(Z^l) Al=relu(Zl)发生变化。而 A l A^l Al作为第 l + 1 l+1 l+1层的输入, l + 1 l+1 l+1就需要去适应适应这种数据分布的变化,这就是神经网络难以训练的原因之一。
为此,Batch Normalization的做法是调整数据的分布来改变这一现象,具体做法如下:
-
训练
训练过程中,一般每次的训练数据都是一个batch,假设 m = b a t c h _ s i z e m=batch\_size m=batch_size,则:
(1)计算各个特征均值 μ = 1 m ∑ i = 1 m z i \mu=\frac{1}{m}\sum_{i=1}^{m}z^i μ=m1∑i=1mzi,其中 z i z^i zi表示第 i i i条数据
(2)计算方差 σ 2 = 1 m ∑ i = 1 m ( z i − μ ) 2 \sigma^2=\frac{1}{m}\sum_{i=1}^{m}(z^i-\mu)^2 σ2=m1∑i=1m(zi−μ)2
(3)归一化后的 Z n o r m i = z i − μ σ 2 + ϵ Z_{norm}^i=\frac{z^i-\mu}{\sqrt{\sigma^2+\epsilon}} Znormi=σ2+ϵzi−μ, ϵ \epsilon ϵ表示一个极小值,防止计算出现Nan。
(4)这样调整分布后能加速训练,但之前层学习到的参数信息可能会丢失,所以加入参数 γ 、 β \gamma、\beta γ、β进行调整: Z ~ i = γ Z n o r m i + β \widetilde{Z}^i=\gamma{Z_{norm}^i}+\beta Z i=γZnormi+β -
反向传播
∂ L ∂ Z n o r m i = ∂ L ∂ Z ~ i λ \frac{\partial{L}}{\partial{Z_{norm}^i}}=\frac{\partial{L}}{\partial{\widetilde{Z}^i}}\lambda ∂Znormi∂L=∂Z i∂Lλ
∂ L ∂ λ = ∂ L ∂ Z ~ i Z n o r m i \frac{\partial{L}}{\partial\lambda}=\frac{\partial{L}}{\partial{\widetilde{Z}^i}}Z_{norm}^i ∂λ∂L=∂Z i∂LZnormi
∂ L ∂ β = ∂ L ∂ Z ~ i \frac{\partial{L}}{\partial\beta}=\frac{\partial{L}}{\partial{\widetilde{Z}^i}} ∂β∂L=∂Z
i∂L
∂ L ∂ σ 2 = ∂ L ∂ Z n o r m i ∂ Z n o r m i ∂ σ 2 = ∂ L ∂ Z n o r m i ( − 1 2 ) ( σ 2 + ϵ ) − 3 2 \frac{\partial{L}}{\partial\sigma^2}=\frac{\partial{L}}{\partial{Z_{norm}^i}}\frac{\partial{Z_{norm}^i}}{\partial\sigma^2}=\frac{\partial{L}}{\partial{Z_{norm}^i}}(-\frac{1}{2})(\sigma^2+\epsilon)^{\frac{-3}{2}} ∂σ2∂L=∂Znormi∂L∂σ2∂Znormi=∂Znormi∂L(−21)(σ2+ϵ)2−3
∂ L ∂ μ = ∂ L ∂ Z n o r m i ∂ Z n o r m i ∂ μ + ∂ L ∂ σ 2 ∂ σ 2 ∂ μ \frac{\partial{L}}{\partial\mu}=\frac{\partial{L}}{\partial{Z_{norm}^i}}\frac{\partial{Z_{norm}^i}}{\partial\mu}+\frac{\partial{L}}{\partial\sigma^2}\frac{\partial{\sigma^2}}{\partial{\mu}} ∂μ