跳转至

动手学深度学习

记录一下读动手学深度学习一书的笔记。

引言

日常生活中的机器学习

  • 日常生活中的机器学习
    • 语音识别,这看起来是个毫无头绪的程序,由此我们需要机器学习
    • 即使我们不知道如何从输入映射到输出,人类的大脑却有这样的能力,机器学习?
    • 我们只需要收集一个包含大量音频样本的标记数据集,通过一个灵活的程序算法,其输出由许多参数决定,并使用收集的标记数据集来确定当下的“最佳参数集”即可。
  • 何为参数?
    • 可将参数看作旋钮,转动可以调整程序的行为。
    • 构建了输入到输出的映射。
  • 何为模型?
    • 调整参数后的程序我们就可以称之为模型。
    • 不同参数而生成的不同程序的集合称为模型族。
    • 我们可以将相似任务划分到一个模型族,而完全不同的任务可能需要一个完全不同的模型族。
  • 何为机器学习?
    • 使用数据集来选择参数的元程序称为学习算法。
  • 模型参数都是随机的,这样显然不太可能能够完成我们的目标,因此我们需要训练
    • 训练的基本流程:
      • 设计一个模型,这个模型可能是从随机初始化参数开始的,此时没有智能
      • 获取一些数据样本,你如音频片段以及对应的标签
      • 调整参数,使得模型在上述样本中表现得更加好
      • 重复2、3步骤,直到模型在任务上表现令人满意
  • 我们的工作就是:编写一个“学习”程序。

机器学习中的关键组件

  • 机器学习中的关键组件
    • 用来学习的数据 data
    • 转换数据的模型 model
    • 量化模型有效性的目标函数 objective function
    • 调整模型参数以优化目标函数的算法 algorithm
  • 数据
    • 没有数据,数据科学将毫无用武之地
    • 数据集由样本组成 example、sample
    • 大多时候,样本遵循独立同分布
    • 通常情况下,每个样本由一组称为特征 features 的属性组成
    • 机器学习模型会根据这些属性进行预测
    • 每个样本特征类别数量都是相同的时候,其特征向量是固定长度的,该长度称为数据的维数 dim。
      • 固定长度的特征向量是一个方便的属性,可以用来量化学习大量样本
      • 并非所有数据都可以用“固定长度”的向量表示。
      • 例如来自互联网上的图片数据,很难具有相同的分辨率或形状。
      • 将图像裁剪成标准尺寸是一种方法,但会丢失信息。
      • 文本数据更加不符合“固定长度”的要求,例如电商网站的客户评论,有的简短,有的长篇大论。
    • 深度学习相较于传统机器学习方法的主要优势是可以处理不同长度的数据
    • 一般来说,越多的数据意味着越容易的工作
      • 更多的数据可以被用来训练出更强大的模型,从而减少对于预先假设的依赖。
      • 数据集的从小变大为现代深度学习成功奠定了基础。
      • 没有大数据集的情况下,许多令人兴奋的深度学习模型都将黯然失色。
    • 我们不仅仅是要拥有海量的数据,还需要海量正确的数据。
      • 如果数据中充满错误,或者特征不能预测任务目标,则模型很可能失败。
      • Garbage in, garbage out.
    • 不均衡的数据集,训练集中没见到过某种数据,模型预测时会手足无措。
    • 不公正的数据集,数据不具备充分代表性时,模型可能就会引入偏见。
  • 模型
    • 深度学习区别于经典方法的主要特点就是其关注的功能强大的模型
    • 这些模型由神经网络复杂交织在一起,包含层层数据转换,因此称为深度学习deep learning
  • 目标函数
    • 机器学习中如何定义模型的优劣程度的度量?我们称之为目标函数 objective function
      • 这个度量在大多数情况是可以优化的。
      • 通常情况下,我们定义一个目标函数,并希望优化到最低点。因为越低越好,我们也称为损失函数 loss function 或者 cost function
      • 但损失函数只是一个惯例,我们也可以取一个函数,优化到最高点为我们的目标。
      • 但其实本质上一样,只是翻转一下符号。
    • 损失函数的常见形式有:
      • 预测数值时,最常见的损失函数是平方误差 squared error
      • 分类问题时,最常见的目标函数是最小化错误率
      • 有些目标函数如平方误差很容易被优化,但有些目标比如错误率由于不可微性或其他复杂性难以直接优化,通常会替换目标。
  • 数据集
    • 损失函数取决于数据集?
    • 在一个数据集上,我们可以通过最小化总损失来学习模型参数的最佳值。
    • 数据集中为训练而收集的样本称为训练数据集 training dataset
    • 训练数据上表现良好的模型,不一定在“新数据集”上有同样的性能,这里的“新数据集”通常为测试数据集 test dataset
    • 数据集通常分为两部分
      • 训练数据集用于拟合模型参数
      • 测试数据集用于评估拟合的模型
      • 一个模型在训练数据集上表现良好,但不能推广到测试集时,称为过拟合 overfitting
      • 模拟考试考得很好,真正的考试不一定百发百中。
  • 优化算法
    • 我们有了数据源、模型、损失函数,接下来需要一种算法,能够搜索出最佳参数,以最小化损失函数。
    • 深度学习中大多基于一种基本方法——梯度下降 gradient descent。
    • 每个步骤中,梯度下降算法都会检查每个参数,看看仅对该参数进行少量变动训练集损失会朝着哪个方向移动
    • 然后,它在可以减少损失的方向上优化参数。

