wordpress兼容html5成品网站seo
news/
2025/9/27 21:03:36/
文章来源:
wordpress兼容html5,成品网站seo,wordpress手机显示图片,免费推广seo策略方法文章目录 1. 机器学习简介1.1 机器学习是什么#xff1f; 2. 机器学习分类2.1 监督学习2.2 无监督学习 3. 初识机器学习3.1 线性回归模型3.2 代价函数3.2.1 代价函数公式3.2.2 理解代价函数 4. 了解梯度下降算法4.1 梯度下降4.2 梯度下降的实现4.3 理解梯度下降4.4 学习率4.5 … 文章目录 1. 机器学习简介1.1 机器学习是什么 2. 机器学习分类2.1 监督学习2.2 无监督学习 3. 初识机器学习3.1 线性回归模型3.2 代价函数3.2.1 代价函数公式3.2.2 理解代价函数 4. 了解梯度下降算法4.1 梯度下降4.2 梯度下降的实现4.3 理解梯度下降4.4 学习率4.5 用于线性回归的梯度下降4.6 运行梯度下降 5. 了解特征5.1 多维特征5.2 向量化5.3 用于多元线性回归的梯度下降法5.4 特征缩放5.5 判断梯度下降是否收敛5.6 如何设置学习率5.7 特征工程5.8 多项式回归 6. 逻辑回归6.1 动机与目的6.2 逻辑回归6.3 决策边界6.4 逻辑回归中的代价函数6.5 简化逻辑回归代价函数6.6 实现梯度下降 7. 过拟合问题与正则化7.1 过拟合7.2 解决过拟合问题7.3 正则化7.4 用于线性回归的正则方法7.5 用于逻辑回归的正则方法 8. 了解深度学习8.1 神经元和大脑8.2 神经网络工作流程8.3 神经网络的结构8.4 神经网络的前向传播8.5 代码实现推理8.6 Tensorflow中数据形式8.7 搭建一个神经网络 9. 前向传播9.1 单个网络层上的前向传播9.2 前向传播的一般实现 10. 强人工智能 AGI11. Tensorflow实现12. 激活函数12.1 sigmoid激活函数的替代方案12.2 选择激活函数 13. 多分类问题13.1 多分类问题概述13.2 Softmax13.3 神经网络的Softmax输出13.4 多标签分类 14. 高级优化14.1 高级优化方法14.2 其他的网络层类型 15. 模型评估与选择15.1 决定下一步做什么15.2 模型评估15.3 模型选择及交叉验证测试集的训练方法 16. 诊断与改进16.1 通过偏差与方差进行诊断16.2 正则化、偏差、方差16.3 制定一个用于性能评估的基准16.4 学习曲线16.5 方差与偏差 17. 机器学习系统开发过程17.1 误差分析过程17.2 添加更多数据17.3 迁移学习17.4 机器学习项目完整周期17.5 倾斜数据集的误差指标17.6 精确率与召回率的权衡 18. 决策树18.1 决策树模型简介18.2 决策树学习过程18.3 纯度18.4 选择拆分信息增益18.5 整合18.6 独热编码One-hot18.7 连续有价值的特征18.8 回归树18.9 使用多个决策树18.10 有放回抽样18.11 随机森林18.12 XGBoost18.13 何时使用决策树 1. 机器学习简介
1.1 机器学习是什么
机器学习是研究计算机模仿人类学习的过程利用新的数据改善自身的性能是人工智能的核心。
机器学习人工智能深度学习之间的关系 机器学习是实现人工智能的一种方法深度学习是实现机器学习的一种技术。概念包含关系上人工智能机器学习深度学习。
机器学习很常见如谷歌搜索搜出的网站排序算法、邮箱的垃圾站无监督。
任务T性能度量P经验E 机器学习主要包括监督学习和无监督学习另外也包括强化学习Reinforcement Learning和推荐系统Recommender Systems。 2. 机器学习分类
2.1 监督学习
监督学习Supervised Learning
回归问题和分类问题。 简单的房价预测回归问题 回归想要预测连续的数值输出在这里也就是价格价格能够进行很细的划分因此价格是一个离散值不同的房间面积Size都会对应一个价格Price。 回归个人理解给出一定的数据集然后这些数据集可以构建出一个函数模型通过构建出来的函数模型可以带入新的自变量来得出自己想要的结果。 肿瘤是否恶性的判断分类问题 处理多种甚至无限种特征给肿瘤分类。预测的值只有少数的离散值所以这个是分类问题。 分类问题个人理解给定一定的数据集每个数据都标明不同的分类通过数据集构建出一个模型将新的自变量带入可以得到一个新的结果该结果是类别中的一种结果是非连续的。
2.2 无监督学习
无监督学习Unsupervised Learning
不同于监督学习的数据无监督学习的数据没有告诉学习算法“正确答案”就是一个普通的数据集无监督学习算法可以把这些数据集分成两个不同的簇聚类算法。 录音声音分离 通过Octave语言可以很简单的实现 3. 初识机器学习
3.1 线性回归模型
将一条直线拟合到数据中线性回归(Linear regression)。 x x x输入变量、特征、输入特征 y y y输出变量、目标变量 m m m指代训练样本的总数 ( x , y ) (x,y) (x,y)一个训练实例 x x x y y y ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i))表示特定训练示例第 i i i个。注意这里的右上标不是次方而是代表训练集的索引。 f f f函数称为模型获取一个新的输入 x x x输出并估计或者预测 y ^ \hat{y} y^称为y-hat是对 y y y的估计或预测当符号只为 y y y时是指目标是训练集中实际的真实的值。相反y-hat是一个估计值它可能是也可能不是实际的真实值。
关键问题是如何表示函数 f f\, f换句话说 f f\, f的数学公式是什么
现在我们坚持 f f\, f是一条直线
函数可以写为 f w , b ( x ) w x b f_{w,b}(x)wxb fw,b(x)wxb这样我们就要去确定 w b w\;b\, wb的值这将决定基于输入特征 x x\, x的预测 y ^ \hat{y} y^。
或者直接写成 f ( x ) w x b f(x)wxb f(x)wxb
只有一个输入变量 x x\, x的线性回归模型也可以称为单变量线性回归(Univariate linear regression)。 3.2 代价函数
3.2.1 代价函数公式
为了实现线性回归第一个关键步骤是首先定义一个叫做代价函数的东西。
损失函数(Loss function)计算的是一个样本的误差。
损失函数是定义在单个训练样本上的也就是就算一个样本的误差比如我们想要分类就是预测的类别和实际类别的区别是一个样本的哦用L表示。
代价函数(Cost function)也称成本函数整个训练集上所有样本误差的平均。
代价函数是定义在整个训练集上面的也就是所有样本的误差的总和的平均也就是损失函数的总和的平均有没有这个平均其实不会影响最后的参数的求解结果。
目标函数代价函数 正则化项
在 f w , b ( x ) w x b \;f_{w,b}(x)wxb\; fw,b(x)wxb中 w b w \ b\; w b称为模型的参数或称为系数或权重。
在机器学习中模型的参数自己可以调整的变量训练以改进模型。 y ^ ( i ) f w , b ( x ( i ) ) w x ( i ) b \hat{y}^{(i)}f_{w,b}(x^{(i)})wx^{(i)}b y^(i)fw,b(x(i))wx(i)b
目前问题如何找到 w b \;w \ b\; w b的值以便来预测 y ^ \hat{y} y^
首先来看如何衡量一条线与训练数据的拟合程度为此我们将构建一个成本函数。
成本函数采用预测$\ \hat{y} \ 并通过将 并通过将 并通过将\ \hat{y}\ 减去 减去 减去\ y\ 将其与目标 将其与目标 将其与目标\ y\ 进行比较这种差异称为误差然后对误差进行取平方将训练集每个训练示例的误差平方求和最后除以训练示例的数量 进行比较这种差异称为误差然后对误差进行取平方将训练集每个训练示例的误差平方求和最后除以训练示例的数量 进行比较这种差异称为误差然后对误差进行取平方将训练集每个训练示例的误差平方求和最后除以训练示例的数量\ m\ $取得平均平方误差即 1 m ∑ i 1 m ( y ^ ( i ) − y ( i ) ) 2 \frac{1}{m}\sum\limits_{i1}^m(\hat{y}^{(i)}-y^{(i)})^2 m1i1∑m(y^(i)−y(i))2 $\ m\ $为训练示例的数量
按照惯例在机器学习中人们是使用的成本函数实际上是除以2倍的$\ m\ 额外除以 额外除以 额外除以\ 2\ 只是为了是一些我们后面的计算看起来更整洁但是无论是否包括这个除以 只是为了是一些我们后面的计算看起来更整洁但是无论是否包括这个除以 只是为了是一些我们后面的计算看起来更整洁但是无论是否包括这个除以\ 2\ 这个表达式就是 ∗ 成本函数 这个表达式就是*成本函数 这个表达式就是∗成本函数\ J(w,b)\ $也称为平方误差成本函数*我们写做 J ( w , b ) 1 2 m ∑ i 1 m ( y ^ ( i ) − y ( i ) ) 2 J(w,b)\frac{1}{2m}\sum\limits_{i1}^m(\hat{y}^{(i)}-y^{(i)})^2 J(w,b)2m1i1∑m(y^(i)−y(i))2 或 J ( w , b ) 1 2 m ∑ i 1 m ( f w , b ( x ( i ) ) − y ( i ) ) 2 J(w,b)\frac{1}{2m}\sum\limits_{i1}^m(f_{w,b}(x^{(i)})-y^{(i)})^2 J(w,b)2m1i1∑m(fw,b(x(i))−y(i))2 在机器学习中不同的人 对于不同的应用程序会采用不同的成本函数。平方误差成本函数通常用于线性回归。
综上最终我们要找到使成本函数变小的$\ w\ b\ $的值。
3.2.2 理解代价函数
在暂不考虑参数$\ b\ 的情况下令 的情况下令 的情况下令\ b0\ 分析函数 分析函数 分析函数\ f_w(x)\ 和代价函数 和代价函数 和代价函数\ J(w)\ $之间的关系 根据$\ w\ 取值的不同会得到不同的成本函数的图像我们要找到成本函数的尽可能低的点即成本函数取尽可能小值时的 取值的不同会得到不同的成本函数的图像我们要找到成本函数的尽可能低的点即成本函数取尽可能小值时的 取值的不同会得到不同的成本函数的图像我们要找到成本函数的尽可能低的点即成本函数取尽可能小值时的\ w\ $的值如 通常情况下我们有$\ w\ b\ 两个参数所以我们要找到时 两个参数所以我们要找到时 两个参数所以我们要找到时\ J(w,b)\ 最小的 最小的 最小的\ w\ b\ $的值。
下面我们分析函数$\ f_{w,b}(x)\ 和代价函数 和代价函数 和代价函数\ J(w,b)\ 之间的关系不再将 之间的关系不再将 之间的关系不再将\ b\ 的值设置为 的值设置为 的值设置为\ 0\ $ 另一种可视化成本函数的方法不是使用这种3D图取3D图的切面形成等高线图的方法。 4. 了解梯度下降算法
4.1 梯度下降
梯度下降不仅用于线性回归而且用于训练最先进的神经网络模型深度学习模型。
梯度下降是一种可以用来尝试最小化任何函数的算法而且不仅仅是线性回归的成本函数。
事实证明梯度下降适用于更一般的函数包括具有两个以上参数的模型一起使用的其他成本函数。
假设我们有一个成本函数$\ J(w_1,w_2,w_3,…,w_n,b)\ 我们的目标是在 我们的目标是在 我们的目标是在\ w_1\ 到 到 到\ w_n\ 和 和 和\ b\ 上最小化 上最小化 上最小化\ J\ $
我们要做的只是从对$\ w\ 和 和 和\ b\ 的一些初步猜测开始在线性回归中初始值是多少并不重要所以一个常见的选择是将他们都设置为 的一些初步猜测开始在线性回归中初始值是多少并不重要所以一个常见的选择是将他们都设置为 的一些初步猜测开始在线性回归中初始值是多少并不重要所以一个常见的选择是将他们都设置为\ 0\ $例如
我们将设$\ w0\ \ \ \ b0\ $继续每次更改参数$\ w\ 和 和 和\ b\ 的取值来降低 的取值来降低 的取值来降低\ w\ 和 和 和\ b\ 的成本 的成本 的成本\ j\ 直到希望 直到希望 直到希望\ j\ $达到或接近最小值
对于某些可能不是弓形或者吊床形的函数$\ J\ $可能存在不止一个可能的最小值如 个人理解梯度算法有点贪心算法的思想追求局部最优。
每次站到最新的$\ w\ 和 和 和\ b\ 的最优取值的角度选择下一个 的最优取值的角度选择下一个 的最优取值的角度选择下一个\ w\ 和 和 和\ b\ $的最优取值以此找到最优解
4.2 梯度下降的实现
在参数$\ w\ 之后取当前值 之后取当前值 之后取当前值\ w\ $并对其进行少量调整 w w − α ∂ J ( w , b ) ∂ w ww-\alpha\frac{\partial J(w,b)}{\partial w} ww−α∂w∂J(w,b) $\ \alpha\ 学习率 L e a r i n i n g r a t e 学习率 ∗ ∗ 通常 ∗ ∗ 介于 学习率Learining rate学习率**通常**介于 学习率Leariningrate学习率∗∗通常∗∗介于\ 0\ 和 和 和\ 1\ 之间的一个小的正数 之间的一个小的正数 之间的一个小的正数\ \alpha\ 所做的是它控制梯度下降每一次步长的大小。如果 所做的是它控制梯度下降每一次步长的大小。如果 所做的是它控制梯度下降每一次步长的大小。如果\ \alpha\ 非常大则对应于一个非常激进的梯度下降过程即试图在下坡时迈出一大步如果 非常大则对应于一个非常激进的梯度下降过程即试图在下坡时迈出一大步如果 非常大则对应于一个非常激进的梯度下降过程即试图在下坡时迈出一大步如果\ \alpha\ $非常小那么在下坡时将迈出小步下坡。 ∂ J ( w , b ) ∂ w \frac{\partial J(w,b)}{\partial w} ∂w∂J(w,b)代价函数$\ J(w,b)\ 的导数项决定要朝哪个方向迈出结合学习率 的导数项决定要朝哪个方向迈出结合学习率 的导数项决定要朝哪个方向迈出结合学习率\ \alpha\ $也决定了大小。
同时在参数$\ w\ 变化的同时我们也不能忽略了参数 变化的同时我们也不能忽略了参数 变化的同时我们也不能忽略了参数\ b\ $的变化。 b b − α ∂ J ( w , b ) ∂ b bb-\alpha\frac{\partial J(w,b)}{\partial b} bb−α∂b∂J(w,b) 对于梯度下降算法我们将重复这两个对参数$\ w\ 和参数 和参数 和参数\ b\ $的更新步骤知道算法收敛即达到一个局部最小值的点。
对于参数$\ w\ 和参数 和参数 和参数\ b\ $我们要对两个参数进行同时的计算更新。
正确方法用一个中间变量先进行接受然后再赋值 如果不同时进行更新则再计算完参数$\ w\ 并将新的值赋值给参数 并将新的值赋值给参数 并将新的值赋值给参数\ w\ 则会影响对参数 则会影响对参数 则会影响对参数\ b\ $值的计算。
错误做法不同时对参数进行更新 4.3 理解梯度下降 w w − α ∂ J ( w , b ) ∂ w b b − α ∂ J ( w , b ) ∂ b ww-\alpha\frac{\partial J(w,b)}{\partial w}\ \ \ \ \ bb-\alpha\frac{\partial J(w,b)}{\partial b} ww−α∂w∂J(w,b) bb−α∂b∂J(w,b)
对代价函数的导数可以保证参数$\ w\ 和参数 和参数 和参数\ b\ 朝着代价函数 朝着代价函数 朝着代价函数\ J(w,b)\ 的值变小的方向进行变化。而变量 的值变小的方向进行变化。而变量 的值变小的方向进行变化。而变量\ \alpha\ $则决定了每次变化的大小。 4.4 学习率 w w − α ∂ J ( w , b ) ∂ w b b − α ∂ J ( w , b ) ∂ b ww-\alpha\frac{\partial J(w,b)}{\partial w}\ \ \ \ \ bb-\alpha\frac{\partial J(w,b)}{\partial b} ww−α∂w∂J(w,b) bb−α∂b∂J(w,b)
学习率$\ \alpha\ 对实现梯度下降的效率产生巨大的影响。如果学习率 对实现梯度下降的效率产生巨大的影响。如果学习率 对实现梯度下降的效率产生巨大的影响。如果学习率\ \alpha\ $选择的不好下降率甚至可能根本不起作用。
如果学习率太小则每次进行梯度下降的步伐会很小。如果选择了过于小的学习率会降低代价函数的值梯度下降会起作用但是速度非常慢。 如果学习率太大则每次进行梯度下降的步伐会很大可能会超过并且永远不会到达最小值。另一种说法学习率太大肯能无法使代价函数的值收敛甚至会发散。 另一个问题我们可能想知道自己的参数$\ w\ 现在所处的位置是否取得代价函数 现在所处的位置是否取得代价函数 现在所处的位置是否取得代价函数\ J\ $的局部最小值。如果已经到达了最小值是否会继续进行梯度下降。
假设我们有一个成本函数$\ J(w)\ 但是这个成本函数不是平法误差成本函数这个成本函数有两个据不最小值。假设我们经过一些梯度下降步骤后我们的参数 但是这个成本函数不是平法误差成本函数这个成本函数有两个据不最小值。假设我们经过一些梯度下降步骤后我们的参数 但是这个成本函数不是平法误差成本函数这个成本函数有两个据不最小值。假设我们经过一些梯度下降步骤后我们的参数\ w\ 等于 等于 等于\ 5\ 这就是参数 这就是参数 这就是参数\ w\ 当前的值这意味此时我们处于成本函数 当前的值这意味此时我们处于成本函数 当前的值这意味此时我们处于成本函数\ J\ 上的一个局部最小值此时斜率几乎为 上的一个局部最小值此时斜率几乎为 上的一个局部最小值此时斜率几乎为\ 0\ 因此导数项也几乎等于 因此导数项也几乎等于 因此导数项也几乎等于\ 0\ $此时 w w − α ⋅ 0 ww-\alpha·0\ ww−α⋅0 参数$\ w\ 值不再变化即 值不再变化即 值不再变化即\ ww\ 此时则意味着我们已经处于局部最小值梯度下降使 此时则意味着我们已经处于局部最小值梯度下降使 此时则意味着我们已经处于局部最小值梯度下降使\ w\ $保持不变则不会再继续进行梯度下降。 随着梯度下降过程的进行每一次的下降的步长也会自动变化因为这个下降的步长是和导数项也有关系的导数项是不断变化的因此变化的步长是不断变化的。即使学习率是一个固定值变化的步长也是不断变化的。 4.5 用于线性回归的梯度下降
将梯度下降中的导数计算后得出 r e p e a t { w w − α 1 m ∑ i 1 m ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) b b − α 1 m ∑ i 1 m ( f w , b ( x ( i ) ) − y ( i ) ) } s i m u l t a n e o u s u p d a t e repeat \{\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad \\ ww-\alpha\frac1m\sum\limits_{i1}^m(f_{w,b}(x^{(i)})-y^{(i)})x^{(i)}\\bb-\alpha\frac1m\sum\limits_{i1}^m(f_{w,b}(x^{(i)})-y^{(i)})\\ \}simultaneous\ \ update\qquad\qquad\qquad\qquad repeat{ww−αm1i1∑m(fw,b(x(i))−y(i))x(i)bb−αm1i1∑m(fw,b(x(i))−y(i))}simultaneous update
梯度下降可以得到局部最小值而不是全局的最小值即可以得到极小值。
4.6 运行梯度下降 5. 了解特征
5.1 多维特征
在预测房价的例子中引入房间数量房龄等特征形成了多维特征这些特征共同作为变量。 $x_j\ 表示第 表示第 表示第\ j\ $列
$\ n\ $表示特征个数
$\ \vec{x}^{(i)}\ 表示第 表示第 表示第\ i\ $行的向量组
$\ \vec{x}^{i}_j\ 表示第 表示第 表示第\ i\ 行第 行第 行第\ j\ $列
多维向量对应的模型
我们之前定义的模型$\ f_{w,b} wxb\ \ x\ $是单个特征
而现在的多维向量定义模型为$\ f_{w,b} w_1x_1w_2x_2w_3x_3w_4x_4…w_nx_nb \ $ w ⃗ [ w 1 , w 2 , w 3 , . . . , w n ] \vec{w} [w_1,w_2,w_3,...,w_n] w [w1,w2,w3,...,wn] x ⃗ [ x 1 , x 2 , x 3 , . . . x n ] \vec{x} [x_1,x_2,x_3,...x_n] x [x1,x2,x3,...xn]
同时我们可以将这个式子简写为 f w ⃗ , b ( x ⃗ ) w ⃗ ⋅ x ⃗ b w 1 x 1 w 2 x 2 w 3 x 3 w 4 x 4 . . . w n x n b \ f_{\vec{w},b}(\vec{x}) \vec{w}·\vec{x}b w_1x_1w_2x_2w_3x_3w_4x_4...w_nx_nb fw ,b(x )w ⋅x bw1x1w2x2w3x3w4x4...wnxnb
这里为向量的点积我们将这个算法称为多元线性回归multiple linear regression。
5.2 向量化
当我们学习算法时使用向量化都会使我们的代码更短也使它运行更有效。 numpy中的*dot()*方法实现了向量的点积运算内积。
使用向量化的优点
代码更简洁运行速度更高 没有进行向量化时代码是串行。进行了向量化后多个计算是并行进行的。 5.3 用于多元线性回归的梯度下降法
我们可以将模型定义为$\ f_{\vec{w},b}(\vec{x})\vec{w}·\vec{x}b \ $
成本函数可以定义为$\ J(w_1,w_2,…,w_n,b)J(\vec{w},b) \ $
梯度下降算法 w j w j − α ∂ ∂ w j J ( w 1 , . . . , w n , b ) w_jw_j-\alpha\frac{\partial}{\partial{w_j}}J(w_1,...,w_n,b) wjwj−α∂wj∂J(w1,...,wn,b)
$\ bb-\alpha\frac{\partial}{\partial{b}}J(w_1,…,w_n,b) \ $
也可以写为 w j w j − α ∂ ∂ w j J ( w ⃗ , b ) w_jw_j-\alpha\frac{\partial}{\partial{w_j}}J(\vec{w},b) wjwj−α∂wj∂J(w ,b)
$\ bb-\alpha\frac{\partial}{\partial{b}}J(\vec{w},b) \ $
多元线性回归的梯度下降中导数这是对$\ w_1\ $的导数
$\frac{\partial}{\partial{w_1}}J(\vec{w},b)\ \frac{1}{m}\sum\limits_{i1}m(f_{\vec{w},b}(\vec{x}{(i)}-y{(i)}))x_1{(i)} \ $
$\ w_1w_1-\alpha\frac{1}{m}\sum\limits_{i1}m(f_{\vec{w},b}(\vec{x}{(i)}-y{(i)}))x_1{(i)} \ $
所以我们要更新参数从$\ w_1\ 到 到 到\ w_n\ 和参数 和参数 和参数\ b\ $
正规方程Normal equation梯度下降是最小化成本函数而正规方程法只适用于线性回归这种方法不需要迭代梯度下降算法可以使用一个高级线性代数库无需迭代即可在一个目标中求解$\ w\ 和 和 和\ b\ $。
正规方程法的缺点
没有推广到其他学习算法如果特征数量很大正规方程方法也很慢
5.4 特征缩放
特征缩放的方法
最大最小值归一化min-max normalization均值归一化Mean normalization标准化/Z值归一化Z-score normalization最大绝对值归一化max abs normalization 该技术将使梯度下降运行得更快。
当一个特征的可能值范围很大时一个好的模型更有可能学会选择一个相对较小的参数值。同样当特征的可能值很小时那么一个合理的值它的参数会比较大。 当因为轮廓是如此之高和瘦梯度下降最终可能来回弹跳很长一段时间它才能最终找到通往全球最低点的道路。在这种情况下要做的一件有用的事情是缩放特征。 这意味着对我们的训练数据进行一些转换以便$\ x_1\ 的范围现在可能从 0 到 1 而 的范围现在可能从0到1而 的范围现在可能从0到1而\ x_2\ 的范围也可能从 0 到 1 。如果我们在成本函数上运行梯度下降来找到这个使用这个转换后的数据重新缩放 的范围也可能从0到1。如果我们在成本函数上运行梯度下降来找到这个使用这个转换后的数据重新缩放 的范围也可能从0到1。如果我们在成本函数上运行梯度下降来找到这个使用这个转换后的数据重新缩放x_1 和 和 和x_2$那么轮廓看起来更像圆圈不会那么高大和瘦。梯度下降可以找到一条更直接的通往全局最小值的路径 可以让我们的样本数据除以样本数据可能取到的最大值来进行特征值的缩小。 除了除以最大值之外我们还可以执行所谓的均值归一化。 我们从原始特征开始然后我们重新缩放它们使两者其中以0为中心以前它们只有大于0的值现在它们既有负值也有正值这通常可能在负一和正一之间。
如要计算$\ x_1\ 的均值归一化首先求均值也称为训练集上 的均值归一化首先求均值也称为训练集上 的均值归一化首先求均值也称为训练集上\ x_1\ 的均值我们称其为均值 的均值我们称其为均值 的均值我们称其为均值\ M_1\ $。
我们曲每个$\ x_1\ 减去平均 减去平均 减去平均\ M_1\ 然后我们除以差值最大值 − 最小值这样我们就得到标准化的 然后我们除以差值最大值-最小值 这样我们就得到标准化的 然后我们除以差值最大值−最小值这样我们就得到标准化的\ x_1\ $。 另外一个常见的重新缩放方法调用Z-score标准化为了实现Z-score归一化我们需要计算每个特征的标准差$\ \sigma \ 。我们首先计算平均值 。 我们首先计算平均值 。我们首先计算平均值\ \mu\ 以及标准差 以及标准差 以及标准差\ \sigma \ 。然后进行 Z − s c o r e 归一化取每个 。然后进行Z-score归一化取每个 。然后进行Z−score归一化取每个\ x_1\ 减去 减去 减去\ \mu_1 \ 然后除以标准差 然后除以标准差 然后除以标准差\ \sigma_1 \ $。这样我们已经实现了Z-score标准化。 那么何时需要进行特征缩放 5.5 判断梯度下降是否收敛
梯度下降的关键选择之一是学习率$\ \alpha \ $的选择
学习曲线 如果梯度下降正常那么成本$\ J\ 应该每次迭代后减少如果 应该每次迭代后减少如果 应该每次迭代后减少如果\ J\ 在一次迭代后增加这意味着 在一次迭代后增加这意味着 在一次迭代后增加这意味着\ \alpha \ 选择不当这通常意味着 选择不当这通常意味着 选择不当这通常意味着\ \alpha \ $太大或则代码中可能存在错误。
如图在迭代次数达到300次后成本$\ J \ $函数的图像已经基本不再下降梯度下降已经收敛了。
此外梯度下降的迭代次数在不同的应用程序之间进行转换可能会有很大差异。
确定模型何时完成训练的另一种方法是使用自动收敛测试。如果在一次迭代中成本$\ J\ 减少幅度小于这个数字 减少幅度小于这个数字 减少幅度小于这个数字\ \epsilon\ 一个很小的数字例如 0.001 如果在一次迭代中成本 一个很小的数字例如0.001如果在一次迭代中成本 一个很小的数字例如0.001如果在一次迭代中成本\ J \ 减少的幅度小于这个数字 减少的幅度小于这个数字 减少的幅度小于这个数字\ \epsilon \ $那么我们可以在我们看到的曲线的平坦部分左边声明收敛。
通常发现正确的阈值$\ \epsilon \ $是非常困难的。
5.6 如何设置学习率
如果学习率太小则会运行很慢如果太大甚至可能不会收敛。
如果我们绘制多次迭代的成本并注意到成本有时会上升有时会下降我们应该将其视为梯度下降无法正常工作的明显迹象这可能意味着代码中存在错误或者有时可能意味着我们选择的学习率太大。 要解决此问题我们可以选择使用较小的学习率。
有时我们会看到每次迭代后成本不断增加这也可能是由于学习率太大引起的并且可以通过选择较小的学习率进行解决。但是像这样的学习率也可能是代码被破坏的迹象。
正确实现梯度下降的一个调试技巧是在足够小的学习率下成本函数应该每次迭代都会减少。
如果即使将$\ \alpha \ 设置为非常小的数字 设置为非常小的数字 设置为非常小的数字\ J\ $不会在每次迭代中减少而是有时会增加那么这通常意味着代码中某个地方存在着错误。
但是如果学习率太小的话梯度下降可能需要很多次迭代才能收敛。
所以当运行梯度下降时我们应该尝试学习率一系列的值(… 0.001 0.01 0.1 1 …)
5.7 特征工程
许多实际应用选择或输入正确的特征是使算法运行良好的关键步骤。
我们可以在其中使用我们对问题的知识或直觉来设计新特征通常通过变换或组合原始特征问题以使学习算法更容易做出准确的预测。 根据我们对应用程序有哪些见解而不是仅仅采用我们碰巧拥有的特征有时通过定义新特征我们可以获得更好的模型。这就是特征工程。
5.8 多项式回归
通过使用特征工程和多项式函数我们可以为我们的数据提供更好的模型。 在上述例子中我们可以选择二次函数也可以选择三次函数等那我们如何决定使用哪一种呢后面会解答 6. 逻辑回归
6.1 动机与目的
binary classification 二元分类
0falsenegative class
1truepositive class 当在右侧添加一个示例时分界线也称为决策边界会向右移动。
6.2 逻辑回归
罗辑回归算法用于分类问题。输出值始终介于0和1之间。 为了构建逻辑回归算法可以使用一个重要的数学函数称为 S i g m o i d Sigmoid Sigmoid函数有时也可以称为逻辑函数 l o g i s t i c f u c n t i o n logistic fucntion logisticfucntion S i g m o i d Sigmoid Sigmoid函数的输出值介于0和1之间该函数可以表示为 g ( z ) 1 1 e − z 0 g ( z ) 1 g(z)\frac{1}{1e^{-z}}\ \ \ \ \ \ 0g(z)1 g(z)1e−z1 0g(z)1 e约等于2.7。
使用 S i g m o i d f u n c t i o n Sigmoid\ function Sigmoid function构建逻辑回归算法 像线性回归一样定义一个直线函数 z w ⃗ ⋅ x ⃗ b z \vec{w}·\vec{x}b zw ⋅x b 获取 z z z的值并将其传递给 S i g m o i d Sigmoid Sigmoid函数也称为逻辑函数 g g g然后输出有 g ( z ) g(z) g(z)函数计算得出的值 将函数 z ( x ) z(x) z(x)与函数 g ( z ) g(z) g(z)放在一起我们便会得到变量 x x x的逻辑回归模型 f w ⃗ , b ( x ⃗ ) g ( w ⃗ ⋅ x ⃗ b ) 1 1 e − ( w ⃗ ⋅ x ⃗ b ) f_{\vec{w},b}(\vec{x})g(\vec{w}·\vec{x}b)\frac{1}{1e^{-(\vec{w}·\vec{x}b)}} fw ,b(x )g(w ⋅x b)1e−(w ⋅x b)1这就是逻辑回归模型它的作用是输入特征或集合x并输出一个介于0和1之间的数字。
假设x是肿瘤的大小y的值为0或1。 0非恶性1恶性
基于该模型输入x模型得到的值假设为0.7。这意味着模型认为存在该患者标签为1的概率为70%。换句话说该模型告诉我们该患者肿瘤为恶性的概率为70%。 因此结果y为0的概率为30%。 在阅读文献时我们可能会遇到上诉的这种公式其含义为输入特征x和带有参数w和b。这里的分号用来表示的只是w和b是影响y等于1的计算参数。
6.3 决策边界
如果我们想预测y的值是0还是1我们需要做的一件事就是要设置一个阀值高于阀值时y为1低于阀值时y为0。
一个常见的选择时选择一个阀值为0.5。
因此如果 f w ⃗ , b ( x ⃗ ) ≥ 0.5 f_{\vec{w},b}(\vec{x})\geq0.5 fw ,b(x )≥0.5则预测y为1我们会写成 y ^ 1 \hat{y}1 y^1如果 f w ⃗ , b ( x ⃗ 0.5 f_{\vec{w},b}(\vec{x}0.5 fw ,b(x 0.5则预测y为0我们会写成 y ^ 0 \hat{y}0 y^0。
那么 f w ⃗ , b ( x ⃗ ) f_{\vec{w},b}(\vec{x}) fw ,b(x )何时大于等于0.5呢 f w ⃗ , b ( x ⃗ ) g ( w ⃗ ⋅ x ⃗ b ) 1 1 e − ( w ⃗ ⋅ x ⃗ b ) f_{\vec{w},b}(\vec{x})g(\vec{w}·\vec{x}b)\frac{1}{1e^{-(\vec{w}·\vec{x}b)}} fw ,b(x )g(w ⋅x b)1e−(w ⋅x b)1
根据该图像可知当 z ≥ 0 z\geq0 z≥0时 f w ⃗ , b ( x ⃗ ) ≥ 0.5 f_{\vec{w},b}(\vec{x})\geq0.5 fw ,b(x )≥0.5即当 w ⃗ ⋅ x ⃗ b ≥ 0 \vec{w}·\vec{x}b\geq0 w ⋅x b≥0时 f w ⃗ , b ( x ⃗ ) ≥ 0.5 f_{\vec{w},b}(\vec{x})\geq0.5 fw ,b(x )≥0.5。
假设我们有两个特征 x 1 x_{1} x1和 x 2 x_{2} x2 上图为一个训练集红色为正例蓝色为反例。
红色对应y等于1蓝色对应y等于0。
逻辑回归模型将使用此函数 f w ⃗ , b ( x ⃗ ) g ( z ) f_{\vec{w},b}(\vec{x})g(z) fw ,b(x )g(z)进行预测其中 z w 1 x 1 w 2 x 2 b zw_{1}x_{1}w_{2}x_{2}b zw1x1w2x2b。
对于这个例子我们假设参数的值是 w 1 1 , w 2 1 , b − 3 w_{1}1,w_{2}1,b-3 w11,w21,b−3。
使用逻辑回归进行预测首先我们要弄清楚 w 1 x 1 w 2 x 2 b w_{1}x_{1}w_{2}x_{2}b w1x1w2x2b何时大于0以及何时小于0。为了弄清楚这一点存在着一条非常特别的线就是 w 1 x 1 w 2 x 2 b w_{1}x_{1}w_{2}x_{2}b w1x1w2x2b正好等于0的时候这条线也称为决策边界(Decision boundary)。
对于上面我们假设的参数决策边界就是 z x 1 x 2 − 3 zx_{1}x_{2}-3 zx1x2−3等于0时。那么 z x 1 x 2 − 3 zx_{1}x_{2}-3 zx1x2−3什么时候等于0呢
我们可以由 x 1 x 2 − 3 0 x_{1}x_{2}-30 x1x2−30得出 x 1 x 2 3 x_{1}x_{2}3 x1x23即下图由紫色所表示的直线这条线便是决策边界。
在这条直线的右侧模型将预测为1。在这条直线的左侧模型将预测为0。 在下图这个复杂的例子中决策边界不再是一条直线。和我们之前定义的一样红色y值为1蓝色y值为0。 我们将设置 z w 1 x 1 2 w 2 x 2 2 b zw_{1}x^2_{1}w_{2}x^2_{2}b zw1x12w2x22b通过这种特征选择多项式特征变为逻辑回归。
即 f w ⃗ , b ( x ⃗ ) g ( z ) g ( w 1 x 1 2 w 2 x 2 2 b ) f_{\vec{w},b}(\vec{x})g(z)g(w_{1}x^2_{1}w_{2}x^2_{2}b) fw ,b(x )g(z)g(w1x12w2x22b) 我们选择 w 1 , w 2 1 , b − 1 w_{1},w_{2}1,b-1 w1,w21,b−1。即 z x 1 2 x 2 2 − 1 zx^2_{1}x^2_{2}-1 zx12x22−1要找到决策边界即 z 0 z0 z0则 x 1 2 x 2 2 − 1 0 x^2_{1}x^2_{2}-10 x12x22−10即 x 1 2 x 2 2 1 x^2_{1}x^2_{2}1 x12x221
所得决策边界如下图绿色曲线所示。 6.4 逻辑回归中的代价函数
成本函数为我们提供了一种方法来衡量一组特定的参数适合训练数据从而为我们提供了一种尝试选择更好参数的方法。 上图为逻辑回归模型的训练集的样子。使用m表示训练示例的数量。每个训练样本都有一个或者多个特征共有n个特征。由于这是一个二元分类任务目标标签y只取两个值0或1。
逻辑回归模型由该方程定义 f w ⃗ , b ( x ⃗ ) 1 1 e − ( w ⃗ ⋅ x ⃗ b ) f_{\vec{w},b}(\vec{x})\frac{1}{1e^{-(\vec{w}·\vec{x}b)}} fw ,b(x )1e−(w ⋅x b)1 那么给定上诉训练集我们应该如何选择参数 w ⃗ \vec{w} w 和参数 b b b
在线性回归中误差函数为 J ( w , b ⃗ ) 1 2 m ∑ i 1 m ( f w ⃗ , b ( x ⃗ ( i ) − y ( i ) ) ) 2 J(\vec{w,b})\frac{1}{2m}\sum\limits_{i1}^{m}(f_{\vec{w},b}(\vec{x}^{(i)}-y^{(i)}))^2 J(w,b )2m1i1∑m(fw ,b(x (i)−y(i)))2在这里我们对该误差函数做一点小改动改动为 J ( w , b ⃗ ) 1 m ∑ i 1 m 1 2 ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 J(\vec{w,b})\frac{1}{m}\sum\limits_{i1}^{m}\frac{1}{2}(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2 J(w,b )m1i1∑m21(fw ,b(x (i))−y(i))2将 1 2 \frac{1}{2} 21移动到了求和里面这样使我们的数学计算更简单一些。
然而对于逻辑回归上诉误差函数并不是一个好的选择。
为了建立一个新的代价函数我们将用于逻辑回归。
我们可以将 L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ( i ) ) L(f_{\vec{w},b}(\vec{x}^{(i)}),y^{(i)}) L(fw ,b(x (i)),y(i))看作为单个训练示例的损失。 通过上述损失函数的选择整体代价函数将是凸的因此我们可以放心的使用梯度下降将其求的最小值。
6.5 简化逻辑回归代价函数
这是我们定义的损失函数 L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ( i ) ) { − l o g ( f w ⃗ , b ( x ⃗ ( i ) ) ) i f y ( i ) 1 − l o g ( 1 − f w ⃗ , b ( x ⃗ ( i ) ) ) i f y ( i ) 0 L(f_{\vec{w},b}(\vec{x}^{(i)}),y^{(i)}) \begin{cases} -log(f_{\vec{w},b}(\vec{x}^{(i)}))\ \ \ \ if\ y^{(i)}1 \\ -log(1-f_{\vec{w},b}(\vec{x}^{(i)}))\ \ \ \ if\ y^{(i)}0 \end{cases} L(fw ,b(x (i)),y(i)){−log(fw ,b(x (i))) if y(i)1−log(1−fw ,b(x (i))) if y(i)0
我们可以将损失函数写成 L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ( i ) ) − y ( i ) l o g ( f w ⃗ , b ( x ⃗ ( i ) ) ) − ( 1 − y ( i ) ) l o g ( 1 − f w ⃗ , b ( x ⃗ ( i ) ) ) L(f_{\vec{w},b}(\vec{x}^{(i)}),y^{(i)})-y^{(i)}log(f_{\vec{w},b}(\vec{x}^{(i)}))-(1-y^{(i)})log(1-f_{\vec{w},b}(\vec{x}^{(i)})) L(fw ,b(x (i)),y(i))−y(i)log(fw ,b(x (i)))−(1−y(i))log(1−fw ,b(x (i))) 故代价函数可以写为 J ( w ⃗ , b ) 1 m ∑ i 1 m [ L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ( i ) ) ] J(\vec{w},b)\frac{1}{m}\sum\limits_{i1}^{m}[L(f_{\vec{w},b}(\vec{x}^{(i)}),y^{(i)})] J(w ,b)m1i1∑m[L(fw ,b(x (i)),y(i))] 即 J ( w ⃗ , b ) − 1 m ∑ i 1 m [ y ( i ) l o g ( f w ⃗ , b ( x ⃗ ( i ) ) ) ( 1 − y ( i ) ) l o g ( 1 − f w ⃗ , b ( x ⃗ ( i ) ) ) ] J(\vec{w},b)-\frac{1}{m}\sum\limits_{i1}^{m}[y^{(i)}log(f_{\vec{w},b}(\vec{x}^{(i)}))(1-y^{(i)})log(1-f_{\vec{w},b}(\vec{x}^{(i )}))] J(w ,b)−m1i1∑m[y(i)log(fw ,b(x (i)))(1−y(i))log(1−fw ,b(x (i)))] 上诉函数便是我们得到的代价函数。
6.6 实现梯度下降
梯度下降 r e p e a t { w j w j − α ∂ ∂ w j J ( w ⃗ , b ) b b − α ∂ ∂ b J ( w ⃗ , b ) } s i m u l t a n e o u s u p d a t e repeat\{ \\w_jw_j-\alpha\frac{\partial}{\partial w_j}J(\vec{w},b) \\ bb-\alpha\frac{\partial}{\partial b}J(\vec{w},b)\\ \}simultaneous\ \ update repeat{wjwj−α∂wj∂J(w ,b)bb−α∂b∂J(w ,b)}simultaneous update 对于导数 7. 过拟合问题与正则化
7.1 过拟合
与过拟合具有高方差相反的称为欠拟合具有高偏差。
有一种解决过拟合问题的方法称为正则化。
过拟合overfitting是指学习时选择的模型所包含的参数过多即模型容量很大以至于出现这一模型对已知数据预测得很好但对未知数据预测得很差的现象。
过拟合是指为了得到一致假设而使假设变得过度严格。 同样过拟合和欠拟合问题也会存在于分类问题中。 7.2 解决过拟合问题
方法一
我们可以用来防止过度拟合第一个方法是获取更多的训练数据。
方法二
解决过拟合的第二个方法是查看是否可以使用更少的特征即减少使用特征的数量。
事实证明如果我们拥有太多的特征但是没有足够的训练数据那我们的算法可能会过度拟合我们的训练集。
选择要使用的最合适的一组特征有时也称为特征选择。
可能所有这些特征全部都适用于算法模型我们不想对特征进行舍弃我们可以使用一些方法进行自动选择最合适的一组特征。
方法三
解决过拟合问题的一种技术称为正则化。正则化是一种更温和的减少某些特征的影响而无需做像彻底消除掉某些特征。
正则化的所用是鼓励学习算法缩小参数而不必要求将参数设置为0删除某些特征。
正则化保留了所有的特征但是同时防止特征产生过大的影响这有时会导致过度拟合。
7.3 正则化 如图对这个数据拟合一个二次函数它会给出一个很好的拟合。
但是如果拟合一个非常高阶的多项式我们会得到一个过度拟合的曲线。现在考虑以下情况如果我们有办法使参数 w 3 , w 4 w_3,w_4 w3,w4变得非常非常小接近于0那么变可以解决这个问题。
假设不是最小化这个目标函数而是线性回归的成本函数。我们对成本函数进行修改这里给参数 w 4 , w 3 w_4,w_3 w4,w3加上了参数1000这个参数可以随意但是要添加较大的参数值这样实际上我们可能会得到一个惩罚模型即 min w ⃗ , b 1 2 m ∑ i 1 m ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 1000 w 3 2 1000 w 4 2 \min_{\vec{w},b}\frac{1}{2m}\sum_{i1}^{m}(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^{2}1000w_3^21000w_4^2 w ,bmin2m1i1∑m(fw ,b(x (i))−y(i))21000w321000w42 我们想最小化这个函数必须要做的是保证 w 3 , w 4 w_3,w_4 w3,w4都要变得很小。当我们最小化这个函数时我们最终会得到 w 3 w 4 w_3w_4 w3w4都接近于0。因此我们实际上几乎抵消了 x 3 , x 4 x^3,x^4 x3,x4两项的影响。我们这么做的话我们最终会拟合出更接近二次函数的数据。 个人理解将特征的权值降低 ≈ \approx ≈将特征去除 当我们在不知道哪个特征是重要的或者不重要的时候我们无法对特征根据不重要性进行删除这时应该使用正则化 而对于我们可以自主判断出哪些是不重要的特征我们可以选择直接去除那些不重要的特征 正则化的实现往往是在我们有很多特征时我们可能不知道哪个是最重要的特征以及要惩罚的特征因此实现正则化的方式是惩罚所有特征或者更准确的说惩罚所有 w j w_j wj的参数这通常会导致拟合更加平滑更加简单且不易过度拟合。
对于示例我们的数据包含每个房屋的100个特征我们很难提前选择要包含哪些特征以及要排除哪些特征。因此让我们构建一个使用所有100个特征的模型。 我们有参数 w 1 , w 2 , . . . , w 100 , b w_1,w_2,...,w_{100},b w1,w2,...,w100,b因为我们不知道这些参数中哪一个是重要的所以让我们惩罚一下它们即 J ( w ⃗ , b ) 1 2 m ∑ i 1 m ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 λ 2 m ∑ j 1 n w j 2 J(\vec{w},b)\frac{1}{2m}\sum_{i1}^m(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2\frac{\lambda}{2m}\sum_{j1}^nw_j^2 J(w ,b)2m1i1∑m(fw ,b(x (i))−y(i))22mλj1∑nwj2 λ \lambda λ正则化参数 α \alpha α学习率
第二项即 λ 2 m ∑ j 1 n w j 2 \frac{\lambda}{2m}\sum\limits_{j1}^{n}w_j^2 2mλj1∑nwj2称为正则化项。
我们必须为 λ \lambda λ选择一个数字且 λ 0 \lambda0 λ0
事实证明通过以相同的方式缩放这两个式子为 λ \lambda λ选择一个好的值变得更容易一些。
按照惯例我们不会因为参数 b b b太大而惩罚它。在实践中我们是否惩罚参数b基本上没有什么区别。如果需要惩罚参数 b b b则额外增加一项即 J ( w ⃗ , b ) 1 2 m ∑ i 1 m ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 λ 2 m ∑ j 1 n w j 2 λ 2 m b 2 J(\vec{w},b)\frac{1}{2m}\sum_{i1}^m(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2\frac{\lambda}{2m}\sum_{j1}^nw_j^2\frac{\lambda}{2m}b^2 J(w ,b)2m1i1∑m(fw ,b(x (i))−y(i))22mλj1∑nwj22mλb2 我们选择的 λ \lambda λ值制定了相对重要性或相对权衡或我们如何在式子第一项和第二项之间取得平衡。
不同 λ \lambda λ值对算法模型的影响
$ \lambda0 $正则化项不存在 λ \lambda λ取一个非常大的数字 λ 1 0 10 \lambda10^{10} λ1010这说明我们对正则化项非常重视这种情况下要实现最小化唯一方法是保证w的所有值都非常接近于0所以会得到 f w ⃗ , b ( x ⃗ ) ≈ b f_{\vec{w},b}(\vec{x})\approx{b} fw ,b(x )≈b这种会使模型欠拟合。
7.4 用于线性回归的正则方法
线性回归目标函数 f w ⃗ , b ( x ⃗ ) w ⃗ ⋅ x ⃗ b f_{\vec{w},b}(\vec{x})\vec{w}·\vec{x}b fw ,b(x )w ⋅x b 线性回归代价函数 J ( w ⃗ , b ) 1 2 m ∑ i 1 n ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 J(\vec{w},b)\frac{1}{2m}\sum\limits_{i1}^{n}(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2 J(w ,b)2m1i1∑n(fw ,b(x (i))−y(i))2 线性回归梯度下降 r e p e a t { w j w j − α ∂ J ( w ⃗ , b ) ∂ w j b b − α ∂ J ( w ⃗ , b ) ∂ b } s i m u l t a n e o u s u p d a t e repeat\{\qquad\qquad\qquad\qquad \\w_jw_j-\alpha\frac{\partial J(\vec{w},b)}{\partial w_j}\\bb-\alpha\frac{\partial J(\vec{w},b)}{\partial b}\\ \}simultaneous\ \ update repeat{wjwj−α∂wj∂J(w ,b)bb−α∂b∂J(w ,b)}simultaneous update
含正则项的线性回归代价函数 J ( w ⃗ , b ) 1 2 m ∑ i 1 m ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 λ 2 m ∑ j 1 n w j 2 J(\vec{w},b)\frac{1}{2m}\sum_{i1}^m(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2\frac{\lambda}{2m}\sum_{j1}^nw_j^2 J(w ,b)2m1i1∑m(fw ,b(x (i))−y(i))22mλj1∑nwj2 含正则项的线性回归梯度下降 r e p e a t { w j w j − α ∂ J ( w ⃗ , b ) ∂ w j w j − α [ 1 m ∑ i 1 m [ ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) x j ( i ) ] λ m w j ] b b − α ∂ J ( w ⃗ , b ) ∂ b b − α 1 m ∑ i 1 m ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) } s i m u l t a n e o u s u p d a t e repeat\{ \\w_jw_j-\alpha\frac{\partial J(\vec{w},b)}{\partial w_j}w_j-\alpha[\frac{1}{m}\sum\limits_{i1}^{m}[(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})x_{j}^{(i)}]\frac{\lambda}mw_j] \\ bb-\alpha\frac{\partial J(\vec{w},b)}{\partial b}b-\alpha\frac{1}{m}\sum\limits_{i1}^{m}(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)}) \\ \}simultaneous\ \ update\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\quad repeat{wjwj−α∂wj∂J(w ,b)wj−α[m1i1∑m[(fw ,b(x (i))−y(i))xj(i)]mλwj]bb−α∂b∂J(w ,b)b−αm1i1∑m(fw ,b(x (i))−y(i))}simultaneous update 因为我们没有对参数 b b b进行正则化处理所以对于 b b b对梯度下降并没有变化。 7.5 用于逻辑回归的正则方法
逻辑回归目标函数 f w ⃗ , b ( x ⃗ ) g ( w ⃗ ⋅ x ⃗ b ) 1 1 e − ( w ⃗ ⋅ x ⃗ b ) f_{\vec{w},b}(\vec{x})g(\vec{w}·\vec{x}b)\frac{1}{1e^{-(\vec{w}·\vec{x}b)}} fw ,b(x )g(w ⋅x b)1e−(w ⋅x b)1 逻辑回归代价函数 J ( w ⃗ , b ) − 1 m ∑ i 1 m [ y ( i ) l o g ( f w ⃗ , b ( x ⃗ ( i ) ) ) ( 1 − y ( i ) ) l o g ( 1 − f w ⃗ , b ( x ⃗ ( i ) ) ) ] J(\vec{w},b)-\frac{1}{m}\sum\limits_{i1}^{m}[y^{(i)}log(f_{\vec{w},b}(\vec{x}^{(i)}))(1-y^{(i)})log(1-f_{\vec{w},b}(\vec{x}^{(i )}))] J(w ,b)−m1i1∑m[y(i)log(fw ,b(x (i)))(1−y(i))log(1−fw ,b(x (i)))] 逻辑回归梯度下降 r e p e a t { w j w j − α ∂ ∂ w j J ( w ⃗ , b ) b b − α ∂ ∂ b J ( w ⃗ , b ) } s i m u l t a n e o u s u p d a t e repeat\{\qquad\qquad\qquad\qquad \\w_jw_j-\alpha\frac{\partial}{\partial w_j}J(\vec{w},b) \\ bb-\alpha\frac{\partial}{\partial b}J(\vec{w},b) \\ \}simultaneous\ \ update repeat{wjwj−α∂wj∂J(w ,b)bb−α∂b∂J(w ,b)}simultaneous update
含正则项的逻辑回归代价函数 J ( w ⃗ , b ) − 1 m ∑ i 1 m [ y ( i ) l o g ( f w ⃗ , b ( x ⃗ ( i ) ) ) ( 1 − y ( i ) ) l o g ( 1 − f w ⃗ , b ( x ⃗ ( i ) ) ) ] λ 2 m ∑ j 1 n w j 2 J(\vec{w},b)-\frac{1}{m}\sum\limits_{i1}^{m}[y^{(i)}log(f_{\vec{w},b}(\vec{x}^{(i)}))(1-y^{(i)})log(1-f_{\vec{w},b}(\vec{x}^{(i )}))]\frac{\lambda}{2m}\sum\limits_{j1}^nw_j^2 J(w ,b)−m1i1∑m[y(i)log(fw ,b(x (i)))(1−y(i))log(1−fw ,b(x (i)))]2mλj1∑nwj2 含正则项的逻辑回归梯度下降 r e p e a t { w j w j − α ∂ J ( w ⃗ , b ) ∂ w j w j − α [ 1 m ∑ i 1 m [ ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) x j ( i ) ] λ m w j ] b b − α ∂ J ( w ⃗ , b ) ∂ b b − α 1 m ∑ i 1 m ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) } s i m u l t a n e o u s u p d a t e repeat\{\qquad \\w_jw_j-\alpha\frac{\partial J(\vec{w},b)}{\partial w_j}w_j-\alpha[\frac{1}{m}\sum\limits_{i1}^{m}[(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})x_{j}^{(i)}]\frac{\lambda}mw_j] \\ bb-\alpha\frac{\partial J(\vec{w},b)}{\partial b}b-\alpha\frac{1}{m}\sum\limits_{i1}^{m}(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)}) \\ \}simultaneous\ \ update\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\quad repeat{wjwj−α∂wj∂J(w ,b)wj−α[m1i1∑m[(fw ,b(x (i))−y(i))xj(i)]mλwj]bb−α∂b∂J(w ,b)b−αm1i1∑m(fw ,b(x (i))−y(i))}simultaneous update 8. 了解深度学习
8.1 神经元和大脑
神经网络开始的动机是试图建立模拟大脑的软件。 生物神经元简化图 8.2 神经网络工作流程
在下面例子中我们有4个特征预测一件T恤是否畅销。特征是T恤的价格、运费、特定T恤的营销量、材料质量。
我们要做的是创建一个人工神经元来尝试估计这件T恤被认为非常实惠的概率。
支付能力主要是价格和运费的函数因为支付的总额是价格加上运费的一部分。
我们将在这里使用一个小神经元一个逻辑回归单元来输入价格和运输成本并预测人们是否认为这是负担得起的。
其次我们再使用一个人工神经元来估计一下人们是否对该T恤有很高的认识。在这种认识下知名度主要是T恤的营销功能。
最后在创建一个神经元来估计人们是否认为该T恤是高质量的这可能主要是T恤价格和材料质量的函数。价格是这里的一个因素因为幸运或者不幸如果有一件价格非常高的T恤人们有时会认为它是高质量的因为它比人们认为的高质量贵的多。
鉴于这些对可负担性、意识和感知质量的估计我们然后将这三个神经元的输出连接到右侧的另一个神经元然后有另一个逻辑回归单元。最后输入这三个数字并输出这件T恤成为畅销商品的概率。 在神经网络的术语中我们将把这三个神经元组合在一起形成所谓的层。层是一组神经元它们将相同或相似的特征作为输入然后一起输出一些数字。 一层可以有多个神经元也可以只有一个神经元。 左边的这三个神经元形成一层这就是我将它们画在彼此之上的原因右边的这个单个神经元也是一层。右边的这一层也称为输出层因为这个最终神经元的输出是神经网络预测的输出概率。左边包含四个数字的这一层也称为输入层。中间层的名字叫做隐藏层。
在神经网络术语中我们还将这个例子中的购买能力、意识和感知质量称为激活。激活一词来源于生物神经元它指的是生物神经元向其下游的其他神经元发送高输出值或发送许多点脉冲的程度。
这些关于可负担性、意识和感知质量的数字是该层中这三个神经元的激活。而且这个输出概率是右侧显示的这个神经元的激活。
因此这个特定的神经网络执行以下计算
它输如四个数字然后神经网络的这一层使用这四个数字来计算新数字新的数字也称为激活值。然后是最后一层神经网络的输出层使用这三个数字来计算一个数字
现在对神经网络做一个简化
到目前为止我们所描述的方式是我们必须一次一个的检查神经元并决定它将从前一层获取哪些输入。例如我们说负担能力只是价格和运输成本的函数认知度是营销的函数等等但如果我们正在构建一个大型神经网络那么需要我们进行大量工作并手动决定哪些神经元应该将哪些特征作为输入。
神经网络在实践中实现特定层中每个神经元的方式比如说中间的这一层将可以访问每个特征从上一层从输入层访问每个值。 如果我们试图预测支付能力并且知道运费和材料的价格是多少我们可能学会忽略营销和材料质量只是通过适当的设置参数来找出只关注的子集与支付能力最相关的因素。
为了进一步简化啊这个神经网络的符号和描述我们将采用这四个输入特征并将它们写成一个向量 x ⃗ \vec{x} x 我们将把神经网络视为具有构成这个特征向量x的四个特征。该特征向量被馈送到中间的这一层然后计算三个激活值。也就是说这些数字和这三个激活值依次变成另一个向量该向量被馈送到这个最终输出层最终输出这件T恤成为畅销品的概率。 含有多个隐藏层的例子 在当我们构建自己的神经网络时我们需要做出的决定之一是我们想要多少个隐藏层以及我们希望每个隐藏层有多少个神经元这属于神经网络的架构问题。对隐藏层层数和每层神经元数量的选择会对学习算法的性能产生影响。 具有多层的神经网络称为多层感知器多层感知机。 多层感知器MLPMultilayer Perceptron是一种前馈人工神经网络模型将输入的多个数据集映射到单一的输出的数据集上。 8.3 神经网络的结构
对于我们在上面的例子中预测一件T恤是否畅销。我们将其隐藏层放大来看以查看其计算 这个隐藏层输入四个数字这四个数字是三个神经元中每一个的输入。这三个神经元中的每一个都只是在实现一个小逻辑回归单元或一个小逻辑回归函数。
以第一个神经元为例它有两个参数 w ⃗ , b \vec{w},b w ,b。事实上为了表示这是第一个隐藏单元我们为其添加下标写为 w ⃗ 1 , b 1 \vec{w}_1,b_1 w 1,b1。它所做的是将输出一些激活值a为了表示这是第一个神经元我们要为激活值a添加下标 a 1 g ( w ⃗ 1 ⋅ x ⃗ b 1 ) a_1g(\vec{w}_1·\vec{x}b_1) a1g(w 1⋅x b1)。假设输出的这个数字是0.3这就是第一个神经元的激活值a。即有0.3的可能性人们认为该T恤是实惠的。
对于第二个神经元有参数 w ⃗ 2 , b 2 \vec{w}_2,b_2 w 2,b2这些参数就是第二个逻辑单元的参数。它计算 a 2 g ( w ⃗ 2 ⋅ x ⃗ b 2 ) a_2g(\vec{w}_2·\vec{x}b_2) a2g(w 2⋅x b2)我们假设其结果为0.7。即有0.7的可能人们知道这件T恤。
对于第三个神经元有参数 w ⃗ 3 , b 3 \vec{w}_3,b_3 w 3,b3它计算激活值 a 3 g ( w ⃗ 3 ⋅ x ⃗ b 3 ) a_3g(\vec{w}_3·\vec{x}b_3) a3g(w 3⋅x b3)假设它的结果是0.2。
上面的三个激活值构成激活向量 a ⃗ ( a 1 a 2 a 3 ) \vec{a}{\left(\begin {array}{c} a_1 \\ a_2 \\ a_3 \\ \end{array}\right)} a a1a2a3 然后传递到这个神经网络的最终输出层。
在当我们构建具有多层的神经网络时为各层指定不同的数字会很有用。在本例子中我们将中间层即隐藏层称为神经网络的第1层输出层称为神经网络的第二层。输入层有时也曾为第0层。
为了引入符号来帮助我们区分不同的层我们将使用上标方括号来索引到不同的层。 即 a ⃗ [ 1 ] ( a 1 a 2 a 3 ) \vec{a}^{[1]}{\left(\begin {array}{c} a_1 \\ a_2 \\ a_3 \\ \end{array}\right)} a [1] a1a2a3 。这里的 w ⃗ 1 , b 1 \vec{w}_1,b_1 w 1,b1是第一个单元 a 1 [ 1 ] g ( w ⃗ 1 [ 1 ] ⋅ x ⃗ b 1 [ 1 ] ) a 2 [ 1 ] g ( w ⃗ 2 [ 1 ] ⋅ x ⃗ b 2 [ 1 ] ) a 3 [ 1 ] g ( w ⃗ 3 [ 1 ] ⋅ x ⃗ b 3 [ 1 ] ) a_1^{[1]}g(\vec{w}_1^{[1]}·\vec{x}b_1^{[1]})\\ a_2^{[1]}g(\vec{w}_2^{[1]}·\vec{x}b_2^{[1]})\\ a_3^{[1]}g(\vec{w}_3^{[1]}·\vec{x}b_3^{[1]}) a1[1]g(w 1[1]⋅x b1[1])a2[1]g(w 2[1]⋅x b2[1])a3[1]g(w 3[1]⋅x b3[1]) 下面放大神经网络的第2层即输出层来查看其计算 第二层的输入是第一层的输出因此 a ⃗ [ 1 ] \vec{a}^{[1]} a [1]是我们刚刚假设的值 a ⃗ [ 1 ] ( 0.3 0.7 0.2 ) \vec{a}^{[1]}{\left(\begin {array}{c} 0.3 \\ 0.7 \\ 0.2 \\ \end{array}\right)} a [1] 0.30.70.2 。
因为输出层只有一个神经元所以它所做的只是计算 a 1 a_1 a1这是唯一一个神经元的输出 a 1 g ( w ⃗ 1 ⋅ a ⃗ [ 1 ] b 1 ) a_1g(\vec{w}_1·\vec{a}^{[1]}b_1) a1g(w 1⋅a [1]b1)。 我们假设结果为0.84。
按照之前的约定我们应该为结果和参数加上上标因为这是在神经网络第2层所以上标为2即 a 1 [ 2 ] g ( w ⃗ 1 [ 2 ] ⋅ a ⃗ [ 1 ] b 1 [ 2 ] ) a_1^{[2]}g(\vec{w}_1^{[2]}·\vec{a}^{[1]}b_1^{[2]}) a1[2]g(w 1[2]⋅a [1]b1[2])。
神经网络计算出结果后我们可以选择执行或者不执行最后一个可选步骤即我们是否想要进行二进制预测1或0这是畅销产品吗 8.4 神经网络的前向传播
让我们把我们学到的东西组合成一个算法让我们的神经网络进行推理或预测。 这将是一种称作向前传播的算法。 这里引入一个手写数字识别的例子 为了简单起见我们只识 别数字0和数字1。所以这是一个二进制分类问题。对于手写示例我们采用8×8的图像。 因此这个手写数字图像是一个64像素的图像。255表示明亮的白色像素。0表示黑色像素。
鉴于64个输入特征我们使用具有两个隐藏层的神经网络。 其中第一个隐藏层有25个神经元第二个隐藏层有15个神经元 最后是输出层对是1或者是0的概率进行输出。 第一个计算是从 x ⃗ \vec{x} x 到 a ⃗ [ 1 ] \vec{a}^{[1]} a [1]这就是第一个隐藏层做的。 上面我们只计算了 a ⃗ [ 1 ] \vec{a}^{[1]} a [1]下一步即第二个隐藏层计算 a ⃗ [ 2 ] \vec{a}{[2]} a [2]。 现在我们计算了 a ⃗ [ 2 ] \vec{a}^{[2]} a [2] 最后一步是计算 a ⃗ [ 3 ] \vec{a}^{[3]} a [3]。 因为 a ⃗ [ 3 ] \vec{a}^{[3]} a [3]只有一个数字所以 a [ 3 ] a^{[3]} a[3]是一个标量。 最后我们可以为 a ⃗ [ 3 ] \vec{a}^{[3]} a [3]设置阀值0.5以得出二进制分类标签。 因为神经网络中的整个计算是从左到右进行的所以我们从 x x x开始计算 a [ 1 ] a^{[1]} a[1]然后 a [ 2 ] a^{[2]} a[2]再是 a [ 3 ] a^{[3]} a[3]。
所以这个也叫做前向传播因为我们在传播神经元的激活。这与用于学习的反向传播或反向传播的不同算法形成对比。
这种类型的神经网络架构最初有更多的隐藏单元然后随着离输出层越来越近隐藏单元的数量会减少。
在选择神经网络架构时还有一个非常典型的选择。
8.5 代码实现推理
Tensorflow是实施深度学习算法的领先框架之一。 另一个流行的框架是Pytorch。
下面使用Tensorflow实现推理代码。
神经网络的一个显著特点是可以将相同的算法应用于许多不同的应用程序。
下面有一个例子让学习算法来帮助我们优化从烘培过程中得到的咖啡豆的质量。
当我们在烘培时 我们需要控制的两个参数是温度及时长。 在这个稍微简化的示例中我们创建了不同温度及不同持续时间的数据集以及显示我们烘培的咖啡豆是否是美味咖啡的标签。
红色代表好的咖啡豆蓝色代表差的咖啡豆。 该任务被赋予一个具有温度和持续时间的特征向量 x ⃗ \vec{x} x 比如200摄氏度持续17分钟 我们如何在神经网络中进行推理以让它告诉我们这个温度和持续时间设置是否会产生好咖啡。 我们将x设置为两个数字的数组输入具有200摄氏度和17分钟。 然后创建第1层作为第一个隐藏层units3指这里的一个隐藏层包含三个神经单元activationsigmoid至激活函数为 sigmoid函数。 这里的Dense 只是这一层的名称。随着我们对神经网络的了解我们也会了解其他类型的层。接下来我们使 用第一层来计算 a ⃗ [ 1 ] \vec{a}^{[1]} a [1]。
x np.array([200.0,17.0])
layer_1 Dense(units3,activationsigmoid)
a1 layer_1(x)这就是我们如何得到 a ⃗ [ 1 ] \vec{a}^{[1]} a [1]它是一个包含三个数字的列表因为第一层有三个单位。所以这里的 a ⃗ [ 1 ] \vec{a}^{[1]} a [1]为了说明起见可以取0.20.70.3。
接下来对于第二个隐藏层它只有一个神经元 同时sigmoid作为激活函数我们在第二层隐藏层应用激活值 a ⃗ [ 1 ] \vec{a}^{[1]} a [1]来计算 a ⃗ [ 2 ] \vec{a}^{[2]} a [2]。 为了说明起见我们假设其值为0.8。
layer_2 Dense(units1,activationsigmoid)
a2 layer_2(a1)最后如果我们希望将其阀值设置为0.5那么我们可以只测试 a ⃗ [ 2 ] \vec{a}^{[2]} a [2]是否大于0.5并相应的将 y ^ \hat{y} y^设置为1或者0。
8.6 Tensorflow中数据形式
numpy和tensorflow中的数据表示方式存在一些不一致。
在我们之前处理线性回归和逻辑回归时我们习惯使用一维向量来表示输入特征X。而对于Tensorflow的惯例是使用矩阵来表示数据。
TensorFlow旨在处理非常大的数据集并且通过在矩阵而不是一维数组中表示数据它让Tensorflow在内部的计算效率更高一些。
Numpy数据传入TensorFlow中进行处理时数据会被转化为张量tensor。
8.7 搭建一个神经网络
张量tensor流有不同的方式来实现向前传播。
使用TensorFlow不需要我们手动获取数据并将数据传递到第一层然后将第一层激活传递到第二层。
相反我们可以告诉张量流我们希望它采用第一层和第二层并将它们串在一起形成一个神经网络。这就是TensorFlow顺序函数所做的。 9. 前向传播
9.1 单个网络层上的前向传播 9.2 前向传播的一般实现
可以编写一个函数来实现密集层即神经网络的单层。
定义密集函数将前一层的激活以及给定层中神经元的参数 w w w和 b b b作为输入。 10. 强人工智能 AGI
即通用人工智能。
人工智能可以分为弱人工智能(Artificial Narrow Intelligence简称ANI)、强人工智能(Artificial General Intelligence简称AGI也称为通用人工智能)、人工智能(Artificial Superintelligence简称ASI)三个等级。 11. Tensorflow实现 如果给我们一组包含图像x多训练集以及真实标签Y我们将如何训练该神经网络的参数呢
在Tensorflow中用于训练此网络的代码 要求Tensorflow编译模型的关键步骤是指定要使用的损失函数。这里我们使用二元交叉熵损失函数。 训练模型 第一步是指定模型告诉Tensorflow如何计算推理第二步使用特定的损失函数编译模型第三步是训练模型 12. 激活函数
12.1 sigmoid激活函数的替代方案
sigmoid函数也叫Logistic函数用于隐层神经元输出取值范围为(0,1)它可以将一个实数映射到(0,1)的区间可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。 线性整流函数ReLU,又称修正线性单元, 是一种人工神经网络中常用的激活函数通常指代以斜坡函数及其变种为代表的非线性函数。 ReLU g ( z ) m a x ( 0 , z ) g(z) max(0,z) g(z)max(0,z)
12.2 选择激活函数
事实证明根据目标标签或真实标签Y是什么输出层的激活函数会有一个相当自然的选择。
1. 输出层 如果是处理二元分类问题我们可以在输出层使用sigmoid函数。
如果我们要解决回归问题则可以选择使用线性激活函数。
如果y只能取非负值那么最自然的选择就是ReLU函数。
2. 隐藏层
事实证明ReLU激活函数是迄今为止许多从业者训练神经网络的最常见的选择。
ReLU的计算速度要优于Sigmoid函数。
如果有二分类问题则建议使用sigmoid函数。
如果y可以取正值或负值再或者y只能取正值和零则使用ReLU。
对于隐藏层建议使用ReLU作为默认激活函数。在Tensorflow中这就是它的实现方式。 13. 多分类问题
13.1 多分类问题概述
多分类是指分类问题其中我们可以有两个以上可能的输出标签而不仅仅是0或1。例如手写数字识别分类问题。 13.2 Softmax
softmax回归算法是逻辑回归算法的推广使用它我们将可以执行多类分类问题。
softmax回归(softmax regression)其实是 logistic 回归的一般形式logistic 回归用于二分类而 softmax 回归用于多分类。
逻辑回归二分类两种结果的概率相加之和要为1。 现在让我们将其推广到softmax回归我们可以通过一个具体示例来说明何时y可以采用四种可能的输出因此y可以采用值1234。 主要公式 z j w j ⃗ ⋅ x ⃗ b j j 1 , 2 , . . . , N a j e z j ∑ k 1 N e z k P ( y j ∣ x ⃗ ) z_j \vec{w_j}·\vec{x}b_j\ \ \ \ \ j1,2,...,N \\ a_j \frac{e^{z_j}}{\sum_{k1}^Ne^{z_k}}P(yj|\vec{x}) zjwj ⋅x bj j1,2,...,Naj∑k1NezkezjP(yj∣x ) 注意由上述公式得到 a 1 a 2 . . . a N a_1\ a_2\ ...\ a_N a1 a2 ... aN有 a 1 a 2 . . . a N 1 a_1a_2...a_N1 a1a2...aN1 定义了softmax回归函数后下面了解如果指定softmax回归的成本函数。
对于逻辑回归的成本函数 对于softmax回归的成本函数 13.3 神经网络的Softmax输出
如果我们现在想用10个类别进行手写数字分类所有数字都从0到9那么我们将把这个神经网络改为有10个输出单元。 这个新的输出层将是一个softmax输出层。所以有时我们会说这个神经网络有一个softmax输出或者这个上层是一个softmax层。 13.4 多标签分类
有一种不同类型的分类问题称为多标签分类问题其中每个图像的关联它们可能是多个标签。 上图是一个多标签分类问题的示例因为与单个输入相关联的图像X是三个不同的标签对应于图像中是否有任何汽车、公共汽车或者行人。 注意不可以将多标签分类和多分类问题相混淆 14. 高级优化
14.1 高级优化方法
梯度下降是一种广泛用于机器学习的优化算法是线性回归和逻辑回归等许多算法以及神经网络早期实现的基础。
但事实证明现在有一些其他优化算法可以最小化成本函数甚至比梯度下降更好。 如上图我们进行梯度下降我们回注意到梯度下降的每一步几乎都在同一个方向上当看到这种情况时我们会想为什么我们不把Alpha变大我们能不能拥有一个算法自动增加Alpha这样就可以采取更大的步长并更快的达到最小值。
有一种Adam算法可以做到这一点。 当学习率较大时Adam算法也可以自动将学习率调整变小这样就可以采用更平滑的路径走向成本函数的最小值。
Adam 是一种可以替代传统随机梯度下降过程的一阶优化算法它能基于训练数据迭代地更新神经网络权重。
Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率 α \alpha α更新所有的权重学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。
adam算法并没有使用单一的全局学习率它对模型的每个参数使用不同的学习率。 Adam算法背后的思想是如果参数 w j w_j wj或 b b b似乎继续沿大致相同的方向移动此时应增加该参数的学习率。
相反如果参数不断来回振荡此时应该减小该参数的学习率。
14.2 其他的网络层类型
到目前为止我们所使用的神经网络层都是密集层类型其中该层的每个神经元都从前一层获得所有激活输入。
事实证明还有一些其他类型的层以及其他属性。
在密集层时我们一直在使用神经元的激活比如第二个隐藏层是前一层的每个激活的函数。
对于某些应用层序设计神经网络的人可能会选择使用其他不同类型的层。
其中另外一种层叫做卷积层。
例子
左边部分显示的是输入X是一个手写数字9。我们要做的是构建一个隐藏层它将计算不同的激活作为这个输入图像X的函数。
隐藏层中的每个神经元并不能查看这个图像中的所有像素每个元素只能查看部分指定区域的元素。 那么为什么要这么处理呢为什么不让神经元查看图像的所有像素而只查看部分像素呢
首先这么处理加快了计算速度。
其次使用这种称为卷积层的神经网络可以需要更少的训练数据或者也不太容易过度拟合。
这种每个神经元只查看输入图像区域的层类型称为卷积层。
如果神经网络中有多个卷积层则有时会将该神经网络称为卷积神经网络CNN。
模型模型结构特征表示能力训练效率模型复杂度鲁棒性CNN局部连接、权值共享的卷积结构对局部特征提取能力强适用于图像、语音等领域训练效率高可并行化处理模型结构相对简单参数较少不适用于处理序列数据对数据噪声、变形等鲁棒性一般RNN具有循环连接的结构如LSTM、GRU等适用于处理序列数据能够捕捉序列信息的演化过程训练效率相对较低难以并行化模型结构相对复杂参数较多对数据噪声、变形等具有一定的鲁棒性Transformer基于自注意力机制的结构具有较强的建模能力适用于处理序列、图像等多种数据形式训练效率较高可并行化处理模型结构较为复杂参数较多对数据噪声、变形等具有较强的鲁棒性
卷积神经网络举例 15. 模型评估与选择
15.1 决定下一步做什么 当我们在训练模型时发现这个模型在预测中出现了无法接受的大错误那么接下来该尝试做些什么呢
我们通常可以尝试许多不同的方法。
获取更多的训练示例尝试选择较小的特征集增加更多的特征尝试添加多项式特征增大或者减小正则化参数$\ \lambda \ $的值
15.2 模型评估
以学习预测房价函数为例。假设我们已经训练模型预测函数作为房子大小X的函数。
对于四阶多项式的模型 我们不太喜欢上面的这个模型即使该模型已经很好的拟合了训练数据但是我们认为它无法泛化到不存在于训练集中的新示例。
所以当我们预测价格时只是房子的大小这一单一特征我们可以像这样绘制模型但是这不是一个好的模型。
评估模型的方法
如果我们有一个训练集而且这是一个只有10个例子的小训练集而不是用我们所有的数据来训练模型的参数w和b我们可以将训练集分成两个子集即训练集和测试集。我们在训练集的数据上来训练模型然后在测试集的数据上测试模型的表现。
大部分数据作为训练集一小部分数据作为测试集。
通过分别计算 J t r a i n J_{train} Jtrain和 J t e s t J_{test} Jtest可以衡量该模型在训练集和测试集上的表现。
回归问题
因此为了训练模型并对其进行评估下面是使用具有平方误差成本的线性回归的样子。 首先通过最小化wb的成本函数 J J J来拟合参数。
然后计算该模型在测试集上的均方误差。不包括正则项
然后计算该模型在训练集上的均方误差。不包括正则项
分类问题
例如我们要对0和1的手写数字进行分类与之前一样我们可以通过最小化成本函数来拟合参数以找到wb。 首先通过最小化wb的成本函数 J J J来拟合参数。
然后计算该模型在测试集上的均方误差。不包括正则项
然后计算该模型在训练集上的均方误差。不包括正则项
当将机器学习应用于分类问题时实际上还有一种可能更常用的 J t e s t J_{test} Jtest和 J t r a i n J_{train} Jtrain的定义。不使用逻辑损失来计算测试误差而是使用训练误差来衡量测试集的分数和算法错误分类的训练集的分数。因此特别是在测试集上我们可以让算法对每个测试示例做出1或0的预测。 个人理解对于逻辑回归来说可以通过计算误判占比的方法来代表成本函数比如test set中误判的占比是10那么 J t e s t J_{test} Jtest就是0.1 15.3 模型选择及交叉验证测试集的训练方法
当模型的参数 w w w和 b b b已经适合训练集训练误差可能不是一个很好的指标来表明算法的效果如何他不能代表该模型对测试集的泛化能力。
如果拟合一个函数来预测房价或者其他一些回归问题我们可能会考虑的一种模型是拟合这样的线性模型。
下面我们用 d 1 d1 d1来表示拟合一阶多项式 d 2 d2 d2来表示拟合二阶多项式… 我们可以查看上面所有计算出来的 J t e s t J_{test} Jtest看看哪一个可以得到最小值。
假设我们发现 J t e s t ( w 5 , b 5 ) J_{test}(w^{5},b^{5}) Jtest(w5,b5)的值是最小的那么我们可以认为 d 5 d5 d5这个模型的效果最好因此我们选择该模型。
但是这个过程存在着缺陷这样选择一个测试数据误差最小的模型泛化误差低于实际误差个人理解可能会导致过拟合。
另一方面这里的测试数据用作检测模型表现的同时同时也用作了模型的选择。
如果我们想自动选择一个模型比如决定使用什么次数的多项式下面是我们如何修改训练和测试程序来进行模型选择。这里的模型选择是指在不同的模型中进行选择。
方法
我们将数据不再是分为两部分即训练集和测试集。而是将我们的数据分成三个不同的子集我们将其称为训练集、交叉验证集和测试集。如我们可以将60%的数据作为训练集20%的数据作为交叉验证集20%的数据作为测试集。cv代表交叉验证集。 交叉验证集Cross-Validationcv是一个额外的数据集我们将使用它来检查或信任检查不同模型的有效性或者准确性。
交叉验证集也可以简称为验证集或者开发集。
在训练集交叉验证集测试集的子集上我们可以使用下面的公式来计算训练误差交叉验证误差和测试误差。这些术语中除了被称为交叉验证误差外通常也简称为验证误差开发集误差或者开发误差。 有了这三种算法性能的衡量标准我们就可以着手进行模型的选择。 和前面一样我们采取同样的方法进行计算误差但是在模型选择时我们使用交叉验证集而不再使用测试集进行计算。
然后选择 J c v J_{cv} Jcv即交叉验证误差最小的模型此时没有任何的参数 w w w和 b b b拟合到测试集上我们此时再计算该模型在测试集上的误差 J t e s t J_{test} Jtest。
上述方法也适用于在其他类型的模型中进行选择如神经网络架构中可以帮助我们确定神经网络中有多少层以及每层应该有多少个隐藏的神经元。 训练、选择模型、测试 16. 诊断与改进
16.1 通过偏差与方差进行诊断
Bias是用所有可能的训练数据集训练出的所有模型的输出的平均值与真实模型的输出值之间的差异。
Variance是不同的训练数据集训练出的模型输出值之间的差异。
欠拟合模型不能适配训练样本有一个很大的偏差。
过拟合模型很好的适配训练样本但在测试集上表现很糟有一个很大的方差。
查看学习算法的偏差和方差可以为我们下一步尝试提供很好的指导。 理解偏差与方差 诊断方差与偏差 16.2 正则化、偏差、方差
下面我们来看一下正则化特别是正则化参数 λ \lambda λ如何影响偏差与方差进而影响算法的性能。
下面的例子中我们使用四阶多项式同时使用正则化来拟合这个模型。 当我们取 λ 1000 \lambda1000 λ1000时此时 λ \lambda λ的值很大导致 w 1 ≈ 0 w 2 ≈ 0 w_1\approx0w_2\approx0 w1≈0w2≈0。所以此时 f w ⃗ , b ( x ⃗ ) b f_{\vec{w},b}(\vec{x})b fw ,b(x )b。
当我们取 λ 0 \lambda0 λ0此时 λ \lambda λ的值很小相当于没有进行正则化处理所以我们只是拟合了一个没有进行正则化的四阶多项式我们会得到一个过度拟合的曲线。
当我们取 λ \lambda λ为一个中间合适值的时候它会恰到好处并且适合小 J t r a i n J_{train} Jtrain和小 J c v J_{cv} Jcv的数据。如果我们想确定什么是用于正则化参数良好的 λ \lambda λ值交叉验证是一个很好的方法。 使用交叉验证的方法来帮助我们确定选择正则化参数 λ \lambda λ类似于使用交叉验证选择多项式模型的过程。 分别选取不同的 λ \lambda λ的值然后分别计算它们的代价函数取得最优参数 w b wb wb然后计算 J c v J_{cv} Jcv选取 J c v J_{cv} Jcv对应最小的 λ \lambda λ的值。 16.3 制定一个用于性能评估的基准
为了判断训练误差是否高事实证明查看训练误差是否远高于人类的表现水平很有用。
当我们将其与人类水平的性能进行基准测试时我们发现该算法实际上在训练集上表现相当不错但更大的问题是交叉验证误差远高于训练误差。
基准性能水平是指我们可以合理地希望我们的学习算法最终达到的误差水平。
建立基准性能水平的一种常见方法是衡量人类在这项任务上的表现。
另一种建立基准性能水平的方法是以其他人已经实现的算法性能最为基准性能水平。
或者我们可以根据以往的经验来建立基准性能水平。
16.4 学习曲线
学习曲线是一种帮助理解我们的学习算法如何作为它拥有的经验量的函数的方法。这里的经验是指它拥有的训练示例的数量。
下面绘制一个适合二阶多项式二次函数模型的学习曲线。我们将会值交叉验证误差和训练误差。 由上图我们可以看出训练集的大小变大我们会得到一个更好的模型因此交叉验证误差变小。但是训练集变大训练误差反而也随之变大了。为什么会导致这样呢 由上图我们可以理解随着训练集的增大训练误差是增大的。但是训练集的增大会使模型的泛化能力提高。
下面看一下学习曲线对于具有高偏差的平均值与具有高方差的平均值的学习曲线是什么样的。
高偏差 高方差
增大数据集可以缓解过拟合。 16.5 方差与偏差
增加训练集数量有助于解决高方差、过拟合问题。减少使用的特征有助于解决高方差、过拟合问题。增加额外的特征有助于解决高偏差、欠拟合问题。添加多项式特征有助于解决高偏差、欠拟合问题。降低正则化参数有助于解决高偏差、欠拟合问题。增大正则化参数有助于解决高方差、过拟合问题。
综上所述
解决高方差、过拟合问题增大训练集、减少特征、增大正则化参数解决高偏差、欠拟合问题增加特征、添加多项式特征、降低正则化参数
高方差和高偏差都不好因为它们会损害算法的性能。 17. 机器学习系统开发过程 17.1 误差分析过程
假设我们有500个交叉验证示例并且我们的算法错误分类了这500个交叉验证示例中的100个错误分析只是手动查看这100个示例并试图深入了解算法出错的地方。
17.2 添加更多数据
数据增强也叫数据扩增意思是在不实质性的增加数据的情况下让有限的数据产生等价于更多数据的价值。 数据增强分类
数据增强可以分为有监督的数据增强和无监督的数据增强方法。其中有监督的数据增强又可以分为单样本数据增强和多样本数据增强方法。无监督的数据增强分为生成新的数据和学习增强策略两个方向。
有监督数据增强即采用预设的数据变换规则在已有数据的基础上进行数据的扩增。 它包含单样本数据增强和多样本数据增强。 其中单样本又包括几何操作类颜色变换类。
所谓单样本数据增强即增强一个样本的时候全部围绕着该样本本身进行操作包括几何变换类颜色变换类等。
多样本数据增强不同于单样本数据增强多样本数据增强方法利用多个样本来产生新的样本。
17.3 迁移学习
对于我们没有那么多数据的应用程序迁移学习是一种很好的技术它可以让我们使用来自不同任务的数据来帮我们的应用程序。
工作原理
假设我们想要识别从0到9点手写数字但是我们没有这些手写数字的那么多标记数据。假设我们找到了一个非常大的数据集其中包含一百万张猫、狗、汽车、人等的图片一千个类别。然后我们可以开始在这个包含一千个不同类别的一百万张图像的大型数据集上训练神经网络并训练算法将图像X作为输入并学习识别这1000个不同类别中的任何一个。
要应用迁移学习我们要做的是复制此神经网络。但是对于最后一层我们将消除输出层并用一个更小的输出层替换它只有10个而不是1000个输出单元。在迁移学习中我们可以使用前四层的参数实际上是除最终输出层之外的所有层作为参数的起点然后运行优化算法例如梯度下降或Adam优化算法使用来自该神经网络的值在顶部初始化的参数。 具体来说如何训练此神经网络参数有两种选择
只训练输出层参数我们可以将参数 w [ 1 ] , b [ 1 ] ⃗ , w [ 2 ] , b [ 2 ] ⃗ w^{[1]},\vec{b^{[1]}},w^{[2]},\vec{b^{[2]}} w[1],b[1] ,w[2],b[2] 到 w [ 4 ] , b [ 4 ] ⃗ w^{[4]},\vec{b^{[4]}} w[4],b[4] 作为顶部的值并固定它们然后使用随机梯度下降或Adam等算法仅更新 w [ 5 ] , b [ 5 ] ⃗ w^{[5]},\vec{b^{[5]}} w[5],b[5] 。训练神经网络的所有参数包括 w [ 1 ] , b [ 1 ] ⃗ , w [ 2 ] , b [ 2 ] ⃗ w^{[1]},\vec{b^{[1]}},w^{[2]},\vec{b^{[2]}} w[1],b[1] ,w[2],b[2] 一直到 w [ 5 ] , b [ 5 ] ⃗ w^{[5]},\vec{b^{[5]}} w[5],b[5] 但前四层参数将使用我们在上面训练过的值。
如果我们有非常小的训练集那么使用第一种选择会好一点如果我们拥有一个稍微大一点的训练集那么使用第二种选择会好一点。
这两个步骤首先在大型数据集上进行训练然后在较小的数据集上进一步调整参数这一步被称为监督预训练。
第二步称为微调我们可以在其中获取已初始化或从监督预训练中获得的参数然后进一步运行梯度下降以微调权重以适应您可能拥有的手写数字识别的特定应用。
迁移学习的一个好处是也许我们不需要称为进行监督预训练的人。
17.4 机器学习项目完整周期
第一步确定项目范围第二步收集数据第三步训练模型第四部部署项目 机器学习中有一个不断发展的领域叫做MLOPsMachine Learning Operations。主要工作为系统的构建、部署和维护机器学习系统的实践。做这些事情以确保我们的机器学习模型可靠、可扩展、具有良好的规律、受到监控。
17.5 倾斜数据集的误差指标
如果我们正在开发一个机器学习应用程序其中正例与负例的比例非常倾斜与50:50相差很远那么通常错误指标如精准度效果会不好。
要解释清楚精确率和召回率得先解释混淆矩阵二分类问题的混淆矩阵由 4 个数构成。
假阴性FN 算法预测为负例N实际上是正例P的个数即算法预测错了False
真阴性TN算法预测为负例N实际上也是负例N的个数即算法预测对了True
假阳性FP算法预测为正例P实际上是负例N的个数即算法预测错了False
真阳性TP算法预测为正例P实际上也是正例P的个数即算法预测对了True。 精确率 p r e c i s i o n T P T P F P precision\frac{TP}{TPFP} precisionTPFPTP 所以精准率就是“预测为正例的那些数据里预测正确的数据个数”。
召回率 r e c a l l T P T P F N recall \frac{TP}{TPFN} recallTPFNTP 所以召回率就是“真实为正例的那些数据里预测正确的数据个数”。 精确率针对预测数据来讲 召回率针对真实数据来讲 17.6 精确率与召回率的权衡
对于预测患者是否患有某种病高精度意味着如果患者被诊断患有这种罕见的疾病那么该患者可能确实患有这种疾病这是一个准确的判断。高召回率意味着如果有患者患有这种罕见疾病算法可能会正确识别出他们确实患有这种疾病。
调和均值
精准率和召回率是此消彼长的即精准率高了召回率就下降在一些场景下要兼顾精准率和召回率就有 F1 score。
F1值是来综合评估精确率和召回率当精确率和召回率都高时F1也会高
F1的公式为 2 F 1 1 P 1 R \frac{2}{F_1}\frac{1}{P}\frac{1}{R} F12P1R1 有时候我们对精确率和召回率并不是一视同仁我们用一个参数 β \beta β来度量两者之间的关系。 F β ( 1 β 2 ∗ P ∗ R ) β 2 ∗ P R F_\beta\frac{(1\beta^2*P*R)}{\beta^2*PR} Fββ2∗PR(1β2∗P∗R) 如果 β \beta β 1召回率有更大的影响
如果 β \beta β1精确率有更大的影响
如果 β \beta β 1精确率和召回率影响力相同和 F 1 F_1 F1 形式一样
灵敏度和特异度
灵敏度真阳率召回率识别的正例占所有实际正例的比例
公式 T P R T P T P F N TPR\frac{TP}{TPFN} TPRTPFNTP 特异度假阳率识别的假阳例占所有实际负例的比例
公式 T P R T P T P F N TPR\frac{TP}{TPFN} TPRTPFNTP 18. 决策树
18.1 决策树模型简介
使用猫分类作为示例。假如我们正在经营一家猫收养中心并给定了一些特征我们想训练一个分类器来快速告诉这些动物是否为猫。
下面为10个训练示例。与这10个示例相关联我们拥有关于动物的耳朵形状、面部形状、是否有胡须的特征然后是我们想要预测这只动物是否为猫的真实标签。 这是一个二分类任务。目前每个特征都只有两个可能的值后面会讨论两个以上可能值的问题以及连续值特征。
决策树是一种机器学习的方法。决策树的生成算法有ID3, C4.5和CART等。决策树是一种树形结构其中每个内部节点表示一个属性上的判断每个分支代表一个判断结果的输出最后每个叶节点代表一种分类结果。 上图为刚刚看到的数据集上训练决策树学习算法后可能获得的模型的示例。这些椭圆和矩形都称为树中的一个节点。
该模型做出分类决策的方式是从树的最顶层节点开始这称为树的根节点。
图中的所有椭圆节点都称为决策节点。矩形称为叶子节点。
每个方框代表一个节点。每个非叶子节点有2个分支一个是判定True一个判定False。分别走两个不同的分支。叶子节点具有决策权。任何一个输入从root出发总是会达到且唯一到达一个叶子节点。这就是决策树的工作原理。
18.2 决策树学习过程
下面让我们看一下构建决策树需要做的事情的全过程。
给定一个包含10个猫狗示例的训练集。
决策树学习的第一步是我们必须决定在根节点使用什么特征这是决策树最顶端的一个节点。
假设我们使用耳朵形状作为根节点使用的特征我们会根据耳朵特征的值将它进行拆分。
第二步只是关注决策树的左侧部分左侧分支以决定将哪些节点放在那里。特别的是我们接下来要继续使用什么特征进行拆分。假设我们在左侧分支继续使用面部形状进行拆分。
第三步在右侧分支重复第二步的步骤。
这便是决策树的构建过程。 在构建的过程中有几个关键的决定 如何选择在每个节点上使用哪些特征进行拆分 决策树将选择要拆分的特征以尝试最大化纯度。纯度想获得尽可能接近所有猫或所有狗的子集 决定何时停止分裂 当时一个节点100%是一个类别的时候停止分裂。 或者我们可以决定在分裂时停止分裂避免导致树超过最大深度。最大深度是我们可以直接设定的一个参数 我们要限制决策树深度的一个原因是确保我们的树不会变得太大和笨重其次通过保持树小它不太容易过度拟合。 我们可以用来决定停止拆分的另一个标准可能是优先级分数的改进。 如果一个节点的示例数量低于某个阀值我们可以决定停止分裂。
18.3 纯度
熵它是衡量一组数据不纯程度的指标。
给定一组这样的六个示例我们有三只猫和三只狗我们将定义 p 1 p_1 p1为猫的示例的分数。本例中的 p 1 p_1 p1等于 3 6 \frac{3}{6} 63。
我们将使用一个称为熵的函数来测量一组示例的不纯度它看起来像这样。 该熵函数表示为 H ( p 1 ) H(p_1) H(p1)。其水平轴是 p 1 p_1 p1即样本中猫的比例垂直轴是熵的值。
定义 p 0 p_0 p0为不是猫的示例的分数。 p 0 1 − p 1 H ( p 1 ) − p 1 l o g 2 ( p 1 ) − p 0 l o g 2 ( p 0 ) − p 1 l o g 2 ( p 1 ) − ( 1 − p 1 ) l o g 2 ( 1 − p 1 ) p_01-p_1 \\ H(p_1)-p_1log_2(p_1)-p_0log_2(p_0)-p_1log_2{(p_1)}-(1-p_1)log_2(1-p_1) p01−p1H(p1)−p1log2(p1)−p0log2(p0)−p1log2(p1)−(1−p1)log2(1−p1)
18.4 选择拆分信息增益
在构建决策树时我们决定在节点上拆分哪个特征的方式将基于哪种特征可以最大程度的减少熵或减少杂质或最大化纯度。
在决策树的学习中熵的减少称为信息增益。
计算信息增益从而选择在决策树的每个节点上使用哪些特征进行拆分。
以让我们来决定在我们刚才构建的决策树的根节点使用什么特征来识别猫与非猫为例。 如上图要对这些熵值进行比较不如对他们进行加权平均进行比较。
我们选择拆分的方法是计算这三个数字并选择最小的一个。上面我们计算的0.280.030.12这些被称为信息增益它衡量的是由于分裂而导致的树中熵的减少。
事实证明决定何时不再进一步分裂的停止标准之一是熵值的减少是否太小。
上面数据中0.28最大代表选择使用耳朵特征进行拆分时熵值减少最大所以在根节点上使用耳朵形状特征进行拆分。
计算信息增益的一般公式 I n f o r m a t i n g a i n H ( p 1 r o o t ) − ( w l e f t H ( p 1 l e f t ) w r i g h t H ( p 1 r i g h t ) ) Informatin gain H(p_1^{root})-(w^{left}H(p_1^{left})w^{right}H(p_1^{right})) InformatingainH(p1root)−(wleftH(p1left)wrightH(p1right))
18.5 整合
下面是构建决策树的全过程。
从树的根节点处的多有训练示例开始计算所有可能特征的信息增益并选择要拆分的特征从而提供最高的信息增益。选择此特征后我们将根据所选特征将数据集拆分称为两个子集并创建树的左右分支并将训练示例发送到左侧或右侧分支具体取决于该特征的值。然后将继续在树的左右分支上重复拆分过程。停止条件是当一个节点100%是单个类时有的类的熵已经到达0或者当进一步拆分节点将导致树超过我们设置的树的最大深度时或者如果信息从额外的拆分小于阀值或者节点中的示例数量低于阀值。
18.6 独热编码One-hot
无论我们是否拥有可以采用两个以上离散值的特征我们将可以使用**独热编码One-hot**来解决此类特征。
one-hot 编码用于将离散的分类标签转换为二进制向量。 注意这里有两个关键词第一个是离散的分类第二个是二进制向量。 如果一个分类特征可以去K个可能的值在我们的例子中k是三个那么我们将通过创建k个只能取0或1的二进制特征来替换它。 使用独热编码对分类特征进行编码的想法也适用于训练神经网络。 18.7 连续有价值的特征
在前面所讲到的例子汁之上增加一个特征即动物的重量。 对于动物的体重特征我们该如何进行拆分呢
下图为根部的数据图。 分别取不同的阀值计算信息增益选择最大信息增益的所以对应的阀值。
18.8 回归树
在之前决策树只用于分类任务下面将决策树运用于回归任务中。
下面例子中使用我们之前描述的信息使用动物猫和狗将其耳朵形状、面部形状、胡须三个特征作为输入来预测体重信息。 下面我们已经为这个回归问题构建了一棵树其根节点在耳朵形状上进行分裂左右子树都在面部形状特征上进行分裂。 此时如果有一个测试示例这个测试示例具有特征尖耳朵即圆脸那么这个动物的体重该如何预测呢
决策树将根据此叶子节点中训练示例的平均体重进行预测根据上图计算则预测体重为8.35。 鉴于三个可能的特征要在根节点上进行拆分我们该选择哪一个可以最好的预测动物的体重呢 注意此时不再根据信息增益进行选择 在构建回归树时我们不再是试图减少熵而是尝试减少每个数据子集的值Y的体重方差。
方差计算公式 S 2 1 n [ ( x 1 − x ) 2 ( x 1 − x ) 2 . . . ( x n − x ) 2 ] x i ( i 1 , 2 , 3 , . . . ) 各项值 x 各项平均值 S^2\frac{1}{n}[(x_1-x)^2(x_1-x)^2...(x_n-x)^2] \ \ \ \ x_i\, (i1,2,3,...)各项值 \ \ \ \ x各项平均值 S2n1[(x1−x)2(x1−x)2...(xn−x)2] xi(i1,2,3,...)各项值 x各项平均值 我们拆分评估的方法是我们将计算与之前相同的 w l e f t w_{left} wleft和 w r i g h t w_{right} wright作为进入左右分支的示例的分数。然后计算拆分后的加权平均方差。
选择拆分的一个好方法是选择最低的加权平均方差值所对应的特征进行拆分。
就像分类问题一样我们不只是测量平均加权熵我们测量了熵的减少这就是信息增益。对于回归树我们也将类似的计算方差的减少。 我们将选择最大的加权平均方差减少所对应的特征进行拆分。
18.9 使用多个决策树
使用单个决策树的缺点之一是该决策树可能对数据中的微小变化高度敏感。
使决策树更健壮的一种解决方案是构建很多决策树称为树集合。 如上图更改根节点的数据集我们左右子树中获得的数据子集会变得完全不同从而构建出完全不同的子树。因此只改变一个训练样本会导致在根部不同的分裂从而产生完全不同的树这使得该算法不那么健壮。
也就是说如果我们不仅训练单个决策树而是训练一大堆不同的决策树我们会得到更准确的预测。使用多个决策树的目的就是让我们的算法更加健壮。
18.10 有放回抽样
为了构建树集成我们需要一种称为替换采样的技术。
有放回抽样 有放回抽样应用于构建树集成的方式如下
我们讲构建多个随机训练集这些训练集都与我们的原始训练集略有不同。特别的我们将以10个猫和狗为例。我们把10个示例放入一个理论包中。我们将创建一个新的随机训练集其中包含10个与原始数据集大小完全相同的示例。我们这样做的方式是我们正在接触并挑选一个随机样本。假设我们得到了这个训练示例然后我们把它放回袋子里然后再次随机挑选一个训练样本然后重复上诉操作。 有放回抽样让我们可以构建一个新的训练集它与我们原来的训练集有点相似但也有很大的不同。事实证明这将是构建树集合的关键构建块。
18.11 随机森林
随机森林它是一种强大的树样本算法比使用单个决策树效果更好。
构建随机森林 假如B为100则我们构建了一个包含100棵不同树的集合然后当我们尝试进行预测时我们可以让这些树对正确的最终预测进行投票。
事实证明将B设置的更大不会损害性能但是超过某个点后我们最终会得到收益递减的结果。
上诉这种树集成的特定实例创建有时也称为袋装决策树。
对这个算法进行修改并将该算法从反向决策树更改为随机森林算法。通常这样做的方法是在每个音符上选择一个特征用于切割如果最终特征可用。
机器学习中有两种任务回归和分类而随机森林可以同时胜任这两种任务。其中分类任务是对离散值进行预测比如将一景图像中的植被建筑水体等地物类型分类回归任务是对连续值进行预测比如根据已有的数据预测明天的气温是多少度预测明天某基金的价格。
随机森林是属于集成学习其核心思想就是集成多个弱分类器以达到三个臭皮匠赛过诸葛亮的效果。随机森林采用Bagging的思想所谓的Bagging就是
每次有放回地从训练集中取出 n 个训练样本组成新的训练集利用新的训练集训练得到M个子模型对于分类问题采用投票的方法得票最多子模型的分类类别为最终的类别对于回归问题采用简单的平均方法得到预测值。
下面开始构建决策树
第一步T中共有N个样本有放回的随机选择N个样本。这选择好了的N个样本用来训练一个决策树作为决策树根节点处的样本。
第二步当每个样本有M个属性时在决策树的每个节点需要分裂时随机从这M个属性中选取出m个属性满足条件m M。然后从这m个属性中采用某种策略比如说信息增益来选择1个属性作为该节点的分裂属性。
第三步决策树形成过程中每个节点都要按照步骤2来分裂一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
第四步按照步骤1~3建立大量的决策树这样就构成了随机森林了。
18.12 XGBoost
目前决策树集成或决策树最常用的方法或实现有一个名为XGBoost的算法。 1、XGboost的基本组成元素是决策树我们将这些决策树成为”弱学习器“这些”弱学习器“共同组成了XGboost 2、组成XGBoost的决策树之间是有先后顺序的后一棵决策树的生成会考虑前一棵决策树的预测结果即将前一棵决策树的偏差考虑在内在目标函数中有体现 3、生成每棵决策树使用的数据集是整个数据集。所以可以将每棵决策树的生成都看作是一个完整的决策树生成过程 一个新样本的预测新样本依次进入XGBoost的每棵决策树。在第一棵决策树有一个预测值在第二棵决策树有一个预测值依次类推直到进入完所有”弱学习器“决策树。最后将“在每一颗决策树中的值”相加即为最后预测结果。
XGboost还可以很好的选择默认的分裂标准和何时停止分裂的标准并且内置了正则化以防止过度拟合。
18.13 何时使用决策树
决策树和树集成
决策树和树集成通常适用于表格数据也称为结构化数据。这意味着如果我们的数据看起来像一个巨大的电子表格那么决策树就值得考虑。
不建议在非结构化数据上使用决策树或树集成如图像音频等。
决策树和树集成的一大优势是它们的训练速度非常快。
小决策树可能是人类可解释的。
神经网络
与决策树和树集成相比它适用于所有类型的数据包括结构化数据和非结构化数据以及包含结构化数据和非机构化数据的混合数据。
但是不利的一面是神经网络可能比决策树慢。
神经网络可以和迁移学习一起工作。
另外如果我们正在构建一个由多个机器学习模型协同工作的系统那么将多个神经网络串在一起并进行训练可能比多个决策树更容易。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919937.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!