machine_learning

that_is_the_way_understanding_the_data


#

Tom Mitchell于1998年给机器学习下了个定义——计算机程序从经验E中学习,解决某任务T,进行某一性能度量P,通过P测定在T上的表现因经验E而提高。最主要的两类机器学习算法为监督学习(Supervised Learning)非监督学习(Unsupervised Learning)监督学习就是人去教会机器做某件事。非监督学习就是让计算机自己学习。当然还有其它类别的机器学习,如强化学习和推荐系统。

监督学习:给算法一个包含正确答案的数据集,从其中学到或建立一个模式(函数),并以此模式来推测(预测)新的实例。训练资料是由输入物件(通常是向量)和预期输出所组成。函数的输出可以是一个连续的值(称为回归分析),或是预测一个分类标签(称作分类)。

非监督学习:给定的数据并不会被特别标识,学习模型是为了推断出数据的一些内在结构。如聚类等。

# 模型描述

在监督学习中,给一个数据集,这个数据集被称作训练集(Training Set),我们的工作就是从这个训练集中学习如何进行预测。

m表示训练样本,和统计学用n表示样本不一样。如果用x表示输入变量,用y表示输出变量,则(x, y)表示一个训练样本。那么(x(i), y(i)则表示第i个训练样本。

监督学习算法的工作:向学习算法提供训练集,学习算法的任务是输出一个函数h(hypothesis),函数h的作用是将输入变量x输入,然后输出预测的y

那么设计一个学习算法,下一个需要做的就是,决定怎么表示这个假设函数h

在回归中,最初选择的假设函数,就是单变量线性回归(Univariate Linear Regression)。这种线性的情况是学习的基础,之后将在此基础上构建更复杂的模型以及更复杂的学习算法。

损失函数(cost function):是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。在应用中,损失函数通常作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。例如在统计学和机器学习中被用于模型的参数估计。

在线性回归中,平方误差代价函数是解决回归问题最常用的手段。我们希望找到一条与数据拟合的直线,所以构造了假设函数,包括两个参数θ。随着参数选择不同会得到不同直线,于是代价函数也不同,优化目标就是使得代价最小。

学习算法的优化目标就是通过选择θ的取值,获得最小的代价函数,线性回归的目标函数是minimizeJ(θ)。

如在(1,1),(2,2),(3,3)的线性回归中,不同的θ取值,代价函数也不同,如下图所示。

当考虑两个变化的参数时,代价函数就需要用等高线法来描绘。当θ1和θ0取不同的值时,它离椭圆圆心(J的最小值)的距离都不同。

# 梯度下降

梯度下降(Gradient Descent):是一种可以将代价函数J最小化的算法。梯度下降算法不仅用于线性回归中,还广泛用于机器学习的众多领域。

将代价函数的图像看作是两座山,一个人正站在山上某一点上想尽快下山,如果他要在某个方向上走一小步,他应该朝哪个方向迈步。上面两个图表示,如果这个人站在不同点,则梯度下降法会将这个人带到不同的局部最低处(梯度下降算法的一个特点)。

梯度下降的数学原理由下图表示。 := 表示赋值。每一次梯度下降都会同时给θ0θ1赋值。式中α是被称作学习率的数字,用来控制在梯度下降时,迈出多大的步子。

θ0θ1是同时更新的

结合下图理解梯度递减的原理,上图和下图都是不考虑θ0的情况。上文已经讲到过,α为学习率,α右侧的偏导数在途中则表示为代价函数的斜率。

当某一点在最低代价的右侧时,如下图所示,则梯度递减更新函数中偏导数为正数,θ1将会变得更小,然后再次更新。当某一点在最低代价左侧时,如下图所示,则梯度递减更新函数中偏导数则为负数,减一个负数则为加一个整数,θ1实则变大。

更新函数中的学习率:如果α太小,则梯度下降会下降地很慢。但如果α太大,它会导致无法收敛甚至发散。

实际上,在梯度下降中,当我们接近局部最低点时,梯度下降法会自动采取更小的幅度,因为越接近局部最低点,偏导数的值越小,梯度下降法将自动采取较小的幅度。所以也不用另外减小α。

接下来将梯度下降和代价函数结合,得到线性回归的算法

将右侧的J(θ)代入到左侧的梯度递减中去,并将θ0和θ1同时更新,就得到了线性回归算法。如下图所示。

不同于之前展示的两个山脉一样的代价函数,线性回归的代价函数是一个凸函数(弓形函数)。这个函数没有局部最优解,只有全局最优解。所以计算这种代价函数的梯度下降时,它总会收敛到全局最优解。

以上的算法,有时被称作Batch梯度下降Batch意味着,每一步下降,我们都遍历了整个训练集的样本。

# 矩阵

矩阵:矩阵维度的描述是行×列,如R4×2则是四行二列的矩阵。Aij表示第i行第j列的元素。向量是一个特殊的矩阵,向量是只有一列的矩阵。

矩阵向量乘法运算:

矩阵向量乘法的一个小例子,如下图所示,使用假设函数一次性进行四次预测。这样可以用一行代码完成整个过程。这不仅简化了代码量,还提高了计算效率。

矩阵矩阵乘法运算

矩阵矩阵乘法的一个例子。如要预测四间房子的价格,但有三个假设函数,如果想将这三个假设函数都用于者四间房子,就可以用矩阵×矩阵。用线性代数函数库的方法还可以利用处理器多个线程进行并行计算。高效简洁。

矩阵乘法具有一些特性:

  • 不满足交换律,除非是和单位矩阵相乘
  • 满足结合律
  • In×n为单位矩阵,对角线上都是1,其它都为0

逆矩阵(Matrix Inverse)

如果一个m×m的矩阵A有逆矩阵,则它的逆矩阵为A-1AA-1=A-1A=Im×m。可以看到矩阵A是m×m的矩阵,这种行列数相等的矩阵称为方阵,实际上,只有方阵才有逆矩阵。但也不是所有矩阵都有逆矩阵,如全是0的矩阵就没有逆矩阵。

没有逆矩阵的矩阵成为奇异矩阵(singular)或退化矩阵(degenerate)。可以把它们想成非常近似于0。

转置矩阵(Matrix Transpose)

假设A是一个m×n的矩阵,设矩阵B等于A的转置,那么B就是一个n×m的矩阵,维度和A相反。

看18,用Python实现一下逆运算和转置运算。

多元线性回归

还是用房价的例子。用于预测房价的信息不仅有房子的面积,还有卧室的数量、楼层数、房龄等,这就需要使用多元线性回归,而不是一元线性回归。如下图(左)所示,x(i)表示第i个训练样本的输入特征值,可以看作是一个4维向量。

将之前一元线性回归的假设函数改写成如下右图所示形式。为简化这个等式的表达方式,将x0(i)的值设为1,x0原本是不存在的,但设为1的化可以刚好使截距为它本身。那么特征向量X变成从0开始标记的n+1维向量。同时把所有的参数θ看作一个向量,也是一个从0开始的n+1维向量。

经过以上变换,假设函数就可以写成θTx的形式。

多元梯度下降

上面探讨了多元线性回归的假设形式,这里讲如何设定该假设的参数,如何使用梯度下降法来处理多元线性回归。上面的图片已经给出了多元线性回归的假设形式 hθ(x)=θT,此模型的参数包括θ0到θn,可以看作一个θ的n+1维向量。

下右图左侧表示一元线性回归的梯度下降,右侧表示多元线性回归的梯度下降。

# 梯度下降实用技巧

特征缩放

如果有一个含有多个特征的机器学习问题,你能确保这些特征(的取值)都处在一个相近的范围,这样梯度下降就能更快地收敛。

从代价函数的等值线图来理解,如果特征的取值差别特别大,那么等值线将会呈现出一种特别歪斜并且椭圆的形状。那么梯度下降将会花很长一段时间并且可能来回波动,很长时间之后才会收敛到全局最小值。解决这个问题的有效办法就是特征缩放,比如变换单位(每100,每1000)等。

如下右图就是将原始的特征值缩放到0到1之间,以更快的执行梯度下降。这就是特征缩放。

一般来说当我们执行特征缩放时,我们通常的目的是将特征的取值约束到 [-1, 1] 。别太大,也别太小。太大太小都背离特征缩放的初衷。

均值归一化(Mean Normalization)是特征缩放的一种方法,均值归一化如下公式所示。

μ1表示训练集中特征x1的平均值,s1表示训练集中特征x1的标准差或极差。

学习率α

通过minJ(θ)与迭代次数的曲线可以观察出梯度下降是否正常工作,如下左图所示,如果正常工作的话,每一次迭代,J(θ)都应该下降。

还可以通过曲线看出梯度下降算法是否已经收敛,如曲线末端已经很平缓了,感觉就已经收敛了。当然也有下右图所示的自动收敛测试,原理是如果代价函数下一步迭代后的下降小于一个很小的值,则认为梯度下降已经收敛。但这个阈值不好确定,所以看曲线更方便。

如果J(θ)随着迭代次数而不断上升的话(曲线是向上的),则说明梯度下降没有正常工作,这通常意味着应该减小学习率α。还有一种情况曲线是U字形,这也意味着学习率α过大,梯度下降算法不断冲过最小值,导致J(θ)上升。还有一种情况是曲线呈ww形,这也是学习率过大的结果,用小一点的学习率就行。

数学家已经证明只要学习率α足够小,那么每次迭代后代价函数J(θ)都会下降。当然学习率也不能太小,否则梯度下降会收敛得很慢。

每选一个学习率,绘一个J(θ)与迭代次数的图像,学习率可以从0.001,0.003,0.01,0.03,0.1,0.3,1这样选。

# 特征和多项式回归

根据已有的特征来创造新的特征,如知道矩形房屋的长宽特征,可以创造面积特征,及面积的平方、面积的立方或平方根特征。由称为未知数的变量和称为系数的常数通过有限次加减法、乘法以及自然数幂次的乘方运算得到的代数表达式,进行线性回归,就是多项式回归。由于可能涉及到幂的运算,特征缩放就尤为重要。

为了得到比较好的拟合效果,就需要熟悉不同多项式的函数曲线,同时还需要选择合适的特征。如在上右图中,房价和面积的关系可以通过加一个面积(房子长宽特征的乘积)的平方根多项式来拟合。

那么在做回归的时候,可以设计不同特征,并且选用不同的复杂的函数来拟合,而不仅仅是一条直线来拟合。

当然有些算法能自动选择使用哪些特征,以及如何使用这些特征。

# 正规方程(Normal Equation)

正规方程对于某些线性回归问题会给更好的办法来求得参数θ的最优值。与梯度下降法不同,正规方程不需要迭代以求得θ的最优值,它仅需一次计算就可以求解θ的最优值。

在微积分中,如果θ是一个实数,最小化一个二次函数,需对它求导并令等式等于0,然后求出θ的值就是最优解。但在感兴趣的问题中,θ不再是一个实数,而是一个n+1维的向量。一般来说,这也是求每个θ的偏导数然后令等式为0,最后解出每一个θ。但这过于复杂。

那么正规矩阵就提出一个快速的解法,用一下例子举例,θ求出来等于(XTX)-1XTy

使用正规方程,就不需要进行特征缩放。

以下是梯度下降法和正规方程法的优缺点。当特征变量小于10000时,做线性回归可以用正规方程,但当特征变量特别多时,那就用梯度下降。

梯度下降有优点有1)当特征变量很多时,依然很好的运行。2)在分类算法中也可以使用。缺点有1)需要选择学习率。2)要进行很多次迭代。

