笔记《写给人类的机器学习 (Machine Learning for Humans)》

首先这是本介绍性的书,虽然有几个公式,但并没有深入地讲解各种算法,只是让读者对各个算法有个大概的认识,知道其大概的原理。
如果觉得看一些大部头的书有些晦涩难懂,不妨可以先翻翻这本书,让你对机器学习有个大概的浅显认识。


笔记《写给人类的机器学习》

Machine Learning for Humans

地址

目录

第1章:为什么机器学习重要
第2章:监督学习
…………回归
……………………线性回归
…………分类
……………………对率回归
……………………支持向量机
…………非参数学习机
……………………K最近邻(KNN)
……………………决策树
……………………随机森林
第3章:无监督学习
…………聚类
……………………K均值聚类
……………………层次聚类
…………降维
……………………主成分分析(PCA)
……………………奇异值分解(SVD)
第4章:神经网络和深度学习
第5章:强化学习
…………Q学习:学习动作-分值函数
…………策略学习:状态到动作的映射
…………DQN,A3C,和深度 RL 中的进展
第6章:最好的机器学习资源

第1章:为什么机器学习重要

人工智能
人工智能是智能体的研究,它可以感知周围世界,制定计划,并做出决策以实现其目标。其基础包括数学,逻辑,哲学,概率,语言学,神经科学和决策理论。许多领域都属于在 AI 下面,如计算机视觉,机器人,机器学习和自然语言处理。
机器学习
机器学习是人工智能的一个子领域。它的目标是让电脑自己学习。机器的学习算法使其能够识别观测数据中的规律,构建解释世界的模型,并且在没有明确的预编程规则和模型的情况下预测事物。

第2章:监督学习

2.1:回归

在监督学习的问题中,我们以一个数据集开始,它包含训练样本,每个样本带有关联的正确标签。例如,学习分类手写数字的时候,监督学习算法接受数千张手写体数字的图片,以及标签,它们包含每个图片表示的正确数字。算法会学习图像和关联的数值的关系。之后将学到的关系用于划分全新的图片(不带标签),机器从来没有见过它们。

  • 为展示监督学习的工作原理,我们看一个问题:根据某人完成的高等教育年数,来预测年收入。即要构建一个模型,它近似描述高等教育年数 x 和对应年收入 y 的关系 f
    y = f(x)+ϵ

    x:(输入)为高等教育的年数。
    y:(输出)为年收入。
    f:为描述 x 和 y 关系的函数。
    ϵ:(epsilon)为随机误差项(可正可负),均值为零。表示模型的残余误差,它是你算法的理论极限,由于你尝试解释的现象中存在固有噪声。
    监督学习的目标是,当获得 x 已知 y 未知的新样本时,尽可能准确地预测 y
监督学习的两个任务:回归和分类
回归:预测连续值
回归预测连续的目标变量 y,连续的意思是,在 y 可以取的值中,不存在间隔(不连续)
  • y = f(x) + ϵ ,其中 x = (x1, x2 … xn)
    训练:机器从带标签的训练数据习得 f
    测试:机器从不带标签的测试数据预测 y
    数据分为训练集和测试集。
    训练集拥有标签,你的模型可从这些带标签的样本中学习。
    测试集不带标签,你还不知道尝试预测的值。模型可推广到从未见过的情况,以便它在测试数据上表现良好。
线性回归(普通最小二乘)
首先,我们专注于使用线性回归解决收入预测问题。 我们拥有数据集 x ,及对应的目标值 y 。**普通最小二乘(OLS)**的目标是,习得一个线性模型,如果有一个未见过的 x ,可用它来预测对应的 y ,并误差尽可能小。即基于某个人的教育年数,猜测它的收入。 线性回归是个参数化方法,即它需作出 x 和 y 的函数形式的假设。我们的模型是个函数,使用特定的 x 预测 ŷ :
ŷ = β 01\*x+ϵ

我们假设 x 和 y 是线性关系。即对于每个 x 中的单位增长, y 的增长(或下降)不变。

