笔记:机器学习

机器学习入门

概念

参考: 机器学习术语表 | Google Developers @Ref

基本(feature/label)

  • 特征 (feature) : 在进行预测时使用的输入变量。特征是事物固有属性。
  • 标签 (label): 标签是根据固有属性产生的认知,并不一定是事物本身所具有的属性。
    在监督式学习中,标签指样本的“答案”或“结果”部分。有标签数据集中的每个样本都包含一个或多个特征以及一个标签。例如,在房屋数据集中,特征可能包括卧室数、卫生间数以及房龄,而标签则可能是房价。在垃圾邮件检测数据集中,特征可能包括主题行、发件人以及电子邮件本身,而标签则可能是“垃圾邮件”或“非垃圾邮件”。
  • 权重 (weight):
    线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

标签是一个主观归纳性描述;特征则是一个客观的细节性描述。

监督/非监督(supervised/unsupervised)

  • 监督式机器学习 (supervised machine learning):
    根据输入数据及其对应的标签来训练模型。监督式机器学习类似于学生通过研究一系列问题及其对应的答案来学习某个主题。在掌握了问题和答案之间的对应关系后,学生便可以回答关于同一主题的新问题(以前从未见过的问题)。请与非监督式机器学习进行比较。
  • 非监督式机器学习 (unsupervised machine learning): 训练模型,以找出数据集(通常是无标签数据集)中的规律。
    非监督式机器学习最常见的用途是将数据分为不同的聚类,使相似的样本位于同一组中。例如,非监督式机器学习算法可以根据音乐的各种属性将歌曲分为不同的聚类。所得聚类可以作为其他机器学习算法(例如音乐推荐服务)的输入。在很难获取真标签的领域,聚类可能会非常有用。例如,在反滥用和反欺诈等领域,聚类有助于人们更好地了解相关数据。
  • 半监督式学习 (semi-supervised learning):
    训练模型时采用的数据中,某些训练样本有标签,而其他样本则没有标签。半监督式学习采用的一种技术是推断无标签样本的标签,然后使用推断出的标签进行训练,以创建新模型。如果获得有标签样本需要高昂的成本,而无标签样本则有很多,那么半监督式学习将非常有用。

监督式机器学习 vs 非监督式机器学习
最简单也最普遍的一类机器学习算法就是分类(classification)。对于分类,输入的训练数据有特征(feature),有标签(label)。所谓的学习,其本质就是找到特征和标签间的关系(mapping)。
这样当有特征而无标签的未知数据输入时,我们就可以通过已有的关系得到未知数据标签。
在上述的分类过程中,如果所有训练数据都有标签,则为有监督学习(supervised learning)。
如果数据没有标签,显然就是无监督学习(unsupervised learning)了,也即聚类(clustering)。
目前分类算法的效果还是不错的,但相对来讲,聚类算法就有些惨不忍睹了。确实,无监督学习本身的特点使其难以得到如分类一样近乎完美的结果。

特征(feature)

  • 离散特征 (discrete feature)
    一种特征,包含有限个可能值。例如,某个值只能是“动物”、“蔬菜”或“矿物”的特征便是一个离散特征(或分类特征)。与连续特征相对。
  • 连续特征 (continuous feature)
    一种浮点特征,可能值的区间不受限制。与离散特征相对。
  • 稀疏特征 (sparse feature):
    一种特征向量,其中的大多数值都为 0 或为空。例如,某个向量包含一个为 1 的值和一百万个为 0 的值,则该向量就属于稀疏向量。再举一个例子,搜索查询中的单词也可能属于稀疏特征 - 在某种指定语言中有很多可能的单词,但在某个指定的查询中仅包含其中几个。
  • 密集特征 (dense feature)
    一种大部分值是非零值的特征,通常是浮点值张量。与稀疏特征相对。

样本(example)

  • 有标签样本 (labeled example):
    包含特征和标签的样本。在监督式训练中,模型从有标签样本中学习规律
  • 无标签样本 (unlabeled example):
    包含特征但没有标签的样本。无标签样本是用于进行推断的输入内容。在半监督式和非监督式学习中,在训练期间会使用无标签样本。

