吴恩达机器学习课程笔记记录
(已完结 2024.2.1)
课程资料https://github.com/kaieye/2022-Machine-Learning-Specialization
• 定义(非显式编程)
学习内容包括
• 监督学习 course 1,2
• 非监督学习 course 3
• 强化学习(了解)
• 实操学习算法
第一课 监督学习
Week1
监督学习
算法输入,训练对应输出 x to y 的映射
• 回归(regression):从大量可能的输出中预测数字
• 分类(classification):输出的结果(数字或非数字)被分为几种可能的类别,预测的结果是小的预设集合
非监督学习(无监督学习)
在未标记的数据集中找到一些有趣的特性,例如聚类算法(clustering)。
无监督学习并不会给出所谓的“正解”(只有输入x但没有输出标签y),由算法自动找出特性。在谷歌新闻,基因分类中有所应用。
• 聚类(group similar data together)
• 异常检测(发现异常数据点)
• 降维(dimensionality reduction)压缩数据,同时丢失尽可能少的信息
Jupyter notebook
线性回归模型 linear regression
输入特征x,输出目标y,训练集
y_hat是y(真实值)的估计值,f是函数(模型),x -->f to y即特征通过模型进行预测。
只有一个变量的线性回归叫做单变量线性回归。
代价函数(成本函数)cost function
f(X)=wX+b
w,b成为参数,或系数,或权重
成本函数的自然导出:
J(w,b)通过计算方差的方式来构造成本函数,使得可以找到最接近于真实值的f参数。
除以2是为了简化计算,m是(x,y)训练样例总量
差值平方成本函数是常用的线性回归成本函数。
数学上,寻找最佳直线的过程就是minimize J的过程。
如果同时考虑w和b,代价函数会出现汤碗状(二元函数J)
等高线图形式:
梯度下降算法
概念
用于最小化w,b的成本函数,自动处理线性回归问题,是一种更系统的方法
事实上是一种可用于尝试最小化任何函数的算法,甚至是具有两个以上参数的其它成本函数:J(w1…wn,b)
• 不断改变w,b的值(初始设置为0,0),来减小J,直到J被设置为或者接近于一个最小值。
• 最小值可能有多个(也就是极小值,局部最小值)
• 沿着梯度下降的方向(方向导数最大值)减小J。
实现梯度下降算法
• 更新w值,α是学习率,决定了每次下降的步幅。
• derivative→导数
• 同时更新w,b是正确的方法
• 学习率过大或过小的影响
• 随着导数值的减小,即使学习率是固定的,更新的值也会变小。
用于线性回归的梯度下降
• 计算成本函数关于w和b的偏导数。
此时成本函数是凸函数,只要学习率合适,J总是会收敛到全局最小值,(碗形底部)。
运行效果:
使用批量batch梯度下降进行线性回归,指的是每次都使用所有的训练样例。
Week2
多维特征
• 注意符号的含义:下标数字表示的是不同的特征;上标带括号的数字表示的是每个特征的第i个训练样例,且箭头是可选的指示符,用于强调这是一个包含1…4个特征样例的向量。如果上下标同时出现,就表示是Xj特征的第i个样例。
多元线性回归:
写成向量点积形式,不同特征乘不同的w相加
• 不是多元回归,是多元线性回归。前者是其它的概念。
向量化
有助于实施学习算法时缩短代码提高效率。
• 使用了Numpy——一个Python和机器学习中使用最广泛的数值线性代数库
• 使用向量化的方法(dot)能够在计算机中并行使用硬件,无论是普通计算机还是CPU,GPU,通常都能加速机器学习作业,且代码更短。
- 普通实现,不好,n很大时不现实
- 用循环,一般
- 矢量化,用Numpy库的dot方法,又快又好
• 普通方法是一个一个相加,而矢量化方法有专门的硬件并行完成。
• 在梯度下降算法中:
用于多元线性回归的梯度下降法
向量化方法表示:
将J的偏导数具体表示:
另外:正规方程法(处理线性回归问题的另一种方法)
• 不能够泛化解决其他学习算法
• 特征数量大时慢
• 一些线性回归库使用,机器学习从业者一般不会自己实现
推荐的方法是梯度下降法
特征缩放
让梯度下降更快
• 特征数值较小时,其对应参数w往往较大;而特征数值较大时,其对应参数往往较小;这样其预测结果更接近真实值。
• 因此,特征之间的散点分布和成本函数等高线图可能会出现如下的情况:
(此时成本函数等高线图没有考虑b,考虑的是向量w的两个特征w1和w2)
• 为了便于梯度下降法快速找到J的最小情况,应该对特征进行缩放,让各个特征数值之间具有良好的比较能力,效果如下:
• 实现方式:
除以最大值,限定范围0-1
均值归一化(均值标准化)
算出特征均值,然后特征-均值μ,除以范围差值
Z-score归一化(Z分数标准化)
算出x1和x2的标准差(正态分布,高斯曲线)
何时进行特征缩放?
目标是让特征数值在-1到1之间,可接受的范围同样也包括-3到3,-0.3到0.3。对于相差过大的情况,为了让梯度下降运行得更快,鼓励进行特征缩放,这几乎没有坏处。
判断梯度下降是否收敛
• 绘制并查看学习曲线
良好的梯度下降学习曲线的J应该随着迭代次数的增加而下降,最终趋于平稳。
横轴是迭代次数,纵轴是成本函数值。不同的迭代方式可能需要不同的迭代次数。通过观察一定迭代次数之后的J值是否趋于平稳,判断其是否已经收敛。
• 采用自动收敛测试
如果J的变化小于一个小量ε,则宣布J到达全局最小值,梯度下降收敛。实际应用中,定义ε的大小是不容易的,因此更倾向于观察学习曲线。
选择适当的学习率
如果学习曲线并不随着迭代次数下降,甚至随着迭代次数上升,即J不收敛,这往往意味着:
• 学习率α过大
• 代码中存在错误
前者会导致每次的参数调整过于剧烈,以至于无法发现J的全局最小值
后者常见的是将调整的➖写成➕,这与梯度下降思想背道而驰。
在实际的代码调试中,判断J是否收敛的一个小技巧是将学习率α设置为一个很小的值,用来判断究竟是学习率过大导致的不收敛,还是由于代码的错误导致的不收敛。
需要强调的是,这只是一个调试的技巧,过小的学习率虽然可以让J收敛,但是却不是一个合理的学习率,会让梯度下降运行得非常慢,需要更多次数的迭代。
尝试选择学习率α的值
例如,从0.001开始,每次更新乘10倍或者3倍,观察对应的学习曲线。
最终选择的学习率应对应一个良好的学习曲线,尝试选择一个最大可能的学习率,或者比其略小一些。
特征工程
例如,定义一个新特征来获得更好的模型:
特征工程可以帮助拟合直线之外的曲线
多项式回归
选择不同的特征,获得不同的模型,例如(根号x,x²,x三次方)。
• 在这种情况下,对应于x的多项式,不同的特征往往具有相差很大的数据范围,此时特征缩放变得尤其重要。
选择什么特征?将会在第二课介绍。
• Scikit-learn工具的使用,在可选实验室中
Week3
学习分类(y不是任意数字输出了)。事实证明,线性回归是不适合分类的,要学习逻辑回归。
• y只有两种输出的叫二元分类(yes/no 0/1 true/false 正例/反例)
线性回归可能会得到糟糕的预测结果,决策边界发生移动。
逻辑回归虽然叫回归,但这是历史原因导致的,实际上用于解决分类问题。
逻辑回归
Sigmoid函数(逻辑函数)
• 逻辑回归得到的曲线应该呈现如图状态(最终取值还是0/1)
• 逻辑回归的输出始终介于0-1之间,这是Sigmoid函数的值域决定的
• Sigmoid函数用于构造曲线,表达式如图
• 如何使用Sigmoid函数:
• 逻辑回归输出的解释:输出的y=1的可能性,因此也有概率P的写法
决策边界
设置一个预测的阈值,fx或gz大于等于该阈值时y预测=1。小于时=0,例如,设定阈值为0.5
• 决策边界示例1:
令z=0,得出的两个特征的临界值(构成一条直线)就是此时的决策边界。
• 决策边界示例2(逻辑回归的多项式回归):
• 更复杂的决策边界(更复杂的多项式)
逻辑回归的成本函数(代价函数)
成本函数提供衡量一组特定参数与训练数据拟合程度的方法,提供了获得更好的参数的办法。
平方误差成本函数并不是逻辑回归的理想成本函数。
训练集示例:
如果采用平方误差成本函数的话,成本函数曲线区别于线性回归,在逻辑回归的情况下并不是凸函数,因此可能会有很多局部最小值,无法保证梯度下降收敛至全局最小值。
单个训练示例的损失函数 & 逻辑回归的成本函数
将之前的成本函数求和内部部分(含1/2)单独定义为逻辑回归的损失函数,表示一个单独示例中fx和y的差距表现。
在平方误差成本函数的情况下,损失函数是1/2(fx-y)²
当我们为损失函数选择不同的形式,那么由损失函数求和形成的成本函数将可以成为一个具有全局最小值的凸函数。(为什么是凸的是一个数学问题,实际上就是求二阶导,这里就不展开了)
用于逻辑回归的损失函数(由此求和得到了新的成本函数)注意点:
• 根据不同的真实标签y具有不同的表达式形式
• fx(由Sigmoid函数定义的)
fx始终介于0-1之间,因此对数函数的曲线有效部分也相应确定。
真实值为1时的逻辑损失函数
fx在0-1之间,因此图像是对应的对数函数一个(0,+∞)的递减部分。
此时预测值fx和真实值y=1定义的损失函数形式-log(fx)表达了一个事实关系,即:
• fx很接近1时,损失值很小,这表明预测的结果更为合理;
• 当预测值fx更接近0,和真实值y=1并不接近时,损失函数的值会较大,甚至趋于+∞,这表明预测的结果并不合理。
可以看出,损失函数激励了算法作出更准确的预测,当真实值y=1时,损失函数在预测值fx接近1时损失最低。
真实值为0时的逻辑损失函数
相较于真实值为1,仅仅作出了表达式的变化,其思想内涵完全一致。
同样的,预测值fx距离目标y越远,损失值越高。
当模型作出了非常肯定的预测,例如99.99%的概率,但却与目标值不一致,此时将会被惩罚而得到一个非常大的损失。因此,假设当真实标签为1时,算法被强激励为不要预测太接近0的结果。
• 所有单个训练示例的损失函数定义了整个训练集的成本函数,成本函数总结了所有训练样例的损失,衡量了整个训练集的表现。
• 单个训练示例的损失函数表示了预测值与实际值的差距
接下去仍然是找到一组w,b时这个新的逻辑回归成本函数最小化。
简化逻辑回归成本函数
为了更简洁地实现梯度下降,对逻辑回归的成本函数进行简化。
(将函数的两个表达式写成一个等价的表达式)
用简化的损失函数构造成本函数:
另外,为什么我们会在如此多的可能成本函数中选择了这种形式作为逻辑回归的成本函数?这实际上是用最大似然估计的统计原理推导的,它通过寻找最大化样本观测值的概率(似然函数)的参数值来估计参数值。而且这个成本函数具有凸的优良特性。
在逻辑回归中实现梯度下降
根据学习率和对应导数值的乘积重复同步更新w,b
右边的导数形式需要注意。带入就可以得到逻辑回归的梯度下降表达式:
尽管成本函数的导数形式导致w,b的更新方式非常相似,但是逻辑回归与线性回归的函数fx是不一致的。
同样可以判断收敛,向量化实现,特征缩放。
(可选实验室里有逻辑回归梯度下降的可视化,以及scikit-learn的用法)
欠拟合/过拟合问题
我们学习的算法可能会遇到过拟合的问题,与过拟合相反的情况成为欠拟合。我们将学习过拟合的概念以及解决过拟合的正则化方法。
如下的三个房价的例子,分别对应欠拟合,正好,过拟合:
• 欠拟合的数据显然和训练数据非常不符合,因此具有”高偏差“(High Bias)。高偏差和欠拟合是等价的表达。高偏差在这里指的是该算法没有清晰地捕获到训练数据的一个清晰的模式,没有很好地拟合训练数据。或者说存在类似于算法先入为主地认为数据是线性的这样的情况而导致拟合不足。特征太少可能会更容易导致欠拟合问题。
• 正好的拟合说明学习算法能够很好地泛化数据,推广至其它例子。
• 如果采用四次多项式来拟合房价数据,会出现过拟合的情况,此时预测的价格能够完美地符合训练数据,甚至使得成本函数为0。然而这并不代表学习算法是好的算法,因为这样的算法具有”高方差“——由于它实在是太符合训练数据了,因此对于不同的训练数据,训练的结果将会大不相同,并不能很好地泛化数据,这说明了算法出现了过拟合问题。过拟合和高方差也是等价的表达。
机器学习的目标是找到一个既不是过拟合也不是欠拟合的模型,也就是一个既不是高偏差也不是高方差的模型。
过拟合同样会出现于分类问题:
在z中具有非常多的高阶项时,其决策边界(Sigmoid函数的z=0对应的曲线)可能会呈现出最右边图的复杂形状,此时出现了过拟合。
解决过拟合
后续我们会讨论发现过拟合的手段,在此我们先讨论如何解决过拟合问题。
• 首先是可以收集更多的训练数据
这会迫使模型去对抗过拟合
• 其次是选择包括更少的特征
如果包括的特征非常多而对应的训练数据又很少的时候,模型很可能过拟合。
这涉及特征选择的问题,因为在这种情况下不得不丢失一些和结果预测有关的信息。后续会介绍算法来选择一个最小的特征集合。
• 第三是正则化(即将具体介绍)
在实际的过拟合例子中,各个特征的参数往往都比较大,这是过拟合的一个特点,尝试减小这些参数往往会让结果更容易避免过拟合的情况。上述特征选择以减少特征的方法实际上对应将特征前对应的参数设置为0。与之不同,正则化可以保留所有的特征,转而只是防止特征产生过大的影响而产生过拟合。
在实际应用正则化时,通常只对w1…wn(wj)作变小的操作,对于b没有要求。一般而言减小b也不会有什么效果。
可选实验室介绍了过拟合的解决方法示例,建议看看。
正则化
上面已经提到了正则化的基本思想就是减小一些参数值的大小,减弱其对应特征的影响,这比直接删除某个特征更加温和。它的做法可以简单表述为:
我们不再最小化原先的成本函数,而是现在成本函数后加上若干个很大的数乘上对应希望减小的几个参数的平方。之后再进行最小化。因为很大的数和参数的乘积会阻碍成本函数的最小化,因此这些参数都会被最小化方法改变得很小,这达到了我们的目的。
通常而言,我们并不知道应该惩罚哪一个特征使其参数变小,因此我们会惩罚所有的特征。
确切的做法是这样的:
寻找一个正则化参数λ,用如下的式子改变成本函数(即加上一系列参数平方与λ的乘积)
需要注意:
• λ的值也按2m进行缩放,这种正则化方式有助于我们确定λ的值,同时在训练集规模m增长时让之前确定的λ仍然具有可行性。
• 实际中,是否惩罚b对结果没有太大作用。本课程不考虑b。
因此,需要最小化的成本函数变成了均方误差成本加上额外的正则化项,前者能够鼓励模型更好地拟合数据,后者则鼓励模型尽量避免过拟合。
其中,正则化参数λ的作用就是平衡这两部分的关系:
在λ较小时,模型会更加重视拟合数据的部分,即将平方误差最小化,可能导致过拟合,如λ=0时;
在λ非常大时,模型会更重视避免过拟合的问题,可能会导致欠拟合。例如λ趋向于∞时,所有的参数wj都会接近于0,此时整个模型只剩下b的一条直线(b没有参与正则化惩罚),这是失败的拟合结果。
因此选择一个既不偏大也不偏小的λ是非常重要的。在后续的学习中,会介绍具体的确定λ值的方法。
用于线性回归的正则方法
如何让正则线性回归和梯度