跳到主要内容

深度学习革命,以及为什么是 JavaScript

这一章讲三件事: 深度学习到底是什么、它为什么在 2012 年之后突然爆发; 以及这本书最核心的一个主张——这件事应该在浏览器里、用 JavaScript 做。 它是全书的地基:后面二十一章讲的每一行代码,都建立在这一章的两个判断上。 不需要任何基础,遇到的生词都在当场解释。

1. 先从一个你会碰到的问题讲起

假设你在写一个网站,用户可以上传照片。你想加一个小功能:自动判断照片里有没有人

你的第一反应大概是写程序:分析像素的颜色,找出类似脸的椭圆轮廓,再检查轮廓里有没有眼睛和嘴。 书里对这个思路的评价很直白:你可以花很多天研究它,但最终会得到一堆「随意的逻辑和站不住脚的参数」1。 真人照片的变化太多了——脸有大有小、有正有侧、有戴眼镜的、有在暗处的——你写得再辛苦,规则也追不上变化。

机器学习的做法是把这个顺序倒过来:你不写规则,你写答案。

找几千张照片,一部分有人、一部分没有,每张都手工标上「有」或「没有」。 这些标好的答案叫标签(label),一张图加它的标签叫一个样例(example)。 然后让机器自己从这一堆样例里摸索出区分两者的规律。书里给出的定义是: 机器学习就是自动发现解决复杂问题的规则的过程2

传统编程: 人写规则 + 数据 → 计算机 → 答案
机器学习: 人给数据 + 人给答案 → 计算机 → 规则(模型)

图说:两种范式的输入输出正好错位。机器学习里,计算机的产出不是答案,
而是「能产出答案的规则」——这份规则被保存下来,就叫一个模型。

这条路的效果是碾压级的:书里给的对照是,用机器学习训出来的人脸检测规则,准确率能超过 99%, 「比通过人工编写规则能取得的任何成果都要好得多」2

这张「人脸照片」是本章的引子,但真正把这件事走完一遍的,是第 3 节那三个点。 下面每一节都会回到它:第 2 节看这件事在 AI 版图里的位置,第 3 节看机器到底「学」的是什么、 并且把一个具体的点从头算到尾,第 4 节看为什么 2012 年之前做不到,第 5 节看为什么要在浏览器里做。

2. 这些词什么关系:AI、机器学习、神经网络、深度学习

这一节把四个常被混用的词摆到正确的位置上。

人工智能(AI) 最大:书里给的简洁定义是「试图将通常需要人类主观意识参与的任务自动化」3。 它里面有一种很老的做法叫符号人工智能(symbolic AI):由程序员把知识写成大量明确的规则, 让机器照着规则推理——20 世纪 50 到 80 年代的主流范式,早期国际象棋软件就是这么做的3。 第 1 节那个「人工写规则认脸」的思路,就是符号 AI 的思路。

机器学习是 AI 的一个子领域,走的正好是和符号 AI 相反的路:不写规则,从数据里学规则。

神经网络(neural network)又是机器学习里的一个子领域。它把数据放进一串前后相接的处理步骤里, 每个步骤叫一个(layer);每个层内部有一组可以调整的数,叫权重(weight), 权重决定了这一层把输入转换成什么样的输出4。「训练」就是系统地修改这些权重, 让输出越来越接近标签。

具体怎么改?整本书从头到尾只有一个动作,它的名字叫梯度下降:看模型答得离正确答案差多远, 再把每一个权重朝「差得少一点」的方向挪一丁点,换下一道题,重复几万次。 这一句已经够你读完本章;那个「方向」到底怎么算出来,第 02 章从头讲。

「神经网络」这个名字借自大脑——生物神经元的连接方式确实有层状结构—— 但书里特意警告不要过度类比:目前并没有证据表明大脑通过任何形式的梯度下降优化进行学习, 而它恰恰是人工神经网络唯一的训练方式5

深度学习(deep learning)则是神经网络里「层很多」的那部分:现代深度学习通常有数十到上百个 连续的层6。这里的「深」指的只是层数多,不是「理解得深刻」——书里专门提醒, 别把「深」解读成对数据的深刻理解6

