更深、更轻量级的Transformer!Facebook提出:DeLighT

DeLighT:深度和轻量化的Transformer 本文提出了一个更深更轻量的Transformer-DeLighT,DeLighT更有效地在每个TransformerBlock中分配参数(1)使用DeLighT转换进行深度和轻量级的转换;(2)使用Block-wiseScaling进行跨Block,允许在输入附近有较浅和较窄的DeLighTBlock,以及在输出附近有较宽和较深的DeLighTBlock。总的来说,DeLighT网络的深度是标准Transformer的2.5到4倍,但参数和操作更少。... 阅读详情

                                                                            Fly-AI竞赛服务平台 flyai.com

在开始学习之前推荐大家可以多在        FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。 

摘要: 本文提出了一个更深更轻量的Transformer,DeLighT,DeLighT更有效地在每个Transformer Block中分配参数:1)、使用DeLighT转换进行深度和轻量级的转换;2)、使用Block-wise Scaling进行跨Block,允许在输入附近有较浅 ...

DELIGHT: DEEP AND LIGHT-WEIGHT TRANSFORMER

论文:https://arxiv.org/abs/2008.00623

代码:https://github.com/sacmehta/delight

本文提出了一个更深更轻的Transformer,DeLighT,它的性能与Transformer相似,甚至更好,平均少了2到3倍的参数。

 

1 简介

本文提出了一个更深更轻量的Transformer,DeLighT,DeLighT更有效地在每个Transformer Block中分配参数:

1)、使用DeLighT转换进行深度和轻量级的转换;

2)、使用Block-wise Scaling进行跨Block,允许在输入附近有较浅和较窄的DeLighT Block,以及在输出附近有较宽和较深的DeLighT Block。

总的来说,DeLighT网络的深度是标准Transformer的2.5到4倍,但参数和操作更少。在机器翻译和语言建模任务上的实验表明,DeLighT在提高了基准Transformer性能的基础上,平均减少了2到3倍的参数量。

 

2 相关工作

2.1 Improving transformers

第1种研究研究解决了在长输入序列上计算Self-Attention的问题。这些方法可以与本文的架构相结合。

 

第2种研究侧重于解释多头注意力。研究表明增加Transformer Header的数量会导致冗余表示,使用带有预定义模式或综合注意矩阵的固定注意Header可以提高性能。

 

第3种研究重点是通过学习更好的表示来改进Transformer。这些工作旨在使用不同的变换来提高Transformer的表达性,例如,使用卷积、门控线性单元或多分支特征提取器。本文的工作属于这一类。与以前的工作不同,本文证明了使用DeLighT变换在块级和使用块尺度缩放操作在块级进行有效地分配参数是可能的。

 

2.2 Model scaling

Model scaling是提高序列模型性能的一种标准方法。模型的尺寸在宽度尺度上增加,同时在深度尺度上堆叠更多的Block。在这2种情况下(以及它们的组合),网络的每个Block内的参数都是相同的,这可能会导致次优解。为了进一步提高序列模型的性能,本文引入了块尺度缩放,允许设计可变大小的块和对网络中的参数进行有效的分配。

 

本文的研究结果表明:

1)、靠近输入的较浅且较窄的DeLighT Block,以及靠近输出的较深且较宽的DeLighT Block能够提供较好的性能;

2)、与单独使用模型缩放相比,基于块尺度缩放的模型能够获得更好的性能。

本文也注意到,卷积神经网络(CNNs)还可以学习靠近输入的较浅和较窄的表示,以及靠近输出的较深和较宽的表示。与CNN在每个卷积层执行固定数量的操作不同,建议的块缩放在每个层和块中使用可变数量的操作。

 

2.3 Improving sequence models

最近在改进序列模型的其他相关方法上也有重要的工作,包括(1)使用更好的标记级表示(例如使用BPE)、自适应输入和输出以及定义来提高准确性,以及(2)使用压缩、修剪和蒸馏来提高效率。

 

本文工作最接近的是定义转换,它也使用expand-reduce策略学习表示。DeFINE转换(图1c)和DeLighT转换(图1d)之间的关键区别是,DeLighT转换更有效地在扩展层和简化层中分配参数。

