跳到主要内容

阅读笔记(deep-learning-with-javascript)

逐章读原文记下的要点、关键数字、可引短语的行号。正文文件一律是 library/deep-learning-with-javascript/text/ 下的 .txt,一行 = 一个自然段。

前置材料

  • 03-fm.txt 中文版推荐序:甄子(甄焱鲲),阿里巴巴前端委员会智能化方向负责人。背景事件:阿里前端委员会关于「前端工程师能否做深度学习」的讨论;李开复 2020 WAIC 说法;imgcook 例子。甄子团队与 tf.js 团队合作维护 Node.js 版部分功能。注意:推荐序作者也是利益相关方(TensorFlow.js 合作伙伴)。
  • 04-fm.txt 序:Nikhil Thorat 和 Daniel Smilkov(deeplearn.js 发明者、TF.js 技术负责人)。TensorFlow.js 起初叫 deeplearn.js(:5)。三位作者对 Python 版 TF 的贡献:TF 调试器、eager execution、构建与测试基础设施(:7)。Carrie Cai 和 Philip Guo 在 TF.js 官网的调查:开发者诉求是「理解和应用机器学习背后的核心概念」(:9)。本书「在《Python深度学习》的基础上加以扩充」(:11)。
  • 05-fm.txt 前言(蔡善清、斯坦利·比列斯奇、埃里克·D. 尼尔森,2019 年 9 月,剑桥)。TF.js 是「第一个成熟的工业级 JavaScript 神经网络软件库」(:9);四个维度功能;和 Keras 双向兼容。
  • 09-fm.txt 关于作者:三位作者都是 MIT 毕业、谷歌大脑团队软件工程师,是 TF.js 高阶 API 的主要开发者;肖莱是 Keras 之父。利益相关:书写的就是他们自己做的库。

第 1 章 深度学习和JavaScript(11-ch01-1-javascript.txt,30k)

  • 深度学习革命定义:2012 年以来(:15)。
  • 表 1-1 成就表:ImageNet 错误率 2011 年 25% → 2017 年不足 5%(:37);定位误差 2012 年 33% → 2017 年 6%(:43);GNMT 翻译错误率降低约 60%(:49)。
  • 概念层级:AI ⊃ 机器学习 ⊃ 神经网络 ⊃ 深度学习(:113,图1-1)。符号 AI 定义(:109)。
  • 机器学习 vs 传统编程:人脸检测例子(:121-131);「机器学习就是自动发现解决复杂问题的规则的过程」(:133)。
  • 训练阶段/推断阶段;样例、标签、训练数据、模型、假设空间(:135);监督式学习(:139);训练几毫秒到几天;推断计算量少的两个原因(:139)。
  • 表示(representation)学习:RGB/HSV(:147);黑白点极坐标变换例子(:151-171)——两次变换:笛卡儿→极坐标→|角度|-135°。「机器学习 = 搜索更好的表示」。
  • 神经网络:层、权重、密集层(矩阵乘+向量加)(:185);不要过度类比大脑;「并没有证据表明大脑通过任何形式的梯度下降优化进行学习」(:187)。
  • 深度 = 层数;浅层学习 1-2 层;现代数十至上百层(:191)。
  • 信息栏 1-1:朴素贝叶斯、逻辑回归、核方法/SVM、决策树、随机森林、梯度提升(:199-209)。
  • 神经网络史:50 年代成形、80 年代反向传播、蛰伏期、2010 前后 Hinton/Bengio/LeCun/IDSIA 突破(:213)。特征工程自动化(:217-219)。
  • 革命三股力量(:223):硬件(GPU、CUDA 2007,:239;高端 GPU 并行算力是 CPU 上百倍 :241)、数据(ImageNet 1419 万图像 1000 类 :247)、算法革新(ReLU、Glorot 初始化、RMSProp/ADAM :255-259;批标准化、残差连接、深度可分离卷积 2014-2016 :261)。
  • 为何浏览器:五大优势(:281)——更少服务器开销(GPU 云机 0.5~1 美元/小时 :283)、更低推断延迟(400×400×3 通道 8 位 JPEG ≈150KB,300kbit/s 上传 >500ms :285)、数据隐私(皮肤病诊断例子 :289)、即时 GPU 加速(WebGL :293-295)、随时使用(:299)。
  • 信息栏 1-2:SISD/SIMD;GPU 计算单元是 CPU 数百到数千倍(:315);WebGL 纹理 = 数字矩阵,复用做神经网络运算(:319)。
  • Node.js:tfjs-node 对接 C++/CUDA;训练速度和 Python Keras 相当(:333);为什么 Node 而不是 Python:V8 JIT 性能、技术栈匹配(:335-339)。
  • npm 60 万包,比 PyPI 高不止 4 倍(2018-07,:345)。
  • 张量 = 多维矩阵;类型+形状;「深度学习模型赖以沟通的语言」(:379);为何用张量:并行计算(:381)。
  • TensorFlow 2015-11 开源(:377);图(graph)、flow(:383)。
  • Keras 高阶 API;乐高 vs 培乐多比喻(:387)。
  • deeplearn.js 2017-09 发布,Thorat & Smilkov(:405);更名 TensorFlow.js;2018 春 TF 开发者峰会+Google I/O 亮相(:409)。
  • 图 1-8 TF.js 架构:底层并行计算 → Core API → Layers API(:411)。
  • 为何选 TF.js:全面性八条(:417-431)+ 生态(:435)。
  • 应用:Magenta、ML5.js、手语、Canvas Friends、MetaCar、Clinic doctor(:439-453)。
  • 局限:浏览器模型尺寸 100MB 左右(:485);做不了高端强化学习、Node 分布式训练(:487-489)。

