吴恩达机器学习要点记录(上)

PS:

  1. 笔记中搜索“疑惑”可以查看未解决的问题,安排时间来逐渐解决这些问题
  2. 个别地方加入了吴恩达深度学习的知识点

单变量线性回归

基础概念

  1. 模型表示
    吴恩达机器学习要点记录(上)

  2. 代价函数(cost function)与假设函数(Hypothesis)
    吴恩达机器学习要点记录(上)

吴恩达机器学习要点记录(上)
LR的代价函数的图像(以两个参数为例)如下图,注意LR的代价函数必定为凸函数。
吴恩达机器学习要点记录(上)

对应的等高线图:

吴恩达机器学习要点记录(上)

PS:吴恩达深度学习课程中的另外一个术语是Loss Function(损失函数),区别在于,损失函数衡量的是假设函数在单个样本上的表现,而代价函数衡量的是假设函数在全体样本上的表现

  1. 梯度下降算法

梯度下降算法是一个通用的用于求解函数的(局部)最小值的算法,这里以含两个参数的代价函数为例。
PS:同时更新θ0θ_0θ1θ_1意思是,在求代价函数对θ1θ_1的偏导时,不能使用本轮已经更新了的θ0θ_0。也就是每一轮的更新必须使用上一轮得到的代价函数来求偏导。

疑惑:为什么这样更新就能得到局部最小值?单变量函数可以理解,多变量函数的情况呢,与方向导数和梯度的知识有关?

吴恩达机器学习要点记录(上)
对于一般的代价函数,GD算法过程的示意图如下
吴恩达机器学习要点记录(上)

梯度下降算法在LR中的实际应用,用于求均方误差代价函数(以两个参数为例)的最小值

吴恩达机器学习要点记录(上)

吴恩达机器学习要点记录(上)
由于LR的代价函数必定为凸函数,故对其使用梯度下降算法可以确保得到最小值而不只是局部最小值,如下图:

吴恩达机器学习要点记录(上)
上面介绍的属于“Batch”梯度下降算法,算法的每一步都使用了所有训练样本(求和从1到m);另外也有非Batch版本的GD算法,每次只考虑训练样本集的子集。
吴恩达机器学习要点记录(上)

求解代价函数的最小值也可以不使用GD等迭代算法,而是使用数值解析的方法来直接解出最小值,这种方法称为正规方程(normal equations)。GD算法可拓展性好,在大型数据集上比正规方程的效率更高。

  1. 线代复习

一些记法。下图展示了3*2矩阵和4维向量的记法,R(3×2)R^{(3\times2)}R4R^4。另外,数学中一般下标从1开始,但机器学习算法中经常从0开始。
吴恩达机器学习要点记录(上)

利用矩阵乘法来简化计算,以只含两个参数的LR模型为例。
吴恩达机器学习要点记录(上)
若有3个模型,4个样本,也可以同时计算这12个预测结果。
吴恩达机器学习要点记录(上)

小结:使用矩阵与向量的好处:

  1. 简化了符号表示
  2. 计算机可以利用并行计算提高计算效率

多变量线性回归

假设函数含n个参数的LR

前面介绍了单变量线性回归并以其为例解释了一些基本概念,现在将LR推广到代价函数含n个参数的形式,并同时介绍这种情况下的GD算法。
符号介绍:
m代表训练样本数量,n为特征个数,x为训练样本,上标 i 表示第 i 个样本,下标 j 表示第 j 个特征。

吴恩达机器学习要点记录(上)
将2个特征推广到多个特征,并引入一些约定来简化符号记法。

定义x0x_0=1,相当于训练样本矩阵的加了0列这个新的特征,并且该列值全为1。这样做只是为了可以用简化的符号来表示假设,这样就得到了多变量线性回归模型的假设。

吴恩达机器学习要点记录(上)
x0x_0=1约定下,参数改为向量θ,多变量LR的假设、代价函数、以及对应的GD算法如下:

吴恩达机器学习要点记录(上)
下图展示了GD算法如何从特征个数为1的情形推广到特征个数为n的情形。
PS:1. 左边的x为标量,右边的x为向量;2. 颜色框的对应关系表明了推广后的公式与之前的公式本质一样。

吴恩达机器学习要点记录(上)