正规方程优点有1)不用选择学习率。2)不用迭代。但缺点是在特征变量很多时,就会运行地非常慢。

不可逆性

在上面的θ求解公式中,需要求XTX的逆矩阵,但如果XTX是不可逆的呢?如果使用Octave pinv() 函数,那么即使没有逆也可以求出θ,因为该函数会生成伪逆。

上图指出,XTX没有逆可能由两种原因导致。一是学习问题包括多余的特征,如某地块的平方米和平方英尺特征。二是特征数大于等于训练样本量。

# 矢量

向量化:将特征向量化将提高线性回归算法的效率。如下图所示,左侧是在非向量化的情况下计算假设函数h(x),右侧是向量化的情况下计算假设函数。不仅代码少了,效率还提高了。

如线性回归梯度下降算法的更新规则,要将θ们同时进行更新,用向量化的代码将大大提高效率。那么通常情况下要实现这三个θ的同步更新需要写三行代码,但使用向量化就只需要一行代码实现。

实际上,将θ看作一个n+1维的向量,里面就是θ0到θn,然后令θ=θ-αδ,δ也是一个n+1维的向量,绿色框框里的那部分。x1、x2分别表示第一个、第二个特征的向量。x1(i)则表示第一个特征的第i个值。那么就完成了矢量化的线性回归。

