从0开始训练bert

之前一直对bert 预训练结果是怎么来的感兴趣,今天参考了下github 上的代码,跑了一边终于知道是怎么来的了,在这分享下。

代码地址:

codertimo/BERT-pytorch: Google AI 2018 BERT pytorch implementation (github.com)icon-default.png?t=M276https://github.com/codertimo/BERT-pytorchbert 模型训练的任务

        在bert 模型中,主要干了两个事,一是判断两句话 是否是上下文,二是从这两句话中挖几个单词(英文数据,随机挖,15%的概率),然后用[mask](在代码中其实是替换为mask 的id,其他单词也是要替换为id的)替换。这15% 也不全是用mask 替换,其中的10% 替换为其他单词的id,10% 保持不变。在代码中是这么写的:

            if prob < 0.15:
                prob /= 0.15

                # 80% randomly change token to mask token
                if prob < 0.8:
                    tokens[i] = self.vocab.mask_index

                # 10% randomly change token to random token
                elif prob < 0.9:
                    tokens[i] = random.randrange(len(self.vocab))

                # 10% randomly change token to current token
                else:
                    tokens[i] = self.vocab.stoi.get(token, self.vocab.unk_index)

                output_label.append(self.vocab.stoi.get(token, self.vocab.unk_index))

为了研究代码,弄了一个很小的数据集,如下:

Welcome to the        the jungle
I can stay        here all night

只用这两行数据集,代码就能跑起来。

损失计算:

        开始的时候对损失是怎么计算的也比较好奇,看了下代码后,揭开了它神奇的面纱。

损失的计算分两块:

        第一个是计算分类任务的损失,就是判断是否是上下文的损失,就是一个二分类任务 [0, 1], 0不是上下文, 1 是上下文,二分类的输出如下:

         第二个是计算 每个单词标签是是否预测正确的损失,是一个多分类任务。这里数据集比较下,也就15个单词,所以相当于是一个15分类的任务,如果数据集大,则变成了 vocab_size 的分类任务。代码如下:

然后使用 NLLLOSS 来计算损失,最后使用常规手段,梯度下降等方式,经过不断的训练生成最终的bert 预训练模型。

总结 :

        不得不说这份代码写的很清晰,跟着代码跑一两变就了解了bert是怎么训练的。收获不错。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值