K折交叉验证

将原始训练数据分成k个不重叠的子集,,进行k次模型训练和验证,每次在k-1个子集上训练,并在剩余的一个子集进行验证。最后通过k次实验的结果取平均来估算训练和验证误差。

正则化:权重衰减

在训练集较小时为了防止训练过拟合,采用权重衰减正则化的方法,也叫做 $L_2$ 正则化。具体为,在损失函数中加入范数一项。
$$
loss=L(w,b)+\frac{\lambda}{2}||w||^2
$$
更新公式为:
$$
w\leftarrow (1-\eta\lambda)w-\frac{\eta}{|\beta|}\sum x^{(i)}(w^\mathrm Tx^{(i)}+b-y^{(i)})
$$
通常偏置不会被正则化。

1
2
3
4
5
6
7
8
9
10
###定义网络,wd表示系数lambda
net = tf.keras.models.Sequential()
net.add(tf.keras.layers.Dense(1,kernel_regularizer=tf.keras.regularizers.l2(wd)))
...
...
###正则化损失存储在losses中,要手动加入
for epoch
for X,y
with tf.GradientTape() as tape:
l=loss(net(x),y)+net.losses

暂退法

为了提高模型平滑性,在有噪声时也能很好执行,采用暂退法,从表面上看即是在训练过程中,在 $h$ 中按一定概率丢弃一些神经元得到 $h’$ ,并使 $E(h’)=h$ ,因此有以下转换方式:

概率为 $p$ :$h’=0$

其他情况:$h’=\frac{h}{1-p}$

定义模型时采用以下方式

1
2
3
4
5
6
7
8
9
10
11
dropout1,dropout2=0.2,0.5
net = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation=tf.nn.relu),
# 在第一个全连接层之后添加一个dropout层
tf.keras.layers.Dropout(dropout1),
tf.keras.layers.Dense(256, activation=tf.nn.relu),
# 在第二个全连接层之后添加一个dropout层
tf.keras.layers.Dropout(dropout2),
tf.keras.layers.Dense(10),
])

向前传播与反向传播

向前传播

设输入样本是 $x\in R^d$ ,隐藏层不包括偏置,那么:

中间变量是
$$
z=W^{(1)}x
$$
隐藏激活向量是
$$
h=\phi(z)
$$
输出为
$$
o=W^{(2)}h
$$
设损失函数为 $l$ ,标签为 $y$
$$
L=l(o,y)
$$

$$
s=\frac{\lambda}{2}(||W^{(1)}||+||W^{(2)}||)
$$

设目标函数为 $J$
$$
J=L+s
$$

反向传播

$$
\frac{∂J}{∂W^{(1)}}=\frac{∂J}{∂z}x^\mathrm T+\lambda W^{(1)}
$$

$$
\frac{∂J}{∂W^{(2)}}=\frac{∂J}{∂o}x^\mathrm T+\lambda W^{(2)}
$$

Xavier初始化

假设权重 $w_{ij}$ 具有0均值和 $\sigma^2$ 方差,输入 $x_j$ 具有0方差和 $\gamma ^2$ ,且两者独立,对于输出 $o_i=\sum w_{ij}x_j$ ,
$$
E[o_i]=\sum E(w_{ij}x_j)=\sum E(w_{ij})E(x_j)=0
$$

$$
D(o_i)=E(o_i^2)-E(o_i)^2=\sum E(w_{ij}^2x^2_j)=\sum E(w_{ij}^2)E(x_j^2)=n_{in}\sigma^2\gamma^2
$$

保持方差不变的方法是令 $n_{in}\sigma^2=1$ ,但是考虑反向传播过程,也需 $n_{out}\sigma^2=1$ ,故只需使:
$$
\frac{1}{2}(n_{in}+n_{out})\sigma^2=1\ \rightarrow\ \sigma=\sqrt{\frac{2}{n_{in}+n_{out}}}
$$
我们可以从均匀分布中抽取权重,使均匀分布的方差与均值满足以上条件,故得到初始化域:
$$
U(-\sqrt{\frac{6}{n_{in}+n_{out}}},\sqrt{\frac{6}{n_{in}+n_{out}}})
$$

环境和分布偏移

协变量偏移

即训练集和测试集的输入的分布不同。

例如:训练室外拍摄的照片和室内拍摄的照片。

假设观测值 $x_i$ 是从某些源分布 $q(x)$ 得出的,而不是从目标分布 $p(x)$ 中得出的,且 $p(y|x)=q(y|x)$ 。我们需要根据根据数据来自正确分布与来自错误分布的概率之比来重新衡量每个数据样本的权重:
$$
\beta_i\stackrel{\mathrm{def}}{=}\frac{p{(x_i)}}{q(x_i)}
$$

$$
\underset{f}{minimize}\frac{1}{n}\sum\beta_il(f(x_i),y_i)
$$

从源分布和目标分布中抽取 $x$ ,采用 $logic$ 回归来将 $x_i$ 分类,设来自于 $p$ 令 $z=1$ ,来自于 $q$ 令 $z=-1$ ,那么可以得到 $P(z=1|x)=\frac{1}{1+exp(-h(x))}$ ,那么就有:
$$
\beta_i=\frac{1/(1+exp(-h(x_i)))}{exp(-h(x_i))/(1+exp(-h(x_i)))}=exp(h(x_i))
$$
完整过程即为:

  1. 根据 $p(x)$ 和 $q(x)$ 生成二元分类训练集。
  2. 二元逻辑回归得到 $h$ 函数
  3. 计算 $\beta_i$ 。
  4. 进行加权数据的训练。

标签偏移

即训练集标签分布和测试集标签分布不同。

如:老年人得流感的数据与年轻人得流感的数据。

假设有 $q(x|y)=p(x|y)$ 。现在的加入方程的权重变成了:
$$
\beta_i\stackrel{\mathrm{def}}{=}\frac{p{(y_i)}}{q(y_i)}
$$
因此需要估计 $p(y)$ 。因无法直接获得目标标签的分布,因此采用其他方法进行估计:

假设现在有一个特别强大的分类器,能做到对于训练集分类特别准确,构造混淆矩阵 $C_{k\times k }$ ,其中 $c_{ij}$ 表示真是标签是 $j$ 预测标签为 $i$ 的概率,设 $\mu(\hat y_i)$ 表示标签 $i$ 在训练集中预测的平均总得分,那么有:
$$
Cp(y)=\mu(\hat y)
$$
可以反解出 $p(y)=C^{-1}\mu(\hat y)$ 。