当前位置: 首页 > article >正文

《深度学习》bert自然语言处理框架

目录

一,关于bert框架

1、什么是bert

2、模型结构

        自注意力机制:

3、预训练任务

4、双向性

5、微调(Fine-tuning)

6、表现与影响

二、Transformer

1、传统RNN网络计算时存在的问题

1)串联

2)并行计算效果不好

2、统word2vec存在的问题

3、Transformer结构

1)关于Encoder-Decoder

2)编码器Encoder

3)语义编码

4)解码器Decoder

5)自注意力机制self attention

        • 如何实现自注意力机制?

6)self attention如何计算

        1、计算一段话中每个词之间的匹配程度

        2、通过匹配程度得到每个词的特征重要性。

7)多头机制multi-header

8)多层堆叠

9)三件函数位置编码

如何计算?

优点:

10)Add与Normalize

11)整体框架


一,关于bert框架

1、什么是bert

        BERT(Bidirectional Encoder Representations from Transformers)是一个基于Transformer架构的双向编码器表示模型,它通过预训练学习到了丰富的语言表示,并可以用于各种自然语言处理任务。

2、模型结构

        BERT基于Transformer的编码器部分,采用了多层自注意力机制前馈神经网络。这种结构使得BERT能够同时考虑文本中的上下文信息,从而捕捉到更加丰富的语义特征。

        自注意力机制:

                自注意力机制,是一种让模型在处理输入数据时能够自我关注捕捉序列内部元素之间关系的机制。与传统的注意力机制不同,自注意力机制不依赖于外部信息,而是直接分析序列内部的相互依赖性。它通过对序列中的每个元素计算它与其他所有元素之间的关联性,并据此生成一个加权向量,这个加权向量可以看作是该元素在当前上下文中的表示。

3、预训练任务

        BERT通过两个无监督的预测任务进行预训练,即遮蔽语言模型(Masked Language Model, MLM)和下一句预测(Next Sentence Prediction, NSP)。在MLM任务中,模型需要预测被遮蔽的词;在NSP任务中,模型需要判断两个句子是否是连续的。这两个任务使得BERT能够学习到语言的深层结构和语义信息。

4、双向性

        与之前的语言模型(如GPT)主要依赖之前或之后的上下文不同,BERT是双向的。这意味着它在预测一个词时会同时考虑该词前后的上下文,从而更准确地捕捉语义信息。

5、微调(Fine-tuning)

        在完成预训练后,BERT可以通过微调来适应各种下游任务。微调是指在特定任务的数据集上对预训练模型进行进一步的训练,以使其更好地适应该任务。BERT的灵活性使得它可以应用于多种自然语言处理任务,如文本分类、命名实体识别、问答等。

6、表现与影响

        BERT在各种自然语言处理任务中都取得了显著的成绩,刷新了多项基准测试的记录。它的成功推动了预训练语言模型的发展,为后续更多先进模型(如RoBERTa、ALBERT等)的出现奠定了基础。

二、Transformer

1、传统RNN网络计算时存在的问题

1)串联

        导致数据必须从h1-h2-…hm。数据训练时间变长,因为需要要等h1的结果出来才能计算h2,h2结果出来才能计算h3,最终一个一个计算完得到最终结果。

2)并行计算效果不好

        也就是不能多台服务器同时训练一个网络,在CNN中可以把多个卷积核放在多台电脑中训练,但是在RNN中必须从头到尾的来对模型进行训练,无法在多台电脑上进行训练

        在上图的x1、x2、x3........之前应该要有一个词嵌入层,将输入模型的词或字的转变成词向量的格式,然后再传入模型。

2、统word2vec存在的问题

        1)词向量一旦训练好了,就不会改变

        2)不同语境中的词含义不同,例如  【a、台湾人说机车。 b、机车】 因此根据上下文不同的语境,应该有多个不同的词向量。

3、Transformer结构

1)关于Encoder-Decoder

        Encoder-Decoder也就是编码-解码框架,目前大部分attention模型都是依附于Encoder-Decoder框架进行实现。

        在NLP中Encoder-Decoder框架主要被用来处理序列-序列问题,也就是输入一个序列,生成一个序列的问题,这两个序列可以分别是任意长度。

        比如:

        文本摘要:输入一篇文章(序列数据),生成文章的摘要(序列数据)

        文本翻译:输入一句或一篇英文(序列数据),生成翻译后的中文(序列数据)

        问答系统:输入一个question(序列数据),生成一个answer(序列数据)