DeFINE在组线性变换中使用更少的组来学习更鲁棒的表征,与之不同的是,DeLighT transformation使用更多的组来学习更广泛的表示,且参数更少。DeLighT转换获得了与DeFINE转换相当的性能,但参数却少得多。

 

3 DeLight Transformer

一个标准的Transformer Block如图1a所示:

包括使用Query、Key、Value来建模序列Token之间的关系,以及使用一个前馈网络(FFN)来学习更广泛的表征。

Transformer Block的深度是4,一般情况下,基于Transformer的网络设计均是按顺序堆叠Transformer Block,以增加网络容量和深度。

 

3.1 DeLight

在expansion-reduction阶段,DeLighT变换使用组线性变换(GLTs),因为它们通过从输入的特定部分导出输出来学习局部表示,比线性变换更有效。为了学习全局表征,DeLighT变换使用特征变换在组线性变换的不同组之间共享信息,类似于卷积网络中的通道变换。

3.2 DeLighT Block

Block depth

DeLighT块栈包括:

1)、1个有N个GLTs的DeLighT转换,

2)、3个平行的用于键、查询和值的线性层,

3)、一个投影层,

4)、轻量级FFN的2个线性层。

因此,DeLighT块的深度是N+4。与标准transformer(深度为4)相比,DeLighT块更深。

 

3.3 Block-Wise Scaling

改进序列模型性能的标准方法包括增加模型尺寸(宽度缩放),堆叠更多的块(深度缩放),或两者兼用。然而,这种尺度变换在小数据集上并不十分有效。