集(set)

  • 训练集 (training set):
    数据集的子集,用于训练模型。与验证集和测试集相对。
  • 测试集 (test set):
    数据集的子集,用于在模型经由验证集的初步验证之后测试模型。
  • 验证集 (validation set):
    数据集的一个子集,从训练集分离而来,用于调整超参数。

模型(model)

  • 模型 (model): 机器学习系统从训练数据学到的内容的表示形式。多含义术语,可以理解为下列两种相关含义之一:

    • 一种 TensorFlow 图,用于表示预测的计算结构。
    • 该 TensorFlow 图的特定权重和偏差,通过训练决定。
  • 分类模型 (classification model):
    一种机器学习模型,用于区分两种或多种离散类别。例如,某个自然语言处理分类模型可以确定输入的句子是法语、西班牙语还是意大利语。请与回归模型进行比较。

  • 回归模型 (regression model):
    一种模型,能够输出连续的值(通常为浮点值)。请与分类模型进行比较,分类模型会输出离散值。

  • 广义线性模型 (generalized linear model)
    最小二乘回归模型(基于高斯噪声)向其他类型的模型(基于其他类型的噪声,例如泊松噪声或分类噪声)进行的一种泛化。
    广义线性模型的功能受其特征的限制。与深度模型不同,广义线性模型无法“学习新特征”。
    广义线性模型具有以下特性:

    • 最优的最小二乘回归模型的平均预测结果等于训练数据的平均标签。
    • 最优的逻辑回归模型预测的平均概率等于训练数据的平均标签。
      广义线性模型的示例包括:
    • 逻辑回归 /LR (logistic regression): 一种模型,通过将 S 型函数应用于线性预测,生成分类问题中每个可能的离散标签值的概率。虽然逻辑回归经常用于二元分类问题,但也可用于多类别分类问题(其叫法变为多类别逻辑回归或多项回归)。
    • 多类别回归:
    • 最小二乘回归:
  • 宽度模型 (wide model)
    一种线性模型,通常有很多稀疏输入特征。我们之所以称之为“宽度模型”,是因为这是一种特殊类型的神经网络,其大量输入均直接与输出节点相连。与深度模型相比,宽度模型通常更易于调试和检查。虽然宽度模型无法通过隐藏层来表示非线性关系,但可以利用特征组合、分桶等转换以不同的方式为非线性关系建模。

  • 深度模型 (deep model)
    一种神经网络,其中包含多个隐藏层。深度模型依赖于可训练的非线性关系。

模型训练(model training)

  • 模型训练 (model training):
    确定最佳模型的过程。
  • 迭代 (iteration):
    模型的权重在训练期间的一次更新。迭代包含计算参数在单批次数据上的梯度损失。
  • 批次 (batch):
    模型训练的一次迭代(即一次梯度更新)中使用的样本集。
  • 批次大小 (batch size):
    一个批次中的样本数。例如,SGD 的批次大小为 1,而小批次的大小通常介于 10 到 1000 之间。批次大小在训练和推断期间通常是固定的;不过,TensorFlow 允许使用动态批次大小。

函数(function)

  • 激活函数 (activation function):
    一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。
  • S 型函数 (sigmoid function):
    一种函数,可将逻辑回归输出或多项回归输出(对数几率)映射到概率,以返回介于 0 到 1 之间的值。S 型函数的公式如下:

    在逻辑回归问题中, σ 非常简单:

    换句话说,S 型函数可将 转换为介于 0 到 1 之间的概率。在某些神经网络中,S 型函数可作为激活函数使用。
  • 修正线性单元 (ReLU, Rectified Linear Unit):
    一种激活函数,其规则如下:
    • 如果输入为负数或 0,则输出 0。
    • 如果输入为正数,则输出等于输入。