# 分类

若预测变量y是一个离散值,那么这就是一个分类问题。Logistic回归是一个分类算法,虽然他叫回归,这是历史问题,但它是一个分类算法。如果预测变量分了多个类,就是多分类问题了。

以下是分类问题的假设函数,SigmoidLogistic是同义词,代表 g(x) 函数。这样的话,hθ(x)就在[0, 1]之间了。θTx实际上是线性回归的假设函数。

接下来看一看解释。hθ(x)=0.7的意思是,x特征下得到正向结果(y=1)的概率为0.7。其实可以将hθ(x)看作是得到正向结果的概率。

决策边界:在特征空间内,根据不同特征对样本进行分类,不同类型间的分界就是针对该训练集的决策边界。

为了拟合Logistic回归模型中的θ,要定义用来拟合参数的代价函数。如果沿用之前线性回归那个J(θ),那么会得到一个非凸函数。但为了使得在运用梯度下降法得到全局最优解时,我们更想看到代价函数是一个凸函数(convex),所以需要进行下面的操作。

下面左图给出了单训练样本Logistic回归的代价函数(当y=1时),实际上就是粉红色函数那一截。

可以看到如果因变量的种类为1,hθ(x)=1的情况下,代价函数则为0。也就是说,如果假设函数预测的类型为1,而y刚好等于我预测的类型,那么代价则为0。相反的,若y为1,但我预测的值为0,那么代价将会变得无穷大,也就是说用非常非常大的代价值来惩罚这个学习算法。

