文章目录
- 1. 多标签分类怎么解决
- 2. 什么是BN
- 3. L1、L2 正则化区别
- 4. 过拟合问题问题起源?如何解决?
- 5. 偏差、方差
- 6. 非线性回归怎么做
- 7.ResNet 的特点
- 8. 什么是 one-shot、zero-shot,区别
- 9. 什么会导致梯度消失,爆炸,解决
- 10. 什么是fine-tuning?
- 11. 梯度下降法和牛顿法区别
- 12. 卷积尺寸计算
- 13. 空洞卷积
- 14. FCN与CNN的区别
- 15. SVM
- 16. 直观解释一下拉格朗日乘子法
- 17. Bagging & Boosting
- 18. Adaboost和GBDT的异同点
- 19. 随机森林Random Forest (RF)
- 20. RF和GBDT对比
- 21. 正负样本数据量不等
- 22. 决策树
- 23. 常见评价指标
- 24. 优化器
- 25. TensorFlow 怎么在网络结构实现一个 if 判断
- 26. 机器学习特征工程操作
1. 多标签分类怎么解决
- 标签制作
样本中出现的类别都为1,其余为0
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
self.train_label = mlb.fit_transform(self.train_label[:, None]).astype(np.int32)
self.test_label = mlb.fit_transform(self.test_label[:, None]).astype(np.int32)
- 神经网络末端加上sigmoid激活函数,将输出值限定在[0,1]
- 采用binary_crossentropy损失函数,这样使得模型在训练过程中不断降低output和label之间的交叉熵。其实就相当于模型使label为1的节点的输出值更靠近1,label为0的节点的输出值更靠近0。
J ( ω ) = − 1 m ∑ i = 1 m [ y i log h ω ( x i ) + ( 1 − y i ) log ( 1 − h ω ( x i ) ] J(\omega)=-\frac{1}{m} \sum_{i=1}^{m}\left[y_{i} \log h_{\omega}\left(x_{i}\right)+\left(1-y_{i}\right) \log \left(1-h_{\omega}\left(x_{i}\right)\right]\right. J(ω)=−m1i=1∑m[yiloghω(xi)+(1−yi)log(1−hω(xi)]
用二分类举例而言,y=[[0,1],[1,0]] (两个样本,一个标签1,一个0),y_hat =[[0.5,0.5], [0.8,0.2]]
第一个样本的BCE=-([0, 1]*ln([0.5,0.5]) + (1-[0,1])*ln([0.5,0.5]))/2=-ln(0.5)
第二个样本的BCE=-([1,0]*ln([0.8, 0.2]) + (1-[1,0])*ln([0.2,0.8]))/2=-ln(0.8)
这个例子和CE得例子结果一样,是因为两个预测向量的reduce_sum=1,所以BCE的前后两项loss相等,所以CE=BCE,如果reduce_sum!=1,那么输出就不同了。
所以BCE相对于CE加入了一项对非1预测部分的惩罚,CE最大化onehot向量中1那个位置的预测值,而BCE在最大化那个位置的值得同时,降低onehot其他位置值得预测值。
2. 什么是BN
详见https://blog.csdn.net/weixin_42764932/article/details/112688061
Batch Normalization, 批量归一化,
通过将每层数据分布归一化到激活函数的非饱和区,加快训练,对抗梯度消失;
同时利用两个可学习参数(尺度变换和偏移),让新的分布到达最优,提升模型精度;
由于每次训练都进行了归一化,就很少发生由于数据分布不同导致的参数变动过大引发的参数不断增大,可以代替L2正则化
3. L1、L2 正则化区别
详见https://blog.csdn.net/weixin_42764932/article/details/113121870
L1、L2 正则化相当与给参数增加一个惩罚因子,这是必要的,我们数据是有干扰的,不正则的话有可能数据对于训练集拟合的特别好,但是对于新数据的预测误差很大。
加入 L1 或 L2 正则化,让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。
可以设想一下对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什幺影响,一种流行的说法是『抗扰动能力强』。
- 加入L2 正则化(regularization)
J = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 J= \frac{1}{2}\sum _{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2}+ \lambda \sum _{j=1}^{n}\theta _{j}^{2} J=21i=1∑m(hθ(x(i))−y(i))2+λj=1∑nθj2
L2约束就是一个圆,要求的就是在约束的条件下寻找最小的损失。所以其实就是找约束的图形和等值线的交点。由于交点在坐标轴(某维度值为零)的概率较小,所以没有让参数稀疏化的作用,但可以让参数变小,减缓过拟合。 - 加入L1 正则化(regularization)
J = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∣ ∣ w ∣ ∣ 1 J=\frac{1}{2}\sum _{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2}+ \lambda ||w||_{1} J=21i=1∑m(hθ(x(i))−y(i))2+λ∣∣w∣∣1
而L1损失的交点更容易在坐标轴上,所以更容易让参数稀疏化,降低模型复杂度,防止过拟合。
4. 过拟合问题问题起源?如何解决?
当训练充足,模型拟合能力非常强,训练数据的轻微不同就能导致学习器的差距很大,若训练数据自身的、非全局的特性被学习器学到了,方差主导泛化误差,就会发生过拟合;
模型太复杂,参数过多,特征数目过多。
方法:
1) 减少特征的数量,有人工选择,或者采用模型选择算法
2) 正则化,即保留所有特征,但降低参数的值的影响。正则化的优点是,特征很多时,每个特征都会有一个合适的影响因子。
5. 偏差、方差
偏差:度量了模型的期望预测和真实结果的偏差, 刻画了模型本身的拟合能力
方差:度量了同样大小的训练集的变动所导致的学习性能的变化, 刻画了数据扰动所造成的影响
噪声:表达了当前任务上任何模型所能达到的期望泛化误差的下界, 刻画了学习问题本身的难度
泛化误差就是偏差的期望,可以分解为方差\偏差\噪声之和
6. 非线性回归怎么做
- 化非线性回归为线性回归通过变量代换,可以将很多的非线性回归转化为线性回归。比如目标函数假设是 y = b 0 + b 1 x + b 2 x 2 y = b_0 + b_1x + b_2x^2 y=b0+b1x+b2x2。那么另 z 1 = x , z 2 = x 2 z_1 = x, z_2 = x^2 z1=x,z2=x2 。目标函数就变为 y = b 0 + b 1 z 1 + b 2 z 2 y = b_0 + b_1z_1 + b_2z_2 y=b0+b1z1+b2z2。就可以用线性回归来解方程。
- 逻辑回归
逻辑回归( Logistic Regression ) 是非线性回归中的一种,在分类问题上有的也能采用逻辑回归分类。
逻辑回归模型中,先给定线性函数,再需要一个函数进行曲线平滑化,由此引入 Sigmoid 函数进行转化。
7.ResNet 的特点
引入跳跃连接,有效地解决了网络过深时候梯度消失的问题,使得设计更深层次的网络变得可行。
8. 什么是 one-shot、zero-shot,区别
zero-shot 就是说测试集中的类别都是训练集中没有见到的;one-shot 就是说测试集中的类别在训练集中很少或者只能见到一次
9. 什么会导致梯度消失,爆炸,解决
网络深度、激活函数
方法:
- 换用Relu、LeakyRelu、Elu等激活函数,防爆炸
- BatchNormalization,防消失
- ResNet残差结构
- 预训练加finetunning
- 梯度剪切,防爆炸
- 正则,防爆炸
10. 什么是fine-tuning?
在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调),或者当做特征提取器。
替换掉网络的输入层(数据),使用新的数据继续训练。
Fine-tune时可以选择fine-tune全部层或部分层。
通常,前面的层提取的是图像的通用特征(generic features)(例如边缘检测,色彩检测),这些特征对许多任务都有用。后面的层提取的是与特定类别有关的特征,因此fine-tune时常常只需要Fine-tuning后面的层。
11. 梯度下降法和牛顿法区别
梯度下降法和牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法是用二阶的海森矩阵的逆矩阵求解。相对而言,使用牛顿法收敛更快(迭代更少次数)。但是每次迭代的时间比梯度下降法长。
梯度下降法:利用一阶导数
牛顿法:利用二阶导数,收敛速度快;但对目标函数有严格要求,必须有连续的一、二阶偏导数,计算量大
x
(
k
+
1
)
=
x
(
k
)
−
λ
(
H
(
k
)
)
−
1
∇
f
(
x
k
)
x^{(k+1)}=x^{(k)}-\lambda\left(H^{(k)}\right)^{-1} \nabla f\left(x^{k}\right)
x(k+1)=x(k)−λ(H(k))−1∇f(xk)
https://www.zhihu.com/search?type=content&q=%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95%E5%92%8C%E7%89%9B%E9%A1%BF%E6%B3%95
12. 卷积尺寸计算
[ F − k + 2 p s ⌋ + 1 \left[\frac{\mathrm{F}-\mathrm{k}+2 p}{\mathrm{~s}}\right\rfloor+1 [ sF−k+2p⌋+1
13. 空洞卷积
(1)从kernel(卷积核)角度:相当于在标准概念的kernel(卷积核)中,相邻点之间添加rate-1个0,然后使用扩张后的kernel(卷积核)与原图进行卷积。如下图rate=2,相当于标准的33卷积核变为55卷积核,每一行中间添加2-1个0
(2)从原图角度:使用标准概念的kernel(卷积核)在原图中每隔rate-1进行像素点卷积采样。如下图rate=2,在原图中每隔rate-1进行卷积。
Dialted convolution最先在使用图像分割领域,图像输入到CNN中提取特征(如FCN),FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测(upsampling
总结来说:包括pooling操作增加感受野和Upsampling扩大至原图尺寸。但是此过程中会由于Pooling操作产生信息的损失,不利于分割或者目标检测。
Dilated convolution就是为了在不是用pooling操作损失信息也能增加感受野。
14. FCN与CNN的区别
-
通常cnn网络在卷积之后会接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。一般的CNN结构适用于图像级别的分类和回归任务。
-
FCN对图像进行像素级的分类,从而解决了语义级别的图像分割问题。FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。
全卷积网络(FCN)是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。
FCN将传统CNN中的全连接层转化成一个个的卷积层,故称为全卷积网络。
FCN把CNN最后的全连接层换成卷积层,输出一张已经label好的图。
15. SVM
SVM的损失函数,
对偶问题求解:用朗格朗日乘子法将有约束优化转化为无约束优化,
线性可分/不可分
优点
非线性间隔映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射。
SVM的目标是找到对特征空间划分的最优超平面,SVM方法的核心是最大化分类边际的思想。
SVM的训练结果是支持向量,在分类决策中起到决定性作用。
SVM是一种小样本的学习方法,从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预测样本的“转导推理”,简化了通常的分类和回归问题。
SVM最终的决策函数只由少数的支持向量决定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,在某种意义上避免了“维数灾难”。
有较好的鲁棒性:增删非支持向量样本对模型没有影响,SVM方法对核的选取不敏感。
不足
SVM算法对大规模训练样本难以实施。
SVM对解决多分类问题存在困难。
16. 直观解释一下拉格朗日乘子法
目标函数 f ( x , y ) f(x,y) f(x,y),约束 g ( x , y ) = C g(x,y)=C g(x,y)=C
显然地,当约束曲线 g = c g=c g=c与某一条等高线 f = d 1 f=d1 f=d1相切时,函数 f f f取得极值。两曲线相切等价于两曲线在切点处拥有共线的法向量。
即他们在这点的法线平行,也就是法向量只差一个任意的常数乘子(取为
λ
λ
λ)
∇
f
(
x
,
y
)
=
−
λ
∇
g
(
x
,
y
)
\nabla f(x, y)=-\lambda \nabla g(x, y)
∇f(x,y)=−λ∇g(x,y)
移项合并,得到
f ( x , y ) + λ g ( x , y ) f(x, y)+\lambda g(x, y) f(x,y)+λg(x,y)
17. Bagging & Boosting
Bagging
原始数据集通过T次随机采样,得到T个与原始数据集相同大小的子数据集,分别训练得到T个弱分类器Classifier,然后结合为一个强分类器。
过拟合的模型,通常方差variance比较大,这时应该用bagging对其进行修正。
bagging中的模型是强模型,偏差低,方差高 。目标是降低方差(variance)。 在bagging中,每个模型的bias和variance近似相同,但是互相相关性不太高,因此一般不能降低bias,而一定程度上能降低variance。
典型的bagging是random forest (RF)。
Boosting
boosting是基于权值的弱分类器集成,不断地迭代更新能使得最终的结果无限接近最优分类
欠拟合的模型,通常偏差bias比较大,这时应该可以用boosting进行修正。使用boosting时, 每一个模型可以简单一些。
boosting中每个模型是弱模型,偏差高,方差低。目标是通过平均降低偏差(bias)。boosting的基本思想就是用贪心法最小化损失函数,显然能降低偏差,但是通常模型的相关性很强,因此不能显著降低variance。典型的Boosting是Adaboost,另外常用的并行Boosting算法是GBDT(gradient boosting decision tree)、XgBoost。 这一类算法通常不容易出现过拟合。
Boosting 算法会倾向于一直分错的样本,如果样本中有离群的错误样本,boosting就会出现效果不好的情况。即对离群值、异常值敏感。
即Adaboost对离群值、异常值敏感。
18. Adaboost和GBDT的异同点
(1) 关注点:分错权值,残差:Adaboost每轮学习的一个基本学习器是通过改变样本的权值,关注上轮分类错误的样本的权值,以逐步减少在训练集上的分类误差率。而GBDT每轮学习一个基本学习器是通过改变输出值,每轮拟合的值为真实值与已有的加法模型的差值(即残差)。
(2) 异常点: adaboost存在异常点敏感的问题, gbdt一定程度上优化了adaboost异常点敏感的问题,但是存在难以并行的缺点
(3)树: GBDT无论是进行分类还是回归问题,都用的CART回归树,adaboost对分类问题用二叉分类树,回归问题用二叉回归树。
(4)方差偏差: 两者的目标都是优化偏差bias,必然导致训练出来的数据方差var的不稳定
19. 随机森林Random Forest (RF)
随机森林实际上是一种特殊的bagging方法,它将决策树用作bagging中的模型。
随机森林就是对决策树的集成,但有两点不同:
(1)采样的差异性:从含m个样本的数据集中有放回的采样,得到含m个样本的采样集,用于训练。这样能保证每个决策树的训练样本不完全一样。
(2)特征选取的差异性:每个决策树的n个分类特征是在所有特征中随机选择的(n是一个需要我们自己调整的参数)
随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。这样能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。
优点
能够处理高维(即特征很多)的数据,并且不用进行特征选择,是随机选择的。
训练结束后,能够给出哪些特征比较重要。
模型的泛化能力较强。
训练速度快,容易做成并行化方法,训练时树与树之间是相互独立的。
在训练过程中,能够检测到特征间的相互影响。
对于不平衡的数据集来说,可以平衡误差。
具有鲁棒性,即使有特征遗失,仍可以维持准确度。
缺点
在噪音较大的分类或回归问题上会出现过拟合。
对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生很大的影响,因此随机森林在这种数据上产生的属性权值是不可信的。
20. RF和GBDT对比
相同点:
都是由多棵树组成;
最终的结果都是由多棵树一起决定;
不同点:
基于bagging思想,而gbdt是boosting思想,即采样方式不同
RF可以并行生成,而GBDT只能是串行;
输出结果,RF采用多数投票,GBDT将所有结果累加起来;
RF对异常值不敏感,GBDT敏感
GBDT和RF哪个容易过拟合?答:RF,因为随机森林的决策树尝试拟合数据集,有潜在的过拟合风险,而boosting的GBDT的决策树则是拟合数据集的残差,然后更新残差,由新的决策树再去拟合新的残差,虽然慢,但是难以过拟合。
组成RF的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
RF对训练集一视同仁,GBDT是基于权值的弱分类器的集成
RF是通过减少模型方差(variance)提高性能,GBDT是通过减少模型偏差(bias)提高性能
21. 正负样本数据量不等
重采样、欠采样、调整权值
衡量指标
对于偏斜类问题,不再用精度accuracy作为模型好坏的衡量指标,因为数据量多的那个分类已经严重影响了整个accuracy,具体要看各个分类的召回率recall(一般我们关注正样本,即1的recall值),更推荐使用roc曲线的auc值(在sklearn中用roc_auc表示)作为衡量指标。
22. 决策树
优点
决策树易于理解和实现,通过解释人们都有能力去理解决策树表达的意义。
数据处理前应当去掉多余的或者空白的属性。
能够同时处理数据型和常规型的属性,可以接受数据属性的多样性。
对缺失值不敏感。
可以处理不相关的特征数据。
只需构建一次,便可以反复使用,每一次预测的最大计算次数不超过决策树的深度。
缺点
容易造成过拟合,即将训练集自身的一些特点作为所有数据的一般性质,导致过拟合,需要进行剪枝处理。
对于有时间顺序的数据,需要很多的预处理的工作。
当类别太多时,错误可能就会增加的比较快。
只能根据一个字段进行分类。
在处理特征关联性比较强的数据时,表现不好。
23. 常见评价指标
TP:预测为1,预测正确,即实际1
FP:预测为1,预测错误,即实际0
FN:预测为0,预测错误,即实际1
TN:预测为0,预测正确,即实际0
-
准确率
a c c u r a c y = ( T P + T N ) / ( T P + F P + F N + T N ) accuracy= (TP+TN)/(TP+FP+FN+TN) accuracy=(TP+TN)/(TP+FP+FN+TN)
样本不平衡时,失效 -
精准率(查准率)precision
所有预测为正的样本中,实际为正的比例,表示模型预测覆盖能力
p r e c i s i o n = T P / ( T P + F P ) precision = TP / (TP + FP) precision=TP/(TP+FP)
-
召回率(查全率)Recall
所有正样本中,被预测为正的比例,体现对新的预测时的confidence score
R e c a l l = T P / ( T P + F N ) Recall = TP/(TP+FN) Recall=TP/(TP+FN)
-
如果你的模型很贪婪,想要覆盖更多的sample,那么它就更有可能犯错。在这种情况下,你会有很高的recall,但是较低的precision。
如果你的模型很保守,只对它很sure的sample作出预测,那么你的precision会很高,但是recall会相对低。
F1-score 就是一个综合考虑precision和recall的metric: 2 ∗ p r e c i s i o n ∗ r e c a l l / ( p r e c i s i o n + r e c a l l ) 2*precision*recall / (precision + recall) 2∗precision∗recall/(precision+recall)
P-R图(查准率-查全率)
遍历0到1之间所有的阈值,而每个阈值下都对应着一对查准率和查全率,从而我们就得到了这条曲线。二者同时达到最高,取一个平衡,平衡点就是F1分数得来的结果。平衡点越靠近右上角越好。 -
ROC
真 正 率 T P R = T P / ( T P + F N ) 真正率TPR = TP/(TP+FN) 真正率TPR=TP/(TP+FN)
假 正 率 F P R = F P / ( F P + T N ) 假正率FPR = FP/(FP+TN) 假正率FPR=FP/(FP+TN)
真正率为所有正样本中,被预测为正的比例。假正率为所有负样本中,被预测为正的比例。
ROC(接受者操作特征曲线)
遍历所有阈值,以假正率为横轴,真正率为纵轴,得到ROC曲线
FPR表示模型虚报的响应程度,而TPR表示模型预测响应的覆盖程度。
我们希望:虚报的越少越好,覆盖的越多越好。即TPR越高,时FPR越低(即ROC曲线越陡),那么模型的性能就越好。 -
AUC(ROC曲线下面积)
即ROC与横轴围成的面积,AUC越大或者曲线越靠左上角,越好
24. 优化器
https://blog.csdn.net/weixin_42764932/article/details/111313967
一阶动量防抖动,二阶动量调学习率
-
sgd 需要设置初始点与学习率,否则容易陷入局部最优
-
Momentum,在SGD基础上引入了一阶动量
m t = μ m t − 1 + g t m_t = μm_{t-1}+g_t mt=μmt−1+gt Δ θ t = − η ∗ m t \Delta \theta_{t}=-\eta * m_{t} Δθt=−η∗mt
下降初期时,使用上一次参数更新,下降方向一致,乘上较大的 μ μ μ能够进行很好的加速;下降中后期时,在局部最小值来回震荡的时候, g r a d i e n t → 0 gradient\to0 gradient→0, μ μ μ使得更新幅度增大,跳出陷阱;在梯度改变方向的时候, μ μ μ能够减少更新
总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛 -
Adagrad
Adagrad其实是对学习率进行了一个约束。Adagard在训练的过程中可以自动变更学习的速率,设置一个全局的学习率,而实际的学习率与以往的参数模和的开方成反比。
前期gt较小的时候, regularizer较大,能够放大梯度
后期gt较大的时候,regularizer较小,能够约束梯度
适合处理稀疏梯度
由公式可以看出,仍依赖于人工设置一个全局学习率
η设置过大的话,会使regularizer过于敏感,对梯度的调节太大;
中后期,分母上梯度平方的累加将会越来越大,使gradient→0,使得训练提前结束。其学习率是单调递减的,训练后期学习率非常小 -
RMSprop
与adadelta算法公式其实是一样
Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。
减小抖动,加快收敛 -
Adam
SGD-Momentum在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
一阶动量:
m t = μ ∗ m t − 1 + ( 1 − μ ) ∗ g t m_t=\mu*m_{t-1}+(1-\mu)*g_t mt=μ∗mt−1+(1−μ)∗gt
二阶动量:
n t = ν ∗ n t − 1 + ( 1 − ν ) ∗ g t 2 n_t=\nu*n_{t-1}+(1-\nu)*g_t^2 nt=ν∗nt−1+(1−ν)∗gt2
m t ^ = m t 1 − μ t \hat{m_t}=\frac{m_t}{1-\mu^t} mt^=1−μtmt
n t ^ = n t 1 − ν t \hat{n_t}=\frac{n_t}{1-\nu^t} nt^=1−νtnt
Δ θ t = − m t ^ n t ^ + ϵ ∗ η \Delta{\theta_t}=-\frac{\hat{m_t}}{\sqrt{\hat{n_t}}+\epsilon}*\eta Δθt=−nt^+ϵmt^∗η
其中, m t m_t mt, n t n_t nt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望 E ∣ g t ∣ E|g_t| E∣gt∣, E ∣ g t 2 ∣ E|g_t^2| E∣gt2∣的估计; m t ^ \hat{m_t} mt^, n t ^ \hat{n_t} nt^是对 m t m_t mt, n t n_t nt的校正,这样可以近似为对期望的无偏估计。
优点- 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
- 对内存需求较小
- 为不同的参数计算不同的自适应学习率
- 也适用于大多非凸优化
- 适用于大数据集和高维空间
25. TensorFlow 怎么在网络结构实现一个 if 判断
第一种方法使用tf.select() op有条件地传递来自作为参数传递的两个张量的值:
pred = tf.placeholder(tf.bool) # Can be any computed boolean expression.
val_if_true = tf.constant(28.0)
val_if_false = tf.constant(12.0)
result = tf.select(pred, val_if_true, val_if_false)
sess = tf.Session()
sess.run(result, feed_dict={pred: True}) # ==> 28.0
sess.run(result, feed_dict={pred: False}) # ==> 12.0
tf.select()的缺点在于,它在计算结果之前先评估val_if_true和val_if_false ,如果它们是复杂的表达式,则可能会很昂贵。
第二种方法使用tf.cond() op,它有条件地计算两个表达式之一。如果表达式很昂贵,这尤其有用
# Define some large matrices
a = ...
b = ...
c = ...
pred = tf.placeholder(tf.bool)
def if_true():
return tf.matmul(a, b)
def if_false():
return tf.matmul(b, c)
# Will be `tf.cond()` in the next release.
from tensorflow.python.ops import control_flow_ops
result = tf.cond(pred, if_true, if_false)
sess = tf.Session()
sess.run(result, feed_dict={pred: True}) # ==> executes only (a x b)
sess.run(result, feed_dict={pred: False}) # ==> executes only (b x c)
x = tf.placeholder(tf.float32, shape=[None, ins_size**2*3], name="x_input")
condition = tf.placeholder(tf.int32, shape=[], name="condition")
W = tf.Variable(tf.zeros([ins_size**2 * 3, label_option]), name="weights")
b = tf.Variable(tf.zeros([label_option]), name="bias")
y = tf.cond(condition > 0, lambda: tf.matmul(x, W) + b, lambda: tf.matmul(x, W) - b)
26. 机器学习特征工程操作
特征工程包括数据与特征处理、特征选择和降维三部分。
数据与特征处理包括:1.数据选择、清洗、采样- 数据格式化;- 数据清洗,填充缺失值、去掉脏数据,将不可信的样本丢掉,缺省值极多的字段考虑不用;- 采样:针对正负样本不平衡的情况,当正样本远大于负样本时,且量都很大时,使用下采样,量不大时,可采集更多的数据或oversampling或修改损失函数;采样过程中可利用分层抽样保持不同类别数据的比例。