decoder和encoder,decode是什么函数

http://www.itjxue.com  2023-01-17 22:25  来源:未知  点击次数: 

英文“detect h/w decoder/encoder ”是什么意思?

detect h/w decoder/encoder

检测h/w译码器/编码器

KMPlayer里的H/W色彩控制和S/W色彩控制的区别:

视频解码器是对不同格式的视频进行解码后可以在播放器上播放,譬如“暴风影音”带有非常多的视频解码器,因而可以播放多种不同格式的视频文件。

1.首先按F2打开Kmplayer设置窗口,找到视频处理:

2.然后在右边影像滤镜选项卡下的使用条件下拉列表中选择“总是推荐”,这一步非常重要,在开启滤镜条件下才能调用渲染器和调节各项声画控制,比如S/W 色彩控制,H/W 色彩控制,基本亮度(Ctrl+Page Up/Down),音量放大(Shift+Page Up/Down)等,否则调节无效。

3.再在渲染器选项卡下的视频渲染器下拉列表中选择 渲染模式 为“VMR9 Renderless(高质字幕)”或“增强食品渲染器 (C/A)”任一项皆可。

4.接下来在渲染器选项卡下勾选VMR未渲染设置下拉框中的 “使用 3D 纹理表面”,除此外也可勾选“强制在 VMR 未渲染模式中输出使用 RGB (HQ)” 、“开启 VMR9 混合模式”和VMR9 的尺寸调整器下拉框中的其他选项。后面这3项是可选项,不选也可,选了或许能增强效果。

decoder 和coder 在英语解释及用法方面什么区别,还有从计算机用法上面有什么区别?

coder (n.)

1. code的变形

2. 编码员;编码器

decoder (n.)

1. 译码员

2. 解码器,译码器,解读暗号器

3. 【计算机】译码器

编码器(coder, encoder)是将信号(如比特流)或数据编制、转换为可用以通讯、传输和存储之形式的设备。

译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义“翻译”出来的过程叫做译码,实现译码操作的电路称为译码器。或者说,译码器是可以将输入二进制代码的状态翻译成输出信号,以表示其原来含义的电路。

仅供参考,O(∩_∩)O~

Encoder-Decoder模型

编码的过程和解码的过程使用RNN实现,由于RNN存在梯度消失和梯度爆炸问题,因此通常引入LSTM。首先,编码(encode)由一个编码器将输入词序列转化成一个固定维度的稠密向量,解码(decode)阶段将这个激活状态生成目标译文。

encoder部分利用RNN压缩表示的性质。首先将源语言句子的每个词表示成一个向量,这个向量的维度与词汇表大小V相同,并且向量只有一个维度有值1,其余全都是0,1的位置就对应该词在词汇表的位置。这样的向量通常被称为one-hot向量,或者说1-of-K coding,它与词典的词一一对应,可以唯一的表示一个词,但是这样的向量实用,因为:

decoder部分同样适用RNN实现,

encoder-decoder模型虽然非常经典,但是局限性也非常大。最大的局限性就在于编码和解码之间的唯一联系就是一个固定长度的语义向量C。也就是说,编码器要将整个序列的信息压缩进一个固定长度的向量中去。但是这样做有两个弊端,一是语义向量无法完全表示整个序列的信息,还有就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息,

那么解码的准确度自然也就要打个折扣了

自然语言生成工具箱 - VAE-LSTM

【AAAI-2018】 A Deep Generative Framework for Paraphrase Generation

文章主题是实现具有相同释义的短语对生成,作者利用LSTM作为语义学习器,结合VAE实现文本生成。VAE的encoder和decoder都以原短语的语义向量(向量也可能包括语言风格)作为条件,确保生成的文本和原短语语义相近。由于VAE的文本生成是利用隐变量采样的方式实现,相比于基于beam search的方法效果更好。

释义(短语)生成是典型的NLG问题,并且正越来越多的被应用于QA,翻译等场景(QA场景更多的是进行问题归一化或者对齐,翻译场景更多的是数据增广,当然还有其他场景和用户)。