┌─ 人工智能(自动化认知任务)
│ ├─ 符号人工智能(人写规则)── 1950~1980 年代的主流
│ └─ 机器学习(从数据学规则)
│ ├─ 决策树、支持向量机等(非神经网络)
│ └─ 神经网络(层 + 权重)
│ └─ 深度学习 = 层很多的神经网络

图说:四个词是四层嵌套,不是同义词。说「AI 项目」时,它可能一行机器学习都没有。

顺带:机器学习不等于神经网络

这一节最容易踩的坑,书里用一个「信息栏」提前拆了。下面五种做法一个神经元都不用,而且至今很有用。 你不用记它们,只要知道各自在干什么——以后在别人的代码或论文里撞见这几个名字, 能认出那是「机器学习,但不是神经网络」就够了7

先说一个后面到处都要用的词:喂进模型的每一个输入数值,叫一个特征(feature)。 上一节那张照片,如果人先算出「肤色像素占多少」「有几条水平边」,这两个数就是两个特征。

朴素贝叶斯:数出「见过这些特征时,各个类别分别出现过多少次」,哪个类别的可能性最高就判哪个。 它假设各个特征互不相干——这个假设通常不成立,名字里的「朴素」说的就是它。

逻辑回归:给每个特征配一个可调的数、乘起来加总,再把结果压成一个 0 到 1 的可能性。 因为简单又好改,它至今是很多人做分类任务的第一选择。

核方法:把数据搬到一个维数更高的空间里去(一个数据点用几个数来描述,就说它有几维), 在那里两类点能被一条边界分开,而且边界离两边都尽量远。这一路最有名的做法叫支持向量机

决策树:一张流程图——「这个特征大于某个数吗?」是就走左边,否就走右边,一路问到底得出答案。 它的好处是每一步都能讲给人听,这一点后面的神经网络再也做不到了。

随机森林梯度提升机:一次训一大堆决策树,推断时让它们一起投票。 梯度提升机在信用卡诈骗检测这种表格数据上,至今仍是最好的做法之一。

读这本书时记住:我们学的深度学习是工具箱里的一件,不是工具箱本身。

3. 机器到底在「学」什么:换个方式看数据

上一节说训练是「调整权重让输出接近标签」。但调整的本质是什么?这一节给出全书最重要的一个答案。

书里举了一个能画在纸上的例子。平面上撒一堆黑点和白点,给机器的任务是: 输入一个点的坐标,预测它是黑是白8

麻烦在于:两种点的横坐标取值范围是重叠的,纵坐标也是。在原来的表示方式下,这个问题没法简单地解。

但如果你换一个方式描述同一个点——不用「横坐标、纵坐标」,改用「它离中心多远、在什么角度上」 (也就是极坐标)——黑点和白点的角度范围就完全不重叠了;再对角度做一步简单计算, 任务就变成「拿结果和 0 比一比大小」这么容易的事8

这里的关键概念叫表示(representation):同一批数据,可以有不同的描述和处理方式。 彩色照片用 RGB(红绿蓝三个数)还是用 HSV(色相、饱和度、明度三个数)记录, 内容一样,表示不同;找「红色区域」用 RGB 方便,找「颜色鲜艳的区域」用 HSV 方便9

机器学习的本质:自动地搜索一种「更好的表示」,让任务在新表示下变得简单。 黑白点例子里是人手动选了两步变换;深度学习做的就是把这种变换的搜索自动化, 而且可以连续学几十上百层,一层比一层离原始输入远、离答案近8

这句话是全书的第一块砖。下面把它变成三个能验算的点。

主走查:三个点,三步走完

上面那段话听着有理,但没有一个数。下面把三个具体的点从头走到尾。

先说清哪些是书里的、哪些是我们的: 两步变换和最后那个判据(|角度| − 135,小于 0 判白、 否则判黑)是书里的8;这三个点的坐标是我们按书里的规则自己挑的,书里只给了一张图、没给数

第 0 步:三个点的原始坐标。

横坐标纵坐标它其实是什么颜色
P131
P2−31
P3−1.50.5

先看为什么原来的表示不行。 P1 和 P2 的纵坐标一模一样,都是 1—— 所以「纵坐标大于某个数就是白」这条规则一定失败。横坐标也救不了:白点的横坐标可以是 3, 也可以是 −2(比如点 (−2, 4),按下面的规则算出来是白的),而黑点 P3 的横坐标是 −1.5, 夹在中间。两根轴各自都切不开。