class DeLighTTransformerEncoderLayer(nn.Module):

    """DeLight Encoder layer

    """



    def __init__(self, args, embed_dim, width_multiplier=DEFAULT_WIDTH_MULTIPLIER, dextra_depth=DEFAULT_MIN_DEXTRA_LAYERS,

                 dextra_proj=2):

        super().__init__()

        self.embed_dim = embed_dim

        assert embed_dim % dextra_proj == 0



        self.proj_dim = embed_dim // dextra_proj

        self.dextra_layer = DExTraUnit(in_features=self.embed_dim,

                                       in_proj_features=self.proj_dim,

                                       out_features=self.proj_dim,

                                       width_multiplier=width_multiplier,

                                       dextra_depth=dextra_depth,

                                       dextra_dropout=args.delight_dropout,

                                       max_glt_groups=args.delight_enc_max_groups,

                                       act_type=args.act_type,

                                       use_bias=True,

                                       norm_type=args.norm_type,

                                       glt_shuffle=args.glt_shuffle,

                                       is_iclr_version=args.define_iclr

                                       )



        self.self_attn = SingleHeadAttention(q_in_dim=self.proj_dim,

                                             kv_in_dim=self.proj_dim,

                                             proj_dim=self.proj_dim,

                                             out_dim=self.embed_dim,

                                             dropout=args.attention_dropout,

                                             bias=True,

                                             self_attention=True,

                                             encoder_decoder_attention=False)



        self.self_attn_layer_norm = get_norm_layer(name=args.norm_type, out_features=self.embed_dim)

        self.dropout = args.dropout

        self.norm_fn = args.norm_type

        self.act_type = args.act_type

        self.activation_fn = get_activation_layer(name=args.act_type)

        self.activation_dropout = getattr(args, "activation_dropout", 0)

        if self.activation_dropout == 0:

            # for backwards compatibility with models that use args.relu_dropout

            self.activation_dropout = getattr(args, "relu_dropout", 0)

        self.normalize_before = args.encoder_normalize_before



        # Light-weight FFN

        self.ffn_dropout = args.ffn_dropout

        ffn_red_factor = args.delight_enc_ffn_red

        assert self.embed_dim % ffn_red_factor == 0, '{}/{} should be a perfect divisor'.format(self.embed_dim,

                                                                                                ffn_red_factor)

        light_ffn_dim = self.embed_dim // ffn_red_factor

        self.fc1 = get_weight_layer(name='linear',

                                    in_features=self.embed_dim,

                                    out_features=light_ffn_dim,

                                    use_bias=True)

        self.fc2 = get_weight_layer(name='linear',

                                    in_features=light_ffn_dim,

                                    out_features=self.embed_dim,

                                    use_bias=True)



        self.final_layer_norm = get_norm_layer(name=args.norm_type, out_features=self.embed_dim)



    def __repr__(self):

        s = '{name}(in_features={embed_dim}, out_features={embed_dim}, dropout={dropout},' \

            'activation_dropout={activation_dropout}, ffn_dropout={ffn_dropout}, ' \

            'activation_fn={act_type}, norm_fn={norm_fn})'

        s += '\n \t Dextra Layer: \n \t \t {}'.format(self.dextra_layer)

        s += '\n \t Self Attention: \n \t \t {}'.format(self.self_attn)

        s += '\n \t     Light-weight FFN: \n \t     |---- {} \n \t     |---- {}'.format(self.fc1, self.fc2)

        return s.format(name=self.__class__.__name__, **self.__dict__)



    def upgrade_state_dict_named(self, state_dict, name):

        """

        Rename layer norm states from `...layer_norms.0.weight` to

        `...self_attn_layer_norm.weight` and `...layer_norms.1.weight` to

        `...final_layer_norm.weight`

        """

        layer_norm_map = {"0": "self_attn_layer_norm", "1": "final_layer_norm"}

        for old, new in layer_norm_map.items():

            for m in ("weight", "bias"):

                k = "{}.layer_norms.{}.{}".format(name, old, m)

                if k in state_dict:

                    state_dict["{}.{}.{}".format(name, new, m)] = state_dict[k]

                    del state_dict[k]



    def forward(self, x, encoder_padding_mask, attn_mask: Optional[Tensor] = None):

        """

        Args:

            x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)`

            encoder_padding_mask (ByteTensor): binary ByteTensor of shape

                `(batch, src_len)` where padding elements are indicated by ``1``.

            attn_mask (ByteTensor): binary tensor of shape (T_tgt, T_src), where

            T_tgt is the length of query, while T_src is the length of key,

            though here both query and key is x here,

            attn_mask[t_tgt, t_src] = 1 means when calculating embedding

            for t_tgt, t_src is excluded (or masked out), =0 means it is

            included in attention

        Returns:

            encoded output of shape `(seq_len, batch, embed_dim)`

        """

        residual = x

        if self.normalize_before:

            x = self.self_attn_layer_norm(x)

        if attn_mask is not None:

            attn_mask = attn_mask.masked_fill(attn_mask.to(torch.bool), -1e8)



        x = self.dextra_layer(x)



        x, _ = self.self_attn(

            query=x,

            key_value=None,

            key_padding_mask=encoder_padding_mask,

            attn_mask=attn_mask

        )

        x = F.dropout(x, p=self.dropout, training=self.training)

        x = residual + x



        if not self.normalize_before:

            x = self.self_attn_layer_norm(x)



        # Light-weight FFN

        residual = x

        if self.normalize_before:

            x = self.final_layer_norm(x)

        x = self.activation_fn(self.fc1(x))

        x = F.dropout(x, p=float(self.activation_dropout), training=self.training)

        x = self.fc2(x)

        x = F.dropout(x, p=self.ffn_dropout, training=self.training)

        x = residual + x

        if not self.normalize_before:

            x = self.final_layer_norm(x)

        return x



    def compute_macs_params(self, S=1):

        macs = 0

        n_params = 0

        macs_attn = 0



        # Layer Norms

        # MACS are zero for LayerNorm because they can be fused

        n_params += sum([p.numel() for p in self.self_attn_layer_norm.parameters()])



        # Dextra layer

        dextra_layer = self.dextra_layer.compute_macs_params()

        n_params += dextra_layer['params']

        macs += (dextra_layer['macs'] * S)



        # Attn

        self_attn_layer = self.self_attn.compute_macs_params(T=S, S=S)

        macs += self_attn_layer['macs']

        n_params += self_attn_layer['params']

        macs_attn += self_attn_layer['macs_attn']



        # FFN

        fc1_layer = self.fc1.compute_macs_params()

        # scale MACS by S because S tokens can be processed in parallel

        macs += (fc1_layer['macs'] * S)

        n_params += fc1_layer['params']



        fc2_layer = self.fc2.compute_macs_params()

        # scale MACS by S because S tokens can be processed in parallel

        macs += (fc2_layer['macs'] * S)

        n_params += fc2_layer['params']



        n_params += sum([p.numel() for p in self.final_layer_norm.parameters()])



        return {

            'name': self.__class__.__name__,

            'macs': macs,

            'params': n_params,

            'macs_attn': macs_attn

        }





