Google机器学习速成课程

Google机器学习速成课程,这个资源涵盖了谷歌机器学习速成课程(中文版)的所有内容。学习了 Google机器学习速成课程可以算作学习了机器学习功夫的招式。文末附带资源免费下载哦!

那么首先我们将机器学习与普通编程进行一个对比

目的:

  • 了解掌握机器学习技术的实际优势
  • 理解机器学习技术背后的理念
机器学习的解决方案 普通编程的解决方案
机器学习可以提供一个缩短编程时间的工具。比如编写一个程序来纠正拼写错误,只需向现成的机器学习工具提供一些样本就可以在短时间内获得一个可靠的程序。 普通编程通过大量示例和经验法则,以及数周努力编写一个合理的程序。
借助起学习可以自定义自己的产品,使其更适合特定的用户群体。只需要收集该特定语言的数据,然后将数据提供给完全一样的机器学习模型学习,就可以提供多种语言版本的拼写检查程序。 手动编写了一个英文拼写纠错程序,如果打算针对100种最常用语言提供相应版本,这样一来每一种语言版本几乎都要从头开始,将付出数年的努力。
借助机器学习可以解决不知道如何使用人工方法解决的问题。比如识别出朋友的面孔,理解他们所说的话。 普通编程无法很好解决。

接下来我们对机器学习的术语进行一个整合,文末将附上机器学习术语表。

术语 解释
(监督式)机器学习? 机器学习系统通过学习如何组合输入信息来对从未见过的数据做出有用的预测。
标签 标签是我们要预测的事物,即简单线性回归中的$y$变量。标签可以是小麦未来的价格、图片中显示的动物品种、音频剪辑的含义或任何事物。
特征 特征是输入变量,即简单线性回归中的$x$变量。简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征,按如下方式指定:$x_1, x_2,...,x_N$。在垃圾邮件检测器示例中,特征可能包括:电子邮件文本中的字词、发件人的地址、发送电子邮件的时段、、电子邮件中包含“一种奇怪的把戏”这样的短语。
样本 样本是指数据的特定实例:$\pmb{x}$。(我们采用粗体$\pmb{x}$表示它是一个矢量。)我们将样本分为以下两类:有标签样本、无标签样本。有标签样本具有 {特征, 标签}:(x, y), 用于训练模型。无标签样本具有 {特征, ?}:(x, ?),用于对新数据做出预测。在我们的垃圾邮件检测器示例中,有标签样本是用户明确标记为“垃圾邮件”或“非垃圾邮件”的各个电子邮件。在使用有标签样本训练模型之后,我们会使用该模型预测无标签样本的标签。在垃圾邮件检测器示例中,无标签样本是用户尚未添加标签的新电子邮件。
模型 模型定义了特征与标签之间的关系。例如,垃圾邮件检测模型可能会将某些特征与“垃圾邮件”紧密联系起来。我们来重点介绍一下模型生命周期的两个阶段:训练是指创建或学习模型。也就是说,向模型展示有标签样本,让模型逐渐学习特征与标签之间的关系。推断是指将训练后的模型应用于无标签样本。
回归模型 回归模型可预测连续值。例如,回归模型做出的预测可回答如下问题:加利福尼亚州一栋房产的价值是多少?用户点击此广告的概率是多少?
分类模型 分类模型可预测离散值。例如,分类模型做出的预测可回答如下问题:某个指定电子邮件是垃圾邮件还是非垃圾邮件?这是一张狗、猫还是仓鼠图片?

下一步就可以开始深入了解机器学习啦

 1.线性回归

Google机器学习速成课程

Google机器学习速成课程

 2.降低损失

  迭代方法

下图显示了机器学习算法用于训练模型的迭代试错过程:

Google机器学习速成课程


使用TensorFlow的基本步骤

TensorFlow官网:https://www.tensorflow.org/

TensorFlow 由以下两个组件组成:图协议缓冲区、执行(分布式)图的运行时。 这两个组件类似于 Java 编译器和 JVM。正如 JVM 会实施在多个硬件平台(CPU 和 GPU)上一样,TensorFlow 也是如此。

Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件),这种字节码就是JVM的“机器语言”。javac.exe可以简单看成是Java编译器。 VM:够运行Java字节码(Java bytecode)的虚拟机。(ps: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。)

我们将使用 tf.estimator 来完成机器学习速成课程中的大部分练习。您在练习中所做的一切都可以在较低级别(原始)的 TensorFlow 中完成,但使用 tf.estimator 会大大减少代码行数。