第 2 章 TensorFlow.js入门:从简单的线性回归开始(13-ch02-2-tensorflow-js.txt,39k)

(待读)

第 3 章 添加非线性:升级加权和(14-ch03.txt,37k)

(待读)

第 2 章 TF.js入门:线性回归(13-ch02-2-tensorflow-js.txt)

  • 主走查:根据文件大小 sizeMB 预测下载时间 timeSec(:13-15);40 个样例硬编码(:60-79);规律:截距 0.1 秒、每 1MB 加 0.07 秒(:87)。
  • 训练集/测试集划分理由:看了答案再考试(:93)。
  • 张量回顾:shape、轴(:109-111)。
  • 模型:tf.sequential + dense({inputShape:[1], units:1}) = y = kernel*x + bias(:123-131);kernel+bias=权重(:134)。
  • compile:loss='meanAbsoluteError',optimizer='sgd'(:150);MAE 算例 [1.1,2.2,3.3,3.6] vs [1,2,3,4] → 0.25(:154-164)。
  • fit(epochs:10);evaluate() → 0.318,比「直接预测平均值 0.295」的 0.220 还差 → 欠拟合(:190-214);epochs:200 → 0.0488,是基准的 4 倍(:216-223)。过拟合定义(:223)。
  • predict 10000MB → 718 秒;外推风险(:238)。形状错误示例(:242-245)。
  • 2.2 梯度下降:损失平面碗形,最优 {bias:0.08, kernel:0.07}(:276-282);训练循环四步:批次 batch、正向传播 forward pass、算损失、更新权重(:288-294)。批尺寸 2 次幂 128/256(:288)。
  • 梯度直观定义(:302):「损失增加速率最大的方向」;梯度与权重同维(:306);反向走(:310);登山类比(:312)。
  • 随机梯度下降的「随机」=每次随机采样部分数据(:314)。
  • 学习率:过小慢、过大振荡/NaN(:324-326,学习率 0.5 可观察到)。
  • 2.2.2 反向传播:y'=vx,loss=(vx-y)^2,x=2,y=5,v=0 → loss=25(:332-338);链式法则逐步:e3 梯度 -10、e2 -10、e1 -20(:350-356);学习率 0.01 → v+=0.2,理论最优 2.5(:358-364)。反向传播发明于 20 世纪 60 年代(:330)。
  • 2.3 波士顿房价:12 特征表(:410-554),预测 MEDV(:556)。CSV 四个文件(:606-628);Papa Parse(:630)。
  • MSE vs MAE:离群值敏感性;10 样本算例 3 vs 90/900(:658-664)。
  • 基准估计:永远预测平均值 22.77 → MSE 85.58 → 平均误差约 9.25(千美元,即 9250 美元)(:684-688)。
  • 标准化(z-score):(feature-mean)/std;[10,20,30,40]→[-1.3,-0.4,0.4,1.3] (:694-697)。为何:特征取值范围差异大导致训练不稳定(:692)。
  • 广播机制 broadcast(:748,信息栏2-4 :761-775);dataSync:GPU→CPU(:680)。
  • 验证集三件套(:822-838):训练集拟合/验证集调超参/测试集终评;validationSplit:0.2(:840);回调 onEpochEnd(:805-820)。
  • 结果:训练 21.99/验证 31.14/测试 25.32 vs 基准 85.58;偏差 5.03 vs 9.25(千美元)(:876-884);200 轮约 11 秒(:860)。
  • 2.4 可解释性:13 个参数;内积(:900-915);权重正负=特征影响方向,绝对值=重要性(:916);图2-13 五个大权重(:920)。警告:特征强关联时失效(FEAT1/FEAT2 例子 :966);关联不代表因果(房顶湿度 :968)。
  • 2.6 小结:5 行 JS(:984)。