各种机器学习问题

  • 监督学习 supervised learning
    • 擅长在“给定输入特征”的情况下预测标签。
    • 每个“特征-标签”对称为一个样本 example。
    • 我们的目标是生成一个模型,能够将任何输入特征映射到标签即预测上
    • 举一个具体的例子: 假设我们需要预测患者的心脏病是否会发作,那么观察结果“心脏病发作”或“心脏病没有发作”将是样本的标签。 输入特征可能是生命体征,如心率、舒张压和收缩压等。
    • 监督学习之所以能发挥作用,是因为在训练参数时,我们为模型提供了一个数据集,其中每个样本都有真实的标签。 用概率论术语来说,我们希望预测“估计给定输入特征的标签”的条件概率
    • 在工业中,大部分机器学习的成功应用都使用了监督学习。 这是因为在一定程度上,许多重要的任务可以清晰地描述为,在给定一组特定的可用数据的情况下,估计未知事物的概率。
    • 监督学习的学习过程一般可以分为三大步骤:
      • 从已知大量数据样本中随机选取一个子集,为每个样本获取真实标签。有时样本已有标签,有时需要人工标注。
      • 选择有监督的学习算法,将训练数据集作为输入,输出一个已经完成学习的模型。
      • 将之前没有见过的样本特征放到这个模型中,使用模型的输出作为相应标签的预测。
    • 回归 regression
      • 最简单的监督学习任务之一。
      • 预估房价为什么是回归问题?本质是由输出所决定的
        • 销售价格是一个数值。
      • 当标签是数值时,我们称之为回归问题。此时目标是生成一个模型,使得预测非常接近实际标签值。
      • 判断回归问题的一个很好的经验法则,任何有关“有多少”的问题很可能就是回归问题
      • 很多时候并不是完美的模型,我们要尝试学习最小化“预测值和实际标签值的差异”的模型,例如平方误差损失函数的最小化
    • 分类 classification
      • “哪一个”的问题叫做分类问题
      • 希望模型能够预测一个样本属于哪一个类别。
      • 例如手写数字可能有10个类别,0-9。最简单的分类问题为二项分类,例如区分猫和狗。
      • 回归是训练一个回归函数来输出一个数值,分类是训练一个分类器来输出预测的类别
      • 模型如何判断“是”或者“不是”的分类预测?可以试着使用概率语言来理解模型。
      • 模型为每个可能的类分配一个概率,比如猫狗分类,分类器给出图象是猫的概率为0.9,便可以理解为分类器90%确定图像描绘的是一只猫。
      • 多个类别称为多项分类,常见包括手写字符识别。
      • 上面回归问题,我们看到使用平方误差损失函数很多,但分类问题常见损失函数为交叉熵 cross-entropy
      • 不过需要注意分类结果并不一定用于最终决策。例如毒蘑菇检测,分类器80%确定无毒,但我们并不值得冒20%死亡风险。
      • 此时,不确定风险的影响远远大于收益,我们可以将“预期风险”作为损失函数,食用的损失就变成了极大数字。
      • 更加复杂的分类任务?可以用于寻找层次结构,例如对于动物物种的层次分类。
    • 标记问题
      • 无论分类模型有多精确,当分类器遇到新的动物时可能会束手无策。
      • 我们如果最终是想让模型描绘输入图像的内容,分类模型可能就没有多大意义。
      • 学习预测不相互排斥的类别的问题称为多标签分类 multi-label classification。
      • 例如技术博客上可以贴一系列标签,其中很多概念相互关联,例如云计算、AWS。
      • 处理文献时也会碰到该问题,如何正确标记文献,便于研究人员进行详尽审查。
    • 搜索
      • 有时候,我们不仅仅希望输出一个类别或者数字,信息检索领域,我们希望对一组项目进行排序
      • 网络搜索为例,我们希望的是能够找到用户最需要的那一部分,搜索结果的排序十分重要,学习算法应该能够输出有序的元素子集。
      • 即使结果集相同,内部顺序有时也至关重要
      • 该问题的可能解决方案?首先为集合中的每个元素分配相应的相关性分数,检索评级最高的元素。
        • PageRank,就是依靠一个简单的相关性过滤来识别一组相关相关条目后,利用PageRank对包含查询条件的结果进行排序。
      • 如今,搜索引擎使用机器学习和用户行为模型来获取网页相关性得分。
    • 推荐系统
      • 另一类与搜索和排名相关的问题是推荐系统 recommender system,目标是向特定用户进行“个性化”推荐。
      • 总的来说,推荐系统会为“给定用户和物品”的匹配性打分,由此,对于给定用户,推荐系统都可以检索得分最高的对象集,然后将其推荐给用户。
      • 推荐系统作为预测模型的缺陷
        • 用户更倾向于极低或者极高的评分
        • 有可能形成反馈循环,用户的购买习惯可能是由于推荐系统培养起来的,但是又没有考虑至一点,更加频繁推荐。
    • 序列学习
      • 上述大多数任务,输入和输出大小固定,模型只会将输入作为生成输出的“原料”,而不会“记住”输入的具体内容
      • 如果输入的样本之间没有任何关系,上述模型可能完美无缺。但是如果输入是连续的,模型可能就需要“记忆”功能
        • 例如我们如何处理视频片段?前一帧图像显然与后一帧联系。
        • 语言也是如此,机器翻译的输入和输出都是文字序列。
      • 序列学习是机器学习最令人兴奋的应用之一?序列学习需要摄取输入序列或预测输出序列,或者两者兼而有之
      • 类型:
        • 标记和解析。用属性注释文本序列,标记实体、动词、主语。输出和输入基本长度一致。
        • 自动语音识别。输入序列为录音,输出序列为文本记录,数千个样本可能只对应一个单独的单词,也就是输出比输入短得多。
        • 文本到语音。
        • 机器翻译。有可能需要颠倒输入和输出的顺序,不同语言的结构不一样。输入和输出序列的数量以及顺序大都不会相同。
  • 无监督学习
    • 上述监督学习的例子,都需要向模型提供巨大数据集,每个样本包含特征和相应标签值
      • 打趣?“监督学习”模型像一个打工仔,老板告诉他做什么,他就去学习从情况到行动的映射,识别出这种映射模式并且模仿就能够取悦老板
    • 如果工作没有具体的目标呢?“自发”去进行学习?
      • 老板给了一堆数据但是没告诉我们做什么
      • 这类不含有“目标”的机器学习问题通常被称为无监督学习 unsupervised learning
    • 可以回答什么问题?
      • 聚类 clustering 问题:没有标签的情况下,是否能够给数据分类?
      • 主成分分析问题:能否找到少量参数来准确捕获数据的线性相关属性?
      • 因果关系和概率图模型问题:能否描述观察到的许多数据的根本原因?
      • 生成对抗性网络 generative adversarial networks:提供一种合成数据的方法。
  • 与环境互动
    • 可能的疑问:机器学习的输入来自哪里?输出又将去往何处?
      • 上述两种学习,我们都会预先获取大量数据,然后启动模型,不再与环境交互
      • 所有学习都是在算法与环境断开后进行的,称为离线学习 offline learning
      • 好的一面是,可以孤立地进行模式识别,不必分心其他问题。
      • 缺点是,解决问题有限,不能够与真实环境互动
    • 我们想要的不仅仅是“预测模型”,还需要是“智能代理”。如此,我们就需要考虑代理行为可能对于未来观察结果的影响。
    • 强化学习就是一类明确考虑与环境交互的问题
  • 强化学习
    • 如果对于使用机器学习开发与环境交互并采取行动感兴趣,可能最终会专注于强化学习 reinforcement learning
    • 深度强化学习将深度学习应用到了强化学习问题上。
    • Q-network、AlphaGo
    • 强化学习问题中,智能体 agent 在一系列时间步骤上与环境交互
      • 每个特定时间点,智能体从环境接收一些观察 observation,并且必须选择一个动作 action。
      • 然后通过某种机制例如执行器将其传输会环境
      • 最后智能体从环境中获得奖励 reward
      • 此后开始新一轮循环,观察、行动……
    • 强化学习的目标是产生一个好的策略 policy
      • 强化学习智能体选择的“动作”受策略控制,即一个从环境观察映射到行动的功能。
      • 讲的不错,所谓策略不就是观察环境选择进行行动吗
    • 强化学习框架的通用性十分强大。 例如,我们可以将任何监督学习问题转化为强化学习问题。 假设我们有一个分类问题,可以创建一个强化学习智能体,每个分类对应一个“动作”。 然后,我们可以创建一个环境,该环境给予智能体的奖励。这个奖励与原始监督学习问题的损失函数是一致的
      • 如何理解这里的奖励与损失函数是一致的呢?可以认为,损失函数是智能体在给定策略下,在给定环境下的一个期望值
    • 当然,强化学习还可以解决许多监督学习无法解决的问题。例如,在监督学习中,我们总是希望输入与正确的标签相关联。但在强化学习中,我们并不假设环境告诉智能体每个观测的最优动作。一般来说,智能体只是得到一些奖励。此外,环境甚至可能不会告诉是哪些行为导致了奖励。
      • 以强化学习在国际象棋的应用为例。唯一真正的奖励信号出现在游戏结束时:当智能体获胜时,智能体可以得到奖励1;当智能体失败时,智能体将得到奖励-1。因此,强化学习者必须处理学分分配(credit assignment)问题:决定哪些行为是值得奖励的,哪些行为是需要惩罚的。就像一个员工升职一样,这次升职很可能反映了前一年的大量的行动。要想在未来获得更多的晋升,就需要弄清楚这一过程中哪些行为导致了晋升。
    • 在任何时间点上,强化学习智能体可能知道一个好的策略,但可能有许多更好的策略从未尝试过的。强化学习智能体必须不断地做出选择是应该利用当前最好的策略,还是探索新的策略空间(放弃一些短期回报来换取知识)。
    • 研究一些特殊情况下的强化学习问题
      • 当环境可被完全观察到时,强化学习问题被称为马尔可夫决策过程(markov decision process)。
      • 当状态不依赖于之前的操作时,我们称该问题为上下文赌博机(contextual bandit problem)。
      • 当没有状态,只有一组最初未知回报的可用动作时,这个问题就是经典的多臂赌博机(multi-armed bandit problem)。
  • 深度学习
    • 由于表示学习(representation learning)目的是寻找表示本身,因此深度学习可以称为“多级表示学习”。
    • 表示学习作为机器学习的一类,其研究的重点是如何自动找到合适的数据表示方式。深度学习是通过学习多层次的转换来进行的多层次的表示学习。

预备知识

所有机器学习方法都涉及从数据中提取信息,因此,我们需要先学习一些关于数据的实用技能,包括存储、操作和预处理操作。

机器学习通常需要处理大型数据集。我们可将某些数据集视为一个表,线性代数为人们提供了一些用来处理表格数据的方法,我们将重点放在矩阵运算的基本原理及其实现上。

深度学习是关于优化的学习。对于一个带参数的模型,我们想要找到其中能够拟合数据的最好模型。在算法的每个步骤中,决定以何种方式调整参数需要一点微积分知识。

机器学习还涉及如何做出预测:给定观察到的信息,某些位置属性可能的值是多少?要在不确定的情况下进行严格的推断,我们需要借用概率语言。

  • 数据操作
    • 为了能够完成各种数据操作,我们需要某种方法来存储和操作数据。
    • 通常需要做两件重要的事情,获取数据