tf.estimator 与 scikit-learn API 兼容。 scikit-learn 是极其热门的 Python 开放源代码机器学习库,拥有超过 10 万名用户,其中包括许多 Google 员工。

以下是在 tf.estimator 中实现的线性回归程序的格式:

import tensorflow as tf

# Set up a linear classifier.
classifier = tf.estimator.LinearClassifier()

# Train the model on some example data.
classifier.train(input_fn=train_input_fn, steps=2000)

# Use it to predict.
predictions = classifier.predict(input_fn=predict_input_fn)

泛化

过拟合的风险

过拟合模型在训练过程中产生的损失很低,但在预测新数据方面的表现却非常糟糕。如果某个模型在拟合当前样本方面表现良好,那么我们如何相信该模型会对新数据做出良好的预测呢?正如您稍后将看到的,过拟合是由于模型的复杂程度超出所需程度而造成的。机器学习的基本冲突是适当拟合我们的数据,但也要尽可能简单地拟合数据。

机器学习的目标是对从真实概率分布(已隐藏)中抽取的新数据做出良好预测。遗憾的是,模型无法查看整体情况;模型只能从训练数据集中取样。如果某个模型在拟合当前样本方面表现良好,那么您如何相信该模型也会对从未见过的样本做出良好预测呢?

奥卡姆的威廉是 14 世纪一位崇尚简单的修士和哲学家。他认为科学家应该优先采用更简单(而非更复杂)的公式或理论。奥卡姆剃刀定律在机器学习方面的运用如下:

机器学习模型越简单,良好的实证结果就越有可能不仅仅基于样本的特性。

现今,我们已将奥卡姆剃刀定律正式应用于统计学习理论和计算学习理论领域。这些领域已经形成了泛化边界,即统计化描述模型根据以下因素泛化到新数据的能力:

  • 模型的复杂程度
  • 模型在处理训练数据方面的表现

虽然理论分析在理想化假设下可提供正式保证,但在实践中却很难应用。机器学习速成课程则侧重于实证评估,以评判模型泛化到新数据的能力。

机器学习模型旨在根据以前未见过的新数据做出良好预测。但是,如果您要根据数据集构建模型,如何获得以前未见过的数据呢?一种方法是将您的数据集分成两个子集:

  1. 训练集 - 用于训练模型的子集。
  2. 测试集 - 用于测试模型的子集。
  3. 验证集

一般来说,在测试集上表现是否良好是衡量能否在新数据上表现良好的有用指标,前提是:

  1. 测试集足够大。
  2. 您不会反复使用相同的测试集来作假。

确保您的测试集满足以下两个条件:

  1. 规模足够大,可产生具有统计意义的结果。
  2. 能代表整个数据集。换言之,挑选的测试集的特征应该与训练集的特征相同。
  3. 标准数据集划分Google机器学习速成课程

请勿对测试数据进行训练。 如果您的评估指标取得了意外的好结果,则可能表明您不小心对测试集进行了训练。例如,高准确率可能表明测试数据泄露到了训练集。

例如,假设一个模型要预测某封电子邮件是否是垃圾邮件,它使用主题行、邮件正文和发件人的电子邮件地址作为特征。我们按照 80-20 的拆分比例将数据拆分为训练集和测试集。在训练之后,该模型在训练集和测试集上均达到了 99% 的精确率。我们原本预计测试集上的精确率会低于此结果,因此再次查看数据后发现,测试集中的很多样本与训练集中的样本是重复的(由于疏忽,我们在拆分数据之前,没有将输入数据库中的相同垃圾邮件重复条目清理掉)。我们无意中对一些测试数据进行了训练,因此无法再准确衡量该模型泛化到新数据的效果。

以下三项基本假设阐明了泛化(监督式机器学习关键假设):

  • 我们从分布中随机抽取独立同分布 (i.i.d) 的样本。换言之,样本之间不会互相影响。(另一种解释:i.i.d. 是表示变量随机性的一种方式)。
  • 分布是平稳的;即分布在数据集内不会发生变化。
  • 我们从同一分布的数据划分中抽取样本。

在实践中,我们有时会违背这些假设。例如:

  • 想象有一个选择要展示的广告的模型。如果该模型在某种程度上根据用户以前看过的广告选择广告,则会违背 i.i.d. 假设。
  • 想象有一个包含一年零售信息的数据集。用户的购买行为会出现季节性变化,这会违反平稳性。

如果违背了上述三项基本假设中的任何一项,那么我们就必须密切注意指标。

