序列数据是由一组相互关联的样本组成的数据,其中任意样本对应的标记是由其自身和其他样本共同决定的;序列数据任务 是输入或输出为序列数据的机器学习任务,用传统机器学习模型处理他们是困难的,比如 序列模型(1)—— 难处理的序列数据 中第 3 节的例子one-to-one 模型,即一个输入一个输出。这种模型会把序列数据作为一个整体来考虑,其输入输出的尺寸必须是固定的,比如输入一张固定尺寸的图像输出其类别,或者输入一段固定长度的句子预测下一个词
Note:借助一些手段,可以强行用传统模型处理变长的输入输出问题,如 各种监督学习范式(强监督、半监督、多标记、偏标记、多示例、多示例多标记、标记分布...) 中的多示例多标记问题,但是这些模型本质上还是要将输入输出处理成固定的长度(比如用固定长度的 0/1 向量选出不同数量的样本作为输入输出)。至于样本间的关系,虽然可以通过网络自己学出来,但由于缺乏考虑这种关系的显式结构,所以很难学得好(可以参考 从模型容量的视角看监督学习)
many-to-many 模型,即支持可变长度的输入输出,并且最好能对序列样本间的关系进行显式建模,注意这样的模型也可以直接用来处理 one-to-many,many-to-one 甚至 one-to-one 问题。语音识别、本文情感分析、序列预测等等序列任务都能被这种模型更好地处理
RNN 就是一种良好的序列模型,下图给出了各类输入输出情况下的 RNN 结构![]()
注意这里的每一列都是不同时刻下的同一个模型,可见,模型的每个隐状态都表示 “当前位置之前的 '已见序列片段' 的特征”,具体应用时
传统监督学习任务(many-to-one),常将序列模型作为 “特征提取器”,只使用最后一个隐状态 $\pmb{h}_t$ 作为整个序列的特征向量,用它接一个分类头或回归头作为整个模型的输出。在训练时,只要像图像分类等普通监督学习任务一样训练即可标准语言模型任务 (one-to-many),即不断根据之前序列样本预测下一个样本值的任务,通常会如下图所示做 Autoregress,这时我们会增加一个分类头或回归头将隐状态 $\pmb{h}$ 变换为输出 $\pmb{x}$,推断时不断地将上一步模型输出合并到下一步模型的输入中。在训练时,会构造很多以连续的 n 个样本作为输入,紧接着第 n+1 个样本作为标签的自监督样例,详见下文 1.4.1 节Seq2Seq 任务(many-to-many),通常使用 Encoder-Decoder 结构。这时 Encoder 就是类似 1 中的 many-to-one 序列特征提取器,Decoder 就是类似 2 中的 one-to-many 序列生成器,Encoder 提取的特征作为 Decoder 的初始 seed,二者结合就能做 many-to-many 了。训练时通常用 teacher-forcing 形式,详见下文 1.4.2 节
具体而言,设隐藏层激活函数为 $\phi$,$t$ 时刻输入批量大小为 $n$ 样本维度为 $d$ 的小批量样本 $\pmb{X}t\in \mathbb{R}^{n\times d}$,设隐藏变量维度为 $h$,前一个时刻的小批量隐层变量为 $\pmb{H}{t-1}\in\mathbb{R}^{n\times h}$。引入模型的权重参数 $\pmb{W}{xh}\in \mathbb{R}^{d\times h}, \pmb{W}{hh}\in \mathbb{R}^{h\times h}$ 和偏置参数 $\pmb{b}h\in \mathbb{R}^{1\times h}$,则该步的隐藏变量 $\pmb{H}t\in\mathbb{R}^{n\times h}$ 可以如下计算
$$
\begin{aligned}
\pmb{H}t
&= \phi(\pmb{X}t\pmb{W}{xh}+\pmb{H}{t-1}\pmb{W}{hh}+\pmb{b}h) \
&= \phi\left({\left[ \begin{array}{ccc}
\pmb{X}t & \pmb{H}{t-1}
\end{array}
\right ]}
{\left[ \begin{array}{ccc}
\pmb{W}{xh}\
\pmb{W}{hh}
\end{array}
\right ]}+\pmb{b}h\right) \
\end{aligned}
$$ 再设输出维度为 $m$,用于输出的 FC 层参数为 $\pmb{W}{hm}\in\mathbb{R}^{h\times m}, \pmb{b}_m\in\mathbb{R}^{1\times m}$,该步的输出变量 $\pmb{O}_t\in\mathbb{R}^{n\times m}$ 可以如下计算
$$
\pmb{O}_t = \pmb{H}t \pmb{W}{hm} + \pmb{b}_m
$$ 注意在不同的时间步使用的都是相同的模型参数 $\pmb{W},\pmb{b}$,因此 RNN 的参数开销不会随着时间步的增加而增加
这个结构看上去很复杂,不过我们可以从先从宏观角度来理解:相比 RNN,LSTM 针对序列数据性质增加了对数据处理过程的限制,从而减少了模型的弹性/容量,使它能在使得相同样本量下更好地提取序列信息,这和 CNN 比 MLP 能更好地处理图像数据是一个道理
记忆单元cell $\mathbf{C}$,它和隐状态 $\mathbf{H}$ 具有相同的形状,用于记录附加的信息并产生输出 $\mathbf{H}$,其他的所有门都是为了控制这个记忆单元服务的。具体而言,设隐藏层维度为 $h$,batch size 为 $n$,样本维度为 $d$,则批量输入为 $\mathbf{X}t \in \mathbb{R}^{n \times d}$,前一时刻隐状态为 $\mathbf{H}{t-1} \in \mathbb{R}^{n \times h}$
Stacked RNN/Stacked LSTM,其容量更大,能表示的映射关系也更加复杂,如下图所示
需要注意的是,对于更大容量的模型,需要提供更多的训练样本以避免过拟合梯度消失:参数更新梯度被近期样本主导(和 MLP 里的梯度消失不太一样)梯度爆炸:参数更新梯度梯度趋近 $\infin$这个 RNN 的任务是根据先前序列预测下一个单词,在 $x_1$ 处输入了 “China”,但由于梯度消失这个信息几乎没法被记住,模型难以在相隔较远的 $h_{t+1}$ 处给出 “Chinese” 的预测LSTM 通过引入 “记忆单元” 缓解了这些问题,但依然无法完全解决。一个简单粗暴的优化方案是直接同时从两个方向训练 RNN 或 LSTM,这样得到的这里模型大概能学到应该输出一个语言,但是具体是什么语言会被近期序列的倾向所主导
Bidirectional RNN/Bidirectional LSTM 结构如下
这样一来,一个方向的早期样本就成了另一个方向的近期样本,可以缓解 RNN/LSTM 的遗忘问题。另外这里输出的 $y$ 是两个模型输出的向量拼接,它也可以像上面那样进行 stack 从而扩展容量
预训练pre-train 过程,几个注意点是
微调fine-turn 过程
many-to-one 形式的,但是通过巧妙的应用,其能处理的问题涵盖了 one-to-many,many-to-one 和 one-to-one 所有情况,下面简单举两个例子进行说明many-to-one 的形式,另外由于输入长度必须固定,某种程度上也能看做 one-to-one 形式
换个角度看,此模型也可理解为先用序列模型提取前驱序列的特征(RNN/LSTM 视角下就是隐变量),再用这个特征做多分类来选择生成下一个 token,直接把这两件事放在一起进行 end-to-end 的训练
随便给定一个种子向量代表前驱序列特征,再给一个起始 token,模型就能输出后继 token 和新的隐状态,再将后继 token 作为输入就能继续生成,不断重复下去就能生成无限制长度的序列,这就是所谓的 “Autoregress”。总体上看属于 one-to-many 形式to-one 任务的模型完成 to-many 任务。监督学习模型基本都是 to-one 的,所以借助这个结构,我们甚至可以用 MLP 等八竿子打不着的模型来做文本生成,但由于这些网络缺乏对于序列任务的归纳偏置,提取序列特征的能力差,效果通常很差。可以参考 序列模型(1)—— 难处理的序列数据many-to-many 问题,机器学习中也称这种任务为 “Seq2Seq” 任务。为了让 RNN/LSTM 有能力处理这类问题,模型要设计成特殊的 “编码器-解码器架构”。正如其名,这种架构含有两个组件
编码器Encoder:接受一个长度可变的序列作为输入, 并将其转换为具有固定形状的编码状态,即从输入序列中提取一个特征向量。原始的 RNN/LSTM 可以完成这种 many-to-one 的任务,但特征向量中不可避免地会损失长跨度样本的信息,这也是后面出现注意力机制的重要原因解码器Decoder:将固定形状的编码状态映射到长度可变的序列。这恰好是上面 1.4.1 节那种 one-to-many 任务,所以 Decoder 也可以看做使用 Encoder 编码特征作为初始种子特征向量的自动文本生成任务。为了能自动控制输出长度,通常要增加 “起始” 和 “终止” 两个特殊 token

