📘 第14章 人工智能与海量数据和物联网
📄 一句话概括

这一节的两个例子,一个在「看懂」,一个在「动手」。 前者难在数据量大,后者难在时间紧。 有意思的是,两边最后都落到同一件事上:把「算得准」换成「来得及时」。

📝 本节和前面几节的关系

14.2 讲的是传感器每秒吐数据,这一节讲两个更极端的场景。 脑扫描是「一次就几十 MB」,机器人是「三十四毫秒必须动」。 10.3 讲图像识别,这一节的三维重建、目标检测用的是同一套思路, 只是数据从二维图片变成了体素和点云。

一、一次脑扫描有多大

功能核磁的每个体素是三毫米见方的一小块,全脑五万个:

项目 数量
体素边长 3 毫米
全脑体素个数 50000
时间点 200
单次扫描 40.0 MB
一千个人 40.0 GB
五万体素乘两百个时间点,是四千万个数,四千万字节正好 40 MB;
再乘一千个人,正好 40 GB。两个 40 不是笔误。
而且这是一个人的「一次」扫描。纵向研究还要乘上次数。
脑科学的存储压力,就是这么被三个乘数堆出来的。

二、功能连接:一起动的算一伙

五万个体素两两算相关,是十二亿对——算不完也用不上。 常规做法是先划成感兴趣区,这里取 200 个,算 200 乘 200 的相关矩阵。

项目 数量
两两组合 19900 对
相关矩阵里最大的相关 0.788
网内平均相关 0.496
网间平均相关 -0.033
网内 0.496、网间 -0.033,差得很干净——
这就是「功能连接」的全部依据:一起动的,多半是一伙的。
注意这只是相关,不是因果。
两块脑区同时亮,可能是第三块在指挥它们;也可能是同一个刺激分别激活了它们。
从相关到因果,中间还差一整个实验设计。

三、逆运动学:每一组解都要挑

两根连杆各长一米,给手的目标位置,反推肩、肘两个关节角:

目标点 解一 解二 回代误差
(1.2, 0.6) -21.3 度 / 95.7 度 74.4 度 / -95.7 度 2.48e-16
(0.0, 1.5) 48.6 度 / 82.8 度 131.4 度 / -82.8 度 1.11e-16
(1.9, 0.0) -18.2 度 / 36.4 度 18.2 度 / -36.4 度 0.00e+00
回代误差都在 1e-16 量级,说明解是对的——代回正解公式,手正好落在目标点上。
注意每个点都有两组解:肘向上或者肘向下。
挑哪个不是数学问题,是看会不会撞到桌子。
数学给的是「所有可能」,工程要的是「其中一个能用的」。
还有一件数学管不了的事:够不着。
目标 (2.5, 0) 超出两连杆全长 2.0,算出的余弦 2.125 大于 1,无解。
真实控制器一定要先判可达性,否则 acos 直接报错。

四、延迟会变成距离

一条「机械臂接住滚来的球」的控制回路,各环节的典型耗时:

环节 耗时
相机曝光与读出 8.0 毫秒
图像传输 3.0 毫秒
目标检测推理 12.0 毫秒
轨迹规划 4.0 毫秒
下发指令 1.0 毫秒
伺服响应 6.0 毫秒
合计 34.0 毫秒
球以每秒 2 米滚过来,34 毫秒里它走了 7 厘米。
这个距离必须提前补偿——不能瞄准「现在看到的位置」,要瞄准「到时它会在的位置」。
所以机器人控制里,预测和目标检测一样重要,甚至更重要。
检测告诉你「它在哪」,预测告诉你「该往哪抓」。
这两个例子的共同点在这儿:
脑功能分析是「数据太多,得先降维」;机器人是「时间太少,得先预测」。
一个砍数据,一个补时间,都是为了让结果来得及用上。

五、动手 Demo:一边看脑,一边动手

四段:一次扫描的体量、功能连接矩阵、逆运动学的两组解、控制回路的延迟。 脑数据是造出来的,相关矩阵是真算的;机器人那两段是真的解方程、真的代回去验算。 没有接任何脑机接口,也没有真机械臂。

def fk(t1, t2, L1=1.0, L2=1.0):     # 正解:给关节角,算手在哪
    x = L1 * np.cos(t1) + L2 * np.cos(t1 + t2)
    y = L1 * np.sin(t1) + L2 * np.sin(t1 + t2)
    return x, y


def ik(x, y, L1=1.0, L2=1.0):       # 逆解:给手的位置,反推关节角
    c2 = (x * x + y * y - L1 ** 2 - L2 ** 2) / (2 * L1 * L2)
    if abs(c2) > 1:
        return None                 # 够不着,先判可达性再算
    t2 = [np.arccos(c2), -np.arccos(c2)]   # 肘上、肘下两组解
    return t2

实跑输出:

--------------------------------------------------------------------
一边看脑,一边动手
--------------------------------------------------------------------
==============================================================

[1] 一次脑扫描有多大

    项目                数量
    体素边长            3 毫米
    全脑体素个数        50000
    时间点              200
    单次扫描            40.0 MB
    一千个人            40.0 GB

  **每个体素就是一个小方块里的平均活动,三毫米见方。**
  **脑子小,可架不住要几百个时间点、几千个人,一凑就是几十 GB。**
  **而且这是一个人的「一次」扫描,纵向研究还要乘上次数。**
  **两个 40 不是笔误:四千万字节正好 40 MB,乘一千正好 40 GB。**

[2] 功能连接:哪些区域一起动

  五万个体素两两算相关,是十二亿对——算不完也用不上。
  常规做法是先划成感兴趣区(ROI),这里取 200 个,算 200 乘 200 的相关矩阵。

    项目                  数量
    两两组合              19900 对
    相关矩阵里最大的相关  0.788

  相关最高的五对(区号从 0 开始):

    区号        相关系数    是不是同一组
    1 与 5      0.788       是
    9 与 53     0.775       是
    25 与 50    0.775       是
    1 与 30     0.772       是
    43 与 52    0.770       是

  **网内平均相关 0.496,网间平均相关 -0.033。**
  **差得很干净——这就是「功能连接」的全部依据:一起动的,多半是一伙的。**
  **注意这只是相关,不是因果。两块脑区同时亮,可能是第三块在指挥它们。**

[3] 机器人:知道手要伸到哪,反推关节怎么转

  两根连杆各长 1 米,肩关节角 θ1、肘关节角 θ2,手的位置是:
    x = L1·cosθ1 + L2·cos(θ1+θ2)
    y = L1·sinθ1 + L2·sin(θ1+θ2)

    目标点        解一                  解二                  回代误差
    (1.2, 0.6)    θ1=-21.3° θ2=95.7°    θ1=74.4° θ2=-95.7°    2.48e-16
    (0.0, 1.5)    θ1=48.6° θ2=82.8°     θ1=131.4° θ2=-82.8°   1.11e-16
    (1.9, 0.0)    θ1=-18.2° θ2=36.4°    θ1=18.2° θ2=-36.4°    0.00e+00

  **回代误差都在 1e-16 量级,说明解是对的。**
  **注意每个点都有两组解:肘向上或者肘向下。机器人得挑一个——**
  **挑哪个不是数学问题,是要看会不会撞到桌子。**

  还有一件数学管不了的事:**够不着**。
    目标 (2.5, 0)       两连杆全长 2.0,算出的余弦 2.125 大于 1,无解
  **超出范围时 acos 会报错,所以真实控制器一定要先判可达性。**

[4] 从看到到动手,中间有多少延迟

  一条「机械臂接住滚来的球」的控制回路,各环节的典型耗时:

    环节                  耗时
    相机曝光与读出        8.0 毫秒
    图像传输              3.0 毫秒
    目标检测推理          12.0 毫秒
    轨迹规划              4.0 毫秒
    下发指令              1.0 毫秒
    伺服响应              6.0 毫秒
    合计                  34.0 毫秒

  球以每秒 2 米滚过来,34 毫秒里它走了 7 厘米。

  **这个距离必须提前补偿——不能瞄准「现在看到的位置」,要瞄准「到时它会在的位置」。**
  **所以机器人控制里,预测和目标检测一样重要,甚至更重要。**

  四段连起来:**脑数据大在「体素乘时间乘人数」**;
  **功能连接靠「一起动」找网络,但相关不等于因果**;
  **逆运动学一般有两组解,挑哪组要看环境,还要先判够不够得着**;
  **而控制回路的每一毫秒,都会变成球多跑的那几厘米。**

第 1 段那两个 40 容易让人以为是写错。 四千万字节正好 40 MB,乘一千正好 40 GB——量级就是这么来的。 第 2 段网内 0.496 和网间 -0.033 的对比,是这一节最漂亮的一个数。 它说明「一起动」这件事在数据上真的看得出来,不是靠人眼挑的。 第 3 段「回代误差 2.48e-16」这句是验算,不是装饰。 解完必须代回正解公式,否则符号错了也看不出来。 第 4 段那个 7 厘米,把「毫秒」翻译成了「距离」。 所有实时系统的设计讨论,最后都要做这个翻译。

30 秒实验

  1. 把第 1 段的时间点从 200 改成 1000,重跑。 单次扫描变成 200 MB、一千人变成 200 GB—— 采样率一提高,存储马上从「能存」变成「要挑着存」。
  2. 把第 2 段的 ROI 从 200 个改成 50 个,重跑。 对数从 19900 掉到 1225——降维的收益是平方级的,这也是划 ROI 这一步省时间的真正原因。
  3. 把第 4 段的球速从每秒 2 米改成每秒 5 米,重跑。 34 毫秒里它走 17 厘米——速度翻一倍多,补偿距离跟着翻一倍多,预测误差的容忍度立刻收紧。

常见误区

  1. 以为「相关就是因果」。两块脑区一起动,可能有第三个源头。 功能连接只说明「同时活跃」,不说明谁指挥谁。
  2. 以为「逆运动学只有一个解」。两连杆就有两组,连杆多了解更多。 工程上要按「离当前姿态最近」「不碰障碍」这些条件去挑。
  3. 以为「算得快就够了」。控制回路里,相机、传输、推理、伺服各占一段, 推理再快,也压不掉那 85 毫秒之外的路程——要动的是整条链路。
  4. 以为「毫秒级的延迟可以忽略」。每秒 2 米的球,34 毫秒就是 7 厘米。 对精密装配来说,7 厘米是致命误差。
自测三问(点开对答案) 1. 为什么脑数据要先划 ROI? —— 因为**五万体素两两算相关是十二亿对,算不完也用不上**。 **划成 200 个区之后只剩 19900 对,而且每一对都有解剖学含义。** **这是拿「空间分辨率」换「算得动、说得清」。** 2. 为什么逆运动学会有两组解? —— 因为**同一个手的位置,肘可以朝上也可以朝下**。 **Demo 三个目标点都解出两组,回代误差都在 1e-16 量级,两组都对。** **挑哪一组要靠环境约束,数学不管这个。** 3. 34 毫秒为什么必须补偿? —— 因为**这段时间里目标已经动了**。**球每秒 2 米,34 毫秒走 7 厘米。** **不补偿就等于永远瞄准「过去的位置」,误差和速度成正比。**

数据、算力、算法都讲完了,最后一节换个问题:新东西到底从哪来。 答案不在某一台机器里,而在「已有的东西怎么重新组合」。 这一节也是全书的收尾。

相关笔记