优化GD算法的tricks

  1. 特征缩放(feature scaling)
    让特征处在相近的范围,可以使GD更快收敛。从等高线图来看,特征缩放使得等高线的同心椭圆更均匀(而不是很狭长),从而收敛过程的路径没有之前那么复杂。PS:后面介绍的代替GD算法的正规方程法,不需要使用特征放缩。

吴恩达机器学习要点记录(上)
并不需要所有特征的取值范围都完全相同。

吴恩达机器学习要点记录(上)

利用均值归一化的几种方式来进行特征缩放,分子为x减去均值,分母可以是最大值、(最大值减最小值)、标准差

吴恩达机器学习要点记录(上)

  1. 学习率的选择

太小则收敛过慢,太大则代价函数无法在每次迭代后都比之前更小,甚至导致无法收敛。

吴恩达机器学习要点记录(上)
学习率太大时,每次都会越过最小值点,且到达的新的位置,其(偏)导数更大了,下次还是会越过最小值点,所以一直下去也无法收敛。如果代价函数越来越大,或不断地变大变小,则需要把学习率调小一点。

吴恩达机器学习要点记录(上)

特征构造以及利用特征构造来得到多项式回归

适当地构造特征可以使模型效果更好,例如可以尝试构造x=width×depthx=width \times depth

吴恩达机器学习要点记录(上)

并且,构造特征还可以得到更加复杂的模型,而不会只能用直线来拟合数据。例如Hypothesis为三次函数,将二次项和三次项都构造为新的特征,即可转化为线性回归模型。注意,此时特征缩放特别重要。

吴恩达机器学习要点记录(上)

用正规方程法求解代价函数的最小值点θ

其实就是令偏导为0求得极值点。

吴恩达机器学习要点记录(上)
构造矩阵XX并利用公式求解最优的θθ

疑惑:这个公式应该就是令各偏导为0得到的方程组的解,但是有待证明。

疑惑:二元函数令各偏导为0解方程组得到可疑点后,是利用判别式作为充分条件得知该可疑点是否为极大、极小或不能确定的,那么在变量更多时用什么方法确定这些可疑点的情况?
吴恩达机器学习要点记录(上)

吴恩达机器学习要点记录(上)

GD算法与正规方程法来求解函数最值的对比:

吴恩达机器学习要点记录(上)
在很多库中,计算矩阵的逆的时间复杂度为O(n3)O(n^3),因此正规方程法不适合在特征数量很多(n很大,例如上百或上千)时使用。另外,在很多复杂的模型中(例如逻辑斯蒂回归),GD仍然适用,而正规方程却不适用。

疑惑:为什么正规方程法不再使用?是因为偏导为0的方程组不是线性方程组是吗?

使用正规方程法时遇到奇异矩阵的处理方法(跳过)

逻辑斯谛回归

假设函数

线性回归不适用于分类问题,即使标签仅为0和1,预测值也有可能小于0或大于1。即使使用阈值来将输出转化为0和1,仍然难以确定阈值。例如在以0.5为阈值时(注意此时输出值范围不一定0到1之间,所以不能解释为概率,这个0.5没什么太大意义),若增加一个异常值,拟合结果将为蓝色直线,得到的分类器性能很差(分错了两个样本)

吴恩达机器学习要点记录(上)

接下来介绍逻辑斯谛回归算法(名字含有“回归”是历史原因,这其实是分类算法)

逻辑斯谛函数的输出在0到1之间。

吴恩达机器学习要点记录(上)
我们将h(x)h(x)(假设函数)的输出值当做(疑惑:是定义吗?还是有原理?)样本x为正例的概率(因此为负例的概率为1h(x)1-h(x))。图中的概率读作“给定参数θ,x作为条件时y=1的概率”

吴恩达机器学习要点记录(上)

决策边界

从下图分析可以看出,逻辑斯谛回归输出正例和负例的临界值在于θTxθ^Tx的值是否大于0
吴恩达机器学习要点记录(上)

θTx=0θ^Tx=0 称为决策边界
吴恩达机器学习要点记录(上)

通过添加特征的高阶项作为新的特征,可以对非线性可分的训练集(其对应非线性的决策边界)进行划分。(图中的圆对应右边的二阶函数,但下方的不规则的决策边界只是示意图,表示添加更多高阶项可以得到复杂的非线性决策边界)

吴恩达机器学习要点记录(上)

代价函数

