1. 初始参数的网络自适应
方法1:用已有数据集(ImageNet)先训练一个模型,在新数据集上,以此模型作为初始模型做fine tuning得到新模型。也就是传统的pretrain + fine tuning。
缺点:新训练出来的模型可能更偏向于新数据集的分布和特征。
方法2:基于KLD的方法
在fine tuning的过程中考虑新数据和老数据集。新训练的模型不要偏离原有的数据集太远。假设我们有两个数据集,旧数据集得到的模型A, 新数据集得到的模型B。新的数据集是 x x x。于是我们有
我们使用的损失函数是:
J
=
α
⋅
J
1
(
x
,
y
,
w
)
+
(
1
−
α
)
⋅
J
2
(
x
,
w
~
,
w
)
J=\alpha \cdot J_{1}(x, y, w)+(1-\alpha) \cdot J_{2}(x, \widetilde{w}, w)
J=α⋅J1(x,y,w)+(1−α)⋅J2(x,w
,w)
这里的
J
1
J_1
J1代表的是模型B的损失函数,也就是
y
y
y和
y
^
\hat{y}
y^的距离。在训练模型B的同时,我们同时要想办法控制B不要偏离原模型A太远。因此我们要把输入
x
x
x同时输入模型A和模型B。通过控制模型A的输出
y
ˉ
\bar{y}
yˉ与
y
y
y的kl距离不要太远,来控制模型B与模型A的距离。这里
J
2
J_2
J2就是KL距离。加权平均系数
α
\alpha
α视情况设定更偏向于泛化还是特殊。
2.数据的混合
假设通用数据集很大。但是新增数据集情况不同
- 新增数据量比较大。一般直接均匀混合,一起训练,效果好,训练慢,难以快速迭代。一般新增数据相对通用数据集大小比例超过10%就可以直接混合了。
- 新增数据量比较小。直接混合的影响就很小,因此不能直接混合。采用的方法是:假设通用数据集有100万条数据,前面80万条数据先训练。然后等到后面20万条数据时,把1000条新增的小数据集混合,然后继续训练,这样新增数据量产生的影响就会更加明显。
3.对抗神经网络
正常的深度学习用的不多。新的地方在于监督和非监督学习同时存在于生成对抗网络中。
GAN的原理非常简单。以生成图片为例,我们有两个网络,Generator和Discriminator,它们的功能分别为:
- G是生成图片的网络,它接受一个随机的噪声z,通过这个噪声生成图片,记作 G ( z ) G(z) G(z)。
- D D D是一个判别网络,判断一张图片是不是”真实的“(也即是输出1和0)。假设输入图片是 x x x,输出 D ( x ) D(x) D(x)代表 x x x为真实图片的概率,如果是1,就表示100%是真实的图片对象,如果输出是0,就代表不可能是真实的图片对象。
中间是一个开关。在训练过程中,假如开关连接真实图片集,从 D D D的角度来看,想尽量输出1,分辨出真正的人脸。假如开关连接fake samples时,此时从 D D D的角度看,想尽量输出0,分辨出假的人脸,也就是 D ( G ( z ) ) → 0 D(G(z))\rightarrow 0 D(G(z))→0。
而生成网络 G G G的目标就是尽量生成真实的图片人脸,去欺骗 D D D,尽量让 D D D输出1,也就是 D ( G ( z ) ) → 1 D(G(z))\rightarrow 1 D(G(z))→1。 D D D的目标是尽量把 G G G生成的图片和真实图片分别开来。这样两个网络就形成了一个动态的“博弈过程”。
为了进一步理解,我们要观察这个结构的损失函数:
min
G
max
D
V
(
D
,
G
)
=
E
x
∼
p
data
(
x
)
[
log
D
(
x
)
]
+
E
z
∼
p
z
(
z
)
[
log
(
1
−
D
(
G
(
z
)
)
)
]
\min _{G} \max _{D} V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))]
GminDmaxV(D,G)=Ex∼pdata (x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
损失函数的优化分为两个部分:
- 针对判别器D的优化,这步优化是让损失函数变大,也就是 max D V ( D , G ) \max _{D} V(D, G) maxDV(D,G)
- 针对生成器G的优化,这步优化是让损失函数变小,也就是 min G V ( D , G ) \min _{G} V(D, G) minGV(D,G)
因为D的优化是要尽量使得
D
(
x
)
=
1
D(x)=1
D(x)=1并让
D
(
G
(
z
)
)
=
0
D(G(z))=0
D(G(z))=0,也就是让
log
D
(
x
)
\log D(\boldsymbol{x})
logD(x)和
log
(
1
−
D
(
G
(
z
)
)
)
\log (1-D(G(\boldsymbol{z})))
log(1−D(G(z)))尽量从负方向向0增长。因此这里的优化是随机梯度增加(ascending its stochastic gradient) 。注意,这步优化同时要在真实数据集和伪数据集同时提取minibatch samples。
∇
θ
d
1
m
∑
i
=
1
m
[
log
D
(
x
(
i
)
)
+
log
(
1
−
D
(
G
(
z
(
i
)
)
)
)
]
\nabla_{\theta_{d}} \frac{1}{m} \sum_{i=1}^{m}\left[\log D\left(\boldsymbol{x}^{(i)}\right)+\log \left(1-D\left(G\left(\boldsymbol{z}^{(i)}\right)\right)\right)\right]
∇θdm1i=1∑m[logD(x(i))+log(1−D(G(z(i))))]
而针对G的优化是要尽量使得
D
(
G
(
z
)
)
=
1
D(G(z))=1
D(G(z))=1,也就是让
log
(
1
−
D
(
G
(
z
)
)
)
\log (1-D(G(\boldsymbol{z})))
log(1−D(G(z)))尽量从0向负方向减小。因此这里的优化就是随机梯度下降(descending its stochastic gradient)。注意,这步优化只在伪数据集提取minibatch samples.
∇
θ
9
1
m
∑
i
=
1
m
log
(
1
−
D
(
G
(
z
(
i
)
)
)
)
\nabla_{\theta_{9}} \frac{1}{m} \sum_{i=1}^{m} \log \left(1-D\left(G\left(z^{(i)}\right)\right)\right)
∇θ9m1i=1∑mlog(1−D(G(z(i))))