回过头再来看深度学习的基础知识,才发现之前掌握的根本不牢,许多基础的概念都没有深刻理解。
机器学习、深度学习的基本原理
f ( x ) is { scalar : regression label : classification text/images f(x) \text{ is}
\left\{
\begin{aligned}
&\text{scalar} : \text{regression}\\
&\text{label} : \text{classification}\\
&\text{text/images}
\end{aligned}
\right.
f ( x ) is ⎩ ⎨ ⎧ scalar : regression label : classification text/images
模型的复杂度:模型的参数有多少种选择
loss = 1 N ∑ n = 1 N l ( param , x n , y ^ n ) \text{loss}=\frac{1}{N}\sum_{n=1}^N l(\text{param},x^n,\hat{y}^n)
loss = N 1 n = 1 ∑ N l ( param , x n , y ^ n )
最好的参数
param ∗ = arg min param loss \text{param}_*=\argmin_{\text{param}} \text{loss}
param ∗ = param arg min loss
我们希望训练集D train D_{\text{train}} D train 的数据分布与D all D_{\text{all}} D all 中数据分布相同,训练集中的数据之间 是i . i . d . i.i.d. i . i . d . 的,即 independently and identically distributed,独立同分布。
数学地描述训练集与总数据集合
我们希望训练集能近似替代总数据集,即:
L ( h train , D all ) − L ( h all , D all ) < δ L(h^{\text{train}},D_{\text{all}})-L(h^{\text{all}},D_{\text{all}})<\delta
L ( h train , D all ) − L ( h all , D all ) < δ
其充分条件如下:
∀ h : ∣ L ( h , D all ) − L ( h , D train ) ∣ < δ 2 \forall h : |L(h,D_{\text{all}})-L(h,D_{\text{train}})|<\frac{\delta}{2}
∀ h : ∣ L ( h , D all ) − L ( h , D train ) ∣ < 2 δ
proof:
L ( h train , D all ) − L ( h train , D train ) < δ 2 ⋯ ( 1 ) L(h_{\text{train}},D_{\text{all}})-L(h_{\text{train}},D_{\text{train}})<\frac{\delta}{2} \quad\cdots (1)
L ( h train , D all ) − L ( h train , D train ) < 2 δ ⋯ ( 1 )
L ( h all , D train ) − L ( h all , D all ) < δ 2 ⋯ ( 2 ) L(h_{\text{all}},D_{\text{train}})-L(h_{\text{all}},D_{\text{all}})<\frac{\delta}{2} \quad\cdots (2)
L ( h all , D train ) − L ( h all , D all ) < 2 δ ⋯ ( 2 )
( 1 ) + ( 2 ) ⇒ L ( h train , D all ) + [ − L ( h train , D train ) + L ( h all , D train ) ] − L ( h all , D all ) < δ (1)+(2)\Rightarrow L(h_{\text{train}},D_{\text{all}})
+[-L(h_{\text{train}},D_{\text{train}})+
L(h_{\text{all}},D_{\text{train}})]-L(h_{\text{all}},D_{\text{all}})<\delta
( 1 ) + ( 2 ) ⇒ L ( h train , D all ) + [ − L ( h train , D train ) + L ( h all , D train )] − L ( h all , D all ) < δ
due to the fact that
L ( h train , D train ) < L ( h all , D train ) L(h_{\text{train}},D_{\text{train}})<L(h_{\text{all}},D_{\text{train}})
L ( h train , D train ) < L ( h all , D train )
therefore
L ( h train , D all ) − L ( h all , D all ) < δ L(h^{\text{train}},D_{\text{all}})-L(h^{\text{all}},D_{\text{all}})<\delta
L ( h train , D all ) − L ( h all , D all ) < δ
数据集的好与坏
只要存在一个参数param1 使得:∣ L ( param 1 , D train ) − L ( param 1 , D all ) ∣ > ϵ |L(\text{param}_1,D_{\text{train}})-L(\text{param}_1,D_{\text{all}})|>\epsilon ∣ L ( param 1 , D train ) − L ( param 1 , D all ) ∣ > ϵ ,则这个数据集是不好的。
任意挑选一个数据集是坏的的概率上限推导如下(认为模型参数的参数空间为H H H ):
P ( D train is bad ) = P ( ⋃ param ∈ H { D i is bad due to param } ) ≤ ∑ param ∈ H P ( D i is bad due to param ) ≤ ∑ param ∈ H 2 exp ( − 2 N ϵ 2 ) Hoeffding’s Inequality = 2 exp ( − 2 N ϵ 2 ) ∣ H ∣ \begin{aligned}
P(D_{\text{train}}\text{ is bad})=&P(\bigcup_{\text{param}\in H}\{D_i \text{ is bad due to param}\})\\
\leq&\sum_{\text{param}\in H}P(D_i\text{ is bad due to param})\\
\leq&\sum_{\text{param}\in H} 2\exp(-2N\epsilon^2)\qquad \text{Hoeffding’s Inequality}\\
=&2\exp(-2N\epsilon^2)|H|
\end{aligned}
P ( D train is bad ) = ≤ ≤ = P ( param ∈ H ⋃ { D i is bad due to param } ) param ∈ H ∑ P ( D i is bad due to param ) param ∈ H ∑ 2 exp ( − 2 N ϵ 2 ) Hoeffding’s Inequality 2 exp ( − 2 N ϵ 2 ) ∣ H ∣
因此,模型的参数空间越小,训练集的样本越大,得到一个好的训练集的概率越大。
为什么选择deep learning 而不是wide learning
一个函数可以通过若干个简单的函数叠加出来:表明神经网络有能力拟合任意函数。
若需要拟合同一个函数,那么更深的网络能比更宽的网络需要更少的参数量。(可以看作函数的嵌套)
套用数字逻辑的理论,要表达一个奇偶校验函数,对于深层网络(每层门电路数量固定),只需要O ( n ) O(n) O ( n ) 个神经元即可,而对于浅层网络(层的数量固定),需要O ( 2 n ) O(2^{n}) O ( 2 n ) 个神经元。
因此,深层的神经网络需要更少的参数就能达到相同的效果。
对于最优参数param ∗ = arg min param ∈ H L ( param , D ) \text{param}_*=\argmin_{\text{param}\in H}L(\text{param},D_{\text{}}) param ∗ = arg min param ∈ H L ( param , D )
我们希望参数空间尽可能少(减少搜索时间并增强稳定性),并且loss也尽可能少。而深度学习在保持loss基本不变的情况下显著减少了参数量,是一个非常好的方法。
生成式模型
G enerater: 能够输出一个复杂的分布(将一个简单的分布变换而来的)
为什么是分布
在进行预测任务时,答案可能不止一种,有好几种可能的答案,我们希望模型能够输出一个分布,而不是一个确定的答案(否则模型容易投机取巧,将几种可能的情况揉在一起)。
为模型的输入加入一些噪声(从简单的分布采样),就能为模型的输出增加不确定性(本质是从复杂的分布采样)。
拿图片生成为例,有意义的图片的熵是比较低的(相对于噪音而言),有意义的图片一定符合某种规律,也就是一种分布。但是我们无法直接训练生成器学到这种分布,因为我们其实也不知道这个分布到底长啥样,更别说在数学上计算这个模型的输出与真实分布之间的散度了。
为了解决这个问题,GAN便应运而生了,我们只需要分布的采样,而不是分布本身。
Generative Adversarial Network: GAN
D iscriminator: 判断目标是真实的还是生成的(假的)
image → Discriminator → scalar ∈ [ 0 , 1 ] \text{image} \rightarrow \boxed{\text{Discriminator}}\rightarrow \text{scalar} \in [0,1]
image → Discriminator → scalar ∈ [ 0 , 1 ]
训练过程
冻结生成器,训练判别器:将真实的图片打上标签1,将生成的图片打上标签0,训练判别器
冻结判别器,训练生成器:我们希望生成器能“骗过”判别器,得到高的分数。即,希望D ( G ( z ) ) D(G(z)) D ( G ( z )) 的输出值为1,但此时判别器的参数是被冻结的,模型会强迫让生成器学到能骗过判别器的方法。
重复以上过程
数学原理
对于判别器,我们的优化目标如下:
V ( G , V ) = E y ∼ P data log D ( y ) + E z ∼ P G log ( 1 − D ( G ( z ) ) ) V(G,V)=E_{y\sim P_{\text{data}}}\log D(y)+E_{z\sim P_G}\log(1-D(G(z)))\\
V ( G , V ) = E y ∼ P data log D ( y ) + E z ∼ P G log ( 1 − D ( G ( z )))
那么就是说,最优的判别器如下:
D ∗ = arg max D V ( D , G ) D^*=\argmax_D V(D,G)\\
D ∗ = D arg max V ( D , G )
最优的生成器如下(最小化模型分布与真实分布之间的差异):
G ∗ = arg min G D i v ( P G , P data ) 但是我们不知道如何计算这个散度 G^*=\argmin_G Div(P_G,P_{\text{data}})\quad \text{但是我们不知道如何计算这个散度}
G ∗ = G arg min D i v ( P G , P data ) 但是我们不知道如何计算这个散度
但是进一步可以证明max V \max V max V 与J S D i v ( P G , P data ) JSDiv(P_G,P_{\text{data}}) J S D i v ( P G , P data ) 存在的正相关性
那么,优化生成器可以使用max V \max V max V 来替代散度,即
G ∗ = arg min G max V ( D , G ) G^*=\argmin_G \max V(D,G)
G ∗ = G arg min max V ( D , G )
这与上述训练过程是对应的。
特点
生成器的生成的分布甚至具有连续性,在一定程度上是光滑的。将输入做插值,生成器的输出也会做展现出渐变效果。
训练
GAN的训练通常比较困难,但有一些技巧。
GAN使用的是js散度,对于两个无交集的分布,其输出始终为定值,导致梯度消失。而且由于生成器的参数是随机初始化的,其与真实分布大概率就是没有交集的。随之而来的另一个问题是,对于两个没有交集的分布,判别器可以非常容易判断真假,导致显示的判别准确率非常容易达到100%,但这实际上是没有意义的。
这可以通过更换散度函数改善(实际上是更换了优化目标),并加入一些限制条件(足够平滑,避免发散)
参考
https://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.php