一、NLP

(一)bert中一些标记

1、[SEP]

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

2、[CLS]

生成一个向量,用来进行文本分类

java将token存cookie_Mask

(二)AutoTokenizer

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

这个是Transformer中的一个类,可以使用from_pretrained方法,进行实例化

java将token存cookie_Mask_02

(三)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)

运行结果是不一样的~

java将token存cookie_Mask_03

--------------------------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)

好玩欸,deberta 的tokenize也变成这样了~加了空格之后,'_‘和’.'会被重新解读

java将token存cookie_Mask_04

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

(一)交叠子问题是什么

很多子问题被一次次求解