李哥深度学习 第九节 文字生成理论与实战
一、Transformer

上次我们学习了Transformer模型的encoder部分,并进行了Bert的实战。我们通过自注意力机制,把CLS提取出来完成了分类。但是,这样只能做分类任务,那如果要生成文字呢?那就要使用这整个Transformer框架了。我们会介绍一下原理,然后在实战中看具体计算细节。
二、Decoder
从图中可以看出,Decoder的流程中多出两块,一个是第一部分的Masked,一个是Multi-Head Attention,我们先来介绍一下这俩
训练 Autoregressive

Decoder的训练过程使用到了自回归Autoregressive,Masked是自回归中的一个方法。
举个例子,我们有一条训练数据是语音的“機器學習”,那么Decoder的label我们就已知了。所以Decoder的输入,我们就直接用label,同时Autoregressive还有一个special token,也就是START,所以输入就是START+“机器学习”。
为什么直接用label?
其实也有别的想法比如用Encoder给出的特征来训练,但是效果不好,所以放弃了。
输入送进Decoder后,我们希望的是Decoder可以返回一个概率分布向量,向量里最大的值就是我们的输出。但是面临两个问题:如何让输出的每一个字总能结合已经输出的其他文字?如何让输出的每一个字总能结合我们输入的语境?其实,这就对应了图中的
Masked Multi-Head Attention 和 Multi-Head Attention。
-
Masked Multi-Head Attention
-
如何让输出的每一个字总能结合已经输出的其他文字?其他文字我们是知道的,毕竟我们直接用的label做输出嘛。但是,你不能让“器”去结合“学习”二字,毕竟咱们的Decoder训练数据就这么点,知道答案做对题和不知道答案做对题那肯定是完全不一样的。所以需要一个Mask矩阵,用于遮蔽后面的文字。当然实战中的做法还是让“器”字结合“机器学习”整个文本,只是在输出的时候会将通过“学习”二字计算的结果通过Mask矩阵置零,从而实现同样的效果。
-
Multi-Head Attention
-
如何让输出的每一个字总能结合我们输入的语境?其实这个语境就是我们之前学过的注意力机制,当时我们使用到了矩阵Q、K、V,这里也还是它们。不过,是用Decoder的Q,去乘Encoder的K。

生成
生成任务有一个最大的不同点,那就是它的输入总需要不断更新最新生成的文字,也就是说,它只能是串行的。所以生成任务极其缓慢。
Beam Search

三、生成项目实战
代码写的比较复杂,不太适合像之前那样讲啥贴啥,这里就不贴了
项目介绍
这是一个处理医院数据的项目,包含编号和CT表现和印象。这些数字是一些CT表现的编码形式,我们要根据编码给出医学印象。
数据处理
我们也写过几个模型了,每次最大的变化就是处理数据这部分
观察发现,我们有train和test两个csv数据集,train没有被划分,所以从里面取出10%的数据做验证集。
在process_data.py里,我们对train.csv完成了这个操作,得到了pro_train_data.csv和pro_val_data.csv
重复词表
这个医院的数据,用的是他们自己的词表,而咱们的词表是网上下载的,所以不能直接用,这里选择重新制作词表。
在pro_vocab.py中,我们统计了train.csv里各项数据出现的次数,然后添加到了bart的词表。
别忘了修改embedding的长度并保存到pytorch_model.bin中,以及配置文件里的vocab_size
增量预训练
如果任务是特定领域(比如医疗 / 金融文本处理):先跑 pretrain.py 做增量预训练,让模型进一步认识一些医疗领域的专业名词,再跑 finetine.py 微调,效果更好,
我们来看pretrain.py,这是预训练+验证的过程,这个项目的特点就是没有一个主函数main.py,而是分了几个不同的函数去运行。
在pretrain.py中,首先看它的main(),main函数通过parse_args()方法对一些参数进行了设置,然后最主要的还是train_and_validate函数
在train_and_validate函数中,我们调用了bart模型,使用AdamW优化器,带预热的线性学习率调度器。
首先对数据进一步处理,把所有可以训练的数据全部提取出来(训练的x和y,验证和测试的x),然后实例化一个MLM_Data对象,存储数据和一些其他信息。
然后切换到训练模式开始训练,在取批次数据时,getitem函数自动完成遮盖,然后计算loss,回传,优化器学习器更新,完成训练
预训练是不需要进行验证的,也不存在什么准确率,这里就是逢五轮保存一次就行
微调
微调这里,还是先做一些参数和其他的设置,然后进入训练模式
数据,模型,优化器学习率调度器,开始训练
微调需要验证,不像预训练时全部当作训练数据来用。用cider_score验证模型优劣,cider_score用于评价文本相似度。当传入模型的数据含有target时,就会自动进行生成和验证。验证需要把ids转回token
更多推荐
所有评论(0)