一种 用于GPT模型 训练的 包含加权 和 数据增强 和 损失方法 的设计

根据之前训练的字模型+PALM效果和经验。真是胡言乱语,牛头不搭马嘴。观察了模型的在各种条件下的输出。看大佬的各种的增强方法,搞了2周写完了新的增强管道。
换了新方案,继续训练了一晚上,马上就有不错的生成效果了,泪目。

在老的增强方法和损失函数上,T5 模型不太行,8+8 层的情况下生成效果不如12层相似参数量的PALM连贯,准确度也不如PALM,训练速度也比PALM慢2倍。

训练语料是质量较好的,但比较少,而且生僻字略多,所以使用字模型。

训练模型:GPT模型(参数量44M)
训练任务:翻译;对话续写;填空
词袋:单字(char)
词采样方法:top_K + top_P + temperature + 重复词概率惩罚

设计思路:
基于FLM方法,只能看到前面的词,而看不到后面的词的原理。随机破坏的前面的词,同时给予这些词分类 低权重或负权重进行学习,意为阻止模型对被破坏词的学习;然后适当降低被破损词的下一个词的权重,意为使下一个词受前一个词影响而降低概率了,但影响不大。

注意:所有增强均为训练中动态增强,而不是扩增后保存下来作为增强数据库。

中文增强流程

第一行为分词
第二行为权重

下面的 * 号 代表乘法,下面不同的增强方式组合起来,乘法之后,权重会比较多样化

预先设定,0.3概率,整句跳过所有增强


1 输入

枯叶堆静静地燃烧起来
1.0

2 检查汉字数量,如果小于4则跳过增强。

3 首先进行 jieba 分词,并逐词分配基础句子权重

枯叶静静地燃烧起来
1.01.01.01.01.0

4 对词进行增强

下面以选中 “静静地” 这个词为例

4.1 随机替换词

迭代所有词,对每一个词都使用概率 0.05 判断是否增强,增强方法从下面4个随机选一个

4.1.1 替换为同义词

:选中词的权重 * 0.9

枯叶寂静地燃烧起来
1.01.00.91.01.0
4.1.2 替换为同类词

:选中词的权重 * 0.4

枯叶暗暗地燃烧起来
1.01.00.41.01.0
4.1.3 替换为反义词

:选中词的权重 * -0.3

枯叶嘈杂地燃烧起来
1.01.0-0.31.01.0
4.1.4 替换为无关词

:选中词的权重 * -1.0

枯叶飞机燃烧起来
1.01.0-1.01.01.0

4.2 随机插入词

逆向迭代所有词,对每一个词都使用概率 0.05 判断是否增强,增强方法从下面4个随机选一个
词插入的位置是当前位置(即代表当前词会往后挪一下)

4.2.1 插入为同义词

:选中词的下一个位置的词权重 * -0.3

枯叶寂静地静静地燃烧起来
1.01.01.0-0.31.01.0
4.2.2 插入为同类词

:选中词的当前位置的词权重 * 0.7
:选中词的下一个位置的词权重 * -0.5

枯叶暗暗地静静地燃烧起来
1.01.00.7-0.51.01.0
4.2.3 插入为反义词

:选中词的当前位置的词权重 * -0.5
:选中词的下一个位置的词权重 * 0.5

枯叶嘈杂地静静地燃烧起来
1.01.0-0.50.51.01.0
4.2.4 插入为无关词

:选中词的当前位置的词权重 * -1.0
:选中词的下一个位置的词权重 * 0.3

枯叶飞机静静地燃烧起来
1.01.0-1.00.31.01.0

4.3 随机交换词序

迭代所有词,对每一个词都使用概率 0.05 判断是否增强
:选中词的当前位置的词权重 * 0.65
:选中词的下一个位置的词权重 * 0.65

枯叶燃烧静静地起来
1.01.00.50.51.0

4.4 随机删除词

迭代所有词,对每一个词都使用概率 0.05 判断是否增强
:选中词的当前位置的词和词权重删除
:选中词的下一个位置的词权重 * 0.7