当y=0时,单训练样本代价函数如下图所示。当y=0时,我们的假设函数hθ(x)却非常肯定的给出了1这个预测,那么代价将会相当大(趋近于无穷)。如果y=0,hθ(x)也预测的0,那么代价为0。

虽然凸性分析超出这节课的范围,但这也显示我们所选的代价函数会给我们一个凸优化问题,让整体的代价函数J(θ)成为一个凸函数,并没有局部最优解。

简化Logistic回归的代价函数与梯度下降

上面部分将单训练样本Logistic回归的代价函数分成了两种方法来写,但简化成更紧凑的一个等式。

这样一来,无论当y=0或1,另一种情况都会乘以0被消去。这样一来,写Logistic回归的代价函数就更方便了。如下左图所示便是Logistic回归的代价函数了。接下来,如下右图所示,要找这个J(θ )在最小值时的θ。

用梯度下降法时写出更新函数,发现这个函数和线性回归的更新函数是一模一样的。但,它们的hθ(x)是不一样的,如红字所示。接下来可以使用循环来同步更新,也可以使用向量化的方式来同步更新,后者效率更高。

高级优化

梯度下降法不是我们唯一能用的算法来计算代价函数偏导项,还有一些其他更高级更复杂的算法,如果能用这些方法来计算代价函数和偏导项的话,那么这些算法就是为我们优化代价函数的不同方法。如共轭梯度法、BFGS、L-BFGS。这些算法有很多优点,如不用手动选择学习率,比梯度下降更快等。

这些算法有一个更智能的内循环,叫线搜索算法,它可以自动尝试不同的学习率并自动选择一个好的学习,甚至可以为每一次迭代选择不同的学习率。

下图中的 jVal 就为代价函数, gradient(1) 为偏导项。

多类别分类问题

下图直观解释什么是多类别分类。下左图所示为二分类问题。

下右图为多类别分类问题,需要构建三个新的伪训练集,在伪训练集内将某一类别设为正类,另外两个设为负类,这样就把多类别分类转为二分类问题了,之后再拟合一个分类器(classifier),称为hθ(1)(x),这就是一个标准的Logistic回归分类器了,再训练这个分类器,得到那个粉色的判定边界。

对于i=1,2,3,拟合分类器 hθ(1)(x) ,来尝试估计出,给定x和θ时y=i的概率。

最后,我们已经训练好了Logistic回归分类器hθ(i)(x)来预测i类别y=i的概率,为了做出预测,我们给出一个新的输入值x,那么在三个分类器中都输入x,取使得h最大的那个类别i,也就是可信度最高效果最好的那个分类器。

# 过拟合问题

下面左右图分别回归的过拟合和分类的过拟合的两个案例(均为最右边那个图)。下面只解释左图。

