Transformer学习笔记之Embedding层与Positional encoding

一、前言

最近在学习Transformer框架,在此记录相关学习心得及个人理解,欢迎各位前辈的指正与批评,也欢迎同样在学习transformer的小伙伴一起交流。

该篇学习笔记更注重于对基础概念,理论的理解与推导,可能在后续会发布相关代码编程方面的学习笔记。

在学习Transformer时,向很多优秀的前辈学习到了宝贵的知识,附上链接供感兴趣的小伙伴查阅:

1.深入理解深度学习——注意力机制(Attention Mechanism):位置编码(Positional Encoding)2.史上最小白之Transformer详解
3.Transformer从零详细解读(可能是你见过最通俗易懂的讲解)

二、Embedding层

关于Transformer的结构,相信各位都有所了解,最基础的理解就是Encoder与Decoder的结构,那么如图一所示,在Inputs的位置上还包含了两个重要的结构,即Embedding与Positional encoding。

图1 Transformer结构

首先从Embedding层入手,Embedding层也被称为文本嵌入层。

那么该层有何作用呢?可以设想一下,如何才能让计算机理解我们输入的词或句子呢?

显而易见,就是将输入的词或句子转化成计算机可以识别的语言,在这个环节中很多优秀的前辈应用了One-hot进行了解释。为了更加通俗的理解,或许我们可以认为Embedding层的作用就是将输入的词或句子映射为计算机可以理解的向量,更加通俗的讲就是通过Embedding层将输入的文本转化成计算机能识别的符号。

举个例子:如图2所示,假设我现在要输入“我爱你”三个字进入到计算机内,那么我们首先能想到的就是通过矩阵或向量的形式来进行表达。而Embedding恰好帮助我们去完成这个事情,无需过多纠结它是怎么完成这个任务的,在实际的操作当中,我们只需要关注输入词的数量,以及映射为向量的维度。在该示意图中,我们设置输入词的数量为3,映射后词的向量为4维(当然也可以是更多维度,比如512维。)那么经过Embedding层后,可以发现,“我”被映射成了[0,1,2,3],这里的列也就是我们所说的维度。同理,“爱”和“你”同样被映射成了相应的词向量。至此,我们完成了文本的输入的第一个环节。

图2 Embedding层示意图

三、Positional encoding

完成Embeding后,可能有小伙伴不禁疑惑,就单纯将“我爱你”三个字输入到计算机中,计算机虽然能够识别每一个字,但是无法理解“我爱你”所代表的含义,或者说三个字之间的关系啊。

不错,计算机确实无法理解“我爱你”三个字之间的关系,但是回想之前学过的知识,关于RNN循环神经网络逐个字的输入,循环是否就能很好的解决这个问题了呢。但是在Transformer结构中,并没有设置这样一层。通过对Transformer结构进行观察,不难发现进入Multi-Head Attention时,数据是并行进入的,也就是说同时处理“我”、“爱”、“你”这三个字,这样虽然能大大提升处理速度,但是回归第三节开头的问题,这还是无法让计算机理解其中的关系啊。这时就引出了Positional encoding了,这也就是Pe在Transformer中的作用,即赋予输入文本之间的位置关系。

对于Positional encoding(位置编码)而言,想要更好了理解它,不妨观察一下公式。

先别跳过公式,耐心观察一下,左边的PE是不是代表位置编码;(pos,2i)和(pos,2i+1)看着是不是有些眼熟,它像不像行列式中用来表达特定位置的坐标。不错,pos代表了行,2i和2i+1代表了列,这里的列还要注意一点,就是2i代表偶数列,2i+1代表奇数列。

再来看看右边,都认识sin、cos,那么也就是说在第pos行的第2i列,我采用sin()函数处理一下,在2i+1列,采用cos()函数处理一下不就行了吗。至于为什么要这么处理呢,大家可以回想一下sin与cos函数的函数图像。

那具体是怎么操作的呢,我们依旧用“我爱你”举例:

图3 Positional encoding示意图

如图3所示,假设在计算机中,“我”的位置编码可以表示用(pos,2i)表示为“我”(0,2i):[0 1 2 3],同理”爱“(1,2i): [0 1 2 3]。那么经过位置编码公式,就可以转化为下图所示:

图4 位置编码计算示意图

最终得到“我”的位置编码为[0 1 0 1],同理,将“爱”的pos=2带入,得到爱的位置编码为[0.841 0.54 0.01 0.99]。至此,位置编码环节逐渐接近尾声,最后的操作只需要将每个词的位置编码与先前embedding输出的对应词向量相加就可以了。

四、总结

在Embedding中,我们完成了将输入文本转换为计算机可以识别的词向量任务。为了让计算机理解输入的文本之间存在的关系,我们采用Positional encoding的方式,赋予了词向量的位置关系,为后续计算机高效理解文本提供了坚实的基础。

虽然,Embedding和Positional encoding是Transformer中最基础的内容,但是我觉得将这一部分理解能更有助于进一步理解Transformer框架,文中用了很多自己理解的含义进行表达,难免存在理解错误,希望小伙伴们能够多多指正,也希望能够在大家的指正中快速进步!

                                             

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Transformer模型中,Embedding用于将文本数据转换为向量表示。在Embedding之后,通常还会添加Positional Encoding来捕捉文本中的位置信息。 Embedding的作用是将每个输入的词转换为对应的向量表示。这个过程可以使用nn.Embedding函数来实现,其中的参数max_len表示词表的大小,d_model表示词嵌入的维度。通过将文本数据经过Embedding后,我们可以得到一个三维的数据,其中第一维表示共有几句话,第二维表示每句话有多少个字,第三维数据表示每个字使用多少数据进行表示,即Embedding的词嵌入维度d_model。 在Embedding之后,可以添加Positional Encoding来补充文本中的位置信息。Positional Encoding有两种形式,一种是固定不变的,一种是可以进行训练的。通常,我们可以使用torch.arange(0, max_len)创建一个一维的列表,并通过unsqueeze(1)将列表变成形状为(max_len, 1)的数据,然后再使用unsqueeze(0)将列表形状变为(1, max_len, 1)的数据。然后,我们可以对张量的第二维下标为奇数的部分进行math.sin()函数的变换,对张量的第二维下标为偶数的部分进行math.cos()函数的变换。最后,将得到的Positional Encoding数据与Embedding的输出数据相加即可。如果Positional Encoding数据不需要变换,则直接相加;如果需要进行训练,则使用Variable()方法进行封装后再相加。 综上所述,Transformer模型中的Embedding用于将文本数据转换为向量表示,而Positional Encoding用于添加位置信息。通过将这两结合使用,模型可以更好地理解文本数据中的语义和位置关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Transformer详解之EmbeddingPositional Encoding(面向初学者)](https://blog.csdn.net/qq_41018669/article/details/120341783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值