many-to-one 和 one-to-many 的两个组件真正实现了 many-to-many 任务

可见当句子长度超过 20 词时,传统序列模型翻译的 BLEU 评分会迅速下降,增加 attention 机制后问题解决
Note:$\pmb{c}$ 可以作为附加信息和 $\pmb{s}$ 一起作为解码器输入;也可以完全不用 $\pmb{s}$ 只依靠 $\pmb{c}$ 和输入 token $\pmb{x}'$ 进行解码,因为 $\pmb{c}$ 中已经包含了从来自原始序列所有样本的特征将这样的 attention 机制加入 RNN/LSTM Encoder-Decoder 结构,如下
相比原始 RNN/LSTM Encoder-Decoder,差别仅在于多了一个上下文向量 $\pmb{c}_i$ 作为解码的附加信息(下图显示了注意力汇聚过程和附加输入结构,忽略了注意力计算过程)
注意力评分函数 $a$,计算输入 Decoder 的隐状态 $\pmb{s}_j$ 和 Encoder 的所有样本输出 $\pmb{h}_1,...,\pmb{h}_m$ 的注意力得分 $\alpha_1,...,\alpha_m$,这个得分体现的是 $\pmb{s}_j$ 和 Encoder 各个输出 $\pmb{h}_i$ 的相关性
$$
\alpha_i = a(\pmb{h}_i,\pmb{s}_j)
$$上下文向量,直接将其作为解码 $\pmb{s}$ 时输入 RNN Decoder 的附加信息即可
$$
\pmb{c}j = \sum{k}\alpha_k \pmb{h}_k
$$查询向量query $\pmb{q}$键向量key $\pmb{k}$值向量key $\pmb{v}$
加性注意力additive attention,它允许 $\pmb{q}$ 和 $\pmb{k}$ 是不同长度的向量(事实上原始论文中的 $\pmb{q}$ 和 $\pmb{k}$ 就是 $\pmb{s}$ 和 $\pmb{h}$ 本身),给定 $\pmb{q}\in\mathbb{R}^q, \pmb{k}\in\mathbb{R}^k$,注意力得分为
$$
a(\mathbf q, \mathbf k) = \mathbf w_v^\top \text{tanh}(\mathbf W_q\mathbf q + \mathbf W_k \mathbf k) \in \mathbb{R},
$$ 其中可学习的参数包括 $\mathbf W_q\in\mathbb R^{h\times q}, \mathbf W_k\in\mathbb R^{h\times k}, \mathbf w_v\in\mathbb R^{h}$缩放点积注意力scaled dot-product attention,它的计算效率更高,但要求 $\pmb{q}$ 和 $\pmb{k}$ 是相同长度的向量。假设查询和键的所有元素都是独立的 $d$ 维随机变量, 且都是均值0方差1,那么两个向量的点积的均值为0方差为$d$,将点积除以 $\sqrt{d}$ 使其方差为1,注意力得分为
$$
a(\mathbf q, \mathbf k) = \frac{\mathbf{q}^\top \mathbf{k}}{\sqrt{d}}
但这种能力是有代价的,设输入序列长 $m$,输出序列长 $t$,对传统模型引入 attention 机制会使计算复杂复从 $Q(m+t)$ 大幅上升到 $Q(m\times t)$
值得注意的是,这种和传统序列模型结合的 attention 在 transformer 语境中被称为 cross attention,用来强调 attention 计算发生在 Decoder 和 Encoder 之间
这里 $\pmb{h}$ 代表隐状态,而且在更新隐状态计算时直接用汇聚向量 $\pmb{c}$ 代替 $\pmb{h}$ 使用
值得注意的是,这种和传统序列模型结合的 self-attention 在 transformer 语境中被称为 masked self-attention,它其实只关注了句子中该 token 之前的部分

