前情提要:机器学习
定义
对于某类任务 T 和性能度量
P,一个计算机程序被认为可以从经验 E 中学习是指,通过经验 E 改进后,它在任务 T 上由性能度量 P 衡量的性能有所提升。
- T:指我们想要完成的任务,如分类,回归,合成采样等等
- P:一般指准确率accuarcy
- E:经验,我们的数据集。对于supervised,我们的数据集包含特征和标签。对于unsupervised,只包含特征,学习特征的结构关系,如聚类。
拟合中的问题
这过程是我们希望通过学习的方式拟合真实世界中未知的函数,那么因为我们只有有限的数据集,我们一方面希望生成的函数可以贴近真实的函数underfitting(即减少training error),另一方面也希望生成的函数不要太贴合测试集(毕竟只是对真实世界一部分的采样)overfitting,也即希望泛化误差(generalization error)较低。
我们用测试集来评估泛化误差
我们可以通过调整模型的容量(capacity),一种控制训练算法容量的方法是选择假设空间(hypothesis space),即扩大函数族比如在线性回归中,使用多项式函数替代。
使用K-fold的方法可以准确度量泛化误差,即每次取 $\frac{N}{K}$ 的数据作为测试集,剩下的其他为训练集,K次的平均误差就是我们要的泛化误差
均方差也是一个度量方法,
容量增大时,bias减小,variance增大。
最大似然估计
设 $p_{model}(x;\theta)$ 是我们的模型,对应的有个真实的模型 $p_{data}(x)$
对 $\theta$ 的最大似然估计就是
那么KL散度
又因为 $p_{data}$ 那一项和数据生成无关,所以只需要最小化 $-\mathbb{E}_{x\sim\hat{p}_{data}}[log\:p_{model}(x)]$
【具体的机器学习算法如PCA, SVM另外一篇文章里再写】
前馈神经网络Feedforward Neural Netweork
在机器学习中,我们碰到一个难题,那就是线性模型虽然可以高效且可靠的拟合,但是其能力居现在线性函数之中。
为了拓展他,我们使用核kernel来将x变换成非线性。那么如何选择这个核 $\phi$ 呢?
- 选择一个无限维的 $\phi$。理想状态是只有维度足够高,我们就可以拟合训练集。但是其对测试集的泛化能力不够。
- 手动设计 $\phi$ ,但是每个任务都需要人工手动,且每个 $\phi$ 都只对应那个任务,无法迁移
- 而深度学习的策略是去学习 $\phi$ 。比如我们有一个模型$y=f(x;\theta,w)=\phi(x;\theta)^{T}w$,我们有两种参数:用于学习 $\phi$ 的 $\theta$,和用于将 $\phi(x)$ 映射到所需的输出的参数$w$。其中 $\phi$ 定义了一个隐藏层。
深度学习的方法,既有第一种方法中可以拟合训练集的能力,也有第二种方法中,可以人工设计函数族 $\phi(x;\theta)$ 的好处,而没必要找到准确的某个函数。
举例来说,要拟合XOR异或函数 $f(x;W,c,w,b)$,我们可以构建一层隐函数。
基于梯度的学习
因为神经网络是非线性的,所以其代价函数是非凸的,也就意味着,我们不可能像线性回归或SVM那样保证全局的收敛(也就是找到全局最优解),所以对初始值敏感(即初始点导致我们只能到达局部最优解)。
训练算法就是基于使用梯度来使得损失函数下降的各种方法。
Approximation Error:基于 生成函数 $\hat\phi$ 与实际函数 $\phi$ 之间差异产生的误差,可以通过增加层数来减少
Estimation Error:由于通过训练集习得损失和实际损失函数之间的误差产生,用更大的数据量可以减少,但如果我们增加更多的层或神经元,反而会引起overfitting
Optimisation Error:因为非凸性导致无法达到全局最优解,更多的计算可以降低error
输出单元
Sigmoid
用于Bernoulli输出分布的sigmoid
$\sigma$就是logistic sigmoid,这样我们生成 $\hat{y}$ 服从bernoulli分布 $$
sigmoid 激活函数在 z 取非常小的负值时会饱和到 0,当 z 取非常大的正值时
会饱和到 1。这种情况一旦发生,梯度会变得非常小以至于不能用来学习,无论此时
模型给出的是正确还是错误的答案。
Softmax
用于Multinoulli输出分布的softmax
如果我们的问题不再是二元的(如判断这张图是否是狗),而是分类(如判断这张图属于那种动物),可以使用softmax函数。
Softmax是sigmoid的扩展。
隐藏单元
Sigmoid 和 tanh
当 z 取绝对值很大的正值时,它们饱和到一个高值,当 z 取绝对值很大的负值时,它们饱和到一个低值,并且仅仅当 z 接近 0 时它们才对输入强烈敏感。sigmoid 单元的广泛饱和性会使得基于梯度的学习变得非常困难。因为这个原因,现在不鼓励将它们用作前馈网络中的隐藏单元。
当必须要使用 sigmoid 激活函数时,双曲正切激活函数通常要比 logistic sigmoid 函数表现更好。在 $tanh(0) = 0$ 而 $\sigma(0) = \frac{1}{2}$ 的意义上,它更像是单位函数。
RELU
易于优化,梯度大且已知,使用 ReLU得到的SGD的收敛速度会比 sigmoid/tanh 快。这是因为它是linear,而且ReLU只需要一个阈值就可以得到激活值,不用去计算复杂的运算。
但是训练过程该函数不适应较大梯度输入,因为在参数更新以后,ReLU的神经元不会再有激活的功能,导致梯度永远都是零。
Leaky RELU
解决了左侧为零的情况,使得负轴的信息不会全部丢失