第 1 步:换成「离中心多远 + 在什么角度上」。

半径(离原点的距离)角度
P1√(3²+1²) = 3.1618.4°
P2√(3²+1²) = 3.16161.6°
P3√(1.5²+0.5²) = 1.58161.6°

数据一个字节都没变,只是换了个说法,局面立刻不同: P1 和 P2 的半径一模一样(都是 3.16),半径这一路照样切不开; 但角度完全不重叠了——白的那个是 18.4°,黑的两个都是 161.6°。

第 2 步:把角度再算一下,顺手把半径扔掉。

P1: |18.4| − 135 = −116.6 < 0 → 判白 ✓
P2: |161.6| − 135 = + 26.6 > 0 → 判黑 ✓
P3: |161.6| − 135 = + 26.6 > 0 → 判黑 ✓

图说:两个数变成一个数,判断变成「和 0 比一下大小」。
注意 P2 和 P3 —— 它们的半径差了一倍(3.16 对 1.58),算出来却是同一个数 +26.6。
这一步把「离中心多远」这条对本题无用的信息整个扔掉了。

这条走查就是本章那句「学的是表示」的全部内容: 没有人给这堆点增加任何新信息,只是换了两次说法,一道切不开的题就变成了「和 0 比大小」。

而机器学习就是把「换哪两次说法」这件事自动化。 上面这两步是人挑的; 让机器拿「判对的比例」当依据,自己去搜该做哪些变换——那就是机器学习。 深度学习尤其如此:它做的变换不是两步,常常是几十上百步8

回到人脸照片那条主线:所谓「训练人脸检测器」,就是让机器把「几十万个像素值」这种表示, 逐层转换成「这里有一张脸的可能性有多大」这种表示。每一层做一次小转换, 转换的方式由权重决定,权重由训练调出来——这条链条后面每一章都在往下接。

这也顺带解释了为什么深度学习能把别的方法比下去:那些「浅层」方法只能学一两层表示, 对付不了照片这种复杂输入,于是人要手工设计特征(这一步叫特征工程,feature engineering), 它是传统机器学习流程里最难最耗人力的一步;深度学习把这一步也自动化了—— 「一次性学习所有特征,无须手动设计」10

4. 为什么是现在:三股力量同时到位

神经网络的核心想法 1950 年代就有了。到 1980 年代,连训练它的那套关键算法也有了—— 那套算法负责回答上一节末尾留下的问题「每个权重该往哪挪」,它的名字叫反向传播 (从最后一层的误差出发,倒着一层层往回推,算出每个权重各自该负多少责任;第 02 章会手算一遍)。 那为什么爆发要等到 2012 年? 这一节回答这个问题。

书里把答案拆成三股力量11:

硬件。 神经网络的计算几乎全是「对很多数做同样的乘加」——这种活恰好是显卡(GPU)的看家本领。 GPU 本来是为游戏渲染设计的,几千个小计算单元同时开工;2007 年英伟达发布 CUDA, 让这种并行能力能被通用计算调用。到 2011 年前后,研究者开始用 CUDA 写神经网络; 书里给的量级是:训练神经网络时,高端 GPU 能提供的并行算力是一般 CPU 的上百倍12。 没有这股算力,后面两件事都无从谈起。

数据。 互联网让收集和分发海量数据集成为可能:Flickr 的照片、YouTube 的视频、维基百科的文本。 书里的头号例子是 ImageNet:约 1419 万张人工标注了类别的图像,分 1000 类13。 光有数据还不够,ImageNet 还办年度竞赛——一个公认的擂台,让所有研究者比同一个指标。 擂台的效果写在成绩上:这个比赛的图像分类错误率,从 2011 年的 25% 降到 2017 年的不足 5%14

算法。 层一多就训不动,卡在同一个地方:训练时那个「该往哪挪」的信号要从最后一层 一路倒着传回第一层,传着传着就衰减没了,前面的层等于收不到反馈。 2009–2010 年前后,几个「简单但意义重大」的改进让这个信号能传得动了; 2014–2016 年又添了几件,今天从头训练上千层的网络都不稀奇15

那几个改进各自解决了什么

这六个名字你现在不用记,后面用到时会各自讲清。这里只给一句「它解决了什么」。