btw,这个 RL 优化方法总体可以分两阶段ChatGPT 很会一本正经地胡说八道,其实也是那个 IRL 方法固有问题的体现
- 用我以前介绍过的 论文理解【IL - IRL】 —— Deep Reinforcement Learning from Human Preferences 这个 “从人类偏好中学习的” IRL 方法学出奖励
- 用 PPO 优化
左边是 Encoder,它是一个自编码器,可以数据序列中提取特征;右边是 Decoder,它是一个自回归器,可以生成目标序列。从整体上看,Transformer 的外部输入输出和过去基于 RNN 等传统序列模型的 Encoder-Decoder 模型完全一致。请看图中数字编号

- 有人可能会疑惑为什么两个 embedding 是相加关系,这是因为之前 Input Embedding 的具体操作是先把原始 token 都转换为的 one-hot vector 表示,再用一个矩阵做线性变换到嵌入维度,而原始 token 的 one-hot vector 直接 concat 一个位置的 one-hot vector,再一起做线性变换到嵌入维度,就等价于分别做线性变换再加起来
- 这里位置信息的嵌入向量是用一个公式计算出来的,思想来自数的二进制表示,可以参考 Transformer 修炼之道(一)、Input Embedding。这个计算出来的嵌入不一定是最好的,后面比如 BERT 里就是让网络自己学出来的了
- 下图显示了一个 self-attention 头的计算过程,每个token 都得到了它对应的一个汇聚向量,注意这个汇聚向量的维度可以和 token embedding 不同
- 所谓 “动态嵌入特征”,是指 token 的这个特征受到了它所处句子中其他 token 的影响。举例来说,如果训练材料是描述农业种植的,那么 “苹果” 这个 token 的嵌入特征向量和 “香蕉” 的距离,会小于 “苹果” 和 “手机” 的距离;而如果训练材料是描述电子产品的,则正好相反。这种词向量的动态嵌入能力也是现代序列模型相对传统序列模型的一大优势
- 这里的多头注意力,可以类比 CNN 中同时使用多个滤波器的作用,每个注意力头,只关注一个独立的 “表示子空间”。举例来说,当你浏览网页的时候,你可能在颜色方面更加关注深色的文字,而在字体方面会去注意大的、粗体的文字。这里的颜色和字体就是两个不同的表示子空间。同时关注颜色和字体,可以有效定位到网页中强调的内容。使用多头注意力,也就是综合利用各方面的信息/特征
- 可以用下图来描述整个多头自注意力层的处理过程
- 下图显示了 cross attention 的计算过程
- 下图显示了宏观连续形式,最后一个 Transformer Encoder Block 的输出被连接到所有 Transformer Decoder Block 上
- 需要注意的是,为了实现全并行,Decoder 必须进行 teacher-forcing 形式的训练,而我们最后想让 Decoder 做 autoregress,所以这样学到的模型会有一点偏差,请参考 关于Teacher Forcing 和Exposure Bias的碎碎念。虽然也可以直接让 Decoder 做 autoregress 形式的训练,但是这样就没法并行了
- 另外,训练完做推理时还是串行的,因为 autoregress 本身就是一个串行的行为
其中 BERT 和 Transformer Encoder 结构完全一致;GPT 是 Transformer Decoder 去掉 cross-attention 和最后的多分类头之后的部分,这样处理之后,二者结构上的区别仅在于 BERT 使用 self-attention 层,而 GPT 使用 masked self-attention 层。由于模型结构上没有什么新东西,这里就不再过多分析了
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
有没有办法快速将表格格式的ruby哈希打印到文件中?如:keyAkeyBkeyC...1232343451253474456...其中散列的值是不同大小的数组。还是使用双循环是唯一的方法?谢谢 最佳答案 试试我写的这个gem(在表中打印散列、ruby对象、ActiveRecord对象):http://github.com/arches/table_print 关于ruby-如何以表格格式快速打印Ruby哈希值?,我们在StackOverflow上找到一个类似的问题:
电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑
mutationtesting遇到一个问题是它很慢,因为默认情况下您会为每个生成的突变执行完整的测试运行(测试文件或一组测试文件)。加快突变测试的一种方法是,一旦遇到单一故障(但仅在突变测试期间),就停止对给定突变体的测试运行。更好的做法是让变异测试者记住杀死最后一个变异体的第一个测试是什么,并将其首先交给下一个变异体。ruby中是否有任何东西可以做这些事情,或者我最好的选择是开始猴子修补?(是的,我知道单元测试应该很快。显示所有失败的测试在突变测试之外很有用,因为它不仅可以帮助您识别出问题,还可以查明哪里出了问题)编辑:我目前正在对测试/单元使用heckle。如果测试/单元不可能记住
我正在使用RubyonRailsv3.0.9,我想“转换”一个句子中的字符串数组,包括标点符号。也就是说,如果我有如下数组:["element1","element2","element3"]我想得到\构建:#Note:Iadded'Elementsare:'atthebegin,','betweenelementsand'.'at#theend."Elementsare:element1,element2,element3."我该怎么做? 最佳答案 Rails有Array#to_sentence与array.join(',')相同
我有两个类:1.Sale是ActiveRecord的子类;它的工作是将销售数据持久保存到数据库中。classSale2.SalesReport是一个标准的Ruby类;它的工作是生成和绘制有关销售的信息。classSalesReportdefinitialize(start_date,end_date)@start_date=start_date@end_date=end_dateenddefsales_in_durationSale.total_for_duration(@start_date,@end_date)end#...end因为我想使用TDD并且我希望我的测试运行得非常快,所
我正在寻找一个快速、无需配置的FTP服务器。完全像Serve的东西或Rack_dav,但对于FTP,它可以通过运行命令来发布文件夹。是否有gem或其他东西可以做这样的事情?解决方案基于Wayne的ftpdgem,我创建了一个快速且易于使用的gem,名为Purvey. 最佳答案 ftpdgem支持TLS,并带有文件系统驱动程序。与em-ftpd一样,您提供一个驱动程序,但该驱动程序不需要做太多事情。这是一个最低限度的FTP服务器,它接受任何用户名/密码,并提供临时目录中的文件:require'ftpd'require'tmpdir'c
给定两个字符串,我想确定它们是否是彼此的变位词。这是我想出的解决方案:#outputmessagesdefanagramputs"Anagram!"exitenddefnot_anagramputs"Notananagram!"exitend#mainmethodif__FILE__==$0#readtwostringsfromthecommandlinefirst,second=gets.chomp,gets.chomp#specialcase1not_anagramiffirst.length!=second.length#specialcase2anagramiffirst==s
快速求三阶矩阵的逆矩阵前言一般情况下,我们求解伴随矩阵是要注意符号问题和位置问题的(如下所示)A−1=1[ ][−[ ]−[ ]−[ ] −[ ]]=A−1=1[ ][ M11−[M12] M13−[M21] M22−[M23] M31−[M32] M33]⊤\begin{aligned}&A^{-1}=\frac{1}{[\\]}\left[\begin{array}{cccccc}&-[\\]&\\-[\\]&&-[\\]\\\\&-[\\]&\\\end{array}\right]=\\\\&A^{-1}=\frac{1}{[\\]}\left[\b
以前我们经常打趣说:***,你out了!当然了,玩笑成分居多。但是如果作为一名技术人员,现在还没有听说过ChatGPT,那么你可能真的“out”了。比尔·盖茨说,ChatGPT的重要性堪比互联网的发明,甚至它“将改变我们的世界”。ChatGPT得到科技界大佬的如此推崇,那么,ChatGPT到底是什么?ChatGPT是2022年11月底,美国OpenAI公司推出的一款人工智能聊天机器人。两个月后,ChatGPT的月活用户已经突破1亿,成为有史以来增长速度最快的消费者应用程序。ChatGPT功能极其强大,它能够通过学习和理解人类的语言进行对话,还能根据上下文进行互动,实现像人类一样的聊天交流。除了