总结:

  • 如果某个模型尝试紧密拟合训练数据,但却不能很好地泛化到新数据,就会发生过拟合。
  • 如果不符合监督式机器学习的关键假设,那么我们将失去对新数据进行预测这项能力的重要理论保证。

特征工程

Google机器学习速成课程

映射数值

Google机器学习速成课程

良好特征的特点

Google机器学习速成课程


a.缩放特征值

缩放是指将浮点特征值从自然范围(例如 100 到 900)转换为标准范围(例如 0 到 1 或 -1 到 +1)。如果某个特征集只包含一个特征,则缩放可以提供的实际好处微乎其微或根本没有。不过,如果特征集包含多个特征,则缩放特征可以带来以下优势:

  • 帮助梯度下降法更快速地收敛。
  • 帮助避免“NaN 陷阱”。在这种陷阱中,模型中的一个数值变成 NaN(例如,当某个值在训练期间超出浮点精确率限制时),并且模型中的所有其他数值最终也会因数学运算而变成 NaN。
  • 帮助模型为每个特征确定合适的权重。如果没有进行特征缩放,则模型会对范围较大的特征投入过多精力。

您不需要对每个浮点特征进行完全相同的缩放。即使特征 A 的范围是 -1 到 +1,同时特征 B 的范围是 -3 到 +3,也不会产生什么恶劣的影响。不过,如果特征 B 的范围是 5000 到 100000,您的模型会出现糟糕的响应。

       b.处理极端离群值

将特征值限制到 4.0。 将特征值限制到 4.0并不意味着我们会忽略所有大于 4.0 的值。而是说,所有大于 4.0 的值都将变成 4.0。这就解释了 4.0 处的那个有趣的小峰值。尽管存在这个小峰值,但是缩放后的特征集现在依然比原始数据有用。

        c.分箱值

我们现在拥有 11 个不同的布尔值特征(LatitudeBin1、LatitudeBin2、…、LatitudeBin11),而不是一个浮点特征。拥有 11 个不同的特征有点不方便,因此我们将它们统一成一个 11 元素矢量。这样做之后,我们可以将纬度 37.4 表示为:[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0] 分箱之后,我们的模型现在可以为每个纬度学习完全不同的权重.


对非线性规律进行编码

通过采用随机梯度下降法,可以有效地训练线性模型。因此,在使用扩展的线性模型时辅以特征组合一直都是训练大规模数据集的有效方法。

组合独热矢量

在实践中,机器学习模型很少会组合连续特征。不过,机器学习模型却经常组合独热特征矢量,将独热特征矢量的特征组合视为逻辑连接。

线性学习器可以很好地扩展到大量数据。对大规模数据集使用特征组合是学习高度复杂模型的一种有效策略。神经网络可提供另一种策略。


正则化:简单性

1.L2正则化

Google机器学习速成课程

Google机器学习速成课程

     2. 正则化参数Lambda

模型开发者通过以下方式来调整正则化项的整体影响:用正则化项的值乘以名为 lambda(又称为正则化率)的标量。也就是说,模型开发者会执行以下运算:

                                                             minimize(Loss(Data|Model)+Complexity(Model))

其中minimize为最小化操作,Data为模型需要拟合的数据,Model为需要训练的模型,Loss(Data|Model)为损失项,用来衡量模型与数据的拟合度;Complexity(Model)为正则化项,用于衡量模型的复杂度。

逻辑回归

计算概率

许多问题需要将概率估算值作为输出。逻辑回归是一种极其高效的概率计算机制。实际上,您可以通过下两种方式之一使用返回的概率:

  • “按原样”
  • 转换成二元类别。

分类

1.  阈值

逻辑回归返回的是概率。您可以“原样”使用返回的概率(例如,用户点击此广告的概率为 0.00023),也可以将返回的概率转换成二元值(例如,这封电子邮件是垃圾邮件)。

如果某个逻辑回归模型对某封电子邮件进行预测时返回的概率为 0.9995,则表示该模型预测这封邮件非常可能是垃圾邮件。相反,在同一个逻辑回归模型中预测分数为 0.0003 的另一封电子邮件很可能不是垃圾邮件。可如果某封电子邮件的预测分数为 0.6 呢?为了将逻辑回归值映射到二元类别,您必须指定分类阈值(也称为判定阈值)。如果值高于该阈值,则表示“垃圾邮件”;如果值低于该阈值,则表示“非垃圾邮件”。人们往往会认为分类阈值应始终为 0.5,但阈值取决于具体问题,因此您必须对其进行调整

2.  阳性与阴性;正分类与负分类

在本部分,我们将定义用于评估分类模型的指标的主要组成部分。不过,我们先来看一则寓言故事: 伊索寓言:狼来了(精简版) 有一位牧童要照看镇上的羊群,但是他开始厌烦这份工作。为了找点乐子,他大喊道:“狼来了!”其实根本一头狼也没有出现。村民们迅速跑来保护羊群,但他们发现这个牧童是在开玩笑后非常生气。 这样的情形重复出现了很多次。 一天晚上,牧童看到真的有一头狼靠近羊群,他大声喊道:“狼来了!”村民们不想再被他捉弄,都待在家里不出来。这头饥饿的狼对羊群大开杀戒,美美饱餐了一顿。这下子,整个镇子都揭不开锅了。恐慌也随之而来。

3.  准确率

                                                   Google机器学习速成课程

4.精确率和召回率

Google机器学习速成课程Google机器学习速成课程

精确率和召回率的关系

Google机器学习速成课程


预测偏差

                                                         Google机器学习速成课程

分桶偏差和预测偏差

逻辑回归可预测 0 到 1 之间的值。不过,所有带标签样本都正好是 0(例如,0 表示“非垃圾邮件”)或 1(例如,1 表示“垃圾邮件”)。因此,在检查预测偏差时,您无法仅根据一个样本准确地确定预测偏差;您必须在“一大桶”样本中检查预测偏差。也就是说,只有将足够的样本组合在一起以便能够比较预测值(例如 0.392)与观察值(例如 0.394),逻辑回归的预测偏差才有意义。

您可以通过以下方式构建桶:

  • 以线性方式分解目标预测。
  • 构建分位数。

请查看以下某个特定模型的校准曲线。每个点表示包含 1000 个值的分桶。两个轴具有以下含义:

  • x 轴表示模型针对该桶预测的平均值。
  • y 轴表示该桶的数据集中的实际平均值。

Google机器学习速成课程


神经网络简介

对神经网络有一定的了解,尤其是了解以下方面:

  1.  隐藏层
  2.  激活函数

神经网络剖析

    1.  隐藏层

Google机器学习速成课程 Google机器学习速成课程 Google机器学习速成课程


   2.   激活函数

Google机器学习速成课程

Google机器学习速成课程

现在,我们的模型拥有了人们通常所说的“神经网络”的所有标准组件:

  1. 一组节点,类似于神经元,位于层中。
  2. 一组权重,表示每个神经网络层与其下方的层之间的关系。下方的层可能是另一个神经网络层,也可能是其他类型的层。
  3. 一组偏差,每层节点一个偏差。
  4. 一个激活函数,对层中每个节点的输出进行转换。不同的层可能拥有不同的激活函数。

训练神经网络

                  失败案例   (很多常见情况都会导致反向传播算法出错)

反向传播算法出错原因 解决办法
梯度消失 较低层(更接近输入)的梯度可能会变得非常小。在深度网络中,计算这些梯度时,可能涉及许多小项的乘积。当较低层的梯度逐渐消失到 0 时,这些层的训练速度会非常缓慢,甚至不再训练。ReLU 激活函数有助于防止梯度消失。
梯度爆炸 如果网络中的权重过大,则较低层的梯度会涉及许多大项的乘积。在这种情况下,梯度就会爆炸:梯度过大导致难以收敛。批标准化可以降低学习速率,因而有助于防止梯度爆炸。
ReLU 单元消失 一旦 ReLU 单元的加权和低于 0,ReLU 单元就可能会停滞。它会输出对网络输出没有任何贡献的 0 激活,而梯度在反向传播算法期间将无法再从中流过。由于梯度的来源被切断,ReLU 的输入可能无法作出足够的改变来使加权和恢复到 0 以上。降低学习速率有助于防止 ReLU 单元消失。


多类别分类神经网络

一对多

一对多提供了一种利用二元分类的方法。鉴于一个分类问题会有 N 个可行的解决方案,一对多解决方案包括 N 个单独的二元分类器,每个可能的结果对应一个二元分类器。在训练期间,模型会训练一系列二元分类器,使每个分类器都能回答单独的分类问题。以一张狗狗的照片为例,可能需要训练五个不同的识别器,其中四个将图片看作负样本(不是狗狗),一个将图片看作正样本(是狗狗)。

即:

  1. 这是一张苹果的图片吗?不是。
  2. 这是一张熊的图片吗?不是。
  3. 这是一张糖果的图片吗?不是。
  4. 这是一张狗狗的图片吗?是。
  5. 这是一张鸡蛋的图片吗?不是。

当类别总数较少时,这种方法比较合理,但随着类别数量的增加,其效率会变得越来越低下。

我们可以借助深度神经网络(在该网络中,每个输出节点表示一个不同的类别)创建明显更加高效的一对多模型。

一个标签与多个标签

Softmax 假设每个样本只是一个类别的成员。但是,一些样本可以同时是多个类别的成员。对于此类示例:

  • 您不能使用 Softmax。
  • 您必须依赖多个逻辑回归。

嵌入

嵌入是一种相对低维的空间,您可以将高维矢量映射到这种低维空间里。通过使用嵌套,可以让在大型输入(比如代表字词的稀疏矢量)上进行机器学习变得更加容易。在理想情况下,嵌套可以将语义上相似的不同输入映射到嵌套空间里的邻近处,以此来捕获输入的语义。一个模型学习到的嵌套,也可以被其他模型重用。

a.  协同过滤

协同过滤是一项可以预测用户兴趣(根据很多其他用户的兴趣)的任务。以影片推荐的任务为例,假设我们有 100 万个用户,以及每位用户观看过的影片的列表(可供观看的影片共有 50 万部)。 我们的目标是向用户推荐影片。

1.  在一维数轴上排列影片

2.  在二维空间中排列影片

b. 分类输入数据

分类数据是指用于表示一组有限选项中的一个或多个离散项的输入特征。例如,它可以是某用户观看过的一组影片,某文档中使用的一系列单词,或某人从事的职业。


机器学习工程

到目前为止,机器学习速成课程重点介绍了如何构建机器学习模型。不过,如下图所示,现实世界中采用的生产机器学习系统是大型生态系统,模型只是其中的一部分。 Google机器学习速成课程 应用于现实世界的生产环境机器学习系统

机器学习代码是现实世界生产环境机器学习系统的核心,但它通常最多只占整个生产环境机器学习系统整体代码的 5%。请注意,生产环境机器学习系统会将大量资源投入到输入数据中 - 收集输入数据、对其进行验证以及从中提取特征。另请注意,服务基础架构必须到位,以便机器学习模型的预测能投入到现实世界的实际运用中。

幸运的是,上图中的许多组件可以重复使用,而且,您无需自行构建图中的所有组件。TensorFlow 可提供其中许多组件,而其他选项可通过 Spark 或 Hadoop 等其他平台获取。后续单元会指导您如何在构建生产环境机器学习系统时做出设计决策。


对比静态训练与动态训练

从广义上讲,训练模型的方式有两种:

  • 静态模型采用离线训练方式。也就是说,我们只训练模型一次,然后使用训练后的模型一段时间。
  • 动态模型采用在线训练方式。也就是说,数据会不断进入系统,我们通过不断地更新系统将这些数据整合到模型中。

从广义上讲,静态训练和动态训练的选择由以下几点决定:

  • 静态模型更易于构建和测试。
  • 动态模型可以适应不断变化的数据。世界瞬息万变。基于去年的数据作出的销售预测很可能无法成功预测下一年的情况。

对比静态推理与动态推理

您可以选择以下任一推理策略:

  • 离线推理,指的是使用 MapReduce 或类似方法批量进行所有可能的预测。然后,将预测记录到 SSTable 或 Bigtable 中,并将它们提供给一个缓存/查询表。
  • 在线推理,指的是使用服务器根据需要进行预测。

以下是离线推理的优缺点:

  • 优点:不需要过多担心推理成本。
  • 优点:可以使用批量方法或某些巨型 MapReduce 方法。
  • 优点:可以在推送之前对预测执行后期验证。
  • 缺点:只能对我们知晓的数据进行预测,不适用于存在长尾的情况。
  • 缺点:更新可能延迟数小时或数天。

以下是在线推理的优缺点:

  • 优点:可在新项目加入时对其进行预测,非常适合存在长尾的情况。
  • 缺点:计算量非常大,对延迟较为敏感,可能会限制模型的复杂度。
  • 缺点:监控需求更多。

数据依赖关系

机器学习系统的行为取决于其输入特征的行为和品质。当这些特征的输入数据发生更改时,您的模型也会随之变化。有时,这种变化是可取的,有时则反之。

在传统的软件开发中,您的注意力更多地放在代码而非数据上。在机器学习开发中,虽然编码仍是工作的一部分,但您必须同时关注数据

Google机器学习速成课程

资源:

参考文章:

  • https://github.com/yuanxiaosc/Machine-Learning-Book (作者:yuanxiaosc)
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