class DeLighTTransformerDecoderLayer(nn.Module):

    """Delight Decoder layer

    """



    def __init__(self, args, embed_dim, width_multiplier=DEFAULT_WIDTH_MULTIPLIER, dextra_depth=DEFAULT_MIN_DEXTRA_LAYERS,

                 no_encoder_attn=False, dextra_proj=2, *unused_args, **unused_kwargs):

        super().__init__()

        self.embed_dim = embed_dim

        assert embed_dim % dextra_proj == 0

        self.proj_dim = embed_dim // dextra_proj



        self.norm_fn = args.norm_type

        self.act_type = args.act_type



        self.dextra_layer_sa = DExTraUnit(in_features=self.embed_dim,

                                          in_proj_features=self.proj_dim,

                                          out_features=self.proj_dim,

                                          width_multiplier=width_multiplier,

                                          dextra_depth=dextra_depth,

                                          dextra_dropout=args.delight_dropout,

                                          max_glt_groups=args.delight_dec_max_groups,

                                          act_type=args.act_type,

                                          use_bias=True,

                                          norm_type=args.norm_type,

                                          glt_shuffle=args.glt_shuffle,

                                          is_iclr_version=args.define_iclr

                                          )



        self.self_attn = SingleHeadAttention(q_in_dim=self.proj_dim,

                                             kv_in_dim=self.proj_dim,

                                             proj_dim=self.proj_dim,

                                             out_dim=self.embed_dim,

                                             dropout=args.attention_dropout,

                                             bias=True,

                                             self_attention=True,

                                             encoder_decoder_attention=False)



        self.dropout = args.dropout

        self.activation_fn = get_activation_layer(name=args.act_type)



        self.activation_dropout = getattr(args, "activation_dropout", 0)

        if self.activation_dropout == 0:

            # for backwards compatibility with models that use args.relu_dropout

            self.activation_dropout = getattr(args, "relu_dropout", 0)

        self.normalize_before = args.decoder_normalize_before



        self.self_attn_layer_norm = get_norm_layer(name=args.norm_type, out_features=self.embed_dim)



        if no_encoder_attn:

            self.encoder_attn = None

            self.encoder_attn_layer_norm = None

        else:

            q_embed_dim = self.embed_dim

            self.encoder_attn = SingleHeadAttention(q_in_dim=q_embed_dim,

                                                    kv_in_dim=self.embed_dim,

                                                    proj_dim=self.proj_dim,

                                                    out_dim=self.embed_dim,

                                                    dropout=args.attention_dropout,

                                                    bias=True,

                                                    encoder_decoder_attention=True,

                                                    self_attention=False)



            self.encoder_attn_layer_norm = get_norm_layer(name=args.norm_type, out_features=self.embed_dim)



        self.ffn_dropout = args.ffn_dropout

        ffn_red_factor = args.delight_dec_ffn_red

        assert self.embed_dim % ffn_red_factor == 0, '{}/{} should be a perfect divisor'.format(self.embed_dim,

                                                                                                ffn_red_factor)



        # Feed forward network

        light_ffn_dim = self.embed_dim // ffn_red_factor

        self.fc1 = get_weight_layer(name='linear',

                                    in_features=self.embed_dim,

                                    out_features=light_ffn_dim,

                                    use_bias=True)

        self.fc2 = get_weight_layer(name='linear',

                                    in_features=light_ffn_dim,

                                    out_features=self.embed_dim,

                                    use_bias=True)

        self.final_layer_norm = get_norm_layer(name=args.norm_type, out_features=self.embed_dim)



        self.need_attn = True

        self.onnx_trace = False



    def __repr__(self):

        s = '{name}(in_features={embed_dim}, out_features={embed_dim}, dropout={dropout}, ' \

            'activation_dropout={activation_dropout}, ffn_dropout={ffn_dropout}, ' \

            'activation_fn={act_type}, norm_fn={norm_fn})'

        s += '\n \t     Dextra Layer (Query): \n \t \t {}'.format(self.dextra_layer_sa)

        s += '\n \t     Self Attention (Decoder): \n \t \t {}'.format(self.self_attn)

        if self.encoder_attn is not None:

            s += '\n \t     Encoder-Decoder Attention: \n \t \t {}'.format(self.encoder_attn)

        s += '\n \t     Light-weight FFN: \n \t     |---- {} \n \t     |---- {}'.format(self.fc1, self.fc2)

        return s.format(name=self.__class__.__name__, **self.__dict__)



    def prepare_for_onnx_export_(self):

        self.onnx_trace = True



    def forward(

            self,

            x,

            encoder_out: Optional[torch.Tensor] = None,

            encoder_padding_mask: Optional[torch.Tensor] = None,

            incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None,

            prev_self_attn_state: Optional[List[torch.Tensor]] = None,

            prev_attn_state: Optional[List[torch.Tensor]] = None,

            self_attn_mask: Optional[torch.Tensor] = None,

            self_attn_padding_mask: Optional[torch.Tensor] = None,

            need_attn: bool = False,

            need_head_weights: bool = False,

    ):

        """

        Args:

            x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)`

            encoder_padding_mask (ByteTensor, optional): binary

                ByteTensor of shape `(batch, src_len)` where padding

                elements are indicated by ``1``.

            need_attn (bool, optional): return attention weights

            need_head_weights (bool, optional): return attention weights

                for each head (default: return average over heads).

        Returns:

            encoded output of shape `(seq_len, batch, embed_dim)`

        """

        if need_head_weights:

            need_attn = True



        residual = x

        if self.normalize_before:

            x = self.self_attn_layer_norm(x)



        # apply dextra layer

        x = self.dextra_layer_sa(x)



        if prev_self_attn_state is not None:

            prev_key, prev_value = prev_self_attn_state[:2]



            saved_state: Dict[str, Optional[Tensor]] = {

                "prev_key": prev_key,

                "prev_value": prev_value,

            }

            if len(prev_self_attn_state) >= 3:

                saved_state["prev_key_padding_mask"] = prev_self_attn_state[2]

            assert incremental_state is not None

            self.self_attn._set_input_buffer(incremental_state, saved_state)



        x, attn = self.self_attn(

            query=x,

            key_value=None,

            key_padding_mask=self_attn_padding_mask,

            incremental_state=incremental_state,

            need_weights=False,

            attn_mask=self_attn_mask,

        )

        x = F.dropout(x, p=self.dropout, training=self.training)

        x = residual + x

        if not self.normalize_before:

            x = self.self_attn_layer_norm(x)



        if self.encoder_attn is not None:

            residual = x

            if self.normalize_before:

                x = self.encoder_attn_layer_norm(x)



            if prev_attn_state is not None:

                prev_key, prev_value = prev_attn_state[:2]

                saved_state: Dict[str, Optional[Tensor]] = {

                    "prev_key": prev_key,

                    "prev_value": prev_value,

                }

                if len(prev_attn_state) >= 3:

                    saved_state["prev_key_padding_mask"] = prev_attn_state[2]

                assert incremental_state is not None

                self.encoder_attn._set_input_buffer(incremental_state, saved_state)



            x, attn = self.encoder_attn(

                query=x,

                key_value=encoder_out,

                key_padding_mask=encoder_padding_mask,

                incremental_state=incremental_state,

                static_kv=True,

                need_weights=need_attn or (not self.training and self.need_attn),

                need_head_weights=need_head_weights,

            )

            x = F.dropout(x, p=self.dropout, training=self.training)

            x = residual + x

            if not self.normalize_before:

                x = self.encoder_attn_layer_norm(x)



        #Light-weight FFN

        residual = x



        if self.normalize_before:

            x = self.final_layer_norm(x)

        x = self.activation_fn(self.fc1(x))

        x = F.dropout(x, p=float(self.activation_dropout), training=self.training)

        x = self.fc2(x)

        x = F.dropout(x, p=self.ffn_dropout, training=self.training)

        x = residual + x

        if not self.normalize_before:

            x = self.final_layer_norm(x)





        if self.onnx_trace and incremental_state is not None:

            saved_state = self.self_attn._get_input_buffer(incremental_state)

            assert saved_state is not None

            if self_attn_padding_mask is not None:

                self_attn_state = [

                    saved_state["prev_key"],

                    saved_state["prev_value"],

                    saved_state["prev_key_padding_mask"],

                ]

            else:

                self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]]

            return x, attn, self_attn_state

        return x, attn, None



    def make_generation_fast_(self, need_attn: bool = False, **kwargs):

        self.need_attn = need_attn



    def compute_macs_params(self, T=1, S=1):

        macs = 0

        n_params = 0

        macs_attn = 0



        # LayerNorm

        n_params += sum([p.numel() for p in self.self_attn_layer_norm.parameters()])



        # self attention

        self_attn_layer = self.self_attn.compute_macs_params(T=T, S=T)

        dextra_layer = self.dextra_layer_sa.compute_macs_params()

        macs += self_attn_layer['macs'] + (dextra_layer['macs'] * T)

        n_params += self_attn_layer['params'] + dextra_layer['params']

        macs_attn += self_attn_layer['macs_attn']



        # Encoder-decoder attn

        if self.encoder_attn is not None:

            # self attention scaled-dot-product Attn

            n_params += sum([p.numel() for p in self.encoder_attn_layer_norm.parameters()])



            enc_attn = self.encoder_attn.compute_macs_params(T=T, S=S)

            macs += enc_attn['macs']

            n_params += enc_attn['params']

            macs_attn += enc_attn['macs_attn']



        # FFN

        fc1_layer = self.fc1.compute_macs_params()

        macs += (fc1_layer['macs'] * T)

        n_params += fc1_layer['params']



        fc2_layer = self.fc2.compute_macs_params()

        macs += (fc2_layer['macs'] * T)

        n_params += fc2_layer['params']



        n_params += sum([p.numel() for p in self.final_layer_norm.parameters()])



        return {

            'name': self.__class__.__name__,

            'macs': macs,

            'params': n_params,

            'macs_attn': macs_attn

        }





if __name__ == '__main__':

    pass

4. 实验

4.1 机器翻译实验

 

4.2 语言模型

 

毫无疑问,更快更强!!!


更多精彩内容请访问FlyAI-AI竞赛服务平台;为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台;每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

挑战者,都在FlyAI!!!

 

【即插即用模块】Transformer篇 | CVPR 2024 | 倒反天罡!轻量级单头自注意力SHSA,比多头还准? SHSA模块是一种高效的轻量级视觉Transformer设计,通过单头自注意力机制降低计算冗余。该模块将输入特征分为注意力分支和身份分支,仅对部分通道(pdim)计算单头注意力,结合1×1卷积生成QKV,显著减少计算量。实验表明,当部分通道比例为4.67时,SHSA能更好平衡速度与精度,在轻量级视觉任务中表现优异。其核心优势在于:1)单头注意力减少多头冗余;2)部分通道计算降低复杂度;3)卷积与归一化结合稳定训练。代码实现采用分组卷积和特征拼接,支持即插即用替换传统自注意力模块。 阅读详情

相关推荐

HFSS仿真中如何提取最大E/H场强与频率关系曲线

本文详细讲解了在HFSS仿真中提取最大E/H场强与频率关系曲线的完整流程。通过使用场计算器(Field Calculator)和创建场报告,工程师可以准确获得器件在整个频带内的电场或磁场强度峰值,并进一步推导出关键的功率容量曲线,为高功率射频器件(如滤波器、耦合器)的设计提供至关重要的安全评估依据。