如左图所示,用线性回归来用面积预测房子的价格,很明显看到拟合出来应该是一条平滑的曲线。

(左图)第一张图尝试用一次线性回归拟合,但很明显这个算法没有很好的拟合数据集,称之为欠拟合(underfit),或说这个算法具有高偏差(high bias),这两种说法都意味着算法没有很好地拟合训练数据。偏差意思是,罔顾数据的不符,先入为主地拟合一条直线,最终导致拟合效果很差,就好像这个算法有很大的偏见,认为是线性相关。

(左图)第二张就是刚好合适的函数。

(左图)第三张的算法通过了每一个数据点,但是不断上下波段,非常扭曲,并不是一个预测房价的好模型。这种情况就是过拟合(overfit),也称这个算法有高方差。只要使用足够多的多项式,就能使得算法拟合所有的数据,但是假设函数就会太庞大,变量太多,以至于没有足够的数据来约束它,来获得一个好的假设函数。这就是过度拟合。

Overfitting:过拟合问题将在变量过多的时候出现,这时训练出的假设函数能很好拟合训练集,代价函数可能很接近(或等于)零,但它千方百计拟合训练集,导致它无法泛化(generalize)到新的样本中,不能进行预测。

有两个办法解决过拟合问题——

  • 减少特征的个数。具体而言可以手动选择一些变量,或者使用“模型选择算法”,自动选择保留哪些特征。
  • 正则化(regularization)。保留所有特征,但减少参数θ的大小。如果每个特征都有用,不想丢弃的话,就可以用这个方法。

正则化

以面积预测房价的例子来说,用二次函数的那个函数可以很好的拟合数据,但用一个阶数过高的多项式来拟合,就出现了过拟合的问题,泛化地不好。

那我们不妨在代价函数中加入惩罚项,来使得θ3和θ4都非常小。如下图所示。这就相当于去掉了原来算法的后面两项,使得其相当于左边那个二次函数(但实际不是)。

以上就是正则化背后的思想,就是,如果参数θ的值较小,就意味着一个更简单的假设函数,也就更不容易出现过拟合问题。

不过在实际问题中,我们不知道哪一项或哪几项是高阶项,不知道挑选出哪些参数来缩小它们的值,所以在正则化中,我们要做的是修改代价函数,来缩小所有的参数θ(除了θ0,约定俗成,加不加θ0的惩罚项都一样)。如下图红框所示,加上了一个求和项(正则化项)。

红框中的λ是正则化参数(regularization parameter),其作用是控制两个不同目标之间的取舍,控制这两个目标之间的平衡:

  1. 第一个目标则是绿色下划线部分(目标函数第一项),就是更好地拟合训练集。
  2. 第二个目标则是保持参数θ尽量的小(目标函数第二项),从而保持假设模型相对简单,避免出现过拟合。

但如果对θ的惩罚程度过大,就会导致这些参数都接近于0,相当于把假设函数所有项都忽略了,就留了一个θ0。也就是一条直线来拟合数据,这很明显是一个欠拟合的情况。所以说,为了让正则化起到应有的效果,应该注意去选择一个更合适的正则化参数λ。后面会讲很多方法自动选择正则化参数。

线性回归的正则化

到目前为止(指该帖),共有两种方法来求解线性回归,一个是梯度下降,另一个则是正规方程。

先讲一讲把梯度下降求解线性回归推广到正则化线性回归。如下左图所示是一个正则化线性回归的代价函数,要用梯度下降法来求这个代价函数的最小值的参数θ。J(θ)第一项则是线性回归的一般目标,第二项则是额外的正则化项。再看右图,在梯度下降时除了θ0,都再右侧加了一个额外的项,这就是为了对正则化线性回归使用梯度下降法做出的修改。再化简得第三个的式子。直观地来讲,(第三个式子)第一项就是把θj向0的方向缩小了一点点,第二项与在添加正则化项之前的梯度下降更新是一样的。

用正规方程法来求解正则化线性回归,解决过拟合问题,即使在一个很小的训练集里拥有大量特征。让我们能更好的用线性回归解决很多问题。设正则化线性回归的代价函数的偏导数等于0时,求出的θ,使得代价函数为全局最小值。实际上它与之前的正规方程求解线性回归不同的地方就是加了个蓝色的项(λ×一个很怪的矩阵)。但恰恰是这个东西,解决了在样本量小于特征数时(XTX)不可逆的问题。这也就使得,即使在一个很小的训练集拥有大量特征,线性回归也不会出现过拟合,效果也还好。

