位置: IT常识 - 正文

注意力机制 - Transformer(注意力机制的作用)

编辑:rootadmin
注意力机制 - Transformer 文章目录Transformer1 - 模型2 - 基于位置的前馈网络3 - 残差连接和层规范化4 - 编码器5 - 解码器6 - 训练7 - 小结Transformer

推荐整理分享注意力机制 - Transformer(注意力机制的作用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:注意力机制和自注意力机制的区别,注意力机制是什么,注意力机制transformer,注意力机制和自注意力机制的区别,注意力机制加在CNN的什么位置,注意力机制加在什么位置,注意力机制加在CNN的什么位置,注意力机制加在CNN的什么位置,内容如对您有帮助,希望把文章链接给更多的朋友!

注意力同时具有并行计算和最短的最大路径长度这两个优势,因此使用自注意力来设计深度架构是很有吸引力的。对比之前仍然依赖循环神经网络实现输入表示的自注意力模型,transformer模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管transformer最初是应用于文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音、强化学习领域

1 - 模型

Transformer作为编码器-解码器架构的⼀个实例,其整体架构图在 图10.7.1中展⽰。正如所⻅到的,transformer是由编码器和解码器组成的。与 10.4.1中基于Bahdanau注意⼒实现的序列到序列的学习相⽐,transformer的编码器和解码器是基于⾃注意⼒的模块叠加⽽成的,源(输⼊)序列和⽬标(输出)序列的嵌⼊(embedding)表⽰将加上位置编码(positional encoding),再分别输⼊到编码器和解码器中

import mathimport pandas as pdimport torchfrom torch import nnfrom d2l import torch as d2l2 - 基于位置的前馈网络

基于位置的前馈网络对序列中的所有位置的表示进行变换时使用的是同一个多层感知机(MLP),这就是称前馈网络是基于位置的(positionwise)的原因。

在下面的实现中,输入X的形状(批量大小,时间步数或序列长度,隐单元数或特征维度)将被一个两层的感知机转换成形状位(批量大小,时间步数,ffn_num_outputs)的输出张量

class PositionWiseFFN(nn.Module): """基于位置的前馈网络""" def __init__(self,ffn_num_input,ffn_num_hiddens,ffn_num_outputs,**kwargs): super(PositionWiseFFN,self).__init__(**kwargs) self.dense1 = nn.Linear(ffn_num_input,ffn_num_hiddens) self.relu = nn.ReLU() self.dense2 = nn.Linear(ffn_num_hiddens,ffn_num_outputs) def forward(self,X): return self.dense2(self.relu(self.dense1(X)))

下面的例子显示,改变张量的最里层维度的尺寸,会改变基于位置的前馈网络的输出尺寸。因为用同一个多层感知机对所有位置上的输入进行变换,所以当所有这些位置的输入相同时,它们的输出也是相同的

ffn = PositionWiseFFN(4,4,8)ffn.eval()ffn(torch.ones((2,3,4)))[0]tensor([[ 0.0626, 0.1739, -0.3923, 0.2537, -1.2938, 0.0616, 0.6115, 0.4278], [ 0.0626, 0.1739, -0.3923, 0.2537, -1.2938, 0.0616, 0.6115, 0.4278], [ 0.0626, 0.1739, -0.3923, 0.2537, -1.2938, 0.0616, 0.6115, 0.4278]], grad_fn=<SelectBackward0>)3 - 残差连接和层规范化

现在让我们关注图10.7.1中的“加法和规范化(add&norm)”组件。正如在本节开头所述,这是由残差连接和紧随其后的层规范化组成的。两者都是构建有效的深度架构的关键

以前我们解释了在⼀个⼩批量的样本内基于批量规范化对数据进⾏重新中⼼化和重新缩放的调整。层规范化和批量规范化的⽬标相同,但层规范化是基于特征维度进⾏规范化。尽管批量规范化在计算机视觉中被⼴泛应⽤,但在⾃然语⾔处理任务中(输⼊通常是变⻓序列)批量规范化通常不如层规范化的效果好

以下代码对比不同维度的层规范化和批量规范化的效果

ln = nn.LayerNorm(2)bn = nn.BatchNorm1d(2)X = torch.tensor([[1,2],[2,3]],dtype=torch.float32)# 在训练模式下计算X的均值和方差print('layer norm:',ln(X),'\n batch norm:',bn(X))layer norm: tensor([[-1.0000, 1.0000], [-1.0000, 1.0000]], grad_fn=<NativeLayerNormBackward0>) batch norm: tensor([[-1.0000, -1.0000], [ 1.0000, 1.0000]], grad_fn=<NativeBatchNormBackward0>)

现在我们可以使用残差连接和层规范化来实现AddNorm类。暂退法也被作为正则化方法使用

class AddNorm(nn.Module): """残差连接后进行层规范化""" def __init__(self,normalized_shape,dropout,**kwargs): super(AddNorm,self).__init__(**kwargs) self.dropout = nn.Dropout(dropout) self.ln = nn.LayerNorm(normalized_shape) def forward(self,X,Y): return self.ln(self.dropout(Y) + X)

残差连接要求两个输入的形状相同,以便加法操作后输出张量的形状相同

add_norm = AddNorm([3, 4], 0.5)add_norm.eval()add_norm(torch.ones((2, 3, 4)), torch.ones((2, 3, 4))).shapetorch.Size([2, 3, 4])4 - 编码器

有了组成transformer编码器的基础组件,现在可以先实现编码器中的一个层,下面的EncoderBlock类包含两个子层:多头自注意力和基于位置的前馈网络,这两个子层都使用了残差连接和紧随的层规范化

class EncoderBlock(nn.Module): """transformer编码器块""" def __init__(self,key_size,query_size,value_size,num_hiddens,norm_shape,ffn_num_input,ffn_num_hiddens,num_heads,dropout,use_bias=False,**kwargs): super(EncoderBlock,self).__init__(**kwargs) self.attention = d2l.MultiHeadAttention( key_size,query_size,value_size,num_hiddens,num_heads,dropout,use_bias) self.addnorm1 = AddNorm(norm_shape,dropout) self.ffn = PositionWiseFFN( ffn_num_input,ffn_num_hiddens,num_hiddens) self.addnorm2 = AddNorm(norm_shape,dropout) def forward(self,X,valid_lens): Y = self.addnorm1(X,self.attention(X,X,X,valid_lens)) return self.addnorm2(Y,self.ffn(Y))X = torch.ones((2,100,24))valid_lens = torch.tensor([3,2])encoder_blk = EncoderBlock(24,24,24,24,[100,24],24,48,8,0.5)encoder_blk.eval()encoder_blk(X,valid_lens).shapetorch.Size([2, 100, 24])

在实现下面的transformer编码器的代码实现中,我们堆叠了num_layers个EncoderBlock类的实例。由于我们使用的是值范围在-1和1之间的固定位置编码,因此通过学习得到的输入的嵌入表示的值需要先乘以嵌入维度的平方根进行重新缩放,然后再与位置编码相加

class TransformerEncoder(d2l.Encoder): """transformer编码器""" def __init__(self, vocab_size, key_size, query_size, value_size, num_hiddens, norm_shape, ffn_num_input, ffn_num_hiddens, num_heads, num_layers, dropout, use_bias=False, **kwargs): super(TransformerEncoder, self).__init__(**kwargs) self.num_hiddens = num_hiddens self.embedding = nn.Embedding(vocab_size, num_hiddens) self.pos_encoding = d2l.PositionalEncoding(num_hiddens, dropout) self.blks = nn.Sequential() for i in range(num_layers): self.blks.add_module("block"+str(i), EncoderBlock(key_size, query_size, value_size, num_hiddens, norm_shape, ffn_num_input, ffn_num_hiddens, num_heads, dropout, use_bias)) def forward(self, X, valid_lens, *args): # 因为位置编码值在-1和1之间, # 因此嵌⼊值乘以嵌⼊维度的平⽅根进⾏缩放, # 然后再与位置编码相加。 X = self.pos_encoding(self.embedding(X) * math.sqrt(self.num_hiddens)) self.attention_weights = [None] * len(self.blks) for i, blk in enumerate(self.blks): X = blk(X, valid_lens) self.attention_weights[i] = blk.attention.attention.attention_weights return X注意力机制 - Transformer(注意力机制的作用)

下面我们指定了超参数来创建一个两层的transformer编码器。Transformer编码器输出下形状是(批量大小,时间步数目,num_hiddens)

encoder = TransformerEncoder(200, 24, 24, 24, 24, [100, 24], 24, 48, 8, 2, 0.5)encoder.eval()encoder(torch.ones((2,100),dtype=torch.long),valid_lens).shapetorch.Size([2, 100, 24])5 - 解码器

如 图10.7.1所⽰,transformer解码器也是由多个相同的层组成。在DecoderBlock类中实现的每个层包含了三个⼦层:解码器⾃注意⼒、“编码器-解码器”注意⼒和基于位置的前馈⽹络。这些⼦层也都被残差连接和紧随的层规范化围绕

正如在本节前⾯所述,在掩蔽多头解码器⾃注意⼒层(第⼀个⼦层)中,查询、键和值都来⾃上⼀个解码器层的输出。关于序列到序列模型(sequence-to-sequence model),在训练阶段,其输出序列的所有位置(时间步)的词元都是已知的;然⽽,在预测阶段,其输出序列的词元是逐个⽣成的。因此,在任何解码器时间步中,只有⽣成的词元才能⽤于解码器的⾃注意⼒计算中。为了在解码器中保留⾃回归的属性,其掩蔽⾃注意⼒设定了参数dec_valid_lens,以便任何查询都只会与解码器中所有已经⽣成词元的位置(即直到该查询位置为⽌)进⾏注意⼒计算

class DecoderBlock(nn.Module): """解码器中第i个块""" def __init__(self,key_size,query_size,value_size,num_hiddens,norm_shape,ffn_num_input, ffn_num_hiddens, num_heads,dropout, i, **kwargs): super(DecoderBlock,self).__init__(**kwargs) self.i = i self.attention1 = d2l.MultiHeadAttention(key_size, query_size, value_size, num_hiddens, num_heads, dropout) self.addnorm1 = AddNorm(norm_shape, dropout) self.attention2 = d2l.MultiHeadAttention(key_size, query_size, value_size, num_hiddens, num_heads, dropout) self.addnorm2 = AddNorm(norm_shape, dropout) self.ffn = PositionWiseFFN(ffn_num_input, ffn_num_hiddens,num_hiddens) self.addnorm3 = AddNorm(norm_shape, dropout) def forward(self,X,state): enc_outputs,enc_valid_lens = state[0],state[1] # 训练阶段,输出序列的所有词元都在同一时间处理 # 因此state[2][self.i]初始化为None # 预测阶段,输出序列是通过词元一个接着一个解码的 # 因此state[2][self.i]包含着当前时间步第i块解码的输出表示 if state[2][self.i] is None: key_values = X else: key_values = torch.cat((state[2][self.i], X), axis=1) state[2][self.i] = key_values if self.training: batch_size,num_steps,_ = X.shape # dec_valid_lens的开头:(batch_size,num_steps), # 其中每一行是[1,2,...,num_steps] dec_valid_lens = torch.arange( 1,num_steps + 1,device=X.device).repeat(batch_size,1) else: dec_valid_lens = None # 自注意力 X2 = self.attention1(X, key_values, key_values, dec_valid_lens) Y = self.addnorm1(X, X2) # 编码器-解码器注意⼒。 # enc_outputs的开头:(batch_size,num_steps,num_hiddens) Y2 = self.attention2(Y, enc_outputs, enc_outputs, enc_valid_lens) Z = self.addnorm2(Y, Y2) return self.addnorm3(Z, self.ffn(Z)), state

为了便于在“编码器-解码器”注意力中进行缩放点积计算和残差连接中进行加法计算,编码器和解码器的特征维度都是num_hiddens

decoder_blk = DecoderBlock(24, 24, 24, 24, [100, 24], 24, 48, 8, 0.5, 0)decoder_blk.eval()X = torch.ones((2, 100, 24))state = [encoder_blk(X, valid_lens), valid_lens, [None]]decoder_blk(X, state)[0].shapetorch.Size([2, 100, 24])

现在我们构建了由num_layers个DecoderBlock实例组成的完整的transformer解码器。最后,通过⼀个全连接层计算所有vocab_size个可能的输出词元的预测值。解码器的⾃注意⼒权重和编码器解码器注意⼒权重都被存储下来,⽅便⽇后可视化的需要

class TransformerDecoder(d2l.AttentionDecoder): def __init__(self, vocab_size, key_size, query_size, value_size, num_hiddens, norm_shape, ffn_num_input, ffn_num_hiddens, num_heads, num_layers, dropout, **kwargs): super(TransformerDecoder, self).__init__(**kwargs) self.num_hiddens = num_hiddens self.num_layers = num_layers self.embedding = nn.Embedding(vocab_size, num_hiddens) self.pos_encoding = d2l.PositionalEncoding(num_hiddens, dropout) self.blks = nn.Sequential() for i in range(num_layers): self.blks.add_module("block"+str(i), DecoderBlock(key_size, query_size, value_size, num_hiddens,norm_shape, ffn_num_input, ffn_num_hiddens,num_heads, dropout, i)) self.dense = nn.Linear(num_hiddens, vocab_size) def init_state(self, enc_outputs, enc_valid_lens, *args): return [enc_outputs, enc_valid_lens, [None] * self.num_layers] def forward(self, X, state): X = self.pos_encoding(self.embedding(X) * math.sqrt(self.num_hiddens)) self._attention_weights = [[None] * len(self.blks) for _ in range (2)] for i, blk in enumerate(self.blks): X, state = blk(X, state) # 解码器⾃注意⼒权重 self._attention_weights[0][i] = blk.attention1.attention.attention_weights # “编码器-解码器”⾃注意⼒权重 self._attention_weights[1][i] = blk.attention2.attention.attention_weights return self.dense(X), state @property def attention_weights(self): return self._attention_weights6 - 训练

依照transformer架构来实例化编码器-解码器模型。在这⾥,指定transformer的编码器和解码器都是2层,都使⽤4头注意⼒。与 9.7.4节类似,为了进⾏序列到序列的学习,我们在“英语-法语”机器翻译数据集上训练transformer模型

num_hiddens, num_layers, dropout, batch_size, num_steps = 32, 2, 0.1, 64, 10lr, num_epochs, device = 0.005, 200, d2l.try_gpu()ffn_num_input, ffn_num_hiddens, num_heads = 32, 64, 4key_size, query_size, value_size = 32, 32, 32norm_shape = [32]train_iter, src_vocab, tgt_vocab = d2l.load_data_nmt(batch_size, num_steps)encoder = TransformerEncoder(len(src_vocab), key_size, query_size, value_size, num_hiddens, norm_shape, ffn_num_input, ffn_num_hiddens, num_heads,num_layers, dropout)decoder = TransformerDecoder(len(tgt_vocab), key_size, query_size, value_size, num_hiddens, norm_shape, ffn_num_input, ffn_num_hiddens, num_heads,num_layers, dropout)net = d2l.EncoderDecoder(encoder, decoder)d2l.train_seq2seq(net, train_iter, lr, num_epochs, tgt_vocab, device)loss 0.031, 9433.7 tokens/sec on cuda:0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tbx6Bthk-1663076050925)(https://www.yuucn.com/wp-content/uploads/2023/03/1680221029-e8de267006956e9.svg)]

训练结束后,使⽤transformer模型将⼀些英语句⼦翻译成法语,并且计算它们的BLEU分数

engs = ['go .', "i lost .", 'he\'s calm .', 'i\'m home .']fras = ['va !', 'j\'ai perdu .', 'il est calme .', 'je suis chez moi .']for eng, fra in zip(engs, fras): translation, dec_attention_weight_seq = d2l.predict_seq2seq( net, eng, src_vocab, tgt_vocab, num_steps, device, True) print(f'{eng} => {translation}, ', f'bleu {d2l.bleu(translation, fra, k=2):.3f}')go . => va !, bleu 1.000i lost . => j'ai perdu ., bleu 1.000he's calm . => il est calme ., bleu 1.000i'm home . => je suis chez moi ., bleu 1.000

当进⾏最后⼀个英语到法语的句⼦翻译⼯作时,让我们可视化transformer的注意⼒权重。编码器⾃注意⼒权重的形状为(编码器层数,注意⼒头数,num_steps或查询的数⽬,num_steps或“键-值”对的数⽬)

enc_attention_weights = torch.cat(net.encoder.attention_weights, 0).reshape((num_layers, num_heads,-1, num_steps))enc_attention_weights.shapetorch.Size([2, 4, 10, 10])

在编码器的⾃注意⼒中,查询和键都来⾃相同的输⼊序列。因为填充词元是不携带信息的,因此通过指定输⼊序列的有效⻓度可以避免查询与使⽤填充词元的位置计算注意⼒。接下来,将逐⾏呈现两层多头注意⼒的权重。每个注意⼒头都根据查询、键和值的不同的表⽰⼦空间来表⽰不同的注意⼒

d2l.show_heatmaps( enc_attention_weights.cpu(), xlabel='Key positions', ylabel='Query positions', titles=['Head %d' % i for i in range(1, 5)], figsize=(7, 3.5))

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHQ03AqK-1663076050925)(https://www.yuucn.com/wp-content/uploads/2023/03/1680221035-e8de267006956e9.svg)] ​

为了可视化解码器的⾃注意⼒权重和“编码器-解码器”的注意⼒权重,我们需要完成更多的数据操作⼯作。例如,我们⽤零填充被掩蔽住的注意⼒权重。值得注意的是,解码器的⾃注意⼒权重和“编码器-解码器”的注意⼒权重都有相同的查询:即以序列开始词元(beginning-of-sequence,BOS)打头,再与后续输出的词元共同组成序列

dec_attention_weights_2d = [head[0].tolist() for step in dec_attention_weight_seq for attn in step for blk in attn for head in blk]dec_attention_weights_filled = torch.tensor( pd.DataFrame(dec_attention_weights_2d).fillna(0.0).values)dec_attention_weights = dec_attention_weights_filled.reshape((-1, 2, num_layers, num_heads, num_steps))dec_self_attention_weights, dec_inter_attention_weights = dec_attention_weights.permute(1, 2, 3, 0, 4)dec_self_attention_weights.shape, dec_inter_attention_weights.shape(torch.Size([2, 4, 6, 10]), torch.Size([2, 4, 6, 10]))

由于解码器⾃注意⼒的⾃回归属性,查询不会对当前位置之后的“键-值”对进⾏注意⼒计算

# Plusonetoincludethebeginning-of-sequencetokend2l.show_heatmaps( dec_self_attention_weights[:, :, :, :len(translation.split()) + 1], xlabel='Key positions', ylabel='Query positions', titles=['Head %d' % i for i in range(1, 5)], figsize=(7, 3.5))

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sk8cZFRs-1663076050925)(https://www.yuucn.com/wp-content/uploads/2023/03/1680221041-e8de267006956e9.svg)] ​

与编码器的⾃注意⼒的情况类似,通过指定输⼊序列的有效⻓度,输出序列的查询不会与输⼊序列中填充位 置的词元进⾏注意⼒计算

d2l.show_heatmaps( dec_inter_attention_weights, xlabel='Key positions', ylabel='Query positions', titles=['Head %d' % i for i in range(1, 5)], figsize=(7, 3.5))

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zw7NnUJj-1663076050925)(https://www.yuucn.com/wp-content/uploads/2023/03/1680221047-e8de267006956e9.svg)] ​

管transformer架构是为了“序列到序列”的学习⽽提出的,但正如我们将在本书后⾯提及的那样,transformer编码器或transformer解码器通常被单独⽤于不同的深度学习任务中

7 - 小结transformer是编码器-解码器架构的⼀个实践,尽管在实际情况中编码器或解码器可以单独使⽤在transformer中,多头⾃注意⼒⽤于表⽰输⼊序列和输出序列,不过解码器必须通过掩蔽机制来保留⾃回归属性transformer中的残差连接和层规范化是训练⾮常深度模型的重要⼯具transformer模型中基于位置的前馈⽹络使⽤同⼀个多层感知机,作⽤是对所有序列位置的表⽰进⾏转换
本文链接地址:https://www.jiuchutong.com/zhishi/298700.html 转载请保留说明!

上一篇:Maven使用教程(IDEA版)(maven jni)

下一篇:【YOLOv5-6.x】设置可学习权重结合BiFPN(Add操作)(yolov1 实现)

  • 十个营销中常见的用户心理效应(2)(十个营销中常见的渠道)

    十个营销中常见的用户心理效应(2)(十个营销中常见的渠道)

  • 戴尔无线鼠标怎么连接(戴尔无线鼠标怎么充电)

    戴尔无线鼠标怎么连接(戴尔无线鼠标怎么充电)

  • 拼多多如何追加评论(拼多多如何追加订单)

    拼多多如何追加评论(拼多多如何追加订单)

  • 腾讯课堂怎么关闭麦克风权限(腾讯课堂怎么关闭麦克风和摄像头)

    腾讯课堂怎么关闭麦克风权限(腾讯课堂怎么关闭麦克风和摄像头)

  • 微信聊天记录能同步吗(微信聊天记录能保存多久)

    微信聊天记录能同步吗(微信聊天记录能保存多久)

  • 华为荣耀9x屏幕多长(华为荣耀9x屏幕亮度)

    华为荣耀9x屏幕多长(华为荣耀9x屏幕亮度)

  • qq群举报怎么查举报人(怎么查出举报qq群的人)

    qq群举报怎么查举报人(怎么查出举报qq群的人)

  • 为什么安康码显示服务端错误(为什么安康码显示手机号被占用)

    为什么安康码显示服务端错误(为什么安康码显示手机号被占用)

  • 苹果11人脸识别突然失灵(苹果11人脸识别在哪里设置)

    苹果11人脸识别突然失灵(苹果11人脸识别在哪里设置)

  • 苹果屏幕镜像没有反应(苹果屏幕镜像没有画面)

    苹果屏幕镜像没有反应(苹果屏幕镜像没有画面)

  • 扫描件打印算复印件吗(扫描件打出来和复印件一样吗)

    扫描件打印算复印件吗(扫描件打出来和复印件一样吗)

  • 闲鱼收货时间是多久(闲鱼收货是什么意思)

    闲鱼收货时间是多久(闲鱼收货是什么意思)

  • 苹果最小的手机是哪款(苹果最小的手机多少钱)

    苹果最小的手机是哪款(苹果最小的手机多少钱)

  • xr的两个卡槽在什么位置(xr两个卡槽都支持4g吗)

    xr的两个卡槽在什么位置(xr两个卡槽都支持4g吗)

  • word样式设置多级编号(word样式设置多级标题)

    word样式设置多级编号(word样式设置多级标题)

  • vivo手机怎么下载到内存卡(vivo手机怎么下小说到mp4)

    vivo手机怎么下载到内存卡(vivo手机怎么下小说到mp4)

  • 微信电脑版屏幕怎么是横屏(微信电脑版屏幕共享)

    微信电脑版屏幕怎么是横屏(微信电脑版屏幕共享)

  • 苹果广角镜头怎么打开(苹果广角镜头怎么关)

    苹果广角镜头怎么打开(苹果广角镜头怎么关)

  • 京东忘记密码怎么找回(京东忘记密码怎么办验证码没有发到手机上)

    京东忘记密码怎么找回(京东忘记密码怎么办验证码没有发到手机上)

  • 通常我们使用的桌面台式机笔记本电脑被称为(我们常用什么)

    通常我们使用的桌面台式机笔记本电脑被称为(我们常用什么)

  • 淘宝预售商品加购物车能拍到吗(淘宝预售商品加入购物车后又删掉了怎么办)

    淘宝预售商品加购物车能拍到吗(淘宝预售商品加入购物车后又删掉了怎么办)

  • 小米手机导航键设置(小米手机导航键在哪里)

    小米手机导航键设置(小米手机导航键在哪里)

  • 王者荣耀中白起怎么出装?(王者荣耀中白起的台词)

    王者荣耀中白起怎么出装?(王者荣耀中白起的台词)

  • 做大屏的四款可视化工具(大屏制作教程视频)

    做大屏的四款可视化工具(大屏制作教程视频)

  • 不得从销项税中抵扣的进项税大白话
  • 金税三期是什么时候投入使用的
  • 核销 坏账
  • 其他债权投资的汇兑差额计入什么科目
  • 什么是长期股权结构
  • 费用先付款后收到发票做账
  • 资本化利息支出在哪个科目
  • 原始凭证和记账凭证的作用分别是什么
  • 进项税额结转不结转
  • 固定资产超过注册资金怎么处理
  • 收银系统已入库怎么操作
  • 申报财产租赁合同印花税是在什么情况下?
  • 发现财务人员违法怎么办
  • 企业年金税前扣除标准表
  • 税务稽查的四个环节
  • 通行费如何填报表二
  • 快递公司怎么结算
  • 其他收益小企业会计报表没有怎么填
  • 红字冲回怎么做账
  • 外包人员培训费入什么科目
  • 出口的货物因质量问题被扣款
  • 不征税发票如何开具
  • 计提折旧计算公式是什么
  • 会计制度备案成本核算方法一般选择哪个
  • 财务比率分析的主要内容
  • 结算借款的账务处理办法
  • 跨年庆典中燃放的歌曲
  • 残保金的会计处理
  • 图像的生成原理
  • 销售退换货的账务处理
  • gpt参数
  • php判断手机浏览记录数据
  • 支付给境外个人的服务费
  • 购买理财资金来源规定
  • 红字发票信息表编号
  • 生产车间领用材料的会计分录
  • js怎么存储数据
  • 织梦专题页模板
  • 赠品怎么做
  • 残保金滞纳金可以税前扣除吗
  • mysql 5.5.x zip直接解压版安装方法
  • 物业公司广告费收入税率
  • 对外公司
  • 收到服务费发票可以计入什么科目
  • 租赁公司异地经营
  • 去年主营业务收入少计
  • 结转费用后利润怎么算
  • 制造费用的明细账应当按照什么设置
  • 企业被列入经营异常名录可以注销吗
  • 第三季度利润
  • 预付在建工程款的会计分录
  • 社保扣费不成功会再次扣费吗
  • 营业利润包括资本化支出吗
  • 退资本金现金流量表走哪一项
  • 存出保证金计入
  • 管理费用包括哪些税
  • 借款利息怎么记账
  • 关闭默认共享的影响
  • coms恢复出厂设定还原bios设置方法步骤讲解
  • win7系统开机后黑屏只有鼠标指针可以移动
  • 灵活设置成员
  • Fedora Core 5(FC-5)正式版下载
  • cmos是一种什么芯片
  • windows查找命令
  • hpzts04.exe是什么进程 有什么作用 hpzts04进程查询
  • win7任务栏跑到右边了
  • win10周年版
  • nddeagnt.exe - nddeagnt是什么进程 有什么用
  • kmsss.exe是什么
  • win8操作
  • w8系统文件夹怎么设置密码
  • cocoscreator lua
  • cocos2dx官方文档
  • 快速掌握一个方法
  • unity3D游戏开发
  • python-pip安装
  • jquery移动版
  • javascript脚本大全
  • 设计服务属于什么税目
  • 宿迁市国家税务局徐友谅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设