2)编码器Encoder

        编码器,对于输入的序列<x1,x2,x3…xn>进行编码,使其转化为一个语义编码C,这个C中就储存了序列<x1,x2,x3…xn>的信息,编码方法:主要RNN/LSTM/GRU/BiRNN/BiLSTM/BiGRU,例如RNN中用h4直接作为语义编码C的值。

        或者说,编码器将输入的文本序列转换为一系列上下文感知的编码表示。编码器由多个相同的层组成,每个层包含了自注意力机制(Self-Attention)和前馈神经网络(Feed-Forward Neural Network)两个子层。在自注意力机制中,编码器可以根据上下文信息自动地关注输入序列中与当前位置有关的其他位置,从而捕捉到上下文之间的依赖关系。前馈神经网络则对自注意力机制的输出进行非线性变换和特征提取。

3)语义编码

        例如当我们翻译法语中的“Boujour”时,我们大脑是先将Bonjour所表达的概念意识提取出来,这也就是一个编码的过程。 然后提取出来的这个意识概念也就是我们的Feature Vector. 接下来我们的大脑就会基于这个意识概念,去我们大脑中的英语语言库中把与这个意识概念匹配的英文单词提取出来, 这也就是解码的过程。

4)解码器Decoder

        解码器,根据输入的语义编码C,然后将其解码成序列数据,解码方式也可以采用RNN/LSTM/GRU/BiRNN/BiLSTM/BiGRU。 Decoder和Encoder的编码解码方式可以任意组合

        或者说,解码器的任务是将编码器产生的上下文感知的编码表示转换为目标语言的文本序列。解码器也由多个相同的层组成,每个层同样包含自注意力机制和前馈神经网络两个子层。此外,解码器还包含一个额外的自注意力机制,用于在生成目标语言序列时对输入序列进行关注,从而引入了源语言和目标语言之间的关联。

5)自注意力机制self attention

        在Transformer模型中,自注意力机制(Self-Attention)是一种用来建模序列内部关系的机制。它是一种注意力机制的变体,用于在序列中捕捉不同位置之间的依赖关系,以及为每个位置提供上下文信息。

        自注意力机制将输入序列映射为三个不同的表示:查询(Query)、键(Key)和值(Value)。对于每个位置的查询,通过计算与所有位置的键的相似度得到一个权重分布,然后将该权重分布与对应位置的值进行加权求和,得到该位置的输出表示。

        一句话中,哪些是重点?如何让计算机关注到话语中的重点?

        例如下图,it指代的是animal还是street?

        • 如何实现自注意力机制?

                1、首先输入经过编码后得到的词向量

                2、构建三个矩阵,相当于cnn的卷积核, 分别为wQ、wK、wv矩阵。

                3、将每一个词向量与矩阵相乘,得到QKV矩阵。 其中查询Q:需要查询的,键K:等着被查的 ,值V:实际的特征信息

6)self attention如何计算
        1、计算一段话中每个词之间的匹配程度

                q1和k1的内积表示第1个词和第1个词的匹配程度为112

                q1和k2的内积表示第1个词和第2个词的匹配程度为96

        2、通过匹配程度得到每个词的特征重要性。

7)多头机制multi-header

        卷积神经网络种有多组卷积核,就会产生多个特征图。 同理,在transformer中有多组q、k、v就会得到多种词的特征表达。

        在Transformer模型中,多头机制(multi-head)是指将模型的自注意力机制(self-attention)分为多个头部(heads)进行并行计算。每个头部都有自己独立的一组注意力权重(attention weights),用于计算输入序列中不同位置的重要性。

        通过引入多个头部,模型可以在不同的注意力空间(attention space)中学习到不同的特征表示。每个头部可以关注输入序列中的不同位置,学习到不同的语义关系,从而提升模型的表达能力和泛化能力。

8)多层堆叠

        多层堆叠是指将多个Transformer模块按照一定顺序进行堆叠,形成一个深层的神经网络结构。每个Transformer模块都由多个子层组成,包括自注意力子层前馈神经网络子层

        多层堆叠的主要目的是增加模型的表示能力和学习能力。通过增加堆叠的层数,模型可以学习到更复杂的特征表示,并能够处理更长距离的依赖关系。每一层都可以提取不同层次的特征,从而提高模型的表达能力和泛化能力。

        在多层堆叠中,每个Transformer模块的输入是前一层的输出。每层的输入序列经过自注意力子层和前馈神经网络子层后,再进行残差连接(residual connection)和层归一化(layer normalization),最后得到该层的输出。多层堆叠中的每个模块都可以共享参数,这使得模型更加紧凑和高效。

