机器学习(machine learning,ML)是一类强大的可以从经验中学习的技术。 通常采用观测数据或与环境交互的形式,机器学习算法会积累更多的经验,其性能也会逐步提高就在过去的五年里,深度学习给世界带来了惊喜,推动了计算机视觉、自然语言处理、自动语音识别、强化学习和统计建模等领域的快速发展。我选择动手学深度学习 v2 课程来开启机器学习之旅,并特别关注深度学习(deep learning,DL)的基础知识深度学习。本文为动手学深度学习第一章所做的笔记,可供参考。
日常生活中的机器学习
- Hey, Siri:收集一个包含音频样本的巨大的数据集(dataset),并对包含和不包含唤醒词的样本进行标记
- 通过机器学习算法,我们不需要设计一个“明确地”识别唤醒词的系统。 相反,我们定义一个灵活的程序算法,其输出由许多参数(parameter)决定。 然后我们使用数据集来确定当下的“最佳参数集”,这些参数通过某种性能度量来获取完成任务的最佳性能
- 把参数看作是旋钮,我们可以转动旋钮来调整程序的行为。 任一调整参数后的程序,我们称为模型(model)
- 通过操作参数而生成的所有不同程序(输入-输出映射)的集合称为“模型族”
- 使用数据集来选择参数的元程序被称为学习算法(learning algorithm)
- 在我们开始用机器学习算法解决问题之前,我们必须精确地定义问题,确定输入(input)和输出(output)的性质,并选择合适的模型族
- 在机器学习中,学习(learning)是一个训练模型的过程。 通过这个过程,我们可以发现正确的参数集,从而使模型强制执行所需的行为。 换句话说,我们用数据训练(train)我们的模型
- 训练过程通常包含如下步骤:
- 从一个随机初始化参数的模型开始,这个模型基本毫不“智能”
- 获取一些数据样本(例如,音频片段以及对应的{是,否}{是,否}标签)
- 调整参数,使模型在这些样本中表现得更好
- 重复第2步和第3步,直到模型在任务中的表现令你满意
机器学习的关键组件
数据
- 每个数据集由一个个样本(example, sample)组成,大多时候,它们遵循独立同分布(independently and identically distributed, i.i.d.)
- 样本有时也叫做数据点(data point)或者数据实例(data instance),通常每个样本由一组称为特征(features,或协变量(covariates))的属性组成,机器学习模型会根据这些属性进行预测
- 在监督学习问题中,要预测的是一个特殊的属性,它被称为标签(label,或目标(target))
- 当每个样本的特征类别数量都是相同的时候,其特征向量是固定长度的,这个长度被称为数据的维数(dimensionality)。 固定长度的特征向量是一个方便的属性,它有助于我们量化学习大量样本
- 然而,并不是所有的数据都可以用“固定长度”的向量表示,例如文本数据。与传统机器学习方法相比,深度学习的一个主要优势是可以处理不同长度的数据
- 一般来说,我们拥有的数据越多,通常可以训练出更强大的模型,从而减少对预先设想假设的依赖。 数据集的由小变大为现代深度学习的成功奠定基础。 在没有大数据集的情况下,许多令人兴奋的深度学习模型黯然失色。 就算一些深度学习模型在小数据集上能够工作,但其效能并不比传统方法高
- 仅仅拥有海量的数据是不够的,我们还需要正确的数据。 如果数据中充满了错误,或者如果数据的特征不能预测任务目标,那么模型很可能无效
- 此外,糟糕的预测性能甚至会加倍放大事态的严重性。 在一些敏感应用中,如预测性监管、简历筛选和用于贷款的风险模型,我们必须特别警惕垃圾数据带来的后果。一种常见的问题来自不均衡的数据集,比如在一个有关医疗的训练数据集中,某些人群没有样本表示
- 当数据不具有充分代表性,甚至包含了一些社会偏见时,模型就很有可能有偏见
模型
- 大多数机器学习会涉及到数据的转换。 比如,建立一个“摄取照片并预测笑脸”的系统
- 深度学习与经典方法的区别主要在于:前者关注的功能强大的模型,这些模型由神经网络错综复杂的交织在一起,包含层层数据转换,因此被称为深度学习(deep learning)
目标函数
- 在机器学习中,我们需要定义模型的优劣程度的度量,这个度量在大多数情况是“可优化”的,我们称之为目标函数(objective function)
- 我们通常定义一个目标函数,并希望优化它到最低点。 因为越低越好,所以这些函数有时被称为损失函数(loss function,或cost function)。 但这只是一个惯例,你也可以取一个新的函数,优化到它的最高点。 这两个函数本质上是相同的,只是翻转一下符号
- 当任务在试图预测数值时,最常见的损失函数是平方误差(squared error),即预测值与实际值之差的平方
- 当试图解决分类问题时,最常见的目标函数是最小化错误率,即预测与实际情况不符的样本比例
- 有些目标函数(如平方误差)很容易被优化,有些目标(如错误率)由于不可微性或其他复杂性难以直接优化。 在这些情况下,通常会优化替代目标
- 通常,损失函数是根据模型参数定义的,并取决于数据集。 在一个数据集上,我们通过最小化总损失来学习模型参数的最佳值。 该数据集由一些为训练而收集的样本组成,称为训练数据集(training dataset,或称为训练集(training set))
- 然而,在训练数据上表现良好的模型,并不一定在“新数据集”上有同样的效能,这里的“新数据集”通常称为测试数据集(test dataset,或称为测试集(test set))
- 综上所述,我们通常将可用数据集分成两部分:训练数据集用于拟合模型参数,测试数据集用于评估拟合的模型。 然后我们观察模型在这两部分数据集的效能
- 换言之,测试性能可能会显著偏离训练性能。 当一个模型在训练集上表现良好,但不能推广到测试集时,我们说这个模型是“过拟合”(overfitting)的
优化算法
- 一旦我们获得了一些数据源及其表示、一个模型和一个合适的损失函数,我们接下来就需要一种算法,它能够搜索出最佳参数,以最小化损失函数
- 深度学习中,大多流行的优化算法通常基于一种基本方法——梯度下降(gradient descent)。 简而言之,在每个步骤中,梯度下降法都会检查每个参数,看看如果你仅对该参数进行少量变动,训练集损失会朝哪个方向移动。 然后,它在可以减少损失的方向上优化参数
各种机器学习问题
监督学习
- 监督学习(supervised learning)擅长在“给定输入特征”的情况下预测标签。 每个“特征-标签”对都称为一个样本(example)。 有时,即使标签是未知的,样本也可以指代输入特征。 我们的目标是生成一个模型,能够将任何输入特征映射到标签,即预测
- 监督学习之所以发挥作用,是因为在训练参数时,我们为模型提供了一个数据集,其中每个样本都有真实的标签。 用概率论术语来说,我们希望预测“估计给定输入特征的标签”的条件概率
- 虽然监督学习只是几大类机器学习问题之一,但是在工业中,大部分机器学习的成功应用都是监督学习。 这是因为在一定程度上,许多重要的任务可以清晰地描述为:在给定一组特定的可用数据的情况下,估计未知事物的概率
- 监督学习的学习过程:
- 首先,从已知大量数据样本中随机选取一个子集,为每个样本获取基本的真实标签
- 有时,这些样本已有标签(例如,患者是否在下一年内康复?); 有时,我们可能需要人工标记数据(例如,将图像分类)。这些输入和相应的标签一起构成了训练数据集
- 随后,我们选择有监督的学习算法,它将训练数据集作为输入,并输出一个“完成学习模型”
- 最后,我们将之前没见过的样本特征放到这个“完成学习模型”中,使用模型的输出作为相应标签的预测
- 即使使用简单的描述“给定输入特征的预测标签”,监督学习也可以采取多种形式的模型,并且需要大量不同的建模决策,这取决于输入和输出的类型、大小和数量
- 回归
- 回归(regression)是最简单的监督学习任务之一
- 回归问题本质上是输出决定的。 假设你在市场上寻找新房子,你可能需要估计一栋房子的公平市场价值。 销售价格,即标签,是一个数值。 当标签取任意数值时,我们称之为回归问题。 我们的目标是生成一个模型,它的预测非常接近实际标签值
- 分类
- 虽然回归模型可以很好地解决“有多少?”的问题,但是解决不了“哪一个?”的问题,这种问题叫做分类(classification)问题
- 在分类问题中,我们希望模型能够预测样本属于哪个类别(category,正式称为类(class))
- 最简单的分类问题是只有两类,我们称之为“二元分类”
- 在回归中,我们训练一个回归函数来输出一个数值; 而在分类中,我们训练一个分类器,它的输出即为预测的类别
- 可以试着用概率语言来理解模型。 给定一个样本特征,我们的模型为每个可能的类分配一个概率,比如,猫狗分类器可能会输出图像是猫的概率为0.9,即分类器90%确定图像描绘的是一只猫。 预测类别的概率的大小传达了一种模型的不确定性
- 当我们有两个以上的类别时,我们把这个问题称为多元分类(multiclass classification)问题,常见的例子包括手写字符识别
- 与解决回归问题不同,分类问题的常见损失函数被称为交叉熵(cross-entropy)
- 最常见的类别不一定是你将用于决策的类别,或许不确定风险的影响远远大于收益。 因此,我们需要将“预期风险”作为损失函数。 也就是说,我们需要将结果的概率乘以与之相关的收益(或伤害)
- 有一些分类任务的变体可以用于寻找层次结构,层次结构假定在许多类之间存在某种关系。 因此,并不是所有的错误都是均等的。 我们宁愿错误地分入一个相关的类别,也不愿错误地分入一个遥远的类别,这通常被称为层次分类(hierarchical classification)
- 标记问题
- 学习预测不相互排斥的类别的问题称为多标签分类(multi-label classification)
- 举个例子,人们在技术博客上贴的标签,比如“机器学习”、“技术”、“小工具”、“编程语言”、“Linux”、“云计算”、“AWS”。 一篇典型的文章可能会用5-10个标签,因为这些概念是相互关联的。 关于“云计算”的帖子可能会提到“AWS”,而关于“机器学习”的帖子也可能涉及“编程语言”
- 搜索
- 有时,我们不仅仅希望输出为一个类别或一个实值。 在信息检索领域,我们希望对一组项目进行排序
- 以网络搜索为例,我们的目标不是简单的“查询(query)-网页(page)”分类,而是在海量搜索结果中找到用户最需要的那部分。 搜索结果的排序也十分重要,我们的学习算法需要输出有序的元素子集
- 该问题的一种可能的解决方案:首先为集合中的每个元素分配相应的相关性分数,然后检索评级最高的元素。PageRank,谷歌搜索引擎背后最初的秘密武器就是这种评分系统的早期例子
- 如今,搜索引擎使用机器学习和用户行为模型来获取网页相关性得分,很多学术会议也致力于这一主题
- 推荐系统
- 另一类与搜索和排名相关的问题是推荐系统(recommender system),它的目标是向特定用户进行“个性化”推荐
- 简单来说,推荐系统会为“给定用户和物品”的匹配性打分,这个“分数”可能是估计的评级或购买的概率。 由此,对于任何给定的用户,推荐系统都可以检索得分最高的对象集,然后将其推荐给用户。工业生产的推荐系统还要先进得多,它会将详细的用户活动和项目特征考虑在内
- 尽管推荐系统具有巨大的应用价值,但单纯用它作为预测模型仍存在一些缺陷。首先,用户更倾向于给他们感觉强烈的事物打分,此外,推荐系统有可能形成反馈循环
- 序列学习
- 以上大多数问题都具有固定大小的输入和产生固定大小的输出,在这些情况下,模型只会将输入作为生成输出的“原料”,而不会“记住”输入的具体内容
- 但是如果输入是连续的,我们的模型可能就需要拥有“记忆”功能。 比如,处理视频片段时,每个视频片段可能由不同数量的帧组成,通过前一帧的图像,我们可能对后一帧中发生的事情更有把握。 语言也是如此,机器翻译的输入和输出都为文字序列
- 序列学习的实例,是机器学习最令人兴奋的应用之一。 序列学习需要摄取输入序列或预测输出序列,或两者兼而有之。 具体来说,输入和输出都是可变长度的序列,例如机器翻译和从语音中转录文本
- 标记和解析:这涉及到用属性注释文本序列。 换句话说,输入和输出的数量基本上是相同的。 例如,我们可能想知道动词和主语在哪里,或者,我们可能想知道哪些单词是命名实体。 通常,目标是基于结构和语法假设对文本进行分解和注释,以获得一些注释
- 自动语音识别:在语音识别中,输入序列是说话人的录音,输出序列是说话人所说内容的文本记录。 它的挑战在于,与文本相比,音频帧多得多,也就是说,音频和文本之间没有1:1的对应关系,因为数千个样本可能对应于一个单独的单词。 这也是“序列到序列”的学习问题,其中输出比输入短得多
- 文本到语音:这与自动语音识别相反。 换句话说,输入是文本,输出是音频文件。 在这种情况下,输出比输入长得多。 虽然人类很容易识判断发音别扭的音频文件,但这对计算机来说并不是那么简单
- 机器翻译:在语音识别中,输入和输出的出现顺序基本相同。 而在机器翻译中,颠倒输入和输出的顺序非常重要。 换句话说,虽然我们仍将一个序列转换成另一个序列,但是输入和输出的数量以及相应序列的顺序大都不会相同
无监督学习
- 监督学习向模型提供巨大数据集,每个样本包含特征和相应标签值,准确地告诉模型在每种情况下应该做什么,直到模型学会从情况到行动的映射
- 如果没有十分具体的目标,就需要“自发”地去学习了,我们称这类数据中不含有“目标”的机器学习问题为无监督学习(unsupervised learning)
- 无监督学习可以回答什么样的问题
- 聚类(clustering)问题:没有标签的情况下,我们是否能给数据分类。比如,给定一组照片,把它们分成风景照片、狗、婴儿、猫和山峰的照片
- 主成分分析(principal component analysis)问题:我们能否找到少量的参数来准确地捕捉数据的线性相关属性。比如,一个球的运动轨迹可以用球的速度、直径和质量来描述
- 因果关系(causality)和概率图模型(probabilistic graphical models)问题:我们能否描述观察到的许多数据的根本原因。例如,如果我们有关于房价、污染、犯罪、地理位置、教育和工资的人口统计数据,我们能否简单地根据经验数据发现它们之间的关系
- 生成对抗性网络(generative adversarial networks):为我们提供一种合成数据的方法,甚至像图像和音频这样复杂的非结构化数据。潜在的统计机制是检查真实和虚假数据是否相同的测试,它是无监督学习的另一个重要而令人兴奋的领域
与环境互动
- 不管是监督学习还是无监督学习,我们都会预先获取大量数据,然后启动模型,不再与环境交互。 这里所有学习都是在算法与环境断开后进行的,被称为离线学习(offline learning)
- 离线学习可以孤立地进行模式识别,而不必分心于其他问题,但缺点是,解决的问题相当有限
- 你可能会期望人工智能不仅能够做出预测,而且能够与真实环境互动。 与预测不同,“与真实环境互动”实际上会影响环境。 这里的人工智能是“智能代理”,而不仅是“预测模型”。 因此,我们必须考虑到它的行为可能会影响未来的观察结果
- 考虑“与真实环境互动”将打开一整套新的建模问题
- 环境还记得我们以前做过什么吗?
- 环境是否有助于我们建模?例如,用户将文本读入语音识别器。
- 环境是否想要打败模型?例如,一个对抗性的设置,如垃圾邮件过滤或玩游戏?
- 环境是否重要?
- 当训练和测试数据不同时,环境是否变化?这是分布偏移(distribution shift)的问题。例如,未来的数据是否总是与过去相似,还是随着时间的推移会发生变化?是自然变化还是响应我们的自动化工具而发生变化?
强化学习
- 如果你对使用机器学习开发与环境交互并采取行动感兴趣,那么你最终可能会专注于强化学习(reinforcement learning)。 这可能包括应用到机器人、对话系统,甚至开发视频游戏的人工智能(AI)
- 深度强化学习(deep reinforcement learning)将深度学习应用于强化学习的问题,是非常热门的研究领域
- 我们可以将任何监督学习问题转化为强化学习问题。 假设我们有一个分类问题,我们可以创建一个强化学习agent,每个分类对应一个“动作”。 然后,我们可以创建一个环境,该环境给予agent的奖励。 这个奖励与原始监督学习问题的损失函数是一致的
- 在监督学习中,我们总是希望输入与正确的标签相关联。 但在强化学习中,我们并不假设环境告诉agent每个观测的最优动作。 一般来说,agent只是得到一些奖励。
- 环境甚至可能不会告诉我们是哪些行为导致了奖励,因此,强化学习者必须处理学分分配(credit assignment)问题:决定哪些行为是值得奖励的,哪些行为是需要惩罚的
- 强化学习可能还必须处理部分可观测性问题。 也就是说,当前的观察结果可能无法阐述有关当前状态的所有信息
- 最后,在任何时间点上,强化学习agent可能知道一个好的策略,但可能有许多更好的策略从未尝试过的。 强化学习agent必须不断地做出选择:是应该利用当前最好的策略,还是探索新的策略空间(放弃一些短期回报来换取知识)
- 环境可以是完整观察到的,也可以是部分观察到的,解释所有这些复杂性可能会对研究人员要求太高。 此外,并不是每个实际问题都表现出所有这些复杂性。 因此,学者们研究了一些特殊情况下的强化学习问题
- 当环境可被完全观察到时,我们将强化学习问题称为马尔可夫决策过程(markov decision process)。 当状态不依赖于之前的操作时,我们称该问题为上下文赌博机(contextual bandit problem)。 当没有状态,只有一组最初未知回报的可用动作时,这个问题就是经典的多臂赌博机(multi-armed bandit problem)
深度学习的发展
- 为了解决各种各样的机器学习问题,深度学习提供了强大的工具。 虽然许多深度学习方法都是最近的才有重大突破,但使用数据和神经网络编程的核心思想已经研究了几个世纪
- 伯努利分布是以雅各布•伯努利(1654–1705)命名的。 而高斯分布是由卡尔•弗里德里希•高斯(1777—1855)发现的, 他发明了最小均方算法,至今仍用于解决从保险计算到医疗诊断的许多问题
- 随着数据的收集和可获得性,统计数据真正实现了腾飞。 罗纳德·费舍尔(1890-1962)对统计理论和在遗传学中的应用做出了重大贡献。 他的许多算法(如线性判别分析)和公式(如费舍尔信息矩阵)至今仍被频繁使用
- 机器学习的第二个影响来自克劳德·香农(1916–2001)的信息论和艾伦·图灵(1912-1954)的计算理论。 图灵在他著名的论文《计算机器与智能》中提出了“机器能思考吗?”的问题(图灵测试)
- 唐纳德·赫布 (1904–1985)开创性的著作《行为的组织》提出神经元通过积极强化学习,是Rosenblatt感知器学习算法的原型,被称为“赫布学习”。 这个算法也为当今深度学习的许多随机梯度下降算法奠定了基础:强化期望行为和减少不良行为,从而在神经网络中获得良好的参数设置
- 神经网络(neural networks)的得名源于生物灵感。 一个多世纪以来(追溯到1873年亚历山大·贝恩和1890年詹姆斯·谢林顿的模型),研究人员一直试图组装类似于相互作用的神经元网络的计算电路。 随着时间的推移,对生物学的解释变得不再肤浅,但这个名字仍然存在。 其核心是当今大多数网络中都可以找到的几个关键原则:
- 线性和非线性处理单元的交替,通常称为层(layers)。
- 使用链式规则(也称为反向传播(backpropagation))一次性调整网络中的全部参数
- 神经网络的研究从1995年左右一直开始停滞不前,直到到2005年才稍有起色。 这主要是因为两个原因。 首先,训练网络(在计算上)非常昂贵, 其次,数据集相对较小
- 大约2010年开始,那些在计算上看起来不可行的神经网络算法变得热门起来,实际上是以下两点导致的: 其一,随着互联网的公司的出现,为数亿在线用户提供服务,大规模数据集变得触手可及。 另外,廉价又高质量的传感器、廉价的数据存储(克莱德定律)以及廉价计算(摩尔定律)的普及,特别是GPU的普及,使大规模算力唾手可得
- 很明显,随机存取存储器没有跟上数据增长的步伐。 与此同时,算力的增长速度已经超过了现有数据的增长速度。 这意味着统计模型需要提高内存效率(这通常是通过添加非线性来实现的)
- 同时由于计算预算的增加,能够花费更多时间来优化这些参数。 因此,机器学习和统计的关注点从(广义的)线性模型和核方法转移到了深度神经网络。 这也造就了许多深度学习的中流砥柱,如多层感知机、卷积神经网络、长短期记忆网络和Q学习,在相对休眠了相当长一段时间之后,在过去十年中被“重新发现
深度学习的成功案例
- 感知 -> 推理 -> 知识 -> 规划:自然语言处理 -> 计算机视觉 -> 深度学习
- 深度学习应用:图片地图、样式迁移、人脸合成、文字生成图片、文字生成、无人驾驶
- 案例研究:广告点击
- 触发 -> 点击率预估 -> 排序($点击率 * 竞价$)
- 预测:特征提取 -> 模型 -> 点击率预测
- 训练:训练数据(过去广告展现与用户点击) -> 特征和用户点击 -> 模型
- 领域专家:点击 -> 展现
- 数据科学家:数据 -> 模型(模型控制广告展现,这些用来训练新的模型)
- AI 专家:提升模型精度和性能
深度学习的特点
- 机器学习可以使用数据来学习输入和输出之间的转换,例如在语音识别中将音频转换为文本。 在这样做时,通常需要以适合算法的方式表示数据,以便将这种表示转换为输出
- 深度学习是“深度”的,模型学习了许多“层”的转换,每一层提供一个层次的表示。 例如,靠近输入的层可以表示数据的低级细节,而接近分类输出的层可以表示用于区分的更抽象的概念。 由于表示学习(representation learning)目的是寻找表示本身,因此深度学习可以称为“多级表示学习”
- 多层模型能够以以前的工具所不能的方式处理低级的感知数据。 毋庸置疑,深度学习方法中最显著的共同点是使用端到端训练。 也就是说,与其基于单独调整的组件组装系统,不如构建系统,然后联合调整它们的性能。
- 在过去的日子里,将机器学习应用于这些问题的关键部分是提出人工设计的特征工程方法,将数据转换为某种适合于浅层模型的形式。 然而,与一个算法自动执行的数百万个选择相比,人类通过特征工程所能完成的事情很少。 当深度学习开始时,这些特征抽取器被自动调整的滤波器所取代,产生了更高的精确度
- 因此,深度学习的一个关键优势是它不仅取代了传统学习管道末端的浅层模型,而且还取代了劳动密集型的特征工程过程。 此外,通过取代大部分特定领域的预处理,深度学习消除了以前分隔计算机视觉、语音识别、自然语言处理、医学信息学和其他应用领域的许多界限,为解决各种问题提供了一套统一的工具
- 除了端到端的训练,我们正在经历从参数统计描述到完全非参数模型的转变。 当数据稀缺时,人们需要依靠简化对现实的假设来获得有用的模型。 当数据丰富时,可以用更准确地拟合实际情况的非参数模型来代替。
- 现在人们可以借助于相关偏微分方程的数值模拟,而不是用手来求解电子行为的参数近似。这导致了更精确的模型,尽管常常以牺牲可解释性为代价。与以前工作的另一个不同之处是接受次优解,处理非凸非线性优化问题,并且愿意在证明之前尝试。 这种在处理统计问题上新发现的经验主义,加上人才的迅速涌入,导致了实用算法的快速进步
安装动手学深度学习 v2
安装环境:Ubuntu 18.04 + build-essential + Python 3.8 +
安装 Miniconda 到
\root\miniconda3
1
2wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-x86_64.sh
bash Miniconda3-py38_4.11.0-Linux-x86_64.sh安装其他软件包
1
pip install jupyter d2l torch torchvision
拷贝 Jupyter 记事本
1
2wget https://zh-v2.d2l.ai/d2l-zh.zip
git clone git@github.com:d2l-ai/d2l-zh-pytorch-slides.git远程运行 Jupyter Notebook
1
jupyter notebook --allow-root
将远端 localhost 映射到本地 localhost(端口 :8888)
1
ssh -L8888:localhost:8888 root@106.15.200.147
安装 jupyter 插件
1
pip install rise
总结
- 机器学习研究计算机系统如何利用经验(通常是数据)来提高特定任务的性能。它结合了统计学、数据挖掘和优化的思想。通常,它是被用作实现人工智能解决方案的一种手段
- 表示学习作为机器学习的一类,其研究的重点是如何自动找到合适的数据表示方式。深度学习是通过学习多层次的转换来进行的多层次的表示学习
- 深度学习不仅取代了传统机器学习的浅层模型,而且取代了劳动密集型的特征工程
- 最近在深度学习方面取得的许多进展,大都是由廉价传感器和互联网规模应用所产生的大量数据,以及(通过GPU)算力的突破来触发的
- 整个系统优化是获得高性能的关键环节。有效的深度学习框架的开源使得这一点的设计和实现变得非常容易