本篇博客将记录一些我学习机器学习的过程(主要是深度学习)。
模型由输入、输出以及中间的某些运算组成,换言之,一个模型就是一个函数。一个模型中包含一定数量的参数,训练模型就是调整这些参数使得模型的输出符合我们的需要。
损失函数反应我们对模型的需要(衡量模型预测值与真实值之间的差距),取一个非负的函数,训练模型的过程就是使loss最小的过程。
L2 loss虽然导函数连续,但是当预测值和真实值差距较大时,求导所得的梯度值也会比较大,这就导致参数调整的幅度较大,这是我们不希望看到的(可能导致不稳定)。
而L1 loss除了原点,其余位置的导数均为1,不存在上述问题,Huber Robust loss就综合了L1和L2的优点。
在现实中,大多数问题无法求得最优的解析解,因此模型往往只能通过多次迭代优化,尽可能地降低损失函数的值,这样得到的解称为数值解。
梯度下降算法的思想是沿着梯度的反方向进行自变量的更新,但是如果每一次迭代都要计算所有样本的梯度,那么一次迭代的计算开销数量级为O(n),这几乎是不可接受的。因此小批量随机梯度下降算法在实际应用中更为广泛,其本质就是用小批量的样本近似地代替全部样本。
g t = 1 ∣ B t ∣ ∑ i ∈ B t ∇ l ( x t − 1 ) g_{t}=\frac{1}{\left|\mathcal{B}_{t}\right|} \sum_{i \in \mathcal{B}_{t}} \nabla l\left(x_{t-1}\right) gt=∣Bt∣1i∈Bt∑∇l(xt−1) x t ← x t − 1 − η g t x_{t} \leftarrow x_{t-1}-\eta g_{t} xt←xt−1−ηgt
其中学习率η和批量大小B是人为设定的,称为超参数。
(待补充)
(待补充)
下图是一个含有多个输出的感知机,自然地,对于一个多分类问题,我们可以用输出值Oi来表示预测分类i的置信度,并将最大的的值对应的分类作为预测输出。例如,如果O1,O2,O3分别为1,1,10,那么第3类的值最大,预测输出为3。
但是这会带来两个方面的问题。
第一,输出值的范围不确定,因此难以直观地判断输出值的含义。在上述例子中,我们对输出结果“很置信”,因为O3是另外两个结果的10倍。但是,如果O1,O2为1000,那么输出值为10的结果置信度又很低了。
第二,预测误差难以衡量。由于数值范围的不确定,用前面介绍的损失函数难以衡量预测准确度之间的误差。
y ^ = softmax ( o ) \hat{\mathbf{y}}=\operatorname{softmax}(\mathbf{o}) y^=softmax(o) y ^ i = exp ( o i ) ∑ k exp ( o k ) \hat{y}_{i}=\frac{\exp \left(o_{i}\right)}{\sum_{k} \exp \left(o_{k}\right)} y^i=∑kexp(ok)exp(oi)
通过如上所示的softmax运算,所有输出被归一化至[0,1]区间上,且所有输出之和为1。这样,每一个输出可以被视作一个概率。
交叉熵函数用于衡量两个概率分布之间差异的函数。
l ( y , y ^ ) = − ∑ i y i log y ^ i = − log y ^ y l(\mathbf{y}, \hat{\mathbf{y}})=-\sum_{i} y_{i} \log \hat{y}_{i}=-\log \hat{y}_{y} l(y,y^)=−i∑yilogy^i=−logy^y
交叉熵函数只关心对正确分类的预测概率。例如,当预测值和真实值分别为
y i = [ 0.1 0.1 0.8 ] y ^ i = [ 0 0 1 ] y_i=\begin{bmatrix} 0.1 \\0.1\\0.8 \end{bmatrix} \hat{y}_{i}=\begin{bmatrix} 0 \\0\\1 \end{bmatrix} yi= 0.10.10.8 y^i= 001
交叉熵运算结果为0.8*1 = 0.8
(偷懒一下,直接放之前写过的)
输入层和输出层是神经网络的基本构成,当在输入和输出层之间引入多个隐藏层时,模型的复杂度能够随之提高,同时也实现了对数据潜在模式的逐级表征。其中,若某一层的单元与上一层的输出完全链接,则称为全连接层。如图1所示,设输入层的输入为X,隐藏层的输出为H,输出层的输出为O,则
H = X W 1 + b 1 H=XW_1+b_1 H=XW1+b1 O = H W 2 + b 2 O=HW_2+b_2 O=HW2+b2
W_1和W_2分别为隐藏层和输出层的权重系数,b_1和b_2为对应的偏差。
由下式可知,上述模型等价于单层的线性模型,换言之,隐藏层的引入并没有使模型具有拟合非线性的复杂数据的能力。
O = ( X W 1 + b 1 ) W 2 + b 1 = X W 1 W 2 + b 1 W 2 + b 2 = X W + b O=(XW_1+b_1 ) W_2+b_1=XW_1 W_2+b_1 W_2+b_2=XW+b O=(XW1+b1)W2+b1=XW1W2+b1W2+b2=XW+b
为了解决这个问题,研究者提出在线性变换之后补充一个非线性的激活函数(activation function)σ
H = σ ( X W 1 + b 1 ) H=σ(XW_1+b_1 ) H=σ(XW1+b1) O = H W 2 + b 2 O=HW_2+b_2 O=HW2+b2
ReLU ( x ) = max ( x , 0 ) \operatorname{ReLU}(x)=\max (x, 0) ReLU(x)=max(x,0)
由于其易于实现、表现良好的优点,ReLU函数广泛应用于各种任务。
sigmoid ( x ) = 1 1 + exp ( − x ) \operatorname{sigmoid}(x)=\frac{1}{1+\exp (-x)} sigmoid(x)=1+exp(−x)1
sigmoid函数是一个平滑、可微的函数,它将输入映射到[0,1]上。
tanh ( x ) = 1 − exp ( − 2 x ) 1 + exp ( − 2 x ) \tanh (x)=\frac{1-\exp (-2 x)}{1+\exp (-2 x)} tanh(x)=1+exp(−2x)1−exp(−2x)
与sigmoid函数类似,tanh函数将输入映射到[-1,1]区间。
欠拟合是指模型在训练集上都无法取得较好的误差,说明模型容量小或此模型并不适合这个问题。过拟合是指模型在训练集上有很好的表现,但是在测试集或者验证集上表现很差。过拟合往往是由于模型容量大,足以“记住”训练集大部分元素(相当于“背答案”,但不会做题),或是过于依赖某些只存在于训练集中的特殊特征。
VC维传统的定义是:对一个指示函数集,如果存在H个样本能够被函数集中的函数按所有可能的2的H次方种形式分开,则称函数集能够把H个样本打散;函数集的VC维就是它能打散的最大样本数目H。
通俗地讲,让一个模型去“记”一个数据集的元素及其对应的标签,所能“记下”的数据集大小就是此模型的VC维大小。
在统计学习中,VC维用来衡量一个模型的复杂度(容量)。但在实际应用中,一个模型的VC维往往难以计算,因此VC维应用比较局限。一般常用一个模型的参数数量来大致估计模型的容量。
模型的容量主要受两个因素影响:参数取值范围和参数数量。权重衰退就是通过控制参数的取值范围来控制模型的容量。
L2范数正则化:在损失函数上加上一个对权重的惩罚项。
min ℓ ( w , b ) + λ 2 ∥ w ∥ 2 \min \ell(\mathbf{w}, b)+\frac{\lambda}{2}\|\mathbf{w}\|^{2} minℓ(w,b)+2λ∥w∥2
其中λ是超参数,λ越大对参数的取值范围限制越大。
∂ ∂ w ( ℓ ( w , b ) + λ 2 ∥ w ∥ 2 ) = ∂ ℓ ( w , b ) ∂ w + λ w \frac{\partial}{\partial \mathbf{w}}\left(\ell(\mathbf{w}, b)+\frac{\lambda}{2}\|\mathbf{w}\|^{2}\right)=\frac{\partial \ell(\mathbf{w}, b)}{\partial \mathbf{w}}+\lambda \mathbf{w} ∂w∂(ℓ(w,b)+2λ∥w∥2)=∂w∂ℓ(w,b)+λw w t + 1 = ( 1 − η λ ) w t − η ∂ ℓ ( w t , b t ) ∂ w t \mathbf{w}_{t+1}=(1-\eta \lambda) \mathbf{w}_{t}-\eta \frac{\partial \ell\left(\mathbf{w}_{t}, b_{t}\right)}{\partial \mathbf{w}_{t}} wt+1=(1−ηλ)wt−η∂wt∂ℓ(wt,bt)
这与最初的梯度下降算法相比,Wt前的系数从1变成了(1-ηλ),而ηλ通常设置为小于1的数,因此随着不断地迭代,参数的取值范围会不断减小,因此L2正则也叫做权重衰退。
丢弃法在训练时对输入做如下扰动(在测试时不丢弃)
x i ′ = { 0 with probablity p x i 1 − p otherise x_{i}^{\prime}=\left\{\begin{array}{ll} 0 & \text { with probablity } p \\ \frac{x_{i}}{1-p} & \text { otherise } \end{array}\right. xi′={01−pxi with probablity p otherise
这样能保证扰动前和扰动后的输出数学期望不变。
丢弃法实质上是以一定的概率丢弃神经网络中的一些神经元,使得网络不过分地依赖某些特征。也有一种解释是,每次训练都随机地训练某个子网络,在输出做评价。主流的观点认为dropout相当于一种正则。
开始写博客想把自己学到的东西记录一下,方便今后回顾。如果今后水平更高,能给后来者提供一点微不足道的参考,那真会是十分荣幸。
ps.文中图片基本来自网络和李沐老师的《动手学深度学习》