--- title: "机器学习" date: 2020-04-07T14:56:58+08:00 draft: false --- # 基本概念 ### 迭代学习 迭代学习可能会让您想到“[Hot and Cold](http://www.howcast.com/videos/258352-how-to-play-hot-and-cold/)”这种寻找隐藏物品(如顶针)的儿童游戏。在我们的游戏中,“隐藏的物品”就是最佳模型。刚开始,您会胡乱猜测(“w1 的值为 0。”),等待系统告诉您损失是多少。然后,您再尝试另一种猜测(“w1 的值为 0.5。”),看看损失是多少。实际上,如果您以正确方式玩这个游戏,通常会越来越接近目标。这个游戏真正棘手的地方在于尽可能高效地找到最佳模型。 下图显示了机器学习算法用于训练模型的迭代试错过程:  ### 关于梯度下降法 **回归问题产生的损失与权重图为凸形。** 凸形问题只有一个最低点;即只存在一个斜率正好为 0 的位置。这个最小值就是损失函数收敛之处。 通过计算整个数据集中 w1 每个可能值的损失函数来找到收敛点这种方法效率太低。我们来研究一种更好的机制,这种机制在机器学习领域非常热门,称为**梯度下降法**。 梯度下降法的第一个阶段是为 w1 选择一个起始值(起点)。起点并不重要;因此很多算法就直接将 w1 设为 0 或随机选择一个值。下图显示的是我们选择了一个稍大于 0 的起点:  - 梯度下降法算法会计算损失曲线在起点处的梯度。简而言之,**梯度**是偏导数的矢量; 梯度就有两个特征,方向和大小。 - 为了确定损失函数曲线上的下一个点,梯度下降法算法会将梯度大小的一部分与起点相加,如下图所示:  - **一个梯度步长将我们移动到损失曲线上的下一个点。** 然后,梯度下降法会重复此过程,逐渐接近最低点。 ### **学习速率(有时也称为步长)** **超参数**是编程人员在机器学习算法中用于调整的旋钮。大多数机器学习编程人员会花费相当多的时间来调整学习速率。 如果您选择的学习速率过小,就会花费太长的学习时间:  如果您指定的学习速率过大,下一个点将永远在 U 形曲线的底部随意弹跳,就好像量子力学实验出现了严重错误一样:  ### **降低损失 (Reducing Loss):随机梯度下降法** 在梯度下降法中,**批量**指的是用于在单次迭代中计算梯度的样本总数到目前为止,我们一直假定批量是指整个数据集。就 Google 的规模而言,数据集通常包含数十亿甚至数千亿个样本。 此外,Google 数据集通常包含海量特征。因此,一个批量可能相当巨大。 如果是超大批量,则单次迭代就可能要花费很长时间进行计算。 通过从我们的数据集中随机选择样本,我们可以通过小得多的数据集估算(尽管过程非常杂乱)出较大的平均值。 **随机梯度下降法** (**SGD**) 将这种想法运用到极致,它每次迭代只使用一个样本(批量大小为 1)。 如果进行足够的迭代,SGD 也可以发挥作用,但过程会非常杂乱。 “随机”这一术语表示构成各个批量的一个样本都是随机选择的。 `常用的方法` **小批量随机梯度下降法**(**小批量 SGD**)是介于全批量迭代与 SGD 之间的折衷方案。小批量通常包含 10-1000 个随机选择的样本。小批量 SGD 可以减少 SGD 中的杂乱样本数量,但仍然比全批量更高效。 **缩放特征值** **缩放**是指将浮点特征值从自然范围(例如 100 到 900)转换为标准范围(例如 0 到 1 或 -1 到 +1)。如果某个特征集只包含一个特征,则缩放可以提供的实际好处微乎其微或根本没有。不过,如果特征集包含多个特征,则缩放特征可以带来以下优势: - 帮助梯度下降法更快速地收敛。 - 帮助避免“NaN 陷阱”。在这种陷阱中,模型中的一个数值变成 [NaN](https://wikipedia.org/wiki/NaN)(例如,当某个值在训练期间超出浮点精确率限制时),并且模型中的所有其他数值最终也会因数学运算而变成 NaN。 - 帮助模型为每个特征确定合适的权重。如果没有进行特征缩放,则模型会对范围较大的特征投入过多精力。 您不需要对每个浮点特征进行完全相同的缩放。即使特征 A 的范围是 -1 到 +1,同时特征 B 的范围是 -3 到 +3,也不会产生什么恶劣的影响。不过,如果特征 B 的范围是 5000 到 100000,您的模型会出现糟糕的响应。 ### 处理极端离群值 **一个非常非常长的尾巴。** 如何最大限度降低这些极端离群值的影响?一种方法是对每个值取对数:  **图 5. 对数缩放仍然留有尾巴。** 对数缩放可稍稍缓解这种影响,但仍然存在离群值这个大尾巴。我们来采用另一种方法。如果我们只是简单地将 `roomsPerPerson` 的最大值“限制”为某个任意值(比如 4.0),会发生什么情况呢?  ``` 要处理好一些极短值,因为对个例的过分分析没有意义。 ``` ### 特征组合 (Feature Crosses):对非线性规律进行编码 **特征组合**是指通过将两个或多个输入特征相乘来对特征空间中的非线性规律进行编码的合成特征。“cross”(组合)这一术语来自 [*cross product*](https://wikipedia.org/wiki/Cross_product)(向量积)。我们通过将 x1 与 x2 组合来创建一个名为 x3 的特征组合: x3=x1x2 我们像处理任何其他特征一样来处理这个新建的 x3 特征组合。线性公式变为: y=b+w1x1+w2x2+w3x3 线性算法可以算出 w3 的权重,就像算出 w1 和 w2 的权重一样。换言之,虽然 w3 表示非线性信息,但您不需要改变线性模型的训练方式来确定 w3 的值。 这只是一个样例,具体的组合依据具体情况而定 ### **正则化**。 请查看以下**泛化曲线**,该曲线显示的是训练集和验证集相对于训练迭代次数的损失。  **图 1. 训练集和验证集损失。** 图 1 显示的是某个模型的训练损失逐渐减少,但验证损失最终增加。换言之,该泛化曲线显示该模型与训练集中的数据[过拟合](https://developers.google.com/machine-learning/crash-course/generalization/peril-of-overfitting?hl=zh-cn)。根据[奥卡姆剃刀定律](https://developers.google.com/machine-learning/crash-course/generalization/peril-of-overfitting?hl=zh-cn#occam), 我们可以通过降低复杂模型的复杂度来防止过拟合,这种原则称为**正则化**。 我们的训练优化算法是一个由两项内容组成的函数:一个是**损失项**,用于衡量模型与数据的拟合度,另一个是**正则化项**,用于衡量模型复杂度。 模型开发者通过以下方式来调整正则化项的整体影响:用正则化项的值乘以名为 **lambda**(又称为**正则化率**)的标量。也就是说,模型开发者会执行以下运算: minimize(Loss(Data|Model)+λ complexity(Model)) 在选择 lambda 值时,目标是在简单化和训练数据拟合之间达到适当的平衡: - 如果您的 lambda 值过高,则模型会非常简单,但是您将面临数据欠拟合的风险。您的模型将无法从训练数据中获得足够的信息来做出有用的预测。 - 如果您的 lambda 值过低,则模型会比较复杂,并且您将面临数据过拟合的风险。您的模型将因获得过多训练数据特点方面的信息而无法泛化到新数据。 # 关于常见算法 ### k邻近算法 属于监督学习 首先先转化为标准向量几何空间中去,然后再计算,看离我们需要预测的点的距离谁最近,统计最近的k个点,跟具这几个点的类别,判断出该点的类别。 ### k-means聚类 属于无监督学习 Kmeans算法正是基于这一思想而生,让数据通过某种算法聚集,不再进行划分的方法称为**聚类算法**。 在聚类问题当中,一系列样本被模型根据数据的属性聚合在了一起,成为了同一个类别。这里的类别就称为这些样本的类簇(cluster)。每一个簇的中心点称为簇中心。所以,KMeans算法,顾名思义,就是将样本根据用户设置的K值,**一共聚类成K个类簇**。 具体算法可以看我的github实现样例。 # 关于numpy工具 - 关于截取数组 x[a:b,c:d]第一个是第一维,第二个是第二维,高维的以此类推。换成正方形就是行和列的选取,从a到b。 什么都不输入或者:,就代表全选。 ``` import numpy as np x=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(x[0:2, 0:2]) ``` - np.mean 求平均值 -
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up