• G1D30-NLP(Tokenizer)&DP(交叠子问题)


    一、NLP

    (一)bert中一些标记

    1、[SEP]

    用于断句,其真实效果,有待考究,因为有segment embedding

    2、[CLS]

    生成一个向量,用来进行文本分类
    在这里插入图片描述

    (二)AutoTokenizer

    关于tokenizer更加详细内容,可参考:https://zhuanlan.zhihu.com/p/390821442

    这个是Transformer中的一个类,可以使用from_pretrained方法,进行实例化
    在这里插入图片描述

    (三)tokenizer

    参考:https://zhuanlan.zhihu.com/p/121787628

    1、Encoding

    (1)tokenize
    (2)convert to ids
    --------------Roberta---------------------------------------

    from transformers import RobertaTokenizer
    sequence1 = "media_common.cataloged_instance award.winning_work"
    sequence2 = "media _ common . cataloged _ instance award . winning _ work"
    
    tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
    tokens1 = tokenizer.tokenize(sequence1)
    ids1 = tokenizer.convert_tokens_to_ids(tokens1)
    
    tokens2 = tokenizer.tokenize(sequence2)
    ids2 = tokenizer.convert_tokens_to_ids(tokens2)
    
    print('未替换:')
    print(tokens1)
    print(ids1)
    print('替换:')
    print(tokens2)
    print(ids2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果是不一样的~
    在这里插入图片描述

    --------------------------deberta-------------------------------

    from transformers import AutoModel, AutoModelForSequenceClassification, AutoTokenizer, AutoConfig, DataCollatorWithPadding
    from transformers import DebertaTokenizer
    sequence1 = "media_common.cataloged_instance award.winning_work"
    sequence2 = "media _ common . cataloged _ instance award . winning _ work"
    sequence3 = "media_common.cataloged _ instance award . winning _ work"
    
    tokenizer = DebertaTokenizer.from_pretrained("microsoft/deberta-base")
    tokens1 = tokenizer.tokenize(sequence1)
    ids1 = tokenizer.convert_tokens_to_ids(tokens1)
    
    tokens2 = tokenizer.tokenize(sequence2)
    ids2 = tokenizer.convert_tokens_to_ids(tokens2)
    
    tokens3 = tokenizer.tokenize(sequence3)
    ids3 = tokenizer.convert_tokens_to_ids(tokens3)
    print('未替换:')
    print(tokens1)
    print(ids1)
    
    print('替换:')
    print(tokens2)
    print(ids2)
    
    print('替换:')
    print(tokens3)
    print(ids3)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    好玩欸,deberta 的tokenize也变成这样了~加了空格之后,'_‘和’.'会被重新解读
    在这里插入图片描述

    2、decode

    就是反向查看

    3、padding

    为了做matrix处理,加入pad,可以指定pad的id

    4、mask

    可以用mask mask掉上面的pad,这样使运算结果不受影响。

    (四)动态masking的好处

    每个epoch的训练内容不同,增加了训练的多样性
    https://adaning.github.io/posts/24649.html

    纯静态Mask: 就是BERT中使用的Mask, 在数据预处理阶段就进行, 每个Epoch所Mask同一句中的Token位置都是相同的.
    改进一点的静态Mask: 将每个Sentence都重复N次, 这样可能在预处理阶段能得到N种不同的Mask.
    因为扩大了每个Epoch的数据量, 训练的Epoch要是原来的1/N倍. 动态Mask: 每个Sentence给BERT之前动态Mask,
    即生成一种新的Mask方式. 这样每个Epoch拿到的Mask基本上是不同的. 从Mask的方法上来看,
    动态Mask并没有引入太多的计算花费, 但是却大大提升了训练时句子的多样性. 为了证明其有效性,

    (五)BPE

    参考:https://zhuanlan.zhihu.com/p/424631681
    Byte-Pair Encoding
    这是一种数据压缩的方式,主要压缩词表,把慈悲压缩为sub-word的形式。

    之所以叫byte-pair是因为该算法以byte为编码,作为subword聚合的基本单位——先将单词拆为byte,统计频率;然后不断结合。
    参考:https://zhuanlan.zhihu.com/p/170656789
    使用bytes-based BPE不会引入位置字符;
    原BERT对应vocab大小,3万;
    现在:5万

    Radford在GPT2[2]里提出了一种更巧妙的BPE实现版本,该方法使用bytes(字节)作为基础的子词单元,这样便把词汇表的大小控制到了5w。它可以在不需要引入任何未知字符前提下对任意文本进行编码。
    BERT原始版本使用一个字级(character-level)的BPE词汇表,大小是3w,是用启发式分词规则对输入进行预处理学习得到的。

    (六)MASK

    具体mask是如何作用的呢?源代码中是不去计算了嘛

    DP

    (一)交叠子问题是什么

    很多子问题被一次次求解

  • 相关阅读:
    java计算机毕业设计基于安卓Android的掌上酒店预订APP
    时序预测 | MATLAB实现CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(风电功率预测)
    【计算机视觉|人脸建模】PanoHead:360度几何感知的3D全头合成
    FT2000+下使用Clonezilla进行系统备份还原
    【luogu P8326】Fliper(图论)(构造)(欧拉回路)
    .NET 扩展官方 Logger 实现将日志保存到本地文件
    消息队列MQ
    数据结构——二叉搜索树
    服务器部署教程下(线下、线上部署)
    干货|工作中要使用Git,看这篇文章就够了
  • 原文地址:https://blog.csdn.net/weixin_45252975/article/details/128170300