这期我们将讲一讲Transformer里面的 positional encoding位置编码

视频讲解在这个地方,建议看视频,讲得清楚一些
写代码彻底搞懂大语言模型transformer-- 位置编码 Positional encoding
在前几期里面我们讲了transformer模型里面两个重要的观点分别是embedding和attention mechanism注意力机制;我们来简单回顾一下,embedding将词转换成由语义的向量,注意力机制则利用这些机制,找到了在上下文中embedding的相关程度,并引入了可训练的权重,是的transformer模型有了很好的上下文处理能力。
回到位置编码。在一个句子中一个词的位置隐含着重要的信息:比如我是你哥哥,你是我哥哥;这两个句子中词位置不同造成的意义完全不一样

那如果位置编码我能想到最简单的位置编码就是它的索引号,问题在于如果这个句子太大,这个索引编号就会越来越大,而且它输入不一样它的长度就不一样放到模型里面不好处理;
于是引入了另外一种位置编码的方式,让不同位置他都输出固定长度的向量
他的公式是这样子的我们来看一下

具体定义如下:
L:这个句子的长度,也就是token的数量
k:是这个句子中第k个词
d:输出向量的维数
i:列的索引,0<=i<d/2;比如输出向量是100位的,那么i就是一个从0~49的数字,
n:用户自定义的一个数字,在 Attention is all you need 这个论文里面这个 数是10000,也可以定义成其他的值
P(k, x): 一个函数用于计算对于句子中第k个词,输出向量的x个值是多少
P(k, 2i): 句子中第k个词,输出向量的第2i个值
P(k, 2i+1): 句子中第k个词,输出向量的第2i+1个值
图示如下:

我们可以用JavaScript来实现位置编码,我给大家准备了一个在线编码的网站,大家可以直接在上面进行人工智能编程,地址如下:
https://chn.ai/plotly.html
我把这次用到的代码放到了gitee上,供参考:
https://gitee.com/fribble01/js-machine-learning/blob/master/posEncoding/example01.js
function posEnc(seqLen, d, n=10000) {
let pe = Array.from({
length: seqLen }, () => Array(d).fill(0))
for(var k = 0; k < seqLen; k++) {
for(var i = 0; i < Math.floor(d/2); i++) {
var denominator = Math.pow

本文详细介绍了Transformer中的位置编码Positional Encoding,解释了为何需要位置编码以及其数学公式。通过在线编程实践,展示了如何用JavaScript实现位置编码,并提供了相关代码示例。位置编码与词嵌入向量相加,为模型提供句子中词的位置信息。
576

被折叠的 条评论
为什么被折叠?



