transforme框架

目录

摘要

transforme简介

如何做Seq2seq

1、Encoder

2、Decoder

3、Encoder和Decoder二者如何传递资讯

总结


摘要

本次对transforme展开学习,对于Encoder和Decoder作为本次学习的重点,旨在理解transforme框架的工作原理。

transforme简介

transforme其实是一种sequence-to-sequence model。

常用于:

语音辨识:输入语音信号,输出语音对应文字。(长度由model所决定)

机器翻译:读一个语言,输出另一种语言。(长度仍然由model所决定)

语音翻译:输入语言信号,输出这段语言对应的中文。

语言合成:输入文字,输出语音信号。

文字运用:训练一个聊天机器人。

除此之外在NLP上有着许多运用, 一个sequence-to-sequence model用于多种途径。

 通过sequence-to-sequence model还能解决许多其它问题,比如文法剖析,这属于硬解方法。

Seq2seq for Multi-label Classification:同个东西可以属于多个类别。 输入一个文本文件,输出这个文件属于哪些类别的。

如何做Seq2seq

sequence-to-sequence model里面会分成两块,Encoder和Decoder。

将输入数据传进Encoder,Decoder决定输出的结果。

1、Encoder

给一排向量,输出另外一排向量,二者长度相同。  

Encoder里有很多Block,每个Block都是接收一排向量,输出一排向量。

输入的信号首先通过一个输入嵌入成,即将信号转变为向量的形式。由于这些信号没有位置信息,则在后面加上位置编码,添加位置信息。之后通过multi-head attention层,再将上一步的输出加入一个残差再进行一个layer normalization,通过MLP层后,仍然将上一步输出加入残差在进行layer normalization。这就是完整的block工作流程,最后输出的就是一个block工作后输出的向量,这个block会重复N次。

2、Decoder

Decoder有两种,这里以语音辨识(输入一段语音。输出相应的文字)作为例子来进行分析。

Decoder-Autoregressive(AT)

在Encoder输出完后就轮到Decoder产生语音辨识的结果。在对Decoder的输入中前面加上一个BEGIN符号(一维是1,其它维是0),首先会经过softmax得出一个向量,向量会给distribution中每一个中文分数,分数最高的文字就是输出。之后将得到的输入当作Decoder的输入,再次得到一个新向量,之后得出新的输出。往复循环,直至完成。

特点:将输出当作自己新的输入,同样当某个输入是错误的,则会导致全部出错,一步错,步步错。

  

Encoder和Decoder的结构图相比,当将Decoder中间那块盖住,二者是相差不大的。只是最后在输出时加了个softmax将其变为概率。

在原来的self-attention和Masked Self-attention相比。当产生b1时只考虑a1,产生b2时只考虑a1和b1,即只考虑左边的,不考虑右边的。对Encoder而言,a1到a4是一下就产生的,而对于Decoder而言a1到a4是逐个产生的。

加Masled的原因:说明Decoder输出的是一个个产生的。

Decoder是自己决定输出sequence的长度,在Decoder中得加入一个特殊的符号END,用作停止运作的标准,防止无限循环下去。

 Decoder-Non-Autoregressive(NAT)

不是一次产生一个字,而是一次产生一排字,在速度上跑得比AT快,比较可以控制输出的长度。

3、Encoder和Decoder二者如何传递资讯

cross attention连接Encoder和Decoder。从左边两个箭头,Decoder可以得到Encoder的输出。

cross attention的运作过程如下图所示。将Decoder输出的向量乘以一个矩阵,得到向量q,再将q与a1到a4产生的k1到k4去计算得到attention的分数。之后将α1、α2、α3乘上v1、v2、v3再加起来得到v,之后将v丢向FC。

Training:训练集是打上标签的,每一次Decoder产生一个字时都是做了一次分类问题,输出的字和正确的字存在一个cross entropy,而训练的目的是让所有cross entropy的和越小越好。

总结

学习了transforme框架中的Encoder和Decoder,以及二者之间的联系,对模型框架有了更深的了解。

transforme模型比传统的模型每层计算复杂度更优、可直接计算点乘结果,模型更具有解释性。但模型对于局部特征的捕捉能力基本没有以及在位置信息的设置上是值得优化的。

### Transformer框架在深度学习中的应用 Transformer是一种基于自注意力机制的神经网络架构,最初由Vaswani等人于2017年提出。该模型摒弃了传统RNN/LSTM依赖顺序计算的方式,转而利用多头自注意力机制来捕捉输入序列中不同位置之间的关系。 #### 自注意力机制的工作原理 在一个典型的Transformer层内,每个元素(如单词或像素)都会与其他所有元素建立联系,从而形成全局上下文感知。具体实现方式如下: - **Query (Q)**, **Key (K)** 和 **Value (V)** 是三个矩阵变换后的向量表示形式; - 对于给定的位置i,q_i会与所有的k_j相乘得到权重分数score_ij; - 使用softmax函数对这些分数进行归一化处理,使得它们加起来等于1; - 将上述概率分布作用于v_j上求得最终输出o_i; 此过程可以表达为公式: \[ \text{Attention}(Q,K,V)=\text{softmax}\left(\frac{Q K^{T}}{\sqrt {d_k}}\right)V \] 其中\( d_k \)代表key维度大小用于缩放点积结果防止梯度消失问题[^2]。 #### 编码器-解码器结构 完整的Transformer通常包含编码器(encoder)-解码器(decoder)两部分组成: - **Encoder**: 主要负责接收原始输入并提取特征信息。它由多个相同类型的子层堆叠而成,每层内部又分为两个主要组件——一个多头自关注模块和一个全连接前馈网络(FFN),两者之间都加入了残差链接(residual connection)和LayerNorm操作以促进训练稳定性。 - **Decoder**: 接收来自encoder端产生的context vector以及目标侧的历史预测值作为输入来进行下一步词的选择。同样地,decoder也包含了类似的分层设计,不过在此基础上增加了一个masked multi-head self attention用来屏蔽未来时刻的信息避免泄露答案。 ```python import torch.nn as nn class Encoder(nn.Module): def __init__(self, input_dim, hid_dim, n_layers, n_heads, pf_dim, dropout, device, max_length=100): super().__init__() self.tok_embedding = nn.Embedding(input_dim, hid_dim) self.pos_embedding = PositionalEncoding(hid_dim, dropout, max_len=max_length) self.layers = nn.ModuleList([EncoderLayer(hid_dim, n_heads, pf_dim, dropout, device) for _ in range(n_layers)]) self.dropout = nn.Dropout(dropout) self.scale = torch.sqrt(torch.FloatTensor([hid_dim])).to(device) def forward(self, src, src_mask): batch_size = src.shape[0] src_len = src.shape[1] pos = torch.arange(0, src_len).unsqueeze(0).repeat(batch_size, 1).to(self.device) src = self.dropout((self.tok_embedding(src) * self.scale) + self.pos_embedding(pos)) for layer in self.layers: src = layer(src, src_mask) return src ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值