回顾一下逻辑斯谛回归的假设函数:
吴恩达机器学习要点记录(上)

为了确定假设函数中的参数θθ,需要定义代价函数然后求其最小值。为了便于使用梯度下降法来求代价函数的最小值,我们希望这个代价函数是凸函数,并且能够反映出模型对数据的拟合程度。

如果使用LR中的平方代价函数作为逻辑斯谛回归的代价函数,将得到一个非凸函数,如下图。

吴恩达机器学习要点记录(上)

因此我们需要定义另一个适合的函数作为代价函数。下图为逻辑斯谛回归的代价函数。

吴恩达机器学习要点记录(上)

上面的函数适合作为代价函数:

  1. 它是凸函数
  2. 它能反映分类效果的好坏(输出值越小分类效果越好)。如下两图所示,当y=0y=0时,预测值越接近0则代价越小,反之越大;当y=1y=1时,预测值越接近1则代价越小,反之越大。

PS:还有很多其他函数也具有上述性质,其实这个函数并非因为上述两点而被选为代价函数,本质上它是由极大似然法得到的(疑惑:好好补习下这块知识)。

吴恩达机器学习要点记录(上)

吴恩达机器学习要点记录(上)

将代价函数换一种等价写法,可以得到更简洁、有利于求导的形式。

疑惑:这个代价函数越小的确反映了分类/拟合效果越好,但是怎么和前面的决策边界联系起来理解?可能学了极大似然法回来再看就明白了吧。

吴恩达机器学习要点记录(上)

吴恩达机器学习要点记录(上)

同样使用GD算法求代价函数的最小值。可以发现此处GD算法的形式和LR中的GD算法形式一样,但由于假设函数h(x)h(x)与LR的截然不同,故LR和逻辑斯谛回归并不是同一回事。

吴恩达机器学习要点记录(上)

高级优化算法及其特点

PS:三种高级的优化算法比GD算法复杂很多,不建议自己实现,而建议去使用现有的相关库。
吴恩达机器学习要点记录(上)

推广为多元分类器

对于含有n个标签(n≥3)的分类问题,可以构造n个二分类器将其转化为n个二分类问题。
吴恩达机器学习要点记录(上)

对于输入xx,我们由n个二分类器得到该样本属于每个类的概率,然后取其中概率值最大的分类器对应的类别即可。
吴恩达机器学习要点记录(上)

正则化

欠拟合与过拟合

欠拟合:模型对数据的拟合程度不足,具有高偏差(bias)

过拟合:模型对数据的拟合程度过高,具有高方差(variance)

PS:在样本数量少,而特征很多时,容易发生过拟合现象。(疑惑:为什么?)

以LR预测房价为例,下面是假设函数与数据点的拟合情况:

吴恩达机器学习要点记录(上)

以逻辑斯谛回归的决策边界为例,下面是模型的决策边界将数据点的划分情况:

吴恩达机器学习要点记录(上)

解决方法:

吴恩达机器学习要点记录(上)

正则化简介

通过对参数引入惩罚项(一个较大的数乘以该参数,例如1000)使得求出的对应参数接近于0,相当于在假设函数中去掉了这些系数。

吴恩达机器学习要点记录(上)