Logistic回归的正则化

该帖上面讲过拟合问题的时候没有提到正则化Logistic回归代价函数的公式,下图给出这个公式。图中蓝色的决策边界非常扭曲,从右侧的假设函数也可以看出有很多特征何高阶多项式,没有泛化的潜力。粉色的决策边界就更合理,是正则化Logistic回归。因此,使用正则化的话,即使有很多帖子,正则化都可以帮我们避免过拟合。

接下来给出梯度下降求解正则化Logistic回归的公式。感觉和梯度下降法求线性回归很像,但它们的假设函数h(x)不同。

高级优化函数的正则化

上面讲过,建立一个costFunction函数,然后将它赋给 fminunc() 函数(高级优化函数,意思是函数在无约束条件下的最小值)。然后costFunction会返回jVal(代价函数)gradient(梯度),下面就要写代码计算这两个东西。但将其推广到正则化Logistic回归,就有了代码所示的部分,只不过代码从gradient(2)开始就加了一个正则化项的偏导。因为是从θ1开始的嘛。

# 非线性假设

对于复杂的非线性假设,如果用线性回归或者Logistic回归,那就意味着几何级增长的特征数量(高阶多项式)。只是包括平方项和立方项特征的简单Logistic回归算法并不是一个在n很大的时候学习复杂的非线性假设的好办法,因为特征太多。神经网络在学习复杂的非线性假设上被证明是一种好得多的算法。

神经网络由来已久,最初的目的是制造模拟大脑的机器。大脑很神奇,我们通过大脑不断学习新的事物,但不会像运行上千个程序那样感到负担,或许有一个算法,使得我们可以不断的学习新的东西。

神经网络

将神经元模拟成一个逻辑单元,下面用一个很简单的模型来模拟神经元工作。将神经元模拟成一个逻辑单元。黄色的为神经元细胞体,通过输入通道(树突)传递给神经元一些信息,然后用神经元做一些计算,然后通过它的输出通道(轴突)输出 假设函数计算的结果 。X0是偏置单元,加它与否取决于具体例子表现起来是否方便。于是这个简单模型就是带有Sigmoid(或Logistic)激活函数的人工神经元,这个Sigmoid激活函数指代的是非线性函数 g(z) 。在这里模型的参数θ,有关神经网络的文献里也称模型的权重。

上图是单个人工神经元,神经网络就是一组神经元连接在一起的集合。输入层输入特征X1X2X3,输出层输出假设的最终计算结果。第二层a1上面的(2)指的是第二层。a1(2)实际上是第二层第1个神经元的激活项。激活项是指由一个具体神经元计算并输出的值。

下图展示上面这个神经网络的具体计算步骤,刚才已经说过,这个 ai(j) 是第j层第i个神经元的激活项,激活项是指有一个具体神经元计算输出的值。此外,神经网络被这些矩阵参数化。 θ(j) 就是这个权重矩阵,它控制从某一层到下一层的映射。下图中的a1(2)等于 sigmoid() 激活函数作用在输入的θ10(1)x0…θ13(1)x3的线性组合上的结果。那么θ(1)是控制从三个输入单元到三个隐藏单元的映射的参数矩阵,是一个3×4的矩阵。

Generally,如果一个网络在第j层有Sj个单元,在j+1层有Sj+1个单元,那么控制第j层到j+1层映射的矩阵θ(j)的维度是Sj+1×(Sj+1)。

第三层的那个神经元,计算假设函数的最终结果。可以看到式子中是θ(2)而不是θ(1),因为控制的是从第二层到第三层(输出单元)的映射。

那么上图的神经网络,定义了函数h从输入x到输出y的映射。这些假设被参数θ参数化,这样一来,改变θ就能得到不同假设。

以向量化的方法高效实现神经网络的计算

下图,从输入单元的激活项开始传播给隐藏层,计算隐藏层的激活函数,再计算输出层的激活项,这个过程叫向前传播(forward propagation)。接下来结合下图讲一讲这个过程的向量化实现方法。将a1(2)里的 g() 函数里面的θ10(1)x0…θ13(1)x3赋给z1(2),这个z值是特定神经元的输入值x0x1x2x3加权线性组合

