Transcript for:
Lecture on Transformers

大家好,我是PhD威道 那么呢,还是想有一个涉案粉丝的牌子呀 希望大家能够去多多的关注 好的,那么今天呢,就给大家来讲一讲 闯错门这篇文章 闯错门这个文章呢,我已经压到很后面才讲 因为里面有些东西呢,其实我也不是特别清楚 就是每一次的时候呢 闯错门这种东西呢,都是从别的文章里 copy一点过来,那copy一点过来的话呢 就都解决掉了,所以每次都是这样 公式啊,什么都是这样 那我们今天呢,先从最开始开始讲 最开始的时候就有RNN和LSTM 那上一次呢 我给大家讲过什么是RNN了 RNN其实很简单 它就是一个状态机 它有UV和W这三个变量 如果你要是只有一个RNN的node的话 它就只有UVW三个变量 它就只有这一组 它这个软件展开的话 UVW它是一样的 你看到吗 它没有就是说W1 W2 W3 它W是一样的 V也是一样的 U也是一样 它会造成一个什么问题呢 就是说我们读取一个词的时候 UWV被更新 我们读取一个新的词的时候 UWV被另一次更新 比如我们第一次读的词是我 对吧 对吧 这个读的词是养了一只猫 是吧 就是我养了一只猫 这样一个句子 那么他每一次呢 比如说我输入的时候呢 WU和V呢 就变成我的这个样子了 然后呢养呢 就变成WU和V呢 就变成养了这个样子 然后一只呢 就WU和V呢 就变成一只这个样子 所以说呢WU和V呢 他每次更新呢 非常的剧烈 那如果更新的非常剧烈的话 他根本就记不住东西 他说白了这个模型 他根本就没有想记住东西 他那个记忆就是 无限次的被直接刷新 就像我们之前说的 那贴了一个小广告 对吧 第一个小广告是美女陪调 然后啪又贴了一张 管道疏通 那美女陪调就基本看不见了 它就是因为它 它整个就WU和V全部更新了 然后你再往上再贴一个 对吧 什么宠物毛发清理 那它这个是说 那第一个就看不到了 所以说WU和V它更新太过于剧烈 所以说它就 就后面的 就是到后面的这个句子的时候 前面的句子就全都忘掉 它根本就没想记住 对吧 这就是RN这样一个问题 那么说RNA之外呢 还有RSTM RSTM是怎么做呢 这个门的话能够让之前忘的不要那么快 就是说我每次更新的时候 比如说我以前的更新 就是直接把100%的数据往里面拍一塞 现在我更新的时候 就是说我贴下一张小广告 我给它弄得透明一点 比如说第一张是美女陪聊 第二张是管道疏通 管道疏通它是透明的一张 所以说你贴上去之后 前面的还能看到 后面的也能看到 这样多贴几张之后 前面的当然也会忘掉 但是你依然是能看到整个的一个过程 你不会就忘太快 好 这个是LSTM GRU就是LSTM的改进 你看LSTM弄了一堆门 对吧 这个训练起来就比较慢 GRU就稍微快了一点 大概就是这样 RN是个1986年的模型 LSTM是个1997年的模型 而GRU是一个2014年的模型 大概是这样 所以它们都是一些非常老的一些模型了 这个就是整个的这样一个家族 那么我们来做一个机器翻译的时候 是怎么去做的呢 其实也蛮简单的 就是说我们有一个句子 比如说我有养了一只猫 然后英文就是I have a cat 对吧 然后这样去一一的 去对应 那我们呢 有什么方法呢 我们去处理序列的时候 比如说RN呢 就可以我们直接弄一个RN 对吧 那我养的一只猫 那对应每一个 就是RN的一个单元 这样的话呢 就可以去解决问题 当然我养的一只猫 我是进行编码 比如编码成一个 128维的向量 那我就可以把RN呢 搞成一个128维的 这样的一个RN 那这是RN的这样一个做法 那LSTM可以做什么呢 我们可以就是 加一个LSTM 对吧 就是因为它LSTM是 你看这是一个箭头 所以LSTM是一个单元 然后指向下一个单元 然后再指向下一个单元 它是 有方向的 那比如说我是从上到下 对吧 然后再加一个LSTM 那这样的话我就可以对应起来 那LSTM既然是有方向的 我可以从上到下 也可以从下到上 对不对 所以说呢 LSTM可以 我们可以 就是做不同方向的LSTM 当然我们可以 还可以做什么呢 就是说我们可以做一个 从上到下的LSTM 并上一个从下到上的LSTM 这样的话LSTM就又有 从前到后又有从后到前 它这样可以更好去捕捉 这个序列的这样一个情况 并且呢 因为我说了嘛 LSTM它还是会忘 所以说你要有 从前到后 有个从后到前 你就可以当这个句子 中间被忘了 然后前面和后面呢 都能够比较好去记住 这样的话呢 就可以消除掉一些LSTM 这种遗忘的这样的一个特点吧 那你想前面如果是能被记住 然后这个是后面被记住的话 那中间其实以 这是两个模型都能记住 所以它这个整个的这个记忆水平 都会高一些 但是你要知道 RN和LSTM 它们并行化的效果都不太好 它们训练起来也非常的麻烦 所以说RN和LSTM呢 做不到很大 做的大了以后呢 就很容易崩掉 那做一个大的LSTM的话呢 需要很高的训练技巧 不然的话你是没办法 去有效的给他train的 好的 那我们呢 就来看一看这篇文章 这个文章呢 就是Google的八个人写的 你看这个文章呢 所有的人呢 都是Google的这个员工 然后呢 他们呢 一起写了一个 这个文章 这个文章叫做 Attention is all you need 那Attention is all you need 火了之后呢 就是什么什么 is all you need 这个 就到处都是 就是你现在能看到 各种各样的 什么copy is all you need 以后我们再讲一讲 然后还有什么 MLP is all you need 对吧 就各种各样的 这个all you need 然后除了 all you need的系列之外呢 还有yolo系列 对吧 就是you only look 然后这有安利什么 这就是又是一个系列 然后还有就是 towards系列 就是towards什么什么什么 因为towards是一个火的一个东西吧 然后之后就出一堆文章 都是以towards开头的 所以你能看到这样的这个模式 还有什么a survey对吧 就是说前面是一个标题 然后冒号 然后是a survey 这也是一个内容 就是做一个调查 或者做一个综述这样的一个文章 好 那我们来看一看这个文章做了什么 然后呢 就是说我们有这样一个transformer模型 那transformer呢 有一个encoder 还有一个decoder encoder会被拿出来做的bert 然后decoder被拿出来做的g GPT就是现在咱们最常用的那个拆GPT的东西 它拆GPT呢就是把GPT这个东西的暴力的给它变大 给它变的就是这不是NX吗 一般这N是6对吧 它可能给它变成50或者变成200之类的 反正变得非常大 然后呢就是然后呢数据也变得非常大 这样的话它就能够春出来一个比较好的结果 大理出奇迹 当然它有些别的一些技术啊 这边就先暂时不给大家讲 当然GPT2给大家讲一讲 因为GPT从3开始就不开远了 所以从2开始讲 那么它呢就是大概这样的一个结构 然后我们来看一看 水泥岩上我们来看一看 就是说这个结构分两部分 一个部分是它的编码部分 一个部分是它的解码部分 然后编码部分和加码部分 终于通过一个这样的一个cross tension去连接 对吧 这样的一个结构像什么 就像一个变压器一样 这边是它的一个初级 对吧 这边是一个次级 这边我们记得是220伏的交流电 然后这边出的是一个5伏的电压 是吧 大概就是这样的一个感觉 所以它叫transformer 它叫变压器 那变压器的这个模型 它里有每一个小单元是怎么回事呢 你看这儿首先它这是一个连接 它就是说这边是一个残差连接 你看这边是一个数据 这个数据分成两路 一路就是走到Multi-Headed Attention里面 然后还有一路就是走到这个Add里面 所以说它是进行了一个残差连接 你看这儿有一个Add 这儿有一个Add 这儿有一个Add 这儿有一个Add 这儿有一个Add 所以它里面每一个块都进行了一个残差连接 然后你看左边这个块 它是怎么去做的呢 首先我们是用Input进来 然后Input进来以后 现在就要做一个Input Inviting 因为你Input是一个句子 比如说我养了一只猫 那么 我养了一只猫这个句子 你说到这个模型 你肯定是处理不了的 它必须要给它变成一个 向量的一个模式 所以说input embedding 就是去做这个向量这件事 然后如果你要是 直接就放进去的话 它一成完了以后 它就都成一坨了 怎么让它不成一坨 我们就要把它给它撑开 所以说做了一个 position的这样一个encoding position的encoding的话 就是把面条 我们要不面条 你都放在一起 它就都坨了 我把面条给它并行排放 这样的话它就不会坨了 所以我们一会儿给大家 怎么做这个position的这样的一个 embedding 就是encoding 给它把它这个排开 这样的话它就不会图在一起了 然后这边过来以后呢 计算这个数据的qkv 对吧 然后放到这个multi-height的attention里面 去算一下它自己的这样的一个self-attention 然后呢 这边过来以后呢 这边再做一个multi-height的attention 把它和这个我们的这个 decoder的部分呢 给它融合在一起 那么decoder部分是怎么做呢 其实是一样 就是说我们这有个output 然后进来以后呢 做一个output的这样的一个embedding 好 是同样的操作 然后再做一个position的这样的一个encoding 那比如说呢 我们这个内容呢 就是我们要把这个一个句子对吧 翻译成另外一个语言 所以说它就是这样去做 然后呢 这边呢 做的是一样 只这样呢 加了一个mask 因为我们之前encoder的部分呢 它是不用加mask encoder我们是可以看到整个全局的 但是我们decode呢 我们要预测下一个词讲什么 所以说我们要把之前的词给它mask起来 就像我现在在做这个字幕一样 我呢 每次讲话的时候呢 你不知道我后面要说什么词 对吧 所以你每次呢 就 只能去把我前面的东西给做出来 那它做了一个mask 就是把后面的部分给它盖起来 这样的话呢 就不会预知后面发生什么事情 然后呢 基本上做一个multi-head attention 然后最后呢 就输出 最后得到这样一个结果 那么来看一看 首先看一看这个每一个模块是怎么做的 比如说这个模块呢 叫残差连接 那残差连接是怎么做呢 就是这儿把这个数据分成两路 一条路呢 就是原封不动的直接出来 一条路呢 就是去做一个我们这样的一个操作 然后呢 出来以后呢 把这两个的那个值呢 直接呢给它 相加对吧 所以说要求这边输出的维度呢 和这边的维度呢 是一样的 那它在中间条路上呢 有可能会进行一些维度的变化 因为它有可能 经过了这样中间一个操作之后的维度不一样 对吧 那你肯定这边的维度也要发生变化 或者这边的维度要发生变化 反正就是 你做让它维度一样 然后呢 让它一个数值上呢 进行一个相加 那不等 这个是我们所说的这个Rise 这个RiseNet里面这个残差链接 那RiseNet残差链接呢 就是一个数据过来 然后一条路呢 走到这边 一条路呢 经过这些一些操作 对吧 然后呢 这个 这个数据相当于原封不动的保留下来 然后并且和原来的这个值呢 给它加在一起 然后呢再到下一层 那这样的一个东西是一个什么样的想法呢 就是说我们呢 在做我们的深度学习的时候 要做backpropagation 做这个反射传播 那它呢就需要用到链式法则 它就是求导嘛 然后你求导的话呢 就是一层扒一层 像洋葱一样去这么链式法则的去求导 于是呢就是求一层一层的 作为往上一层一层的去乘 对吧 就是 一层一层的导数一层一层去扒 像洋葱一样 那它如果是层到后面的话呢 就会成一堆东西对吧 你看这有A 然后有B 有C 然后有D对吧 就一堆的这样东西成在一起 它这个每一个乘法呢 它的值呢都是小于1的 所以越乘呢它就越小 所以也有可能是越乘越大 因为它有可能这个值是大于1的 所以最后导致的结果呢 就是我们后面这个 真正我们想要的一个梯度呢 它可能到后面就爆炸了 或者它后面就消失了 那就导致这个我们后面 这个模型呢 可能就是最后面几层能训练 前面那几层呢就训练不到 那去 训练不到的话怎么办呢 于是呢我们就做一个残渣连接 把这个我们原始的一个输入呢 直接加上我们这样的一个梯度 那这样的话呢 我们这个原始的这个值呢 就永远都保存着 于是呢我们就可以一直去训练这个模型 这个模型就可以一直传到最前面的一个样子 所以它的输入呢 输出呢就等于输入再加上一个 function加上一个输入 这样的话呢就是说 我们又对输入进行了一些操作 对吧 又把原始的输入拿过来 然后它们它们俩对应了 直接相加 就是直接数值上加在一起 那这样的话呢 我们就给它直接输出 这样的话就可以保证 它的数据是一直能够有效的传递到最前面端的 这是残差网络 那么另外一件事就是我们这个里面有一个Encoder 有一个Decoder 它有点像Auto Encoder这个模式 其实Encoder和Decoder也不是我们传说们去发明出来的 就是说大家做机器翻译一直都是这么去做的 Encoder和Decoder的部分 其实Encoder和Decoder的部分有点类似于什么 就是说Encoder的部分 它是把数据进行一个蒸馏或者是进行一个压缩 让这个数据变成一个比较小的这样一个 然后在decoder部分呢 再给它去进行一个还原 那这样的话呢 因为你想吧 你要想一个学生 学到一些东西的话 你就让他少做一些笔记 把这些精华留下来 这样的话他能学到一些东西 所以他的encoder decoder部分呢 就是为了让能够让这个模型 把他的精华呢 给他提取出来 做这样的一个操作 那么呢 我们的这个translator就是这样 比如说我有一只猫 这样一个模型 然后我要把它翻译成 就是I have a cat 那怎么去给它翻译呢 就是我有一只猫放进来 然后经过一个encoder 然后呢经过另一个encoder 再经过 另外一个incoder 一般情况下是各六个incoder 就前面这个模型的这个图呢 它上面说的是 这边是NX 对吧 那NX什么意思呢 就是把这个模块呢 复制六次 对吧 所以这个模块是这儿一个 然后这儿一个 然后这儿一个 直到最后的那个模块呢 才能做这个multi-high的attention 那这边是NX 对吧 那这个模块呢 也是复制了六次 那这儿复制一次 再复制一次 复制很多次 但它每一次呢 都要在中间 做一个multi-high的attention 所以这个图画的 其实不是很直观 就说如果你要把它展开的话呢 就长这个样子 就是说 这边的encoder是有6个 就是每一次经过一个encoder 然后每一个encoder都不输出 直接把这个输出的结果 放到下一个encoder里面 这样一次一次去encoder 但是它里面因为做残差连接 所以说每一个encoder输入的东西 就是上个encoder处理出来的结果 加上我有一只猫子这样一个情况 所以它每一个encoder都能比较好 去得到这个信息 你这么去堆叠的话 它不会说堆叠到后面 叠叠了到后面就没了 它到后面依然能够去 很有效的把这个信息给提出来 这边我们获得了编码信息 有没有啊 希希呢 它去塞到每一个 一个这样的decaler里面 然后这个decaler也是经过残渣连接 所以说每一个输入的结果呢 都可以去很好地回传到下一个里面 所以这个incoder最后呢 就给它输出 我有一只猫这样一个特点 然后去训练这样的一个情况 我们就塞进很多中文 然后这边塞进很多英文 然后我们去训练这个模型 这样的话就可以让这个每一层呢 得到一个更新 然后呢这个模型呢 就具有一个记忆翻译的这样一个能力 好了 那我们来看一看它具体是怎么做的 比如说呢 我得有一个句子叫我有一只猫 那么呢就把这个句子呢 首先先给它切分成一个一个的词 那英文切分成词比较简单 这就是按空格来切分就行了 中文呢就需要一些额外的一些技巧去切词吧 然后切完一些词 但切出来词还有些问题 因为有些时候呢 它这个中文呢 它就是你你你你切对吧 我有一只猫也可以 然后我有一 然后呢把这个只猫拼在一起行也可以 是吧 所以中文切词的话呢 它有些额外的技巧 也会给大家去讲一下 那么这个词的话呢 就做一个inbinding 首先呢先把我呢 因为它这是一个 词嘛对吧 那一个词的话 你怎么去给它 set到这样的一个transformer里呢 你要把它变成一个项链 那怎么变成一个项链呢 就是把它进行一个文本的一个编码 OK 所以我把这个词呢 给它编码 变成一个词项链 对吧 我变成一个项链 有变成一个项链 一只变成一个项链 猫变成一个项链 然后这个项链弄完了以后呢 我们给这个每一个项链呢 加上一个位置编码 因为呢 就是说我们在transformer里呢 后面要做这个 一些矩阵惩罚之类的东西 所以说我们呢 就像面条一样 我们把一锅面条 直接往里面一倒 对吧 那就 都图在一起了 所以说我们要把它们要区分开 让它位置呢发生一些啊变化 让位置变成离散 这样的话我们才能够去有效的 对吧 训练这个模型 所以说呢 我就把我呢加上一个 就是直接加上一个位置 加上一个位置信息 让它发生一个偏移 对吧 然后有加上另外一个位置信息编译 所以它的每一个位置呢 都加上一个不同的偏移 这样的话整个的这个句子呢 就给它啊 这个离开了 让它变再分开了 然后之后呢 得到了就是每一个传输门的这样一个表示 对 把这个传输量的表示给它拼在一起 就于是得到我有一只猫这样一个句子 现在就变成一个块 那么这个位置编码是怎么做的呢 因为你看这个位置编码就是这么做的 它就是用了这样的一个公式去做的 就是sin然后做这么一个情况 cos这样做一个情况 我把这个位置编码给大家去画出来 给大家看看是什么样子 那就是用拆JBT直接给它绘制出来 就可以看到这个位置编码是什么样子的一个情况 那位置编码就长这个样子 我们先看后面的 就说这个就是位置编码的这样一个热图 x要是比较少 这牵住的维度 外轴呢表示了这样的一个位置 所以说它的这个还是挺复杂的一个情况 那么做出来的结果呢 就是这么样一个样子 那这边呢是离得最近的位置 这边呢是离得最远的位置 所以这个位置编码呢 它能够比较好的 就是说把离得最近的位置呢 给它编码开 然后离得最远的位置呢 也给它去编码开 那这样的话呢 这个锯子呢塞到transformer里呢 它就可以就是不 不至于两个锯子之间发生一个混淆 而且呢它离得越近的这个位置呢 它的这个编码就越相近 对吧,离得越远的位置的编码就越差的越远,这样的话呢就可以比较好去学习到一些特征吧 那么呢,我们呢,这就是我们这样的一个过程,那比如说我有一只猫这样一个矩阵塞进去,然后每个incoder最后输出来 然后最后得到了一个编码这样一个矩阵,对吧,这就是我有一只猫的这样一个高维度的这样一个编码 所以它就能学习到我有一只猫的这样的一个特点 然后呢,我们就把我们这个编码矩阵拿出来,然后去做这样的一个预测 那这个预测呢是怎么做的呢,就是因为我们是要我有一只猫,然后呢是I have a cat 这样去一一对应的这样去翻译 那么它就像我在做视频的时候 去做这样的一个字幕一样 我不知道我后面要说什么话 所以说我翻译的时候 就只能基于我之前的这样的一个内容来做翻译 但是我们训练的时候 那个数据集肯定是都已经整个翻译完的 所以说我们怎么去模拟这样一个过程 就把后面的部分给它mask起来 让这个模型看不到后面在做些什么东西 那这样的话 我就可以一次只翻译一个位置 这样的这个模型 就是和我们真实的这样的一个翻译 情况是一样 因为我们就是 我们这个做transformer的话 比如说生成模型 它是怎么做的呢 就是我用 比如说我有这样一个句子 对吧 我想输出这样一个句子 那我呢 首先先有一个输这样一个字 作为它的一个初始值 然后呢 有输作为初始值之后 我把输呢 翻到这个模型里面 这个模型呢 就会把输呢 作为下一个次的输出 然后呢 我们就把输出呢 作为这一次的这个输入 然后呢 把得呢 就作为下一次的输出 它是一个字 一个字之后 蹦着去预测的 那这样去做的话呢 就可以把整个的一个句子 给它进行完整的预测了 那么这边呢 也是做一样的事情 所以它就把后面的值 给它mask起来 那mask的方法呢 也是一个 比较有意思的方法吧 就是它直接把 后面的这些部分呢 直接用负无穷给它代替 那这样的话 就是用一个 非常小的一个值给它代替 那这个值呢 是非常低的 所以说呢 经过softmax之后 这个值就是一个 非常小的一个数 那后面的部分呢 就相当于什么都没看到 那这个值呢 就是不存在的 所以通过一个 非常巧妙的一个方法 去做到 好了 那么呢 那这边呢就是这样一个矩阵 我们说呢我们呢在做比如说LSTM或者在做RN的时候呢 它就只有三个值对吧 我们在LSTM或者这个RN的时候它里面只有三个值 那我们怎么能够把这些值都给它记住呢 我们呢就用一个矩阵把它存起来就可以了 那比如说我们用QKV这三个矩阵呢 就可以把之前的LSTM它不是只有三个值吗 我们就可以把三个值都扩大成一个矩阵 这样的话呢就可以把整个的这个过程都给它保存下来 那么矩阵相乘有一个什么样的特点呢 就是我 Q和K相乘的时候 它是Q的每一行乘以K的每一列 是吧 于是它相当于把每一个 每两个词之间的相互作用关系 都给它求出来了 那这样的话 我们就相当于把整个的 比如说我们放进去一个句子 那这个句子前面和后面的 整个的关联都能给它建立起来 当然就是你内存会占的比较多一点 不像LSTM它只有三个值 对吧 那三个值的话就只占 三个int或者三个flow的值这样的空间 那这个QKV的话 每一个都是一个矩阵 所以它的整个的空间开销 是非常巨大的 但是呢 它这样的话能够去记住 每一个东西的一个情况 然后这边做一个multi-height attention呢 也是一样的 那就是把这个我们这个single height 这样的一个attention呢 给它扩展成一个multi-height attention 这个以后再讲 好了 那它怎么做呢 就是我们有一个输入x 然后这个x呢 乘以我们的wq矩阵 你就可以得到q矩阵 x乘以wk矩阵 就可以得到k矩阵 w乘以wv矩阵 就可以变成v矩阵 然后呢 我们对于每一个词呢 它都有这个三个不同的向两空间 那么一个空间就是q 这个query key和value 然后把这三个值呢 给它进行相乘 这样的话呢 我们就可以知道 每两个词之间的相互作用关系是什么样 用矩阵相乘的这样的方式 因为矩阵相乘呢是行列式嘛 它每两个坐标值都进行了相乘 然后还给它相加 这样的话我就可以知道 它最后的一个关系是什么样的 于是呢我就把这个q呢和k矩阵呢 给它相乘 相乘了之后呢 就得到了每两个词之间的相互关系的 这样的一个矩阵 但是这个矩阵呢 就是比如我的 有的句子呢比较长 有的句子呢它比较短 那长了 这个句子呢 它的这个值呢就比较 短的句子它这个值就比较小一点 所以最后再给它除一个更换一下 dk这个值就给它进行一个 归一化对吧它们所有的这个大小 都给它放缩成一样让这个句子的 规模句子的长度呢不会 影响到这个最后这个score的这个情况 然后最后进行一个softmax 就像那样把最后的值给它求出来 当然了你最后得到一个attention weights 它是一个weights对吧 那你这个weights是不行的因为 这是一个归一化的一个 值嘛这是一个权重 那你每一个句子它还有一个 啊 每一个词它还有一个自己的一个矩阵 所以说再把它乘以一个V 这样的话就给它进行一个加权求和 最后就得到这样一个结果 那么来看看具体的这个过程是什么样 那我们有一个Q矩阵 有一个K矩阵 然后这两个矩阵相乘 就会得到一个QK的这样的一个矩阵 那这个矩阵里面包含的就是 每两个词之间 它们的一个关系是什么样 我们经过softmax 你看它有颜色深有的颜色浅 它就是每两个词之间的关系 是一个什么样的一个情况 好 当然前面还要进行一些归一化 因为它这个可能是4对吧 也可能是8 那4和8去对比的话呢就不公平 因为8的话呢它值就会大一点 你乘出来你每一个值都是一样 你最后乘出来再相加对吧 这个是加4次 那个是加8次 那肯定加出来的这个规模就不一样 所以办法先给它归一化之类的 所以然后再经过softmax 最后得到一个每两个字之间的这样一个关系是什么样 然后把这个关系的这个值�� 再乘以我们的这样的一个 权重的一个矩阵 那乘完了以后呢就 等 最终就是这个句子中的每一个词 它到底的重要性是什么样的一个情况 好的 那这个Z呢 我们把这个D行拿出来 比如把D行给它取出来 那Z的D行呢 就是这样 它是怎么求的呢 它是由行列式乘出来的 对不对 所以说呢 它就是由D行 对吧 D行这个乘以这个 这个V整个这个矩阵所得到的 所以我们是行列式嘛 所以是第一个位置和第一个位置相乘 第二个位置和第二个位置相乘 第三个位置和第三个位置相乘 然后把它们对应相称再相加 然后这一行呢 这一行呢 和这一列相乘 这一行呢和这一列相乘 这一行呢和这一列相乘 所以说它这个第一个位置呢 就等于0.3这个值呢 乘以它的这个第一行的这样一个情况 那这就是我们这样一个 Z的这样一个得到的方式 那么我们说呢 我们的deep learning呢 其实就是一个大的矩阵乘法 那比如说我们来看看我们这个MLP 就是我们的这个全连接神经网络 它是怎么去做的 比如说呢我们第一层是切84个 那这一看就是minis的数据器 然后呢有一些hidden layer 然后做一个output layer 那output layer是10个 因为它是首也数字嘛 是012345189 然后最后呢 得到一个 Cross-Entropy的一个Loss Layer 最后去看看到底 这个输出的这个数字是几 是吧 做这样一个情况 那么这个我们把每一个神经元 它里面不有很多神经元吗 就七八八十四个神经元 我们把每一个神经元取出来 看看这个神经元是什么样 这个神经元呢 可能有很多个输入 对吧 你看这RX1有很多的输入 有RX1 X2 X3 XM 有很多的输入 每一个输入呢 要成一个Weights矩阵 对吧 那就Weights 就是它的 这个Y等于 Kx加b嘛 那这就是它的斜率 对吧 这相对是k 然后呢再加上一个bias 就是它的b 对吧 所以这个sigma呢 它就等于y等于kx加b 只是它等于k 对吧 x1 k1x1加k2x2加k3x3 然后最后加上一个b 它其实就是一个我们的矩阵运算 这是一个矩阵运算 然后再加上一个偏移量 做这么一个事 最后加上一个activation function 就是给它 给它变成一个非线性的一个结果 我们这块呢不用去管 因为我们的这个深度学习呢 我们不想让它变成一个完全的矩阵运算 好 最后我们加一个activation方式 让它不会变成一个完全的一个矩阵运算 加一个激活层 其实和我们的softmax呢 其实是完全一样的 那我们要是 既然我们刚才说的attention 它也是一个 我们这样的一个矩阵运算的话 那我们是不是可以用MLP 来代替我们的attention呢 答案是可以的 是吧 所以你看就是我们 但是我们的MLP 我们之前所说的MLP呢 它每次都是y等于kx加b y等于kx加b 我们的attention呢 它里面是有各种转制的 那我们怎么办呢 我们就把我们的这样的一个 我们 就按我们的这样的一个MLP网络呢 也给它进行一个转制 进行一个transpose 那进行transpose之后呢 它不就变成了跟我们刚才 那个我们刚才那个attention 很相似的一个结果吗 对吧 我们进行两次transpose 第一次transpose是给它变成 一个不同的一个维度 然后用这个维度呢 再进行一个MLP 然后之后呢 把它变回来 因为我们之前是这样的 我们之后还应该是这样 那我们之前用MLP Mixer这篇文章呢 就可以很好去模仿Transformer的这样一个特点 就是所以说Transformer这个东西呢 它其实并不是一个什么很神秘的东西 它其实就是我们深度学习的一个普遍的做法 就是搞一些矩阵运算 这个矩阵运算呢 它有横着算 有竖着算 你把它们都共同结合起来 我们就可以找到这些不同的东西之间的 它的联系到底是什么样 所以说传输后面这个东西 它就是用来找到不同的这个词语之间 它们的关联是什么样的 这样的一个网络 那传输后面的这样的一个输出呢 是什么样的 就是我们把 我们把上一个 把这个磁放到这个Decoder里面 然后呢 它就会输出下一个词什么东西 我把这个 然后我们把这个我们已经知道了 因为我们是用begin然后来得到i 然后把begin和i这两个东西共同拿出来 放到declare里面 然后就可以得到预测下一个词是什么 下一个词就是hive 然后把begin i have这三个词拿出来 放declare里面 就可以预测下一个词是a 所以于是它就可以这么一直的预测下去 就像一个拉链一样 这么一直的就拉下去 这就是我们传说门的这样一个基本的方法 这也是我们记忆翻译的一个常用的做法 好的 那么我们传说门中还用到一些 别的技术,比如说我们这个正常的我们在使用这个deep learning的时候都一般就用什么batch normalization这样的方法 那batch normalization什么意思呢? 比如说我们有这个一个iris数据集 iris数据集呢,它有一个比如说有一个花瓣的一个花鳄的长度,然后我们花鳄的宽度,还有什么花瓣的这个长度,花瓣的宽度 那我们这个数据呢是高度对齐的,因为比如说每一个花呢它都有这四个这样的一个特点 对啊,四个这样的一个特点,四个这样的一个特点,然后每个特点的东西呢都是完全对应了,对吧 但这个都是花鳄,那这个都是花鳄 花个的宽度 它没有说说这个花个的宽度里面 又有花个的宽度 又有花个的长度 它都是完全对应了 是一个完全整齐划一的这样一个情况 所以Batch Normalization呢 在这个里面呢 就可以非常好去应用 因为呢我们就是把这一列呢 进行一个Normalization 这样的话呢就 因为每次取数据的时候 都是从我们大数据集里面 随机的去取一些数据 那么这个随机取的这些数据呢 它的这个分布呢 可能就和我们整个的这个数据呢 不完全一样 有的数据可能稍微大点 有的数据可能稍微小点 我们拜托 Bitumization就可以把我们这个随机取出来这部分的数据呢 给它变成一个同样的一个scale的一个数据 它就是因为你从一个大的数据集里面去随机的取出来一小个数据集 那这样的话呢 我们小的这个数据它的这个scale和大数据集呢 它不一定是一样 我们经过Bitumization之后 就可以尽量的保证我们小的这个scale和大的这个scale 它是完全一样的 那这样的话呢 就让我们的数据呢 因为我们每次取出来一个小的子集嘛 让这个子集和大的这个整个的数据集 它的这个数据 分布的情况可能不一样 它就不是一个独立同分布的这样一个感觉 我们如果每次都做一个byte-numeration的话 就可以让整个数据都变成一个 类似于独立同分布这样一个感觉 每次我们取出来的数据 它的分布情况都差不多 每次我们取出来的数据 它分布情况都差不多 每次训练这个模型的时候 就不会说一会儿数据忽小 一会儿数据忽大 忽小忽大这样的话 就会让这个模型很困惑 我到底是应该小还是应该大呢 我们要进行的byte-numeration的话 我们这个数据就每次的scale都差不多 这样的话就可以让这个数据训练的更好一点 但Transformer它不一样 Transformer每次输入的数据 它这个长度都不一样 小猫在睡觉 听中有很多白云 你看它每一次的长度都不一样 并且小猫和天空好像不能对应 小猫和他喜也不能对应 小猫和在寒也不能对应 所以说它这个内容都不能对应 那怎么办呢 我们就在每一个这样的一个 自己的这个内容的内部 去进行一个Normalization就可以了 我们就不用再对齐的去做一个Normalization 那我们之前那个Iris数据 它是对齐的做Normalization 对吧 后面它都空了 你怎么去做normalization 没法做normalization 所以我们就做了一个layer normalization 那layer normalization 它就是把每一层呢 给它进行一个normalize 那这样的话我们就可以避免一些 就是后面没有东西的这样一个情况 那就是我们这个最开始的这个模型 然后它里面呢 使用的这样一个方法 你看最开始的它这个模型 它就是add呢 就是我们说的残差 然后这个norm呢 就是我们说的layer normalization 做整个的这样一个情况 好 好那我们最后呢 应该到了最后的部分吧 让我们来看一看 它最后的效果是什么样子的 好还有一件事呢 就是tokenizer tokenizer是什么东西呢 就是我们有一个词 对啊我们有这样一个句子 比如小猫在睡觉 我们把这个小猫在睡觉 这个词放在transformer里 那transformer它是一个 计算矩阵乘法的这样一个模型 那我们怎么去计算 小猫在睡觉的矩阵乘法 没法计算小猫在睡觉的矩阵乘法 所以我们就把小猫在睡觉这个事呢 给它编码成一个矩阵的形式 编码成一个下降的格式 这样 才能对它进行一个操作 所以Tokenizer就是做这么一件事 那Tokenizer对于我们的词呢 就是去把它变成一个 向量化的这样一个过程 那如果是对于我们的这样一个图片的话呢 它就是 对于我们这样的图片的话 它就是把这个每一张图呢 给它变成一个类似于我们文字的这样的一个模式 这样输入到我们的Transformer里之后呢 它就相当于把这个图片呢 完全按照这个文字的模式去进行一个处理 那这是我们所说的Vision Transformer这样一个方式 好了 那么呢 你看VGTransformer 它的处理的模式 和我们基本的Transformer 其实是非常像的 它就是把我们的图片 贴成一小块一小块的 相对就是分词的操作 然后把它的每一个分词 给它拉成一条 意大利面一样的样子 然后拉成一个长轴面 然后直接塞到里面去 这样就可以直接 做出一个处理 那VIT 它为什么非要这么做 它就是想告诉大家 就是说Transformer 是个很厉害的模型 我们的数据 输入都不需要做一些 特别额外的一些处理 只要把它做成 就说和我们之前 那个正常Transformer里 一样的处理方式就可以了 大概就这样一个idea 好了 那最后的结果是怎么样呢 它Transformer呢 最开始做的就是一个 机器翻译的工作 因为Transformer 谷歌发明出来 就是想做一个 高级点的翻译器 对吧 以前的时候翻译 我们都是人工翻译 那现在你看哪还有人工翻译 那机器翻译翻译的 比人工翻译的还好 是吧 就各种什么Tri-GBT呀 或者是我们的 这个Google Translate 所以我说不要做这个 有些工作呢 它太机械性了 就不要去做 比如说这个以前 我们还有 人工翻译的这样的一个应用吧 现在根本就没有人在做人工翻译的 基本上都是用机器翻译 然后呢人工翻译也是机器翻译完之后呢 然后人工再去上面进行一些微调 进行一些修改 我觉得现在机器翻译做的结果非常不错 他们最后这个BLU呢 就是做这样一个机器翻译的工作 可能应该是德语转换成法语 然后转换成英语之类的东西吧 他们最后出来的结果呢 应该是非常不错的 这样一个情况 好了 那么最后来看一看 他们这样的一个attention是什么样子 我们刚才说attention呢 就是找这些东西之间的关系 比如我们这有个句子叫athes in this spirit 什么什么什么 做这么一个这样的一个句子 那我们就要找找 比如说你们这个making这个词 它和里面的哪些东西具有一个关联呢 于是呢 transformer就可以很好在这样的一个比较长的这样一个句子中 去找它上下文的一个匹配 比如说making呢 making什么呢 那应该是making more difficult对吧 就让这个什么事情变得更加的困难 所以它能够很好找到一个上下文的这样一个匹配的关系 那这就是 这个句子的这样一个翻译 是吧 他能找到就说 making的一代关系是什么东西 他是making什么东西啊 对吧 making more difficult 他可以找到这个关系 然后呢 在这个里面呢 他也能找到就说 每两个词之间 它有什么关系 比如说law呢 他这个law的 他这个定语呢 是则对吧 所以你就能发现这个law呢 它可以和则呢 进行关联 对吧 是则law对吧 他能够找到这个 每一个词的关联 然后他能找到 比如说law和is的关系 就是这个is 到底指代了什么东西呢 这个 意思指代的其实是law对吧 那这个law是什么呢 是择law对吧 所以说这个意思指代呢 是择law这样一个情况 所以他能找到这样的一个情况 然后呢你看这边也是这样的 就是说呢 我们这个有一个ease对吧 我们想找到这个ease的乘 这个乘的上下文的指代是怎么样 那transformer是找关系的嘛 所以说ease呢找到关系的 就是他和这个law呢 他有一个关系 那这个law呢 他和什么东西有关系呢 他是obligation 就是说这个law呢需要被部署对吧 所以说呢 这个你看他就是 能找到他们之间 一个联系 你看这边就是一个law对吧 然后呢 这个law呢和is呢是有关系的 因为它的 就是法律愿不是完美的 但它的实施应该公正 那这个它指的是什么呢 它指的就是这个法律 然后呢 它是做什么呢 它做的就是去做一个部署啊 去做一个实施的这样一个操作 所以说都能找到 它们之间的一个关系是什么 然后呢 这些图也是这样 就是它能够找到各种各样词的 一个不同的联系 在不同的层上呢 它找到的联系呢 是不一样的 这样一个情况 于是呢 就能做很多 这样的研究 比如说呢 the law对吧 the law是相关的 然后呢 这个well呢 是和什么联系呢 well是和b联系在一起 然后呢 这个respect perfect呢 是和什么联系 是b perfect是吧 是这样一个联系 所以他能找到 这个每一两个词之间 这样的一个关联 那这就是这样的 一个transformer的能力 他找到的就是 这些词之间的 联系什么东西 所以transformer就是一个 寻找关联的 这样一个模型 其实deep learning 大部分的deep learning呢 他都是去寻找 不同东西之间的 一个关联 好了 那今天视频到这里 大家看 大家观看我们下期再见