正则化使得假设函数更“简单”,更“平滑”(疑惑:为什么有这种效果?),从而更不容易过拟合。实际上我们使用正则化时并不知道应该对哪些参数增加惩罚项,因此是对所有参数都增加惩罚项(不包括特征x0x_0对应的参数θ0θ_0

疑惑:为什么不惩罚θ0θ_0?因为是常数项所以不影响“平滑程度”吗?
吴恩达机器学习要点记录(上)

正则化的代价函数如下图所示,其中λ为正则化参数,用于在拟合程度高和模型简单(参数尽量小)这两个目标之间做权衡。

吴恩达机器学习要点记录(上)

线性回归的正则化

使用梯度下降的情况

利用GD算法求解LR的误差函数的最小值时,对于θjθ_j的更新操作推导得到下图中最底下的式子,其中αλmα\frac{λ}{m}是一个很小的数,这使得θjθ_j的平方范数减小了,或者说更靠近0了。(疑惑:平方范数是啥意思??)

吴恩达机器学习要点记录(上)

使用正规方程法的情况

将正规方程法的公式做如下修改(疑惑:如何推导出来的?):

吴恩达机器学习要点记录(上)

若遇到奇异矩阵的情况,处理方法为(略过)

逻辑斯谛回归的正则化

修改代价函数:

吴恩达机器学习要点记录(上)

若使用GD算法,修改过程:
吴恩达机器学习要点记录(上)

若使用BFGS等优化算法,也需要对应修改其过程,这里略去。

神经网络

逻辑斯谛回归的缺陷

对于非线性可分的数据集,有时我们需要得到非常复杂的非线性假设函数,这时用逻辑斯谛回归虽然也可以通过构造高阶项得到复杂的非线性函数,但是随着特征的增加,需要构造的项的数目将会过大,即特征太多,从而更容易过拟合,而且计算量过大。

吴恩达机器学习要点记录(上)

特别是在某些特殊问题中,特征的数量非常大。例如CV领域,假如图像分辨率为50×5050\times50,则在灰度模式下特征个数为2500个,此时所有特征的二次项就达到了3百万个。而且,若在RGB模式下,特征个数为7500个。

吴恩达机器学习要点记录(上)

神经网络的基本概念

图中展示了最简单的神经网络。其中x0x_0称为偏置单元或偏置神经元,其值恒为1,有时可以不画出来。图中黄色的神经元常被称为带sigmoid/logisticsigmoid/logistic**函数的人工神经元。另外,本课程延续前面习惯,使用θθ作为模型参数,但在很多神经网络的文献中,参数常为称为权重w。

吴恩达机器学习要点记录(上)

下图为三层神经网络,从左到右为输入层、隐藏层、输出层,第三层输出的是假设函数h(x)h(x)的值。x0x_0a0(2)a^{(2)}_0是可画可不画的偏置神经元。

吴恩达机器学习要点记录(上)
在神经网络中,不同层次的神经元可以使用不同的**函数,而逻辑斯谛函数只是**函数的其中一种选择,事实上还有其他更好的函数可以作为**函数。下图展示了更常用的做法,即在隐藏层使用ReLU函数(默认),或双曲正切函数g(z)=tanh(z)=ezezez+ezg(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}},而仅在输出层使用g(z)=σ(z)=11+ezg(z)=σ(z)=\frac{1}{1+e^{-z}}

吴恩达机器学习要点记录(上)
吴恩达机器学习要点记录(上)

下图展示了另一种神经网络架构

吴恩达机器学习要点记录(上)

前向传播算法

下图的符号说明:
ai(j)a^{(j)}_i表示第j层的第i个神经元的**项(activation)。 **项指的是一个神经元经过计算然后输出的结果。

Θ(j)\Theta^{(j)}是一个权重矩阵,用于控制从第jj层到第j+1j+1层的映射,即每个ΘΘ矩阵代表了某两层神经元之间所有弧的权重。ΘΘ矩阵中的每个权重值对应特定两层神经元之间的特定弧。每个权重的下标有两个数字,第一个为该弧的弧头(箭头)所连神经元的下标,第二个为该弧的弧尾所连神经元的下标。

③ 图中的gg为逻辑斯谛函数。

吴恩达机器学习要点记录(上)
前向传播算法是利用输入向量xx来计算h(x)h(x)的过程,是一个从输入层到隐藏层再到输出层的计算过程。下图展示了算法如何使用向量来表示。下图竖线右边的工作:定义了xx向量(输入层的**项)、z(i)z^{(i)}向量(第i层神经元的输入向量,其中该向量中每个值都是前一层的**项的线性组合),然后将xx向量记为a(1)a^{(1)}向量便于统一符号,接着添加偏置单元,即可用这套符号写出向量化的计算h(x)h(x)的过程。

我们从输入单元的**项开始,将其向前传给隐藏层,从而计算出隐藏层的**项,然后将隐藏层的**项继续向前传播给输出层,计算出输出层的**项,从而得到h(x)h(x)的值。

吴恩达机器学习要点记录(上)

模型展示

NN能够拟合复杂的非线性函数的原因在于,隐藏层和输出层的每个神经元与其上一层神经元都构成了一个逻辑斯谛回归模型(当**函数使用logistic函数时),例如下图遮住输入层,隐藏层和输出层就构成了一个逻辑斯谛回归模型,而这个模型的特征已经不是原始特征,而是经过逻辑斯谛回归模型来学习得到的新的特征,因此最终的h(x)h(x)能够表示非常复杂的非线性假设函数。(个人感觉像是embedding,前一层模型的输出值作为特征,作为下一层模型的特征来输入)