将x看成x0-x3组成的向量,z(2)看作z值们组成的向量。那么用向量化的形式写出,z(2)(1)x,a(2)=g(z(2))。图中定义了a(1)=x,所以z(2)(1)a(1)。最后计算假设函数的结果那个神经元激活函数里的值可以写作z(3),z(3)(2)a(2),最后假设函数可以写作hθ(x)=a(3)=g(z(3))。那么绿色框框内的公式来计算h(x),那就会非常有效,这就是向量化的实现方式。

如下左图所示,把左边部分蒙起来,右侧就像一个Logistic回归,只是输入这个回归的特征,是隐藏层计算出来的数值。也就是说,它们是学习得到的函数输入值,也就是说第一层映射到第二层的函数是由其它参数θ(1)决定的。也就是说根据θ选择的不同参数,有时可以学到有趣和复杂的特征,就可以得到更好的假设函数,比用原始的x0-x3输入时得到的假设好得多。甚至可以用x1x2等多项式作为输入项,这个算法可以灵活地尝试快速学习任意的特征项。

在神经网络中,神经元的连接方式叫做架构(Architecture),如下图所示。第一层还是输入层,第二三层是隐藏层,可以计算出更复杂的特征,第四层是输出层,这样以来得到非常有趣的非线性假设函数。

接下来是一个详细的例子来说明神经网络是怎么计算复杂非线性函数的输入的,这个例子能够帮助理解为什么神经网络可以用来学习复杂的非线性假设模型。

