首先需要明确的一个概念,深度学习是一个机器学习问题。
我们要想学习系统的深度学习,就必定需要一些机械学习的基础。那么它到底是啥呢?
机器学习(Machine Learning)
是指从有限的数据中学习出具有一般性的规律,并利用这些规律对未知数据进行推测的方法。
再具体一点
我们用一个D维向量 x = [ x 1 , x 2 , . . . , x D ] T x=[x_1,x_2,...,x_D]^T x=[x1,x2,...,xD]T来表示数据的特征,也称为特征向量。
标签通常用 y y y来表示。
标记特征与标签的数据叫做样本,一组样本构成的集合叫做数据集(训练集和测试集).
x , y x,y x,y都有了,那不就可以通过函数来求标签y的值了嘛。
我们可以通过函数来预测,也可以通过条件概率来预测。现在思路有了,只要找到一个最好的函数就能分类了。于是前仆后继的大佬们开始开发算法了。
我们先对机械学习的大体流程有一个了解。使用机器学习模型一般包含几个步骤:
一个完整的机器学习一般都包含三个要素,就好像一个吃饭这个动作需要有夹菜,放嘴里,咀嚼一样。当然后期怎么消化,营养怎么分配那都是后话。
机器学习方法可以粗略的分为三个基本要素:模型,学习准则,优化算法.
说到模型,我们可以理解为在一个假设空间里,这个空间是输入到输出的所有映射,我们创造这么一个空间的目的就是求这个模型的最优参数。
一般来说,机器学习模型分为两大类。判别模型(Discriminative Model)
和生成模型(Generative Model)。
判别类型比较大众,基本上我举几个例子大家都知道是什么东西。比如,支持向量机(SVM)、逻辑回归(LR)、神经网络(NN)、k近邻(KNN)、线性判别分析(LDA)等等。
而生成模型呢,是一种更加间接的建模,比如高斯判别分析(GDA)、朴素贝叶斯(NB)、隐马尔可夫模型(HMM)、受限玻尔兹曼机(RBM)等等。
判别模型于生成模型的区别就在于要不要首先对概率 p ( y ∣ x ) p(y|x) p(y∣x)建模。
另外一种常用的分类模式就是概率模型和非概率模型。
概率模型
非概率模型
当我们知道有办法可以根据变量预测结果后,那么怎么来评价这个办法好不好合不合适呢,这里先引入一个概念叫损失函数(Loss Function)
损失函数是一个非负实数函数,用来量化模型预测与真实标签之间的差异。
通常写做 L ( y ^ , f ( x ) ) L(\hat{y},f(x)) L(y^,f(x))
最直观的损失函数是模型在训练集上的错误率。
L ( y ^ , f ( x ) ) = { 0 y = f ( x ) 1 y ≠ f ( x ) L(\hat{y},f(x))= \begin{cases} 0& \text{$y=f(x)$}\\ 1& \text{$y\not=f(x)$} \end{cases} L(y^,f(x))={01y=f(x)y=f(x)
0-1损失函数可以客观直接的反映出模型预测结果与真实标签的关系,但是缺点为不连续且导数为0,难以优化。
L ( y ^ , f ( x ) ) = 1 2 ( y − f ( x ) ) 2 L(\hat{y},f(x))=\frac12(y-f(x))^2 L(y^,f(x))=21(y−f(x))2
平方损失函数常用于预测标签 y y y为实数的任务中,一般不适用于分类问题。
适用于分类问题的是交叉熵损失函数,假设标签 y y y有 C C C个,那么就可以理解为有 C C C维。
用一个 C C C维的one-hot向量 y y y来表示标签,举个简单的例子,我们让 C = 9 C=9 C=9,
[0 0 0 0 0 0 1 0 0 ]
1 2 3 4 5 6 7 8 9
那么当前向量 y y y除了第7维为1,其余都为0。换种说法,标签向量可以看作是样本标签的条件概率分布,即 y = P r ( y ∣ x ) y=P_r(y|x) y=Pr(y∣x)。
假设样本类别为 k k k(在例子当中 k k k=7),那么属于第 k k k类的概率为1,属于其他类的概率为0。
对于两个概率分布,一般可以用交叉熵来衡量它们的差异,标签 y y y与模型预测 f ( x ) f(x) f(x)之间的交叉熵为
L ( y ^ , f ( x ) ) = − y T l o g f ( x ) = − ∑ c = 1 C y c l o g f c ( x ) L(\hat{y},f(x))=-y^Tlogf(x) =-\sum_{c=1}^C y_c log f_c(x) L(y^,f(x))=−yTlogf(x)=−∑c=1Cyclogfc(x)
在这里, y c y_c yc和 f c f_c fc表示的是第 c c c维的输出向量。
前面我们说过了, y y y是一个one-hot向量,上述公式也可以写成
L ( y ^ , f ( x ) ) = − l o g f y ( x ) L(\hat{y},f(x))=-logf_y(x) L(y^,f(x))=−logfy(x)
是不是有点像对数似然?
是的,交叉熵损失函数也可以看作是负对数似然函数(Negative Log-likelihood)。
对于二值分类,假设 y y y的取值为-1和1,那么损失函数就可以写成
L ( y ^ , f ( x ) ) = m a x ( 0 , 1 − y f ( x ) ) L(\hat{y},f(x))=max(0,1-yf(x)) L(y^,f(x))=max(0,1−yf(x))
支持向量机SVM的损失函数就是用的这个。
除了讨论损失函数,我们还需要适当大度一点给一个可容忍的犯错度,这个可容忍的度就是期望错误。
搁谁谁都希望期望错误为0,但实际上十有八九出来的结果也就是那么回事儿。所以在这里就得靠往常的经验来判断错几个算是正常。
经验错误也叫经验风险是可以计算的,即在训练集上的平均损失。
R D e m p = 1 N ∑ n = 1 N L ( y , f ( x ) ) R^{emp}_D=\frac1N\sum_{n=1}^N L(y,f(x)) RDemp=N1∑n=1NL(y,f(x))
那么下一个目标就是找一个参数,让整体的经验风险变得最小,让我们随机挑选一个 θ \theta θ来作为参数(或一组参数)。
θ ∗ = a r g θ m i n R D e m p ( θ ) \theta^*=arg_\theta minR_D^{emp}(\theta) θ∗=argθminRDemp(θ)
这也就是经验风险最小化准则(Empirical Risk Minimazation,ERM)。
现在我们有了方法(函数或者概率),又想办法让风险降到最小,那么剩下的就是找到一个最优解 f ( x , θ ∗ ) f(x,\theta^*) f(x,θ∗)了。
说白了机械学习的训练过程就是最优化问题的求解过程。
优化问题(Optimization) 又可以分为参数优化和超参数优化,参数我们都能理解,那么超参数它超在哪里呢?
除了可学习的参数之外,还有一类参数是用来定义模型结构或优化策略的,比如在贝叶斯方法中,超参数可以理解为参数的参数,控制模型参数分布的参数。
在警察里头就类似督察吧。明白了超参数是个什么东西以后,具体怎么优化它呢?常见的超参数包括聚类算法中的类别个数,梯度下降法中的步长,正则化项的系数,神经网络的层数,支持向量机中的核函数,主要写一下梯度下降这一个比较常用的算法。
在机器学习中,最常用的就是利用梯度下降来优化算法,根据上面的解释,就是初始化参数 θ 0 \theta_0 θ0,然后迭代算出最小风险。
θ t + 1 = θ t − α ∂ R D ( θ ) ∂ θ \theta_{t+1}=\theta_t-\alpha\frac{\partial R_D(\theta)} {\partial\theta} θt+1=θt−α∂θ∂RD(θ)
其中, θ t \theta_{t} θt表示的是第 t t t次的迭代参数。
将损失函数代入,得到
θ t + 1 = θ t − α 1 N ∑ n = 1 N ∂ L ( y , f ( x ; θ ) ) ∂ θ \theta_{t+1}=\theta_t-\alpha\frac1 N \sum_{n=1}^N\frac{\partial L(y,f(x;\theta))} {\partial\theta} θt+1=θt−αN1∑n=1N∂θ∂L(y,f(x;θ))
这里, α \alpha α表示的是搜索步长,在机器学习中一般称为学习率(Learning Rate)
上述方法也叫批量梯度下降法,因为目标函数是整个训练集上的风险函数。这种方法在每次迭代时需要计算每个样本上损失函数的梯度并求和,当训练集中的样本数量很大时,空间复杂度比较高,每次迭代的计算开销也很大。
为了减少每次迭代的计算复杂度,我们也可以在每次迭代时只采集一个样本,计算这个样本损失函数的梯度并更新参数,即随机梯度下降法(Stochastic Gradient Descent,SGD)。
随即梯度下降法与批量梯度下降的区别是每次迭代的优化目标是对所有样本的平均损失函数还是对单个样本的损失函数。随即梯度下降相当于在批量梯度下降的梯度上引入了随机噪声,在非凸优化问题中,更容易逃离局部最优点。
随机梯度下降法的一个缺点在于无法充分利用计算机的并行计算能力。所以在这里我们引入小批量梯度下降法(Mini-Batch Gradient Descent)。我们可以理解为,小批量是批量和随机的折中。
每次迭代时,随机选取一个包含 K K K个样本的子集,计算在这个子集上每个样本损失函数的梯度并进行平均,然后在进行参数更新
θ t + 1 ← θ t − α 1 K ∑ x , y ∂ L ( y , f ( x ) ) ∂ θ \theta_{t+1}\leftarrow\theta_t-\alpha\frac1K\sum_{x,y} \frac{\partial L(y,f(x))} {\partial\theta} θt+1←θt−αK1∑x,y∂θ∂L(y,f(x))
小批量梯度下降法计算开销小,因此逐渐成为大规模的机器学习中的主要优化算法。