浅谈Bert

    最近两周在学习Bert,下面简单谈一谈在学习过程中自己的一些收获。水平有限,不喜勿喷。
    bert是现在自然语言预训练方法,但是同样是自然语言处理,为什么Bert就比别的方法好呢?
    在我查了大量资料后,发现Bert主要有三个创新之处。

1.两阶段模型

第一阶段双向语言模型预训练

    在语言模型预训练上,Bert不再使用标准的从左到右预测下一个词作为目标任务,而是提出了两个新的任务。第一个任务他们称为MLM,即在输入的词序列中,随机的挡上15%的词,然后任务就是去预测挡上的这些词,可以看到相比传统的语言模型预测目标函数,MLM可以从任何方向去预测这些挡上的词,而不仅仅是单向的。
    缺点:预训练用[MASK]提出挡住的词后,在微调阶段是没有[MASK]这个词的,所以会出现不匹配。改进:不是总是用[MASK]去替换挡住的词,在10%的时间用一个随机词去替换,10%的时间就用这个词本身。

第二阶段Fine-tuning

    fine-tuning的过程其实就是用训练好的参数(可以从已训练好的模型中获得)初始化自己的网络,然后用自己的数据接着训练,使用一个在大的数据集上预训练好的模型,在自己数据上微调往往可以得到比直接用自己数据训练更好的效果。

2.特征抽取用Transformer作为抽取器

    BERT取得成功的一个关键因素是Transformer的强大作用
    Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。

3.双向语言模型采取CBOW的方法去做

    CBOW 是Continuous Bag-of-Words Model 的缩写,是一种根据上下文的词语预测当前词语的出现概率的模型。可以根据语义环境来进行向量化。


下面是我对模型中部分参数的理解:

1.“attention_probs_dropout_prob”: 0.1
注意力层的dropout概率,缓解过拟合,增强泛化
2. hidden_act": "gelu
激活函数(gelu为高斯误差线性单元,是一种高性能的神经网络激活函数,因为GELU的非线性变化是一种符合预期的随机正则变换方式,GELUs其实是 dropout、zoneout、Relus的综合,同时实验效果要比Relus与ELUs都要好)
3.“hidden_dropout_prob”: 0.1
隐藏层dropout概率
4.“hidden_size”: 768
隐藏层的特征数(这个参数表示的是用于记忆和储存过去状态的节点个数)
5.“initializer_range”: 0.02
初始化范围
6.“intermediate_size”: 3072
升维维度
7.“max_position_embeddings”: 512
一个大于seq_length的参数,用于生成
position_embedding(位置向量,不是特别重要)
8**“num_attention_heads”: 12**
每个隐藏层中的attention head数
9.“num_hidden_layers”: 12
隐藏层数,增加隐层数可以降低网络误差,提高精度,但也使网络复杂化,增加了训练时间,增加了出现过拟合的倾向。在满足精度要求的前提下取尽可能紧凑的结构,即取尽可能少的隐层节点数。


概念解释:
1.激活函数(或者激励函数):为了给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性代数。
2.dropout(随机失活):随机失活是为解决深度神经网络的过拟合(overfitting)和梯度消失(gradient vanishing)问题而被提出的优化方法,在神经网络的学习过程中,随机将部分隐含层节点的权重归零,由于每次迭代受归零影响的节点不同,因此各节点的“重要性”会被平衡 。引入随机失活后,神经网络的每个节点都会贡献内容,不会出现少数高权重节点完全控制输出结果的情况,因此降低了网络的结构风险。

猜你喜欢

转载自blog.csdn.net/weixin_43622131/article/details/91345337