t4
1 BertTokenizer
组成结构:BasicTokenizer和WordPieceTokenizer
BasicTokenizer主要作用是做一些基础的大小写、unicode转换、标点符号分割、小写转换、中文字符分割、去除重音符号等操作,最后返回的是关于词的数组(中文是字的数组)
WordPieceTokenizer主要作用基于vocab切词
FullTokenzier
这个基本上就是利用basic和wordpiece来切分。用于bert训练的预处理。基本就一个tokenize方法。不会有encode_plus等方法。
PretrainTokenizer 这个则是bert的base类,定义了很多方法(convert_ids_to_tokens)等。 后续的BertTokenzier,GPT2Tokenizer都继承自pretrainTOkenizer,下面的关系图可以看到这个全貌。
BertTokenizer常用方法: 1. from_pretrained:从包含词表文件(vocab.txt)的目录中初始化一个分词器; 2. tokenize:将文本(词或者句子)分解为子词列表; 3. convert_tokens_to_ids:将子词列表转化为子词对应的下标列表; 4. convert_ids_to_tokens :与上一个相反; 5. convert_tokens_to_string:将subword列表按“##”拼接回词或者句子; 6. encode:
对于单个句子输入,分解词,同时加入特殊词形成“[CLS], x, [SEP]”的结构,并转换为词表对应的下标列表;
对于两个句子输入(多个句子只取前两个),分解词并加入特殊词形成“[CLS], x1, [SEP], x2, [SEP]”的结构并转换为下标列表;
decode:可以将encode方法的输出变为完整句子。
组成结构:主要是Transformer-Encoder结构
embeddings:BertEmbeddings类的实体,根据单词符号获取对应的向量表示;
encoder:BertEncoder类的实体;
pooler:BertPooler类的实体,这一部分是可选的
BertModel常用方法:
get_input_embeddings:提取 embedding 中的 word_embeddings,即词向量部分;
set_input_embeddings:为 embedding 中的 word_embeddings 赋值;
_prune_heads:提供了将注意力头剪枝的函数,输入为{layer_num: list of heads to prune in this layer}的字典,可以将指定层的某些注意力头剪枝。
对于输入word_ids,返回embedding table。可以选用one-hot或者tf.gather()
输出结果:通过word_embeddings、token_type_embeddings、position_embeddings三个部分求和,并通过一层 LayerNorm+Dropout 后输出得到,其大小为(batch_size, sequence_length, hidden_size)
word_embeddings:子词(subword)对应的embeddings
token_type_embeddings:用于表示当前词所在的句子,区别句子与 padding、句子对之间的差异
position_embeddings:表示句子中每个词的位置嵌入,用于区别词的顺序
使用 LayerNorm+Dropout 的必要性: 通过layer normalization得到的embedding的分布,是以坐标原点为中心,1为标准差,越往外越稀疏的球体空间中
技术拓展:梯度检查点(gradient checkpointing),通过减少保存的计算图节点压缩模型占用空间
BertSelfAttention
初始化部分:检查隐藏层和注意力头的参数配置倍率、进行各参数的赋值
前向传播部分:
multi-head self-attention的基本公式:$\text{MHA}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)W^O \ \text{head}_i = \text{SDPA}(\text{QW}_i^Q, \text{KW}_i^K, \text{VW}_i^V) \ \text{SDPA}(Q, K, V) = \text{softmax}(\frac{Q \cdot K^T}{\sqrt{d_k}}) \cdot V$
transpose_for_scores:用于将 hidden_size 拆成多个头输出的形状,并且将中间两维转置进行矩阵相乘
torch.einsum:根据下标表示形式,对矩阵中输入元素的乘积求和
positional_embedding_type:
absolute:默认值,不用进行处理
relative_key:对key layer处理
relative_key_query:对 key 和 value 都进行相乘以作为位置编码
BertSelfOutput:
前向传播部分使用LayerNorm+Dropout组合,残差连接用于降低网络层数过深,带来的训练难度,对原始输入更加敏感。
主要结构:全连接和激活操作
全连接:将原始维度进行扩展,参数intermediate_size
激活:激活函数默认为 gelu,使用一个包含tanh的表达式进行近似求解
主要结构:全连接、dropout+LayerNorm、残差连接(residual connect)
主要作用:取出句子的第一个token,即[CLS]对应的向量,然后通过一个全连接层和一个激活函数后输出结果。
Last updated