我们的目标是,习得模型参数(这里是 β 0、β 1),使模型预测中的误差最小。 以图形的方式,在二维中,它会产生一条最佳拟合直线。在三维中可以画一个平面,高维中就是超平面。
![这里写图片描述](https://i.imgur.com/GSr75gt.png)
为寻找最佳的参数: 1. 定义一个成本函数,或损失函数,它度量我们的模型的预测有多么准确。 2. 寻找使损失最小的参数,也就是,使我们的模型尽可能准确。 在数学上,我们观察每个真实数据点( y )和我们的模型的预测( ŷ )之间的差。计算这些差的平方来避免负数,并惩罚较大的差,之后将它们相加并取平均。这度量了我们的数据有多么接近直线。
**成本函数(损失函数) Cost = n1((β1xi+β0)yi)22\*n ∑ 1 n ( ( β 1 x i + β 0 ) − y i ) 2 2 \* n **

n 为观察值的数量。用 2*n 来代替 n ,在求导中使损失最小时,使式子更整洁。
这是种约定俗成的作法。

我们可使用**微积分**计算闭式解,来寻找最佳的 β 参数,它使我们的损失函数最小。 但随着成本函数的复杂性增长,用微积分寻找闭式解就不太可能了。这就推动了一种迭代方式,叫**梯度下降**,它允许我们使复杂的损失函数最小。
梯度下降:习得参数
梯度下降会不断出现,特别是在神经网络中。 机器学习库,例如 scikit-learn 和 TensorFlow 会在背后的很多地方使用它。 **梯度下降的目标是寻找我们模型的损失函数的最小值,通过在迭代中得到它的越来越好的近似值。** 我们看回归中的损失函数 Cost = n1((β1xi+β0)yi)22\*n ∑ 1 n ( ( β 1 x i + β 0 ) − y i ) 2 2 \* n 这实际上是关于两个变量β 0、β 1的函数。公式中所有其余参数都已确定(x、y、n都已在训练过程中提供) 现在要使函数 **f(β 01) = z** 的值最小。为了开始梯度下降,需要对参数β 0和β 1做出一些猜测,使函数最小。 寻找损失函数的每个β参数的**偏导数 [dz/dβ 0,dz/dβ 1]**,偏导数表示:如果为β 0或β 1增加一个很小的增量,总损失相应的增减量是多少。 比如计算中,如果参数β 1当时位置的偏导数 dz/dβ 1 是个负数,则β 1的增加可以降低总损失,如果 dz/dβ 1 是个正数,则需降低β 1的值,如果 dz/dβ 1 为零,则不要修改β 1,因为这表示已经到达最优。持续这件事,如下图知道到达底部,即算法收敛,损失达到最小。这就是参数化模型寻找最优参数的方式。
![这里写图片描述](https://i.imgur.com/WYKQyoq.png)
过拟合(Sherlock)
机器学习的一个常见问题就是**过拟合**:习得一个函数,它完美解释了模型从中学习的训练数据,但是不能很好地推广到未见过的测试数据。其在模型从训练数据中过度学习时发生。 相反**拟合不足**也是一个问题,即模型不够复杂,不能捕获数据的隐含趋势。

偏差和方差的权衡
偏差(bias)是误差总数,由使用简化的模型来近似真实世界的情况引入。
方差(variance)是模型测试误差变化量,基于训练数据的变化。它反映模型对训练数据集个性的敏感度。


上图”High variance”的模型因他完美拟合了每个数据,其对训练数据是零损失的。但这种模型无法推广,其在测试数据上的表现反而不如”Just right”

泛化误差(generalization error)
NFL1告诉我们选择算法应与具体问题想匹配,通常看一个算法好坏就是看其泛化性能。
学习算法的预测误差,或者说泛化误差(generalization error)可分解为三个部分:偏差(bias),方差(variance)和噪声(noise)。因噪声属于不可约减的误差(irreducible error),我们主要关注偏差和方差。

偏差度量学习算法的期望预测与真实结果的偏离程序, 即刻画了学习算法本身的拟合能力
方差度量同样大小的训练集的变动所导致的学习性能的变化, 即刻画了数据扰动所造成的影响
噪声表达在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

两种避免过拟合的方法: 1. 使用更多训练数据。 2. 使用**正则化**。在损失函数里添加一个惩罚,来构建一个模型,避免为任意一个特征分配过多的解释性权重,或允许考虑过多特征。
![](https://i.imgur.com/sxDBofF.png)
上式第一部分是正常的损失函数。第二部分就是正则项,为较大的 β 系数添加惩罚。 同时使用这两个元素,成本函数现在平衡了两个优先级:**解释训练数据,并防止解释过于特定**。

正则项的 λ 系数是个超参数:模型的通用设置,可调整大小,以便改进表现。较高的 λ 值会更严厉地惩罚较大的 β 参数,可能导致过拟合。
为决定 λ 的最佳值,可使用交叉验证的方法,它涉及在训练过程中,保留一部分训练数据,之后观察,模型对保留部分的解释情况。

  • 线性回归更彻底的讲解,参见《统计学习导论》1~3章

2.2:分类

对数几率(logistic)回归是个分类方法:模型输出目标变量 y 属于某个特定类的概率。
比如判断贷款申请人是不是骗子,对数几率回归的目标就是计算申请人是骗子的概率(0%~100%)。使用这些概率,可设定一些阈值,从而进行分类。

可以使用普通最小二乘法马?
不能。如果在大量样本上训练线性回归模型,其中 y = 0 或 1 ,最后可能预测出一些小于 0 或大于 1 的概率,这毫无意义。反之,使用对数几率回归模型(或对率(logit)模型),它为分配“ Y 属于某个特定类”的概率而设计,范围是 0%~100%。

数学原理:
对率模型是个线性回归的改良,通过应用 sigmoid 函数,确保输出 0 和 1 之间的概率。

S(x) = \(\frac{1}{1+e^{-x}}\)

sigmoid 函数,它将值压缩到 0 和 1 之间。
首先我们想到最理想的是单位阶跃函数:


但单位阶跃函数不是单调可微函数,因为它不连续。很难通过各种数值优化(比如梯度下降)求取最优解。
所以我们找到一种一定程度上近似单位阶跃函数的“替代函数”,并且单调可微,是任意阶可导的凸函数。通常使用这种S型函数(Sigmoid Function)来替代它。

之前我们的简单线性回归模型的原始形式为 g(X) = β01*x+ϵ
现在,为解决模型输出小于 0 或者大于 1 的问题,我们定义一个新的函数 F(g(x)),它将线性回归的输出压缩到 [0,1] 区间,来转换 g(X)。
我们想的利用 sigmoid 函数解决这个问题。将 g(x) 插入 sigmoid 函数中,得到了原始函数的一个函数,它输出 0 和 1 之间的概率。

P(y=1) = F(g(x)) = \(\frac{1}{1+e^{-(β_0+β_1x)}}\)

如果F(g(x))是样本x作为正例的可能性,那么 1–y 就是其反例的可能性。如果F(g(x))>0.5,那么可认为结果属于正例,将其划分为1类,否则划分为0类。这个阈值不一定是0.5,它取决于你对假阳性(误报)和假阴性(漏报)的容忍度。
P(y=1)是 y=1 的概率,在等式左边。如我们求解等式右边,就会得到对数几率比值(简称对率),它在等式右边。这就是“对率模型”的由来。

ln(\(\frac{p}{1-p}\)) = β01x+ϵ

如上式,对数几率比值 β01x+ϵ 仅是 概率比值 p/(1-p) 的自然对数。

注意在对率模型中,β1 表示当 X 变化时,对率的变化比例。换句话说,它是对率的斜率,并不是概率的斜率。

对数几率回归的最小损失

像线性回归的例子那样,我们使用梯度下降来习得使损失最小的 β 参数。
在对率回归中,成本函数是这样的度量,当真实答案是 0 时,有多么经常将其预测为 1,或者反过来。下面是正则化的成本函数,就像我们对线性回归所做的那样。


第一个部分是数据损失,就是模型预测值和实际值之间有多少差异。第二个部分是正则损失,就是我们以什么程度,惩罚模型的较大参数,其过于看重特定的特征(过拟合)。

然后使用梯度下降,使损失函数最小。至此我们构建了一个对数几率回归模型,来尽可能准确地预测分类。

支持向量机 SVM

支持向量机通常与对率回归解决相同的问题:二元分类,并产生相似效果。然而它的算法本质上是由几何驱动的,并不是由概率思维驱动的。数学上采用的是拉格朗日优化
SVM适合解决下面一类问题:这图片是猫还是狗?这个评论是正面还是负面的?二维图片上的点事红色还是蓝色?

比如我们在二维空间中分类两种点,为了实现它,SVM 使用分隔直线(在高维里面是个多维超平面),将空间分成红色区域和蓝色区域。



二维中一个普通的SVM就是一条直线,用来完美划分linearly separable(线性可分)的两类。它是无数条可以分类的直线中最优的,因为它恰好在两个类的中间,距离两个类的点都一样远。所谓的 Support vector 就是这些离分界线最近的点。

遇到不能干净地分隔数据时:
1. 软化“分隔”的定义。允许一些错误,即分类中有相互掺杂。
2. 将数据放到高维。可创建非线性的分类器,通过增加维数,然后找到边界,再将其带回低维表示。本质上类似红蓝的弹珠都在二维地面上,这样无法用直线分隔,但将弹珠以一定方式抛离地面,就可以找到一个平面来分隔它们,之后再将其落回地面,就得到了分隔边界。


我们把分隔线称为分类器(classifier),最大间隙trick叫做「optimization」,将弹珠抛离地面(增维)叫做「kernelling」,增维后的分隔面称为超平面「hyperplane」。

2.3:非参数学习器

目前涉及的方法:线性回归、对率回归、SVM,它们的模型都是预定义的。相反,非参数学习器事先没有特定的模型结构。在训练模型前,我们不会推测我们尝试习得的函数 f 的形式,模型结构纯粹由数据定义。

K最近邻(KNN)

KNN是著名的模式识别统计学方法。基本思路是如果一个实例在特征空间中的K个最相似(即特征空间中最近邻)的实例中的大多数属于某一个类别,则该实例也属于这个类别。所选择的邻居都是已正确分类的实例。
其中K通常是不大于20的整数。如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,绿色圆被赋予蓝色四方形类。可见KNN算法的结果很大程度取决于K的选择。

另外当收集到了K个最近的数据点,如果变量是连续的(例如房价),取它们的均值;如果变量是离散的(例如猫或者狗),取它们的众数。

在KNN中,通过计算对象间距离来作为各对象间的非相似性指标,在这里距离一般使用欧氏距离曼哈顿距离。如下图,绿色为欧氏距离,蓝色为曼哈顿距离。

选取 k :使用交叉验证调优超参数

为了决定我们使用哪个 k ,你可以测试不同的 KNN 模型,使用交叉验证对比 k 的不同值。
通过将模型的预测( ŷ ),与测试数据的真实值( y )相比,查看模型表现情况。
然后在所有迭代中,选取误差最小的模型。

较高的K值防止过拟合

较高的K值能够防止过拟合,但如果K太高,模型会有很大偏差,且不灵活。比如 K=N (数据点总数),模型就会失效,即无论输入什么值,返回的都是训练数据的均值或者众数。

决策树

分类决策树模型是一种描述对实例进行分类的树形结构。
决策树由结点和有向边组成。结点有两种类型:内部节点和叶节点,内部节点表示一个特征或属性,叶节点表示一个类。
分类的时候,从根节点开始,对实例的某一个特征进行测试,根据测试结果,将实例分配到其子结点;此时,每一个子结点对应着该特征的一个取值。如此递归向下移动,直至达到叶结点,最后将实例分配到叶结点的类中。

决策树根节点的第一次分割的信息增益应该最大。
熵是集合中的无序的总数,由基尼系数和交叉熵度量。如果值相当混杂,熵就很大;如果能干净地分割数据,就没有熵。对于父节点的每个分割,你需要让子节点尽可能纯粹,也就是熵最小。

决策树很高效,因为它易于解读,即使对凌乱的数据也很强大,并且一旦训练完成,部署的开销很小。它也擅长于处理混合数据(数值或类别)。
然而决策树的训练开销很大,过拟合风险很大,并且容易找到局部最优,因为它们在分割之后就无法回溯。
为了解决这些缺陷,我们需要随机森林,它演示了将多个决策树整合为一个模型的力量。

随机森林(Random Forest):决策树的集成

由多个模型整合的模型叫做集成模型。随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法
从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

单个决策树可能做出很多错误判断,因为它有很多非黑即白的判断。而随机森林继承了多个决策树,并拥有一些可观的改进:

  • 每个节点上分割的特征数量限制为总体的一定百分比(这是个可调整的超参数),确保继承模型不会过度依赖单个特征,并且公平利用所有潜在的预测性特征。
  • 每个决策树从原始数据集抽取随机样本,来生成自己的分割,这添加了进一步的随机元素来防止过拟合。随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法)。

这些改进防止了树的高度相关。如果没有这些改进,每棵树都是相同的,因为递归的二元分割是决定性的。

随机森林案例:
随机森林利用某个人的年龄(Age)、性别(Gender)、教育情况(Highest Educational Qualification)、工作领域(Industry)及住宅(Residence)共5个字段来预测他的收入层次。
收入层次:
Band 1:Below 40,000Band2 40 , 000 B a n d 2 : 40,000 – 150,000
Band 3:More than $150,000
随机森林中每棵树都可看做是一棵CART(分类回归树),这里假设有5棵CART树,总特征数 N=5,我们取m=1(这里假设每个CART树对应一个不同的特征)
CART 1:Variable Age


CART 2:Variable Gender

CART 3:Variable Education

CART 4:Variable Residence

CART 5:Variable Industry

我们要预测的某个人的信息如下:
1. Age:35 years
2. Gender:Male
3. Highest Educational Qualification:Diploma holder
4. Industry:Manufacturing
5. Residence:Metro.

根据这五棵CART树的分类结果,我们可针对这个人的信息建立收入层次的分布情况:


最后我们得出结论,这个人的收入层次70%是一等,约24%为二等,6%为三等,所以最终认定该人属于一等收入层次(小于$40,000)。

以下是各种算法,以及准确度的比较:


第3章:无监督学习

聚类和降维:K-Means 聚类,层次聚类,主成分分析(PCA),奇异值分解(SVD)

我们可以怎样发现一个数据集的底层结构?
我们可以怎样最有用地对其进行归纳和分组?
我们可以怎样以一种压缩格式有效地表征数据?
这都是无监督学习的目标,之所以称之为「无监督」,是因为这是从无标签的数据开始学习的

聚类(clustering)

将数据按相似度聚类(clustering)成不同的分组

K均值聚类

聚类的目标是为数据点分组,使得不同聚类中的数据点是不相似的,同一聚类中的数据点则是类似的。
使用K均值聚类,我们希望将数据点聚类为 K 组。K 更大时,创造的分组就更小,就有更多粒度;K 更小时,则分组就更大,粒度更少。
该算法的输出是一组「标签」,这些标签将每个数据点都分配到了 K 组中的一组。在K均值聚类中,这些组的定义方式是为每个组创造一个重心(centroid),它们可以「捕获」离自己最近的点并将其加入到自己的聚类中。

可把这些重心看作派对上的焦点人物,他们就像是有磁性一样。如果只有一个这样的人,每个人都会围绕在他周围;如果有很多这样的人,就会形成很多更小一点的活动中心。

K 均值聚类的步骤如下:
1. 定义 K 个重心。一开始这些重心是随机的(也有一些更加有效的用于初始化重心的算法)
2. 寻找最近的重心并且更新聚类分配。将每个数据点都分配给这 K 个聚类中的一个。每个数据点都被分配给离它们最近的重心的聚类。这里的「接近程度」的度量是一个超参数——通常是欧几里得距离(Euclidean distance)。
3. 将重心移动到它们的聚类的中心。每个聚类的重心的新位置是通过计算该聚类中所有数据点的平均位置得到的。
4. 重复第 2 和 3 步,直到每次迭代时重心的位置不再显著变化(即算法收敛)。

K 均值聚类的另一真实应用是分类手写数字。假设我们有用像素亮度的长向量表示的数字的图像。假设这些图像是黑白两色的,大小为 64×64 像素。每个像素代表一个维度。那么这些图像就生活在一个有 64×64=4096 个维度的世界里。在这个 4096 维的世界里,K 均值聚类可以按接近程度对这些图像分组,并假设这些靠得很近的图像都是同一个数字。这种算法可在数字识别上得到相当好的结果。

层次聚类

层次聚类类似于常规的聚类,只是你的目标是构建一个聚类的层次。如果最终的聚类数量不确定,那这种方法会非常有用。
比如说,假设要给亚马逊网络市场上的项目分组。在主页上,只需要少量大组方便导航,但随着你的分类越来越特定,你需要的粒度水平也越来越大,即区别更加明显的项聚类。
在算法的输出方面,除了聚类分配,你也需要构建一个很好的树结构,以帮助你了解这些聚类之间的层次结构。然后可以从这个树中选择你希望得到的聚类数量。

层次聚类的步骤如下:
1. 首先从 N (数据点总数) 个聚类开始,每个数据点一个聚类。
2. 将彼此靠得最近的两个聚类融合为一个。现在你有 N-1 个聚类。
3. 重新计算这些聚类间的距离。有很多可办到这件事的方法(链接)。其中一种(平均连接聚类,average-linkage clustering)是将两个聚类间的距离看作是它们各自元素之间所有距离的平均。
4. 重复第 2 和 3 步,直到得到包含 N (数据点总数) 个数据点的一个聚类。你就会得到如下图所示的树(也被称为树状图)。


5. 选择一个聚类数量,然后在这个树状图中划一条水平线。比如,如果你想要 K=2 个聚类,你应该在距离大约为 20000 的位置画一条水平线,你会得到一个包含数据点 8、9、11、16 的聚类和包含其它数据点的另一个聚类。一般而言,你得到的聚类的数量就是水平线与树状图中的竖直线的交叉点的数量。

降维

降维是一种数据集预处理技术,往往在数据应用在其他算法之前使用,它可以去除掉数据的一些冗余信息和噪声,使数据变得更加简单高效,提高其他机器学习任务的计算效率。之后,这些数据可被用于深度神经网络或其它监督式学习算法。

主成分分析(PCA)

主成分分析方法,是一种使用最广泛的数据压缩算法。PCA可从数据中识别主要特征,通过将数据坐标轴旋转到数据角度上那些最重要的方向(方差最大),然后通过特征值分析,确定出需保留的主成分个数,舍弃其他主成分,从而实现数据的降维。

在PCA中,数据从原来的坐标系转换到新的坐标系,由数据本身决定。转换坐标系时,以方差最大的方向作为坐标轴方向,因为数据的最大方差给出了数据的最重要的信息。第一个新坐标轴选择的是原始数据中方差最大的方法,第二个新坐标轴选择的是与第一个新坐标轴正交且方差次大的方向。重复该过程,重复次数为原始数据的特征维数。
获得的新的坐标系中,大部分方差都包含在前面几个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可忽略余下的坐标轴,只保留前面几个含有绝大部分方差的坐标轴。这样相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,也就实现了对数据特征的降维处理。

那么我们如何得到这些包含最大差异性的主成分方向呢?事实上,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值及特征向量,选择特征值最大(即包含方差最大)的N个特征所对应的特征向量组成的矩阵,我们就可以将数据矩阵转换到新的空间当中,实现数据特征的降维(N维)。

奇异值分解(SVD)

假设将我们的数据表示成一个 A=m×n 的大型矩阵。SVD 可以将这个大型矩阵分解成 3 个较小的矩阵的乘积;这 3 个矩阵分别是 U=m x r 、对角矩阵 Σ=r x r 、 V=r x n ,其中 r 是一个很小的值。

在这个 r×r 的对角矩阵 Σ 中的值被称为奇异值。这些值的奇妙之处是可被用于压缩原来的矩阵,如果你丢弃奇异值中最小的 20% 以及矩阵 U 和 V 中相关的列,你就可以节省大量空间,同时仍然能很好地表征原来的矩阵。


第4章:神经网络和深度学习

使用深度学习, 我们仍然是习得一个函数 f , 将输入 X 映射为输出 Y , 并使测试数据上的损失最小。
但真实世界有时 f 很复杂。自然语言问题中,较大词汇数量意味着大量特征。视觉问题设计大量的像素相关的视觉信息。
深度学习非常善于习得 f,特别是在数据很复杂的场景中。实际上,人工神经网络也被称为通用函数近似器,因为它们能学习任何函数,无论多么扭曲,都只需一个隐藏层。

中间的层仅计算大量的矩阵相同,通过在每个隐藏层之后,使用非线性变换( 激活函数),对激活值 x 的权重求和,来让神经网络习得非线性函数。
你可以使用梯度下降,以对线性回归所做的相同方式,使损失最小。所以使用大量样本和大量梯度下降,模型可习得如何正确分类动物图片。这简单来说,就是“深度学习”。

通过图解,深度神经网络的图像分类解决方式,类似于这样:

输入层接受图像的原始像素亮度。最终的层级会是类概率的输出向量(也就是图像是猫、车子、马,及其他的概率) 。但我们不习得一个简单的,和输入输出相关的线性模型。我们构造网络中间的隐藏层,它们会渐进学习抽象特征,这让我们不会丢失复杂数据中的所有细微差异。
隐藏层中的人工神经元会学着检测抽象概念,无论哪个概念,只要它对于捕捉最多信息,及使网络输出的准确度中的损失最小非常实用。
然而当你添加更多隐藏层时,神经元开始表示越来越多的抽象和无法理解的特征。这会损失模型的可解释性(无法看懂模型如何运行),因此深度学习也被称作“黑箱优化”,你基本上只是随机尝试一些东西,然后观察出现了什么,而无需真正理解里面发生了什么。

  • 深度学习软件包:
    很少需要从零开始实现神经网络的所有部分,因为现有的库和工具使深度学习更加易于实现。
    比如: TensorFlow, Caffe, Torch, Keras

  • 卷积神经网络(CNN):
    CNN 特地为接受图像输入而设计,且对于计算机视觉任务非常高效。它也有助于深度增强/强化学习。CNN 的灵感来源于动物的视觉皮层的工作方式,且它们是深度学习课程的热点。

  • 循环神经网络(RNN):
    RNN 拥有内建记忆的概念,且非常适合语言问题。它在强化学习中也很重要,因为它让智能体能够跟踪东西在哪里,及之前发生了什么。

  • 深度增强/强化学习:
    这是深度学习研究中的最刺激的领域之一。例如 OpenAI 击败了 Dota2 职业玩家,及 AlphaGo 在围棋中胜过人类。本质上的目标是教会智能体使回报最大。这可用于与任何可以游戏化的环境,从真实的游戏,到无人驾驶的汽车,或股票交易,最终到真实生活和真实世界。


第5章:强化学习

在监督学习中,训练数据带有来自神一般的“监督者”的答案。
强化学习(RL)中,没有这种答案,但你的强化学习智能体仍可以决定如何执行它的任务。在缺少现有训练数据的情况下,智能体从经验中学习。在它尝试任务的时候,它通过尝试和错误收集训练样本(这个动作非常好,或非常差),目标是使长期奖励最大。

假设我们正在玩一个游戏,其中我们的老鼠正在寻找迷宫尽头处的奶酪的终极奖励(+1000分),或沿路的水的较少奖励(+ 10 分)。同时机器老鼠打算避开带有电击的区域(⚡ -100 分)。


老鼠可能找到三个水资源的小型天堂,并花费时间来利用它的发现,通过不断积累水资源的小型奖励,永远不深入迷宫来追求更大奖励。
这就产生了探索和利用的权衡。老鼠的一种用于探索的简单策略是,在大多数情况下(可以是80%),做出最佳的已知动作,但偶尔探索新的,随机选取的方向,即使它可能远离已知奖励。
这个策略叫做 epsilon 贪婪策略,其中 epsilon 就是“给定全部已知知识的条件下,智能体做出随机选取的动作,而不是更可能最大化奖励的动作”的时间百分比(这里是 20%)。
我们通常以大量探索起步(也就是较高的 epsilon 值)。之后,随着老鼠更加了解迷宫,以及哪个操作产生更大的长期奖励,它会将 epsilon 逐渐降到 10%,甚至更低,因为它习惯于利用已知。

老鼠迷宫之旅可以形式化为马尔科夫决策过程 (MDP)。其包含:
- 有限的状态集。老鼠在迷宫中有可能的位置。
- 每个状态上的可用的动作集。就是走廊中的“前进,后退”,或十字路口中的“前进,后退,左转,右转”。
- 状态之间的转换。例如,如果在十字路口左转,就会到达一个新的位置。一系列概率可能链接到至少一个状态上。
- 和每个转换有关的奖励。在机器老鼠的例子中,多数奖励都是 0,但如果你到达一个位置,那里有水或者奶酪,就是正的,如果有电击就是负的。
- 0 和 1 间的折现系数 γ。它量化了立即奖励和未来奖励的重要性的差异。例如,如果 γ 是 0.9,且 3 步之后奖励为 5,那么奖励的当前值就是 0.93 * 5
- 无记忆。一旦知道了当前状态,老鼠的历史迷宫踪迹可以擦除,因为马尔科夫的当前状态包含来自历史的所有拥有信息。换句话说,“了解现在的情况下,未来不取决于历史”。

我们知道了 MDP 是什么,就可以形式化老鼠的目标。尝试使长期奖励之和最大:


步骤:t,状态:x,动作:a
奖励函数:r(x,a),对于状态 x 和动作 a(也就是在十字路口左转),它会带给你奖励,和状态 s 上的动作 a 相关。

现在我们建立了我们的强化学习问题,并形式化了目标,让我们探索以下几种可能的解决方案。

Q学习:学习动作-分值函数

Q学习是一种技巧,它基于动作-分值函数求解了要做出哪个动作,这个函数确定了在特定状态下做出特定行为的分值。
函数 Q 接受一个状态和一个动作作为输入,并返回这个动作(以及所有后续动作)在这个状态上的预期奖励。在我们探索环境之前,Q 提供相同(任意)的固定值。但之后,随着我们探索了更多环境,Q 向我们提供动作 a 在状态 s 上的分值的,不断优化的近似。我们在这个过程中更新我们的函数 Q。

策略学习:状态到动作的映射

在 Q 学习方式种, 我们习得了一个分值函数,它估计了每个状态-动作偶对的分值。
策略学习是个更直接的替代,其中我们习得一个策略函数 π ,它是每个状态到最佳对应动作的直接映射。将其看做一个行为策略: “当我观测到状态 s 时,最好执行动作 a 。”例如,一个自动驾驶的策略可能包括:“如果我看到黄灯, 并且我离十字路口超过 100 英尺,应该停下来。否则,继续向前移动。”

策略是状态到动作的映射

我们知道,什么最擅长习得复杂的函数呢? 深度神经网络

DQN,A3C,和深度 RL 中的进展

2015 年, DeepMind 使用了一个叫做深度 Q 网络( DQN) 的方法, 使用深度神经网络近似 Q 函数。以便在许多 Atari 游戏中击败人类。
2016 年, 仅仅在 DQN 论文的一年之后, DeepMind 发布了另一个算法, 叫做 AsynchronousAdvantage Actor-Critic( A3C)。A3C 是一种行动-评判算法, 组合了我们之前探索的两种方式: 它使用行动器(一个决定如何行动的策略网络),以及一个评判器(一个 Q 网络,决定什么是有价值的东西)。


  1. 没有免费的午餐定理 NFL(No Free Lunch Theorem):NLF讲的是在不考虑具体问题的情况下,没有任何一个算法比另一个算法更优,甚至没有胡乱猜测更好。 1. 不存在一个与具体应用无关的,普遍适用的“最优分类器”。 2. 学习算法必须要作出一个与问题领域有关的“假设”,分类器必须与问题域相适应。 ↩

你可能感兴趣的:(笔记,机器学习,机器学习)