用js表述注意力机制
// 注意力计算函数
function attention(query, keys, values) {
// 1. 计算相似度分数(点积)
const scores = keys.map(key =>
query.reduce((sum, q, i) => sum + q * key[i], 0)
);
// 2. 使用Softmax归一化
const maxScore = Math.max(...scores);
const expScores = scores.map(s => Math.exp(s - maxScore)); // 数值稳定性处理
const sumExp = expScores.reduce((a, b) => a + b, 0);
const attentionWeights = expScores.map(s => s / sumExp);
// 3. 加权求和得到最终输出
return values.reduce(
(output, value, i) =>
value.map((v, j) => v * attentionWeights[i] + (output[j] || 0)),
[]
);
}
// 示例使用
const query = [1, 0.5, 0.2]; // 查询向量
const keys = [ // 键向量集合
[0.8, 0.2, 0.1],
[0.5, 1.0, 0.3],
[0.2, 0.6, 1.2]
];
const values = [ // 值向量集合
[1.0, 2.0],
[1.5, 0.5],
[0.5, 1.5]
];
const result = attention(query, keys, values);
console.log("Attention Output:", result); // 输出加权后的结果向量
在这里,我们不清楚keys和values是怎么产生的,因为这涉及到各种行业,比如说翻译方面那就涉及到语言到语言的数据特征,比如说中文的“我” -> 英文的“me”这个对应的向量抽象出来的一个数据化的向量,但是现实中中文的我可能对应对多个英文:[me, I]这个需要结合上下文的语境,比较复杂,但 基本的注意力机制就是上面的代码所描述的最终输出的是一组加权后的结果。这里也可以参考一下这个文章看具体的。
代码关键点解释:
-
相似度计算:通过点积计算查询向量与每个键向量的相似度
-
这里使用最简单的点积计算,实际可能需要缩放(如Transformer的缩放点积注意力)
-
其他相似度计算方式也可替换为余弦相似度等
-
-
Softmax归一化:
-
减去最大值处理提升数值稳定性
-
将分数转换为概率分布
-
-
加权求和:
-
使用注意力权重对值向量进行加权求和
-
输出维度与值向量维度一致
-
推荐使用深度学习库(如TensorFlow.js),但核心原理可以通过上述基础代码理解。