ss78901的博客 1099

轻量级模型解读——轻量transformer系列

轻量级transformer系列模型解读

lishanlu136的博客 6413

搭建PX4开发系统(Ubuntu 22.04)

本文是《从零开始学 PX4 无人机开发》系列第二篇,适合开发者在 Ubuntu 系统下快速搭建 PX4 编译与仿真环境,支持 QGroundControl、Gazebo、MAVSDK 等完整工具链。

qq_15856721的博客 4201

轻量ViT王者 | EfficientFormerV2:全新轻量级视觉Transformer

点击下方卡片,关注“自动驾驶之心”公众号ADAS巨卷干货,即可获取点击进入→自动驾驶之心【模型部署】技术交流群后台回复【模型部署工程】获取基于TensorRT的分类、检测任务的部署源码!摘要随着视觉Transformers(ViTs)在计算机视觉任务中的成功,最近的技术试图优化ViT的性能和复杂性,以实现在移动设备上的高效部署。研究人员提出了多种方法来加速注意力机制,改进低效设计,或结合mobil...

CV_Autobot的博客 4491

[南大ICS]PA1 - 开天辟地的篇章: 最简单的计算机

task PA1.1: 实现单步执行, 打印寄存器状态, 扫描内存 task PA1.2: 实现算术表达式求值 task PA1.3: 实现所有要求, 提交完整的实验报告

qq_42474104的博客 1570

PaddleOCR PP-OCRv5实战:5分钟搞定身份证信息提取(附完整代码)

本文详细介绍了如何利用PaddleOCR的PP-OCRv5模型,在5分钟内快速搭建身份证信息提取流程。文章从环境搭建、核心代码实战出发,深入解析了PP-OCRv5针对证件识别的优化特性,并提供了从OCR结果到结构化数据的完整处理方案与避坑指南,帮助开发者高效实现AI驱动的自动化信息提取。

salt9的博客 783

轻量级Visual Transformer模型——LeViT(ICCV2021)

LeViT是FAIR团队发表在ICCV2021上的成果,是轻量级ViT模型中的标杆,文章对ViT中多个部件进行的改进,如加速策略等,对很多工程化铺设ViT系列模型都是很有借鉴意义的。 按说,近期出现的优质模型非常多,各种冲击SOTA的,详情可戳我整理的小综述《盘点2021-2022年出现的CV神经网络模型》。但我为何会单独对LeViT拿出来进行详细剖析呢?原因很简单:LeViT非常工程实用,是一款足够优秀的轻量级视觉transformer模型。市面上很多轻量级模型都进入了一个误区:大家都在比拼FLOPs数和

木盏 1万+

Netty UDP

UDP是一种无连接的协议,它并不在通信双方之间建立连接,而是直接将数据包从发送端发送到接收端。UDP不保证数据包的可靠传输,也不保证数据包的顺序,因此其传输速度通常比TCP快,且系统开销较小。然而,这也意味着UDP在某些情况下可能会丢失数据包或数据包到达的顺序错乱。

王小工小工历程 2027

优化与改进之轻量级Transformer - Transformer教程

本文深入探讨了Transformer模型的优化与改进方法,包括低秩近似、稀疏注意力机制、分层注意力机制、动态注意力机制、混合精度训练、模型蒸馏、剪枝技术、混合模型、知识迁移和硬件加速等。这些方法不仅显著降低了计算复杂度和资源需求,还提升了模型的效率和性能,推动Transformer模型在更多实际应用场景中的广泛应用。

shandianfk_com的博客 1141

算法 | A*算法实现最优路径规划

启发式探索是利用问题拥有的启发信息来引导搜索,达到减少探索范围、降低问题复杂度的目的。A*寻路算法是启发式探索的一个典型实践,在寻路搜索的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中采取估计值优先原则,估计值更优的节点会被优先遍历。...

不断学习,不断进步,提高自己 6630

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

fxshy的博客 462

【计算机视觉 | Transformer】魔改Transformer!9种提速又提效的模型优化方案分享!

【计算机视觉 | Transformer】魔改Transformer!9种提速又提效的模型优化方案分享!

wzk4869的博客 5559

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

探索轻量级Transformer:MIT-HAN-Lab的lite-transformer

在深度学习领域,Transformer模型因其出色的性能而在NLP(自然语言处理)中占据了主导地位。然而,其庞大的计算需求往往限制了其在资源有限的环境中的应用。为了解决这一问题,,这是一个专注于构建高效、轻量级的Transformer模型的库。 ## 项目简介 `lite-transformer`的目标是提供一个可以在手机、物联网设备等边缘计算环境中运行的高质量NLP模型。这个项目采用了多种优

gitblog_00090的博客 1100

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LSRA: 轻量级Transformer,注意力长短搭配

摘要: Transformer虽然效果好,但是却对资源要求比较高,很难在端设备上运行。在传统的Transformer中,每个block中都有Multi-head Attention和全连接层,其中,随着序列长度N的增大,全连接层的计算量是线性增长,而attent ... 人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力...

iFlyAI的博客 1984

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

探索Transformer-Simple:一款轻量级的自然语言处理工具

探索Transformer-Simple:一款轻量级的自然语言处理工具 在现代深度学习领域,Transformer模型因其高效的并行计算能力和强大的序列建模能力而备受推崇。 是一个开源项目,由Hinesboy开发,它为开发者提供了一个简洁、易于理解和实现的Transformer框架,旨在帮助初学者和专业人士快速上手Transformer模型。 项目简介 Transformer-Simple是一个基...