第 3 章 添加非线性(14-ch03.txt)

  • 双层 MLP:dense(50, sigmoid, leCunNormal)+dense(1);701 参数 vs 线性 13 参数(54 倍)(:23-62);测试 MSE 1415 vs 25,误差 37003900 美元 vs 5000(:72)。
  • 三层:3251 参数;MSE 10.813.4,32803660 美元(:137-139)。
  • 激活函数:sigmoid 挤压到 0~1(:76-83);生物神经元类比+ReLU(:78 脚注);可微才能反向传播(:87)。
  • 为何非线性提升容量:身高/年龄、犯罪率/房价例子(:99);sigmoid 中段近线性,不会丢线性关系(:101)。
  • 级联:线性级联仍是线性(:103-108);ReLU 级联出新形状(:110);「神经网络就是函数的级联」(:110)。
  • 容量 capacity 定义(:114)。
  • 谬误实验:去掉 sigmoid → MSE 回到 25(:159-161)。
  • 可解释性:隐藏层 900 个参数无法逐个解释(:185);「牺牲可解释性换容量」(:187)。
  • 超参数定义(:197):训练中不变、决定权重数量/初始值/更新方式;清单(:199-217);超参数优化:不可微/离散(:221);三策略:继承、直觉、网格搜索(:223-227);网格搜索伪代码 5×4=20 组合(:231-242);随机搜索、贝叶斯(:245)。
  • 优化器表 3-1(:324-386):sgd/momentum/rmsprop/adadelta/adam/adamax;adam = 自适应+动量,对学习率选择依赖更小(:306)。
  • 二分类:钓鱼网站数据集,30 特征,约 5500 训练+5500 测试,45% 正例(:275-289)。输出层 sigmoid → 概率(:296-304)。
  • 度量:TP/TN/FP/FN、混淆矩阵(:390-407);假想矩阵 4/2/1/93 → 准确率 97% 的迷惑性(5 个钓鱼网站全猜否也有 95%)(:426-432);精确率 4/5=80%、召回率 4/6≈66.7%(:436-450);阈值调节取舍(:456)。
  • ROC 曲线:FPR=#FP/(#FP+#TN),TPR=recall(:464-470);训练推进曲线推向左上角(:545);AUC:随机 0.5、理想 1.0、钓鱼模型 0.981(:549);阈值选择 = 沿曲线移动,权衡业务(:582-588)。
  • 为何准确率不能当损失:阶跃函数导数全 0 → 梯度全 0(:603-607)。
  • binaryCrossentropy 伪代码 -log(prob)/-log(1-prob)(:615-620);表3-5 对比 MSE:prob 0.9 时 0.100 vs 0.01,边际效应递减(:630-688)。
  • 多分类:鸢尾花 150 样本 3 亚属 4 特征(:694-698)。
  • one-hot 编码(:705-745):为何不直接用整数——隐含排序(:747-751)。
  • softmax:exp 归一化,输出和为 1(:786-803);[-3,0,-8]→[0.0474,0.9523,0.0003] (:795-798);argMax(:805-815)。
  • categoricalCrossentropy:只看真类型那一位 -log(probs[i])(:827-833);0.693 算例(:835-838);表3-6。
  • 混淆矩阵细粒度(:892-902);任务类型对照表 3-7(:946-986)——回归/二分类/多分类的激活+损失+指标。

第 4 章 convnet(15-ch04-4-convnet.txt)

  • 图像 = 三维张量 HWC;批次四维 NHWC(:27-33);MNIST:28×28 灰度,6 万训练 1 万测试(:35-43)。
  • convnet 7 层代码清单 4-1(:56-83):conv2d(3,16,relu)→maxPool→conv2d(3,32)→maxPool→flatten→dense(64)→dense(10,softmax)。
  • conv2d = Photoshop 滤镜比喻(:95);卷积核滑动点积(:101-111);filters=输出通道数(:105);[3,3,2,3] 核形状剖析(:101)。
  • 局部性 locality + 参数共享 parameter sharing(:117-121);参数效率:200 vs 3612672(18000 倍)(:123);与视网膜感受野相似(:125)。
  • maxPooling2d:位置不变性(:139);感受野 5×5→11×11(:141);元素数减到 1/4(:143)。
  • 层次特征提取:边角→眼睛→猫(:152,图4-6)。
  • flatten 排序规则(:163-165);convnet = 特征提取器 + MLP 级联(:173-179)。
  • 训练:batchSize 320、validationSplit 0.15、rmsprop(:187-216);10 轮测试准确率 99.0%(:236);批次大小的取舍(:230)。
  • 对照实验:纯密集层同参数量 3.3 万 → 97.0%,误差率是 convnet 的 3 倍(:244-271);99.5% 需要更大模型(:240)。随机猜测基准 10%(:242)。
  • 推断:tensor4d、tf.browser.fromPixels(img/canvas/video)、resizeBilinear、expandDims、÷255 归一化(:277-308);避免训练/推断数据偏斜(:306)。
  • 4.3 tfjs-node:C++ 多线程/CUDA(:341);安装步骤(:358-376);GPU 是 CPU 版 5 倍速(:377)。
  • 加强版 convnet:4 个 conv2d、512 单元、594922 参数(18 倍)、两个 dropout(:383-461);20 轮 99.6%(:381)。
  • dropout:训练时随机置 0,推断时恒等(:465-469);Hinton 银行柜员故事(:475-477);打乱「神经元勾结」(:479)。
  • model.save('file://...') → model.json + weights.bin(:509-532);tf.loadLayersModel,浏览器用 http URL(:534-555)。
  • 4.4 音频:时频谱 spectrogram(:567-575);傅里叶变换;20 毫秒窗口;耳蜗生物版傅里叶(:573);口令数据集 20 类(:577);43×232 尺寸(:579);kernelSize 长方形 [2,8] (:632);Pete Warden 数据集(:634);训练达 94%(:652);@tensorflow-models/speech-commands 用法(:656-688)。

第 5 章 迁移学习(16-ch05.txt)

  • 两个开场场景:用户手写风格偏移 50 样例、电商商品分类数百样例(:15)。
  • 迁移学习定义;基模型/迁移模型(:23);「不同但相关」;模型自适应(:29);两大优势(:33-39);ImageNet 特征提取器;词嵌入预告(:41)。
  • 5.1.1 MNIST 0-4 → 5-9:固化前 7 层 trainable=false;必须重新 compile 才生效(:64-89);600165 参数中 9568 不可训练(:91-94)。结果:固化 0.97/30 秒;重新初始化 0.95;不固化 0.95/60 秒(:115-127)。图5-4:固化层不参与反向传播(:129)。
  • 5.1.2 吃豆人:webcam 每方向 ≥50 张、20-30 帧/秒(:153-159);截断 MobileNet(getLayer('conv_pw_13_relu'),93 层→87 层)(:167-182,222);符号张量 SymbolicTensor = 占位符(:212-220);tf.model({inputs, outputs})(:220);嵌入 embedding:7×7×256≈1.25 万维 vs 原图 15 万维(:230);新头部 = flatten+dense+dense(4,softmax)(:247-271);双模型推断两次 predict(:275-299);缺点三条(:301-305)。
  • 信息栏 5-2 KNN(:309-335):k 个最近邻投票;无须训练;n 大则不可扩展。
  • 信息栏 5-1 Keras→TF.js 转换:pip install tensorflowjs,save_keras_model;group1-shard 文件(:184-210)。
  • 5.1.3 口令微调:单模型方案(apply() 把新头部接到符号张量上,图5-10)(:369-407);微调 = 初步训练后解除顶部层固化+重新 compile+再训练(:409-485);balancedTrainValSplit 小数据集均衡划分(:489-491);结果:微调 84%→90~92%,无微调停在 85%(:493-497);为何有效:增加容量+适配新数据(:499);解更多层要看情况(过拟合风险)(:501)。三种方法对照表 5-1(:503-521)。
  • 5.2 目标检测:分类→回归的跨任务迁移(:529-533);合成场景:三角形/长方形+噪声(10 圆 10 线段)(:559-567);合成数据好处:自动标签+无限量(:569)。
  • 双任务预测:5 个输出(1 形状+4 边框)(:561-565);自定义损失函数签名(:634-640);形状标签乘 CANVAS_SIZE=224 平衡误差信号(:644-655);两阶段训练:rmsprop 5e-3 → 2e-3、batchSize 减半(:659-689)。
  • 信息栏 5-3:SSD/YOLO/COCO 80 类/多头部/加权双损失/候选框裁剪/先验框(:694-727)。
  • 结尾引第 6 章:现实数据不规整,从业者大量时间花在数据上(:735-737)。

第 6 章 处理数据(18-ch06.txt)

  • 引子:数据 = 火箭燃料比喻(Edd Dumbill)(:13-17);「下载-转换-批次化」模式(:21-23)。
  • tf.data.Dataset:惰性流式加载,类 Node Stream;比内存大的数据集(:40);元素定义脚注(:42)。
  • 三种创建方式表6-1(:46-72):tf.data.array / tf.data.csv / tf.data.generator(function*)。
  • V8 内存限制 1.4GB(64 位)(:78);fitDataset 不把全部数据放进 GPU 显存(:78)。
  • 读取:toArray(小心爆内存)/forEachAsync;都是异步,忘 await 的 bug(:195-201)。
  • 链式方法表6-3(:229-285):filter/map/mapAsync/batch/concatenate/repeat/take/skip/shuffle(bufferSize 窗口!)。关键:链式 = 惰性小程序(:227)。
  • 划分训练/测试集:同一 seed shuffle + take/skip(:289-301);先 skip 后 map 省算力(代码清单6-5 计数器验证 :305-333)。
  • 流式标准化:闭包 samplesSoFar/sumSoFar(:336-355);无限数据集均值不可算的 1e9 例子(:334)。
  • fitDataset:元素须为 {xs, ys};data-generator 卡牌游戏:25 万样例 = 50 轮×50 批×100;75% 准确率(:383-393);目标检测 25 万样例 = 150GB 显存算式(:397-399)。batchesPerEpoch、validationBatches(:495-503)。
  • CSV 处理:Kaggle 13971 个数据集 2/3 是 CSV(2019-01,:515);columnConfigs/isLabel(:592-622);异常处理要在 await 处 try(:578-591);RequestInfo 带认证头(:624-632)。
  • tf.data.webcam(:634-742):capture()/stop();不能 forEach/toArray(帧率问题 :698);预热模型+摄像头(:721-741);直接预处理而非 map(:683-697)。
  • tf.data.microphone(:743-804):fftSize 1024、columnTruncateLength 232(5kHz/22kHz×1024)、43 帧≈1 秒、采样率 44100/48000;预热 200ms(:804)。
  • 6.4 有缺陷数据:分布/样本/IID 前提(:816);偏斜 skew:工作日 vs 周末路况、麦克风坏掉(:818-822);数据排序导致不独立:加州房价经度按索引排序(图6-3)(:826-854);shuffle 窗口 10/50/250/6000 实验(:860-870)。
  • 离群值:体重 40~130kg,145000kg;截断+isOutlier 特征(:876-884)。
  • 缺失:MAR/MCAR/MNAR 信息栏6-3(:892-910);四招:舍弃样本/插值(均值中位数众数)/标记值/插值+缺失指示特征(:912-968)。
  • 偏斜检测:Facets 工具(:972-976);「用样本预测它来自哪个数据集」的高级检测(:976)。
  • 字符串格式不一致(FIREFOX\n)(:980);不平衡特征删掉(:986);整数编码类别要 one-hot(:988);特征尺度(:990);偏见/安全/隐私 Responsible AI(:992)。
  • 6.5 数据增强:伪样例(:1004-1008);猫图旋转/偏斜(:1010);「无法产生新信息,只能重新混合」(:1014);不用于验证/测试集(:1016,1036);augmentFn + repeat().map().batch()(:1018-1040)。

第 7 章 可视化(19-ch07.txt)

  • tfjs-vis 独立包(:31-39);tfvis.render.* 五种图:linechart(多序列 series)/scatterplot/barchart(index-value)/histogram(maxBins)/heatmap(xTickLabels)(:41-180);表7-1 总结(:182-206)。
  • 耶拿气象数据集:德国耶拿气象站 2009-2017,42MB CSV,15 列,10 分钟采样(:216);42 万数据点画不下 → 三招:时间跨度选择/降采样(每月 4320→720)/选列(:224-238);标准化方便可视化(气温 -1040 vs 气压 9801000)(:274);散点图:大气密度 vs 气温负相关(:276-280)。
  • 7.2 可视化训练后的模型:VGG16(权重 528MB vs MobileNet <10MB)(:303-305);「黑箱」真正含义脚注(:288);三技巧(:292-296)。
  • 内部激活:compositeModel 多输出(:334-374);层越深越抽象+稀疏度增加(:322-324);「信息提纯流水线 information distillation pipeline」(:326);狗/狼/雪偏差案例(:328)。
  • 输入空间梯度上升:固化权重、更新输入(:377-385);tf.grad 返回函数(:411-414);梯度标准化技巧(:416-419);80 迭代;block1 颜色/边缘→深层 颗粒/羽毛(:387-399);clipByValue(:451)。
  • CAM 类激活图(:457-481):猫「埃及猫」0.89;步骤 5 步:最后卷积层 block5_conv3→类别概率对卷积输出梯度→均值得 [numFilters] 重要性→广播乘输出→均值成 [h,w] 灰度图→负值归零+升采样(14×14→224×224)(:469-479);大象鼻子/耳朵(:461)。LIME 提到(:463)。
  • 延展:Ribeiro「Why Should I Trust You」、TensorSpace、tSNE 库(:485-491)。

第 8 章 欠拟合/过拟合/通用流程(20-ch08.txt)

  • 气温预测任务:前 10 天 14 指标 → 24 小时后气温(:21);样例生成:step=6 采样、timeSteps=240、延时 144 行(图8-1)(:23-29);三维批次 [batchSize, timeSteps, numFeatures]——首次序列数据(:31-35);getNextBatchFunction 迭代器(:37-47)。
  • fitDataset + prefetch(8) + tfvis.show.fitCallbacks + visor/surface(:51-84)。
  • 欠拟合:线性回归 MAE≈0.9 → ×8.476 ≈ 7.6 摄氏度(:92-120);加隐藏层应对。
  • 过拟合:MLP 训练 0.2(1.7°C)验证 0.35(3°C),验证曲线回升(:143-153)。
  • L2 正则化:loss += l2Rate * l2(kernel);l2 = 平方和;[2,2] 核算例 0.3(:162-175);l2Rate 默认 1e-3(:175);奥卡姆剃刀解释(:197);tfvis.show.layer 看权重分布变窄(:179-195)。
  • 表8-1 应对过拟合:L1/L2/l1l2/dropout/batchNormalization/earlyStopping(minDelta/patience)(:201-257)。
  • 图8-6 三种损失曲线模式:欠拟合(双高)/过拟合(训练低验证升)/刚好(:259-261)。
  • 通用流程 8 步(:267-333):①机器学习是否合适(加法反例 addition-rnn);②定义问题和数据(两个隐含假设;概念漂移 concept drift 服装推荐);③定义度量指标;④评估方案(时序数据验证集要在训练集时段之后);⑤向量化+标准化;⑥超越常识基准(预测平均值/上一个点);激活/损失/优化器匹配任务类型,rmsprop 起步;⑦刻意过拟合找容量临界点(加层/加宽/加轮次);⑧正则化+调超参,小心对验证集过拟合。

第 9 章 序列和文本(21-ch09.txt)

  • 序列数据:元素有序;反转气压序列意义全变(:19)。
  • 9.1.1 密集层为何无法为顺序建模:乘法加法对称(:41-45);常识基准:「24 小时后气温=当前气温」MAE 0.2903,MLP 打不赢(:47-64)。
  • simpleRNN:元胞 cell、「包裹在 for 循环中的元胞」(Eugene Brevdo)(:72-74);状态回流(:80);打破对称(:82);伪代码 y=f(dot(W,x)+dot(U,y))(:86-90);任意长度序列(:95);参数共享=时间维度平移不变性,类比 conv2d 空间(:97);BPTT(:99)。
  • 实战:32 单元 simpleRNN+dense;1537 参数 vs MLP 107585(70 倍),验证 MAE 0.27 vs 0.29(:157-169);但慢:O(T) 不可并行,GRU 3000ms/批次 vs simpleRNN 950ms(:171,217);Node 训练 + TensorBoard 回调 tf.node.tensorBoard(信息栏9-1 :123-153)。
  • 梯度消失;GRU:更新门 z、重置门 r、h = (1-z)h + z·h'(:177-198);影评「这个电影还不错,然而…」例子(:196);工程师不必懂全部细节(:200)。
  • GRU 结果:验证 MAE 最低约 0.266(:217)。LSTM 1997 Hochreiter & Schmidhuber(:223 脚注)。
  • 9.2 文本:NLP 模型不理解含义,只是统计结构映射(:243)。
  • 向量化:one-hot(1 万词表;句子 18 词×1 万=18 万个数 :255);OOV(:253);multi-hot 丢顺序但定长(:261)。
  • IMDb:2.5 万影评二分类,均衡,10~2000 词(:265);multihot MLP(16,16,1)验证准确率约 0.89(:289-307);「Don't get me wrong…」双重否定例(:307)。
  • 词嵌入:可训练权重矩阵 [vocabularySize, embeddingDims] (:311-313);500×128=6.4 万 vs one-hot 500 万(:323);语义相近→向量相近,very/truly vs barely(:325);词性/阴阳性维度(:327);表9-1 对照(:329-353)。
  • 1D convnet:conv1d 滑动一维(:355-363);截断填充 padSequences,maxLen=500,'pre'(:365-409);模型:embedding(10000→128)+dropout0.5+conv1d(250,5)+globalMaxPool1d+dense(250)+dense(1,sigmoid);150 万参数(:415-455);496=500-5+1(:462);验证准确率约 0.91(:468);卷积核对顺序敏感(:470);核尺寸限制远距离依赖,堆叠扩大感受野(:472-474);LSTM 同准确率但慢约 6 倍(:476-478)。
  • Embedding Projector:t-SNE/PCA 降维;正面词一端负面词一端(信息栏9-2 :480-496);GloVe 预训练词向量(:498-500)。
  • 浏览器推断:小写去标点、OOV_INDEX、复用 padSequences → 减少偏斜(:504-538)。
  • 9.3 seq2seq:日期格式转换 → ISO-8601(:560-570);18 种格式;「01/02/2019」歧义脚注(:573)。
  • 编码器-解码器:两个输入;解码器输入=右移的目标+(:597-603);人类说话类比(:603);推断逐字符生成(:605-611)。
  • 注意力:初始状态太浓缩(:617-619);编码器所有输出序列,不只最终输出(:621);2014-2015 突破(:617);GNMT 同架构(:623)。
  • 细节:embeddingDims=64,lstmUnits=64;函数式 API tf.input;maskZero(:631-647);returnSequences(:655);GetLastTimestepLayer 自定义层(:657-662);initialState:[encoderLast,encoderLast] (LSTM 双状态)(:675-676);注意力=dot(axes[2,2])+softmax → [null,10,12] (:678-685);上下文 context=dot(attention,encoder)(:687-693);concatenate→timeDistributed dense→softmax 13 字符(:695-713);categoricalCrossentropy+adam(:721-726);贪心解码/集束搜索(:739)。

第 10 章 生成式深度学习(22-ch10.txt)

  • 生成式 vs 判别式(:25-26);「生成式对数据理解更透彻」。
  • 10.1 LSTM 文本生成:下个字符预测;左移拼接(:45-49);香农 1951 实验:每字母 1.3 位熵 vs 随机 4.7 位(:51-57)。
  • lstm-text-generation:sampleLen=40、charSetSize=71、堆叠 LSTM returnSequences(:68-116);损失 3.2→1.4~1.5,接近香农 1.3(:121);表10-1 四轮次×四温度文本样例(:123-167)。
  • 温度(混沌值):log(probs)/T + tf.multinomial(:175-195);[0.1,0.7,0.2] T=0.25→[0.0004,0.9930,0.0066];T=0.75→[0.0591,0.7919,0.1490];T=1 不变;排序不变(:196-215);名字来自热力学(:219);argMax=确定性(:177)。
  • 10.2 VAE:自编码器沙漏;本征向量/z 向量/本征空间(:231);信息论视角像素非随机(:237);微笑维度(:239-241);经典自编码器 2013 后不流行;Kingma & Welling 2013-12、Rezende 2014-01(:243)。
  • VAE:映射到均值+对数方差;重参数化 z = zMean + exp(zLogVar*0.5)*epsilon(:249,280-289);ZLayer 自定义层(:292-327);Fashion-MNIST:28×28,10 类,顶尖 96.35% vs MNIST 99.75%(:253);编码器 3 输出(zMean,zLogVar,z)(:332-356);解码器 sigmoid(:360-376);损失=重建 MSE×originalDim + KL 散度(:393-412);optimizer.minimize() 不用 fit(KL 项依赖多输出)(:414-416);GPU 5 分钟/CPU 1 小时(:273);20×20 网格本征空间漫游(:442-446)。
  • 10.3 GAN:Goodfellow 2014;StyleGAN 人脸(:452);造假者/鉴定专家比喻(:474-476)。
  • 判别器训练:拼接真假批次,binaryCrossentropy(:478-482);生成器训练:假图标真标签 1 + 固化判别器(:484-488);「阴阳调和」(:488)。
  • ACGAN:判别器双输出(realness sigmoid + 类别 softmax);conv2d+leakyReLU(0.2)+dropout(0.3)(:494-537);生成器:latent×classEmbedding multiply→dense→reshape[3,3,384]→conv2dTranspose 升采样 3→7→14→28,tanh 收尾(:541-606);反卷积 deconvolution(:545)。
  • 训练技巧(:626-636):tanh;真实度标签 0.95 近似;判别器 dropout 引随机;避免稀疏梯度(stride 卷积替代最大池化、leakyReLU)。
  • 训练数小时;损失曲线不单调(:654-658);浏览器生成:10 类有序样本+z 向量 100 滑块(:665-674)。

第 11 章 深度强化学习(23-ch11.txt)

  • RL vs 监督:无标签、与环境互动、时间维度(:13-21);智能体/环境/行为/奖励/观察(:27-35);应用图11-1(棋/股票/数据中心/机器人)(:19)。
  • 行为离散/连续(星际争霸 II 离散化 :37);奖励频率可变(倒立摆高频 vs 象棋终局)(:43-45);观察全/部分(扑克、股票)(:49);双向信息流是本质区别(:51);时间轴(:53)。
  • 平衡倒立摆 cart-pole:Barto/Sutton/Anderson 1983;控制论基准(:59-61);4 个物理量 x、xdot、theta、thetadot(:74-76);结束条件+500 步上限(:78-84);表11-1 RL 术语对照(:90-110)。
  • 策略网络:输入 4 维观察→输出对数值(logits)→sigmoid→tf.multinomial 随机采样(:118-132);为何随机采样:探索/利用权衡(:132-134);无标签数据集,在做中学(:138)。
  • REINFORCE(Williams 1992):折扣化奖励 γ≈0.95/0.99(:178-184);回合末行为低奖励;长回合早期高(:182);标准化奖励(均值 0 标准差 1):短回合全负→避免,长回合早期正→鼓励(:206-210);策略梯度 policy gradient(:190,220);sigmoidCrossEntropy(labels, logits) + tf.variableGrads(:194-205);训练 8 步流程(:212-228);25 迭代几分钟达 500 步巅峰(:280);曲线剧烈波动是常态(:282)。
  • 宏观:RL 优势(普适、自适应环境变化)vs 缺点(大量试错,400 回合;自动驾驶/机械臂承担不起)(:290-292);倒立摆奖励高频+无记忆,贪吃蛇不然(:294)。
  • 贪吃蛇:9×9 网格;行为 3 种(直走/左转/右转);奖励 +10 水果/-0.2 空移/-10 死亡(:310-316);奖励稀疏→策略梯度不适用(:316);表11-2(:318-338);SnakeGame API step()→{state, reward, done, fruitEaten}(:340-366)。
  • MDP:下一状态只由当前状态+行为决定(:372-378);7 状态 2 行为示例:行为 a1 → -3+0.9×10=6,a2 → 3+0.9×-4=-0.6(:390-404);Q 值=状态行为对的折扣化总价值(:406);贝尔曼方程 Q(s,a)=r+γ·max Q(s')(:416-430);贝尔曼 1957(:422 脚注)。
  • DQN:查询表不可行(状态组合天文数字,:477-479);[9,9,2] 张量(蛇头 2/蛇身 1/水果 1)(:434-440);convnet+BN+dropout,输出 [3] (:442-476);约 100 万参数(:477)。
  • 训练:回放记忆 replay memory 五元组 (s,a,r,done,s')(:495-509);固定长度滚动;均匀采样(:511-515);epsilon 贪心:0.5→0.01,1e5 步,不为 0(:517-548)。
  • 预测 Q:在线 DQN + oneHot 选行为(:552-583);目标 Q:目标 DQN + max + γ + doneMask(:585-610);为何两个网络:打破反馈循环;每 1000 步同步(:610-612);MSE 损失 → 回归问题(:614-657)。
  • 结果:数小时训练,cumulativeReward100 峰值 70~80、eaten100 峰值 12(:661);实测均值 18(去掉探索)(:667);蛇学会先贴边策略;长度>20 会困死(:667)。Mnih 2015 Nature 论文(:671,677)。

第 12 章 测试、优化、部署(24-ch12.txt)

  • 参与作者:Yannick Assogba、Ping Yu、Nick Kreeger(:5)。
  • 版本控制:模型=BLOB,与代码分开(:25);「所有部分都该测」图12-1(:27-29)。
  • 单元测试:阈值断言危险(训练随机性)(:33);Math.seedrandom(42)(:35-38);测外围代码+形状断言+可训练性(:40);代码清单12-1:输入输出形状、fit 2 轮、predict 范围 0~1(:46-103)。
  • 黄金值 golden value:为何不该测(:105-109);三场景:端到端(配小子集测试定位)(:111-113);业务需求(业务逻辑层/样例加权/集成)(:115);bug 报告(加入训练集而非单元测试)(:117);例外:模型冻结时测推断系统(:119)。
  • 持续训练:TFX;样例校验器(垃圾进垃圾出;身高≤280cm 等)(:123-133);模型校验器、模型评估器(分人群偏见)(:135-137)。
  • 12.2 优化:质量 vs 性能(:149);模型 >1GB 常态(:153);巴赫涂鸦 8 位量化 → 380KB(2019-03 谷歌首页)(:155);MobileNetV2 14MB vs ResNet50 100MB;14MB 仍是平均网页 8 倍(1828KB)(:165-171)。
  • 权重量化:float32→8/16 位;逐权重 min/scale;反量化(:175-187);16 位减半、8 位减 75%(:187);有损类比 24→8 位彩色(:189);表12-1:房价 MAE 几乎不变;MNIST 99.52% 不变;Fashion-MNIST 92.2→92.1;MobileNetV2 8 位崩(top-1 0.618→0.280)、16 位无恙(:226-280);argMax 抗噪(:263);gzip:8 位量化后压缩率提升(小模型 30~40%)(:284-319);推断算力不变(反量化)(:321)。
  • GraphModel 转换:tensorflowjs_converter --output_format tfjs_graph_model(:327-334);限制:不支持循环层、不能 fit(:338-342);提速:浏览器 2030%、Node 7090%(表12-3 :344-380);原理:常数折叠(BN 层 6 运算→2)(:382-408)、运算融合(matMul+bias+relu;Node 端 libtensorflow 运算更丰富)(:410-416);Grappler(:416)。
  • 测推断时间:predict 不等待 GPU,要 await array()/data();预热/煲机(:420-433)。
  • 12.3 部署:Web(CORS 坑;浏览器缓存碎片;隐私 vs 模型被盗)(:443-458);云(TensorFlow Serving;SavedModel 转换;可控 vs 延迟隐私成本)(:460-484);Chrome 插件(chrome-extension 示例)(:486-512);React Native(tfjs-react-native alpha,expo-gl,asyncStorageIO)(:514-543);Electron(前/后端进程选择;tfjs-node 50MB 体积)(:545-561);微信小程序(10 亿月活;2017 小程序;PoseNet 插件;传感器 API 性能更好)(:563-575);单片机(树莓派;tfjs-node ARM NEON / tfjs-headless-nodegl;Jetson Nano)(:577-593);表12-4 总结(:599-631)。

第 13 章 总结与展望(25-ch13.txt)

  • AI/ML/DL 关系回顾(:27-31);「解决了感知问题」(狭义)(:37);第三次 AI 夏天(:39);乐观:仅凭现有技术应用就够革命(:41);费曼「它并不复杂,只是量大罢了」(:45)。
  • 几何视角:一切=向量;层=简单几何转换;可微(:49)。
  • 成功四因素(:53-61):算法革新/有标签数据(消费互联网副产品)/并行硬件/开源软件普及。
  • JS 优势回顾(:69-87):客户端推断、隐私、WebGL、可视化教学、传感器 API、Node 一次编写到处运行。
  • 通用流程 11 步(13.2.1)(:93-121):加 (10) 校验评估(公平性)(11) 优化部署。
  • 三大网络类型(:123-141):MLP/convnet/RNN 与数据类型匹配表;架构=假设空间(:125);可微乐高(:127)。
  • MLP 细节(:145-149);输出层配方(二分类 sigmoid+binaryCrossentropy;多分类 softmax+categoricalCrossentropy;多标签 sigmoid;回归线性)(:151-177)。
  • convnet:深度可分离卷积 separableConv2d 推荐(:181-209)。
  • RNN:GRU/LSTM 优先;returnSequences 堆叠(:211-238)。
  • dropout/BN 辅助层(:240-259)。
  • 预训练模型生态(:261-283):mobilenet、coco-ssd(90 类)、face-api.js、handtrack.js、posenet、speech-commands、toxicity、universal-sentence-encoder、nsfwjs、ml5.js、@magenta/music、MusicRNN;乐高可组合(:287)。
  • 可能性空间(:285-361):向量→向量、图像→向量、时序→向量、文本→向量、文本→文本、图像→文本、图像→图像、混合。
  • 局限(13.2.5)(:363-381):拟人化错误;图像标注失败案例;对抗性样例(大熊猫+长臂猿梯度);局部泛化 vs 人类极限泛化(8 样例画边界);无先验知识→需要大量标注数据。
  • 趋势(13.3)(:383-405):无监督/半监督;硬件(TPU);AutoML/Vizier;模型复用;新领域;边缘设备。
  • 学习指引(13.4):Kaggle、arXiv(ArXiv Sanity Preserver)、TF.js 生态(:407-425)。

附录 A(26-apx-a-a-tfjs-node-gpu.txt)

  • CUDA+CuDNN 安装,仅 Linux/Windows;tfjs-node-gpu 1.2.10 配 CUDA 10.0、CuDNN 7.6(:11-21);nvidia-smi;LD_LIBRARY_PATH。操作性附录,不单独成章,第 12 章或 Node 章顺带一提即可。

附录 B(27-apx-b-b-tensorflow-js.txt)

  • dtype/shape/rank;最高 6 阶(:15-19);标量 vs 单元素张量([1,1] 不是标量)(:63);四维向量≠四维张量(:76)。
  • data() 异步 vs dataSync() 阻塞;array()/arraySync() 保留嵌套(:45-61,99-117);行优先 row-major(:99-101)。
  • 批次轴惯例:[null, ...] (:160-164);实际应用形状表:向量 [n,f]、序列 [n,t,f]、图像 NHWC、视频五维(:166-212);视频算例:4×240×144×256×3 ≈ 1.06 亿个数 ≈ 405MB(:212)。
  • tf.tensorBuffer 可变缓冲区(:214-244);zeros/ones/zerosLike;randomNormal/randomUniform(:246-313)。
  • 函数式 vs 链式 API(:329-345);归约运算 mean(-1)(:347-376);二元运算+广播(:378-398);concat/slice/unstack/stack(:400-486)。
  • 内存管理:张量不自动回收(JS 无对象释放);predict 每次泄漏一个;tf.dispose / tf.tidy;numTensors 监控(:488-557);tidy 不回收返回值(:569-595);异步代码不能 tidy(:595)。
  • 梯度:tf.grad 返回函数;tf.grads 多参;tf.valueAndGrads;tf.variableGrads(f) 对 tf.Variable 求导(:597-668);f=ax²+bx 例(:651-668)。