枯叶燃烧起来
1.01.00.71.0

5 对字进行增强

把词进一步拆开,得到一串单字列表

1.01.01.01.01.01.01.01.01.01.0

下面以选中 “烧” 这个字为例

5.1 随机替换字

5.1.1 替换为同音字

迭代所有字,对每一个字都使用概率 0.05 判断是否增强
:选中字的权重 * 0.6
:选中字的下一个字权重 * 0.8

1.01.01.01.01.01.01.00.60.81.0
5.1.2 替换为形近字

迭代所有字,对每一个字都使用概率 0.05 判断是否增强
:选中字的权重 * 0.6
:选中字的下一个字权重 * 0.8

1.01.01.01.01.01.01.00.60.81.0
5.1.3 替换为非同音字

迭代所有字,对每一个字都使用概率 0.05 判断是否增强
:选中字的权重 * -1.0
:选中字的下一个字权重 * 0.3

1.01.01.01.01.01.01.0-1.00.31.0
5.1.4 替换为非形近字

迭代所有字,对每一个字都使用概率 0.05 判断是否增强
:选中字的权重 * -1.0
:选中字的下一个字权重 * 0.3

1.01.01.01.01.01.01.0-1.00.31.0

5.2 随机交换字序

迭代所有字,对每一个字都使用概率 0.05 判断是否增强
:交换选中字与下一个字的位置和权重
:选中字的权重 * -0.1
:选中字的下一个字权重 * -0.1

1.01.01.01.01.01.01.0-0.1-0.11.0

特殊token的权重

除了分隔符,结束符等必需的特殊token的权重设为1.0
不必要(不会影响输出文本,或不会在输出文本中看到)的令牌,例如 开始,提示,填充 token 设置权重为0

其他

2023/3/23 更新
新的加权损失函数 weighted_and_neg_topk_cross_entropy ,为以下加权损失函数的改进版。
https://blog.csdn.net/ONE_SIX_MIX/article/details/129732022

旧的加权损失函数

Loss使用加权的交叉熵函数
B: 批量
L: 序列长度
C: 词向量通道数
out shape [B, L, C] --------------- 为模型输出,为 Float Tensor
label shape [B, L] ----------------- 为标签,为 Long Tensor
label_mask shape [B, L] -------- 为标签掩码,为 Bool Tensor,True 代表内容,False 代表是长度填充的token
label_weight shape [B, L] ------ 为标签权重,为 Float Tensor,即上面所述的东西

out = model(x)
if label is not None:
    if label_mask is not None:
        label[~label_mask] = -100
    assert label.shape == x.shape
    loss = F.cross_entropy(out.transpose(1, 2), label, label_smoothing=label_smoothing, reduction='none')
    loss = loss * label_weight
    loss = loss[label_mask].mean()

附注

因为是小模型,不要因为句子后面的全是简单规律的 pad token 就省去 label_mask,我发现小模型即便记忆规律超级简单的 pad token 也会降低生成文本的质量(两个方面产生负面影响,一个是稀释了有效句子的Loss,使Loss偏小,一个是占用模型的记忆容量)。

引用和参考

【中文同义词近义词】词向量 vs 同义词近义词库
https://www.cnblogs.com/bymo/p/8440722.html

同义词,同类词库:哈工大同义词词林扩展版 存档
https://github.com/One-sixth/HIT-IR-Lab-Tongyici-Cilin-Extended

【NLP】NLP数据增强的15种方法
https://blog.csdn.net/fengdu78/article/details/124622163

一文了解NLP中的数据增强方法
https://blog.csdn.net/u011983997/article/details/122847095

词林:在线词典
https://www.cilin.org/

反义词 修饰副词 停用词 同义关系库 否定词 情态词 抽象关系库 程度副词 等词库
https://github.com/liuhuanyong/ChineseSemanticKB

同音字,形近字,音形码 库
https://github.com/wenyangchou/SimilarCharactor

nlpcda / NLP Chinese Data Augmentation 一键中文数据增强工具
https://github.com/425776024/nlpcda

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值