正反(positive/negative)

  • 正类别 (positive class):
    在二元分类中,两种可能的类别分别被标记为正类别和负类别。正类别结果是我们要测试的对象。(不可否认的是,我们会同时测试这两种结果,但只关注正类别结果。)例如,在电子邮件分类器中,正类别可以是“垃圾邮件”。
  • 负类别 (negative class):
    在二元分类中,一种类别称为正类别,另一种类别称为负类别。正类别是我们要寻找的类别,负类别则是另一种可能性。例如,在医学检查中,负类别可以是“非肿瘤”。在电子邮件分类器中,负类别可以是“非垃圾邮件”。另请参阅正类别。

  • 正例 (TP, true positive):
    被模型正确地预测为正类别的样本。例如,模型推断出某封电子邮件是垃圾邮件,而该电子邮件确实是垃圾邮件。

  • 负例 (TN, true negative):
    被模型正确地预测为负类别的样本。例如,模型推断出某封电子邮件不是垃圾邮件,而该电子邮件确实不是垃圾邮件。
  • 假正例 (FP, false positive):
    被模型错误地预测为正类别的样本。例如,模型推断出某封电子邮件是垃圾邮件(正类别),但该电子邮件其实不是垃圾邮件。
  • 假负例 (FN, false negative):
    被模型错误地预测为负类别的样本。例如,模型推断出某封电子邮件不是垃圾邮件(负类别),但该电子邮件其实是垃圾邮件。

  • 混淆矩阵 (confusion matrix):
    一种 NxN 表格,用于总结分类模型的预测效果;即标签和模型预测的分类之间的关联。在混淆矩阵中,一个轴表示模型预测的标签,另一个轴表示实际标签。N 表示类别个数。在二元分类问题中,N=2。

  • 精确率 (precision):
    一种分类模型指标。精确率指模型正确预测正类别的频率,即:
    正例数 / 正例数 + 假正例数
  • 召回率 (recall): 用于回答以下问题:在所有可能的正类别标签中,模型正确地识别出了多少个?即
    召回率 = 正例数 / (正例数 + 假负例数)

未分类概念

  • 协同过滤 (collaborative filtering): 根据很多其他用户的兴趣来预测某位用户的兴趣。协同过滤通常用在推荐系统中。
    协同过滤推荐是目前业界常用的推荐算法之一。协同过滤推荐是利用users和items的关系矩阵来对user和item进行建模,从而进行推荐的一类算法。其主要分为两种:基于user的协同过滤推荐和基于item的协同过滤推荐。

  • DAG: 在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。
    ML-Glossary-DAG

  • 反向传播算法 (backpropagation)
    在神经网络上执行梯度下降法的主要算法。该算法会先按前向传播方式计算(并缓存)每个节点的输出值,然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。

机器学习系统分类

机器学习有多种类型,可以根据如下规则进行分类:

  • 是否在人类监督下进行训练(监督,非监督,半监督和强化学习)
  • 是否可以动态渐进学习(在线学习 vs批量学习)
  • 它们是否只是通过简单地比较新的数据点和已知的数据点,或者在训练数据中进行模式识别,以建立一个预测模型,就像科学家所做的那样(基于实例学习 vs基于模型学习)

监督/非监督学习

监督学习主要有两个常见的典型的任务–分类和回归。

a.监督学习

分类(classification)

分类问题主要就是预测新数据的类别问题。
例如上文提到的垃圾邮件过滤器就是一个二分类问题,将邮件分为垃圾邮件还是正常的邮件,如下图所示。

回归(regression)

回归问题主要是预测目标数值。
比如给定预测房价的问题,给定一些特征,如房子大小、房间数量、地理位置等等,然后预测房子的价格。如下图所示:

b.非监督学习

非监督主要有四个典型的任务,分别是聚类、降维、异常检测和关联规则学习。

聚类 (clustering)

聚类就是将数据根据一定的规则分成多个类,通常是采用相似性。
比如对于博客访客的聚类,通过聚类算法,检测相似性访客的分组,如下图所示。不需要告诉算法访客是哪个类别,它会自动根据访客的属性找到相互间的关系

降维

降维的目的是简化数据、但是不能失去大部分信息。做法之一是合并若干相关的特征。
例如,汽车的里程数与车龄高度相关,降维算法就会将它们合并成一个,表示汽车的磨损。这叫做特征提取。

此外,在采用机器学习算法训练的时候,可以对训练集进行降维,这样有助于提高训练速度,降低占用的硬盘和内存空间,有时候也能提高算法的性能,但必须选择合适的降维算法,否则性能实际上是很有可能会下降的。

