| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> Transfomer -> 正文阅读 |
|
[人工智能]Transfomer |
1. Transformer 模型? 参考链接 - ShusenWang - Transformer 模型 ? ? transformer 模型是 Ashish Vaswani 等人在 NIPS 2017 中论文 Attention is all you need 提出。transformer 是一种 Seq2Seq 模型,它有一个 encoder 和一个 decoder,很适合做机器翻译。transformer 不是循环神经网络网络,transformer 没有循环的结构,transformer 只有 attention 和 全连接层。 ? transformer 的实验效果非常惊人,可以完爆最好的 RNN 加 attention。机器翻译问题已经没有人用 RNN ,业界都用 transformer 加 bert。 ? 思考一个问题,如果把 RNN 去掉,只保留 attention,然后用 attention 来搭一个深度神经网络来代替 RNN,该怎么做? 1.1 Attention for Seq2Seq Model? 这一章从零开始起搭一个基于attention 的神经网络,从前面的 RNN 加 attention 模型入手,剥离 RNN ,保留 attention,然后搭建 attention 层与 self-attention 层。后面章节会把这些层组装起来,搭一个深度的 Seq2Seq 模型,搭出来的模型就是 ? Seq2Seq 模型有一个 encoder 和一个 decoder。encoder 的输入是 ? decoder 是一个文本生成器,依次生成状态 s s s ,然后根据状态 s s s 生成单词,把新生成的单词作为下一个输入 x ′ \mathbf{x}^{\prime} x′ 。如果有 attention 的话,还需要计算 Context vector c c c ,每算出一个状态 s s s ,就算一个 c c c 。
? 每算一个 Context vector
c
c
c ,就要计算出
? 拿一个 Query 向量
q
:
j
\mathbf{q}_{:j}
q:j? 去对比所有 ? 除此之外,还要算 Value 向量 v : i \mathbf{v}_{:i} v:i? ,把 h i h_i hi? 乘到矩阵 W V \mathbf{W}_{V} WV? 上,得到向量 v : i \mathbf{v}_{:i} v:i? ,矩阵 W V \mathbf{W}_{V} WV? 也是个参数。attention 中一共有三个参数矩阵 W Q \mathbf{W}_{Q} WQ?, W K \mathbf{W}_{K} WK? 以及 W V \mathbf{W}_{V} WV? ,他们都要从训练数据中学习。 ? 上面说明了 Query , Key , Value 三种向量是怎么计算出来的,下面回过头来看这个例子。我们先把 decoder 当前状态 s j s_j sj? 映射到 Query 向量。具体是这么做的,拿参数矩阵 W Q \mathbf{W}_{Q} WQ? 与 decoder 状态 s j s_j sj? 相乘,得到 Query 向量 q : j \mathbf{q}_{:j} q:j? 。 ? 然后把 encoder 所有 ? 用矩阵
K
\mathbf{K}
K 与向量
q
:
j
\mathbf{q}_{:j}
q:j? 计算出 ? 接下来计算 Value 向量
v
:
i
\mathbf{v}_{:i}
v:i? ,那 encoder 的第
i
i
i 个状态向量
h
i
h_i
hi? 与参数矩阵
W
V
\mathbf{W}_{V}
WV? 相乘,得到一个 Value 向量
v
:
i
\mathbf{v}_{:i}
v:i? 。把所有
1.2 Attention without RNN? attention 原本是用在 RNN 上的,思考如何才能剥离 RNN ,只保留 attention ?这样可以得到一个attention 层与 self-attention 层,transformer 就是由 attention 层与 self-attention 层组成的。 1.2.1 Attention Layer? 我们先设计一个 ? 举个例子,把英语翻译成德语,英语句子里有 ? 我们不用 RNN ,只用
? 注意,一共有 3 个参数矩阵,encoder 中有两个,分别是矩阵
W
K
\mathbf{W}_{K}
WK? 与
W
V
\mathbf{W}_{V}
WV? ,用来计算 Key 和 Value 。 ? 现在开始计算权重
α
\alpha
α ,拿第一个 Query 向量
q
:
1
\mathbf{q}_{:1}
q:1? 与所有
? 然后计算 Context vector
c
:
1
\mathbf{c}_{:1}
c:1? ,需要用到权重向量
α
:
1
\alpha_{:1}
α:1? 与所有
? 把 Attention Layer 记为函数
1.3 Self-Attention without RNN? 前面我们研究了 Seq2Seq 模型,我们删掉了 RNN,并且搭建了一个 attention 层,可以用 attention 层来做机器翻译。接下来搭建一个 Self-Attention 层,原理完全一样,仍可以用 self-attention 来取代 RNN。 ? 前面介绍搭的 ? Self-attention 层不是 Seq2Seq,它只有一个输入序列,这就像是普通的 RNN 一样。self-attention 层也可以用 ? 用
? 1?? 第一步是做三种变换,把 x i \mathbf{x}_i xi? 映射到 q : i \mathbf{q}_{:i} q:i? , k : i \mathbf{k}_{:i} k:i? 和 v : i \mathbf{v}_{:i} v:i? 三个向量,参数矩阵还是 W Q \mathbf{W}_{Q} WQ? W K \mathbf{W}_{K} WK? 和 W V \mathbf{W}_{V} WV?。线性变换之后, x 1 \mathbf{x}_1 x1? 被映射到 q : 1 \mathbf{q}_{:1} q:1? , k : 1 \mathbf{k}_{:1} k:1? , v : 1 \mathbf{v}_{:1} v:1? , x 2 \mathbf{x}_2 x2? 被映射到 q : 2 \mathbf{q}_{:2} q:2? , k : 2 \mathbf{k}_{:2} k:2? , v : 2 \mathbf{v}_{:2} v:2? ,每个 x \mathbf{x} x 向量都会被映射成 q \mathbf{q} q k \mathbf{k} k v \mathbf{v} v 三个向量。
? 第
j
j
j 个输出
c
:
j
\mathbf{c}_{:j}
c:j? 是这样算出来的,它依赖于矩阵
V
\mathbf{V}
V 矩阵
K
\mathbf{K}
K 以及向量
q
:
j
\mathbf{q}_{:j}
q:j? 。因为
c
:
j
\mathbf{c}_{:j}
c:j? 依赖于所有的
k
\mathbf{k}
k 和所有的
v
\mathbf{v}
v ,所以
c
:
j
\mathbf{c}_{:j}
c:j? 依赖于所有
? ? attention 和 self-attention 都用
1.4 Multi-Head Attention? 下面用构造的 attention layer 和 self-attention layer 来搭建一个深度神经网络。首先使用 attention 来组建 multi-head attention。 ? self-attention 层输入是一个序列,
x
1
\mathbf{x}_1
x1? 到
x
m
\mathbf{x}_m
xm? ,self-attention 层有 3 个参数矩阵
W
Q
\mathbf{W}_{Q}
WQ?,
W
K
\mathbf{W}_{K}
WK? 和
W
V
\mathbf{W}_{V}
WV? ,输出是一个序列
c
:
1
\mathbf{c}_{:1}
c:1? 到
c
:
m
\mathbf{c}_{:m}
c:m? 。这样的 self-attention 层被称为 ? ? 所有 single-head self-attention 都有相同的输入,输入都是 x 1 \mathbf{x}_1 x1? 到 x m \mathbf{x}_m xm? 序列。但是他们的参数矩阵各不相同,所以输出的 c \mathbf{c} c 序列也各不相同。把 l l l 个single-head self-attention 输出的序列做 concatnation 堆叠起来,作为 multi-head self-attention 的最终输出,堆叠起来的 c \mathbf{c} c 向量变得更高。如果每个单头的输出都是 d × m d\times m d×m 的矩阵,那么多头的输出就是 l d × m ld\times m ld×m 的矩阵。
1.4.1 Stacked Self-Attention Layers? 已经构造出了 multi-head self-attention 与 multi-head attention,接下来要用这两种层搭建一个深度神经网络。 ? 首先用 ? 把同一个全连接层用到 c : 2 \mathbf{c}_{:2} c:2? 上,得到输出 u : 2 \mathbf{u}_{:2} u:2? , u : 2 \mathbf{u}_{:2} u:2? 的计算方法完全相同。注意 两个全连接层是 完全相同 的,它们的参数矩阵都是 W U \mathbf{W}_{U} WU?。 ? 然后把全连接层用到 c : 3 \mathbf{c}_{:3} c:3? 上,输出 u : 3 \mathbf{u}_{:3} u:3? 。以此类推,得到 m m m 个输出向量 u \mathbf{u} u 。这些全连接层都是完全一样的,有同一个参数矩阵 W U \mathbf{W}_{U} WU?。
? 然后搭第二个
? transformer 是一个 Seq2Seq 模型,它有一个 encoder 和一个 decoder,输入是两个序列。如果我们想要把英语翻译成德语。那么 x \mathbf{x} x 序列是英语的词向量, x ′ \mathbf{x}^{\prime} x′ 是德语的词向量。 ? 刚才已经搭建的 encoder 网络,有 6 个blocks,每个block 有两层。encoder 的输入和输出都是 512 维的向量,输入序列有
? 2?? 第二层是
? 把 z : 2 \mathbf{z}_{:2} z:2? 作为输入全连接层输出 s : 2 \mathbf{s}_{:2} s:2? 。用同样的方法,把所有的 z \mathbf{z} z 向量都映射到 s \mathbf{s} s 向量。
1.5 Put Everything Together? 现在我们已经有了所有模块,可以把这些模块拼起来,得到最终的 ? 我们已经搭建好了 ? 前面我们已经搭好了
? 再来一个 block,左边的输入序列还是矩阵 U \mathbf{U} U , 也就是 encoder 网络的输出,右边输入序列是 decoder 上一个模块的输出。第二个block 的输出还是 512 × t 512 \times t 512×t 的矩阵。 ? 一共搭了 6 个blocks,组成了 decoder 网络,每个block 有 3 层,分别是 self-attention 层、attention 层以及全连接层。每个block 有两个输入序列,一个输出序列。左边输入序列都是矩阵
U
\mathbf{U}
U ,也就是 encoder 网络的输出,右边输入序列是前一个
总结 ? ? ? 所以怎么样用 RNN 的,现在就可以怎么样用 transformer ,所有 RNN Seq2Seq 模型能做的,transformer 模型也同样能做。
2. BERT 模型? 参考链接 - ShusenWang - Transformer 模型 ? Bidirectional Encoder Representations from Transformers ( ? BERT 的基本想法有两个,一个想法是随机遮挡一个或者多个单词,让 encoder 网络根据上下文来预测被遮挡的单词,第二个想法是把两个句子放在一起,让 encoder 网络判断两句话是不是原文里相邻的两句话。BERT 用这两个任务来预训练 transformer 模型中的 encoder 网络。 2.1 Task 1: Predict Masked Words? transformer 的 ? the cat set on the mat 这句输入有 6 个单词,Embedding 层把这 6 个单词映射成 6 个词向量 x 1 \mathbf{x}_1 x1? 到 x 6 \mathbf{x}_6 x6? 。encoder 网络的输入是 6 个词向量,所以最终输出 6 个向量 u : 1 \mathbf{u}_{:1} u:1? 到 u : m \mathbf{u}_{:m} u:m? 。
? 具体这么做,把输入的第二个单词替换成 ? u M \mathbf{u}_{\mathbf{M}} uM? 向量不仅依赖于 x M \mathbf{x}_{\mathbf{M}} xM? ,而且依赖于所有 x \mathbf{x} x 向量, u M \mathbf{u}_{\mathbf{M}} uM? 在mask 位置上,但是 u M \mathbf{u}_{\mathbf{M}} uM? 知道整句话的信息。 u M \mathbf{u}_{\mathbf{M}} uM? 包含上下文信息,所以可以用 u M \mathbf{u}_{\mathbf{M}} uM? 来预测被遮挡的单词。 ? 把 u M \mathbf{u}_{\mathbf{M}} uM? 作为特征向量,输入一个 Softmax 分类器,分类器的输出是一个概率分布 p \mathbf{p} p ,字典里每个单词都有一个概率值,通过概率值就能判断被遮挡单词是什么。
2.2 Task 2: Predict the Next Sentence? 第一句话是 “ calculus is a branch of math ” ,“微积分是数学的一个分支”。再告诉你第二句话是“ it was developed by newton and leibniz ”,“它是由牛顿和莱布尼兹发展起来的”。现在让你做一个判断,这两句话是否是原文中相邻的两句话? ? 很有可能是,因为微积分与牛顿、莱布尼兹的相关性非常大。神经网络可以从海量的训练数据中学出这种相关性。所以神经网络有能力做出正确的判断。 ? 假如第一句话不变,还是 “ calculus is a branch of math ” ,第二句话换成 “ panda is native to south central china ” ,这两句话是否是原文中相邻的两句话呢? ? 很可能不是,第一句话讲的是微积分和数学,第二句话讲的是熊猫,这两句话之间没有任何关联。 ? 可以这样准备训练数据,把两句话给拼接起来,两句话之间用 ? 生成训练数据的时候,有 50% 是原文里真实相邻的两句话,另外 50% 的第二句话是从训练数据中随机抽取的句子。 ? “ calculus is a branch of math ” 和“ it was developed by newton and leibniz ” 这两句话是真实的原文,所以标签设置 为
? 把
c
\mathbf{c}
c 作为特征向量,输入一个分类器,分类器的输出是介于
? encoder 网络中有self-attention 层,self-attention 的作用就是找相关性。这种分类任务可以训练 self-attention 找到正确的相关性。 2.3 Combining the two methods? 前面介绍了两个任务,一个是预测遮住的单词,另一个是判断两句话是否在原文里真实相邻。 ? 把两句话给拼接起来,然后随机遮挡 15% 的单词,这条训练数据里碰巧有
? 参考链接 - ShusenWang - Transformer 模型 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/12 0:59:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |