0.1 怎么让胸片和报告可以比较
手上有四张胸片和四份报告,其中每一份报告描述的都是其中一张胸片。任务是让机器判断哪份报告属于哪张胸片。人靠读图与读文字完成这件事,然而我们需要解决一个更基础的问题1:如何能让机器看懂“图像”和“报告”
0.1.1 编码器与空间
简单的讲,机器只能处理数字(说的更底层一点是二进制),但是感谢大量图灵派或者冯诺依曼派程序员前辈的努力,通过numpy等包,我们已经能像开车不用了解发动机各个缸的冲程一样操作计算机让它处理向量、数组等更高级、更贴近人类能处理的信息的内容,这个过程在计算机领域被称为“封装”或者“抽象”;编码器承担更上一层的内容:编码器可以将图像、自然语言等内容编码为概率、向量、数组等计算机能处理的语言
在这里有一个小小的解释:例如即使图片本身就是一个224×224×3像素的数组,但是大多数模型都只能处理向量,编码器是把它处理成一个768维的向量;文本经过 tokenizer 变成 tokens ID ,再经过文本编码器,的带每个 tokens 或者争端文字的向量表示;我们可以抽象的把这个流程总结为:
现实世界的信息-数值化数据-编码器-表征(representation/embadding)
ConVIRT 用两条平行的通路处理这个问题(如何将图片和报告投影入同一个向量空间)。胸片经过图像编码器得到图像表示,报告经过文本编码器得到文本表示,两者各自再经过一个投影函数,落进同一个
其中
图像与文字本身无法直接比较,两个同维向量可以。落到同一个空间之后,谁离谁近就有了可计算的答案。
0.1.2 向量是一组坐标
本章中,可以暂时把向量理解为
矩阵是与本章更贴近的对象。四张胸片的向量按行堆起来是
拷打 AI 第一原则
每看到一个公式,先问每个量的维度是多少。大量 AI 生成的错误推导,做一次维度检查就会暴露。
0.1.3 内积、范数与余弦相似度
两个同维向量
范数(norm)
这是余弦相似度(cosine similarity),看这个大家可能会想起高中数学有一道经典例题叫做求两个向量所成的角,实际上大家把这个理解成在高维的那个就可以,连计算都是一样的(内积就是逐个方向相乘并相加),更准确地说这个玩意就是高中那道经典题推广到高维的计算方式,取值在
我们假设 v 是某张图片的对应向量,而 u 是某份报告的对应向量,计算余弦相似的的过程实际上就是判断“它们在 representation space 中是否指向相似的语义方向”,这个过程也就是通过联合计算来比较胸片和报告,以上就是所有概念内容,0.1.4讲的就是数学内容了
0.1.4 如何联合计算
把
形状是
有一点容易被忽略:
代码验证
四张胸片与四份报告经过编码器与投影后的向量如下。维度从
import numpy as np
np.set_printoptions(precision=3, suppress=True)
V = np.array([
[0.886, 0.000, 0.000, 0.394, 0.000, 0.000, 0.000, 0.246],
[0.000, 0.886, 0.000, 0.000, 0.394, 0.000, 0.000, 0.246],
[0.000, 0.000, 0.886, 0.000, 0.000, 0.394, 0.000, 0.246],
[0.000, 0.000, 0.886, 0.000, 0.000, 0.000, 0.394, 0.246],
])
U = np.array([
[0.886, 0.000, 0.000, 0.394, 0.000, 0.000, 0.000, -0.246],
[0.000, 0.886, 0.000, 0.000, 0.394, 0.000, 0.000, -0.246],
[0.000, 0.000, 0.886, 0.000, 0.000, 0.394, 0.000, -0.246],
[0.000, 0.000, 0.886, 0.000, 0.000, 0.000, 0.394, -0.246],
])
def normalize(a):
return a / np.linalg.norm(a, axis=1, keepdims=True)
S = normalize(V) @ normalize(U).T
print(S)输出:
[[ 0.879 -0.06 -0.06 -0.06 ]
[-0.06 0.879 -0.06 -0.06 ]
[-0.06 -0.06 0.879 0.724]
[-0.06 -0.06 0.724 0.879]]对角线是
练习题
- 若
、 , 与 的形状分别是多少? 的形状是多少? 一共有多少个元素? - 两个非零向量的余弦相似度等于
,说明什么? - 为什么不先归一化就直接做
会出问题?
拷打 AI
把 ConVIRT 的
与 的维度分别是多少? 及格标准:都是 维,落在同一空间;能指出这是投影函数 的作用。 - 图像编码器与文本编码器是否共享权重? 及格标准:不共享。ConVIRT 用 ResNet50 与 BERT 两套独立权重。CLIP 同样使用独立的 image encoder 与 text encoder,各自投影到共同空间。若回答共享权重,即为错误。
- 一个批次有
对图文, 的形状是多少? 及格标准: 。若回答 ,追问哪里做了相似度计算。
参考答案
与 都是 , 是 ,共 个元素。 - 两向量正交,方向之间没有相关性。
- 未归一化时内积的大小同时受方向和长度影响,长度大的向量会系统地得到更大的相似度,比较失去意义。归一化把长度这一因素去掉。
暂时不需要掌握
以下内容留给完整章节,不影响阅读应用论文。
- 向量空间的公理化定义、基与维数、四大子空间,见 1.4 向量空间与四大子空间
- 内积的抽象定义与范数的等价性,见 1.5 正交性与投影
- 矩阵分解与低秩近似,包括 SVD 与 PCA,见 1.7 奇异值分解
常见错误
错误 1 · 把向量理解成物理箭头
原因:中学与大学物理里向量总带方向,到了高维特征空间不再成立。 解决:本章把向量当作
错误 2 · 忘记归一化
原因:直接把
错误 3 · 把
原因:机器学习里习惯称之为 linear layer,但在数学上带偏置项的映射是仿射变换,不满足线性映射要求过原点的条件。 解决:讨论数学性质时按仿射变换处理,读代码与论文时按机器学习惯例理解。
错误 4 · 认为
原因:把