异常检测

另一个重要的非监督任务是异常检测(anomaly detection)。例如,检测异常的信用卡转账以防欺诈,检测制造缺陷,或者在训练之前自动从训练数据集去除异常值。异常检测的系统使用正常值训练的,当它碰到一个新实例,它可以判断这个新实例是像正常值还是异常值。

关联规则学习

最后,另一个常见的非监督任务是关联规则学习,它的目标是挖掘大量数据以发现属性间有趣的关系。
例如,假设你拥有一个超市。在销售日志上运行关联规则,可能发现买了烧烤酱和薯片的人也会买牛排。因此,你可以将这些商品放在一起。

c.半监督学习

一些算法可以处理部分带标签的训练数据,通常是大量不带标签数据加上小部分带标签数据。这称作半监督学习。
如下图所示,图中灰色圆点表示没有标签的数据,仅有几个三角形和正方形点表示带标签的数据。

多数半监督学习算法是非监督和监督算法的结合。

  • 例如,深度信念网络(deep belief networks)是基于被称为互相叠加的受限玻尔兹曼机(restricted Boltzmann machines,RBM)的非监督组件。RBM 是先用非监督方法进行训练,再用监督学习方法进行整个系统微调。
  • 如一些图片存储服务,比如 Google Photos,是半监督学习的好例子。一旦你上传了所有家庭相片,它就能自动识别相同的人 A 出现了相片1、5、11 中,另一个人 B 出现在了相片 2、5、7 中。这是算法的非监督部分(聚类)。现在系统需要的就是你告诉这两个人是谁。只要给每个人一个标签,算法就可以命名每张照片中的每个人,特别适合搜索照片。

d.强化学习

强化学习和上述三种学习问题是非常不同的。学习系统在这里被称为智能体( agent),可以对环境进行观察,选择和执行动作,获得奖励(负奖励是惩罚,见下图)。
然后它必须自己学习哪个是最佳方法(称为策略,policy),以得到长久的最大奖励。策略决定了智能体在给定情况下应该采取的行动 。

目前强化学习的应用还不算非常广,特别是结合了深度学习的强化学习,主要是应用在机器人方面,当然最著名的一个应用就是 DeepMind 的 AlphaGo 了,它是通过分析数百万盘棋局学习制胜策略,然后自己和自己下棋。要注意,在比赛中机器学习是关闭的;AlphaGo 只是使用它学会的策略。

批量/在线学习

第二种分类机器学习的准则是,它是否能从导入的数据流进行持续学习。也就是如果导入的是持续的数据流,机器学习算法能否在不断采用新数据来训练已经训练好的模型,并且新的模型对新旧数据都还有很好的性能。

a.批量学习

在批量学习中,系统不能进行持续学习:必须用所有可用数据进行训练。这通常会占用大量时间和计算资源,所以一般是线下做的。
首先是进行训练,然后部署在生产环境且停止学习,它只是使用已经学到的策略。这称为离线学习。

对于批量学习算法来说,当获取到新数据的时候,就需要重新重头训练整个数据集,然后更新模型,如果是应用该算法系统,那就相当于需要更新系统,需要停掉旧版本的系统,重新上线新版本的系统。
当然,一般训练、评估、部署一套机器学习的系统的整个过程可以自动进行,所以即便是批量学习也可以适应改变。只要有需要,就可以方便地更新数据、训练一个新版本。并且对于更新周期,可以选择每 24 小时或者每周更新一次。

但是,批量学习还是存在下面的缺点:

  • 实时性差,即对于需要快速适应变化的系统,比如预测股票变化、电商推荐系统等,就不适合采用批量学习算法;
  • 耗费大量计算资源,用全部数据训练需要大量计算资源(CPU、内存空间、磁盘空间、磁盘 I/O、网络 I/O 等等),特别是训练集特别大的情况,更加凸显这个问题的严峻性;
  • 无法应用在资源有限的设备上,比如需要自动学习的系统,但是如果采用智能手机,每次采用大量训练数据重新训练几个小时是非常不实际的。

b.在线学习

批量学习的缺陷和问题可以通过采用在线学习算法来解决。

