Machine Learning - 第3周(Logistic Regression、Regularization)
Logistic regression is a method for classifying data into discrete outcomes. For example, we might use logistic regression to classify an email as spam or not spam. In this module, we introduce the notion of classification, the cost function for logistic regression, and the application of logistic regression to multi-class classification.
We’ll introduce regularization, which helps prevent models from overfitting the training data.
Logistic Regression逻辑回归
Classification and Representation分类与表示
Classification分类问题
总结:
- 线性回归和逻辑回归的核心区别?(为什么不能用线性回归处理逻辑回归问题?)线性回归是给定连续型自变量,预测出连续型输出,本质就是一个简单的多项式函数(或其他),用于直接拟合训练集的点;而逻辑回归,首先,其输出是离散的,有限的,这是一个分类问题,最常见的是二元分类,是或否,为了限制输出,必须进行映射,逻辑上,我们将是的点映射到一边,将否的点映射到另一边。
- 逻辑回归中,决策边界是假设函数的一个属性,并非我们认为重新设置的。它们是一个很巧妙的耦合。
- 逻辑回归难就难在,函数是嵌套的,逻辑函数、内层决策边界函数,不容易理解。
- 不是所有的训练集中的元素都是有用的,都能带来有用信息的。
在这个以及接下来的几个视频中 我想 开始介绍分类问题 在分类问题中 你要预测的变量 y 是离散的值 我们将学习一种叫做 逻辑回归 (Logistic Regression) 的算法 这是目前最流行 使用最广泛的一种学习算法
下面是一些分类问题的例子 此前 我们谈到的电子邮件 垃圾邮件分类 就是一个分类问题 另一个例子是网上交易的分类问题 比如一个卖东西的网站 如果你想了解 一个实体的交易 是不是欺诈 或者某人是否 在使用偷来的信用卡 或者是盗用了别的用户的密码 这也是分类问题 之前我们也谈到了 肿瘤分类问题的例子 区别一个肿瘤是恶性的还是良性的
在所有的这些问题中 我们想要预测的变量 是变量 y 我们可以认为 它能够取两个值 0 或 1 是或者不是垃圾邮件 是或者不是欺诈 恶性或良性 标记为0的类 还有一个名字 叫做负类 (negative class) 标记为1的类 也叫做正类 (positive class) 因此0可能代表良性肿瘤 1也就是说正类 可能标记一个恶性肿瘤 对于两种类别的分配 垃圾邮件 或者不是垃圾邮件 等等 将两个类别标记为 正类或负类 0 或 1 是任意的 其实怎样都可以 但是通常 从直觉上来讲 负类总是表达 缺少某样东西的意思 比如缺少恶性肿瘤 而 1 正类 就会表示 存在某样我们寻找的东西 但是哪个是负类 哪个是正类的定义 有时是任意的 它并不太重要 现在 我们要开始 研究只有两类 0 和 1 的分类问题
以后 我们将讨论多类别问题 多类别问题中的变量 y 的取值可以是 0 1 2 和 3 或更多 这就是所谓的多类分类问题 但在接下来的几个视频中 让我们从两类分类问题 或者叫二元分类问题开始 我们以后再关心多类的问题
为什么不能用线性回归手段解决逻辑回归问题?
那我们怎样开发一个分类算法呢? 下面是一个训练集的例子 这个训练集是用来 给一个肿瘤分类为 恶性或者良性的 注意 这个恶性值 (malignancy) 只取两个值 0也就是非(恶性) 和 1 也就是 是(恶性) 所以拿到这个训练集 我们可以做的一个事情是 将一个我们已知的算法 线性回归用于这组数据 尝试用一条直线来拟合数据 所以如果用一条直线 拟合这个训练集 你有可能得到 看起来像这样的假设函数 好了 这是我的假设函数 h(x) 等于 θ 的转置乘以 x 如果你想进行预测 如果你想进行预测 你可以尝试 将分类器的输出阈值设为0.5 这是纵轴上0.5的位置 如果假设输出的值 大于等于 0.5 你就预测 y 值等于 1 如果小于0.5 预测y等于0
让我们看看当我们这样做的时候会发生什么 所以让我们取 0.5 所以 这就是阈值的位置 就这样使用线性回归算法 这个点右边的所有点 我们会将它们 全部预测为正类 因为它们的输出值 在纵轴上 都是大于0.5的 在这一点左侧 的所有点 我们会预测它们全部为负 在这个特定的例子中 看起来好像线性回归所做的 实际上是合理的 尽管我们感兴趣的是 一个分类问题
现在我们把问题稍微改一下 让我来延长一下横轴 让我来延长一下横轴 假如说新增一个训练样本 在很远的右边那里 注意 这个额外的训练样本 这里这个 它实际上并没有改变什么 对不对 ? 看一下训练集 相当清楚 一个很好的假设是什么 在这儿附近的某个点 它右侧的所有点 我们都应该预测为正 而它左侧的所有点 我们应该预测为负 因为从这个训练集来看 因为从这个训练集来看 好像所有大于这附近的 某个特定值的肿瘤 都是恶性的 小些的肿瘤都是非恶性的 至少对于这个训练集是这样 但是一旦我们在这里 增加了额外的样本 如果你现在运行线性回归 拟合数据得到这样一条直线 它可能看起来像这样 如果你现在将假设阈值设为0.5 你最后得到的 阈值位置大概在这里 所以对这个点右侧的所有点 你都将预测为正 它左侧的都预测为负 这样看起来 线性回归的效果并不好 对不对 因为 这些是我们的正样本 这些是我们的负样本 可以清楚地看出 我们真的应该把两类 从这附近的某个点分开 但是因为在极右侧 添加了一个训练样本 而这个训练样本并没有真的给我们任何新的信息 我的意思是 应该不出意外 这个样本的学习结果为恶性 但不知何故 通过在这里添加一个样本 导致线性回归算法 用来拟合数据的直线 从这里洋红线改变到 从这里洋红线改变到 这条蓝线这里 结果使我们得到一条更不好的假设
因此应用线性回归 来解决分类问题通常 不是一个好主意 在第一个例子中 在我追加那个 额外的训练样本之前 线性回归 只是碰巧了 得到了适用于 这个特殊例子的假设 但是通常来说 对一组数据使用线性回归 你可能会很幸运 但往往不是一个好想法 所以我不会用线性回归算法来解决分类问题
这里还有一个有趣的事情 如果我们要用 线性回归算法来解决一个分类问题 对于分类 我们知道 y 取值为 0 或者 1 但如果你使用的是线性回归 那么假设函数的输出值 可能远大于 1 或者远小于 0 即使所有 训练样本的标签 y 都等于 0 或 1 这看起来有点儿奇怪 尽管我们知道 标签应该取值 0 或者 1 但是如果算法得到的值 远大于1或者远小于0的话 就会感觉很奇怪
所以我们在接下来的 几个视频中要研究的 算法就叫做逻辑回归算法 这个算法的性质是 它的输出值永远在 0 到 1 之间 并不会大于 1 也不会小于 0 顺便说一下 逻辑回归算法 是分类算法 并且我们将它作为分类算法使用 有时候可能因为这个算法 的名字中出现了“回归”使你感到困惑 但逻辑回归算法 实际上是一种分类算法 但是这只是因为历史原因 而被这样称呼 所以千万不要被迷惑 逻辑回归实际上 是一个分类算法 它适用于标签 y 取值离散的情况 如 1 0 0 1 所以希望你现在 知道为什么 对一个分类问题使用线性回归算法并不是一个好主意
在接下来的视频中 我们将开始学习 逻辑回归算法的细节
Hypothesis Representation假设函数表达式
总结:
- 假设函数表达式?逻辑函数和普通假设函数的嵌合:h(x)=θT*x;h(x)=g(θT*x);g(z)=1/(1+e^(-z))。
- 如何用参数θ拟合数据?后面会专门讲
- 如何理解逻辑回归模型?h(x)=P(y=1|x;θ)
让我们开始谈谈逻辑回归 在这段视频中 我要给你展示假设函数的表达式 也就是说 在分类问题中 要用什么样的函数来表示我们的假设
此前我们说过 希望我们的分类器 的输出值在0和1之间 因此 我们 (目的)希望想出一个 满足某个性质的假设函数 这个性质是它的预测值要在0和1之间 当我们使用线性回归的时候 这是一种假设函数的形式 其中 h(x) 等于 θ 的转置乘以 x 对于逻辑回归来说 我要把这个稍微改一下 把假设函数改成 g(θ 的转置乘以 x)
其中 我将定义 函数g如下: 当z是一个实数时 g(z)=1/(1+e^(-z)) 这称为 S 型函数 (sigmoid function) 或逻辑函数
逻辑函数这个词 就是逻辑回归名字的由来 顺便说一下 S型函数和逻辑函数 基本上是同义词 意思是一样的 因此 这两个术语 基本上是可互换的 哪一个术语都可以 用来表示这个函数 g 如果我们 把这两个方程 合并到一起 这是我的假设 的另一种写法 也就是说 h(x)=1/(1+e^(-θ 转置乘以 x)) 我所做的是 把这个变量 z 这里 z 是一个实数 把 θ 的转置乘以 x 代入到这里 所以最后得到的是 θ 转置乘以 x 代替了这里的 z
最后 我们看一下S型函数是什么样的 我们在这儿绘制这个图形 S型函数 g(z) 也称为逻辑函数 看起来是这样的 它开始接近0 然后上升 直到在原点处达到0.5 然后它再次变平 像这样 所以这就是S型函数的样子 而且你注意S型函数 而且你注意S型函数 它渐近于1 然后随着横坐标 的反方向趋向于0 随着 z 趋于负无穷 随着 z 趋于负无穷 g(z) 趋近于零 随着 z 趋于正无穷 g(z) 趋近于1 因为 g(z) 的取值 因为 g(z) 的取值 在0和1之间 我们就得到 h(x) 的值 必在0和1之间
(目的)最后 有了这个假设函数 我们需要做的是 和之前一样 用参数θ拟合我们的数据 所以拿到一个训练集 我们需要给参数 θ 选定一个值 我们需要给参数 θ 选定一个值 然后用这个假设函数做出预测(逻辑回归的模型已经确定) 稍后我们将讨论一个 用来拟合参数θ的学习算法
如何理解这个模型?
但是首先让我们讨论 一下这个模型的解释 这就是我对 假设函数 h(x) 的输出的解释 当我的假设函数 输出某个数 我会认为这个数是 对于新输入样本 x 的 y 等于1的概率的估计值 我的意思是这样的
下面举个例子 比方说 我们来看肿瘤分类的例子 我们有一个特征向量 x 和平时一样 x0 等于 1 然后我们的特征变量 x1 是肿瘤的大小 假设我有一个病人来了 而且知道肿瘤的大小 而且知道肿瘤的大小 把他们的特征向量 x 代入我的假设函数 假如假设函数的输出为0.7
我将解释 我的假设如下 我要说 这个 假设告诉我 对于一个特征为 x 的患者 对于一个特征为 x 的患者 y 等于 1 的概率是0.7 换句话说 我要告诉我的病人 非常遗憾 肿瘤是恶性的可能性是70%或者说0.7
要更加正式的写出来 或者说写成数学表达式 我的假设函数等于 P(y=1|x;θ) (涉及到大学数学里的概率论的知识) 对于熟悉概率的人 应该能看懂这个式子 如果你不太熟悉概率 可以这么看这个表达式 可以这么看这个表达式 在给定 x 的条件下 y=1 的概率 给定的 x 就是我的病人的特征 x 给定的 x 就是我的病人的特征 x 特征 x 代表了 我的病人特定的肿瘤大小 这个概率的参数是 θ 这个概率的参数是 θ
所以 我基本上可以认为 假设函数给出的估计 是 y=1 的概率 是 y=1 的概率 现在 因为这是一个 分类的任务 我们知道 y 必须是0或1 对不对? 它们是 y 可能取到的 仅有的两个值 无论是在训练集中 或是对走进我的办公室 或在未来进入医生办公室的新患者 因此 有了 h(x) 我们也可以计算 y=0 的概率 具体地说 因为 y 必须是0或1 我们知道 y=0 的概率 加上 y=1 的概率 必须等于1 这第一个方程看起来 有点复杂
基本上就是说 给定参数 θ 对某个特征为 x 的病人 y=0 的概率 和给定参数 θ 时 对同一个特征为 x 的病人 y=1 的概率相加 必须等于1 如果觉得这个方程看到起来有点儿复杂 可以想象它没有 x 和 θ 这就是说 y=0 的概率 加上 y=1 的概率必须等于1 我们知道这是肯定的 因为 y 要么是0 要么是1 所以 y=0 的可能性 和 y=1 的可能性 它们俩相加肯定等于1 所以 如果你只是 把这一项 移到右边 你就会得到这个等式 就是说 y=0 的概率 等于1减去 y=1 的概率 因此 我们的 假设函数 h(x) 给出的是这一项 你可以简单地计算出这个概率 你可以简单地计算出这个概率 计算出 y=0 的概率的估计值 计算出 y=0 的概率的估计值
所以 你现在知道 逻辑回归的假设函数的表达式是什么 我们看到了定义逻辑回归的 假设函数的数学公式
在接下来的视频中 我想试着让你 对假设函数是什么样子 有一个更直观的认识 我想告诉你 一个被称为判定边界 (decision) 的东西 一个被称为判定边界 (decision) 的东西 我们会一起看一些可视化的东西 可以更好地理解 逻辑回归的假设函数 到底是什么样子
Decision Boundary判定边界
总结:
- 如何直观认识假设函数?它是如何工作的?上节已经明确了假设函数的公式,也已经知道了其输出结果的意义。这里我们想知道,什么时候假设函数会预测1(或0)?根据逻辑函数性质,当内层大于0,逻辑函数就会大于0.5,就会预测1;内层就是θTx,就是我们下面要说的决策边界;最后决策边界θTx上面的点都会被预测得到1。(这就是假设函数运行的整个流程)
- 决策边界是什么?它是假设函数的一个内隐属性,与训练集无关,也不是我们构造出来的。
- 映射函数的地位?映射函数唯一的作用就是将正负无穷映射到0到1,真正与参数θ有关的函数是内层的函数,它决定了如何创建决策边界,决策边界是划分训练集的核心因素。
在过去的视频中 我们谈到 逻辑回归中假设函数的表示方法 现在 我想 告诉大家一个叫做 决策边界(decision boundary)的概念 这个概念能更好地帮助我们 理解逻辑回归的 假设函数在计算什么
假设函数是如何运行的?
让我们回忆一下 这是我们上次写下的公式 当时我们说 假设函数可以表示为 h(x)=g(θTx) 其中函数g 被称为S形函数(sigmoid function) 看起来是应该是这样的形状 它从零开始慢慢增加至1 逐渐逼近1 现在让我们 更进一步来理解 这个假设函数何时 会将y预测为1 什么时候又会将 y预测为0 让我们更好的理解 假设函数的应该是怎样的 特别是当我们的数据有多个特征时
具体地说 这个假设函数 输出的是 给定x时 y=1的概率 因此 如果我们想 预测y=1 还是等于0
我们可以这样做 只要该假设函数 输出y=1的概率 大于或等于0.5 那么这表示 y更有可能 等于1而不是0 因此 我们预测y=1 在另一种情况下 如果 预测y=1 的概率 小于0.5 那么我们应该预测y=0 在这里 我选择大于等于 在这里我选择小于 如果h(x)的值 正好等于0.5 那么 我们可以预测为1 也可以预测为0 但是这里我选择了大于等于 因此我们默认 如果h(x)等于0.5的话 预测选择为1 这只是一个细节 不用太在意
下面 我希望大家能够 清晰地理解 什么时候h(x) 将大于或等于 0.5 从而 我们最终预测y=1 如果我们看看 S形函数的曲线图 我们会注意到 S函数 只要z大于 或等于0时 g(z)就将大于 或等于0.5 因此 在曲线图的这半边 g的取值 大于或等于0.5 因为这个交点就是0.5 因此 当z大于0时 g(z) 也就是这个 S形函数 是大于或等于0.5的
由于逻辑回归的 假设函数h(x) 等于g(θTx) 因此 函数值将会 大于或等于0.5 只要θ转置乘以x 大于或等于0 因此 我们看到 因为这里θ转置x 取代了z的位置 所以我们看到 我们的假设函数 将会预测y=1 只要θ转置乘以x 大于或等于0 现在让我们来考虑 假设函数 预测y=0的情况 类似的 h(θ)将会 小于0.5 只要 g(z)小于0.5 这是因为 z的定义域上 导致g(z)取值 小于0.5的部分 是z小于0的部分 所以当g(z)小于0.5时 我们的假设函数将会预测 y=0 根据与之前 类似的原因 h(x)等于 g(θTx) 因此 只要 θ转置乘以x小于0 我们就预测y等于0
总结一下我们刚才所讲的 我们看到 如果我们要决定 预测y=1 还是y=0 取决于 y=1的概率 大于或等于0.5 还是小于0.5 这其实就等于说 我们将预测y=1 只需要θ转置乘以x 大于或等于0 另一方面我们将预测y=0 只需要θ转置乘以x 小于0
通过这些 我们能更好地 理解如何利用逻辑回归的假设函数 来进行预测 (通过转换,只需要考虑θTx与0的大小关系)
一个具体的例子
现在假设我们有 一个训练集 就像幻灯片上的这个 接下来我们假设我们的假设函数是 h(x)等于g() 括号里面是θ0加上θ1x1 加上θ2乘以x2 目前我们还没有谈到 如何拟合此模型中的参数 我们将在下一个视频中讨论这个问题 但是假设我们 已经拟合好了参数 我们最终选择了如下值 比方说 我们选择θ0 等于-3 θ1 等于1 θ2等于1 因此 这意味着我的 参数向量将是 θ等于 这样 我们有了 这样的一个参数选择 让我们试着找出 假设函数何时将 预测y等于1 何时又将预测y等于0
使用我们在上一张幻灯片上展示的公式 我们知道 y更有可能是1 或者说 y等于1的概率 大于0.5 或者大于等于0.5 只要θ转置x 大于0 我刚刚加了下划线的 这个公式 -3加上x1再加上x2 当然就是θ转置x 这是当θ等于 我们选择的这个参数值时 θ转置乘以x的表达 因此 举例来说 对于任何样本 只要x1和x2满足 这个等式 也就是-3 加上x1再加x2 大于等于0 我们的假设函数就会认为 y等于1 的可能性较大 或者说将预测y=1 我们也可以 将-3放到不等式右边 并改写为x1 加号x2大于等于3 这样是等价的 我们发现 这一假设函数将预测 y=1 只要 x1+x2大于等于3 让我们来看看这在图上是什么意思 如果我写下等式 x1+x2等于3 这将定义一条直线 如果我画出这条直线 它将表示为 这样一条线 它通过 通过x1轴上的3 和x2轴上的3 因此 这部分的输入样本空间 这一部分的 X1-X2平面 对应x1加x2大于等于3 这将是上面这个半平面 也就是所有 上方和所有右侧的部分 相对我画的这条洋红色线来说
所以 我们的假设函数预测 y等于1的区域 就是这片区域 是这个巨大的区域 是右上方的这个半平面 让我把它写下来 我将称它为 y=1区域 与此相对 x1加x2 小于3的区域 也就是我们预测 y等于0的区域 是这一片区域 你看到 这也是一个半平面 左侧的这个半平面 是我们的假设函数预测y等于0的区域 我想给这条线一个名字 就是我刚刚画的这条洋红色线 这条线被称为 决策边界(decision boundary)
具体地说 这条直线 满足x1+x2=3 它对应一系列的点 它对应 h(x)等于 0.5的区域 决策边界 也就是 这条直线 将整个平面分成了两部分 其中一片区域假设函数预测y等于1 而另一片区域 假设函数预测y等于0
决策边界的本质
我想澄清一下 决策边界是假设函数的一个属性,它包括参数θ0 θ1 θ2 在这幅图中 我画了一个训练集 我画了一组数据 让它更加可视化 但是 即使我们 去掉这个数据集 这条决策边界 和我们预测y等于1 与y等于0的区域 它们都是 假设函数的属性 决定于其参数 它不是数据集的属性 当然 我们后面还将讨论 如何拟合参数 那时 我们将 使用训练集 使用我们的数据 来确定参数的取值 但是 一旦我们有确定的参数取值 有确定的θ0 θ1 θ2 我们就将完全确定 决策边界 这时 我们实际上并不需要 在绘制决策边界的时候 绘制训练集
非线性决策边界
现在 让我们看一个 更复杂的例子(更复杂的内部函数) 和往常一样 我使用十字 (X) 表示我的正样本 圆圈 (O) 的表示我的负样本 给定这样的一个训练集 我怎样才能使用逻辑回归 拟合这些数据呢? 早些时候 当我们谈论 多项式回归 或线性回归时 我们谈到可以添加额外的 高阶多项式项 同样我们也可以对逻辑回归使用相同的方法
具体地说 假如我的假设函数是这样的 我已经添加了两个额外的特征 x1平方和x2平方 所以 我现在有5个参数 θ0 到 θ4 之前讲过 我们会 在下一个视频中讨论 如何自动选择 参数θ0到θ4的取值 但是 假设我 已经使用了这个方法 我最终选择θ0等于-1 θ1等于0 θ2等于0 θ3等于1 θ4等于1 这意味着 在这个参数选择下 我的参数向量 θ将是 根据我们前面的讨论 这意味着我的假设函数将预测 y=1 只要-1加x1平方 加x2平方大于等于0 也就是θ转置 我的θ转置 乘以特征变量大于等于0的时候 如果我将 -1放到不等式右侧 我可以说 我的假设函数将预测 y=1 只要x1平方加 x2的平方大于等于1 那么决策边界是什么样子的呢? 好吧 如果我们绘制 x1平方加 x2的平方等于1的曲线 你们有些人已经 知道这个方程对应 半径为1 原点为中心的圆
所以 这就是我们的决策边界 圆外面的一切 我将预测 y=1 所以这里就是 y等于1的区域 我们在这里预测y=1 而在圆里面 我会预测y=0 因此 通过增加这些 复杂的多项式特征变量 我可以得到更复杂的决定边界 而不只是 用直线分开正负样本 在这个例子中 我可以得到 一个圆形的决策边界 再次强调 决策边界 不是训练集的属性 而是假设本身及其参数的属性 只要我们 给定了参数向量θ 圆形的决定边界 就确定了 我们不是用训练集来定义的决策边界 我们用训练集来拟合参数θ 以后我们将谈论如何做到这一点 但是 一旦你有 参数θ它就确定了决策边界 让我重新显示训练集 以方便可视化
最后 让我们来看看一个更复杂的例子 我们可以得到 更复杂的决策边界吗? 如果我有 高阶多项式特征变量 比如x1平方 x1平方乘以x2 x1平方乘以x2平方 等等 如果我有更高阶 多项式 那么可以证明 你将得到 更复杂的决策边界 而逻辑回归 可以用于找到决策边界 例如 这样一个椭圆 或者参数不同的椭圆 也许你 可以得到一个不同的决定边界 像这个样子 一些有趣的形状 或者更为复杂的例子 你也可以得到决策边界 看起来这样 这样更复杂的形状 在这个区域 你预测y=1 在这个区域外面你预测y=0 因此 这些高阶多项式 特征变量 可以让你得到非常复杂的决策边界 因此 通过这些可视化图形 我希望告诉你 什么范围的假设函数 我们可以使用 逻辑回归来表示
现在我们知道了h(x)表示什么 在下一个视频中 我将介绍 如何自动选择参数θ 使我们能在给定一个训练集时 我们可以根据数据自动拟合参数
Logistic Regression Model逻辑回归模型
Cost Function代价函数
总结:
- 如何拟合逻辑回归模型的参数θ? 先从构建代价函数开始
- 改写代价函数?为何改写?如何改写? 默认的代价函数为非凸函数,不利于寻参,为此我们根据代价函数的本质,构建了新的代价函数。
在这段视频中 我们要讲 如何拟合逻辑回归模型的参数θ 具体来说 我要定义 用来拟合参数的优化目标或者叫代价函数
这便是监督学习问题中的 逻辑回归模型的拟合问题 我们有一个训练集 里面有m个训练样本 像以前一样 我们的每个样本 用n+1维的特征向量表示 同样和以前一样 x0 = 1 第一个特征变量 或者说第0个特征变量 一直是1 而且因为这是一个分类问题 我们的训练集 具有这样的特征 所有的y 不是0就是1 这是一个假设函数 它的参数 是这里的这个θ 我要说的问题是
对于这个给定的训练集 我们如何选择 或者说如何拟合参数θ
以前我们推导线性回归时 使用了这个代价函数 (请熟练默背出以前的代价函数公式,否则不用往后看了)我把这个写成稍微有点儿不同的形式 不写原先的1/2m 我把1/2放到求和符号里面了
牢记改写后的代价函数:cost(h(x), y) = 1/2*(h(x)-y)^2
现在我想用 另一种方法 来写代价函数 去掉这个平方项 把这里写成 这样的形式 定义这个代价函数Cost函数 等于这个 等于这个1/2的平方根误差 因此现在 我们能更清楚的看到 代价函数是这个Cost函数(核心目的是为了构造凸函数,便于使用梯度下降算法) 在训练集范围上的求和 或者说是1/m倍的 这个代价项在训练集范围上的求和 然后稍微简化一下这个式子 去掉这些上标 会显得方便一些 所以直接定义 代价值(h(X), Y) 等于1/2倍的 这个平方根误差
如何理解新的代价函数?
对这个代价项的理解是这样的 这是我所期望的 我的学习算法 如果想要达到这个值 也就是这个假设h(x) 所需要付出的代价 这个希望的预测值是h(x) 而实际值则是y 干脆 全部去掉那些上标好了 显然 在线性回归中 代价值会被定义为这个 这个代价值是 1/2乘以 预测值h和 实际值观测的结果y 的差的平方 这个代价值可以 很好地用在线性回归里 但是我们现在要用在逻辑回归里 如果我们可以最小化 代价函数J里面的这个代价值 它会工作得很好
但实际上 如果我们使用这个代价值 它会变成参数θ的非凸函数
我说的非凸函数是这个意思 对于这样一个代价函数J(θ) 对于逻辑回归来说 这里的h函数 是非线性的 对吧? 它是等于 1 除以 1+e的-θ转置乘以X次方 所以它是一个很复杂的非线性函数 如果对它取Sigmoid函数 然后把它放到这里 然后求它的代价值 再把它放到这里 然后再画出 J(θ)长什么模样 你会发现 J(θ)可能是一个这样的函数 有很多局部最优值 称呼它的正式术语是 这是一个非凸函数 你大概可以发现 如果你把梯度下降法 用在一个这样的函数上 不能保证它会 收敛到全局最小值 相应地 我们希望 我们的代价函数J(θ) 是一个凸函数 是一个单弓形函数 大概是这样
所以如果对它使用梯度下降法 我们可以保证梯度下降法 会收敛到该函数的全局最小值 但使用这个 平方代价函数的问题是 因为中间的这个 非常非线性的 sigmoid函数的出现 导致J(θ)成为 一个非凸函数 如果你要用平方函数定义它的话
所以我们想做的是 另外找一个不同的代价函数 它是凸函数 使得我们可以使用很好的算法 如梯度下降法 而且能保证找到全局最小值
我们构建的新的代价函数是什么?(牢记)
cost(h(x), y) = -log(h(X)) 当y=1时;
cost(h(x), y) = -log(1-h(X)) 当y=0时。
如何理解我们新的代价函数?
这个代价函数便是我们要用在逻辑回归上的 我们认为 这个算法要付的代价或者惩罚(这一句道出了代价函数的核心本质) 如果输出值是h(x) 或者换句话说 假如说预测值h(x) 是一个数 比如0.7 而实际上 真实的标签值是y 那么代价值将等于 -log(h(X)) 当y=1时;以及-log(1-h(X)) 当y=0时。
这看起来是个非常复杂的函数 但是让我们画出这个函数 可以直观地感受一下它在做什么 我们从y=1这个情况开始 如果y等于1 那么这个代价函数 是-log(h(X)) 如果我们画出它 我们将h(X) 画在横坐标上 我们知道假设函数 的输出值 是在0和1之间的 对吧? 所以h(X)的值 在0和1之间变化 如果你画出这个代价函数的样子 你会发现它看起来是这样的
理解这个函数为什么是这样的 一个方式是 如果你画出log(z) z在横轴上 它看起来会是这样 它趋于负无穷 这是对数函数的样子 所以这里是0 这里是1 显然 这里的Z 就是代表h(x)的角色 因此 -log(Z)看起来这样 就是翻转一下符号 -log(Z) 我们所感兴趣的是 函数在0到1 之间的这个区间 所以 忽略那些 所以只剩下 曲线的这部分 这就是左边这条曲线的样子
现在这个代价函数 有一些有趣而且很好的性质 首先 你注意到 如果y=1而且h(X)=1 也就是说 如果假设函数 刚好预测值是1 而且y刚好等于我预测的 那么这个代价值等于0 对吧? 这对应于… 这个曲线并不是平的 曲线还在继续走 首先 注意到如果h(x)=1 如果假设函数 预测Y=1 并且如果y确实等于1 那么代价值等于0 这对应于下面这个点 对吧? 如果h(X)=1 这里我们只需要考虑 y=1的情况 如果h(x)等于1 那么代价值等于0 这是我们所希望的 因为如果我们 正确预测了输出值y 那么代价值是0
但是现在 同样注意到 h(x)趋于0时 所以 那是h 当假设函数的输出趋于0时 代价值激增 并且趋于无穷 我们这样描述 体现出了这样一种直观的感觉 那就是如果假设函数输出0 相当于说 我们的假设函数说 Y=1的概率等于0 这类似于 我们对病人说 你有一个恶性肿瘤的概率 也就是说 y=1的概率是0 就是说你的肿瘤 完全不可能是恶性的 然而结果是 病人的肿瘤确实是恶性的 所以如果y=1 即使我们告诉他们 它发生的概率是0 它完全不可能是恶性的 如果我们告诉他们这个 和我们的确信程度 并且最后我们是错的 那么我们用非常非常大的代价值惩罚这个学习算法 它是被这样体现出来 这个代价值趋于无穷 如果y=1 而h(x)趋于0 这是y=1时的情况
学来学去,云里雾里,是因为你没抓住核心。什么是代价函数?代价函数是以参数θ为自变量的函数,是通过模型预测值与真实值之间差距确定的代价值函数,目标是找到一系列的参数θ使得代价函数的值最小,确定参数θ,最终确定我们的模型。
如果抓不住核心,学起来真的是非常痛苦。
我们再来看看 y=0时 代价值函数是什么样 如果y=0 那么代价值是这个表达式 如果画出函数 -log(1-z) 那么你得到的 代价函数实际上是这样 它从0到1 差不多这样 如果你画出 y=0情况下的 代价函数 你会发现大概是这样 它现在所做的是 在h(X)趋于1时激增 趋于正无穷 因为它是说 如果最后发现 y等于0 而我们却几乎 非常肯定地预测 y=1的概率是1 那么我们最后就要付出非常大的代价值 (以下这一段和前面重复了)让我们画出y=0时的 代价函数 所以如果y=0 这就是我们的代价值函数 如果你看着这个表达式 然后你画出 -log(1-Z) 如果你清楚它是什么样的 你会得到这样一个图形 这样随着 横轴上的z 从0到1 如果你画出 y=0时的 代价函数 你会发现 代价函数是这样的 它所做的是 代价函数会在这里激增 趋于正无穷 随着h(X)的增大 而趋近于1 这体现了这样一个直观的感觉 如果假设函数预测 h(X)=1 并且非常确定 比如这样的概率是1 认为y肯定是1 但是最后发现 y其实等于0 这就必须要让假设函数 或者学习算法付出一个很大的代价 反过来 如果h(x)=0 而且y=0 那么假设函数预测对了 预测的是y=0 并且y就是等于0 并且Y就是等于0 那么代价值函数在这点上 应该等于0
在这个视频中 我们定义了 单训练样本的代价函数 凸性分析的内容是超出这门课的范围的 但是可以证明 我们所选的 代价值函数 会给我们一个 凸优化问题 代价函数J(θ)会是一个凸函数 并且没有局部最优值
在下一个视频中 我们会把单训练样本的 代价函数的这些理念 进一步发展 然后给出 整个训练集的代价函数的定义 我们还会找到一种 比我们目前用的 更简单的写法 基于这些推导出的结果 我们将应用梯度下降法 得到我们的逻辑回归算法
Simplified Cost Function and Gradient Descent简化的代价函数和梯度下降模型
总结:
- 如何简化代价函数? 局部优化:-y log(h(x))- (1-y) log(1-h(x));最终整体归一的代价函数:
- 如何运用梯度下降法来拟合逻辑回归的参数? 得到整体的代价函数,套用之前的梯度下降算法公式,求导得到最终公式。
- 梯度下降法求参数的公式怎么写?
请默写出逻辑回归的完整代价函数(否则不用往后看了):
我们之前的那个log只是单个点的代价值,我们还需要计算整个训练集的代价值。
在这段视频中 我们将会找出 一种稍微简单一点的方法来写代价函数 来替换我们现在用的方法 同时我们还要弄清楚 如何运用梯度下降法 来拟合出逻辑回归的参数 因此 听了这节课 你就应该知道如何 实现一个完整的逻辑回归算法
这就是逻辑回归的代价函数 我们的整体代价函数 不同的训练样本 假设函数 h(x) 对实际值 y(i) 进行预测 所得到的不同误差 算出的 Cost 函数值 并且这是我们之前 算出来的一个单个样本的代价值 我只是想提醒你一下 对于分类问题 我们的训练集 甚至其他不在训练集中的样本 y 的值总是等于0或1的 y 的值总是等于0或1的 对吗? 这就是 y 的数学定义决定的
由于 y 是0或1 我们就可以 想出一个简单的 方式来写这个代价函数
具体来说 为了避免把代价函数写成两行 避免分成 y=1 或 y=0 两种情况来写 我们要用一种方法 来把这两个式子合并成一个 这将使我们更方便地 写出代价函数 并推导出梯度下降 具体而言 我们可以如下写出代价函数 Cost(h(x), y) 可以写成 以下的形式
-y log(h(x))- (1-y) log(1-h(x))
我马上就会给你演示这个表达式或等式与我们已经得出的代价函数的表达是完全等效的 并且更加紧凑 让我们来看看为什么会是这样
我们知道有两种可能情况 y 必须是0或1 因此 我们假设 y 等于1 如果 y 是等于 那么这个等式 这个 Cost 值 是等于 如果 y 等于1 那么这一项等于1 1-y 将会等于零 对吧? 如果 y 等于1 那么 1-y 就是1-1 也就是0 因此第二项乘以0 就被消去了 我们只留下了 第一项 y倍的 log 项 -y 乘以 log(h(x)) y等于1 因此就等于 -log(h(x)) 这个等式 正是我们在这里的 y=1 的情况 另一种情况是 如果 y=0 如果是这样的话 那么写出的 Cost 函数就是这样的 如果 y 是等于0 那么这一项就为0 而1-y 在y=0时 1-y 就是0 因为1-y就是 1-0 所以 最后就等于1 这样 Cost 函数 就简化为只有这最后一项 对吧? 因为第一项 在这里乘以零 所以它被消去了 所以 我们只剩下最后的 这一项 也就是 -log(1-h(x)) 你可以证明 这里的这一项 就是当y=0时的这一项 因此这表明 这样定义的 Cost 函数 只是把这两个式子 写成一种更紧凑的形式 不需要分 y=1 或 y=0 来写 直接写在一起 只用一行来表示
这样我们就可以写出 逻辑回归的代价函数如下 它是这样的 就是 1/m 乘以后面这个 Cost 函数 在这里放入之前 定义好的 Cost 函数 这个函数就完成了 我们把负号放在外面 我们为什么要把代价函数写成这种形式 似乎我们也可以选择别的方法来写代价函数 在这节课中我没有时间 来介绍有关这个问题的细节 但我可以告诉你 这个式子是从统计学中的 极大似然法得来的 估计 统计学的思路是 如何为不同的模型 有效地找出不同的参数 同时它还有一个很好的性质 它是凸的 因此 这就是基本上 大部分人使用的 逻辑回归代价函数 如果我们不理解这些项 如果你不知道 什么是极大似然估计 不用担心 这里只是一个更深入 更合理的证明而已 在这节课中 我没有时间去仔细讲解
根据这个代价函数 为了拟合出参数 我们怎么办呢?
我们要试图找尽量让 J(θ) 取得最小值的参数 θ 所以我们想要尽量减小这一项 这将我们将得到某个参数 θ 最后 如果我们给出一个新的样本 假如某个特征 x 假如某个特征 x 我们可以用拟合训练样本的参数 θ 来输出对假设的预测 来输出对假设的预测 另外提醒你一下 我们假设的输出 实际上就是这个概率值 p(y=1|x;θ) 就是关于 x 以 θ 为参数 y=1 的概率 你就把这个想成 我们的假设就是 估计 y=1 的概率
所以 接下来要做的事情 就是弄清楚 如何最大限度地 最小化代价函数 J(θ) 作为一个关于 θ 的函数 这样我们才能为训练集拟合出参数 θ
最小化代价函数的方法 是使用梯度下降法(gradient descent) 这是我们的代价函数 如果我们要最小化这个关于 θ 的函数值 这就是我们通常用的梯度下降法的模板 我们要反复更新每个参数 用这个式子来更新 就是用它自己减去 学习率 α 乘以后面的微分项 如果你知道一些微积分的知识 你可以自己动手 算一算这个微分项 看看你算出来的 跟我得到的是不是一样(复习一下基本的微积分知识) 即使你不知道微积分 也不用担心 如果你计算一下的话 你会得到的是这个式子 我把它写在这里 将后面这个式子 在 i=1 到 m 上求和 其实就是预测误差 乘以 x(i)j 所以你把这个偏导数项 放回到原来式子这里 我们就可以将 梯度下降算法写作如下形式 我做的就是把 前一张幻灯片中的那一行 放到这里了 所以 如果你有 n 个特征 也就是说 参数向量θ 包括 θ0 θ1 θ2 一直到 θn 那么你就需要 用这个式子 来同时更新所有 θ 的值
现在 如果你把这个 更新规则和我们之前 用在线性回归上的 进行比较的话 你会惊讶地发现 这个式子正是 我们用来做线性回归梯度下降的 事实上 如果你看一下 前面的视频 再仔细想想这个更新规则 线性梯度下降规则 实际上跟我蓝色框里 写出来的式子是完全一样的
那么 线性回归和 逻辑回归是同一个算法吗? 要回答这个问题 我们要观察逻辑回归 看看发生了哪些变化 实际上 假设的定义发生了变化 所以对于线性回归 假设函数是 h(x) 为 θ 转置乘以 x 而现在逻辑函数假设的定义 已经发生了变化 现在已经变成了 这样的形式 因此 即使更新参数的 规则看起来基本相同 但由于假设的定义 发生了变化 所以逻辑函数的梯度下降 跟线性回归的梯度下降实际上是两个完全不同的东西 在先前的视频中 当我们在谈论线性回归的 梯度下降法时 我们谈到了如何监控 梯度下降法以确保其收敛 我通常也把同样的方法 用在逻辑回归中 来监测梯度下降 以确保它正常收敛 希望你自己能想清楚 如何把同样的方法 应用到逻辑函数的梯度下降中
当使用梯度下降法 来实现逻辑回归时 我们有这些不同的参数 θ 就是 θ0 到 θn 我们需要用这个表达式来更新这些参数 我们还可以使用 for 循环来实现 所以 for i=1 to n 或者 for i=1 to n+1 用一个 for 循环来更新这些参数值 当然 不用 for 循环也是可以的 理想情况下 我们更提倡使用向量化的实现 因此 向量化的实现 可以把所有这些 n 个 参数同时更新 一举搞定 为了检查你自己的理解 是否到位 你可以自己想想 应该怎么样实现这个 向量化的实现方法
好的 现在你知道如何实现逻辑回归的梯度下降 最后还有一个 我们之前在谈线性回归时讲到的特征缩放 我们看到了特征缩放是如何 提高梯度下降的收敛速度的 这个特征缩放的方法 也适用于逻辑回归 如果你的特征范围差距很大的话 那么应用特征缩放的方法 同样也可以让逻辑回归中 梯度下降收敛更快 就是这样 现在你知道如何实现 逻辑回归 这是一种非常强大 甚至可能世界上使用最广泛的一种分类算法 而现在你已经知道如何去实现它了
Advanced Optimization高级优化算法
总结:
- 有哪些高级优化算法? gradient descent、conjugate gradient、BFGS、L-BFGS。
- 这些算法作用于哪个阶段?这些算法需要 J(θ) 和 导数项,然后用更复杂的算法来最小化代价函数。
在上节课的视频中 用梯度下降的方法最小化逻辑回归中代价函数 J(θ) 在这段视频中 教你们一些 高级优化算法和一些 高级的优化概念 利用这些方法 我们就能够 使通过梯度下降 进行逻辑回归的速度 大大提高 而这也将使 算法更加适合解决 大型的机器学习问题 比如 我们有数目庞大的特征量
现在我们换个角度 来看什么是梯度下降 (目的)我们有个代价函数 J 而我们想要使其最小化 那么我们需要做的是 (实现)我们需要 编写代码 当输入参数 θ 时 它们会计算出两样东西 J(θ) 以及 J等于 0 1直到 n 时的 偏导数项 假设我们已经完成了 可以实现这两件事的代码 那么梯度下降所做的就是 反复执行这些更新 生成了这个叫做 data 的对象 是吧?
所以给出我们 用于计算这些的偏导数的代码 梯度下降法就把它插入 到这里 从而来更新参数 θ 因此另一种考虑 梯度下降的思路是 我们需要写出代码 来计算 J(θ) 这些偏导数 然后 把这些插入到梯度下降中 然后它就可以为我们最小化这个函数 对于梯度下降来说 我认为 从技术上讲 你实际并不需要编写代码 来计算代价函数 J(θ) 你只需要编写代码来计算导数项 但是 如果你希望 代码还要能够监控 这些 J(θ) 的收敛性 那么我们就 需要自己编写代码 来计算 代价函数和偏导数项 所以 在写完能够 计算这两者的代码之后 我们就可以使用梯度下降
但梯度下降并不是我们可以使用的唯一算法 还有其他一些算法 更高级 更复杂 如果我们能用 这些方法来计算 这两个项的话 那么这些算法 就是为我们优化 代价函数的不同方法 conjugate gradient、共轭梯度法 BFGS (变尺度法) 和 L-BFGS (限制变尺度法) 就是其中一些更高级的优化算法 它们需要有一种方法来计算 J(θ) 以及需要一种方法 计算导数项 然后使用比梯度下降更复杂 的算法来最小化代价函数 这三种算法的具体细节 超出了本门课程的范畴 实际上你最后通常会 花费很多天 或几周时间研究这些算法 你可以专门学一门课来提高数值计算能力
不过让我来告诉你他们的一些特性 这三种算法有许多优点 一个是 使用这其中任何一个算法 你通常 不需要手动选择学习率 α 所以对于 这些算法的一种思路是 给出 计算导数项和代价函数的方法 你可以认为算法有一个智能的内部循环 而且 事实上 他们确实有一个智能的内部循环 称为线性搜索(line search)算法 它可以自动 尝试不同的 学习速率 α 并自动 选择一个好的学习速率 α 因此它甚至可以 为每次迭代选择不同的学习速率 那么你就不需要自己选择 这些算法实际上在做 更复杂的事情 而不仅仅是 选择一个好的学习速率 所以它们往往最终 收敛得远远快于梯度下降 这些算法实际上在做 更复杂的事情 不仅仅是 选择一个好的学习速率 所以它们往往最终 比梯度下降收敛得快多了 不过 关于它们到底做什么的详细讨论 已经超过了本门课程的范围
实际上 我过去 使用这些算法 已经很长一段时间了 也许超过 十年了 使用得相当频繁 而直到几年前 我才真正 搞清楚 共轭梯度法 BFGS 和 L-BFGS的细节 因此 实际上完全有可能 成功使用这些算法 并应用于许多不同的学习 问题 而不需要真正理解 这些算法的内环间在做什么 如果说这些算法有缺点的话 那么我想说主要 缺点是它们比梯度下降法复杂多了 特别是你最好 不要使用 L-BGFS BFGS这些算法 共轭梯度 L-BGFS BFGS 除非你是数值计算方面的专家
实际上 我不会建议你们编写 自己的代码来计算 数据的平方根或者 计算逆矩阵 因为对于这些算法我 还是会建议你直接使用一个软件库 所以 要求一个平方根 我们所能做的 就是调用一些 别人已经 写好用来计算数字平方根的函数 幸运的是 有 Octave 和 与它密切相关的 MATLAB 语言 我们将会用到它们 Octave 有一个非常 理想的库用于实现这些先进的优化算法 所以 如果你直接调用 它自带的库 你就能得到不错的结果 我必须指出 这些算法 实现得好或不好是有区别的 因此 如果你正在你的 机器学习程序中使用一种不同的语言 比如如果你正在使用 C C + + Java 等等 你 可能会想尝试一些 不同的库 以确保你找到一个 能很好实现这些算法的库 因为 在 L-BFGS 或者等高线梯度的 实现上 表现得好与不太好 是有差别的
因此现在让我们来说明 如何使用这些算法
我打算举一个例子 比方说 你有一个 含两个参数的问题 这两个参数是 θ0 和 θ1 那么你的成本函数 J(θ)等于 θ1 减去5的平方 再加上 θ2 减5的平方 因此 通过这个代价函数 你可以得到 θ1 和 θ2 的值 如果你将 J(θ) 最小化的话 那么它的最小值 将是 θ1 等于5 θ2 等于5 我知道你们当中 有些人比别人微积分更好 但是你应该知道代价函数 J 的导数 推出来就是这两个表达式 我已经写在这儿了 那么你就可以应用 高级优化算法里的一个 来最小化代价函数 J 所以 如果我们 不知道最小值 是5 5 但你想要 代价函数找到这个最小值 是用比如 梯度下降这些算法 但最好是用 比它更高级的算法 你要做的就是运行一个 像这样的 Octave 函数 那么我们 运行一个函数 比如 costFunction 这个函数的作用就是 它会返回两个值 第一个是 jVal 它是 我们计算的代价函数 J 所以说 jVal 等于 theta(1) 减5的平方加 theta(2) 减5的平方 这样就计算出这个代价函数 函数返回的第二个值是 梯度值 梯度值应该是 一个2×1的向量 梯度向量的两个元素 对应 这里的两个偏导数项 运行这个 costFunction 函数后 你就可以 调用高级的优化函数 这个函数叫 fminunc 它表示 Octave 里无约束最小化函数 调用它的方式如下 你要设置几个 options 这个 options 变量 作为一个数据结构可以存储你想要的 options 所以 GradObj 和 On 这里设置梯度目标参数为打开(on) 这意味着你现在确实要给这个算法提供一个梯度 然后设置最大 迭代次数 比方说 100 我们给出一个 θ 的猜测初始值 它是一个2×1的向量 那么这个命令就调用 fminunc 这个@符号表示 指向我们刚刚定义的 costFunction 函数的指针 如果你调用它 它就会 使用众多高级优化算法中的一个 当然你也可以把它当成梯度下降 只不过它能自动选择 学习速率α 你不需要自己来做 然后它会尝试 使用这些高级的优化算法 就像加强版的梯度下降法 为你找到最佳的 θ 值 让我告诉你它在 Octave 里什么样 所以我写了这个关于theta的 的 costFunction 函数 跟前面幻灯片中一样 它计算出代价函数 jval 以及梯度 gradient gradient 有两个元素 是代价函数对于 theta(1) 和 theta(2) 这两个参数的 偏导数
一个具体的例子,使用Octave在命令行实现
现在 让我们切换到Octave窗口 我把刚刚的命令敲进去 options = optimset 这是 在我的优化算法的 options上 设置参数 的记号 这样就是100 次迭代 我现在要给我的算法提供梯度值 设置 theta 的初始值是一个2×1的零向量 这是我猜测的 theta 初始值 现在我就可以 写出三个返回值 等于 指向代价函数的指针 @costFunction 我猜测的初始值 initialTheta 还有options 如果我敲回车 这个就会运行优化算法 它很快返回值 这个格式很有意思 因为我的代码 是被缠住了 所以这个有点意思 完全是因为我的命令行被绕住了 不过这里只是 数字上的一些问题 把它看成是加强版梯度下降 它们找到 theta 的最优值 是 theta(1) 为5 theta(2) 也为5 这正是我们希望的 functionVal 的值 实际上是10的-30次幂 所以 这基本上就是0 这也是我们所希望的 exitFlag为1 这说明它的状态 是已经收敛了的 你也可以运行 help fminunc 命令 去查阅相关资料 以理解 exitFlag 的作用 exitFlag可以让你确定该算法是否已经收敛 这就是在 Octave 里运行这些算法的过程 哦对了 这里我得指出 用 Octave 运行的时候 向量θ的值 θ的参数向量 必须是 d 维的 d 大于等于2 所以 θ 仅仅是一个实数 因此如果它不是 一个至少二维的向量 或高于二维的向量 fminunc 就可能无法运算 因此如果你有一个 一维的函数需要优化 一维的函数需要优化 你可以查找 Octave 里 fminuc 函数的资料 来得到更多的细节 来得到更多的细节 这就是我们如何优化 一个例子的过程 这是一个 简单的二次代价函数
我们如果把它应用到逻辑回归中呢 在逻辑回归中 我们有 一个参数向量 theta 我要混合使用 Octave 记号和数学符号 我希望这个写法很明确 我们的参数 theta 由 θ0 到 θn 组成 由 θ0 到 θn 组成 因为在 Octave 的标号中 向量的标号是从1开始的 在 Octave 里 θ0实际上 写成 theta(1) 因此用 theta(1) 表示第一个参数 θ0 然后有 theta(2) 接下来写到 theta(n+1) 对吧 这是因为 Octave 的记号 是向量从1开始的 而不是从0开始 因此 我们需要 做的是写一个 costFunction 函数 它为 逻辑回归求得代价函数 具体点说 costFunction 函数 需要返回 jVal 值 因此需要一些代码 来计算 J(θ) 我们也需要给出梯度值 gradient 那么 gradient(1) 对应用来计算代价函数 关于 θ0 的偏导数 接下去关于 θ1 的偏导数 依此类推 再次强调 这是 gradient(1) gradient(2) 等等 而不是gradient(0) gradient(1) 因为 Octave 的标号 是从1开始 而不是从0开始的 我希望你们从这个幻灯片中 学到的主要内容是 你所要做的是 写一个函数 它能返回 代价函数值 以及梯度值 因此要把这个 应用到逻辑回归 或者甚至线性回归中 你也可以把这些优化算法用于线性回归 你需要做的就是输入 合适的代码来计算 这里的这些东西 现在你已经知道如何使用这些高级的优化算法 有了这些算法 你就可以使用一个 复杂的优化库 它让算法使用起来更模糊一点 more opaque and so 因此也许稍微有点难调试 不过由于这些算法的运行速度 通常远远超过梯度下降
因此当我有一个很大的 机器学习问题时 我会选择这些高级算法 而不是梯度下降 有了这些概念 你就应该能将逻辑回归 和线性回归应用于 更大的问题中 这就是高级优化的概念
在下一个视频 也就是逻辑回归这一部分的最后一个视频中 我想要告诉你如何 修改你已经知道的逻辑回归算法 然后使它在多类别分类问题中 也能正常运行
Multiclass Classification多类别分类
Multiclass Classification: One-vs-all多类别分类:一对多
在本节视频中 我们将谈到如何使用逻辑回归 (logistic regression) 来解决多类别分类问题 具体来说 我想通过一个叫做"一对多" (one-vs-all) 的分类算法 让你了解什么是多类别分类问题
先看这样一些例子 假如说你现在需要 一个学习算法 能自动地 将邮件归类到不同的文件夹里 或者说可以自动地加上标签 那么 你也许需要一些不同的文件夹 或者不同的标签来完成这件事 来区分开来自工作的邮件、来自朋友的邮件 来自家人的邮件或者是有关兴趣爱好的邮件 那么 我们就有了 这样一个分类问题 其类别有四个 分别用y=1、y=2、y=3、 y=4 来代表 另一个例子是有关药物诊断的 如果一个病人 因为鼻塞 来到你的诊所 他可能并没有生病 用 y=1 这个类别来代表 或者患了感冒 用 y=2 来代表 或者得了流感 y=3 第三个例子 也是最后一个例子 如果你正在做有关 天气的机器学习分类问题 那么你可能想要区分 哪些天是晴天、多云、雨天、 或者下雪天
对上述所有的例子 y 可以取 一个很小的数值 一个相对"谨慎"的数值 比如1到3、1到4或者其它数值 以上说的都是多类分类问题 顺便一提的是 对于下标是 0 1 2 3 还是 1 2 3 4 都不重要 我更喜欢将分类 从 1 开始标而不是 0 其实怎样标注都不会影响最后的结果 然而对于之前的一个 二元分类问题 我们的数据看起来可能是像这样 对于一个多类分类问题 我们的数据集 或许看起来像这样 我用三种不同的符号来代表三个类别 问题就是 给出三个类型的数据集 这是一个类别中的样本 而这个样本是属于 另一个类别 而这个样本属于第三个类别
我们如何得到一个学习算法来进行分类呢? 我们现在已经知道如何 进行二元分类 可以使用逻辑斯特回归 对于直线或许你也知道 可以将数据集一分为二为正类和负类 用一对多的 分类思想 我们可以 将其用在多类分类问题上 下面将介绍如何进行一对多的分类工作 有时这个方法也被称为"一对余"方法
现在我们有一个训练集 好比左边表示的 有三个类别 我们用三角形表示 y=1 方框表示 y=2 叉叉表示 y=3 我们下面要做的就是 使用一个训练集 将其分成三个二元分类问题 所以我将它分成三个 二元分类问题 我们先从用三角形代表的类别1开始 实际上我们可以创建一个 新的"伪"训练集 类型2和类型3 定为负类 类型1 设定为正类 我们创建一个新的 训练集 如右侧所示的那样 我们要拟合出一个合适的分类器 我们称其为 h 下标 θ 上标(1) (x) 这里的三角形是正样本 而圆形代表负样本 可以这样想 设置三角形的值为1 圆形的值为0
下面我们来训练一个标准的逻辑回归分类器 这样我们就得到一个正边界 对吧? 这里上标(1)表示类别1 我们可以像这样对三角形类别这么做 下面 我们将为类别2做同样的工作 取这些方块样本 然后将这些方块 作为正样本 设其它的为三角形和叉形类别为负样本 这样我们找到第二个合适的逻辑回归分类器 我们称为 h 下标 θ 上标(2) (x) 其中上标(2)表示 是类别2 所以我们做的就是 把方块类当做正样本 我们可能便会得到这样的一个分类器 最后 同样地 我们对第三个类别采用同样的方法 并找出 第三个分类器 h 下标 θ 上标(3) (x) 或许这么做 可以给出一个像这样的 判别边界 或者说分类器 能这样分开正负样本 总而言之 我们已经拟合出三个分类器 对于 i 等于1、2、3 我们都找到了一个分类器 h 上标(i) 下标θ 括号 x 通过这样来尝试 估计出 给出 x 和先验 θ 时 y的值等于 i 的概率 对么? 在一开始 对于第一个在这里的 分类器 完成了对三角形的识别 把三角形当做是正类别 所以 h(1) 实际上是在计算 给定x 以 θ 为参数时 y的值为1的 概率是多少 概率是多少 同样地 这个也是这么处理 矩形类型当做一个正类别 同样地 可以计算出 y=2 的概率和其它的概率值来 现在我们便有了三个分类器 且每个分类器都作为其中一种情况进行训练
总之 我们已经把要做的做完了 现在要做的就是训练这个 逻辑回归分类器 h(i) 逻辑回归分类器 h(i) 其中 i 对应每一个可能的 y=i 最后 为了做出预测 我们给出输入一个新的 x 值 用这个做预测 我们要做的 就是 在我们三个分类器 里面输入 x 然后 我们选择一个让 h 最大的 i 你现在知道了 基本的挑选分类器的方法 选择出哪一个分类器是 可信度最高效果最好的 那么就可认为得到一个正确的分类 无论i值是多少 我们都有最高的概率值 我们预测 y 就是那个值
这就是多类别分类问题 以及一对多的方法 通过这个小方法 你现在也可以将 逻辑回归分类器 用在多类分类的问题上
Regularization正则化-防止过度拟合
Solving the Problem of Overfitting解决过度拟合问题
The Problem of Overfitting过度拟合问题
Machine learning models need to generalize well to new examples that the model has not seen in practice. In this module, we introduce regularization, which helps prevent models from overfitting the training data.
到现在为止 你已经见识了 几种不同的学习算法 包括线性回归和逻辑回归 它们能够有效地解决许多问题 但是当将它们应用到 某些特定的机器学习应用时 会遇到过度拟合(over-fitting)的问题 可能会导致它们效果很差 在这段视频中 我将为你解释 什么是过度拟合问题 并且 在此之后接下来的几个视频中 我们将谈论一种 称为正则化(regularization)的技术 它可以改善或者 减少过度拟合问题 以使学习算法更好实现
那么什么是过度拟合呢? 让我们继续使用 那个用线性回归 来预测房价的例子 我们通过建立 以住房面积为自变量的函数来预测房价 我们可以 对该数据做线性回归 如果这么做 我们也许能够获得 拟合数据的这样一条直线 但是 这不是一个很好的模型 我们看看这些数据 很明显 随着房子面积增大 住房价格的变化趋于稳定 或者越往右越平缓 因此该算法 没有很好拟合训练数据 我们把这个问题称为欠拟合(underfitting) 这个问题的另一个术语叫做 高偏差(bias) 这两种说法大致相似 意思是它只是没有很好地拟合训练数据 这个词是 过去传下来的一个专业名词 它的意思是 如果拟合一条直线 到训练数据 就好像算法 有一个很强的偏见 或者说非常大的偏差 因为该算法认为房子价格与面积仅仅线性相关 尽管与该数据的事实相反 尽管相反的证据 被事前定义为 偏差 它还是接近于 拟合一条直线 而此法最终导致拟合数据效果很差 我们现在可以在中间 加入一个二次项 在这组数据中 我们用二次函数来拟合它 然后可以拟合出一条曲线 事实证明这个拟合效果很好 另一个极端情况是 如果我们拟合一个四次多项式 因此在这里我们有五个参数 θ0到θ4 这样我们可以拟合一条曲线 通过我们的五个训练样本 你可以得到看上去如此的一条曲线 一方面 似乎 对训练数据 做了一个很好的拟合 因为这条曲线通过了所有的训练实例 但是 这仍然是一条扭曲的曲线 对吧? 它不停上下波动 因此事实上 我们并不认为它是一个预测房价的好模型 所以 这个问题我们把他叫做 过度拟合或过拟合(overfitting) 另一个描述该问题的术语是 高方差(variance) 高方差是另一个 历史上的叫法 但是 从第一印象上来说 如果我们拟合一个 高阶多项式 那么 这个函数能很好的拟合训练集 能拟合几乎所有的 训练数据 这就面临可能函数太过庞大的问题 变量太多 同时如果我们没有足够的数据 去约束这个变量过多的模型 那么这就是过度拟合 在两者之间的情况 叫"刚好合适" 这并不是一个真正的名词 我只是把它写在这里 这个二次多项式 二次函数 可以说是恰好拟合这些数据
概括地说 过度拟合的问题 将会在变量过多的时候 发生 这种时候训练出的方程总能很好的拟合训练数据 所以 你的代价函数 实际上可能非常接近于0 或者 就是0 但是 这样的曲线 它千方百计的拟合于训练数据 这样导致 它无法泛化到 新的数据样本中 以至于无法预测新样本价格 在这里 术语"泛化" 指的是一个假设模型能够应用到新样本的能力 新样本数据是 没有出现在训练集中的房子
在这张幻灯片上 我们看到了 线性回归情况下的过拟合 类似的方法同样可以应用到逻辑回归 这里是一个以x1与x2为变量的 逻辑回归 我们可以做的就是 用这样一个简单的假设模型 来拟合逻辑回归 和以前一样 字母g代表S型函数 如果这样做 你会得到一个假设模型 这个假设模型是一条直线 它直接分开了正样本和负样本 但这个模型并不能够很好的拟合数据 因此 这又是一个欠拟合的例子 或者说假设模型具有高偏差 相比之下 如果 如果再加入一些变量 比如这些二次项 那么你可以得到一个判定边界 像这样 这样就很好的拟合了数据 这很可能 是训练集的最好拟合结果 最后 在另一种极端情况下 如果你用高阶多项式来拟合数据 你加入了很多 高阶项 那么逻辑回归可能发生自身扭曲 它千方百计的 形成这样一个 判定边界 来拟合你的训练数据 以至于成为一条扭曲的曲线 使其能够拟合每一个训练集中的样本 而且 如果x1和x2 能够预测 癌症 你知道 癌症是一种恶性肿瘤 同时肿瘤也可能是良性 确实 这个假设模型不是一个很好的预测 因此 这又是一个过拟合例子 是一个 有高方差的假设模型 并且不能够很好泛化到新样本
在今后课程中 我们会讲到调试和诊断 诊断出导致学习算法故障的东西 我们告诉你如何用 专门的工具来识别 过拟合 和可能发生的欠拟合 但是 现在 让我们谈谈 过拟合 的问题 我们怎么样解决呢 在前面的例子中 当我们使用一维或二维数据时 我们可以通过绘出假设模型的图像来研究问题所在 再选择合适的多项式来拟合数据 因此 以之前的房屋价格为例 我们可以 绘制假设模型的图像 就能看到 模型的曲线 非常扭曲并通过所有样本房价 我们可以通过绘制这样的图形 来选择合适的多项式阶次 因此绘制假设模型曲线 可以作为决定多项式阶次 的一种方法 但是这并不是总是有用的 而且事实上更多的时候我们 会遇到有很多变量的假设模型 并且 这不仅仅是选择多项式阶次的问题 事实上 当我们 有这么多的特征变量 这也使得绘图变得更难 并且 更难使其可视化 因此并不能通过这种方法决定保留哪些特征变量 具体地说 如果我们试图 预测房价 同时又拥有这么多特征变量 这些变量看上去都很有用 但是 如果我们有过多的变量 同时 只有非常少的训练数据 就会出现过度拟合的问题 为了解决过度拟合 有两个办法来解决问题
第一个办法是要尽量减少选取变量的数量 具体而言 我们可以人工检查 变量的条目 并以此决定哪些变量更为重要 然后 决定保留哪些特征变量 哪些应该舍弃 在今后的课程中 我们会提到模型选择算法 这种算法是为了自动选择 采用哪些特征变量 自动舍弃不需要的变量 这种减少特征变量 的做法是非常有效的 并且可以减少过拟合的发生 当我们今后讲到模型选择时 我们将深入探讨这个问题 但是其缺点是 舍弃一部分特征变量 你也舍弃了 问题中的一些信息 例如 也许所有的 特征变量 对于预测房价都是有用的 我们实际上并不想 舍弃一些信息 或者舍弃这些特征变量
第二个选择 我们将在接下来的视频中讨论 就是正则化 正则化中我们将保留 所有的特征变量 但是数量级 或参数数值的大小 θ(j) 这个方法非常有效 当我们有很多特征变量时 其中每一个变量 都能对预测产生一点影响 y的值 正如我们在房价的例子中看到的那样 在那里我们可以有很多特征变量 其中每一个变量 都是有用的 因此我们不希望把它们删掉 这就导致了 正则化概念的发生 我知道 这些东西你们现在可能还听不懂
但是在接下来的视频中 我们将开始详细讲述 怎样应用正则化和什么叫做正则化均值 然后我们将开始 讲解怎样使用正则化 怎样使学习算法正常工作 并避免过拟合
Cost Function代价函数
在这段视频中 传达给你一个直观的感受 告诉你正规化是如何进行的 而且 我们还要写出 我们使用正规化时 需要使用的代价函数 根据我们幻灯片上的 这些例子 我想我可以给你一个直观的感受 但是 一个更好的 让你自己去理解正规化 如何工作的方法是 你自己亲自去实现它 并且看看它是如何工作的 如果在这节课后 你进行一些适当的练习 你就有机会亲自体验一下 正规化到底是怎么工作的
那么 这里就是一些直观解释 在前面的视频中 我们看到了 如果说我们要 用一个二次函数来 拟合这些数据 它给了我们一个对数据很好的拟合 然而 如果我们 用一个更高次的 多项式去拟合 我们最终 可能得到一个曲线 能非常好地拟合训练集 但是 这真的不是一个好的结果 它过度拟合了数据 因此 一般性并不是很好 让我们考虑下面的假设 我们想要加上惩罚项 从而使 参数 θ3 和 θ4 足够的小 这里我的意思就是 这是我们的优化目标 或者客观的说 这就是我们需要 优化的问题 我们需要尽量减少 代价函数的均方误差 对于这个函数 我们对它进行一些 添加一些项 加上 1000 乘以 θ3 的平方 再加上 1000 乘以 θ4 的平方 1000 只是我随便写的某个较大的数字而已 现在 如果我们要 最小化这个函数 为了使这个 新的代价函数最小化 我们要让 θ3 和 θ4 尽可能小 对吧? 因为 如果你有 1000 乘以 θ3 这个 新的代价函数将会是很大的 所以 当我们最小化 这个新的函数时 我们将使 θ3 的值 接近于0 θ4 的值也接近于0 就像我们忽略了 这两个值一样 如果我们做到这一点 如果 θ3 和 θ4 接近0 那么我们 将得到一个近似的二次函数 所以 我们最终 恰当地拟合了数据 你知道 二次函数加上一些项 这些很小的项 贡献很小 因为 θ3 θ4 它们是非常接近于0的 所以 我们最终得到了 实际上 很好的一个二次函数 因为这是一个 更好的假设 在这个具体的例子中 我们看到了 惩罚这两个 大的参数值的效果 更一般地 这里给出了正规化背后的思路
这种思路就是 如果我们 的参数值 对应一个较小值的话 就是说 参数值比较小 那么往往我们会得到一个 形式更简单的假设 所以 我们最后一个例子中 我们惩罚的只是 θ3 和 θ4 使这两个 值均接近于零 我们得到了一个更简单的假设 也即这个假设大抵上是一个二次函数 但更一般地说 如果我们就像这样 惩罚的其它参数 通常我们 可以把它们都想成是 得到一个更简单的假设 因为你知道 当这些参数越接近这个例子时 假设的结果越接近 一个二次函数 但更一般地 可以表明 这些参数的值越小 通常对应于越光滑的函数 也就是更加简单的函数 因此 就不易发生过拟合的问题 我知道 为什么要所有的部分参数变小的这些原因 为什么越小的参数对应于一个简单的假设 我知道这些原因 对你来说现在不一定完全理解 但现在解释起来确实比较困难 除非你自己实现一下 自己亲自运行了这部分 但是我希望 这个例子中 使 θ3 和 θ4 很小 并且这样做 能给我们一个更加简单的 假设 我希望这个例子 有助于解释原因 至少给了 我们一些直观感受 为什么这应该是这样的 来让我们看看具体的例子 对于房屋价格预测我们 可能有上百种特征 我们谈到了一些可能的特征 比如说 x1 是房屋的尺寸 x2 是卧室的数目 x3 是房屋的层数等等 那么我们可能就有一百个特征 跟前面的多项式例子不同 我们是不知道的 对吧 我们不知道 θ3 θ4 是高阶多项式的项 所以 如果我们有一个袋子 如果我们有一百个特征 在这个袋子里 我们是很难 提前选出那些 关联度更小的特征的 也就是说如果我们有一百或一百零一个参数 我们不知道 挑选哪一个 我们并不知道 如何选择参数 如何缩小参数的数目 因此在正规化里 我们要做的事情 就是把我们的 代价函数 这里就是线性回归的代价函数 接下来我度量 来修改这个代价函数 从而缩小 我所有的参数值 因为你知道 我不知道是哪个 哪一个或两个要去缩小 所以我就修改我的 代价函数 在这后面添加一项 就像我们在方括号里的这项 当我添加一个额外的 正则化项的时候 我们收缩了每个 参数 并且因此 我们会使 我们所有的参数 θ1 θ2 θ3 直到 θ100 的值变小
顺便说一下 按照惯例来讲 我们从第一个这里开始 所以我实际上没有去惩罚 θ0 因此 θ0 的值是大的 这就是一个约定 从1到 n 的求和 而不是从0到 n 的求和 但其实在实践中 这只会有非常小的差异 无论你是否包括这项 就是 θ0 这项 实际上 结果只有非常小的差异 但是按照惯例 通常情况下我们还是只 从 θ1 到 θ100 进行正规化 这里我们写下来 我们的正规化优化目标 我们的正规化后的代价函数 就是这样的 J(θ) 这个项 右边的这项就是一个正则化项 并且 λ 在这里我们称做正规化参数 λ 要做的就是控制 在两个不同的目标中 的一个平衡关系 第一个目标 第一个需要抓住的目标 就是我们想要训练 使假设更好地拟合训练数据 我们希望假设能够很好的适应训练集 而第二个目标是 我们想要保持参数值较小 这就是第二项的目标 通过正则化目标函数 这就是λ 这个正则化 参数需要控制的 它会这两者之间的平衡 目标就是平衡拟合训练的目的 和 保持参数值较小的目的 从而来保持假设的形式相对简单 来避免过度的拟合 对于我们的房屋价格预测来说 这个例子 尽管我们之前有 我们已经用非常高的 高阶多项式来拟合 我们将会 得到一个 非常弯曲和复杂的曲线函数 就像这个 如果你还是用高阶多项式拟合 就是用这里所有的多项式特征来拟合的话 但现在我们不这样了 你只需要确保使用了 正规化目标的方法 那么你就可以得到 实际上是一个曲线 但这个曲线不是 一个真正的二次函数 而是更加的流畅和简单 也许就像这条紫红色的曲线一样 那么 你知道的 这样就得到了对于这个数据更好的假设 再一次说明下 我了解这部分有点难以明白 为什么加上 参数的影响可以具有 这种效果 但如果你 亲自实现了正规化 你将能够看到 这种影响的最直观的感受
在正规化线性回归中 如果 正规化参数值 被设定为非常大 那么将会发生什么呢? 我们将会非常大地惩罚 参数θ1 θ2 θ3 θ4 也就是说 如果我们的假设是底下的这个 如果我们最终惩罚 θ1 θ2 θ3 θ4 在一个非常大的程度 那么我们 会使所有这些参数接近于零的 对不对? θ1 将接近零 θ2 将接近零 θ3 和 θ4 最终也会接近于零 如果我们这么做 那么就是 我们的假设中 相当于去掉了这些项 并且使 我们只是留下了一个简单的假设 这个假设只能表明 那就是 房屋价格 就等于 θ0 的值 那就是类似于拟合了 一条水平直线 对于数据来说 这就是一个 欠拟合 (underfitting) 这种情况下这一假设 它是条失败的直线 对于训练集来说 这只是一条平滑直线 它没有任何趋势 它不会去趋向大部分训练样本的任何值 这句话的另一种方式来表达就是 这种假设有 过于强烈的"偏见" 或者 过高的偏差 (bais) 认为预测的价格只是 等于 θ0 并且 尽管我们的数据集 选择去拟合一条 扁平的直线 仅仅是一条 扁平的水平线 我画得不好 对于数据来说 这只是一条水平线 因此 为了使正则化运作良好 我们应当注意一些方面 应该去选择一个不错的 正则化参数 λ 并且当我们以后讲到多重选择时 在后面的课程中 我们将讨论 一种方法 一系列的方法来自动选择 正则化参数 λ 所以 这就是高度正则化的思路 回顾一下代价函数 为了使用正则化 在接下来的两段视频中 让我们 把这些概念 应用到 到线性回归和 逻辑回归中去 那么我们就可以让他们 避免过度拟合了
Regularized Linear Regression线性回归正则化
对于线性回归的求解 我们之前 推导了两种学习算法 一种基于梯度下降 一种基于正规方程 在这段视频中 我们将继续学习 这两个算法 并把它们推广 到正则化线性回归中去
这是我们上节课推导出的 正则化线性回归的 优化目标 前面的第一部分是 一般线性回归的目标函数 而现在我们有这个额外的 正则化项 其中 λ 是正则化参数 我们想找到参数 θ 能最小化代价函数 即这个正则化代价函数 J(θ) 之前 我们使用 梯度下降求解原来 没有正则项的代价函数 我们用 下面的算法求解常规的 没有正则项的线性回归 我们会如此反复更新 参数 θj 其中 j=0, 1, 2...n 让我 照这个把 j=0 即 θ0 的情况单独写出来 我只是把 θ0 的更新 分离出来 剩下的这些参数θ1, θ2 到θn的更新 作为另一部分 所以 这样做其实没有什么变化 对吧? 这只是把 θ0 的更新 这只是把 θ0 的更新 和 θ1 θ2 到 θn 的更新分离开来 和 θ1 θ2 到 θn 的更新分离开来 我这样做的原因是 你可能还记得 对于正则化的线性回归 我们惩罚参数θ1 θ2...一直到 θn 但是我们不惩罚θ0 所以 当我们修改这个 正则化线性回归的算法时 我们将对 θ0 的方式将有所不同 具体地说 如果我们 要对这个算法进行 修改 并用它 求解正则化的目标函数 我们 需要做的是 把下边的这一项做如下的修改 我们要在这一项上添加 除以 m 再乘以 θj 如果这样做的话 那么你就有了 用于最小化 正则化代价函数 J(θ) 的梯度下降算法 我不打算用 微积分来证明这一点 但如果你看这一项 方括号里的这一项 如果你知道微积分 应该不难证明它是 J(θ) 对 θj 的偏导数 这里的 J(θ) 是用的新定义的形式 它的定义中 包含正则化项 而另一项 上面的这一项 我用青色的方框 圈出来的这一项 这也一个是偏导数 是 J(θ)对 θ0 的偏导数 如果你仔细看 θj 的更新 你会发现一些 有趣的东西 具体来说 θj 的每次更新 都是 θj 自己减去 α 乘以原来的无正则项 然后还有这另外的一项 这一项的大小也取决于 θj 所以 如果你 把所有这些 取决于 θj 的合在一起的话 可以证明 这个更新 可以等价地写为 如下的形式 具体来讲 上面的 θj 对应下面的 θj 乘以括号里的1 而这一项是 λ 除以 m 还有一个α 把它们合在一起 所以你最终得到 α 乘以 λ 再除以 m 然后合在一起 乘以 θj 而这一项 1 减去 α 乘以 λ 除以 m 这一项很有意思 具体来说 这一项 1 减去 α 乘以 λ 除以 m 这一项的值 通常是一个具体的实数 而且小于1 对吧?由于 α 乘以 λ 除以 m 通常情况下是正的 如果你的学习速率小 而 m 很大的话 (1 - αλ/m) 这一项通常是很小的 所以这里的一项 一般来说将是一个比1小一点点的值 所以我们可以把它想成 一个像0.99一样的数字 所以 对 θj 更新的结果 我们可以看作是 被替换为 θj 的0.99倍 也就是 θj 乘以0.99 把 θj 向 0 压缩了一点点 所以这使得 θj 小了一点 更正式地说 θj 的平方范数 更小了 另外 这一项后边的第二项 这实际上 与我们原来的 梯度下降更新完全一样 跟我们加入了正则项之前一样 好的 现在你应该对这个 梯度下降的更新没有疑问了 当我们使用正则化线性回归时 我们需要做的就是 在每一个被正规化的参数 θj 上 乘以了一个 比1小一点点的数字 也就是把参数压缩了一点 然后 我们执行跟以前一样的更新 当然 这仅仅是 从直观上认识 这个更新在做什么 从数学上讲 它就是带有正则化项的 J(θ) 的梯度下降算法 我们在之前的幻灯片 给出了定义 梯度下降只是 我们拟合线性回归模型的两种算法 的其中一个 第二种算法是 使用正规方程 我们的做法 是建立这个 设计矩阵 X 其中每一行 对应于一个单独的训练样本 然后创建了一个向量 y 向量 y 是一个 m 维的向量 m 维的向量 包含了所有训练集里的标签 所以 X 是一个 m × (n+1) 维矩阵 y 是一个 m 维向量 y 是一个 m 维向量 为了最小化代价函数 J 我们发现 一个办法就是 一个办法就是 让 θ 等于这个式子 即 X 的转置乘以 X 再对结果取逆 再乘以 X 的转置乘以Y 我在这里留点空间 等下再填满 这个 θ 的值 其实就是最小化 代价函数 J(θ) 的θ值 这时的代价函数J(θ)没有正则项 现在如果我们用了是正则化 我们想要得到最小值 我们想要得到最小值 我们来看看应该怎么得到 我们来看看应该怎么得到 推导的方法是 取 J 关于各个参数的偏导数 并令它们 等于0 然后做些 数学推导 你可以 得到这样的一个式子 它使得代价函数最小 具体的说 如果你 使用正则化 那么公式要做如下改变 括号里结尾添这样一个矩阵 0 1 1 1 等等 直到最后一行 所以这个东西在这里是 一个矩阵 它的左上角的元素是0 其余对角线元素都是1 剩下的元素也都是 0 我画的比较随意 可以举一个例子 如果 n 等于2 那么这个矩阵 将是一个3 × 3 矩阵 更一般地情况 该矩阵是 一个 (n+1) × (n+1) 维的矩阵 一个 (n+1) × (n+1) 维的矩阵 因此 n 等于2时 矩阵看起来会像这样 左上角是0 然后其他对角线上是1 其余部分都是0 同样地 我不打算对这些作数学推导 坦白说这有点费时耗力 但可以证明 如果你采用新定义的 J(θ) 如果你采用新定义的 J(θ) 包含正则项的目标函数 那么这个计算 θ 的式子 能使你的 J(θ) 达到全局最小值 所以最后 我想快速地谈一下不可逆性的问题 这部分是比较高阶的内容 所以这一部分还是作为选学 你可以跳过去 或者你也可以听听 如果听不懂的话 也没有关系 之前当我讲正规方程的时候 我们也有一段选学视频 讲不可逆的问题 所以这是另一个选学内容 可以作为上次视频的补充 可以作为上次视频的补充 现在考虑 m 即样本总数 小与或等于特征数量 n 如果你的样本数量 比特征数量小的话 那么这个矩阵 X 转置乘以 X 将是 不可逆或奇异的(singluar) 或者用另一种说法是 这个矩阵是 退化(degenerate)的 如果你在 Octave 里运行它 无论如何 你用函数 pinv 取伪逆矩阵 这样计算 理论上方法是正确的 但实际上 你不会得到一个很好的假设 尽管 Ocatve 会 用 pinv 函数 给你一个数值解 看起来还不错 但是 如果你是在一个不同的编程语言中 如果在 Octave 中 你用 inv 来取常规逆 你用 inv 来取常规逆 也就是我们要对 X 转置乘以 X 取常规逆 然后在这样的情况下 你会发现 X 转置乘以 X 是奇异的 是不可逆的 即使你在不同的 编程语言里计算 并使用一些 线性代数库 试图计算这个矩阵的逆矩阵 都是不可行的 因为这个矩阵是不可逆的或奇异的 幸运的是 正规化也 为我们解决了这个问题 具体地说 只要正则参数是严格大于0的 实际上 可以 证明该矩阵 X 转置 乘以 X 加上 λ 乘以 这里这个矩阵 可以证明 这个矩阵将不是奇异的 即该矩阵将是可逆的 因此 使用正则化还可以 照顾一些 X 转置乘以 X 不可逆的问题 照顾一些 X 转置乘以 X 不可逆的问题 好的 你现在知道了如何实现正则化线性回归 利用它 你就可以 避免过度拟合 即使你在一个相对较小的训练集里有很多特征 这应该可以让你 在很多问题上更好地运用线性回归 在接下来的视频中 我们将 把这种正则化的想法应用到逻辑回归 这样你就可以 让逻辑回归也避免过度拟合 并让它表现的更好
Regularized Logistic Regression逻辑回归正则化
For logistic regression, we previously talked about two types of optimization algorithms. We talked about how to use gradient descent to optimize as cost function J of theta. And we also talked about advanced optimization methods. Ones that require that you provide a way to compute your cost function J of theta and that you provide a way to compute the derivatives. In this video, we'll show how you can adapt both of those techniques, both gradient descent and the more advanced optimization techniques in order to have them work for regularized logistic regression. So, here's the idea. We saw earlier that Logistic Regression can also be prone to overfitting if you fit it with a very, sort of, high order polynomial features like this. Where G is the sigmoid function and in particular you end up with a hypothesis, you know, whose decision bound to be just sort of an overly complex and extremely contortive function that really isn't such a great hypothesis for this training set, and more generally if you have logistic regression with a lot of features. Not necessarily polynomial ones, but just with a lot of features you can end up with overfitting. This was our cost function for logistic regression. And if we want to modify it to use regularization, all we need to do is add to it the following term plus londer over 2M, sum from J equals 1, and as usual sum from J equals 1. Rather than the sum from J equals 0, of theta J squared. And this has to effect therefore, of penalizing the parameters theta 1 theta 2 and so on up to theta N from being too large. And if you do this, then it will the have the effect that even though you're fitting a very high order polynomial with a lot of parameters. So long as you apply regularization and keep the parameters small you're more likely to get a decision boundary. You know, that maybe looks more like this. It looks more reasonable for separating the positive and the negative examples. So, when using regularization even when you have a lot of features, the regularization can help take care of the overfitting problem. How do we actually implement this? Well, for the original gradient descent algorithm, this was the update we had. We will repeatedly perform the following update to theta J. This slide looks a lot like the previous one for linear regression. But what I'm going to do is write the update for theta 0 separately. So, the first line is for update for theta 0 and a second line is now my update for theta 1 up to theta N. Because I'm going to treat theta 0 separately. And in order to modify this algorithm, to use a regularized cos function, all I need to do is pretty similar to what we did for linear regression is actually to just modify this second update rule as follows. And, once again, this, you know, cosmetically looks identical what we had for linear regression. But of course is not the same algorithm as we had, because now the hypothesis is defined using this. So this is not the same algorithm as regularized linear regression. Because the hypothesis is different. Even though this update that I wrote down. It actually looks cosmetically the same as what we had earlier. We're working out gradient descent for regularized linear regression. And of course, just to wrap up this discussion, this term here in the square brackets, so this term here, this term is, of course, the new partial derivative for respect of theta J of the new cost function J of theta. Where J of theta here is the cost function we defined on a previous slide that does use regularization. So, that's gradient descent for regularized linear regression. Let's talk about how to get regularized linear regression to work using the more advanced optimization methods. And just to remind you for those methods what we needed to do was to define the function that's called the cost function, that takes us input the parameter vector theta and once again in the equations we've been writing here we used 0 index vectors. So we had theta 0 up to theta N. But because Octave indexes the vectors starting from 1. Theta 0 is written in Octave as theta 1. Theta 1 is written in Octave as theta 2, and so on down to theta N plus 1. And what we needed to do was provide a function. Let's provide a function called cost function that we would then pass in to what we have, what we saw earlier. We will use the fminunc and then you know at cost function, and so on, right. But the F min, u and c was the F min unconstrained and this will work with fminunc was what will take the cost function and minimize it for us. So the two main things that the cost function needed to return were first J-val. And for that, we need to write code to compute the cost function J of theta. Now, when we're using regularized logistic regression, of course the cost function j of theta changes and, in particular, now a cost function needs to include this additional regularization term at the end as well. So, when you compute j of theta be sure to include that term at the end. And then, the other thing that this cost function thing needs to derive with a gradient. So gradient one needs to be set to the partial derivative of J of theta with respect to theta zero, gradient two needs to be set to that, and so on. Once again, the index is off by one. Right, because of the indexing from one Octave users. And looking at these terms. This term over here. We actually worked this out on a previous slide is actually equal to this. It doesn't change. Because the derivative for theta zero doesn't change. Compared to the version without regularization. And the other terms do change. And in particular the derivative respect to theta one. We worked this out on the previous slide as well. Is equal to, you know, the original term and then minus londer M times theta 1. Just so we make sure we pass this correctly. And we can add parentheses here. Right, so the summation doesn't extend. And similarly, you know, this other term here looks like this, with this additional term that we had on the previous slide, that corresponds to the gradient from their regularization objective. So if you implement this cost function and pass this into fminunc or to one of those advanced optimization techniques, that will minimize the new regularized cost function J of theta. And the parameters you get out will be the ones that correspond to logistic regression with regularization. So, now you know how to implement regularized logistic regression. When I walk around Silicon Valley, I live here in Silicon Valley, there are a lot of engineers that are frankly, making a ton of money for their companies using machine learning algorithms. And I know we've only been, you know, studying this stuff for a little while. But if you understand linear regression, the advanced optimization algorithms and regularization, by now, frankly, you probably know quite a lot more machine learning than many, certainly now, but you probably know quite a lot more machine learning right now than frankly, many of the Silicon Valley engineers out there having very successful careers. You know, making tons of money for the companies. Or building products using machine learning algorithms. So, congratulations. You've actually come a long ways. And you can actually, you actually know enough to apply this stuff and get to work for many problems. So congratulations for that. But of course, there's still a lot more that we want to teach you, and in the next set of videos after this, we'll start to talk about a very powerful cause of non-linear classifier. So whereas linear regression, logistic regression, you know, you can form polynomial terms, but it turns out that there are much more powerful nonlinear quantifiers that can then sort of polynomial regression. And in the next set of videos after this one, I'll start telling you about them. So that you have even more powerful learning algorithms than you have now to apply to different problems.