交叉熵主要用于度量两个概率分布间的差异性信息。
在信息论中,交叉熵是表示两个概率分布p,q,其中p表示真实分布,q表示非真实分布。在相同的一组事件中,用非真实分布q来表示某个事件发生所需要的平均比特数。从这个定义中,我们很难理解交叉熵的定义。下面举个例子来描述一下:
假设现在有一个样本集中两个概率分布p,q,其中p为真实分布,q为非真实分布。假如,按照真实分布p来衡量识别一个样本所需要的编码长度的期望为:
H ( p ) = ∑ i p i ⋅ l o g ( 1 / p i ) H(p) = \sum_i p_i \cdot log(1/p_i) H(p)=∑ipi⋅log(1/pi)
但是,如果采用错误的分布q来表示来自真实分布p的平均编码长度,则应该是:
H ( p , q ) = ∑ i p i ⋅ l o g ( 1 / q i ) H(p,q) = \sum_i p_i \cdot log(1/q_i) H(p,q)=∑ipi⋅log(1/qi)
此时就将 H ( p , q ) H(p,q) H(p,q)称之为交叉熵
交叉熵的计算方式如下:
H ( p , q ) = ∑ i p i ⋅ l o g ( 1 / q i ) H(p,q) = \sum_i p_i \cdot log(1/q_i) H(p,q)=∑ipi⋅log(1/qi) (离散)
H ( p , q ) = − ∫ x p ( x ) l o g q ( x ) d x = E p [ − l o g Q ] H(p,q) = -\int_x p(x)logq(x)dx = E_p[-logQ] H(p,q)=−∫xp(x)logq(x)dx=Ep[−logQ] (连续)
应用
交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。
在特征工程中,可以用来衡量两个随机变量之间的相似度。
将交叉熵引入计算语言学消岐领域,采用语句的真实语义作为交叉熵的训练集的先验信息,将机器翻译的语义作为测试集后验信息。计算两者的交叉熵,并以交叉熵指导对歧义的辨识和消除。
相对熵与交叉熵
相对熵也成为KL散度,定义为
D K L ( p ∣ ∣ q ) = ∑ x p ( x ) l o g p ( x ) q ( x ) = − ∑ x p ( x ) l o g q ( x ) − ( − ∑ x p ( x ) l o g p ( x ) ) = H ( p , q ) − H ( p ) D_{KL}(p||q) = \sum_xp(x)log\frac{p(x)}{q(x)} \\ = -\sum_x p(x)logq(x) - (-\sum_x p(x)logp(x)) \\ =H(p, q) - H(p) DKL(p∣∣q)=∑xp(x)logq(x)p(x)=−∑xp(x)logq(x)−(−∑xp(x)logp(x))=H(p,q)−H(p)
在机器学习中,训练数据的分布已经固定下来,那么真实分布的熵 H ( p ) H(p) H(p)是一个定值,最小化相对熵等价于最小化交叉熵
考虑下图中的大量数据点。如果要求我们画出一条直线,这条线要尽可能覆盖这些点, 那么最长的线可能是哪条?在上图中 , 3条直线中B 最长 。在PCA中,我们对数据的坐标进行了旋转,该旋转的过程取决于数据的本身。第一条坐标轴旋转到覆盖数据的最大方差位置,即图中的直线B 。数据的最大方差给出了数据的最重要的信息。
在选择了覆盖数据最大差异性的坐标轴之后,我们选择了第二条坐标轴。假如该坐标轴与第一条坐标轴垂直, 它就是覆盖数据次大差异性的坐标轴。这里更严谨的说法就是正交(orthogonal)。在上图中, 直线 C 就是第二条坐标轴。利用PCA,我们将数据坐标轴旋转至数据角度上的那些最重要的方向。
我们已经实现了坐标轴的旋转,接下来开始讨论降维。 坐标轴的旋转并没有减少数据的维度。
考虑上图中的3个不同的类别,如果使用决策树区分这3个类别。决策树每次都是基于一个特征来做决策的。我们会发现,在 x 轴上可以找到一些值,这些值能够很好地将这3个类别分开。这 样 ,我们就可能得到一些规则,比 如 当 x < -6 时 ,数据属于类别0
我们先说为什么会出现过拟合?一是数据集太小,而是模型复杂度过高。因此解决思路如下:
(1)正则化
在损失函数中加入正则项来惩罚模型参数,以此降低模型的复杂度。
L1正则化就是在loss function后面加上L1范数( C ∣ ∣ w ∣ ∣ 1 C||w||_1 C∣∣w∣∣1),加上L1范数容易得到稀疏解(0比较多)
L2正则化就是在loss function后面加上L2范数的平方( C ∣ ∣ w ∣ ∣ 2 2 C||w||_2^2 C∣∣w∣∣22),加上L2范数会使对模型贡献不大的特征所对应的参数的值趋于0,以此来降低模型的复杂度
(2)剪枝处理
剪枝是决策树中一种控制过拟合的方法,分为预剪枝和后剪枝
(3)Bagging、Boosting
Bagging、Boosting是ML中常见的集成方法,多个模型的组合可以弱化每个模型中的异常点的影响,保留模型之间的通性,弱化单个模型的特性
(4)权值贡献
权值共享最常见与CNN中,旨在减小模型中的参数,同时减少计算量
(5)BN(batch normalization)
也是常见于CNN中,让大型卷积网络快速收敛的同时提高了分类的准确率
(6)Dropout
Dropout常见于DL中
首先要说明的是,SVM本质上是凸二次规划问题,即QP问题。而针对QP问题,Python有封装好的包可以用叫做CVXOPT。另外也有一些用牛顿法和拟牛顿法求解的。也就是说SVM并不是一定就只有对偶解法。
那么我们可以选用其他的方法求解吗?
可以。对于 w w w和 b b b这两个参数,它们是和数据的维度相关的,而将原问题转换成对偶问题并不会降低求解的时间复杂度。因此,并不是一定都要利用对偶求解。
在低维的时候,对偶求解和直接求解没有显著的速度优势,所以对于原问题可以利用Python的liblinear求解,而liblinear对于原问题采用 trust region newton method(TRON)进行优化。
在高维的时候,将原问题的 w w w和 b b b的求解转变为对 λ \lambda λ的求解,而 λ \lambda λ的求解则是与维度完全无关的问题,只和样本相关,所以对于高维但样本量有限的数据集,直接
转化为对偶问题进行求解是合适的。另外,引入对偶的最关键的一个优势是对偶问题中出现了 x i x_i xi和 x j x_j xj的内积 ( x i ⋅ x j ) (x_i\cdot x_j) (xi⋅xj),内积方便引入核函数。为什么呢?因为核函数的本质就是高维空间中两个向量的内积。
GBDT 和 XGboost
XGboost是GBDT的一个变种,最大的区别是XGboost通过对目标函数做二阶泰勒展开,从而求出下一步要拟合的树的叶子节点权重。然后,根据损失函数求出每一次分裂节点的损失减小的大小,以此来选择合适的属性进行分裂。
此外,
(1)传统 GBDT以 CART作为基分类器,XGboost还支持线性分类器,这时XGboost相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)
(2)从分裂算法上说,GBDT采用的是精确分裂的算法,就是把每个属性的每个取值都当作一次阈值进行遍历。而Xgboost采用近似分裂算法,对每个属性的所有取值进行分桶,按照各个桶之间的值作为划分阈值。具体来首,XGboost提出了一个特殊的分桶策略,一般的分桶策略是每个样本的权重都是相同的,但是XGboost使每个样本的权重为损失函数在该样本点的二阶导。
(3)XGboost在loss function里加入了正则项,用于控制模型的复杂度。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合。
(4)XGboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
(5)传统的GBDT没有设计对缺失值进行处理,XGboost能够自动学习出缺失值的处理策略:在计算分裂增益的时候XGboost只利用没有缺失值的样本,但是在推理的时候,也就是在确定了树的结构,需要将样本映射到叶子节点的时候,需要对含有缺失值的样本进行划分,XGboost分别假设该样本属于左子树和右子树,比较两者分裂增益,选择增益较大的那一边作为该样本的分裂方向。
(6)XGboost在实现上支持并行化,这里的并行化并不是类似于随机森立那样树与树之间的并行化,XGboost同Boosting方法一样,在树的粒度上是串行的。但是在构建树的过程中,也就是在分裂节点的时候支持并行化:XGboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
lightGBM 和 XGboost
(1)XGboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是XGboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是XGboost也进行了分裂,带来了务必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
(2)lightGBM使用了基于histogram的决策树算法。基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。相比于XGboost预排序的方法,其优点在于:预排序需要保存数据的特征值以及特征排序的结果,而histogram只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,因此占用更少的内存;预排序算法每遍历一个特征值就需要计算一次分裂的增益,而histogram观察到一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。因此,直方图做差仅需遍历直方图的k个桶。利用这个方法,可以在构造一个叶子的直方图后,用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。
(3)lightGBM采用了特征并行、数据并行和投票并行。
对于特征并行,lightGBM的每个worker留有一份完整的数据集,但是每个worker仅在特征子集上进行最佳切分点的寻找;worker之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可。XGboost的每个worker中仅有部分的列数据,也就是垂直切分,每个worker寻找局部最佳切分点,worker之间相互通信,然后在具有最佳切分点的worker上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他worker才能开始分裂。
对于数据并行, lightGBM中先对数据水平切分,每个worker上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个histogram算法使得worker间的通信成本降低一倍,因为只用通信以此样本量少的节点。 XGboost中的数据并行也是水平切分,然后单个worker建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个worker上的节点分裂时会单独计算子节点的样本索引,因此效率很慢,每个worker间的通信量也就变得很大。
对于投票并行,XGboost没有。lightGBM的每个worker首先会找到本地的一些优秀的特征,然后进行全局投票,根据投票结果,选择top的特征进行直方图的合并,再寻求全局的最优分割点。
(1) 计算量的问题
如果优化问题是 n 维的,那么单轮梯度下降的复杂度为 O ( n ) O(n) O(n),Quasi-Newton 是 O ( n 2 ) O(n^2) O(n2),Newton method 是 O ( n 3 ) O(n^3) O(n3)。在神经网络中, n 通常是个不小的数字,虽然 Newton method迭代次数远少于梯度下降,但是也无法弥补单轮复杂度上的巨大劣势
(2) 解的精度的问题
首先指出,机器学习问题不需要高精度解
忽略常数系数以及与这儿无关的项,泛化误差可以理解为
当 前 模 型 最 优 解 的 泛 化 误 差 ( 统 计 误 差 ) + 优 化 误 差 当前模型最优解的泛化误差(统计误差) + 优化误差 当前模型最优解的泛化误差(统计误差)+优化误差
而第一项只与模型的选择、数据的分布、数据量的大小等相关,完全独立于优化算法。因此,当优化误差已经远低于统计误差时,继续优化带来的实际收益非常小,对整个泛化误差的影响很可能微乎其微
(3)稳定性的问题
越简单的东西往往越鲁棒,对于优化算法也是这样。
神经网络优化有三个问题:大数据(样本多), 高参数,非凸。而 Newton 和 Quasi-Newton 在凸优化情形下,如果迭代点离全局最优很近时,收敛速度快于梯度下降。非凸情形下,Newton 和 Quasi-Newton 会被鞍点吸引,故而每一步迭代可能不降反升。
Sigmod
sigmod存在两个问题:
(1)梯度消失。当神经元的激活在接近0或1处时会饱和,在这些区域梯度几乎为0,这就会导致梯度消失,几乎就有没有信号通过神经传回上一层。
(2)Sigmoid函数的输出不是零中心的。因为如果输入神经元的数据总是正数,那么关于 w w w的梯度在反向传播的过程中,将会要么全部是正数,要么全部是负数,这将会导致梯度下降权重更新时出现z字型的下降。
然后,就有了tanh
Tanh
Tanh解决了Sigmoid的输出是不是零中心的问题,但仍然存在饱和问题。
接着就是ReLU
ReLU
相较于sigmoid和tanh函数,ReLU对于随机梯度下降的收敛有巨大的加速作用;sigmoid和tanh在求导时含有指数运算,而ReLU求导几乎不存在任何计算量。
对比sigmoid类函数主要变化是:
(1)单侧抑制;
(2)相对宽阔的兴奋边界;
(3)稀疏激活性。
但是,ReLU单元比较脆弱并且可能“死掉”,而且是不可逆的,因此导致了数据多样化的丢失。通过合理设置学习率,会降低神经元“死掉”的概率。
Leaky ReLU
其中 ε \varepsilon ε是很小的负数梯度值,比如0.01,这样做目的是使负轴信息不会全部丢失,解决了ReLU神经元“死掉”的问题。更进一步的方法是PReLU,即把 ε \varepsilon ε当做每个神经元中的一个参数,是可以通过梯度下降求解的。
Maxout
Maxout具有ReLU的优点,如计算简单,不会 saturation,同时又没有ReLU的一些缺点,如容易go die。
但是,每个神经元的参数double,这就导致整体参数的数量激增。
Softmax
特征提取的误差主要来自两个方面:
(1)邻域大小受限造成的估计值方差增大;
(2)卷积层参数误差造成估计均值的偏移。
mean-pooling能减小第一种误差(邻域大小受限造成的估计值方差增大),更多的保留图像的背景信息;
max-pooling能减小第二种误差(卷积层参数误差造成估计均值的偏移),更多的保留纹理信息。
Stochastic-pooling则介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与mean-pooling近似,在局部意义上,则服从max-pooling的准则。
首先来说,BN层的引入是解决神经网络训练难的问题的。这里面有两点:
(1)分布形状的问题
一般来说,如果模型的输入特征不相关且满足标准正态分布 N ( 0 , 1 ) N(0, 1) N(0,1)时,模型的表现一般较好。在训练神经网络模型时,我们可以事先将特征去相关并使得它们满足一个比较好的分布,这样,模型的第一层网络一般都会有一个比较好的输入特征,但是随着模型的层数加深,网络的非线性变换使得每一层的结果变得相关了,且不再满足 N ( 0 , 1 ) N(0, 1) N(0,1)分布。更糟糕的是,可能这些隐藏层的特征分布已经发生了偏移。从而使DNN训练变得困难。
于是,在训练时,BN层利用隐藏层输出结果的均值 μ B \mu_{\mathcal B} μB与方差 σ m a t h c a l B 2 \sigma_{mathcal B}2 σmathcalB2来标准化每一层特征的分布,并且维护所有mini-batch数据的均值与方差,最后利用样本的均值与方差的无偏估计量用于测试时使用。
鉴于在某些情况下非标准化分布的层特征可能是最优的,标准化每一层的输出特征反而会使得网络的表达能力变得不好,作者为BN层加上了两个可学习的缩放参数 γ \gamma γ和偏移参数 β \beta β来允许模型自适应地去调整层特征分布。
(2)梯度弥散的问题
∂ l ∂ x i = a ∂ l ∂ x ^ i + b \begin{aligned}\frac{\partial l}{\partial x_i}=a\frac{\partial l}{\partial \hat x_i}+b\end{aligned} ∂xi∂l=a∂x^i∂l+b
这样整体给梯度一个提升,补偿了激活函数上的损失,进而改善了梯度弥散的问题。
关于BN的有效性,有以下几个主要观点:
(1) 主流观点,Batch Normalization调整了数据的分布,不考虑激活函数,它让每一层的输出归一化到了均值为0方差为1的分布,这保证了梯度的有效性,目前大部分资料都这样解释,比如BN的原始论文认为的缓解了Internal Covariate Shift(ICS)问题。
(但是后来有篇论文《How Does Batch Normalizetion Help Optimization》推翻了这个结论,该论文认为BN带来的性能提升与ICS的减少无关。 并且在一定程度上认为BN并不能减少 ICS)
(2) 可以使用更大的学习率,《 Understanding batch normalization》一文指出BN有效是因为用上BN层之后可以使用更大的学习率,从而跳出不好的局部极值,增强泛化能力,在它们的研究中做了大量的实验来验证。
(3) 损失平面平滑。也就是是上文提到的《How Does Batch Normalizetion Help Optimization》指出,BN有效的根本原因是BN使得优化问题的曲面更加平滑,这使得梯度更容易预测以及允许更大范围的学习率和更快的网络收敛。该论文证明了BN提升了模型的LOSS的Lipschitzness和梯度的Lipschitzness
引用论文作者在论文中的表述
When training with Batch Normalization, a training example is seen in conjunction with other examples in the mini-batch, and the training network no longer producing deterministic values for a given training example. In our experiments, we found this effect to be advantageous to the generalization of the network.
首先来讲,Fast RCNN主要提出了下面几个方面的改进:
(1) 利用RoI Pooling进行特征的尺寸变换。因为全连接层的输入需要尺寸大小一样,所以不能直接将大小不同的region proposal喂入全连接层。而归一化的过程会使图形产生形变,这对CNN的特征提取来说是相当不利的。
(2)卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算。
(3)Fast RCNN采用了多任务损失函数(multi-task loss)统一了类别输出任务和候选框回归任务。分类采用softmax代替SVM进行分类,共输出N(类别)+1(背景)类。回归损失输出的是4*N(类别),4表示的是(x,y,w,h分别表示候选框的中心坐标和宽、高)。
(4)SVD对全连接层进行分解。由于一张图像约产生2000个RoI,将近一半多的时间用在全连接层计算,为了提高运算速度,可以用SVD(奇异值分解)对全连接层进行变换来提高运算速度。一个大的矩阵可以近似分解为三个小矩阵的乘积,分解后的矩阵的元素数目远小于原始矩阵的元素数目,从而达到减少计算量的目的。通过对全连接层的权值矩阵进行SVD分解,使得处理一张图像的速度明显提升。
Fast R-CNN目标检测主要流程如下:
提取候选区域:利用SS(Selective Search)算法在输入图像中提取出候选区域,并把这些候选区域按照空间位置关系映射到最后的卷积特征层;
区域归一化:对于卷积特征层上的每个候选区域进行RoI Pooling操作,得到固定维度的特征;
分类与回归:将提取到的特征输入全连接层,然后用Softmax进行分类,对候选区域的位置进行回归。
two-stage检测算法将检测问题划分为两个阶段,首先产生候选区域(region proposals),然后对候选区域分类(一般还需要对位置精修)
one-stage检测算法,其不需要region proposal阶段,直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果
因此,one_stage / two_stage 最主要的区别就是:
为什么one-stage网络速度要快很多?
one-stage网络生成的ancor框只是一个逻辑结构,或者只是一个数据块,只需要对这个数据块进行分类和回归就可以,不会像two-stage网络那样,生成的ancor框会映射到feature map的区域(rcnn除外),然后将该区域重新输入到全连接层进行分类和回归,每个ancor映射的区域都要进行这样的分类和回归,所以它非常耗时
为什么one-stage网络的准确性要比two-stage网络要低?
one-stage网络最终学习的ancor有很多,但是只有少数ancor对最终网络的学习是有利的,而大部分ancor对最终网络的学习都是不利的,这部分的ancor很大程度上影响了整个网络的学习,拉低了整体的准确率;而two-stage网络最终学习的ancor虽然不多,但是背景ancor,也就是对网络学习不利的ancor也不会特别多,它虽然也能影响整体的准确率,但是肯定没有one-stage影响得那么严重,所以它的准确率比one-stage肯定要高
参数量大小的计算,分为weights和biases:
顺便提醒一下:Pooling是没有参数的
原则:把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变
Mean Pooling
AlexNet
但是吧,AlexNet太老了,现在基本不用了
VGG-16
GoogLeNet V1
ResNet
ResNeXt 相比较于 ResNet,主要是分组进行了卷积,最后再concatenate在一起
DenseNet
与ResNet一致,DenseNet也采用shortcut连接,但是其将前面所有层与后面层密集连接。 另外DenseNet采用channel-wise concatenate来实现特征重用,而ResNet采用的是element-wise addition
由于密集连接方式,DenseNet提升了梯度的反向传播,使得网络更容易训练 (每层可以直达最后的误差信号)
由于特征复用,分类器使用到了低级特征
相较于前面的几个大型网络,近年提出了几个轻量化的模型
SqueezeNet
MobileNet 是通过优化卷积操作来达到轻量化的目的。具体来说,文中通过 Deepwise Conv(其实是Deepwise Conv + Pointwise Conv)代替原始的卷积操作实现,从而达到减少计算的目的(通常所使用的是 3×3 的卷积核,计算量会下降到原来的九分之一到八分之一)
ShuffleNet V1
ShuffleNet 是通过优化网络结构来达到轻量化的目的
ShuffleNet 的核心思想是对卷积进行分组,从而减少计算量,但是由于分组相当于将卷积操作局限在某些固定的输入上,为了解决这个问题采用 shuffle 操作将输入打乱,从而解决这个问题。
group convolution(分组卷积): 分组卷积的思路是将输入特征图按通道数分为几组,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量。传统的卷积是卷积核在所有通道上进行卷积,算全通道卷积,而分组卷积算通道上的稀疏卷积,如下图所示。(mobileNet算是一种特殊的分组卷积,分组数和通道数一样)
channel shuffle(通道混洗) : 分组卷积的一个问题是不同组之间的特征图信息不通信,就好像分了几个互不相干的路,大家各走各的,会降低网络的特征提取能力。MobileNet 是采用密集的1*1pointwise convolution 进行通道特征融合,计算量较大。channel shuffle的思路是对分组卷积之后的特征图的排列顺序进行打乱重新排列,这样下一个分组卷积的输入就来自不同的组,信息可以在不同组之间流转。
DetNet是一个专门用于目标检测的backbone
目前大多数用于目标检测的backbone都是使用在ImageNet上预训练的网络,比如常用的VGG,Resnet系列等等,但是这些网络都是为图像分类而设计的,把这些网络用于目标检测领域,通常不能完美贴合,会或多或少的增加一些层。这样会有两个问题:
于是,DetNet做出了如下的改进:
(1) 增加了网络高层输出特征的分辨率,换句话说就是高层不对特征图做尺寸缩减。
从图(C)可以明显地看出DetNet的不同之处,首先相比(B)这一传统的分类网络,DetNet增加了一个阶段P6(64X,作者没有画出第一阶段2X的部分),FPN也同样是增加了P6,目的是为了识别更大的目标。其次作者所说的保持空间分辨率,也就是在最后三个阶段(P4,P5,P6)分辨率一直保持着16X
(2) 引入带孔卷积层增加网络高层的感受野。
继第一点改进之后,如果网络高层的特征不做像分类网络那样多的降采样(将stride等于32修改为stride等于16)会带来两个问题:
为了解决第二个问题,作者使用dilated bottleneck作为一个基础的网络块有效地扩大的感受野
(3)减小网络高层的宽度,减少因增大分辨率带来的计算量。
为解决(2)中所述的第一个问题,作者减小了网络高层的宽度。从下图可见,高层的几个stage的每个block的输入特征通道都是256. 而常见的分类算法中,比如ResNet越往高层的stage,特征通道数往往越大。
Skip-gram 的损失函数为(假设滑动窗口为 m m m,文本序列长度为 T T T)
− ∑ t = 1 T ∑ j = − m , t ≠ 0 m l o g p ( w t + j ∣ w t ) \begin{aligned}-\sum_{t=1}^T\sum_{j=-m,t\neq 0}^mlogp(w_{t+j}|w_t)\end{aligned} −t=1∑Tj=−m,t=0∑mlogp(wt+j∣wt)
CBOW的损失函数为
− ∑ t = 1 T l o g p ( w t ∣ w t − m , ⋯ , w t − 1 , w t + 1 , ⋯ , w t + k ) \begin{aligned}-\sum_{t=1}^Tlogp(w_t|w_{t-m},\cdots,w_{t-1},w_{t+1},\cdots,w_{t+k})\end{aligned} −t=1∑Tlogp(wt∣wt−m,⋯,wt−1,wt+1,⋯,wt+k)
详细参考论文 Efficient Estimation of Word Representations in Vector Space
给定一个函数rand5(),使函数rand7()可以随机等概率的生成1-7的整数
其实思路是一样的,利用 r a n d 7 ( ) ∗ r a n d 7 ( ) rand7()*rand7() rand7()∗rand7()生成 1 − 49 1-49 1−49,只保留 1 − 45 1-45 1−45,每9个数映射成一组