ReLU:每层中间那一下弯折换了个极简的形状——负数一律归零,正数原样通过。 信号倒着传回来时,衰减比原来小得多(第 04 章细讲)。

Glorot 初始化:管的是训练开始前那些随机数该给多大。给大了信号会炸,给小了信号会消失, 它按这一层有多宽来定这个尺度。

RMSProp 与 ADAM:「朝差得少一点的方向挪一丁点」里的那个「一丁点」不再是固定值, 而是按每个权重最近的表现自动调大调小(第 03、05 章会用到)。

批标准化:即每层算完之后,把这一批数据重新拉回「平均值 0、上下浮动 1」的尺度再往下传, 免得越传越偏(第 11 章的武器表里还会见到它)。

残差连接:给信号修一条抄近路的旁道,让它能跳过几层直接往回传,不必层层衰减。

深度可分离卷积:是指把一次卷积(第 06 章的主角:拿一小块窗在图上滑着算)拆成两步做, 参数少一大截而效果几乎不变(第 22 章还会提到)。

判断(我们的,不是书里的): 这一节是全书最经得起时间考验的一页之一。 2019 年写下「硬件+数据+算法」的三力框架,今天看依然成立—— 只是每一股力量的规模又涨了几个数量级(2026 年的模型在百亿级数据上训练, 这是书成书时的几百倍;此数字不在书里,来自通用知识)。 如果错,会错在: 如果未来某项突破让某一股力量不再必要 (比如小数据也能训出强模型),这个三力框架就要改写——但书里列的三件事至今一件没少。

5. 为什么要在浏览器里做:五个别的环境给不了的好处

前面四节讲的是「深度学习是什么」,和语言无关。这一节是这本书真正的立场: 为什么偏偏要用 JavaScript、在浏览器里做。

书的作者们是 TensorFlow.js 的核心开发者(详见总纲第 1 节的利益相关说明), 所以这一节本质上是他们在论证自己项目的意义——论证本身值得听完,再自己下判断。

好处一:省服务器钱。 模型如果部署在云端,跑深度学习要租带 GPU 的云主机, 最基本款每小时也要 0.5~1 美元,流量越大烧得越多; 部署到客户端,这笔开销整个消失,代价只是用户下载几 MB 的模型文件16

好处二:低延迟。 书里算了一笔细账:摄像头以 400×400 像素、每秒 10 帧采集, 即使 JPEG 压缩后每帧也约 150KB;在 300kbit/s 上传带宽的移动网络里, 上传一帧就要 500 毫秒以上——还没算下载结果的时间。 对实时应用(游戏、动作识别),服务器推断在物理上就不成立17

好处三:隐私。 这是最有时代感的一条。书里设想了一个「皮肤病诊断助手」: 病人的皮肤照片要传给远端服务器才能诊断吗?很多国家和地区的健康信息法规直接禁止这么做。 而在浏览器里跑模型,数据根本无须离开用户的手机,甚至无须存储下来18

好处四:免费用上用户的 GPU。 浏览器里有个叫 WebGL 的接口,本来是给网页渲染三维图形的。 三维渲染的本质是对「纹理」做并行数学运算,而纹理说白了就是数字矩阵—— 神经网络的权重和中间结果也是数字矩阵。TensorFlow.js 做的事,就是复用这套图形接口来跑神经网络: 一行 import 代码,用户机器上的显卡就为模型加速,不用装任何驱动19

好处五:点开就用。 浏览器应用没有安装步骤——输入网址或点个链接就开始运行。 对教学场景(这本书本身就是)和低门槛工具,这一点是决定性的20

模型在云端: 手机 →(每帧 150KB,>500ms)→ 服务器 → GPU 推断 → 回传
│ └─ GPU 主机 $0.5~1/小时,还要扛流量
└─ 用户照片离开了用户的设备

模型在浏览器: 模型文件(几 MB,可缓存)一次下载
手机 → 本地 WebGL 加速推断 → 结果不出设备

图说:同一个模型,部署位置不同,钱、延迟、隐私三笔账全变。

