参与AI开发的培训,需要多久才可以完成呢?我们一起来了解一下。
培训根据每个人的基础不同,培训所需的时间也不相同,如果是零基础的小白从头开始学习,大概需要五个月左右的时间,如果有python编程语言的基础,差不多一个月左右就可以完成了。
资料拓展
AI的作用
AI智能可以给生活中带来许多的便利,比如生活中的无人超市,也是使用了AI技术。还能给各种行业带来便利,比如农业自动播种自动浇水,还有医疗行业的大数据分袖,手机的人脸识别等功能都是通过AI人工智能实现的。
AI使用的编程语言
AI开发可以使用Python、java、Lisp、Prolog、C ++、Prolog这六种语言,AI指的是人工智能的意思,AI是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
AI工程师是什么
AI开发工程师是使用着人工智能的算法,进行多种领域的技术的研究,分析,开发,还需要对系统进行维护,优化,运营的技术人员,也就是程序员。
AI开发就业前景
Ai开发工程师就业前景很好,2017年ai人工智能写入了2017的党代会报告里,人工智能进入了无人驾驶汽车、个人生活、金融服务、电商运营、医疗服务、教育培训等各个领域中
百战-AI算法工程师就业班
课程链接:https://www.itwangzi.cn/4781.html
Transformer一、TransformerTransformer 是一种新的、基于 attention 机制来实现的特征提取器,可用于代替 CNN 和 RNN 来提取序列的特征。
Transformer 首次由论文 《Attention Is All You Need》 提出,在该论文中 Transformer 用于 encoder - decoder 架构。事实上 Transformer 可以单独应用于 encoder 或者单独应用于 decoder 。
Transformer 相比较 LSTM 等循环神经网络模型的优点:
论文中的 Transformer 架构包含了 encoder 和 decoder 两部分,其架构如下图所示。
Transformer 包含一个编码器 encoder 和一个解码器 decoder 。
编码器 encoder 包含一组 6 个相同的层 Layer ,每层包含两个子层 SubLayer。
第一个子层是一个多头自注意力 multi-head self-attention 层,第二个子层是一个简单的全连接层。
每个子层都使用残差直连,并且残差直连之后跟随一个layer normalization:LN 。假设子层的输入为 ,则经过 LN 之后整体的输出为: 。为了 Add 直连,论文将内部所有层的输入、输出的向量维度设置为 d_{model} = 512 维。
解码器 decoder 也包含一组 6 个相同的层 Layer,但是每层包含三个子层 SubLayer 。
第一个子层也是一个多头自注意力 multi-head self-attention 层。但是,在计算位置 i 的 self-attention 时屏蔽掉了位置 i 之后的序列值,这意味着:位置 i 的 attention 只能依赖于它之前的结果,不能依赖它之后的结果。因此,这种 self-attention 也被称作 masked self-attention。
第二个子层是一个多头注意力multi-head attention 层,用于捕获 decoder output 和 encoder output 之间的 attention 。
第三个子层是一个简单的全连接层。
和 encoder 一样:
每个子层都使用残差直连,并且残差直连之后跟随一个layer normalization:LN 。
decoder 所有层的输入、输出的向量维度也是 维。
编码器和解码器的 attention 都是采用 scaled dot attention 。
设有 M 个 query 向量 、 M 个 key 向量 、 M 个 value 向量 ,其中 query 向量和 key 向量的维度为 ,value 向量的维度为 。经过 attention 之后,位置 m 的输出为:其中 表示位置 m 与位置 i 之间的权重:
则有:
令:,其中 softmax 沿着矩阵的行归一化。令:
则有: 。即:
除以 是为了降低 的数值,防止它落入到 softmax 函数的饱和区间。因为 softmax 函数的饱和区梯度几乎为 0 ,容易发生梯度消失。
如果使用了 Masked attention,则有:
令:
则有:
令:,其中 softmax 沿着矩阵的行归一化。令:
则有: 。即:
事实上,一组多个attention 的效果要优于单个 attention,这称作multi-head attention 。
给定 query 矩阵 、key 矩阵 、value 矩阵 ,multi-head attention 的 head i 先通过一个线性映射然后再经过 attention,得到 head i 的输出 :其中:
将 M 个 query 向量 从 维降低到 维。
将 M 个 key 向量 从 维降低到 维。
将 M 个 value 向量 从 维降低到 维。将多个 head i 的输出 进行拼接,并再经过一个线性映射即可得到多头attention 的结果: 其中:
a 为 head 的数量, 是为了确保multi-head attention 前后的输入输出维度一致。
concate 操作在 M 个向量上进行:其中 为第 i 个 head 的第 m 个输出向量。
论文中选择 。为了保证 multi-head attention 的表达空间与 single-head attention 一致,论文中选择:
multi-head attention 将整个 attention 空间拆分成多个 attention 子空间,其表达能力更强。
从原理上看,multi-head 相当于在整体计算代价几乎保持不变的条件下,引入了更多的非线性从而增强了模型的表达能力。
在论文中,有三种方式使用多头注意力机制:
encoder-decoder attention:query 来自前一个 decoder 层的输出,keys,values 来自 encoder 的输出。其意义是:decoder 的每个位置去查询它与 encoder 的哪些位置相关,并用 encoder 的这些位置的 value 来表示。
encoder self-attention:query,key,value 都来自前一层 encoder 的输出。这允许 encoder 的每个位置关注 encoder 前一层的所有位置。
decoder masked self-attention:query,key,value 都来自前一层 decoder 的输出。这允许 decoder 的每个位置关注 encoder 前一层的、在该位置之前的所有位置。
encoder 和 decoder 还包含有全连接层。对 encoder/decoder 的每个 attention 输出,全连接层通过一个 ReLU 激活函数以及一个线性映射:
网络涉及三个 embedding 层:
从 attention 的计算公式 可以看到:调整输入的顺序对 attention 的结果没有任何影响。即:attention 的输出中不包含任何顺序信息。
事实上输入的顺序对于很多任务是非常重要的,比如 我喜欢喝牛奶,而不喜欢喝咖啡 与 我喜欢喝咖啡,而不喜欢喝牛奶 的语义完全不同。
论文通过将位置编码添加到 encoder 和 decoder 底部的输入 embedding 来解决问题。即有:
其中 为位置 i 的position embedding , attention 权重与位置有关。
对于同一个输入序列如果打乱序列顺序,则不同 token 的 attention 权重发生改变使得 attention 的结果不同。
位置编码有两种选择:
可以作为参数来学习,即:将 encoder 的每个输入的位置embedding 、decoder 的每个输入的位置embedding 作为网络的参数,这些参数都从训练中学得。
也可以人工设定固定值。论文中使用: 其中 表示位置编号, 表示向量的维度。
不同的维度对应不同的波长的正弦曲线,波长从 到 。
选择这样的函数是因为:不同位置之间的embedding 可以简单的相互表示。即:对于给定的偏移量k , 可以表示为 的线性函数。这意味着模型可以捕获到位置之间的相对位置关系。
论文的实验表明:通过参数学习的position embedding 的效果和采用固定的position embedding 相差无几。
另外,固定方式的 position embedding 可以在测试阶段处理那些超过训练序列长度的测试序列。
假设输入序列长度为 n,每个元素的维度为 : 。输出序列长度也为 n ,每个元素的维度也是 d :。可以从每层的计算复杂度、并行的操作数量、学习距离长度三个方面比较 Transformer、CNN、RNN 三个特征提取器。
每层的计算复杂度:
考虑到 n 个 key 和 n 个 query 两两点乘,因此self-attention 每层计算复杂度为 O(n^2\times d)
考虑到矩阵(维度为 nxn) 和输入向量相乘,因此RNN 每层计算复杂度为
对于 k 个卷积核经过 n 次一维卷积,因此 CNN 每层计算复杂度为 。如果考虑深度可分离卷积,则计算复杂度下降为 。
因此:当 时,self attention 要比 RNN 和 CNN 快,这也是大多数常见满足的条件。
当 时,可以使用受限 self attention,即:计算 attention时仅考虑每个输出位置附近窗口的 r 个输入。这带来两个效果:
每层计算复杂度降为
最长学习距离降低为 r,因此需要执行 次才能覆盖到所有输入。
并行操作数量:可以通过必须串行的操作数量来描述。
对于 self-attention,CNN,其串行操作数量为 ,并行度最大。
对于 RNN,其串行操作数量为 ,较难并行化。
最长计算路径:覆盖所有输入的操作的数量。
对于self-attention,最长计算路径为 O(1);对于 self-attention stricted,最长计算路径为 。
对于常规卷积,则需要 个卷积才能覆盖所有的输入;对于空洞卷积,则需要 才能覆盖所有的输入。
对于 RNN,最长计算路径为 。
作为额外收益,self-attention 可以产生可解释性的模型:通过检查模型中的注意力分布,可以展示与句子语法和语义结构相关的信息。
训练包含两个训练数据集:
WMT 2014 English - German 数据集:包含 450万句子对,每个句子通过 byte-pair encoding:BPE 编码。
BPE 编码首先将所有文本转换为 Unicode bytes,然后将其中出现次数较高的、连续的一组bytes用一个 token 替代。
源句和翻译句共享词汇表,包含 37000个 token 。
WMT 2014 English-French 数据集:包含 3600万句子对,每个句子通过 BPE 编码。源句和翻译句共享词汇表,包含 32000个 token 。
训练在 8 NVIDIA P100 GPU 上,相近大小的 句子对 放到一个batch 里,每个训练 batch 包含大约 25000个源 token 和 25000个 翻译 token 。
优化器采用 Adam optimizer, 。学习率为:其中 。
训练在基础版本上执行 10 万步约12个小时,在大型版本上(更大的参数)执行 30 万步约 3.5 天。
通过两种方式进行正则化:
dropout:
residual dropout:在每个子层添加到 ADD & LN 之前执行 dropout, 。
embedding dropout:在 encoder 和 decoder 添加position embedding 之后,立即执行 dropout , 。
label smoothing::训练期间使用 的label smoothing。虽然这会降低模型的困惑度,因为模型学到了更大的不确定性,但是这会提高 BLEU 。
在 WMT 2014 English-German/ WMT 2014 English-French 翻译任务上,各种模型的效果如下图:
训练参数:见后一个表的最后一行。
超参数选择:使用beam size = 4 、长度惩罚因子 的 beam search,超参数在验证集上选择。
训练代价 FLOPs :通过训练时间、训练 GPU 个数、每个 GPU 的单精度浮点计算能力三者相乘得到估计值。
对于 base model,采用单个模型的最后 5 个 checkpoint 的平均(10分钟生成一个 checkpoint)。对于 big model,采用单个模型的最后 20个 checkpoint 的平均。
为了评估不同参数的影响,论文在 English-German 翻译任务中采用不同的模型,评估结果是 newstest2013 验证集上得到。
beam search 参数同前,但是并没有采用checkpoint 平均的策略。
PPL 困惑度是在 word-piece 上得到的。考虑到 BPE 编码,这和 word 级别的困惑度有所出入。
为空的参数表示和 base 模型一致。
(A) 展示了不同 attention head 和 attention key/value dimension 的影响。为了保持模型参数不变,二者需要满足一定条件。结果表明:单头的效果要比多头模型差,但是头数太多也会导致效果下降。
(B) 展示了不同的 attention key 的影响。结果表明:降低 会带来性能下降。因为降低 d_k 会降低模型的 attention 矩阵 的容量,从而降低模型的整体表达能力。
(C) 展示了不同大小模型的影响。结果表明:模型越大,性能越好。
(D) 展示了 dropout 和 label smoothing 的影响。结果表明:dropout 和 label smoothing 有助于帮助缓解过拟合。
(E) 展示了通过学习 position embedding (而不是固定的 position embedding )的影响。结果表明:这两种 position embedding 策略的效果几乎相同。
Universal Transformer 总体计算流程如下图所示:
Universal Transformer 基于 BERT 结构进化而来。
Universal Transformer对 encoder 和 decoder 的每个 token 的表达都应用了循环操作,但是这种循环不是基于 token 的序列位置(横向),而是基于 token 的处理深度(纵向)。
因此 Universal Transformer 的计算限制不受序列长度的影响,而受网络深度的影响。
因此 Universal Transformer 具有可变深度,这与Transformer、RNN 等具有固定深度的模型完全不同。
在每个时间步,对每个 token 的表达并行的执行以下操作:
通过 self-attention 机制来交换序列中所有 token 的信息。
在所有时间步的所有位置上应用同一个转换函数Transition Function 。有两种转换函数:全连接、深度可分离卷积。
与 Transformer 相同,Universal Transformer 也会引入残差连接、层归一化Layer Normalization、Dropout 。
与 Transformer 不同,Universal Transformer 的 position embedding 在每个时间步都发生变化,而不仅仅只有起始时设置一次。设时间步 t 时,位置 i 的 position embedding 为 ,则有:其中 表示向量的维度,m 为序列的长度。写成矩阵的形式有:
编码器 encoder :给定一个长度为 m 的输入token 序列 :
其中 为 token 的一维 embedding 。
其中 分别将 query, key, value 映射成 维度, 用于调整 concate 的输出结果。
整体步骤(其中 LN 为 Layer Normalize,Trans 为 Transition Function :
计算 t 时刻的输入: 。
计算self attention(考虑残差连接和层归一化): 。
计算Transition Function : 。
然后在时刻 t ,根据 self attention 机制和 Transition Function 来并行计算 。
self attention 机制:
解码器和编码器的结构基本相同,有以下不同的地方:
其中 j 为输出的位置。
与 Transformer 相同,Universal Transformer 的解码器也采用的是 masked self-attention 机制。
与 Transformer 不同,Universal Transformer 的解码器对编码器 步的输出 计算注意力,其中 query 来自解码器、key,value 来自编码器。
设解码器在 步的输出为 ,则输出 token 为 y_j 的概率为:
Universal Transformer 的训练采用 teacher-forcing 策略。
训练阶段:解码器的输入来自目标序列。由于采用 masked 机制,因此每次迭代时序列右边界右移一个位置,表示下一个预测目标。
测试阶段:
解码器的输入来自前一个位置的输出。
首先由编码器重复执行多次,得到输入序列的编码 ;然后解码器重复执行多次,解码器每次执行会生成下一个 token 。
在文本处理任务中,文本中的某些单词相比较于文本中的其它单词可能更难以理解。对于这些难以理解的单词,可能需要执行更多的处理步骤。
Adaptive Computation Time(ACT) 技术就是通过为每个 token 计算个性化的迭代时间步来解决这个问题。
在 Universal Transformer 中,ACT 在每个循环为每个 token 计算一个停止概率。
一旦该 token 应该停止计算,则该 token 的状态直接向后传递,直到所有的 token 都停止计算,或者达到一个最大的迭代步阈值。
BABI Question-Answering 数据集:包含20种不同的任务,每个任务都是根据一段文本来回答问题。该数据集的目标是:通过对每个故事中的事实 fact 进行某种类型的推理,从而衡量语言理解能力。实验结果如下所示,其中:
针对 BABI 任务的可视化分析表明:
注意力分布开始时非常均匀。但是随后的步骤中,围绕每个答案所需的正确事实fact,注意力分布逐渐变得更加清晰。
通过动态暂停 ACT 技术观察到:对于需要三个事实 fact 支持的问题,其平均思考时间高于只有两个事实 fact 支持的问题;对于需要两个事实 fact 支持的问题,其平均思考时间又高于只有一个事实 fact 支持的问题。
平均思考时间:用一组测试样本每个 token 的平均迭代时间步来衡量。
对于三个/两个/一个事实支持的问题,其平均思考时间分别为:、、 。
这表明:模型根据问题所需的支持事实 fact 的数量来调整迭代时间步。
通过动态暂停 ACT 技术观察到:对于需要一个事实 fact 支持的问题,其不同位置的思考时间更为均匀。对于需要两个/三个事实 fact 支持的问题,其不同位置的思考时间差距较大。尤其在三个事实支持的问题中,很多位置只迭代一到两步就停止,只有少数位置迭代更多步。这意味着:大多数位置与任务无关。下图为某个三事实支持的问题对应的 token 迭代时间步的分布。
针对 BABI 任务的可视化分析表明:Universal Transformer 类似动态记忆网络dynamic memory network,它具有一个迭代注意力的过程。Universal Transformer 模型根据前一个迭代的结果(也称作记忆)来调节其注意力分布。下图为注意力权重在不同时间步上的可视化,左侧不同的颜色条表示不同 head 的注意力权重(一共4个头)。
一个事实 fact 支持的问题:
两个事实 fact 支持的问题:
三个事实 fact 支持的问题:
Transformer解决的核心问题是:如何将任意长度的文本序列编码成一个固定维度的隐向量。
假设有无限的内存和算力,一个简单的方法是:取语料库中最长序列的长度,然后把所有较短的序列填充到最大长度作为输入。但是由于内存和算力的限制,这种方式不现实。
一个可行的方案是:将整个语料库分割成固定大小的、较短的片段segment ,然后用每个片段来训练模型,而忽略之前所有片段的信息。这种模型称作 vanilla model,这也是 Transformer 的做法。
vanilla model 没有任何跨 segment 的信息流,这会带来两个问题:
模型能够捕获的最大依赖的长度不超过 segment 的大小。假设 segment 的长度为 n ,则模型无法捕获长度超过 n 的依赖性。
划分 segment 的时候未考虑句子边界或者短语的边界,这破坏了语义完整性。因此模型缺乏必要的上下文信息来预测 segment 的开头的前几个 token 和结束的尾部几个 token 。这会导致低效的优化效率和更差的泛化能力。这个问题称作上下文碎片化 context fragmentation 问题。
vanilla model 不仅在训练期间遇到问题,在推断期间也会遇到问题。Transformer 在推断期间反复执行推断过程,每次推断都根据前几轮输入结果和输入来预测下一个输出结果。
Transformer XL 通过引入递归机制和相对位置编码来解决上述问题。
为解决固定长度上下文的局限性,Transformer XL 引入了 Segment-level 递归机制。
训练期间:Transformer XL 缓存前一个 segment 计算得到的隐状态序列,然后在下一个 segment 中重用。这种额外的输入使得网络能够利用历史中的有效信息,从而能够对长期依赖建模,并且避免了上下文碎片化。
在对语料库进行分割来生成样本之后, Transformer XL 要求对样本不能进行混洗。因为一旦混洗就会破坏 segment 的先后顺序。
由于需要考虑 segment 之间的先后关系,因此训练期间要将连续的一组 segment 分别放置在连续的一组 batchment 中。这样可以在尽可能满足 segment 先后关系的条件下提高数据并行度。
推断期间:Transformer XL 缓存前一个 segment 计算得到的隐状态序列,使得后续需要用到这些隐状态时直接使用而不必重新计算,加快了推断速度。实验表明,Transformer XL 的推断速度是传统 Transformer 的 1800 倍。
令 segment 长度为 n ,第 个segment 的输入为 token 序列: ;第 个 segment 的输入为: 。假设网络有 L 层,第 l 层网络每个位置的输出隐状态分别为 :
其中 为 d 维列向量。令:考虑 Segment-level 递归机制,则 的第 l 层各位置的隐向量为:
其中 SG 表示冻结参数(不用计算梯度),concate 表示沿位置拼接:
其中 分别为 query,key,value 转换矩阵。
其中 Transformer-Layer 为常规的 Transformer 层。
与标准 Transformer 不同,这里计算 key 向量和 value 向量时使用了扩展上下文,其中 缓存了前一个 segment 的状态。
这种在前后两个 segment 之间共享状态的方式构成了 segment-level 的递归,因此上下文信息可以跨 segment 流动。
是在 中被使用的,这不仅跨了一个段,也垮了一层。这显著的区别于其它的 RNN 语言模型。
正因为如此, Transformer XL 最大依赖长度扩展到了 。
下图中,每个位置的 context 都是它左下方的4个位置。
5.Transformer XL 的训练方式类似于 BPTT,但是与 BPTT 不同的是:Transformer XL 缓存了上一个 segment 的多组隐向量。
理论上不仅可以缓存前一个 segment ,也可以缓存前面 m 个 segment。
3.2 相对位置编码采用 segment-level 递归机制之后存在一个问题:如何保持位置信息的一致性。令:
可见 和 都采用了同样的位置编码,因此模型没有任何信息来区分一个token 是位于 segment 还是 segment 。
令:
则Transformer 的 attention score (不考虑 softmax 归一化,以及除以 )为:
它表示 query i 与 key j 的相关性。
Transformer XL 引入相对位置编码。位置 j 相对于位置 i 的距离为 b=j-i,则位置 j 相对于位置 i 的 relative position embedding 为:
令 为Transformer XL 中使用的最大相对距离,令相对位置编码矩阵为:
Transformer XL 修改 attention score 为:
将第二、四项中的绝对位置编码 修改为相对位置编码 。其中的相对位置是:key 相对于 query 的位置。
通过参数 来代替 。这表示对于位置 j 的 key token,同一个 query 在不同位置上无影响。因为这种影响被剥离到第二项中。
通过参数 来代替 。这表示对 key 相对于 value 的相对位置 i-j ,同一个 query 在不同位置上无影响。因为这种影响被剥离到第二项中。
通过 和 来生成不同的 key 向量。修改后的attention score 各项的意义为:
第一项刻画了基于内容的 attention
第二项刻画了内容相对于每个相对位置的 bias
第三项刻画了内容的全局的 bias
第四项刻画了位置的全局 bias
Transformer XL 验证了 word-level 语言模型(以困惑度 PPL 为指标),以及 char-level 语言模型(以 bpc:Bit per Character 为指标) 。其中包含以下数据集:
WikiText-103 数据集:最大的word-level 语言模型 benchmark,包含 2.8万篇文章总计103M 训练 token ,平均每篇文章 3.6K token 。
由于文章的平均 token 数量较大,因此这会考验模型的长期依赖建模能力。
训练期间 attention length = 384,推断期间 attention length = 1600。
attention length 也等于 segment 长度
enwik8 数据集:包含 100M 字节的未经处理的 wiki 文本。结果表明:12层的 Transformer XL 的表现超过了 12层的 Transformer 。
text8 数据集:包含 100M 字节的、经过处理的 wiki 文本。处理方式为:大写字母改小写、移除 a~z 之外的所有字符。
One Billion Word 数据集:数据集的句子已经被混洗过,因此该数据集无法验证序列的长期依赖。因而该数据集用于测试模型的短期依赖。结果表明:Transformer XL 对短期依赖的建模效果也非常好。
Penn Treebank 数据集:包含 1M token,用于验证模型在小数据集上的表现。结果表明:transformer XL 在小数据集上效果也非常好。
在 WikiText-103 数据集上验证 segment-level 递归、相对位置编码的作用,验证结果如下。其中:
结果划分为三个部分,分别为 128M 参数的 Transformer-XL、 128M 参数的 Transformer、 151M 参数的 Transformer-XL 。
最后四列的意义:
PPL init 表示推断期间使用与训练时相同的 attention length
PPL best 表示推断期间使用最佳长度的attention length (通过超参数搜索得到)
Attn Len 给出了推断期间使用的最佳attention length
Full Loss/ Half Loss 表示计算当前 segment 中所有位置的损失,还是计算后一半位置的损失
结果表明:相对位置编码非常重要对于 Transformer XL 非常重要,而绝对位置编码只有在 Half Loss 中工作良好。因为 Half Loss 只考虑当前 segment 后一半位置的损失,因此受到前一个 segment 的绝对位置编码的影响比较小。
随着 attention length 的增加,模型的困惑度下降。
尽管每个 segment 训练期间的长度是 128,但推断期间可以推广到 640 。
此外,由于 Transformer XL 采取了缓存前一个 segment 的状态的策略,因此会消耗更多的内存。下图给出在相同 GPU 内存的约束条件下的比较结果。
结果表明:即使 Transformer XL 由于内存约束而不得不使用一个较小的 backprop len ,其最终效果仍然超越 Transformer 。
为了证明 Transformer XL 能够解决上下文碎片问题,作者在 One Billion Word 数据集上做了实验。
因为该数据集的句子经过混洗,导致不需要对长期依赖建模。因此效果的提升一定是由于模型能够解决上下文碎片,而不是由于模型捕捉到更长的上下文。