原有的短语生成方法,主要包括seq2seq和生成模型两大类型。之前的VAE(生成模型)是非条件语句生成模型,也就是说没有把原短语当做条件,这样的生成结果很难保证语句释义符合预期。另外一些方法,例如residual LSTM结构过于复杂。并且,由于beam search方法随着top k变大,效果会变差,导致不能够通过增大beam的宽度,来简单地生成关于原短语的多个高质量释义。

作者提出结合VAE和LSTM。宏观上模型是一个VAE,这样可以利用采样隐向量 的方式生成多个与原短语相似的多个释义。具体结构如下图所示,其中 分别是原短语和释义短语的向量表示, 是模型的隐向量模型(encoder), 是释义生成模型(decoder)。值得注意的是,无论是encoder还是decoder,模型都基于原短语向量 。实现了作者所说的,基于原短语进行释义,确保生成结果保留原短语的意思。

微观上模型是模型是4个LSTM和1个VAE,具体结构如下图所示。其中,encoder和decoder都包含两组LSTM,左侧的原短语模型(original sentence encoder/decoder)表示的是学习原短语的语言模型。可以看到,该模型学习得到的状态 ,当做初始state向量,都输入给了释义右侧的释义短语模型(paraphrased sentence encoder/decoder)。值得注意的是,这个状态输入的操作是在VAE的encoder和decoder两边都有的,与上述两边同时基于原短语(condition on original sentence)的语义相呼应。

此外,encoder阶段的2个LSTM完成之后,结果经过一个FFN,得到VAE的 ,这两个参数被用来采样 ,采样后的 输入到decoder中释义短语模型的每一个生成步骤中(和上一步的输出向量拼接),实现了模型的解码生成。如前所述,经过多次采样 可以生成多个释义语句,并且由于每次都是在隐向量空间中采样,而不是放宽beam search的宽度,理论上都是top beam,所以生成的语句的效果是不会打折扣的。

把原短语作为条件有点像是conditional GAN的感觉。普通的GAN可以任意生成,没有条件约束。conditional GAN把一些结构和形状、或者颜色等特征当做条件,实现有目标的(或者约束的)图像生成。文章中,作者把VAE的编码器和生成器中都加入了原短语的语义向量作为条件,目的也是指导生成的方向。从这个角度说,让人想到CVAE。

作者提到了KL-term退火以及dropout等训练VAE相关的trick,都比较有用,感兴趣的可以参考[1]。

[1] Bowman, S. R.; Vilnis, L.; Vinyals, O.; Dai, A. M.; Jozefowicz, R.; and Bengio, S. 2015. Generating sentences from a continuous space. arXiv preprint arXiv:1511.06349.

理解Bert

离开深度学习瞎折腾了一段时间后,我终于又回来了。

于是赶紧回顾了下18年之后NLP的发展,基本就是将迁移学习更广泛的用于NLP领域,以及把17年年底的《Attention is all you need》里的思想给发扬光大了,ELMO弥补了传统word2vec多义词表示的不足,GPT使用更强大的特征提取器Transformer取代LSTM,Bert使用双向Transformer进一步改进了GPT成为这两年发展的集大成者。

从Bert模型所带来的NLP界里程碑式的影响和所取得的成就来看,无疑Bert将会是未来两三年NLP应用发展的基石,于是有必要仔细的看看其模型的结构,数据是如何流动的,训练的和测试的。

不得不说现在的学习环境相对几年前好太多了,本文主要参考了以下几篇文章,然后加了点自己的理解:

Dissecting BERT Part 1: The Encoder

The Illustrated Transformer

Dissecting BERT Appendix: The Decoder

它的总体框架同lstm时代的MNT或者是attention is all you need中的 transformer 一样的 encoder-decoder 结构:

我们先来介绍一下Encoder部分。

为了理解这个架构,我们使用一个简单的具体的例子,来看一下 输入 的数据是怎么通过 encoder 一步一步变化让后到 输出 的。

bert的词嵌入由三个嵌入token embedding、segment embedding,和position embedding叠加而成。

这个过程跟以往的RNNs没什么区别,比如给定一个句子:

第一步是先将其标记化:

然后是数字化,将每个标记映射到语料词汇表中的唯一整数编号:

接下来就是得到序列中每个词的词嵌入,也就是将整数映射到一个 维的向量,这个向量是模型在训练时学习的,你可以将其视为一个查表的过程,这些向量的元素作为模型的参数,像其他权重一样通过反向传播进行了优化。