9)三件函数位置编码

        前面的模型,并没有考虑词的顺序,只是单纯考虑一段话有哪些词。因此模型中需要加入位置编码。

        位置编码是一种用于表示输入序列中每个元素在序列中的位置信息的技术。由于Transformer模型中没有使用循环神经网络或卷积神经网络,无法通过相对位置或位置索引来直接捕捉到序列元素的位置关系。因此,位置编码被引入以提供位置信息。

        位置编码通常是通过将位置信息编码为一个与词向量维度相同的向量来实现的。在Transformer模型中,常用的位置编码方法是采用三角函数的方式,即通过正弦和余弦函数来编码序列中每个位置的位置信息。

如何计算?

        word embedding:是词向量,由每个词根据查表得到

        pos embedding:就是位置编码。

        composition:word embedding和pos embedding逐点相加得到,既包含语义信息又包含位置编码信息的最终矩阵。

公式:

        pos:指当前字符在句子中的位置(如:”你好啊”,这句话里面“你”的pos=0)

        dmodel:指的是word embedding的长度(例“民主”的word embedding为[1,2,3,4,5],则dmodel=5),

        2i表示偶数,2i+1表示奇数。取值范围:i=0,1,...,dmodel−1。偶数使用公式(1),奇数时使用公式(2)。

         当pos=3,dmodel=128Positional Encoding(或者说是pos embedding PE)的计算结果为:

优点:

        1、可以使PE分布在[-1,1]区间。

        2、不同语句相同位置的字符PE值一样(如:当pos=0时,PE=0)。

10)Add与Normalize

11)整体框架

        outputs(shifted right):指在解码器处理过程中,将之前的输出序列向右移动一位,并在最左侧添加一个新的起始符(如“<sos>”或目标序列开始的特殊token)作为新的输入。这样做的目的是让解码器在生成下一个词时,能够考虑到已经生成的词序列。

        作用:通过“shifted right”操作,解码器能够在生成每个词时,都基于之前已经生成的词序列进行推断。这样,解码器就能够逐步构建出完整的输出序列

        示例说明:假设翻译任务,输入是“我爱中国”,目标输出是“I love China”。在解码器的处理过程中: 在第一个步,解码器接收一个起始符(如“<sos>”)作为输入,并预测输出序列的第一个词“I”。 在第二个步,解码器将之前的输出“I”和起始符一起作为新的输入(即“<sos> I”),并预测下一个词“love”。 以此类推,直到解码器生成完整的输出序列“I love China”。

12)训练数据

        1、随机的将句子中的15%的词汇进行mask。让模型去预测mask的词汇。 注:一般选择字进行mask,词的可能性太多,例如今天,明天,后天,上午,下午,没有,再次等等。

        2、预测两个句子是否应该连在一起。

        CLS:分类标记(Classification Token)用于表示输入序列的开始。在输入序列中,CLS应放置在句子的开头。在训练过程中,CLS也当作一个词参与训练,得到对应与其他词汇关系的词向量。

        SEP:分隔符标记(Separator Token)用于分隔两个句子或表示单个句子的结束。在处理多个句子时SEP应放置在每个句子的结尾。在训练过程中,SEP也当作一个词参与训练,得到对应与其他词汇关系的词向量。


http://www.kler.cn/a/382746.html

相关文章:

  • 三周精通FastAPI:33 在编辑器中调试
  • 鸿蒙开发:arkts 如何读取json数据
  • 一周内从0到1开发一款 AR眼镜 相机应用?
  • 单臂路由实现不同VLAN之间设备通信
  • C# 内存管理与对象生命周期在面向对象设计中的重要性
  • 用ChatGPT提高工作效率,轻松搞定每天任务!
  • C++:模拟实现STL的vector
  • 零日漏洞被谷歌的 AI 工具发现
  • 华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力6-识别目标形状
  • 【主机游戏】森林之子游戏介绍
  • R语言生物群落(生态)数据统计分析与绘图丨tidyverse数据清洗、多元统计分析、随机森林、回归及混合效应模型、结构方程模型等
  • vue | 自学入门,记录
  • MySQL日期时间函数大全
  • 博客搭建之路:next主题修改侧边栏icon
  • Python画笔案例-096 彩色粒子克隆动画
  • Java多态和继承(上篇)
  • MCU GD32A启动流程及各个段的初始化
  • SDL基本使用
  • 微信支付宝小程序SEO优化的四大策略
  • Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
  • 【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】
  • 【Linux-进程间通信】消息队列
  • 移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (6) - 触屏事件
  • 【极客兔兔-Web框架Gee详解】Day2 上下文Context
  • 【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方
  • Unity3D学习FPS游戏(10)子弹攻击敌人掉血(碰撞检测)