那训练呢?浏览器受内存和文件系统限制,不适合大数据量的训练; 于是 TensorFlow.js 还有一个 Node.js 版本(tfjs-node),直接调用和 Python 版 TensorFlow 相同的 C++/CUDA 底层库——书里说实测下来,tfjs-node 的训练速度和 Python 的 Keras 相当21。 为什么用 Node 而不是更成熟的 Python?书里给了两个理由:V8 引擎的即时编译性能, 以及「前后端同一种语言」带来的代码复用和团队成本下降21

6. TensorFlow.js 是什么,从哪里来

这一节交代工具本身的来历,顺便讲清一个全书反复出现的词。

先讲张量(tensor)。它是深度学习中所有数据的统一容器: 数字、表格、图像、音频、文本,统统先装进张量,再送进模型。 一个张量有两样属性——里面装的是什么类型的数(比如 32 位浮点数),以及它是什么形状 (比如 [128, 256] 表示一个有 128 行 256 列的网格)。 书里的说法是:张量其实就是深度学习模型赖以沟通的语言22。 「TensorFlow」这个名字说的就是这个画面:张量(tensor)流经(flow)模型里一个个处理节点。

再讲家谱。先说这本书自己的出身: 它是《Python深度学习》的 JavaScript 重写版—— 作者们在致谢里写得很直白,「本书整体结构得益于弗朗索瓦·肖莱所著的《Python深度学习》, 不同之处就是将后者中的代码用 JavaScript 语言进行重写」;而肖莱本人是这本书的第四作者23。 这件事影响你怎么读它:纯讲原理的部分(反向传播、过拟合)两本书是同一套说法, 而浏览器与 Node 的那些账、数据管线、可视化、量化与部署,是这本独有的。

TensorFlow 是谷歌 2015 年 11 月开源的 Python 深度学习框架,本书三位作者就是这个团队的; 但直接摆弄底层运算太繁琐,于是有了高阶 API Keras——书里用了一个很准的比喻: 底层 API 像培乐多彩泥(什么都能捏,但费劲),Keras 像乐高积木 (基础块就几种,但搭起来快而且稳)24

2017 年 9 月,两位专做数据可视化的工程师发布了 deeplearn.js, 第一次在浏览器里实现了 WebGL 加速的神经网络运算; 项目后来更名 TensorFlow.js,作者们加入了队伍,并为它写了和 Keras 几乎一致的高阶 API (Layers API),外加一个模型转换器——Python 里训好的 Keras/TensorFlow 模型可以转成 TensorFlow.js 格式在浏览器里跑,反过来也行25

TensorFlow.js 的架构(自下而上):

Layers API ── 类 Keras 的高阶接口:搭层、训练、评估、存取模型(本书的主角)
Core API ── 底层张量运算,和 Python TensorFlow 对齐
并行计算层 ── 浏览器里走 WebGL(用 GPU);Node 里走多核 CPU 或 CUDA

图说:绝大多数时候你只和顶上那层打交道;底下两层的存在,
决定了同一份代码能同时在浏览器和 Node 里跑。

要全面性,书里列了一张八条清单(支持训练和推断、双环境、GPU 加速、模型序列化、 和 Python 生态双向转换……)26;要局限性,书里也写得坦白: 浏览器里做推断,模型尺寸要控制在 100MB 左右,更大的放不下也跑不动27

7. 作者的判断与证据

书里给了证据的:

  • 机器学习训出来的人脸检测器,准确率能超过 99%,「比通过人工编写规则能取得的任何成果都要好得多」2;
  • ImageNet 竞赛的图像分类错误率,从 2011 年的 25% 降到 2017 年不足 5%——这是一张公开的成绩表14;
  • 高端显卡在训练神经网络时的并行算力是一般处理器的上百倍12;
  • 上传一帧 400×400 的画面在 300kbit/s 的上传带宽下要 500 毫秒以上——这是一笔算得出来的账17;
  • tfjs-node 的训练速度和 Python 版的 Keras 相当——书说这是实测的21;
  • 大脑并不靠梯度下降学习——这一条是书的坦白,而且它是一个否定式陈述: 书说的是「目前并没有证据表明」,不是「已经证明不是」5

