Transformer到bert

本文深入探讨了Transformer模型的原理,特别是Multi-Head Attention结构,接着详细介绍了BERT模型的创新点,包括双向Transformer用于语言模型,以及Masked Language Model (MLM)和Next Sentence Prediction (NSP)两个任务。BERT通过预训练过程提升了对语境的理解,其在编码器中利用整个文本进行处理。文章还提供了BERT的代码实现指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.Transformer原理

在这里插入图片描述
中间那层就是transformer模型,他做的处理就是一个变压器,首先将input进行编码,然后解码后发给output,如下图所示在这里插入图片描述
这个结构也可以叫做Multi-Head Attention结构。
下面详细看一下它的结构

在这里插入图片描述
query代表了decoder隐层序列,key代表了encoder隐层序列,value代表了encoder隐层的权重序列。那么Q,K,V则分别代表了三者包含多个样本时的matrix。

权重的计算方式有很多种,论文中使用的是“dot-product”,也就是使用t时刻encoder和decoder的隐层序列的点积作为t时刻的权重,因为这样做时间空间都很

二.bert模型

BERT 的创新点在于它将双向 Transformer 用于语言模型,
双向训练的语言模型对语境的理解会比单向的语言模型更深刻。
BERT是预测文中扣掉的词,可以充分利用到上下文的信息,这使得模型有更强的表达能力,这也是BERT中Bidirectional的含义。
bert主要是用了transformer的encoder模型,对输入的文本进行处理,因为encoder是输入整个文本因此可以处理上下文信息

  1. Masked LM (MLM)
    在将单词序列输入给 BERT 之前,每个序列中有 15% 的单词被 [MASK] token 替换。 然后模型尝试基于序列中其他未被 mask 的单词的上下文来预测被掩盖的原单词。
    这样就需要:

在 encoder 的输出上添加一个分类层
用嵌入矩阵乘以输出向量,将其转换为词汇的维度
用 softmax 计算词汇表中每个单词的概率

BERT 的损失函数只考虑了 mask 的预测值,忽略了没有掩蔽的字的预测。这样的话,模型要比单向模型收敛得慢,不过结果的情境意识增加了。

  1. Next Sentence Prediction (NSP)
    在 BERT 的训练过程中,模型接收成对的句子作为输入,并且预测其中第二个句子是否在原始文档中也是后续句子。
    在训练期间,50% 的输入对在原始文档中是前后关系,另外 50% 中是从语料库中随机组成的,并且是与第一句断开的。
    为了帮助模型区分开训练中的两个句子,输入在进入模型之前要按以下方式进行处理:

在第一个句子的开头插入 [CLS] 标记,在每个句子的末尾插入 [SEP] 标记。
将表示句子 A 或句子 B 的一个句子 embedding 添加到每个 token 上。
给每个 token 添加一个位置 embedding,来表示它在序列中的位置。

为了预测第二个句子是否是第一个句子的后续句子,用下面几个步骤来预测:

整个输入序列输入给 Transformer 模型
用一个简单的分类层将 [CLS] 标记的输出变换为 2×1 形状的向量
用 softmax 计算 IsNextSequence 的概率

在训练 BERT 模型时,Masked LM 和 Next Sentence Prediction 是一起训练的,目标就是要最小化两种策略的组合损失函数。

三.代码实现

首先先下载bert相关源代码git clone https://github.com/google-research/bert.git
然后编写bert文件

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import random
import collections
import os
import sys
import tarfile
from tensor2tensor.data_generators import generator_utils
from tensor2tensor.data_generators import problem
from tensor2tensor.data_generators import text_encoder
from tensor2tensor.data_generators import text_problems
from tensor2tensor.utils import registry

import tensorflow as tf


EOS = text_encoder.EOS



@registry.register_problem
class Bert(text_problems.Text2ClassProblem)</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值