【AI】八.人工智能和高等数学核心基础扫盲 小滴课堂讲师 2025年09月18日 ai大模型, aigc 预计阅读 26 分钟 #### AI大模型必备之向量-张量和应用场景 ##### 什么是向量 * 向量就是一串有序的数字,像一条带方向的“箭头”, 在机器学习里面尤其重要 * 世间万物使用计算机表示,用的数字化语言,让计算机能理解复杂事物, 每个数据都包含多种属性 * 比如气象数据(包含温度,湿度,风向等等) * 金融数据(开盘价,收盘价,交易量等等) * 销售数据(价格,库存量,卖出数量等等) * 为了表示多属性的数据,或者称为多维度的数据,向量最为合适。 * 向量就是有几个数字横向或者纵向排列而成,每个数字代表一个属性。 ```python // 传统Java数据存储 String[] names = {"小明", "身高", "体重"}; Object[] person = {"张三", 175, 68.5}; // 向量化表示(特征向量) float[] vector = {0.83f, 175.0f, 68.5f}; // [性别编码, 身高, 体重] # Python列表表示 vector = [1.2, 3.5, 4.0, 0.8] ``` * 向量能做什么? * 计算相似度:比如比较两个人的喜好是否接近、物品是否类似 * 用户画像:`[年龄=25, 身高=175, 消费=5000]` → 用数字描述一个人 * 案例:有两个水果的向量(也可以抽取更多属性) - 苹果:[红色: 0.91, 甜度: 0.83, 圆形: 0.79] - 草莓:[红色: 0.85, 甜度: 0.75, 圆形: 0.69] ##### 多维向量 * 就是维度更多的向量(比如100个数字组成的列表)。 * 例子: - 词向量:`“猫” = [0.2, -0.3, 0.7, ..., 0.1]`(300个数字表示词义,抽取多点属性,形状、毛发、行为、食物...)。 - 图片特征:一张猫的图片转换为 `[0.8, 0.1, 0.05, ...]`(1000个数字描述图片内容) - 高维向量表示用户画像 ```python public class UserVector { // 每个维度代表一个特征 float[] features = new float[256]; // 可能包含: // [0-49]: 兴趣标签权重 // [50-99]: 行为频率 // [100-255]: 深度模型提取特征 } ``` * 为什么维度越多越好? - 细节更丰富 , 就像简历写得越详细,越能区分不同的人。 - 低维:`[年龄=25, 性别=1]` → 只能简单分类。 - 高维:`[年龄、性别、职业、兴趣1、兴趣2...]` → 精准推荐商品。 * 多维向量应用场景 - 推荐系统:用用户向量和商品向量计算匹配度。 - 人脸识别:把照片变成向量,对比找到最相似的人。 - 数据表示:用户画像(年龄、性别、兴趣等N个特征) - 几何计算:三维游戏中物体的位置和移动 * 通俗理解高维空间 - 假设你在三维空间找不到两片不同的树叶,但在100维空间里,每片树叶的位置都会独一无二 ##### 张量 * 张量是多维数组的统称,涵盖标量、向量、矩阵及更高维结构 , * 阶(Rank)表示维度数: * **标量(0阶张量)**:单个数字(如温度25℃)。 * **向量(1阶张量)**:一维数组(如 `[1, 2, 3]`)。 * **矩阵(2阶张量)**:二维表格(如Excel表格)。 * **高阶张量**:三维及以上(如视频数据:时间×宽×高×颜色通道) | 阶数 | 数学名称 | 典型应用 | Java存储结构 | | :--: | :------: | :-------: | :----------: | | 0 | 标量 | 温度值 | float | | 1 | 向量 | 用户画像 | float[] | | 2 | 矩阵 | Excel表格 | float[][] | | 3 | 张量 | 彩色图片 | float[][][] | | **数据** | **张量形状** | **解释** | | :----------: | :------------------: | :-------------------------: | | 一张黑白图片 | `(28, 28)` | 28行×28列的像素矩阵 | | 一个视频片段 | `(100, 128, 128, 3)` | 100帧,每帧128x128的RGB图片 | | 一批用户数据 | `(500, 10)` | 500个用户,每人10个特征 | ##### 常见问题 * 为什么要用张量而不是数组? - 张量是AI框架(如PyTorch)的“通用语言”,能自动支持GPU加速和梯度计算。 * 维度太多会不会算不过来? - 会!所以需要GPU和优化算法(比如深度学习)。 * 我该用几维向量 * 看任务需求:简单任务用几十维,复杂任务(如ChatGPT)可能用上千维! > 总结: > > * 向量 → 一串数字(像GPS坐标)。 > * 多维向量 → 更长的数字串(像详细简历)。 > * 张量 → 数字的“集装箱”(像Excel表格、图片集、视频流)。 #### 高等数学里面的求和-点积公式讲解 ##### 什么是求和符号 * 求和符号Σ(希腊字母sigma)表示**连续加法运算**,用于简化多个数的累加书写。 * 英文意思为Sum,Summation,汉语意思为“和”“总和”。 * 基本形式  * **单变量求和示例** * 计算1到5的整数和: * 计算前3个偶数的平方和: ##### 点积(内积)的定义与计算 * 点积是什么 * 点积是**两个向量对应分量相乘后求和**的运算,结果是一个标量(数值)。  * 几何意义 * 点积反映两个向量的夹角关系 * 通过在空间中引入笛卡尔坐标系,向量之间的点积既可以由向量坐标的代数运算得出  * 点积计算示例 #### 向量的相似度计算之余弦相似度 ##### 补充:三角函数 * **正弦(sinθ)**:对边长度与斜边长度的比值。 * **余弦(cosθ)**:邻边长度与斜边长度的比值(即夹角的两边) ##### 为啥要学余弦相似度 * 生活中的相似度问题,假设你需要完成以下任务: * 网购时:找出和你刚买的衣服最搭配的裤子 * 听歌时:发现与当前播放歌曲风格相似的曲目 * 点外卖时:找到和你常点菜品口味接近的新店铺 * **LLM大模型的RAG原理:用户输入自然语言query,找到最相关的文档** * 这些场景的共同点:需要量化两个事物的相似程度,向量空间中的"方向感" ##### 什么是余弦相似度 * 基础定义:余弦相似度(Cosine Similarity)用于衡量两个向量在方向上的相似程度,忽略其绝对长度 * **值的范围为[-1,1],-1为完全不相似,1为完全相似。** * 公式(向量的模长等于其各分量平方和的平方根)  * **直观理解** - 几何意义:两个向量的夹角越小,方向越一致,余弦值越接近1。 - 1 → 完全相同方向 - 0 → 完全无关(正交) - -1 → 完全相反方向 - 两条线段之间形成一个夹角, - 如果夹角为0度,意味着方向相同、线段重合,这是表示两个向量代表的文本完全相等; - 如果夹角为90度,意味着形成直角,方向完全不相似; - 如果夹角为180度,意味着方向正好相反。 - **因此可以通过夹角的大小,来判断向量的相似程度,夹角越小,就代表越相似。** * **为何选择余弦相似度?** - **高维数据友好**:适用于文本、图像等高维稀疏数据。 - **长度不变性**:只关注方向,忽略向量长度差异(如文档长短)。 - **计算高效**:适合大规模向量检索 ##### 案例 * 以二维向量为例:向量A = [3, 4],向量B = [1, 2] * 结论:两个向量方向高度相似! ##### 大模型中的核心应用场景 * 语义搜索(Semantic Search) * 问题:用户输入自然语言query,找到最相关的文档。 * 实现步骤: * 将query和所有文档编码为向量。 * 计算query向量与文档向量的余弦相似度。 * 返回Top-K相似度最高的文档。 * 推荐系统(User-Item Matching) * 原理:用户向量和物品向量的余弦相似度 → 推荐得分。 * 示例: * 用户向量:[0.3, 0.5, -0.2](表示对科技、体育、艺术的兴趣) * 物品向量:[0.4, 0.1, 0.0](科技类文章) * 相似度 ≈ 0.3×0.4 + 0.5×0.1 = 0.17 → 推荐该文章。 * 为什么重要:掌握余弦相似度,就是掌握了**连接数据与智能的钥匙**!  #### 科学计算核心库NumPy和推荐系统案例 ##### 什么是 NumPy * NumPy(Numerical Python)是 Python 的科学计算核心库,专门处理多维数组(矩阵)的高效运算。 * 核心功能:提供高性能的数组对象 ndarray,支持向量化操作(无需循环直接计算)。 * 江湖地位:几乎所有 Python 科学计算库(如 Pandas、SciPy、TensorFlow)都依赖 NumPy。 * 设计目标:用简洁的语法替代传统循环,提升大规模数据计算效率。 ##### 为什么需要 NumPy?对比原生 Python * 原生 Python 列表的痛点 ```python # 计算两个列表元素相加 a = [1, 2, 3] b = [4, 5, 6] result = [a[i] + b[i] for i in range(len(a))] # 需要循环逐个计算 ``` * NumPy 的解决方案 ```python import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) result = a + b # 直接向量化运算 → 输出 [5,7,9] ``` * 性能对比(关键优势) | 操作类型 | Python 列表耗时 | NumPy 耗时 | 速度提升倍数 | | :------------ | :--------------- | :--------- | :----------- | | 100万元素求和 | 15 ms | 0.5 ms | **30倍** | | 矩阵乘法 | 手动循环实现复杂 | 单行代码 | **100倍+** | ##### 基础安装 ```python # 常规安装 pip install numpy # 验证安装, 应输出版本号 python -c "import numpy as np; print(np.__version__)" # 升级版本 pip install numpy --upgrade ``` ##### 余弦相似度案例实战 * 案例1:基础向量计算 ```python import numpy as np def cos_sim(v1, v2): """ 计算两个向量的余弦相似度 余弦相似度用于衡量两个向量方向的相似性,结果范围从-1到1 -1表示完全相反,1表示完全相同,0表示两者正交(即无相似性) 参数: v1: numpy数组,第一个向量 v2: numpy数组,第二个向量 返回: 两个向量的余弦相似度 """ # 计算向量点积 dot = np.dot(v1, v2) # 计算向量的模的乘积 norm = np.linalg.norm(v1) * np.linalg.norm(v2) # 返回余弦相似度 return dot / norm # 测试向量(支持任意维度) vec_a = np.array([0.2, 0.5, 0.8]) # 文本A的嵌入向量 vec_b = np.array([0.3, 0.6, 0.7]) # 文本B的嵌入向量 # 输出两向量的余弦相似度 print(f"相似度:{cos_sim(vec_a, vec_b):.4f}") # 输出:0.9943 ``` * 案例2:推荐系统 ```python import numpy as np def cosine_similarity(a, b): # 将列表转换为NumPy数组 a = np.array(a) b = np.array(b) # 计算点积 dot_product = np.dot(a, b) # 计算模长 norm_a = np.linalg.norm(a) norm_b = np.linalg.norm(b) # 计算余弦相似度 return dot_product / (norm_a * norm_b) if norm_a * norm_b != 0 else 0 # 用户嵌入向量(根据浏览行为生成) user_embedding = [0.7, -0.2, 0.5, 0.1] # 商品嵌入库 products = { "item1": [0.6, -0.3, 0.5, 0.2], "item2": [0.8, 0.1, 0.4, -0.1], "item3": [-0.5, 0.7, 0.2, 0.3] } # 计算相似度并推荐 recommendations = [] for item_id, vec in products.items(): sim = cosine_similarity(user_embedding, vec) recommendations.append((item_id, round(sim, 3))) # 保留3位小数 # 按相似度降序排序 recommendations.sort(key=lambda x: x[1], reverse=True) print("推荐排序:", recommendations) ```
评论区