深度学习系列笔记(五)
目录- 深度学习系列笔记(五)
- 数值计算
- 上溢和下溢
- 病态条件
- 机器学习基础
- 学习算法
- 线性回归
- 数值计算
- 上溢和下溢
- 病态条件
- 机器学习基础
- 学习算法
- 线性回归
数值计算
上溢和下溢
连续数学在数字计算机上的根本困难是,我们需要通过有限数量的位模式来表示无限多的实数。这将导致误差,即使理论上可行的算法,如果在设计时没有考虑最小化舍入误差的累积,在实践时也可能会导致算法的失效。
- 下溢 当接近零的数被四舍五入为零时发生下溢。
- 上溢 当大量级的数被近似为infty或-infty时发生上溢。
必须对上溢和下溢进行数值稳定的一个例子是softmax函数: softmax(x)i=tfrac{exp(x_i)}{sum{j=1}^{n}exp(x_j)}
可以通过计算softmax(z)同时解决上溢和下溢问题。简单的代数计算表明,softmax解析上的函数值不会因为从输入向量减去或加上标量而改变。减去max_i x_i导致exp的最大参数为0,这排除了上溢的可能性。同样地,分母中至少有一个值为1的项,这就排除了因分母下溢而导致被零除的可能性。
在实现深度学习算法时,底层库的开发者应该牢记数值问题。Theano 是一个自动检测并稳定深度学习中许多常见的数值不稳定的表达式的软件包。
病态条件
条件数指的是函数相对于输入的微小变化而变化的快慢程度。输入被轻微扰动而迅速改变的函数对于科学计算来说可能是有问题的,因为输入中的舍入误差可能导致输出的巨大变化。
机器学习基础
学习算法
机器学习算法是一种能够从数据中学习的算法。对于“学习”Mitchell提供了一个简洁的定义:“对于某类任务T和性能度量P,一个计算机程序被认为可以从经验E中学习是指,经过经验E改进后,它在任务T上由性能度量P衡量的性能有所提升。”
- 任务T
通常机器学习任务定义为机器学习系统应该如何处理样本。样本是指我们从某些希望机器学习系统处理的对象或事件中收集到的已经量化的特征的集合。
常见的学习任务:分类、输入缺失分类、回归(预测数值)、转录、机器翻译、结构化输出、异常检测、异常检测、合成和采样、缺失值填补、去噪、密度估计或概率质量函数估计
- 性能度量P
性能度量是为了评估机器学习算法的能力,通常视任务而定。
- 经验E
无监督学习算法训练含有很多特征的数据集,然后学习出这个数据集上有用的结构性质。在深度学习中,通常学习数据集的整个概率分布。
监督学习算法训练含有很多特征的数据集,但是数据集中的样本带有标签或目标。
线性回归
线性回归解决回归问题。线性回归的输出是输入的线性函数。我们定义widehat{y}=omega ^Tx,其中omega in R^n是参数向量。参数是控制系统行为的值。
表示模型在测试集上的预测值,那么均方误差表示为:
假设我们现在有这样一组数据,x轴代表房屋面积,y轴代表房价(仅是例子,无实际意义)。假设现在想要知道120平米的房子可以卖多少钱,那么我就可以通过构建回归模型来预测价格。那么如何构建回归模型呢?
- 梯度下降法
J是关于theta_0、theta_1的二元函数,我们先来看这种情况:当theta_0=0时,我们的假设函数为:h(x)=theta x,代价函数:J(theta)=tfrac{1}{m}sumlimits_{i=1}^{m}[h_{theta}(x)^{(i)}-y^{(i)}]^2,代入h(x)得到:J(theta)=tfrac{1}{m}sumlimits_{i=1}^{m}[theta x^{(i)}-y^{(i)}]^2。
我们任取一点theta,计算在这点处的导数值tfrac{dJ}{dtheta},如果该值为正值,说明在该点附近,J是呈上升趋势,如果想得到最小值,需要往左走,也就是说取新的theta应该为theta -alphatfrac{dJ}{dtheta};如果在这点处的导数值tfrac{dJ}{dtheta}为负值,说明在该点附近,J是呈下降趋势,如果想得到最小值,需要往右走,也就是说取新的theta应该为theta -alphatfrac{dJ}{dtheta}。其中alpha表示学习率,也就是每次更新theta的步长。如果学习率alpha太大,那么每次更新步长过大,有可能导致在全局最优点附近进行更新时,会越过最优值,然后越来越远;如果学习率alpha太小,那么每次更新步长过小,有可能导致学习速度太慢。
通常来说,学习率的选择可以是0.001, 0.01, 0.1, 1,或者取0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1。同时,我们在训练模型过程中,可以通过绘制J和迭代次数的函数图像,可以看到在当前学习率下的学习状况。如果正常,那么会呈现这样的图像:
相反,如果学习率过大,会呈现这样的图像:
现在再回到二维的情况,我们的代价函数不再是抛物线了,而是一个曲面,这时我们应该分别对theta_0、theta_1求偏导数,即:
theta_j:=theta_j - alphatfrac{partial}{partialtheta_j}J(theta_0,theta_1),其中j=0,1。然后同步更新theta_0、theta_1,这个同步是因为在更新theta_1的时候需要用到theta_0,在一次更新过程中,需要尽可能保证一致,所以在一次更新过程中,使用的都是上一次的theta_0、theta_1的值,而不是这一次求得的,这个叫同步更新。
在这里,如果我们考虑增加一个特征房屋数量(1-4),而房屋整体面积(0-1000);那么梯度下降算法也会很慢。这时候可以使用特征缩放,将特征的值缩放到-0.5sim 0.5。具体做法如下:x_i=tfrac{x_i-mu}{max-min}
- 正规方程法
以上所讲的便是梯度下降法求解最优化问题。那么在微积分中,我们知道,如果在一点处求得最优值(全局或局部),那么该点处的导数应该是0。基于此,我们还可以通过解方程的方法求得theta_0、theta_1,该方法为正规方程法。
我们将样本表示成矩阵的形式:
其中X表示样本,vec{y}表示样本中对应的输出值,参数theta = begin{bmatrix} theta_0 theta_1 end{bmatrix},那么第i个样本的预测值就是X^{(i)}theta,这样,我们就可以重新构造我们的代价函数:J(theta)=tfrac{1}{2m}sumlimits_{i=1}^m[X^{(i)}theta-vec{y}]^2=tfrac{1}{2m}(Xtheta-vec{y})^T(Xtheta-vec{y}),我们按照之前所说,对其求导:
nabla_theta J(theta)=nabla_thetatfrac{1}{2}(Xtheta-vec{y})^T(Xtheta-vec{y})
=nabla_thetatfrac{1}{2}(theta^TX^T-vec{y}^T)(Xtheta-vec{y})
=nabla_thetatfrac{1}{2}(theta^TX^TXtheta-vec{y}^TXtheta-theta^TX^Tvec{y} vec{y}^Tvec{y})
=2X^TXtheta-2X^Tvec{y}
令其等于0得到2X^TXtheta-2X^Tvec{y}=0,解这个方程得到theta=(X^TX)^{-1}X^Tvec{y},这便是我们想要得到的参数theta的矩阵。
代入我们前面给出的数据,使用MATLAB进行计算后,绘制了如下图所示的直线。
可以看出,使用线性函数拟合得不是很好,而图中的数据有点像开口向下的二次函数的前半段,但是过了顶点后会下降,这不符合实际意义,我们知道房屋面积越大价格越高。那么可以假设:h(theta)=theta_0 theta_1x theta_2sqrt{x};重新计算并绘图:
现在虽然拟合地很好,但是后半段还是不符合实际,我们假设h(theta)=theta_0 theta_1sqrt{x};重新计算并绘图:
这根黄色的线是最新的曲线。拟合度比蓝线高了点。
那么这两个算法该如何选择呢?
梯度下降算法:适合于大数据集、特征较多的数据集,但是需要设置学习率alpha,并且多次迭代
正规方程组方法:不需要设置学习率alpha、不需要迭代,但是大数据集上运算量很大。
参考文献: 《深度学习》、吴恩达《机器学习》