在论文中是使用WordPiece tokenization 来将英文单词转换成768( )维的向量,转化的过程类似这样:

把每个词的向量放到一起,就得到了一个 句子长度x向量维度 ( ) 尺寸的矩阵 Z :

说明一点,我们通常使用 填充 的方式来让输入序列具有相同的长度,比如通过添加"pad" 标记来增加某些序列的长度,还是前面的例子,填充后可能变为:

如果设定 设定为9,那我们就把句子从5填充到了9。

但是,上面的embedding并没有包含词的位置信息。于是,我们的目标是能够根据词在句子中的位置适当调整这个向量,使它带上位置信息。

作者选择的方法是使用预定的(非学习的)正余弦函数将 之间的数字加到前面的embedding中,即通过正余弦函数将位置表示为彼此的线性组合,从而实现网络学习中标记位置之间的相对关系。在Token embedding 获得的矩阵 的基础上加上位置矩阵 。

数学上,用 表示序列中标记的位置,用 表示token embedding特征向量中的位置:

具体来说,对于给定的句子 ,其位置嵌入矩阵为:

作者解释说,使用这种确定性方法的结果和学习位置表示(就像我们对词嵌入那样)的结果差不多,因此这样反而会有一些优势:

因此,添加了位置信息之后的矩阵是:

它是第一个encoder块的输入,尺寸是

共有N个编码器块连接在一起直到生成编码器的输出,特定的块负责查找输入表示之间的关系并将编码在其输出中。

直观地,通过这些块的迭代过程将帮助神经网络捕获输入序列中的词之间的更加复杂的关系,你可以把它理解成一个整体用来捕捉输入序列的语义。

encoder中使用Transformer的多头注意力机制,这意味着它将计算 份不同权重矩阵的自注意力,然后将结果连接在一起。

这些并行注意力计算的结果称之为Head,我们用下标 来表示一个特定的head和相关的权重矩阵。

如上图所示,一旦计算了所有head,它们将被连接起来,得到一个尺寸为 的矩阵,然后将它乘以一个尺寸为 的权重矩阵 进行线性变换,就得到了一个尺寸为 的最终结果,用数学公式表示就是:

其中的 通过 乘以相应权重矩阵 获得,我们通过一个简单的例子来可视化的看一下这个过程。

这图描绘了输入标记通过 token embedding 和 positional encoding ,再输入到Encoder:

接下来,我们再来看下Encoder中的操作过程,先看一下单头的self-attention:

上图描绘了一个Head的 是怎么来的,其中的 的尺寸是 , 因为Q和K需要计算相似性,所以维度应当是相同的, 的尺寸是 , 的维度可以相同也可以不同,在论文中 .

所谓的自注意力,就是 与 的点积进行 的缩放之后通过softmax获得一个概率权重,然后用这些权重分别乘以各自的 即可:

为了加深理解,我们选择其中一个头,通过图形继续可视化的看一下这个变化过程:

然后计算self-attention,

多头的话就是同时有多个上述计算过程在进行:

假设我们有8个Head,那么我们就获得8个 :

但是,显然前馈层只需要一个矩阵 ,怎么处理呢?类似多卷积核的处理,把这8个矩阵连起来,乘以一个权重矩阵 压缩到一个矩阵。

为了有一个更加全面直观的认识,我们把上面整个过程放到一个图里,

显然,第二个encoder块是不需要embedding过程的,只要把第一个encoder块的输出作为输入即可。

经过上面的介绍,你应该对这个过程已经有了足够的了解,但是,为什么可以利用向量点积来计算注意力概率呢?

于是让我们进一步深入来了解其中的原理。

这个结构体系的关键在于:

也就是每个词的q向量与每个词的k向量的点积,套用点积公式:

这意味着 和 的方向越相似,长度越大,点积就越大。词与此之间关联越大,对于理解这个词时得到的关注越大,跟我们的本意是相同的。

我们再看一下最开头的结构示意图,每个encoder块在Multi-Head Attention之后经过一个 Add Norm层才进入下一个块。于是我们来看一下这一层做了些什么。