在在线学习中,是用数据实例持续地进行训练,可以一次一个或一次几个实例(称为小批量)。每个学习步骤都很快且廉价,所以系统可以动态地学习到达的新数据。
在线学习虽然名字带着在线两个字,但是实际上它的训练过程也是离线的,因此应该说是持续学习或者增量学习。

基于实例/基于模型学习

第三种分类机器学习的方法是判断它们是如何进行归纳推广的。大多机器学习任务是关于预测的。这意味着给定一定数量的训练样本,系统需要能推广到之前没见到过的样本。对训练数据集有很好的性能还不够,真正的目标是对新实例预测的性能。
有两种主要的归纳方法:基于实例学习和基于模型学习。

a.基于实例学习

基于实例学习是系统先用记忆学习案例,然后使用相似度测量推广到新的例子,如下图所示:

这种学习算法可以说是机器学习中最简单的算法了,它实际上就是采用存储的数据集进行分类或者回归,典型的算法就是 KNN 算法,即 K 近邻算法,它就是将新的输入数据和已经保存的训练数据采用相似性度量(一般采用欧式距离)得到最近的 K 个训练样本,并采用 K 个训练样本中类别出现次数最多的类别作为预测的结果。

所以,这种算法的缺点就比较明显了:

  • 一是对存储空间的需求很大,需要占用的空间直接取决于实例数量的大小;
  • 二是运行时间比较慢,因为需要需要与已知的实例进行比对。

b.基于模型学习

和基于实例学习相反的就是基于模型学习:建立这些样本的模型,然后使用这个模型进行预测。如下图所示:

基于模型学习算法的流程一般如下所示:

  • 研究数据。先对数据进行分析,这可能包含清洗数据、特征筛选、特征组合等等
  • 选择模型。选择合适的模型,从简单的线性回归、逻辑回归,到慢慢复杂的随机森林、集成学习,甚至深度学习的卷积神经网络模型等等
  • 用训练数据进行训练。也就是寻找最适合算法模型的参数,使得代价函数取得最小值。
  • 使用模型对新案例进行预测(这称作推断)。预测结果非常好,就能上线系统;如果不好,就需要进行错误分析,问题出现在哪里,是数据问题还是模型问题,找到问题,然后继续重复这个流程。

训练过程

算法汇总

开发过程

开发过程:

  • 收集数据: 收集样本数据
  • 准备数据: 注意数据的格式
  • 分析数据: 为了确保数据集中没有垃圾数据;
    • 如果是算法可以处理的数据格式或可信任的数据源,则可以跳过该步骤;
    • 另外该步骤需要人工干预,会降低自动化系统的价值。
  • 训练算法: 如果使用无监督学习算法,由于不存在目标变量值,则可以跳过该步骤
  • 测试算法: 评估算法效果
  • 使用算法: 将机器学习算法转为应用程序

算法理论

机器学习 Algorithm Cheat Sheet:

有监督学习算法

LR

逻辑回归(Logistics Regression)

kNN

k-近邻算法

FM

因子分解机(Factorization Machine) 因子分解机(Factorization Machine, FM) 是由Steffen Rendle提出的一种基于矩阵分解的机器学习算法。目前,被广泛的应用于广告预估模型中

FFM

Field-aware Factorization Machines(FFM)

朴素贝叶斯

Naive Bayes

SVM

支持向量机(Support Vector Machine)

决策树

决策树(Decision Tree)

随机森林

Random Forest

boosting

集成学习的两个流派,bagging & boosting派系

无监督学习算法

k-均值

k-means 算法

分层聚类

PCA

主成分分析(Principal Component Analysis)

DBSCAN

DBSCAN,英文全写为Density-based spatial clustering of applications with noise ,是在 1996 年由Martin Ester, Hans-Peter Kriegel, Jörg Sander 及 Xiaowei Xu 提出的聚类分析算法, 这个算法是以密度为本的:给定某空间里的一个点集合,这算法能把附近的点分成一组(有很多相邻点的点),并标记出位于低密度区域的局外点(最接近它的点也十分远),DBSCAN 是其中一个最常用的聚类分析算法

机器学习框架

Spark MLlib

