偏差-方差分解
偏差-方差分解试图堆学习算法的期望泛化错误率进行拆解,把一种学习算法的期望误差分解为三个非负项的和,即样本 noise、bias 和 variance。
对于训练集 D,测试样本 x,y 为其真实标签,
y
D
y_{D}
yD 为数据集中的标签,
f
(
x
;
D
)
f(x;D)
f(x;D) 为学习的 x 的输出。学习算法的期望预测为
E
D
[
f
(
x
;
D
)
]
E_{D}[f(x;D)]
ED[f(x;D)]。
noise:数据集中的标签和真实标记的差别,是期望误差的下界。
ε
2
=
E
D
[
(
y
D
−
y
)
2
]
\varepsilon^{2}=E_{D}[(y_{D}-y)^{2}]
ε2=ED[(yD−y)2]
bias:期望输出与真实结果的偏离程度,刻画了算法本身的拟合能力。
b
i
a
s
2
(
x
)
=
(
E
D
[
f
(
x
;
D
)
]
−
y
)
2
bias^{2}(x)=(E_{D}[f(x;D)]-y)^2
bias2(x)=(ED[f(x;D)]−y)2
variance:使用样本数相同的不同训练集产生的方差,刻画了数据扰动造成的影响。
v
a
r
(
x
)
=
E
D
[
(
f
(
x
;
D
)
−
E
D
[
f
(
x
;
D
)
]
)
2
]
var(x)=E_{D}[(f(x;D)-E_{D}[f(x;D)])^{2}]
var(x)=ED[(f(x;D)−ED[f(x;D)])2]
泛化误差可如下分解:
E
(
f
;
D
)
=
E
D
[
(
f
(
x
;
D
)
−
y
D
)
2
]
=
b
i
a
s
2
(
x
)
+
v
a
r
(
x
)
+
ε
2
E(f;D)=E_{D}[(f(x;D)-y_{D})^{2}]=bias^{2}(x)+var(x)+\varepsilon^{2}
E(f;D)=ED[(f(x;D)−yD)2]=bias2(x)+var(x)+ε2
随着训练程度的增加,偏差减小,方差增大,泛化误差先减后增。
优化方法
牛顿法
在现有极小点估计值对
f
(
x
)
f(x)
f(x) 做二阶泰勒展开,由极小值点的一阶导为 0 得到递推公式。收敛速度快的优点,每一步都需求解目标函数的海森矩阵。
拟牛顿法
拟牛顿法通过正定矩阵近似海森矩阵的逆矩阵或海森矩阵,简化了这一计算过程。
深度学习中,往往采用梯度下降法作为优化算子,而很少采用牛顿法,神经网络通常是非凸的,这种情况下,牛顿法的收敛性难以保证;只有在迭代点离全局最优很近时,牛顿法才会体现出收敛快的优势;可能被鞍点吸引。
牛顿法和拟牛顿法
梯度下降(Gradient Descent)
算法通过沿梯度
g
t
g_{t}
gt 的相反方向更新权值来最小化损失函数,学习率
α
\alpha
α 控制更新步长。
w
t
=
w
t
−
1
−
α
g
t
w_{t}=w_{t-1}-\alpha g_{t}
wt=wt−1−αgt
共轭梯度下降
在N维优化问题中,每次沿一个方向优化得到极小值,后面再沿其他方向求极小值的时候,不会影响前面已经得到的沿那些方向上的极小值,所以理论上对N个方向都求出极小值就得到了N维问题的极小值。这组方向由于两两共轭,所以就叫他共轭方向法。
随机梯度下降(Stochastic Gradient Descent,SGD)
随机梯度下降(Stochastic Gradient Descent):针对一个训练样本在线学习。
批量梯度下降(Batch Gradient Descent):在整个训练集上计算梯度
g
t
g_{t}
gt。
小批量梯度下降(Mini-batch Gradient Descent):折中方案,在一个 batch 中计算梯度,可利用矩阵计算。
Momentum 动量
SGD 更新方向完全依赖当前 batch,在遇到沟壑时容易陷入震荡,可以为其引入动量 Momentum,加速 SGD 在正确方向的下降并抑制震荡。
v
t
=
η
v
t
−
1
−
α
g
t
v_{t}=\eta v_{t-1}- \alpha g_{t}
vt=ηvt−1−αgt
w
t
=
w
t
−
1
+
v
t
w_{t}=w_{t-1}+v_{t}
wt=wt−1+vt
NAG(Nesterov Accelerated Gradient)
梯度
g
t
g_{t}
gt 不是根据当前参数位置计算出,而是根据先走了本来计划要走的一步后,达到的参数位置计算出来的。
Adagrad
对于更新不频繁的参数,希望单次步长更大,多学习一些知识;对于更新频繁的参数,则希望步长较小,使得学习到的参数更稳定。学习率设置为
η
v
t
+
ε
\frac{\eta}{\sqrt{v_{t}+\varepsilon }}
vt+εη,对于此前频繁更新过的参数,其二阶动量的对应分量较大,学习率就较小。这一方法在稀疏数据的场景下表现很好。
RMSprop 均方根传播
在 Adagrad 中,
v
t
v_{t}
vt 单调递增,导致学习率逐渐递减至 0,可能导致训练过程提前结束。为此考虑在计算二阶动量时不累积全部历史梯度,而只关注最近某一时间窗口内的下降梯度。
v
t
=
ρ
v
t
−
1
−
(
1
−
ρ
)
g
t
2
v_{t}=\rho v_{t-1}- (1-\rho ) g_{t}^{2}
vt=ρvt−1−(1−ρ)gt2
w
t
=
w
t
−
1
−
η
v
t
+
ε
g
t
w_{t}=w_{t-1}-\frac{\eta}{\sqrt{v_{t}+\varepsilon }}g_{t}
wt=wt−1−vt+εηgt
Adam
RMSprop 和 Momentum 的结合。
v
t
=
ρ
v
t
−
1
−
(
1
−
ρ
)
g
t
v_{t}=\rho v_{t-1}- (1-\rho ) g_{t}
vt=ρvt−1−(1−ρ)gt
s
t
=
β
v
t
−
1
−
(
1
−
β
)
g
t
2
s_{t}=\beta v_{t-1}- (1-\beta ) g_{t}^{2}
st=βvt−1−(1−β)gt2
w
t
=
w
t
−
1
−
η
v
t
s
t
+
ε
g
t
w_{t}=w_{t-1}-\eta \frac{v_{t}}{\sqrt{s_{t}+\varepsilon }}g_{t}
wt=wt−1−ηst+εvtgt
损失函数
log 对数损失
L
(
Y
,
P
(
Y
∣
X
)
)
=
−
l
o
g
P
(
Y
∣
X
)
L(Y,P(Y|X))=−logP(Y|X)
L(Y,P(Y∣X))=−logP(Y∣X)
用于逻辑回归,本质上是最小化负的似然函数,健壮性不强,相比于 hinge loss 对噪声更敏感。
sklearn.metrics.log_loss(y_true, y_pred, eps=1e-15, normalize=True, sample_weight=None, labels=None)
def log_loss(y_true, y_pred, eps=1e-15):
p = np.clip(y_pred, eps, 1-eps)
# np.clip截取数组中小于或者大于某值的部分,使其等于固定值
loss = np.sum(- y_true * np.log(p) - (1 - y_true) * np.log(1-p))
交叉熵损失
L
=
−
1
N
∑
i
∑
c
=
1
M
y
i
c
l
o
g
(
y
^
i
c
)
)
L=-\frac{1}{N}\sum_{i}\sum_{c=1}^{M}y_{ic}log(\hat{y}_{ic}))
L=−N1∑i∑c=1Myiclog(y^ic))
最小化交叉熵函数的本质就是对数似然函数的最大化。
torch.nn.CrossEntropyLoss # pytorch中可调用
def cross_entropy(y, y_hat, eps=1e-15):
assert y.shape == y_hat.shape
loss = -np.sum(y * np.log(y_hat + eps) + (1 - y) * np.log(1 - y_hat + eps))
return loss
补充:
事件 x 的信息量是:
I
(
x
)
=
−
l
o
g
(
p
(
x
)
)
I(x)=−log(p(x))
I(x)=−log(p(x)),事件发生概率越大,信息量越小。熵就是对信息量求期望值:
H
(
X
)
=
E
[
I
(
x
)
]
=
−
∑
x
∈
X
p
(
x
)
l
o
g
p
(
x
)
H(X)=E[I(x)]=−\sum_{x\in X}p(x)logp(x)
H(X)=E[I(x)]=−∑x∈Xp(x)logp(x)
相对熵(relative entropy)又称为 KL 散度(Kullback-Leibler divergence),真实分布为 p,
K
L
(
p
∣
∣
q
)
=
E
p
[
l
o
g
p
(
x
)
q
(
x
)
]
=
∑
x
∈
X
p
(
x
)
p
(
x
)
q
(
x
)
KL (p∣∣q)=E_{p}[log\frac{p(x)}{q(x)}]=\sum_{x\in X}p(x)\frac{p(x)}{q(x)}
KL(p∣∣q)=Ep[logq(x)p(x)]=∑x∈Xp(x)q(x)p(x)。
由于
C
r
o
s
s
E
n
t
r
o
p
y
(
p
,
q
)
=
H
(
p
)
+
D
K
L
(
p
∣
∣
q
)
CrossEntropy(p,q)=H(p)+D_{KL}(p∣∣q)
CrossEntropy(p,q)=H(p)+DKL(p∣∣q),最小化交叉熵等同于最小化 KL 散度。
指数损失
L
=
−
1
N
∑
i
e
x
p
(
−
y
i
y
i
^
)
L=-\frac{1}{N}\sum_{i}exp(-y_{i} \hat{y_{i}})
L=−N1∑iexp(−yiyi^)
通常用在 AdaBoost 算法中,对离群点、噪声敏感。
Hinge 损失
L
=
m
a
x
(
0
,
1
−
y
y
^
)
L=max(0,1-y\hat{y})
L=max(0,1−yy^)
常用于 SVM 中,并不鼓励分类器过度自信,使分类器可以更专注于整体的误差。健壮性相对较高,对异常点、噪声不敏感,缺乏概率解释。
Triplet loss
输入一个三元组 <a, p, n>,最终的优化目标是拉近 a, p 的距离, 拉远 a, n 的距离。
a: anchor
p: positive, 与 a 是同一类别的样本
n: negative, 与 a 是不同类别的样本
L
=
m
a
x
(
d
(
a
,
p
)
−
d
(
a
,
n
)
+
m
a
r
g
i
n
,
0
)
L=max(d(a,p)−d(a,n)+margin,0)
L=max(d(a,p)−d(a,n)+margin,0)
Contrastive loss
用于处理孪生神经网络中的 paired data 的关系。d 代表两个样本特征的欧氏距离,y 为两个样本是否匹配的标签。
L
=
1
2
N
∑
n
=
1
N
y
d
2
+
(
1
−
y
)
m
a
x
(
m
a
r
g
i
n
−
d
,
0
)
2
L=\frac{1}{2N}\sum_{n=1}^{N}yd^{2}+(1−y)max(margin−d,0)^{2}
L=2N1∑n=1Nyd2+(1−y)max(margin−d,0)2
focal loss
Huber 损失
L1 会忽视异常点,L2 会向异常点偏移,均存在一些问题。本质上,Huber 损失是绝对误差,只是在误差很小时,就变为平方误差。误差降到多小时变为二次误差由超参数 δ 来控制。当 Huber 损失在 [0-δ,0+δ] 之间时,等价为 MSE,而在 [-∞,δ] 和 [δ,+∞] 时为 MAE。
激活函数
引入非线性函数作为激活函数,提高深层神经网络表达能力,使其可以逼近任意函数。
Sigmoid
f
(
z
)
=
1
1
+
e
−
z
f(z)=\frac{1}{1+e^{-z}}
f(z)=1+e−z1
能够把输入的连续实值变换为 0 和 1 之间的输出,在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,输出不是 0 均值导致参数向同一方向更新使得收敛缓慢,解析式中含有幂运算。
tanh
t
a
n
h
(
z
)
=
e
z
−
e
−
z
e
z
+
e
−
z
tanh(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}
tanh(z)=ez+e−zez−e−z
解决了 Sigmoid 函数的不是 zero-centered 输出问题,然而,梯度消失的问题和幂运算的问题仍然存在。
在 RNN 中直接把激活函数换成 ReLU 会导致非常大的输出值,且也不能解决梯度在长程上传递的问题。
ReLu
R
e
l
u
=
m
a
x
(
0
,
x
)
Relu=max(0,x)
Relu=max(0,x)
计算速度快,解决了正区间梯度消失的问题,输出不是 zero-centered,可能出现某些神经元永远不会被激活。
Leaky ReLU
f
(
x
)
=
m
a
x
(
α
x
,
x
)
f(x)=max(αx,x)
f(x)=max(αx,x)
为了解决 Dead ReLU Problem,提出将 ReLU 的前半段设为 αx 而非 0。对于 PReLu(ParametricReLU),α 可训练。
ELU(Exponential Linear Units)
f
(
x
)
=
x
,
x
≥
0
f(x)=x,x\geq 0
f(x)=x,x≥0
f
(
x
)
=
α
(
e
x
−
1
)
,
x
<
0
f(x)=\alpha (e^{x}-1),x< 0
f(x)=α(ex−1),x<0
融合了 sigmoid 和 ReLU,输出均值接近于零,所以收敛速度更快。
为何 RNN 不能用 ReLu 解决梯度消失和梯度爆炸:
1.和 CNN 每一层使用独立的参数 W 不同,原始的 RNN 在每个阶段都共享一个参数 W,会导致矩阵的连乘,若存在大于1的特征值,在经过若干次连乘后都会导致庞大数值的矩阵;将激活函数换成 ReLU 也不能解决梯度在长程上传递的问题,W 参与了每个时间段的运算,其求导公式复杂,还是会出现连乘;图像信息是稠密的,文本信息是稀疏的,ReLu 很容易造成梯度消失。
2.GRU 和 LSTM 的隐状态的激活函数一般用的 tanh;它们内部的各种门,因为是 0-1 的输出,所以一般用 sigmoid 函数。
朴素贝叶斯
贝叶斯公式: P ( B ∣ A ) = P ( B ) P ( A ∣ B ) P ( A ) P(B|A)=\frac{P(B)P(A|B)}{P(A)} P(B∣A)=P(A)P(B)P(A∣B),A 为类别,B 为特征,后验等于先验乘以似然。算法逻辑简单,易于实现,分类过程中时空开销小;朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的。
极大似然估计(Maximum Likelihood Estimate,MLE):
利用已知的样本结果信息,反推最具有最大概率导致这些样本结果出现的模型参数值。最大化似然函数
a
r
g
m
a
x
θ
P
(
X
∣
θ
)
argmax_{\theta}P(X|\theta)
argmaxθP(X∣θ)。
最大后验概率估计(Maximum A Posteriori estimation,MAP):
最大化在给定数据样本的情况下模型参数的后验概率。
a
r
g
m
a
x
θ
P
(
θ
∣
X
)
=
a
r
g
m
i
n
θ
l
o
g
−
P
(
θ
∣
X
)
=
a
r
g
m
i
n
θ
−
l
o
g
P
(
X
∣
θ
)
−
l
o
g
P
(
θ
)
argmax_{\theta}P(\theta|X)=argmin_{\theta} log-P(\theta|X)=argmin_{\theta}-logP(X|\theta)-logP(\theta)
argmaxθP(θ∣X)=argminθlog−P(θ∣X)=argminθ−logP(X∣θ)−logP(θ)。MAP优化的能量受先验分布影响,在小样本学习中,先验会较大影响拟合结果,随着采样次数的增多,连乘的项更大,先验概率影响会慢慢变小。
似然函数和回归问题的关系:
- 最大化似然概率等价于最小化点估计的能量方程。当给定一个 x,受噪声影响,t 的值并不是一个定值,而应该服从某个概率分布,将此分布和参数 w 联系起来:
假设待拟合的函数服从高斯分布:
对预测函数求解得到的结果和点估计得到的结果表达形式完全一致。 - 后验概率
P
(
w
∣
x
,
t
)
P(w|x,t)
P(w∣x,t) 描述的是参数的概率分布,求得后验概率(参数的概率分布)后,再求得后验概率的期望,即能找到一组合适的参数 w。
后验概率: P ( w ∣ x , t ) = P ( t ∣ x , w ) P ( w ) P ( t ∣ x ) = P ( t ∣ x , w ) P ( w ) ∫ P ( t ∣ x , w ) P ( w ) d w = α ∗ P ( t ∣ x , w ) P ( w ) P(w|x,t)=\frac{P(t|x,w)P(w)}{P(t|x)}=\frac{P(t|x,w)P(w)}{\int{P(t|x,w)P(w)dw}}=\alpha*P(t|x,w)P(w) P(w∣x,t)=P(t∣x)P(t∣x,w)P(w)=∫P(t∣x,w)P(w)dwP(t∣x,w)P(w)=α∗P(t∣x,w)P(w),分母为归一化项。
高斯分布的共轭先验是高斯分布,假设先验和似然都是高斯分布,后验形式也为高斯分布。
似然估计和最小二乘:
极大似然估计与最大后验概率估计
用概率的视角看回归问题
最大似然估计和最小二乘法
L1、L2 正则
L1 正则化求元素的绝对值之和,可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择;一定程度上可以防止过拟合。L2 正则化求元素平方和然后再求平方根,可以防止模型过拟合。
L1 | L2 |
---|---|
从贝叶斯的角度来看,正则化等价于对模型参数引入先验分布。在拉普拉斯分布下
l
o
g
P
(
w
)
logP(w)
logP(w) 的效果等价于在代价函数中增加 L1正则项(ridge regression);在高斯分布下
l
o
g
P
(
w
)
logP(w)
logP(w) 的效果等价于在代价函数中增加 L2 正则项(lasso regression)。拉普拉斯分布:
f
(
x
∣
μ
,
b
)
=
1
2
b
e
x
p
(
−
∣
x
−
μ
∣
b
)
f(x| \mu ,b)=\frac{1}{2b} exp(-\frac{|x-\mu |}{b})
f(x∣μ,b)=2b1exp(−b∣x−μ∣)。
假设预测结果与两个特征相关,L2 正则倾向于综合两者的影响,给影响大的特征赋予高的权重;而 L1 正则倾向于选择影响较大的参数,而舍弃掉影响较小的那个。实际应用中 L2 正则表现往往会优于 L1 正则,但 L1 正则会大大降低我们的计算量。
特征工程
特征预处理
-
标准化和归一化
z-score 标准化: 求样本特征 x 的均值 mean 和标准差 std,用 (x-mean)/std 来代替原特征。使特征均值为0,方差为1。
max-min标准化: 求样本特征 x 的最大值 max 和最小值 min,用 (x-min)/(max-min) 来代替原特征。使特征值映射到[0,1]之间。
L1/L2范数标准化: 求样本特征向量 x 的 L2 范数 ∣ ∣ x ∣ ∣ 2 ||x||_{2} ∣∣x∣∣2,然后用 x / ∣ ∣ x ∣ ∣ 2 x/||x||_{2} x/∣∣x∣∣2 代替原样本特征。 L1 范数标准化用 x / ∣ ∣ x ∣ ∣ 1 x/||x||_{1} x/∣∣x∣∣1 代替原样本特征。通常范数标准化首选 L2。 -
样本清洗: 聚类,若某一个簇里的样本数很少,且簇质心和其他所有的簇都很远,那么这个簇里面的样本极有可能是异常特征样本;异常点检测,使用 iForest 或者 one class SVM,使用异常点检测的机器学习算法来过滤所有的异常点。
特征离散化
连续特征离散化
数据缺失
如果是连续值,那么一般有两种选择,一是选择所有有该特征值的样本,然后取平均值,来填充缺失值,另一种是取中位数来填充缺失值。如果是离散值,则一般会选择所有有该特征值的样本中最频繁出现的类别值,来填充缺失值。
特征选择
过滤法:方差、相关系数、假设检验、互信息。
包装法:递归消除特征法。
嵌入法:L1、L2 正则化,可以得到特征系数、重要度的基学习器。
高级特征:若干特征的加减乘除。
特征选择
数据不平衡
权重法:该类别的样本数多,那么它的权重就低,反之则权重就高。
采样法:对类别样本数多的样本做欠采样;对类别样本数少的样本做过采样。
采样后改变了训练集的分布,可能导致泛化能力差。欠采样的逻辑中往往会结合集成学习来有效的使用数据。SMOTE 算法通过人工合成的方法来生成少类别的样本。
EM算法
似然函数式中多了一个未知的变量 z,目标是找到适合的 θ 和 z 让似然概率最大。通过 Jensen 不等式将和的对数变为对数的和。 E步骤:根据参数初始值或上一次迭代的模型参数来计算出隐性变量的后验概率,其实就是隐性变量的期望,作为隐藏变量的现估计值。M步骤:将似然函数最大化以获得新的参数值。
判别模型和生成模型
判别模型: 求出 P(Y|X),此后对于输入样本 X,根据 P(Y|X) 可以求得标记 Y。线性回归模型、支持向量机等都是判别模型,输入属性 X 可以直接得到 Y。
生成模型: 求出 P(X,Y),对于输入样本 X,求出 X 与不同标记之间的联合概率分布,最大的为 Y。朴素贝叶斯模型、隐马尔可夫模型等都是生成式模型。