Add 实际就是一个残差连接,将输出加上输入,这个在每一块的self-attenton以及FFN之后都会有,然后跟随一个Layer Norm 。

Norm 是一个Layer Normlization,将 正则化,就是把它缩放到一个均值为0方差为1的域里。因为

不过一般在这一层之前,就会有一个dropout层。

每个encoder块都由 mulit-head atteion add Norm feed forword network add Norm 这样一个过程,下面来介绍一下这个Feed-Forward Network。

这是一个全连接层,包含两个线性变化和一个非线性函数(实际一般就是ReLu),

对于输入的 (尺寸为 ) ,通过权重矩阵 (尺寸为 )和偏置 线性变换到隐藏层 (尺寸为 ) ,然后**ReLu **激活 ,记下来再用权重矩阵 (尺寸为 ) 和偏置 的线性变换到输出层(尺寸为 ) ,表示成数学公式就是:

在最后一个encoder块输出之后连接到decoder。

Decoder和Encoder的结构是类似的,但是因为可视信息的不同,又有所差别。

Transformer解决的是翻译的问题,将一个句子翻译成另一种语言,我们希望模型能够捕捉到输入句子中词之间的关系,并且将输入句子中包含的信息与每一步已翻译的内容结合起来。继续上面的例子,我们的目标是把一个句子从英文翻译为西班牙文,这是我们获得的序列标记:

我们同之前一样来看看输入到输出数据是如何流动的。

这是我们的解码器的输入标记:

然后这是解码器的期望输出:

但是,这里存在一个问题,比如输入这边我们已经看到了'como' 的后面是'estas', 然后再用它来预测'estas' ,这显然是不合理的,因为模型在测试的时候是看不到后面的词的。

因此,我们需要修改注意力层,防止模型可以看到预测词右边的信息,与此同时,它能利用已经预测的词,即左边的信息。

继续上面的例子,我们将输入标记转换成矩阵的形式,并添加位置信息:

和encoder一样,decoder块的输出也将是大小为 的矩阵,在逐行线性变换+softmax激活后,将生成一个举证,其中每行的最大元素表示下一个单词。也就是说,分配"SS" 的行负责预测“Hola”, 分配"Hola"的行负责预测"," ...以此类推。比如,为了预测"estas", 我们将允许该行直接和下图中绿色区域互动,而不能和红色区域互动:

但是,在我们使用多头注意力机制的时候,所有的行都会产生交互,因此需要在输入的时候添加遮罩,这个遮罩会在注意力计算之后进行:

这是 self-attention 的计算结果:

然后我们在此基础上添加遮掩,就是把矩阵上三角的位置全部设置为 :

于是,在进行softmax激活之后,矩阵就变成了:

恰好达到了我们的要求,那些需要在训练时忽略的右侧的词的注意力全部变成了0。

当将这个注意力矩阵与 相乘时,预测的词就是模型可以访问元素右边的元素。注意,这里的多头注意力输出将是 维的,因为它的序列长度是 。

这个就是 Decoder 从 target序列 的输入,并经过 Masked Multi-Head Attention 的一个变化得到了 ,decoder的还有一部分输入来自于源语句经过 Encoder 的最终输出 (尺寸是 )。

接下来,就是与encoder一样的 Multi-Head Attention Add and Layer Norm - FFN 的过程。

只不过,现在的 来自于 ,而 来自于 :

计算每个query相对于key的注意力之后,得到的是一个 的矩阵, 继续咱们的例子,比如注意力矩阵为:

如上图所见,这个注意力是当前Decoder输入与Encoder输出的每个词之间的注意力,咱们用这个矩阵再乘以 ,就得到了一个 的矩阵,每一行代表了源语句相对于当前输入词汇的特征:

h个Head连接起来,尺寸变为 ,它通过 的权重矩阵 线性变换到一个 的输出。

这在多个Decoder之后,最后输出的矩阵通过乘以权重矩阵 ( ) 进行线性变换,变换之后再对每一行的向量softmax, 其中选择值最大位置对应词表索引的词就是预测的词。

损失的话只需要用预测的每个词向量与真实的词的one-hot词表示计算交叉熵即可。

(责任编辑:IT教学网)

更多

相关编程综合文章

推荐编程综合文章