MLib是主要面向数学和统计用户的平台,它允许 通过持久化管道特性将Spark机器学习工作挂起和恢复。2016年发布的Spark2.0,对Tungsten高速内存管理系统和新的DataFrames流媒体API 进行了改进,这两点都会提升机器学习应用的性能。

TensorFlow

一个大型的分布式机器学习平台。该术语还指 TensorFlow 堆栈中的基本 API 层,该层支持对数据流图进行一般计算。
虽然 TensorFlow 主要应用于机器学习领域,但也可用于需要使用数据流图进行数值计算的非机器学习任务。

  • ensorFlow Playground:
    一款用于直观呈现不同的超参数对模型(主要是神经网络)训练的影响的程序。要试用 TensorFlow Playground,请前往 http://playground.tensorflow.org。
  • TensorFlow Serving:
    一个平台,用于将训练过的模型部署到生产环境。

  • 张量 (Tensor):
    TensorFlow 程序中的主要数据结构。张量是 N 维(其中 N 可能非常大)数据结构,最常见的是标量、向量或矩阵。张量的元素可以包含整数值、浮点值或字符串值。

  • 会话 (tf.session):
    封装了 TensorFlow 运行时状态的对象,用于运行全部或部分图。在使用底层 TensorFlow API 时,您可以直接创建并管理一个或多个 tf.session 对象。在使用 Estimator API 时,Estimator 会为您创建会话对象。

  • 输入函数 (input function):
    在 TensorFlow 中,用于将输入数据返回到 Estimator 的训练、评估或预测方法的函数。例如,训练输入函数会返回训练集中的一批特征和标签。

  • 图 (graph):
    TensorFlow 中的一种计算规范。图中的节点表示操作。边缘具有方向,表示将某项操作的结果(一个张量)作为一个操作数传递给另一项操作。可以使用 TensorBoard 直观呈现图。

  • Layers API (tf.layers):
    一种 TensorFlow API,用于以层组合的方式构建深度神经网络。通过 Layers API,您可以构建不同类型的层,例如:

    • 通过 tf.layers.Dense 构建全连接层。
    • 通过 tf.layers.Conv2D 构建卷积层。
  • Metrics API (tf.metrics):
    一种用于评估模型的 TensorFlow API。例如,tf.metrics.accuracy 用于确定模型的预测与标签匹配的频率。在编写自定义 Estimator 时,您可以调用 Metrics API 函数来指定应如何评估您的模型。

机器学习相关数学知识

高等数学

  1. 导数及偏导数,对应机器学习中的梯度,机器学习中学习的参数需要通过梯度下降进行更新;
  2. 复合函数的链式法则,同1一样,目的也是为了求出梯度更新参数,但因为深度学习网络有多层,所以模型的预测函数是个复合函数,我们需要通过链式法则从后往前求出每层参数的梯度,进而更新每层里的参数,这也就是“反向传播法”;
  3. 了解数学中的最优化问题,大概就是目标函数在什么条件下能够取到最值的问题,因为机器学习的问题到最后都是要转化为一个损失函数最优化的问题。

线性代数

  1. 标量、向量、矩阵及张量的定义及运算,机器学习的过程其实也就是矩阵计算的过程(GPU在矩阵计算上天然有很大的优势)。
  2. 范数,对应机器学习中正则项,正则项通常会加在已有的损失函数上用来减少训练的过拟合问题;
  3. 常见的距离计算方式:欧式距离、曼哈顿距离、余弦距离等,我们之前说过数据样本可以表示为其特征空间里的点,而距离可以用来衡量他们的相似度。

概率论

  1. 条件概率、贝叶斯,基于概率论的分类方法经常会用到;
  2. 期望与方差,机器学习里一般都会对数据进行normalized的处理,这个时候很可能会用到期望和方差;
  3. 协方差,能够表征两个变量的相关性,在PCA降维算法中有用到,变量越相关,我们越可能对他们进行降维处理;
  4. 常见分布:0-1分布、二项分布、高斯分布等,高斯分布很重要,数据normalized跟它有关,参数的初始化特跟它有关;
  5. 最大似然估计,在推导逻辑回归的损失函数时会用到。

附录:机器学习算法技能树