gitblog_00096的博客 444

Transformer——Q116 验证轻量级Transformer(Lite Transformer)的参数量-准确率权衡

轻量级 Transformer 通过架构简化、参数共享和低秩近似等技术,在参数量与准确率之间找到了一条可行的平衡路径。在实际应用中,从移动端智能客服到多语言翻译,Lite Transformer 凭借其高效性和可部署性,为资源受限场景提供了优质解决方案。虽然它在复杂任务中仍难以媲美大型模型,但随着优化策略的不断创新(如动态架构、知识蒸馏),未来的轻量级 Transformer 有望在保持轻量化优势的同时,进一步缩小与大型模型的性能差距,真正实现 “小身材、大能量”,成为人工智能普惠化的重要推动者。

墨顿随笔 1098

【对称CNN:递归Transformer:SR:轻量级】

仅供自己参考

weixin_43690932的博客 1290

ICML 2023 | 轻量级视觉Transformer (ViT) 的预训练实践手册

本文介绍一下最近被 ICML 2023 接收的文章:A Closer Look at Self-Supervised Lightweight Vision Transformers.论文标题:A Closer Look at Self-Supervised Lightweight Vision Transformers论文链接:https://arxiv.org/abs/2205.14443代码链...

Paper weekly 1253

轻量级Transformer在语义分割中的大显身手:SSformer

本文提出了SSformer,这是一种轻量级的Transformer模型,用于语义分割。本文引入了一个简单的MLP解码器,它带来了很少的复杂性和参数增加。SSformer利用了Swin Transformer的分层多尺度架构,可以从预训练的Swin Transformer中进行微调。实验结果证明了其具有竞争力的性能和低时间复杂度的特点。本文相信其先进的特性可以使语义分割框架更容易应用于低计算能力的计算机和嵌入式设备。本文的源代码和模型在GitHub上公开可用。

m0_64752471的博客 2202

Fast and Effective!一文速览轻量化Transformer各领域研究进展

每天给你送来NLP技术干货!© 作者|刘子康机构|中国人民大学高瓴人工智能学院研究方向 | 多模态学习来自 |RUC AI Box本文梳理了一些Transformer常用的轻量化方法,并分领域的介绍了一些主流的轻量化Transformer。引言:近年来,Transformer模型在人工智能的各个领域得到了广泛应用,成为了包括计算机视觉,自然语言处理以及多模态领域内的主流方法。尽管Transfo...

zenRRan的博客 2500

轻量级模型汇总解读——涉及MobileNet、ShuffleNet、GhostNet、EfficientNet、NasNet、轻量transformer

轻量级模型汇总解读,汇总目录

lishanlu136的博客 6343

MobileViT架构精讲:从论文设计到移动端部署的轻量级视觉Transformer实践

本文深入解析了MobileViT轻量级视觉Transformer架构,该模型由Apple团队提出,旨在解决移动端部署中全局建模与计算效率的平衡问题。文章精讲了其核心的Unfold-Transformer-Fold设计思想,对比了其与DeiT等模型的差异,并提供了从模型加载、微调到移动端TFLite与CoreML部署的完整实践指南,帮助开发者在资源受限设备上实现高效的视觉AI应用。

efc1234567的博客 438

融合Transformer与CNN,实现各任务性能巅峰,可训练参数减少80%

众所周知,通过多层卷积自动学习空间层级特征,能够有效提取图像局部特征。而通过自注意力机制全局建模,能够有效处理长距离依赖关系。通过结合这两者的优势,我们不仅可以还能举个栗子:混合架构Lite-Mono。该模型主要包含两个模块,CDC模块用于提取增强的多尺度局部特征,LGFI模块用于编码长距离的全局特征。实验表明,Lite-Mono在精度上优于Monodepth2,可训练参数减少了80%左右。目前,这种策略通过多种方式融合两种模型的优点。主流的方法包括早期层融合、横向层融合、顺序融合、并行融合等。

学姐带你玩AI的博客 3630
上一篇: FlyAI人工智能社区参赛指南—用户体验版
下一篇: 一文详解深度学习最常用的 10 个激活函数
iFlyAI
博客等级 码龄9年 238粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值