文章目录
- 特征选择
- 一、GBDT和Xgboost简介
- 二、 GBDT+LR
- 协同过滤,SVD的劣势:
- 极大化似然估计
- Wide&Deep
- xDeepFM
- 朴素贝叶斯
- SVM
- 转为拉格朗日函数
- 转为对偶问题
- 决策树分类
- 交叉熵损失函数
- 数据预处理
- 连续型特征为什么取对数
- 深度学习
- 激活函数的作用
- Softmax与Sigmoid
- 基于用户序列的word2vec
- 理想ONE芯片
- Word2vec
- 数据不均衡
- 牛顿冷却定律
- 数据过采样和欠采样的方法(处理数据不均衡)
- 朴素随机过采样(上采样)
- 朴素随机欠采样(下采样)
- SMOTE法过采样
- 矩阵分解方法ALS
- BN层的意义
- SGD, ADAM优化器
- 卷积后尺寸的大小
- 如何理解卷积、池化等、全连接层等操作
- 一维卷积
- 二维卷积
特征选择
- df.info()观察缺失值情况,若缺失值占很多则丢弃该特征
- 根据数据,观察特征的数据分布,可通过箱线图观察异常值分布
- 根据方差,皮尔逊系数等手段剔除方差较小,相似度较高的特征
- 根据模型来筛选,如LR权重可以直接体现线性相关性。随机森林与GBDT可以直接体现非线性相关性。
- IV值,psi指数分别体现信息增益,特征稳定性
一、GBDT和Xgboost简介
GBDT,梯度提升树,是一种基于Boosting的集成串行加法模型,用负梯度来拟合残差,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差
。本质为损失函数的泰勒一阶展开。
Xgboost,基本思想和GBDT相同,但是做了一些优化,比如二阶导数使损失函数更精准;增加正则项避免树过拟合;Block存储可以并行计算等。
本质为损失函数的泰勒二阶展开。
GBDT在回归问题上的树的生成过程, 损失函数和迭代原理可以参考给出的链接, 回归问题中一般使用的是平方损失, 而二分类问题中, GBDT和逻辑回归一样, 使用的下面这个:
在函数空间而言,泰勒一阶展开,
可以看出,损失函数的每一次优化,到最终都转化为每次迭代增量(即残差)的累加和 Σ t f t ( x ) \Sigma_{t}f_t(x) Σtft(x),而累加和正是每次损失函数优化过程中与上一次损失函数结果存在的差距,即上一次优化中训练错的样本累积而成。
因此,Boosting算法每次训练时,对前一层基分类器分错的样本给与更高的权重
GBDT在函数空间中利用了梯度下降法进行优化,即用到了泰勒公式的一阶展开式
Xgboost在函数空间中用到了牛顿法进行优化,即用到了泰勒公式的二阶展开式
实际上GBDT泛指所有梯度提升树算法,包括Xgboost
作为GBDT的高效实现,XGBoost是一个上限特别高的算法,因此在算法竞赛中比较受欢迎。简单来说,对比原算法GBDT,XGBoost主要从下面三个方面做了优化:
-
一是算法本身的优化:在算法的弱学习器模型选择上,对比GBDT只支持决策树,还可以直接很多其他的弱学习器。在算法的损失函数上,除了本身的损失,还加上了正则化部分。在算法的优化方式上,GBDT的损失函数只对误差部分做负梯度(一阶泰勒)展开,而XGBoost损失函数对误差部分做二阶泰勒展开,更加准确。梯度下降法只从当前位置选择一个坡度最大的方向走一步,而牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑走了一步后,坡度是否会变得更大。
-
二是算法运行效率的优化:对每个弱学习器,比如决策树建立的过程做并行选择,找到合适的子树分裂特征和特征值。在并行选择之前,先对所有的特征的值进行排序分组,方便前面说的并行选择。对分组的特征,选择合适的分组大小,使用CPU缓存进行读取加速。将各个分组保存到多个硬盘以提高IO速度。
-
三是算法健壮性的优化:对于缺失值的特征,算法本身加入了L1和L2正则化项,可以防止过拟合,泛化能力更强。xgboost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。
GBDT | Xgboost | |
---|---|---|
基学习器 | 只支持CART树 | 除了CART还有LR |
正则化项 | L2正则 + shrinkage scales + 列采样、行采样,用于控制模型的复杂度,包含了树的叶子节点个数、每个叶子节点上输出的score是L2模的平方和,使学习出来的模型更加简单,防止过拟合 | |
缺失值 | 需要处理缺失值 | 不需要处理缺失值,能自动学习出她的分裂方向 |
原理 | 泰勒一阶展开 | 泰勒二阶展开 |
并行 | 不支持 | 支持,xgboost在训练之前,预先对数据进行排序,然后保存block结构,后面的迭代中重复的使用这个结构,大大减小计算量 |
自定义损失函数 | 不支持 | 支持,只要满足函数存在一阶导和二阶导 |
列抽样 | 不支持 | 能降低过拟合,还能减少计算 |
二、 GBDT+LR
LR优缺点:
优点:
- 可解释性好
- 计算复杂度低;对特征维度进行加权求和即可,因此适合处理海量id类特征,用id类特征有一个很重要的好处,就是防止信息损失
- 具备良好的记忆能力,所谓记忆能力就是能够将对模型输出影响较大的那个特征赋予较高的权重,对历史数据有着变相的记忆能力。
- 易于得到离散化目标值0或1,即通过Sigmoid激活函数将原始输出映射到0-1的概率区间
缺点:
- 学习能力只能够限制于线性空间。对于线性不可分的数据,首先对连续特征的处理需要先进行离散化,分桶等。
- 在推荐领域,往往需要人工去构建大量的特征组合,人力成本较大,且每一个新的项目都需要重新去根据业务构建特征组合,费劲。
GBDT优缺点:
优点:
- GBDT作为一种常用的树模型,可天然地对原始特征进行特征划分、特征组合和特征选择,并得到高阶特征属性和非线性映射。
- 集成学习,通过多个基类学习器(CART树)不断向着减小残差的方向优化,残差指的就是当前模型损失函数的负梯度值,因为其本质是损失函数的泰勒一阶展开,公式到最后化简,实际上就是残差的累积,即每次都给训练错的数据赋予较高的权重
算法组合:
Stacking思想,类似于嫁接植物的思想。即将学习层模型对原始数据所得的预测结果作为新的特征集,并输入给输出层模型得到分类结果。
如上图所示,GBDT算法的图示部分形如一棵倒过来的树,其根部即代表训练GBDT算法的原始数据集,经过树算法对原始数据的切分,可得到代表不同新特征的叶子节点。
再将GBDT所得的叶子节点输入LR算法,经过线性分析和sigmoid映射,即可得到模型分类结果。
优点:
通过GBDT来实现LR前期人工特征组合的构建,包括连续型特征离散化,特征交叉等
决策树的深度就决定了特征交叉的维度。如果决策树的深度为4,通过三次节点分裂,最终的叶节点实际上是进行了3阶特征组合后的结果,如此强的特征组合能力显然是FM系的模型不具备的。但由于GBDT容易产生过拟合,以及GBDT这种特征转换方式实际上丢失了大量特征的数值信息,因此我们不能简单说GBDT由于特征交叉的能力更强,效果就比FM或FFM好
协同过滤,SVD的劣势:
协同过滤和矩阵分解存在的劣势就是仅利用了User与Item相互行为信息进行推荐, 忽视了用户自身特征, 物品自身特征以及上下文信息等,导致生成的结果往往会比较片面。
UserCF(适用于用户数量小于Item数量的场景):
-
统计数据,构建user_id与item_id的数据集,如
{user_id1: [item_id1, item_id2,…,item_idn], user_id2…} -
构建item->user的倒排表,也就是每个item对应有那些用户有过点击,方便后续计算。
{item_id1: {user_id1, user_id2, … , user_idn}, item_id2: …} -
计算协同过滤矩阵:
即利用item-users倒排表统计用户之间交互的商品数量,用户协同过滤矩阵的表示形式为:
sim = {user_id1: {user_id2: num1}, user_id3:{user_id4: num2}, …}
在计算用户协同过滤矩阵的同时还需要记录每个用户所交互的商品数量
num = {user_id1:num1, user_id2:num2, …} -
计算相似度矩阵
print('计算相似度...')
for u, users in tqdm(sim.items()):
for v, score in users.items():
sim[u][v] = score / math.sqrt(num[u] * num[v]) # 余弦相似度分母部分
- 给验证集的用户进行TopN推荐
在对用户进行推荐之前需要先通过相似度矩阵得到与当前用户最相思的前K个用户; 然后对这K个用户交互的商品中除当前测试用户训练集中交互过的商品以外的商品计算最终的相似度分数; 最终推荐的候选商品的相似度分数是由多个用户对该商品分数的一个累加和
print('给测试用户进行推荐...')
items_rank = {}
for u, _ in tqdm(val_user_items.items()): # 遍历测试集用户,给测试集中的每个用户进行推荐
items_rank[u] = {} # 初始化用户u的候选item的字典
for v, score in sorted(sim[u].items(), key=lambda x: x[1], reverse=True)[:K]: # 选择与用户u最相思的k个用户
for item in trn_user_items[v]: # 遍历相似用户之间交互过的商品
if item not in trn_user_items[u]: # 如果相似用户交互过的商品,测试用户在训练集中出现过,就不用进行推荐,直接跳过
if item not in items_rank[u]:
items_rank[u][item] = 0 # 初始化用户u对item的相似度分数为0
items_rank[u][item] += score # 累加所有相似用户对同一个item的分数
基于ItemCF
ItemCF对用户冷启动不敏感,对于新加入的用户,一旦新用户对某物品产生行为,ItemCF可以给该新用户推荐和该物品相似的物品,
其中P(u,j)表示用户u对物品j的兴趣,S(j,k)表示和物品j最相似的k个物品,N(u)表示用户产生过行为的物品集合,Wji:物品j和物品i的相似度
r(u,i)表示用户u对物品i是否产生过行为(对于评分系统,可以表示u对i的评分)。
解释起来,就是如果要求得用户u对物品j的打分,首先选取与物品j最相似的K个邻居物品(K是超参数),分别利用这K个物品中与物品j的相似性( W j , i W_{j,i} Wj,i)和用户对物品i的打分,然后求和。因此K的选取很重要
UserCF更加社会化而ItemCF更加个性化 。
极大化似然估计
极大似然估计,只是一种概率论在统计学的应用,它是参数估计的方法之一。说的是已知某个随机样本满足某种概率分布,但是其中具体的参数不清楚,参数估计就是通过若干次试验,观察其结果,利用结果推出参数的大概值。
Wide&Deep
顾名思义,是由单层的Wide部分(LR)和多层的Deep部分(DNN)组成的混合模型。Wide部分的主要作用是让模型具有较强的“记忆能力”;Deep部分的主要作用是让模型具有“泛化能力”,记忆特征交互是有效且可解释的,而泛化则需要更多的特征工程工作,正是这样的结构特点,使模型兼具了逻辑回归和深度神经网络的优点-----能够快速处理并记忆大量历史行为特征,并且具有强大的表达能力
Wide部分采用LR(即无激活函数的神经元),输入数据是原始特征和交叉特征(实现方式为PolynomialFeatures(degree=2, interaction_only=True)),例如有a,b两个特征,多项式处理后为(a^2, ab, b2)
为何不采用直接DNN?
Re: 深度神经网络可以通过稀疏特征学习到的低维稠密向量生成更好的未知特征组合。然而,当用户-商品交互行为比较稀疏且排名较高时,有向量的深度神经网络会过拟合并且推荐不太相关的东西。
1.DNN的交叉交互是隐式的高阶的,其形式是未知的、不可控的;同时它们的特征交互是发生在元素级(bit-wise)。
2.理论上来说DNN可以拟合任意函数,但并没有提供任何关于如何找到这样一个拟合完美的函数的保证。
3.一是根据具体的问题场景提出更好的模型,这些特定的模型会比较适合各自的场景,从而降低拟合难度,比如各类CNN,RNN,GNN等。 二是提出更好的优化方法,使得学习拟合的过程更快速高效。三是提取更好的特征,从而在源头上降低拟合的难度,提升性能的上限。
xDeepFM
分为3个部分,在原有Wide&Deep基础上引入了CIN(压缩交互网络),使得特征交叉体现在显示的体现在特征向量级,自动地构造有限高阶的特征叉乘。
从模型结构图可以看出,CIN和 DNN共用embedding层的结果,然后FM部分负责低阶特征组合(二阶),而DNN负责高阶特征组合,然后将低阶和高阶部分合在一起训练,手动构造二阶项,尽可能覆盖大多数的简单逻辑,而又不至于让模型过于复杂。
为何不进一步穷举二阶以上的交叉特征?
1.二阶交叉特征通过穷举所有的原始特征对得到,那么通过穷举的方法得到更高阶的交叉特征,必然会产生组合爆炸的维数灾难,导致网络参数过于庞大而无法学习
2.关于xDeepFM的另一个贡献点“有限阶数特征交叉”,所具备的优点之前也提到过。简单DNN结构虽然说能够隐式交叉特征,学习任意函数的表示,但是我们并不清楚其最大特征交叉阶数为多少,简单来说就是无法得知哪些特征交叉可以得到最佳效果,而显式指定阶数交叉特征能够在一定程度缓解这些问题。
Step1
把上一层隐层的输出结果
X
k
X_{k}
Xk和 原始的
X
0
X_0
X0进行组合,组合的方式是一种内积的形式
朴素贝叶斯
SVM
支持向量机模型也是类似,我们最终也能够找到合适的超平面 w T x + b = 0 w^Tx+b=0 wTx+b=0,且关于此超平面还能够找到距超平面存有一定间隔的成对称的正反两个的超平面 w T x + b = 1 w^Tx+b=1 wTx+b=1, w T x + b = − 1 w^Tx+b=-1 wTx+b=−1。所有分类为正的样本将划分在 w T x + b = 1 w^Tx+b=1 wTx+b=1的一侧,所有分类为负的样本将划分在 w T x + b = − 1 w^Tx+b=-1 wTx+b=−1的一侧。
优化目标:
M
a
r
g
i
n
=
2
∣
∣
w
∣
∣
2
Margin=\frac{2}{||w||_2}
Margin=∣∣w∣∣22
等价于
转为拉格朗日函数
原始优化问题如下:
若代价函数满足KKT条件,我们可以通过拉格朗日函数将我们的优化目标转化为无约束的优化函数:
在满足约束条件得情况下,
m
a
x
L
(
w
,
b
,
α
)
maxL(w,b,\alpha)
maxL(w,b,α)对
α
\alpha
α求最大值,等价于
f
(
x
)
f(x)
f(x),因此原始优化问题通过拉格朗日可改为:
转为对偶问题
这个拉格朗日函数满足KKT条件,我们可以通过拉格朗日对偶将该问题转化为等价的对偶问题来求解。我们可以先求优化函数对于
w
w
w和
b
b
b的极小值。接着再求拉格朗日乘子
α
\alpha
α的极大值,即:
决策树分类
-
ID3,采用信息增益
在面对“取值数目较多的属性”,ID3算法采用的信息增益原则会对其有所偏好!泛化能力差! -
CART,采用基尼指数
直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其标签不一致的概率。Gini(D)越小,说明不一致概率越低,数据纯度越高。这与信息增益相反。
-
预剪枝
预剪枝表示,在利用训练集来构造树的过程中,对树的每一次生长都要在验证集上做一次预估,观察生长前和生长后的性能有没有提升,如果有提升,那么进行生长。如果没有,那么不要这次划分。 -
后剪枝
后剪枝是基于训练集生成的完整决策树,自底向上反过来评估剪枝前后的精度。
交叉熵损失函数
交叉熵,本身表示两个概率p,q分布之间的关系,或者说相似性,用样本的真实分布p来衡量识别一个样本分布的期望为。
可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。
在LR,神经网络等问题中,常会使用激活函数将特征的数值输出转为概率分布,如Sigmoid激活函数将数值输出转为0-1的概率分布。
但使用了激活函数后,若使用MSE作为损失函数则不是凸函数,使用梯度下降等优化器则会陷入局部最优值,因此要使用另一种损失函数。
当y=1时
显然,预测输出越接近真实样本标签 1,损失函数 L 越小;预测输出越接近 0,L 越大。因此,函数的变化趋势完全符合实际需要的情况。
当y=0时
数据预处理
# 简单处理特征,包括填充缺失值,数值处理,类别编码
def data_process(data_df, dense_features, sparse_features):
data_df[dense_features] = data_df[dense_features].fillna(0.0)
for f in dense_features:
data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1) # 取对数
data_df[sparse_features] = data_df[sparse_features].fillna("-1")
for f in sparse_features:
lbe = LabelEncoder()
data_df[f] = lbe.fit_transform(data_df[f])
return data_df[dense_features + sparse_features]
连续型特征填充0.0
离散型也正填充-1
连续型特征为什么取对数
对所有数值进取对数(lambda x: np.log(x+1) if x>-1 else -1),这种操作可以使直方图中山峰偏左的数据转化为山峰处在中间、近似正态分布的数据。
- 缩小数据的绝对数值,方便计算。例如,每个数据项的值都很大,许多这样的值进行计算可能对超过常用数据类型的取值范围,这时取对数,就把数值缩小了,例如TF-IDF计算时,由于在大规模语料库中,很多词的频率是非常大的数字。
- 取对数后,可以将乘法计算转换称加法计算。
深度学习
激活函数的作用
- 将特征的线性的加权求和转为非线性映射,这样就可以通过多层的隐含层去逼近任何函数,若单纯的线性组合则增加多个隐含层没有意义,终究还是线性的,逼近不了任何函数。
- 优秀的激活函数是可微的,但Sigmoid作为激活函数,容易存在梯度消失的问题(当输入极大或极小时),且Sigmoid存在指数项,计算量大。而ReLU能够在输入>0时,呈现单调的递增,不仅求梯度容易,而且不存在梯度消失的问题,且当输入<0时,输出为0,使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存。有LeakyReLU函数能够将<0的部分解决,但实际效果还是不如ReLU
- 激活函数必须是单调的,且激活后为凸函数,方便优化器实现梯度下降
Softmax与Sigmoid
Softmax用于多分类场景,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!
- 先将多分类输出 s 1 , s 2 , s 3 s_1, s_2, s_3 s1,s2,s3,经过指数函数exp,映射为(0,1)区间内,得到 y 1 , y 2 , y 3 y_1, y_2, y_3 y1,y2,y3,其中 y 1 = e ( s 1 ) , y 2 = e ( s 2 ) , y 3 = e ( s 3 ) y1=e^{(s_1)}, y2=e^{(s_2)}, y_3=e^{(s_3)} y1=e(s1),y2=e(s2),y3=e(s3)。
- 若
y
1
,
y
2
,
y
3
=
0.05
,
4.48
,
14.88
y_1, y_2, y_3=0.05, 4.48, 14.88
y1,y2,y3=0.05,4.48,14.88
z 1 = y 1 / ( y 1 + y 2 + y 3 ) = 0.05 / ( 0.05 + 4.48 + 14.88 ) = 0.0026 z_1 = y_1/(y_1+y_2+y_3) = 0.05/(0.05+4.48+14.88) = 0.0026 z1=y1/(y1+y2+y3)=0.05/(0.05+4.48+14.88)=0.0026
z 2 = y 2 / ( y 1 + y 2 + y 3 ) = 4.48 / ( 0.05 + 4.48 + 14.88 ) = 0.2308 z_2 = y_2/(y_1+y_2+y_3) = 4.48/(0.05+4.48+14.88) = 0.2308 z2=y2/(y1+y2+y3)=4.48/(0.05+4.48+14.88)=0.2308
z 3 = y 3 / ( y 1 + y 2 + y 3 ) = 14.88 / ( 0.05 + 4.48 + 14.88 ) = 0.7666 z_3 = y_3/(y_1+y_2+y_3) = 14.88/(0.05+4.48+14.88) = 0.7666 z3=y3/(y1+y2+y3)=14.88/(0.05+4.48+14.88)=0.7666
因此结果可表达为,分类为z3的概率最高!
基于用户序列的word2vec
每个人的兴趣都是有时效性的,这意味着说,3年前我喜欢王菲的歌,去年我喜欢五月天的歌,而今年我可能就改摇滚路线,喜欢汪峰的歌了。
每一首歌的热度也是不一样的,有一些热门的歌,如果用户能喜欢,当然是首选
那么,我们来做一个粗暴一点点的处理,把这2个维度拉进来,一起来针对一个用户做推荐。
把每个用户喜欢(收藏)过的歌,沿着时间轴排好,同时由近到远给不同的衰减因子(比如最近一首歌是1,前一首是0.98,再前一首是0.98^2,以此类推…),同时我们针对不同的歌曲热度,给定不同的推荐因子(比如热度100的是1,热度80的是0.9…),每一首歌都可以拿回一个song2vec的推荐列表和对应的相似度,对相似度以时间衰减因子和热度权重进行加权,最后的结果排序后,展示给用户。
理想ONE芯片
车机具备4块大屏
中央大屏和副驾娱乐屏则是通过高通骁龙车规级 820A SoC驱动,运行比较开放的 Android 系统。
仪表盘和车控屏通过德州仪器 J6 芯片驱动,运行比较稳定的 Linux 系统;
Word2vec
数据不均衡
大样本:欠采样(RandomUnderSampler.fit(x,y))
小样本:过采样(RandomOverSampler.fit(x,y)),1.加噪声采样 2.复制粘贴 3.小样本加权组合构建新样本
采用AUC/ROC作为评估指标(y:真正例率(召回率)x:假正例率)
模型选用Boosting, 如XGBOOST中的参数scale_pos_weight
若负样本假如为60000,正样本有20000,则负样本是正样本数量的3倍,因此可以设置scale_pos_weight = 3(负样本/正样本的比重)
牛顿冷却定律
T(t):物体当前的温度
H:为周围的温度
k: 为比例系数
数据过采样和欠采样的方法(处理数据不均衡)
朴素随机过采样(上采样)
针对不平衡数据, 最简单的一种方法就是生成少数类的样本, 这其中最基本的一种方法就是: 从少数类的样本中进行随机采样来增加新的样本,对应Python库中函数为RandomOverSampler:
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_sample(X, y)
朴素随机欠采样(下采样)
与过采样相反,欠采样是从多数类样本中随机选择少量样本,再合并原有少数类样本作为新的训练数据集。
随机欠采样有两种类型分别为有放回和无放回两种,无放回欠采样在对多数类某样本被采样后不会再被重复采样,有放回采样则有可能。
对应Python库中函数为RandomUnderSampler,通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样。
from imblearn.over_sampling import RandomUnderSampler
ros = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = ros.fit_sample(X, y)
随机采样最大的优点是简单,但缺点也很明显。上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;而下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分。
上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点
SMOTE法过采样
SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,具体下图所示,算法流程如下:
1、对于少数类中每一个样本x,计算该点与少数类中其他样本点的距离,得到最近的k个近邻(即对少数类点进行KNN算法)。
2、根据样本不平衡比例设置一个采样比例以确定采样倍率,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x’。
3、对于每一个随机选出的近邻x’,分别与原样本按照如下的公式构建新的样本:
xnew=x+rand(0,1) ∗ (x′−x)
from imblearn.over_sampling import SMOTE
X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(X, y)
矩阵分解方法ALS
因为p和q两个变量未知,因此损失函数不是凸函数,无法使用凸优化求解。
但是,如果固定p,那么损失函数是只关于q的二次函数,用解二次函数方法。
因此,可固定p,求q;再固定q,求p,这样迭代下去,此即为交替一词出处。
BN层的意义
BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
SGD, ADAM优化器
卷积后尺寸的大小
如何理解卷积、池化等、全连接层等操作
卷积的作用:相当于滤波器,提取图片不同的特征,生成feature_map
激活函数的作用:引入非线性因素
池化的作用:1、减少特征维度大小,使特征更加可控,减少参数个数,从而控制过拟合程度,增加网络对略微变换后的图像的鲁棒性;2、达到一种不变性,包括translation,rotation,scale等。3、会造成梯度稀疏,丢失信息,GAN网络中通常使用带步长的卷积,进行下采样来替代pooling。
全连接的作用:对提取到的特征进行分类和回归。