机器学习速成课程: https://developers.google.cn/machine-learning/crash-course
目录
分类 (Classification):准确率(当您使用分类不平衡的数据集(比如正类别标签和负类别标签的数量之间存在明显差异)时,单单准确率一项并不能反映全面情况)
2.其他优化器(tf.train.AdagradOptimizer , tf.train.AdamOptimizer)
嵌套充当工具(映射到低维实矢量, 创建数据(不同类型,密集型数据)相似度)
训练参数:
线性回归
一种回归模型(一种模型,能够输出连续的值(通常为浮点值)),通过将输入特征进行线性组合输出连续值。
其实找直线的过程就是在做线性回归(让损失(损失函数)最小化)
泛化 (Generalization):过拟合的风险
- 我们从分布中随机抽取独立同分布 (i.i.d) 的样本。换言之,样本之间不会互相影响。(另一种解释:i.i.d. 是表示变量随机性的一种方式)。
- 分布是平稳的;即分布在数据集内不会发生变化。
- 我们从同一分布的数据划分中抽取样本。
- 想象有一个选择要展示的广告的模型。如果该模型在某种程度上根据用户以前看过的广告选择广告,则会违背 i.i.d. 假设。
- 想象有一个包含一年零售信息的数据集。用户的购买行为会出现季节性变化,这会违反平稳性。
如果违背了上述三项基本假设中的任何一项,那么我们就必须密切注意指标。
训练集和(验证集)测试集
请勿对测试数据进行训练。 如果您的评估指标取得了意外的好结果,则可能表明您不小心对测试集进行了训练。例如,高准确率可能表明测试数据泄露到了训练集。
机器学习中的调试通常是数据调试而不是代码调试。
归根结底最重要的是测试损失,因为它是真正用于衡量模型能否对新数据做出准确预测的标准
特征工程
像处理任何任务关键型代码一样谨慎处理您的数据。良好的机器学习依赖于良好的数据。
相关矩阵展现了两两比较的相关性,既包括每个特征与目标特征之间的比较,也包括每个特征与其他特征之间的比较。
在这里,相关性被定义为皮尔逊相关系数。
理想情况下,我们希望具有与目标密切相关的特征。
此外,我们还希望有一些相互之间的相关性不太密切的特征,以便它们添加独立信息。
特征组合
非线性问题,可以创建一个特征组合。特征组合是指通过将两个或多个输入特征相乘来对特征空间中的非线性规律进行编码的合成特征。
正则化(降低过拟合)
图 1显示的是某个模型的训练损失逐渐减少,但验证损失最终增加。换言之,该泛化曲线显示该模型与训练集中的数据过拟合。根据奥卡姆剃刀定律,或许我们可以通过降低复杂模型的复杂度来防止过拟合,这种原则称为正则化
现在,我们的训练优化算法是一个由两项内容组成的函数:一个是损失项(Loss),用于衡量模型与数据的拟合度,另一个是正则化项(complexity),用于衡量模型复杂度。
L2 正则化公式, 将正则化项定义为所有特征权重的平方和:complexity =
模型开发者通过以下方式来调整正则化项的整体影响:用正则化项的值乘以名为 lambda(又称为正则化率, 在选择 lambda 值时,目标是在简单化和训练数据拟合之间达到适当的平衡)的标量:
lambda 值过高,则模型会非常简单,但是您将面临数据欠拟合的风险
lambda 值过低,则模型会比较复杂,并且您将面临数据过拟合的风险
更改正则化参数产生的效果可能会与更改学习速率或迭代次数产生的效果相混淆。一种有用的做法(在训练一批固定的数据时)是执行足够多次迭代,这样早停法便不会起作用。
归根结底最重要的是测试损失,因为它是真正用于衡量模型能否对新数据做出准确预测的标准
逻辑回归(生成0-1概率值)
- 逻辑回归模型会生成概率
- 对数损失函数是逻辑回归的损失函数。 损失越小似然值(用于在已知某些观测所得到的结果时,对有关事物之性质的参数进行估值)越大
分类 (Classification)
分类 (Classification):指定阈值
为了将逻辑回归值映射到二元类别,您必须指定分类阈值(也称为判定阈值)。如果值高于该阈值,则表示“垃圾邮件”;如果值低于该阈值,则表示“非垃圾邮件”。
“调整”逻辑回归的阈值不同于调整学习速率等超参数。在选择阈值时,需要评估您将因犯错而承担多大的后果。例如,将非垃圾邮件误标记为垃圾邮件会非常糟糕。不过,虽然将垃圾邮件误标记为非垃圾邮件会令人不快,但应该不会让您丢掉工作。
分类 (Classification):准确率(当您使用分类不平衡的数据集(比如正类别标签和负类别标签的数量之间存在明显差异)时,单单准确率一项并不能反映全面情况)
对于二元分类,也可以根据正类别和负类别按如下方式计算准确率:
其中,TP = 真正例,TN = 真负例,FP = 假正例,FN = 假负例。
真正例(预测是并且实际就是是)是指模型将正类别样本正确地预测为正类别。同样,真负例(预测不是并且实际就是不是)是指模型将负类别样本正确地预测为负类别。
假正例(预测是但是实际是不是的)是指模型将负类别样本错误地预测为正类别,而假负例(预测不是但是实际是是的)是指模型将正类别样本错误地预测为负类别。
分类 (Classification):精确率和召回率
精确率(在被识别为正类别的样本中,确实为正类别的比例是多少?)
((TP = 真正例)/(TP = 真正例+FP = 假正例))
召回率(在所有正类别样本中,被正确识别为正类别的比例是多少?)
((TP = 真正例)/(TP = 真正例+FN = 假负例))
ROC 曲线
TPR(真正例率):原本是对的预测为对的比例(越大越好,1为理想状态)
FPR(假正例率):原本是错的预测为对的比例(越小越好,0为理想状态)
ROC曲线中分别将FPR和TPR定义为x和y轴,这样就描述了真阳性(获利)和假阳性(成本)之间的博弈
对于一个特定的分类器和测试数据集,每一个实例都会得到一个分类结果,通过统计,利用上述公式,可以得到一组FPR和TPR结果,而要得到一个曲线,实际上需要一系列FPR和TPR的值。那么这一系列值是怎么构造出来的呢?
如果设置不同的threshold(阈值)(也可能是使用不同的样本),那么分类结果就会有所变动,因此可以得到一系列FPR和TPR的值。
稀疏性正则化 (Regularization for Sparsity):L₁ 正则化(减少内存,使部分无关的特征权重变为0)
您可以将 L2 的导数的作用理解为每次移除权重的 x%。如 Zeno 所知,对于任意数字,即使按每次减去 x% 的幅度执行数十亿次减法计算,最后得出的值也绝不会正好为 0。(Zeno 不太熟悉浮点精度限制,它可能会使结果正好为 0。)总而言之,L2 通常不会使权重变为 0。
您可以将 L1 的导数的作用理解为每次从权重中减去一个常数。不过,由于减去的是绝对值,L1 在 0 处具有不连续性,这会导致与 0 相交的减法结果变为 0。例如,如果减法使权重从 +0.1 变为 -0.2,L1 便会将权重设为 0。就这样,L1 使权重变为 0 了。
L1 正则化 - 减少所有权重的绝对值 - 证明对宽度模型非常有效。
神经网络
神经网络不一定始终比特征组合好,但它确实可以提供适用于很多情形的灵活替代方案。
激活函数
要对非线性问题进行建模,我们可以直接引入非线性函数。我们可以用非线性函数将每个隐藏层节点像管道一样连接起来。
常见激活函数
修正线性单元激活函数(简称为 ReLU)
假设 表示我们的激活函数(ReLU、S 型函数等等)。因此,网络中节点的值由以下公式指定:
反向传播
反向传播算法是最常见的一种神经网络训练算法。借助这种算法,梯度下降法在多层神经网络中将成为可行方法。
https://blog.csdn.net/huang007guo/article/details/106542781
训练神经网络
事务必须是可微的,我们才能够对其进行学习(反向传播,梯度下降)
失败案例(排错修复训练数据方案):
较低层(更接近输入)的梯度可能会变得非常小。在深度网络中,计算这些梯度时,可能涉及许多小项的乘积。
当较低层的梯度逐渐消失到 0 时,这些层的训练速度会非常缓慢,甚至不再训练。
2.梯度爆炸(批标准化可以降低学习速率,因而有助于防止梯度爆炸)
如果网络中的权重过大,则较低层的梯度会涉及许多大项的乘积。在这种情况下,梯度就会爆炸:梯度过大导致难以收敛。
3.ReLU 单元消失(降低学习速率有助于防止 ReLU 单元消失。)
一旦 ReLU 单元的加权和低于 0,ReLU 单元就可能会停滞。它会输出对网络输出没有任何贡献的 0 激活,而梯度在反向传播算法期间将无法再从中流过。由于梯度的来源被切断,ReLU 的输入可能无法作出足够的改变来使加权和恢复到 0 以上。
这是称为丢弃的另一种形式的正则化,可用于神经网络。其工作原理是,在梯度下降法的每一步中随机丢弃一些网络单元。丢弃得越多,正则化效果就越强:
训练优化
1.线性缩放:
将输入标准化以使其位于 (-1, 1) 范围内可能是一种良好的标准做法。这样一来,SGD 在一个维度中采用很大步长(或者在另一维度中采用很小步长)时不会受阻。数值优化的爱好者可能会注意到,这种做法与使用预调节器 (Preconditioner) 的想法是有联系的。
2.其他优化器(tf.train.AdagradOptimizer , tf.train.AdamOptimizer)
AdaGrad 优化器是一种备选方案。AdaGrad 的核心是灵活地修改模型中每个系数的学习率,从而单调降低有效的学习率。该优化器对于凸优化问题非常有效,但不一定适合非凸优化问题的神经网络训练。您可以通过指定 tf.train.AdagradOptimizer(而不是 GradientDescentOptimizer)来使用 AdaGrad。请注意,对于 AdaGrad,您可能需要使用较大的学习率。
对于非凸优化问题,Adam 有时比 AdaGrad 更有效。要使用 Adam,请调用 tf.train.AdamOptimizer 方法
3.其他标准化方法
打印图标:training_examples.hist(bins=20, figsize=(18, 12), xlabelsize=2)
例如,对数缩放可能对某些特征有帮助。或者,截取极端值可能会使剩余部分的信息更加丰富。
households、median_income 和 total_bedrooms 在对数空间内均呈现为正态分布。
如果 latitude、longitude 和 housing_median_age 像之前一样进行线性缩放,效果可能会更好。
population、totalRooms 和 rooms_per_person 具有几个极端离群值。这些值似乎过于极端,以至于我们无法利用对数标准化处理这些离群值。因此,我们直接截取掉这些值。
标准化函数:
多类别神经网络(分辨多种类型)
解决方案:
1.使用多个分类器(逻辑回归分类器),以一张狗狗的照片为例,可能需要训练五个不同的识别器,其中四个将图片看作负样本(不是狗狗),一个将图片看作正样本(是狗狗),但随着类别数量的增加,其效率会变得越来越低下
2.借助深度神经网络(在该网络中,每个输出节点表示一个不同的类别)创建明显更加高效的一对多模型。下图(一对多神经网络)展示了这种方法:
Softmax
在多类别问题中,Softmax 会为每个类别分配一个用小数表示的概率。这些用小数表示的概率相加之和必须是 1.0。与其他方式相比,这种附加限制有助于让训练过程更快速地收敛。
Softmax 针对所有正类别标签计算概率,但仅针对负类别标签的随机样本计算概率。例如,如果我们想要确定某个输入图片是小猎犬还是寻血猎犬图片,则不必针对每个非狗狗样本提供概率。(完整 Softmax随着类别数量的增加,它的代价会变得极其高昂。候选采样可以提高处理具有大量类别的问题的效率。)
注意: softmax不支持一个样本同时是多个类别的成员分类问题,您必须依赖多个逻辑回归。
嵌套 (Embedding)
嵌入层
第一个隐藏层是嵌入层,决定你要映射到几维空间(与任何深度神经网络一样, 此网络也有超参数,嵌入层中的其中一个超参数指的是 您想在该层中添加的嵌入维度数量,隐藏单元数量。)
- 嵌套维度的个数越多,越能准确地表示输入值之间的关系
- 不过,维度个数越多,过拟合的可能性就越高,训练速度也会越慢
- 经验法则(最好的经验法则是维度数量约为 词汇量(即潜在值的数量)的四次方根, 这只是经验之谈, 对于所有超参数,您真正需要做的是使用验证数据, 根据您自己的具体问题多多尝试, 然后确定哪项参数能获得最佳效果。):
对数层(输出层)
隐藏层
嵌套充当工具(映射到低维实矢量, 创建数据(不同类型,密集型数据)相似度)
- 嵌套会以相似内容彼此靠近的方式将各项内容(如影片、文字等)映射到低维实矢量
- 嵌套也可应用于密集数据(如音频),以创建有意义的相似度指标
- 联合嵌套多种类型的数据(如文字、图片、音频等),以定义这些数据之间的相似度
协同过滤(影片映射到一个嵌套空间)
协同过滤是一项可以预测用户兴趣(根据很多其他用户的兴趣)的任务
最终,真正有意义的是嵌套空间中各个影片之间的距离,而不是单个影片在任意指定维度上的坐标。