Albert_zh转化为pytorch版本

背景
由于google提供bert_base_zh的参数太多,模型大太,大约400M,无论是使用bert进行fine-tuning或者是对bert进行再训练的训练成本会变大。所以就对bert进行了一些优化。

主要从以下几个点对bert进行了优化:

  1. 词嵌入向量的因式分解
    O ( V ∗ H ) − > O ( V ∗ E + E ∗ H ) O(V*H)->O(V*E +E*H) O(VH)>O(VE+EH)
    其中V为字典中词的个数,H为隐藏层size,E是Albert中因式分解的的一个变量。以Albert_xxlarge为例,V=30000,H=4096,E=128,那么原来的个数是VH=300004096=1.23亿个参数,现在变为VE+EH = 30000128 + 1284096=436万,缩小为原来的1/28.
  2. 跨层参数共享
    参数共享能够显著的减小参数。共享参数分为全连接层、注意力层的参数共享,但是注意力层的参数对效果的减弱影响小一些。
  3. 段落连续任务
    除了bert的mask任务及NSP任务,增加了一个段落连续任务。正例:使用一个文档中连续的两个文本段落,负例是使用一个文档的连续的两个段落,但是位置调换了。
  4. 去掉了dropout
    发现最大的模型训练了100万步后,还是没有过拟合,说明模型的容量还可以更大一些,就移除了dropout。其实dropout是随机失活一些节点,本质上还是减小模型。
  5. 为了加快训练,使用了LAMB作为优化器,可以使用大的batch_size。
  6. 使用了n-gram来做mask语音模型。

但是有一个问题如何把tensorflow版本的albert转化为Pytorch可以使用的呢?

  1. 下载albert_tiny_google_zh,一定是google版本的,https://storage.googleapis.com/albert_zh/albert_tiny_zh_google.zip
  2. git clone albert_pytorch:https://github.com/lonePatient/albert_pytorch
  3. 使用如下命令进行转化:
python convert_albert_tf_checkpoint_to_pytorch.py \
    --tf_checkpoint_path=./prev_trained_model/albert_tiny_zh \
    --bert_config_file=./prev_trained_model/albert_tiny_zh/albet_config_tiny_g.json \
    --pytorch_dump_path=./prev_trained_model/albet_tiny_zh/pytorch_model.bin
  1. 使用transformers加载模型并使用

Albert的输出的是一个tuple,第一个值的shape是[batch_size, sequence_len, hidden_size],是最后一个transforer层出来的hidden state,也就是通过albert编码之后的值,相当于是每个token被编码了,当然这包含CLS和SEP两个向量。当我们需要用CLS来做后面的分类时, output[0][:,0,:]就是整个句子的CLS向量了。它的size是[batch_size,hidden_size]。

输出的tuple的第二值是shape是[batch_size,hidden_size], pooler layer的输出,是把序列的CLS向量经过Liner变化并经过tanh激活之后的向量。


# -*- encoding: utf-8 -*-
import warnings
warnings.filterwarnings('ignore')
from transformers import AlbertModel, BertTokenizer, AutoModel, AutoTokenizer

import os
from os.path import dirname, abspath
import torch
root_dir = dirname(dirname(dirname(abspath(__file__))))

if __name__ == '__main__':
    albert_path = os.path.join(root_dir, 'pretrained/albert_tiny_zh_pytorch')
    # 加载模型
    model = AutoModel.from_pretrained(albert_path)
    # 加载tokenizer,这里使用BertTokenizer,如果使用AutoTokenizer会报错。
    tokenizer = BertTokenizer.from_pretrained(albert_path)
    print(model)
    tokens = tokenizer.encode('我爱中国共产党',add_special_tokens=True)
    print(tokens)
    predict  = model(torch.tensor(tokens).unsqueeze(0))
    print(predict[0].size()) # this is the last hidden_state with size of [batch_size, seq_len, hidden_size]
    print(predict[1].size()) 

你可能感兴趣的:(pytorch,预训练模型,深度学习)