目录
(***)为什么在max_pred - 实际mask掉的单词数量上补0
1、参数设置
if __name__ == '__main__':
# BERT Parameters
maxlen = 30 # 句子的最大长度 cover住95% 不要看平均数 或者99% 直接取最大可以吗?当然也可以,看你自己
batch_size = 6 # 每一组有多少个句子一起送进去模型
max_pred = 5 # max tokens of prediction
n_layers = 6 # number of Encoder of Encoder Layer
n_heads = 12 # number of heads in Multi-Head Attention
d_model = 768 # Embedding Size
d_ff = 3072 # 4*d_model, FeedForward dimension
d_k = d_v = 64 # dimension of K(=Q), V
n_segments = 2
max-pred一个句子中最大可以预测多少个token,控制每个句子最多有多少个单词被masked
因为如果一个句子mask掉3个单词,一个句子mask掉7个单词,就没法组成矩阵。
有的程序没有这个参数,那就是把这个句子中所有的单词全部输入到计算损失的函数中,也就是每个batch都填充过了,全都补齐到一个长度了。
计算损失的时候那些没被maks的单词不去计算就可以了
n-layer由多少个encoder进行堆叠,一般base有12个,large有24个
n_head多少个头
d_ff 前馈神经网络的维度
d_k,d_v 是Q,K维度的大小,两个必须维度一致
n_segment 是二分类任务中,区分多少不同句子
2、数据预处理
text = (
'Hello, how are you? I am Romeo.\n'
'Hello, Romeo My name is Juliet. Nice to meet you.\n'
'Nice meet you too. How are you today?\n'
'Great. My baseball team won the competition.\n'
'Oh Congratulations, Juliet\n'
'Thanks you Romeo'
)
sentences = re.sub("[.,!?\\-]", '', text.lower()).split('\n') # filter '.', ',', '?', '!'
word_list = list(set(" ".join(sentences).split()))
word_dict = {'[PAD]': 0, '[CLS]': 1, '[SEP]': 2, '[MASK]': 3}
for i, w in enumerate(word_list):
word_dict[w] = i + 4
number_dict = {i: w for i, w in enumerate(word_dict)}
vocab_size = len(word_dict)
token_list = list()
for sentence in sentences:
arr = [word_dict[s] for s in sentence.split()]
token_list.append(arr)
192行去除原始文本中一些没有用的字符
在定义word list时,0123分别代表特殊字符PAD CLS SEP MASK
文本中的字符从3以后依次取(196行)