吴恩达机器学习要点记录(上)

下图是用神经网络实现XNORXNOR逻辑运算(函数)的架构,其中隐藏层的两个神经元实现了稍微复杂的逻辑运算(函数),然后输出层就可以利用这些逻辑得到更加复杂的逻辑运算(函数)。

吴恩达机器学习要点记录(上)

多元分类

类似于逻辑斯谛回归中使用的1 vs rest(1 vs all)的方法,最后输出修改为n个神经元。神经网络的输出值以及训练集的yy标签都改用向量形式来替换。

吴恩达机器学习要点记录(上)

代价函数

疑惑:有待理解下述代价函数

吴恩达机器学习要点记录(上)

PS:神经网络的代价函数是非凸函数,因此使用梯度下降等优化算法求出的可能是局部最小值点,但一般来说也能使得代价函数足够小了。

在吴恩达深度学习课程中,《改善深层神经网络》的2.10节,提到这是因为在高维空间中,梯度下降算法很难遇到局部最小值,而往往会遇到鞍点,所以局部最小值并不是很需要担心的问题。但是在遇到鞍点时,梯度下降算法会到达“平缓区域”,需要较长时间才能走出该区域,而为了解决这一问题,可以使用RMSprop或Adam算法来加快优化算法。

吴恩达机器学习要点记录(上)

反向传播算法

使用反向传播算法求出J(Θ)J(\Theta)对于各θ\theta的偏导数,然后利用这些偏导数就可以使用GD或其他高级的优化算法来得到最小值点Θ\Theta

下图中的δ(j)δ^{(j)}是代价函数对于zi(j)z^{(j)}_i的偏导数

由链式法则可知代价函数J(Θ)J(Θ)Θij(l)Θ^{(l)}_{ij}的偏导数等于aj(l)×δi(l+1)a^{(l)}_j\times\delta^{(l+1)}_i(推导过程见花书P126个人笔记)

花书P126个人笔记还证明了对δ(3)δ^{(3)}δ(2)δ^{(2)}的更新公式(有待证明点乘,即向量化的求解δ(j)δ^{(j)},另外,没有证明代价函数对θ的偏导数,听吴恩达深度学习课程之后感觉只需要先求出损失函数对于各θ的偏导数,然后做一些求和、取平均的操作就可求出代价函数对θ的偏导数)

吴恩达机器学习要点记录(上)

吴恩达机器学习要点记录(上)

实现反向传播算法需要注意展开将参数从矩阵展开成向量(该小节略)

梯度检测

梯度的数值估计

先看导数的估计:

吴恩达机器学习要点记录(上)

疑惑:从导数的定义来看,上面幻灯片中的用于估计导数的公式取极限的结果应该不符合θ\theta处的导数的定义,但是这可能是数值计算中的知识点(单侧差分、双侧差分的概念)。

神经网络中的θ\theta为向量,因此将上面的方法推广到对偏导数的估计过程。

吴恩达机器学习要点记录(上)

检测过程

基本思想就是利用数值计算来估计偏导数,然后与反向传播计算出的偏导数比较,如果几乎相等,则说明反向传播算法的实现是正确的。但是要注意,反向传播算法求偏导数的过程非常高效,而利用数值计算来估计偏导数的过程工作量很大,因此梯度检测只是在检验算法实现的正确性时使用,确定算法已经正确实现之后,就不需要使用了。

吴恩达机器学习要点记录(上)

权重的初始化

权重若全部初始化为0将会导致以同一个神经元作为起点的弧具有相同的权重,之后的每次更新都不能改变这一情况,导致NN学习到的特征其实是高度冗余的。

吴恩达机器学习要点记录(上)

因此,为了打破这种对称性问题,在初始化权重时使用随机初始化。

吴恩达机器学习要点记录(上)

神经网络架构的选择

输入单元个数为特征个数,输出单元个数为类个数。一些较好的默认选择如下:

  1. 只使用一个隐藏层
  2. 若希望使用多个隐藏层,应该保持每个隐藏层的单元个数相等
  3. 每个隐藏层的单元数量越多效果越好,但计算量也越大

吴恩达机器学习要点记录(上)