NLP 主要语言模型分类
文章目录
- ngram
- 自回归语言模型
- Transformer
- GPT
- BERT(2018年提出)
- 基于 Transformer 架构的预训练模型
- 特点
- 应用
- 基于 transformer(2017年提出,attention is all you need)
- 堆叠层数
- 与原transformer 的差异
- bert transformer 层
- 输出形状
ngram
- N一般取 3-5
- 马尔可夫假设
- 假设第 n 个词出现的概率,仅收前面有限个词影响
- 处理未出现语料的概率
- 平滑方法:回退
- 谷歌给出的回退建议值:0.4
- 试用二元组代替三元组,做惩罚
- P(c | ab) = P(c | b) * Bow(ab)
- 平滑方法:回退
自回归语言模型
-
RNN
- 循环神经网络
自带激活函数 tanh
- 特点
- 一种经典的序列模型,能够处理变长输入序列。
- 对输入内容串行处理,处理后面的内容,必须要等前面内容顺序先处理完毕,有效率问题。
- 应用
语言建模、机器翻译和情感分析。 - 变体
- LSTM
- 长短期记忆网络
- 神经语言模型
- 选择性遗忘
通过多个 RNN 来实现 - 三个门
- Gate 机制(门限机制)- ft、it、ot 中用的是 sigmod 做激活函数
Sigmod 输出的结果范围(0, 1),无限接近 0 的结果会被忽略 - 通过数据筛选,做记忆更新
- 生成候选记忆时用tanh
- ft、it、ot 中用的是 sigmod 做激活函数
- 特点
- RNN 的一种扩展,通过引入门控机制来解决传统 RNN 中的梯度消失问题。
- 双向 LSTM
文本分别正向和反向输入得到两个 LSTM 输出- LSTM 是时序模型
- 双倍参数得到更好的训练效果
- 输出形状
- batch_first=True
[batch_size, sentence_length, hidden_size], [sentence_length, hidden_size]
- batch_first=False
[sentence_length, batch_size,, hidden_size], [sentence_length, hidden_size]
- batch_first=True
- 应用
- 处理长序列任务
- 语言建模、机器翻译和情感分析
- 长短期记忆网络
- GRU
门控循环单元- 神经语言模型
- 和 LSTM 相比,只有两个门
- 重置门
- 更新门
- 控制信息的保留和更新
- 将短期和长期记忆信息融合在一个隐藏状态中
- 特点
也是一种带有门控机制的 RNN 变体,但它拥有更简单的结构。在某些情况下,GRU 的性能与 LSTM 相当。 - 应用
- 处理长序列任务。
- 语言建模、机器翻译和情感分析。
- LSTM
- 循环神经网络
-
CNN
卷积神经网络
按照文本长度卷积,需要先转置,卷积结束再转置回原形状。-
特点
- 可以捕获局部特征并将它们组合成全局特征。
- 有语序信息
- 可以并行计算
-
应用
文本分类和文本表示学习 -
变体
Gated-CNN
卷积 A 与卷积 B 对位相乘,过滤 AB 相乘后为 0 部分,放缩 B 中在 0-1 的部分。
-
Transformer
- 预训练语言模型
基于自注意力机制 self attention。 - 特点
完全摒弃了 RNN 和 CNN,取得了在各种 NLP 任务上的显著性能提升。
GPT
- 基于Transformer架构的生成式模型
能够生成与训练数据类似的新样本的模型 - 应用
生成文本
回答问题
完成对话
文本摘要
语言翻译
…
BERT(2018年提出)
基于 Transformer 架构的预训练模型
- 下载预训练模型
hugging face - 预训练方式
- 完形填空 MLM(mask language model)
- 句子关系预测 NSP(next sentence pretraining)
判断两句话是不是挨着的
特点
1. 通过大规模无监督预训练学习出通用的语言表示,通过微调(fine-tuning)在各种 NLP 任务上取得了令人瞩目的性能。- 预训练方法 pre-train + fine-tune- fine-tune可以理解为通过反向传播中对 bert 参数的再训练- Pre-train- 预训练会提前收集海量无标注文本数据- 进行预训练,在任务模型中使用- 预训练方式- 完形填空mask Language model `(预测 mask 对应字符)`- 句子关系预测两句话同时送入模型判断上下文关系`(二分类任务)` - 在预训练过程中,BERT 被训练来预测给定句子中的缺失单词,这种预测任务被称为掩码语言模型(MLM)。
2. 是一种动态的,词义结合语境判断
3. 通过预训练利用了海量无标注文本数据
4. 相比词向量,bert 的文本标识结合了语境- 本质是一种文本表征- 词义是动态的,可以结合语境判断
5. Transformer 模型结构有很强的拟合能力,词与词之间的距离不会造成关系计算上的损失
6. 训练的效果得到大幅提升
- 核心思想
- 本质是一种动态的文本表征
- 通过双向(bidirectional)的训练方式,在预训练阶段学习出语言的上下文相关表示,从而在下游任务中更好地理解语言。
应用
- 常用于各种自然语言处理的判别式任务
- 具体分类
文本分类
命名实体识别
文本相似度计算
语义理解
…
基于 transformer(2017年提出,attention is all you need)
堆叠层数
- base 版本
共堆叠 12 层 transformer encoder 层 - large 版本
共堆叠 24 层 transformer encoder 层
与原transformer 的差异
- 仅使用了transformer 的encoder 层
通用 transformer 层 - position encoding
位置编码最多512个
原先是正余弦位置编码,是固定的,不可训练 - feed forward 两个线性层之间的激活函数
使用了 Gelu
原先是 Relu
bert transformer 层
- 前提
-
embedding
Embedding 层由三部分加和组成
1. 每个词对应的矩阵 token embeddings2. 每句话对应的矩阵 segment embeddings判断来源语句3. 每个词位置矩阵 position embeddings带入语序信息4. 加入 [CLS] [SEP] 标记文本起始位置
-
矩阵维度 embedding_dim
- 768
bert base 版本
多头机制切分12份64维度矩阵 - 1024
bert large 版本
- 768
-
embedding 层加和后会做 layer normalization
做一次归一化操作(提高模型稳定性)
公式注解:减均值,除以标准差,乘以可训练系数。其中:U 是均值σ 是标准差
-
总参数量
vocab * embedding_dim + max_sequence_length * embedding_dim + n * embedding_dim + embedding_dim + embedding_dim
- 词表embedding 参数
vocab * embedding_dim
- 句子参数
n * embedding_dim
- layer_norm层参数
embedding_dim + embedding_dim
- 位置参数
max_sequence_length * embedding_dim
允许最大长度 * embedding_size
- 词表embedding 参数
-
最终形状
[seq_len, embedding_dim]
-
- multi-head self attention
-
结构梳理
- embedding 的输出,作为 self attention 的输入
Q、K、V 是三个形状相同的矩阵- 三个线性层权重不同
- 实现对 X 的不同变化
- 线性层不改变 x 的形状
- 公式解释与作用
- Q * K的转置
- 得到 文本长度 * 文本长度的矩阵
会得到每个字和整句话中任何一个字的相关性
- 得到 文本长度 * 文本长度的矩阵
- Softmax 对矩阵中每个向量做归一化(逐行softmax)
- 得到每个字对整句话的注意力
可以很好的捕捉长距离的关系。 - 分值越高,注意力越高,相关性越强,字之间相关性与注意力成正比
- 得到每个字对整句话的注意力
- 根号 dk
- 根号下(神经元个数(768) / 总头数)
- 除以根号 dk
可以拉低矩阵数值分布,提高 softmax 计算后每个维度数值在 0-1 的分布情况
- 最终形状
- X * Q 、X * K、X * V
[seq_len * embedding_dim]
- Z
[seq_len * embedding_dim]
- X * Q 、X * K、X * V
- embedding 的输出,作为 self attention 的输入
-
多头自注意力机制
- 多头机制 muti-head
- 每一份都执行一次 2 的计算流程
最后把所有的计算结果拼起来 - 相当于模型集成
- 可以认为在同时训练相同大小的多个模型
- 可以提升模型拟合效果
集成模型比单模型效果好
- 每一份都执行一次 2 的计算流程
- 多头机制 muti-head
-
self attention 最终输出
经过 QKV 计算之后的结果,再经过一层线性层 -
总参数量
self_attention_parameters = embedding_dim * embedding_dim + embedding_dim + embedding_dim + embedding_dim
- self_attention_out
embedding_dim * embedding_dim + embedding_dim
- 残差机制
embedding_dim + embedding_dim
layerNorm(原始信息 x + self attention 输出)- 深层次网络结构下,保留更多的原始信息
- self_attention_out
-
- feedforward
𝑜𝑢𝑡𝑝𝑢𝑡=𝐿𝑖𝑛𝑒𝑟(𝑔𝑒𝑙𝑢(𝐿𝑖𝑛𝑒𝑟(𝑥)))
结构
1. 线性映射到原来矩阵的 4 倍矩阵
2. 4倍矩阵先经过 gelu
3. 从 4 倍矩阵再映射回原矩阵大小
为了增加高维数据的数据表征- 总参数量
([1, embedding_dim] * [embedding_dim, hide_size] + hide_size) + ([1, hide_size]* [hide_size, embedding_dim] + embedding_dim) + embedding_dim + embedding_dim
- 第一个线性层
[1, embedding_dim] * [embedding_dim, hide_size]
- 第二个线性层
[1, hide_size] * [hide_size, embedding_dim] + embedding_dim
- 残差机制
embedding_dim + embedding_dim
layerNorm(原始信息 z + feed forward 输出)
- 第一个线性层
- 总参数量
- pooler层
- 将[CLS]这个token过一下全连接层,再过一下 tanh 激活函数,作为该句子的特征向量:
- 这里的 pooler 层是一个线性变换,得到一个固定维度的池化表示,不是传统的池化
- 参数总量
embedding_dim * embedding_dim + embedding_dim
输出形状
[batch_size, sentence_length, hidden_size], [sentence_length, hidden_size]