属于作者判断、书里没给证据的:

  • 「深度学习该在浏览器里做」那五条理由。 省钱、低延迟、隐私、白拿显卡、免安装—— 每一条的论据都成立,但「所以你应该这么做」是一个立场,而且是作者自己那个项目的立项论证;
  • 「三股力量同时到位」这个框架本身。 硬件、数据、算法——这是一个事后归因, 书没有(也没法)证明缺了哪一股就一定不行;
  • 卷积和视网膜感受野「有异曲同工之妙」。 这是类比,不是神经科学结论;
  • 「JavaScript 生态会长起来」。 书拿 npm 的包数量当论据,但包多不等于深度学习生态成熟

判断(我们的,不是书里的): 这一章最经得起时间考验的是第 4 节那个三力框架, 最不经得起的是第 6 节那些具体数字(100MB 上限、WebGL、npm 包数)。 区分它们的判据很简单:讲机制的部分不会过时,讲当时状况的部分从出版那天起就在过时。 如果错,会错在: 如果将来某项突破让三股力量里的某一股不再必要 (比如小数据也能训出强模型),这个框架就要改写——但书里列的三件事至今一件没少。

8. 边界与局限

  • 这一章一行代码都没有。 它讲的全是「是什么、为什么」,tf. 开头的东西一个没出现;
  • 五条浏览器优势里,只有隐私那一条给了具体场景(皮肤病诊断); 其余四条是算账和推理,没有案例支撑;
  • 书自己列了浏览器的三条硬上限: 推断模型大约 100MB 就到顶; 即使模型不超,数据量太大也会训得过慢;做不了高端强化学习,也做不了 Node 上的分布式训练27;
  • 神经网络那段历史极简。 五十年代的起源、八十年代的反向传播、 中间那段蛰伏期各只有一句;为什么蛰伏、为什么复苏,只给了结论;
  • 「深度学习为什么有效」这一章不答。 它只说「它能学到更好的表示」; 这台机器到底是什么、边界在哪儿,是第 22 章的事;
  • WebGL 这条技术路线今天已经不是唯一的了。 书写于 2019 年, 浏览器端后来出现了新的加速后端,书里一个字没有(这一处要联网核实,归第 22 章)。

9. 可带走的

全章那条主线,一行写完: 手写规则认人脸认不动 → 改成「给几千张标好答案的照片让机器自己找规则」 → 找规则的本质是找更好的表示 → 2012 年起硬件、数据、算法同时到位,这条路突然能走通 → 而浏览器让训练好的规则能贴着用户跑:省钱、快、不泄露隐私。

  1. 机器学习 = 自动发现规则:你不写规则,你给带标签的样例;产出物(规则)叫模型;
  2. AI ⊃ 机器学习 ⊃ 神经网络 ⊃ 深度学习——「深」只是层数多,不是理解深刻;
  3. 学的本质是学表示:把像素换成「像不像脸」;深度学习把特征工程也自动化了;
  4. 别把神经网络当大脑:没有证据表明大脑靠梯度下降学习;
  5. 2012 年的爆发 = 硬件 × 数据 × 算法同时到位,不是某一个天才算法;
  6. 浏览器端深度学习的五笔账:服务器开销、延迟、隐私、免费 GPU、免安装;
  7. 张量 = 深度学习的通用语言,什么数据都先装成带形状的数值容器;
  8. TensorFlow.js = 类 Keras 高阶 API + 与 Python 生态双向兼容的模型格式,同一份代码浏览器和 Node 都能跑;
  9. 浏览器的上限:推断模型约 100MB;超出就走 Node.js 或云端;
  10. 读这本书时记住作者身份:他们是 TensorFlow.js 的核心开发者——第 5、6 节是他们项目的立项论证,论据说服力不错,但立场要知道。

10. 原文地图

主题原书章原文位置
人工写规则认脸的失败、机器学习的定义第 1 章text/11-ch01-1-javascript.txt:121(搜「包含人脸的照片」) · text/11-ch01-1-javascript.txt:133(搜「自动发现解决复杂问题的规则」)
AI/符号 AI 的定义第 1 章text/11-ch01-1-javascript.txt:109(搜「主观意识参与的任务自动化」)
层、权重、别过度类比大脑第 1 章text/11-ch01-1-javascript.txt:185(搜「封装在相应的权重中」) · text/11-ch01-1-javascript.txt:187(搜「梯度下降优化进行学习」)
「深」只是层数多第 1 章text/11-ch01-1-javascript.txt:191(搜「分层表示学习」)
非神经网络的机器学习技术第 1 章text/11-ch01-1-javascript.txt:201(搜「朴素贝叶斯分类器」) · text/11-ch01-1-javascript.txt:209(搜「梯度提升」)
黑白点与表示第 1 章text/11-ch01-1-javascript.txt:159(搜「极坐标」) · text/11-ch01-1-javascript.txt:147(搜「RGB或者HSV」)
特征工程自动化第 1 章text/11-ch01-1-javascript.txt:219(搜「无须手动设计」)
三股力量:GPU 百倍、ImageNet、算法革新第 1 章text/11-ch01-1-javascript.txt:241(搜「上百倍」) · text/11-ch01-1-javascript.txt:247(搜「1419万」) · text/11-ch01-1-javascript.txt:261(搜「批标准化」)
ImageNet 错误率 25%→5%第 1 章text/11-ch01-1-javascript.txt:37(搜「2011年的25%」)
五大优势、云 GPU 价格、上传延迟账第 1 章text/11-ch01-1-javascript.txt:281(搜「5个优势」) · text/11-ch01-1-javascript.txt:283(搜「0.5~1美元」) · text/11-ch01-1-javascript.txt:285(搜「150KB」)
皮肤病诊断与隐私第 1 章text/11-ch01-1-javascript.txt:289(搜「皮肤病诊断助手」)
WebGL 纹理复用第 1 章text/11-ch01-1-javascript.txt:319(搜「复用WebGL的SIMD纹理运算」)
tfjs-node 与 Keras 速度相当第 1 章text/11-ch01-1-javascript.txt:333(搜「运行速度是相当的」)
张量 = 沟通的语言;乐高比喻第 1 章text/11-ch01-1-javascript.txt:379(搜「赖以沟通的语言」) · text/11-ch01-1-javascript.txt:387(搜「乐高积木」)
deeplearn.js 与 TensorFlow.js 家谱第 1 章text/11-ch01-1-javascript.txt:405(搜「2017年9月」) · text/11-ch01-1-javascript.txt:411(搜「Layers API」)
全面性八条、100MB 上限第 1 章text/11-ch01-1-javascript.txt:417(搜「全部支持的库」) · text/11-ch01-1-javascript.txt:485(搜「100MB」)