下图例子中有两个输入特征x1和x2,它们都只能取0或1。左边的部分可以看作右边复杂机器学习问题的简化版。我们的想做的是学习一个非线性的判断边界,把红叉和蓝圈分开。要学习这个问题,需要用到 XOR 计算,异或计算,相同为0,不同为1。 XNOR 等价于 NOT(x1XORx2

拟合AND运算

为了构造这个计算AND运算的只含有单个神经元的神经网络,可以加一个偏置单元,然后调整神经网络中的权重,配合 Sigmoid 函数来拟合AND运算。 Sigmoid 函数的图像如右上角所示,当z为4.6时, g(z) 为0.99,且该函数关于y轴对称。下面可以看作三个θ组成的一个向量,分别为-30、20、20。

拟合OR运算

单个神经元的神经网络拟合OR运算只需改一下参数。

拟合NOT运算

拟合XNOR运算

把下图中上部分的三个单独的部分组合到一个网络当中,就可以拟合XNOR运算了。在图中下部分建立了一个神经网络来实现这个XNOR运算。

x1-x3是输入层,隐藏层中有两个神经元,三个原始特征映射到隐藏层不同神经元的权重不同,就完成了不同的稍微复杂的功能,从隐藏层到输出层再添加一个偏置单元,赋予权重,实现一个更复杂的运算,最后输出假设函数的结果。下半部分的图,左右侧要结合来看,更直观地理解神经网络是如何实现的。

那么这个函数就有一个输入层、一个隐藏层、一个输出层,最后得到了一个非线性的决策边界,用以计算XNOR函数。

神经网络多类别分类

在多分类问题中,y(i)就不是{1,2,3,4}了,而是一个向量,如在一个四分类问题中,就是[1,0,0,0]T,[0,1,0,0]T…[0,0,0,1]T。一个训练样本由(x(i), y(i))组成,x(i)就是四种物体种的一个,如四张图中的一张图像,y(i)就是[1,0,0,0]T…[0,0,0,1]T中的一个。

那么我们希望找到一个办法使神经网络输出一些数值, hθ(x(i))≈y(i) ,在四张图片分类的例子中,式中的 hθ(x(1) y(i) 都是四维向量,分别代表四种不同的类别。

神经网络在分类问题中的应用

假设有一个如下图所示的神经网络,然后有一个右上角的m组训练集, L 表示神经网络中的层数(这里等于4), sl 表示l层的单元数,不包括偏置单元。

分类问题可以分为两种,一种是二元分类问题(如图中左部分所示),这种情况下会有一个输出单元,来计算hθ(x),hθ(x)∈ℝ(属于一个实数)。那么 sl 在这里就等于1,为了简化记法可以写成k=1。另一种是多类别分类问题(如图中右部分所示),也就是会有k个不同的类。如果有四类的话,那么hθ(x)∈ℝk(K维向量),这里K≥3(因为是四分类)。

神经网络的代价函数

神经网络中用到的代价函数是Logistic回归中用到的代价函数的一般形式,对于Logistic回归而言要使得代价函数最小化,可以看到Logistic回归的y(i),表示它只有一个输出单元,也可以看到后面的正则项j从1开始,说明没有把偏差项θ0正则化。

神经网络有k个y(i)(yk(i)),也就是有k个Logistic输出单元。神经网络输出属于ℝk的向量, (hθ(x))i 表示第i个输出。与Logistic回归的代价函数不同的是,求和项把k个输出单元的所有输出项全加起来了,如果有四个输出单元,那么就是每一次Logistic回归的代价函数按四次输出的顺序依次把这些代价函数加起来。那个求和符号应用于yk和hk,因为我们主要将第K个输出单元的值和yk值的大小作比较。后面那个额外的正则化项,就是对所有除了偏置单元的θ参数求和。

神经网络反向传播算法

上面讲了神经网络的代价函数,接下来讲让代价函数最小化的算法——反向传播算法。

上面已经交代了神经网络的代价函数,接下来需要使用梯度递减或更高级的算法来计算使得 J(θ) 最小时的θ。也就是说这里关注的是那个偏导项的计算。

下面是在只给定一个训练样本的情况下神经网络向前传播的计算过程。

接下来,为了计算那个偏导数,将用一个叫反向传播的算法。

反向传播算法直观上来说需要计算每个结点的 error ,所谓误差就是单元的激活值与训练样本的真实值的差距, δj(l)=aj(l)-yj ,这个激活值实际上就是那个神经元的输出值。这里如果把δ、a、y都看作向量,就可以得出一个向量化的表达式 δ(4)=a(4)-y 

先把输出层的δ计算出来,再一层一层往前计算δ,直到计算到第二层。第一层是输入层,就不做这个操作了。下图是仅有一个训练样本的情况,如果忽略正则项,就可以得到最下面的结果。在图中也可以看到 g'(z(2))=a(2)·×(1-a(2),通过微积分算出来的。

反向传播算法的完整过程

接下来讲有大量训练样本的情况下(假设有m个)。首先要设一个Δij(l)=0,可以理解为在编程中求一个累加之前的变量声明,用来计算代价函数的偏导项的。然后遍历每一个训练样本,都有设a(1)=x(i)(x(1)是第i个样本),进行一个向前传播来计算后面每一层的a(l)(l=2,3,4..L),只有向前传播计算了激活值之后,才能计算出用于反向传播的 δ ,然后求得Δij(l)(累加每一个偏导数项,上图给出的计算方法,结合下图看),偏导项等于最后的Dij(l)

理解反向传播

为了更好理解反向传播,先进一步研究一下前向传播的过程。算上偏置单元有三个箭头指向a1(3),设三个箭头上面的权重依次是{θ10(2)11(2)12(2)},那么z1(3)就如图中下面公式所示,这就是前向传播在做的事。反向传播和前向传播非常相似,只是两个算法的计算方向不同。

举一个只有一个输出单元且只考虑一个训练样本的神经网络的例子,如左图所示。因只有一个输出单元,是所以这一个训练样本的 y(i) 是一个实数。如果忽略正则化项(λ=0),那么对应这个训练样本的代价函数就是图中蓝色框中的东西,可以看作是神经网络输出值与真实值的差的平方(方差),所以这个 cost(i) 表示了神经网络预测样本值的准确程度,也就是神经网络输出值与实际观测值y(i)的接近程度。

下面右图就在进行一个反向传播。对反向传播算法的直观理解就是计算一个 δj(l) ,也就是第l层中第j个单元中得到的激活项的“误差”,也是代价函数 cost(i) 关于 zj(l) 的偏导数。如果在神经网络内部稍微把 zj(l) 改一下就最终会影响到代价函数的值。δ衡量的是,为了影响这些zj(l)所改变神经网络中权重的程度,进而影响整个神经网络的输出。

接下来是最直观的公式环节,通过前向传播已经计算出了输出单元的激活值,那么 δ1(4)=y(i)-a1(4) ,然后计算出前面每个节点的δ。如 δ2(2)=θ12(2)δ1(3)22(2)δ2(3) 。这些δ都只关于隐藏单元并不包括偏置单元。

看53

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments