大白话解析 W1(词向量矩阵)和 W2(输出权重矩阵)
P.S.在之前的文章和中,我们已经频繁的接触到W1和W2,在神经网络的训练代码里,W1 和 W2 这两个矩阵就像模型的 “左膀右臂”—— 少了谁都不行。很多人觉得它们只是一堆数字,其实里面藏着模型对语言的 “理解”。今天咱们就用最接地气的方式,把这两个矩阵讲明白:它们到底是啥、各自干啥用、怎么配合工作,以及训练时是怎么一点点变好的。
P.S.在之前的文章《从零构建Word2Vec:基于CBOW/Skip-gram的双模型实现与核心优化技术详解》和《从“刷题提分“到模型训练:用学生刷题逻辑拆解Word2Vec训练代码》中,我们已经频繁的接触到W1和W2,在神经网络的训练代码里,W1 和 W2 这两个矩阵就像模型的 “左膀右臂”—— 少了谁都不行。很多人觉得它们只是一堆数字,其实里面藏着模型对语言的 “理解”。今天咱们就用最接地气的方式,把这两个矩阵讲明白:它们到底是啥、各自干啥用、怎么配合工作,以及训练时是怎么一点点变好的。
先给 W1 和 W2 一个 “身份定位”
咱们先抛开代码,用一个生活场景给它们俩 “定岗”。假设你是一个刚学英语的学生,老师让你做 “词语搭配” 练习(比如 “the” 后面通常接什么词)。为了做好这题,你需要两样东西:
- 笔记本:记录每个词的 “含义笔记”(比如 “the” 是 “特指某个事物的冠词”);
- 搭配表:记录词与词之间的 “搭配强度”(比如 “the” 和 “quick” 搭配的概率高,和 “run” 搭配的概率低)。
在模型里,W1 就相当于这个 “笔记本”,W2 相当于这个 “搭配表”:
- W1(词向量矩阵):记录每个词的 “含义向量”,告诉模型 “这个词是什么意思”;
- W2(输出权重矩阵):记录词与词之间的 “关联强度”,告诉模型 “这个词后面可能接什么词”。
举个具体例子:假设词汇表有 9 个词(编号 0-8),词向量维度是 3,那么:
- W1 是一个 9 行 3 列的矩阵(9 个词,每个词 3 个数字);
- W2 是一个 3 行 9 列的矩阵(3 个维度,对应 9 个词的关联强度)。
W1:词向量矩阵,模型的 “词语笔记本”
W1 的全称是 “输入权重矩阵”,但更准确地说,它是 “词向量矩阵”—— 因为每个词的向量就藏在 W1 的行里。
W1 的样子:每行都是一个词的 “身份证”
假设词汇表里有 “the”(0)、“quick”(2)、“brown”(3)这几个词,W1 可能长这样:
W1 = [
[0.0021, -0.0035, 0.0012], # 行0:“the”的向量
[0.0018, 0.0022, -0.0005], # 行1:其他词的向量
[0.0030, -0.0011, 0.0025], # 行2:“quick”的向量
[-0.0008, 0.0042, 0.0017], # 行3:“brown”的向量
... # 其他词的向量
]
每一行对应一个词的向量,比如第 0 行就是 “the” 的向量,第 2 行是 “quick” 的向量。这些数字看起来杂乱无章,但实际上:
- 数字的 “大小” 代表这个词在某个维度上的 “强度”(比如第 0 行第一个数字 0.0021,可能代表 “冠词属性” 的强度);
- 数字的 “正负” 代表方向(比如正数可能是 “肯定”,负数是 “否定”)。
W1 的作用:给每个词 “贴标签”
W1 的核心作用是给每个词 “贴标签”,让模型知道 “这个词是什么”。比如:
- “the” 的向量可能在 “冠词维度” 得分高,说明它是冠词;
- “quick” 的向量可能在 “形容词维度” 得分高,说明它是形容词;
- “run” 的向量可能在 “动词维度” 得分高,说明它是动词。
这些标签不是人工贴的,而是模型从数据里学出来的。就像学生记笔记:一开始不知道 “the” 是什么,记多了就发现 “它经常出现在名词前,应该是冠词”。
怎么从 W1 里拿词向量?直接 “查表”
在代码的 forward 方法里,拿一个词的向量特别简单:直接取 W1 对应的行。比如要拿 “the”(编号 0)的向量,就是:
h = self.W1[target_idx] # target_idx=0 → h = [0.0021, -0.0035, 0.0012]
这就像学生查笔记本:翻到 “the” 那一页,就能看到它的含义笔记。这个 h(词向量)会被传到下一步,和 W2 一起计算预测结果。
W2:输出权重矩阵,模型的 “词语搭配表”
W2 的全称是 “输出权重矩阵”,它记录的是 “词向量” 和 “目标词” 之间的关联。如果说 W1 是 “词的含义”,那 W2 就是 “词与词怎么搭”。
W2 的样子:列代表 “关联强度”
还是用上面的例子,W2 可能长这样(3 行 9 列):
W2 = [
[0.0015, 0.0008, 0.0022, 0.0019, ...], # 行0:维度0与各词的关联
[-0.0011, 0.0014, -0.0007, 0.0025, ...], # 行1:维度1与各词的关联
[0.0009, -0.0012, 0.0018, 0.0005, ...] # 行2:维度2与各词的关联
]
W2 的每一列对应一个词,比如第 2 列对应 “quick”,第 3 列对应 “brown”。这些数字代表 “词向量的某个维度” 和 “目标词” 的关联强度:
- 数字越大,说明这个维度和目标词的关系越近;
- 数字越小(或负数),说明关系越远。
比如 W2 第 0 行第 2 列是 0.0022(正数且较大),可能代表 “冠词维度” 和 “quick” 的关联很强(因为 “the” 后面常接形容词 “quick”)。
W2 的作用:计算 “搭配分数”
W2 的核心作用是:用 W1 的词向量 h,计算每个词作为 “上下文词” 的分数。具体做法是 “矩阵乘法”:
u = np.dot(h, self.W2) # h是1×3,W2是3×9 → u是1×9的分数向量
比如 h 是 “the” 的向量 [0.0021, -0.0035, 0.0012],乘以 W2 后得到 u:
u = [0.0011, 0.0010, 0.0013, 0.0012, ...]
u 里的每个数字是 “the” 和对应词的 “搭配分数”,分数越高,说明这两个词越可能在一起出现。比如 u [2](“the” 和 “quick” 的分数)是 0.0013,比其他词高,说明它们经常搭配。
从分数到概率:softmax 的作用
光有分数还不够,模型需要把分数转换成 “概率”(y_pred),这时候就需要 softmax 函数:
y_pred = softmax(u) # 把u转换成0-1之间的概率,总和为1
比如 u 经过 softmax 后,y_pred 可能是 [0.112, 0.111, 0.113, 0.112, ...],意思是 “the” 的上下文是 “quick” 的概率是 11.3%,是 “brown” 的概率是 11.2%。
W1 和 W2 的配合:就像 “查笔记→查搭配”
W1 和 W2 不是孤立的,它们在 forward 方法里紧密配合,完成从 “输入词” 到 “预测上下文” 的过程。整个流程就像:
- 学生看到 “the”(输入词);
- 查笔记本(W1),找到 “the” 的含义笔记(h);
- 查搭配表(W2),根据笔记内容,算出 “the” 后面可能接每个词的分数(u);
- 把分数转换成概率(y_pred),得出 “最可能接 quick(11.3%)” 的结论。
用公式总结就是:y_pred = softmax( W1[target_idx] · W2 )。这一步就是前向传播的核心,而 W1 和 W2 就是这个过程的两个关键 “工具”。
训练时 W1 和 W2 怎么变?从 “瞎写” 到 “精准”
刚开始训练时,W1 和 W2 里的数字都是随机的(就像学生刚买的空白笔记本和乱填的搭配表)。随着训练进行,它们会根据 “错误” 不断调整,变得越来越准。
举个训练过程的例子
假设模型刚开始时,W1 和 W2 都是随机的:
- “the” 的向量 h 是 [0.0021, -0.0035, 0.0012](随机值);
- W2 里 “quick” 对应的列是 [0.0022, -0.0007, 0.0018](随机值)。
第一次做 “the 后面接什么” 的题时:
- 算出来的 y_pred 里,“quick” 的概率只有 11.3%(很低);
- 老师说正确答案是 “quick”,模型知道自己错了(损失 = 2.18);
- 分析错误:对 “quick” 的打分太低,需要提高它的分数;
- 调整 W1 和 W2:
- 改 W1:让 “the” 的向量 h 更 “适合” 搭配 “quick”(比如微调 h 的三个数字);
- 改 W2:让 “quick” 对应的列与 h 的关联更强(比如把 W2 里的数字调大一点)。
经过几轮训练后:
- “the” 的向量 h 变成 [0.0030, -0.0028, 0.0015](更符合冠词的特点);
- W2 里 “quick” 的列变成 [0.0035, -0.0005, 0.0022](与 h 的关联更强);
- 再算 y_pred 时,“quick” 的概率提高到 80%(很准)。
这个过程就像学生不断修改笔记和搭配表:第一次记混了,改几次后就越来越准。
W1 和 W2 的 “专属分工”:各司其职不越界
虽然 W1 和 W2 都在调整,但它们的调整方向不一样,各有各的 “职责范围”:
W1:专注 “词的本质”
W1 的调整是为了让每个词的向量更 “贴合它的含义”。比如:
- “the”“a” 都是冠词,它们的向量会越来越像;
- “quick”“fast” 都是形容词,它们的向量会越来越像;
- “the” 和 “run”(动词)的向量会越来越不像。
这就像学生的笔记越来越精准:“the” 和 “a” 都被归为 “冠词”,“quick” 和 “fast” 都被归为 “速度快的形容词”。
W2:专注 “词的搭配”
W2 的调整是为了让 “搭配分数” 更准。比如:
- “the” 后面常接形容词(quick)和名词(fox),W2 会让这些词的分数变高;
- “the” 后面很少接动词(run),W2 会让这些词的分数变低。
这就像学生的搭配表越来越实用:“the” 后面明确标注 “优先接形容词和名词”。
为什么 W1 是 9×3,W2 是 3×9?维度的奥秘
细心的人会发现,W1 的列数(3)正好等于 W2 的行数(3)。这个 “3” 就是词向量的维度,也是 W1 和 W2 能 “配合工作” 的关键。
维度是 “沟通的语言”
可以把维度理解成 “沟通的语言”。W1 用 3 个维度描述词的含义,W2 也用这 3 个维度描述词的关联,这样两者才能 “对话”(矩阵乘法要求前一个矩阵的列数等于后一个矩阵的行数)。
比如维度 1 可能代表 “词性”(冠词、形容词、动词),维度 2 代表 “情感”(积极、消极),维度 3 代表 “场景”(动物、食物)。W1 用这 3 个维度描述词,W2 也用这 3 个维度计算关联,自然能算出准确的搭配分数。
维度不是越多越好
维度太少(比如 1 维),词向量表达的信息不够,模型学不会复杂关系;维度太多(比如 1000 维),计算量太大,模型训练慢,还可能 “记混”。常用的维度是 100-300 维,既能表达足够信息,又不会太复杂。
这就像学生记笔记:只记 1 个要点(维度 1)太简单,记 1000 个要点(维度 1000)太繁琐,记 300 个要点刚刚好。
常见问题:W1 和 W2 的区别与联系
-
为什么 W1 是行代表词,W2 是列代表词?
因为矩阵乘法的要求:W1 [target_idx] 是 1×3 的行向量,乘以 W2(3×9)后得到 1×9 的行向量 u,正好对应 9 个词的分数。如果 W2 的行代表词,乘法就没法做了。这是数学上的 “设计选择”,保证计算能顺利进行。 -
训练结束后,W1 和 W2 哪个更重要?
通常 W1 更受关注,因为它直接给出 “词向量”,可以用来做很多其他任务(比如找近义词、计算词的相似度)。W2 更多是训练过程中的 “辅助工具”,训练结束后可能就不用了。
就像学生毕业后,笔记本(W1)还能用来复习,搭配表(W2)可能就扔了。 -
换一批训练数据,W1 和 W2 会变吗?
会!比如用科技文章训练,“apple” 的向量会偏向 “水果”;用电子产品文章训练,“apple” 的向量会偏向 “手机品牌”。W1 和 W2 是 “数据驱动” 的,数据变了,它们记录的 “理解” 也会变。
这就像学生换了一本教材,笔记和搭配表也会跟着改。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)