Footnotes

  1. 出处:「第 1 章 深度学习和JavaScript」第 125 段(text/11-ch01-1-javascript.txt:125,搜「站不住脚的参数」)。原文还附了一篇深度学习出现之前人工规则人脸识别的综述论文(Erik Hjelmås 与 Boon Kee Low 的 "Face Detection: A Survey")作为佐证。

  2. 出处:「第 1 章」第 131 与 133 段(text/11-ch01-1-javascript.txt:131,搜「准确率能超过99%」;text/11-ch01-1-javascript.txt:133,搜「自动发现解决复杂问题的规则」)。标签、样例两个词的定义也在同一段附近。 2 3

  3. 出处:「第 1 章」第 109 段(text/11-ch01-1-javascript.txt:109,搜「主观意识参与的任务自动化」)。符号人工智能「是20世纪50年代至80年代主要的人工智能范式」,其重要类型是专家系统。 2

  4. 出处:「第 1 章」第 185 段(text/11-ch01-1-javascript.txt:185,搜「封装在相应的权重中」)。原文以密集层为例:权重就是一个矩阵加一个向量。

  5. 出处:「第 1 章」第 187 段(text/11-ch01-1-javascript.txt:187,搜「梯度下降优化进行学习」)。这句坦白值得记住:类脑的灵感是真的,等同是错的。 2

  6. 出处:「第 1 章」第 191 段(text/11-ch01-1-javascript.txt:191,搜「分层表示学习」)与第 193 段(text/11-ch01-1-javascript.txt:193,搜「深刻理解」)。原文:「将深度学习中的『深』解读为对数据的深刻理解是错误的。」 2

  7. 出处:「第 1 章」信息栏 1-1,第 199~209 段(text/11-ch01-1-javascript.txt:209,搜「信用卡诈骗检测」)。

  8. 出处:「第 1 章」第 151~171 段(text/11-ch01-1-javascript.txt:159,搜「极坐标」;text/11-ch01-1-javascript.txt:171,搜「搜索更好的表示」)。两次变换:笛卡儿坐标→极坐标,再做「|角度|−135 度」与 0 比较。 2 3 4 5

  9. 出处:「第 1 章」第 147 段(text/11-ch01-1-javascript.txt:147,搜「RGB或者HSV」)。

  10. 出处:「第 1 章」第 217~219 段(text/11-ch01-1-javascript.txt:217,搜「特征工程」;text/11-ch01-1-javascript.txt:219,搜「无须手动设计」)。

  11. 出处:「第 1 章」第 223~225 段(text/11-ch01-1-javascript.txt:225,搜「3股技术力量」)。

  12. 出处:「第 1 章」第 239~241 段(text/11-ch01-1-javascript.txt:239,搜「CUDA」;text/11-ch01-1-javascript.txt:241,搜「上百倍」)。GPU 本是「廉价且功能单一的、专用于在屏幕上实时渲染复杂三维图像的超级计算机」。 2

  13. 出处:「第 1 章」第 247 段(text/11-ch01-1-javascript.txt:247,搜「1419万」)。

  14. 出处:「第 1 章」表 1-1,第 37 段(text/11-ch01-1-javascript.txt:37,搜「2011年的25%」)。同一张表里还有:目标定位误差 2012 年 33%→2017 年 6%,谷歌神经机器翻译比最好的传统方法错误率降约 60%。 2

  15. 出处:「第 1 章」第 255~261 段(text/11-ch01-1-javascript.txt:255,搜「线性整流函数」;text/11-ch01-1-javascript.txt:261,搜「批标准化」)。

  16. 出处:「第 1 章」第 283 段(text/11-ch01-1-javascript.txt:283,搜「0.5~1美元」)。

  17. 出处:「第 1 章」第 285 段(text/11-ch01-1-javascript.txt:285,搜「150KB」)。这笔账的前提是每帧 400×400 像素、三色通道、8 位色深,JPEG 压缩。 2

  18. 出处:「第 1 章」第 289 段(text/11-ch01-1-javascript.txt:289,搜「皮肤病诊断助手」)。原文:「数据根本无须离开用户的手机,甚至无须存储下来」。

  19. 出处:「第 1 章」第 293 与 319 段(text/11-ch01-1-javascript.txt:293,搜「一行JavaScript的import代码」;text/11-ch01-1-javascript.txt:319,搜「复用WebGL的SIMD纹理运算」)。WebGL 本是用来给三维物体渲染纹理的,而纹理「本质上就是数字矩阵」。

  20. 出处:「第 1 章」第 299 段(text/11-ch01-1-javascript.txt:299,搜「无须安装」)。

  21. 出处:「第 1 章」第 333~339 段(text/11-ch01-1-javascript.txt:333,搜「运行速度是相当的」;text/11-ch01-1-javascript.txt:337,搜「V8引擎」)。书里同时承认:大数据、大模型的训练场景,浏览器不是理想环境。 2 3

  22. 出处:「第 1 章」第 379 段(text/11-ch01-1-javascript.txt:379,搜「赖以沟通的语言」)。原文:「什么是张量?这只不过是计算机科学家对『多维矩阵』更严谨的说法罢了。」

  23. 出处:「致谢」第 5 段(text/08-fm.txt:5,搜「JavaScript语言进行重写」)与「序」第 11 段(text/04-fm.txt:11,搜「基础上加以扩充」)。「关于作者」一节(text/09-fm.txt:5,搜「谷歌大脑」)交代了三位主作者都是谷歌大脑团队工程师、TensorFlow.js 高阶接口的主要开发者。

  24. 出处:「第 1 章」第 387~391 段(text/11-ch01-1-javascript.txt:387,搜「乐高积木」)。

  25. 出处:「第 1 章」第 405~411 段(text/11-ch01-1-javascript.txt:405,搜「2017年9月」;text/11-ch01-1-javascript.txt:409,搜「模型转换器」)。两位发起人是 Nikhil Thorat 和 Daniel Smilkov,也是 TensorFlow Playground 的作者(见原书序)。

  26. 出处:「第 1 章」第 417~431 段(text/11-ch01-1-javascript.txt:417,搜「全部支持的库」)。

  27. 出处:「第 1 章」第 485 段(text/11-ch01-1-javascript.txt:485,搜「100MB」)。同段还指出:即使模型尺寸没超上限,浏览器内训练也可能因数据量过大而过慢。 2