1美元从零开始训练Bert,手把手教你优雅地薅谷歌云TPU羊毛

研读pytorch版本的BERT分类代码 1 首先加载了tokenizer 就是有个vocab.txt文件,里面每行是个token,比如: abc bcd 吴家行 然后Tokenizer这个类中有几个属性: vocab 是个字典,也就是将上面的vocab.txt文件变成如下的形式: { "abc": 0, "bcd": 1, "吴家行": 2, } ids_to_tokens 调换vocab中token... 阅读详情

大数据文摘出品

来源:Google Colab

编译:武帅、曹培信

 

2018年10月,Google AI团队推出了Bert,可以说Bert一出生就自带光环。

 

在斯坦福大学机器阅读理解水平测试SQuAD1.1中,Bert在全部两个衡量指标上,全面超越人类表现。并且在另外11种不同NLP测试中均创造了历史以来最好成绩,将GLUE基准提升7.6%,将MultiNLI的准确率提提升5.6%。

 

然而这个拥有12层神经网络的“多头怪”(这里指BERT-Base,BERT-Large有24层),在4个 Cloud TPU 上需要训练 4 天(BERT-Large需要16个Cloud TPU),如此高的训练成本让许多想尝试的同学望而却步。

 

不过,谷歌也给广大程序员带来了福音!我们可以借助谷歌云TPU训练Bert了!并且只需要花费1美元,在Google Colab上还出了完整的教程!

 

快跟文摘菌一起薅谷歌羊毛!

 

在本次实验中,我们将借助谷歌云,在任意文本数据上预训练当下最先进的NLP模型—BERT。

 

BERT模型起源:

https://arxiv.org/abs/1810.04805?source=post_page

 

本指南包含了模型预训练的所有阶段,包括:

  • 搭建训练环境

  • 下载原始文本数据

  • 文本数据预处理

  • 学习新词汇表

  • 切分预训练数据

  • 将数据和模型存储到谷歌云

  • 在云TPU上训练模型

 

先回答几个问题

 

这份指南有什么用?

 

借助本指南,你可以在任意文本数据上训练BERT模型。特别是当开源社区没有你需要的语言或示例的预训练模型时,它会帮助到你。

 

谁需要这份指南?

 

这份指南适用于对BERT感兴趣但对当前可用的开源模型的性能并不满意的NLP研究人员。

 

我该如何开始?

 

要想长时间地保存训练数据和模型,你需要一个谷歌云端存储分区(Google Cloud Storage Bucket,GCSB)。请按照这份谷歌云TPU快速入门指南创建一个谷歌云平台账户和谷歌云存储分区。

 

谷歌云TPU快速入门指南:

https://cloud.google.com/tpu/docs/quickstart?source=post_page

 

每一个谷歌云的新用户都可获得300美元的免费金额。

 

链接:

https://cloud.google.com/free/?source=post_page

 

本教程的1到5步出于演示目的,在没有谷歌云存储的情况下也能进行。但是,在这种情况下,你将无法训练模型。

 

需要什么?

 

在第二代TPU(TPUv2)上预训练一个BERT模型大约需要54小时。Google Colab并不是为执行此类需要长时间运行的任务而设计的,它每隔8小时便会中断训练过程。因此,为了训练过程不被中断,你需要使用付费的抢占式的TPUv2。

 

译者注:Google Colab,谷歌免费提供的用于机器学习的平台

相关链接:

https://www.jianshu.com/p/000d2a9d36a0

 

译者注:抢占式,一种进程调度方式,允许将逻辑上可继续运行的进程暂停,适合通用系统。

相关链接:

https://blog.youkuaiyun.com/qq_34173549/article/details/79936219

 

也就是说,在撰写本文时(2019年5月9日),通过Google Colab提供的一块TPU,花费大约1美元,就可以在谷歌云上存储所需要的数据和模型,并预训练一个BERT模型。

 

我该如何遵循指南?

 

下面的代码是Python和Bash的组合。它在Colab Jupyter环境中运行。因此,它可以很方便地在那里运行。

 

然而,除了实际的模型训练部分之外,本指南列出的其他步骤都可以在单独的机器上运行。特别是当你的数据集过大或者十分私密而无法在Colab环境中进行预处理时,这就显得十分有用了。

 

好的,给我看看代码

 

代码链接:

https://colab.research.google.com/drive/1nVn6AFpQSzXBt8_ywfx6XR8ZfQXlKGAz?source=post_page#scrollTo=ODimOhBR05yR

 

我需要修改代码吗?

 

代码中唯一需要你修改的地方就是谷歌云存储的账户名。其他的地方默认就好。

 

还有别的么?

 

说句题外话,除了这个程序,我还发布了一个训练好的俄罗斯语BERT模型。

 

下载链接:

https://storage.googleapis.com/bert_resourses/russian_uncased_L-12_H-768_A-12.zip?source=post_page

 

我希望相关研究人员可以发布其他语言的预训练模型。这样就可以改善我们每个人的NLP环境。现在,让我们进入正题吧!

   

第1步:搭建训练环境

 

首先,我们导入需要用到的包。

 

在Jupyter Notebook中可以通过使用一个感叹号‘!’直接执行bash命令。如下所示:

 

!pip install sentencepiece!git clone https://github.com/google-research/bert

 

整个演示过程我将会用同样的方法使用几个bash命令。

 

现在,让我们导入包并在谷歌云中自行授权。

import osimport sysimport jsonimport nltkimport randomimport loggingimport tensorflow as tfimport sentencepiece as spm

from glob import globfrom google.colab import auth, drivefrom tensorflow.keras.utils import Progbar

sys.path.append("bert")

from bert import modeling, optimization, tokenizationfrom bert.run_pretraining import input_fn_builder, model_fn_builder

auth.authenticate_user()  # configure logginglog = logging.getLogger('tensorflow')log.setLevel(logging.INFO)

# create formatter and add it to the handlersformatter = logging.Formatter('%(asctime)s :  %(message)s')sh = logging.StreamHandler()sh.setLevel(logging.INFO)sh.setFormatter(formatter)log.handlers = [sh]

if 'COLAB_TPU_ADDR' in os.environ:  log.info("Using TPU runtime")  USE_TPU = True  TPU_ADDRESS = 'grpc://' + os.environ['COLAB_TPU_ADDR']

  with tf.Session(TPU_ADDRESS) as session:    log.info('TPU address is ' + TPU_ADDRESS)    # Upload credentials to TPU.    with open('/content/adc.json', 'r') as f:      auth_info = json.load(f)    tf.contrib.cloud.configure_gcs(session, credentials=auth_info)    else:  log.warning('Not connected to TPU runtime')  USE_TPU = False

Setting up BERT training environment

搭建BERT训练环境

 

第2步:获取数据

 

接下来我们获取文本数据语料库。这次实验我们将采用OpenSubtitles 数据集。

 

链接:

https://www.opensubtitles.org/en/?source=post_page

 

该数据集有65种语言可以使用。

 

链接:

http://opus.nlpl.eu/OpenSubtitles-v2016.php?source=post_page

 

与更常用的文本数据集(如维基百科)不同,该数据集并不需要进行任何复杂的数据预处理。它也预先格式化了,每行一个句子,便于后续处理。

 

你也可以通过设置相应的语言代码来使用该数据集。

AVAILABLE =  {'af','ar','bg','bn','br','bs','ca','cs',              'da','de','el','en','eo','es','et','eu',              'fa','fi','fr','gl','he','hi','hr','hu',              'hy','id','is','it','ja','ka','kk','ko',              'lt','lv','mk','ml','ms','nl','no','pl',              'pt','pt_br','ro','ru','si','sk','sl','sq',              'sr','sv','ta','te','th','tl','tr','uk',              'ur','vi','ze_en','ze_zh','zh','zh_cn',              'zh_en','zh_tw','zh_zh'}

LANG_CODE = "en" #@param {type:"string"}

assert LANG_CODE in AVAILABLE, "Invalid language code selected"

!wget http://opus.nlpl.eu/download.php?f=OpenSubtitles/v2016/mono/OpenSubtitles.raw.'$LANG_CODE'.gz -O dataset.txt.gz!gzip -d dataset.txt.gz!tail dataset.txt

下载OPUS数据

 

出于演示目的,我们默认只使用语料库的一小部分。

 

在实际训练模型时,请务必取消选中DEMO_MODE复选框以使用大100倍的数据集。

 

请放心,一亿行语句足以训练出一个相当不错的BERT模型。

DEMO_MODE = True #@param {type:"boolean"}if DEMO_MODE: CORPUS_SIZE = 1000000else: CORPUS_SIZE = 100000000 #@param {type: "integer"}

!(head -n $CORPUS_SIZE dataset.txt) > subdataset.txt!mv subdataset.txt dataset.txt

 

第3步:文本预处理

 

我们下载的原始文本数据包含了标点符号,大写字母以及非UTF编码的符号,这些都需要提前删除。在模型推断时,我们也需要对新数据集采取同样的做法。

 

如果你的用例需要不同的预处理方法(例如在模型推断时大写字母或者标点符号是需要保留的),那么就修改代码中的函数以满足你的需求。

regex_tokenizer = nltk.RegexpTokenizer("\w+")

def normalize_text(text):  # lowercase text  text = str(text).lower()  # remove non-UTF  text = text.encode("utf-8", "ignore").decode()  # remove punktuation symbols  text = " ".join(regex_tokenizer.tokenize(text))  return text

def count_lines(filename):  count = 0  with open(filename) as fi:    for line in fi:      count += 1  return count

定义预处理例程

 

现在让我们对整个数据集进行预处理吧。

RAW_DATA_FPATH = "dataset.txt" #@param {type: "string"}PRC_DATA_FPATH = "proc_dataset.txt" #@param {type: "string"}

# apply normalization to the dataset# this will take a minute or two

total_lines = count_lines(RAW_DATA_FPATH)bar = Progbar(total_lines)

with open(RAW_DATA_FPATH,encoding="utf-8") as fi:  with open(PRC_DATA_FPATH, "w",encoding="utf-8") as fo:    for l in fi:      fo.write(normalize_text(l)+"\n")      bar.add(1)

 应用预处理

 

第4步:构建词汇表

 

下一步,我们将学习一个新的词汇表,用于表示我们的数据集。

 

因为 BERT 论文中使用了谷歌内部未开源的 WordPiece 分词器,因此,这里我们只能使用一元文法模式(unigram mode)下开源的 SentencePiece 分词器了。

 

链接:

https://github.com/google/sentencepiece?source=post_page

 

虽然它与BERT并不直接兼容,但我们可以通过一个小技巧让它工作。

 

SentencePiece需要相当多的运行内存(RAM),因此在Colab上运行整个数据集会导致内核崩溃。为避免这一情况发生,我们将随机地对数据集的一小部分进行子采样,从而构建词汇表。当然,也可以使用运行内存更大的计算机来执行此步骤。这完全取决于你。

 

此外,SentencePiece默认将BOS和EOS控制符号添加到词汇表中。我们可以通过手动地把它们的词id设为-1来禁用它们。

 

VOC_SIZE的典型值介于32000到128000之间。我们将保留NUM_PLACEHOLDERS标记,以防有人想在训练前的阶段完成后更新词汇和微调模型。

MODEL_PREFIX = "tokenizer" #@param {type: "string"}VOC_SIZE = 32000 #@param {type:"integer"}SUBSAMPLE_SIZE = 12800000 #@param {type:"integer"}NUM_PLACEHOLDERS = 256 #@param {type:"integer"}

SPM_COMMAND = ('--input={} --model_prefix={} '               '--vocab_size={} --input_sentence_size={} '               '--shuffle_input_sentence=true '                '--bos_id=-1 --eos_id=-1').format(               PRC_DATA_FPATH, MODEL_PREFIX,                VOC_SIZE - NUM_PLACEHOLDERS, SUBSAMPLE_SIZE)

spm.SentencePieceTrainer.Train(SPM_COMMAND)

学习SentencePiece词汇表

 

现在,看看我们是如何使SentencePiece在BERT模型中工作的。

 

下面是官方仓库的一个英语BERT预训练模型中通过WordPiece词汇表标记后的语句。

链接:

https://github.com/google-research/bert?source=post_page

 

模型下载:

https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip?source=post_page

>>> wordpiece.tokenize("Colorless geothermal substations are generating furiously")
['color','##less','geo','##thermal','sub','##station','##s','are','generating','furiously']

 

我们看到,WordPiece分词器在两个单词中间以“##”在前的形式预设了子词。单词开头的子词并没有发生变化。如果子词出现在开头和单词的中间,则两个版本(带或不带‘##’)都会添加到词汇表中。

 

SentencePiece创建了两个文件:tokenizer.model and tokenizer.vocab。让我们来看看学到的词汇:

def read_sentencepiece_vocab(filepath):  voc = []  with open(filepath, encoding='utf-8') as fi:    for line in fi:      voc.append(line.split("\t")[0])  # skip the first <unk> token  voc = voc[1:]  return voc

snt_vocab = read_sentencepiece_vocab("{}.vocab".format(MODEL_PREFIX))print("Learnt vocab size: {}".format(len(snt_vocab)))print("Sample tokens: {}".format(random.sample(snt_vocab, 10)))

读取学习后的SentencePiece词汇表

 

给出结果:

Learnt vocab size: 31743Sample tokens: ['▁cafe', '▁slippery', 'xious', '▁resonate', '▁terrier', '▁feat', '▁frequencies', 'ainty', '▁punning', 'modern']

 

我们观察到,SentencePiece和WordPiece给出的结果完全相反。从这篇文档中可以看出SentencePiece首先用元符号“_”(UnicodeMath编码字符:U+2581)替换掉空格,如 “Hello World”被替换为成:

 

Hello▁World.

 

链接:

https://github.com/google/sentencepiece/blob/master/README.md?source=post_page

 

然后,此文本被分割为小块,如下所示:

 

[Hello] [▁Wor] [ld] [.]

 

在空格之后出现的子词(也是大多数单词的开头)通常前面加上了 ‘_’,而其它的并没有变化。这不包括那些仅出现在句子开头而不是其他地方的子词。然而,这些情况很少发生。

 

因此,为了获得类似于WordPiece的词汇表,我们需要进行一个简单的转换,将那些‘_’符号删除并将‘##’符号添加到不含它的标记中。

 

我们还添加了一些BERT架构所需要的特殊控制符号。按照惯例,我们把它们放在了词汇表的开头。

 

此外,我们也在词汇表中添加了一些占位符标记。

 

如果某人希望用新的特定任务的标记来更新模型时,以上那些做法就十分有用了。此时,将原先的占位符标记替换为新的标记,预训练数据就会重新生成,模型也会在新数据上进行微调。

def parse_sentencepiece_token(token):    if token.startswith("▁"):        return token[1:]    else:        return "##" + token        bert_vocab = list(map(parse_sentencepiece_token, snt_vocab))

ctrl_symbols = ["[PAD]","[UNK]","[CLS]","[SEP]","[MASK]"]bert_vocab = ctrl_symbols + bert_vocab

bert_vocab += ["[UNUSED_{}]".format(i) for i in range(VOC_SIZE - len(bert_vocab))]print(len(bert_vocab))

转换词汇表以用于BERT

 

最后,我们将获得的词汇表写入文件。

VOC_FNAME = "vocab.txt" #@param {type:"string"}

with open(VOC_FNAME, "w") as fo:  for token in bert_vocab:    fo.write(token+"\n")

将词汇表写入文件

 

现在,让我们看看新词汇表在实践中是如何运作的:

>>> testcase = "Colorless geothermal substations are generating furiously">>> bert_tokenizer = tokenization.FullTokenizer(VOC_FNAME)>>> bert_tokenizer.tokenize(testcase)['color','##less','geo','##ther','##mal','sub','##station','##s','are','generat','##ing','furious','##ly']

 

第5步:生成预训练数据

 

借助于手头的词汇表,我们已经可以生成BERT模型的预训练数据了。因为我们的数据集可能非常大,所以我们将其切分:

mkdir ./shardssplit -a 4 -l 256000 -d $PRC_DATA_FPATH ./shards/shard_

切分数据集

 

现在,对于每个切片,我们需要从BERT仓库中调用create_pretraining_data.py 脚本。为此,我们使用xargs命令。

 

在我们开始生成数据前,我们需要设置一些参数并传递给脚本。你可以在README文档中找到有关它们含义的更多信息。

 

链接:

https://github.com/google-research/bert/blob/master/README.md?source=post_page

MAX_SEQ_LENGTH = 128 #@param {type:"integer"}MASKED_LM_PROB = 0.15 #@paramMAX_PREDICTIONS = 20 #@param {type:"integer"}DO_LOWER_CASE = True #@param {type:"boolean"}

PRETRAINING_DIR = "pretraining_data" #@param {type:"string"}# controls how many parallel processes xargs can createPROCESSES = 2 #@param {type:"integer"}

定义预训练数据的参数

 

运行这一步可能需要相当长的时间,具体取决于数据集的大小。

XARGS_CMD = ("ls ./shards/ | "             "xargs -n 1 -P {} -I{} "             "python3 bert/create_pretraining_data.py "             "--input_file=./shards/{} "             "--output_file={}/{}.tfrecord "             "--vocab_file={} "             "--do_lower_case={} "             "--max_predictions_per_seq={} "             "--max_seq_length={} "             "--masked_lm_prob={} "             "--random_seed=34 "             "--dupe_factor=5")

XARGS_CMD = XARGS_CMD.format(PROCESSES, '{}', '{}', PRETRAINING_DIR, '{}',                              VOC_FNAME, DO_LOWER_CASE,                              MAX_PREDICTIONS, MAX_SEQ_LENGTH, MASKED_LM_PROB)                             tf.gfile.MkDir(PRETRAINING_DIR)!$XARGS_CMD

创建预训练数据

 

第6步:创建持久化存储

 

为了保存我们来之不易的财产,我们将其保存在谷歌云存储上。如果你已经创建了谷歌云存储分区,那么这是很容易实现的。

 

我们将在谷歌云存储上设置两个目录:一个用于数据,一个用于模型。在模型目录下,我们将放置模型词汇表和配置文件。

 

在继续操作之前,请在此配置你的BUCKET_NAME变量,否则你将无法训练模型。

BUCKET_NAME = "bert_resourses" #@param {type:"string"}MODEL_DIR = "bert_model" #@param {type:"string"}tf.gfile.MkDir(MODEL_DIR)

if not BUCKET_NAME:  log.warning("WARNING: BUCKET_NAME is not set. "              "You will not be able to train the model.")

配置GCS bucket名称

 

下面是BERT的超参数配置示例。若更改将自担风险!

# use this for BERT-base

bert_base_config = {  "attention_probs_dropout_prob": 0.1,   "directionality": "bidi",   "hidden_act": "gelu",   "hidden_dropout_prob": 0.1,   "hidden_size": 768,   "initializer_range": 0.02,   "intermediate_size": 3072,   "max_position_embeddings": 512,   "num_attention_heads": 12,   "num_hidden_layers": 12,   "pooler_fc_size": 768,   "pooler_num_attention_heads": 12,   "pooler_num_fc_layers": 3,   "pooler_size_per_head": 128,   "pooler_type": "first_token_transform",   "type_vocab_size": 2,   "vocab_size": VOC_SIZE}

with open("{}/bert_config.json".format(MODEL_DIR), "w") as fo:  json.dump(bert_base_config, fo, indent=2)  with open("{}/{}".format(MODEL_DIR, VOC_FNAME), "w") as fo:  for token in bert_vocab:    fo.write(token+"\n")

配置BERT的超参数并保存到磁盘

 

现在,我们将我们的成果存放到谷歌云存储。

 

if BUCKET_NAME:  !gsutil -m cp -r $MODEL_DIR $PRETRAINING_DIR gs://$BUCKET_NAME

上传成果到谷歌云存储

 

第7步:训练模型

 

 我们已准备好开始训练我们的模型了。

 

建议过去步骤中的一些参数不要更改,以便于快速重启训练过程。

 

确保整个实验所设置的参数完全相同。

BUCKET_NAME = "bert_resourses" #@param {type:"string"}MODEL_DIR = "bert_model" #@param {type:"string"}PRETRAINING_DIR = "pretraining_data" #@param {type:"string"}VOC_FNAME = "vocab.txt" #@param {type:"string"}

# Input data pipeline configTRAIN_BATCH_SIZE = 128 #@param {type:"integer"}MAX_PREDICTIONS = 20 #@param {type:"integer"}MAX_SEQ_LENGTH = 128 #@param {type:"integer"}MASKED_LM_PROB = 0.15 #@param

# Training procedure configEVAL_BATCH_SIZE = 64LEARNING_RATE = 2e-5TRAIN_STEPS = 1000000 #@param {type:"integer"}SAVE_CHECKPOINTS_STEPS = 2500 #@param {type:"integer"}NUM_TPU_CORES = 8

if BUCKET_NAME:  BUCKET_PATH = "gs://{}".format(BUCKET_NAME)else:  BUCKET_PATH = "."

BERT_GCS_DIR = "{}/{}".format(BUCKET_PATH, MODEL_DIR)DATA_GCS_DIR = "{}/{}".format(BUCKET_PATH, PRETRAINING_DIR)

VOCAB_FILE = os.path.join(BERT_GCS_DIR, VOC_FNAME)CONFIG_FILE = os.path.join(BERT_GCS_DIR, "bert_config.json")

INIT_CHECKPOINT = tf.train.latest_checkpoint(BERT_GCS_DIR)

bert_config = modeling.BertConfig.from_json_file(CONFIG_FILE)input_files = tf.gfile.Glob(os.path.join(DATA_GCS_DIR,'*tfrecord'))

log.info("Using checkpoint: {}".format(INIT_CHECKPOINT))log.info("Using {} data shards".format(len(input_files)))

配置训练过程

 

准备训练运行配置,建立评估器和输入函数,启动BERT。

model_fn = model_fn_builder(      bert_config=bert_config,      init_checkpoint=INIT_CHECKPOINT,      learning_rate=LEARNING_RATE,      num_train_steps=TRAIN_STEPS,      num_warmup_steps=10,      use_tpu=USE_TPU,      use_one_hot_embeddings=True)

tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver(TPU_ADDRESS)

run_config = tf.contrib.tpu.RunConfig(    cluster=tpu_cluster_resolver,    model_dir=BERT_GCS_DIR,    save_checkpoints_steps=SAVE_CHECKPOINTS_STEPS,    tpu_config=tf.contrib.tpu.TPUConfig(        iterations_per_loop=SAVE_CHECKPOINTS_STEPS,        num_shards=NUM_TPU_CORES,        per_host_input_for_training=tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2))

estimator = tf.contrib.tpu.TPUEstimator(    use_tpu=USE_TPU,    model_fn=model_fn,    config=run_config,    train_batch_size=TRAIN_BATCH_SIZE,    eval_batch_size=EVAL_BATCH_SIZE)  train_input_fn = input_fn_builder(        input_files=input_files,        max_seq_length=MAX_SEQ_LENGTH,        max_predictions_per_seq=MAX_PREDICTIONS,        is_training=True)

建立评估模型和输入函数

 

启动!

 

estimator.train(input_fn=train_input_fn, max_steps=TRAIN_STEPS)

启动BERT

 

使用默认参数训练模型100万步大约需要53个小时。如果内核出于某种原因重新启动,你可以从最新的检查点继续训练。

 

以上就是在云TPU上从头开始预训练BERT模型的指南。

 

还能做点什么?

 

我们已经训练好了模型,那接下来呢?

 

这是一个全新的话题。你可以做如下几件事:

  • 将预训练模型作为通用NLU模块

  • 针对某些特定的分类任务微调模型

  • 使用BERT作为构件块创建另一个深度学习模型

 

链接:

https://towardsdatascience.com/building-a-search-engine-with-bert-and-tensorflow-c6fdc0186c8a

 

真正有趣的东西还在后面,所以睁大你的眼睛。同时,看看bear-as-a-service这个很棒的项目,将你刚训好的模型部署到线上去吧!

 

项目链接:

https://github.com/hanxiao/bert-as-service?source=post_page

 

最最重要的,不断学习!

薅一把Google的羊毛——Google Colab的正确打开方式 如果你有梯子,如果你想用免费的GPU来跑一跑深度学习的代码,那colab你值得拥有。 Colaboratory 是一个免费的 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行,可以编写和执行代码、保存和共享分析结果,以及利用强大的计算资源,并且最关键的是免费使用!!! 但是资本主义的羊毛没那好薅,这玩意局限性还是挺大的,拿来练练手感受一下GPU训练的速度还是可以的。... 阅读详情

相关推荐

bert模型源码详细解读

一.bert配置参数解读 bert_config.json { "attention_probs_dropout_prob": 0.1, #乘法attention时,softmax后dropout概率 "directionality": "bidi", "hidden_act": "gelu", # 激活函数 "hidden_dropout_prob": 0.1, #隐藏层dr...

boss的博客 4980

BertTokenizer详解

英语文本的预处理通常是Tonkenizing,而Tonkenizing的最小维度分为三种——word(单词),wordpiece(单词块),character(字母)。word的Tokenizing很好处理,因为英文文本单词之间有着天然的空格符,完全可以根据空格符进行Tokenizing。character的Tokenizing也同样好处理,只需将文本里所有字母切分开就行了。但是wordpiece的Tokenizing却显得更复杂,却又更实用。

qq_57390446的博客 4346

Python-2018GoogleAIBERT论文的Pytorch实现

Google AI 公开了一篇 NLP 论文,介绍了新的语言表征模型 BERT,该模型被认为是最强 NLP 预训练模型,刷新了 11 项 NLP 任务的当前最优性能记录。该 仓库是 BERT 的 Pytorch 实现。

tokenizer.tokenize(), tokenizer.encode() , tokenizer.encode_plus() 方法介绍及其区别

tokenizer.tokenize(), tokenizer.encode() , tokenizer.encode_plus() 方法介绍及其区别

hello world 1万+

从多项式到神经网络:DPD算法演进史及其在RRU中的工程实现

本文系统梳理了数字预失真(DPD)算法从经典多项式模型、查表法到神经网络驱动的演进历程,并深入探讨了其在基站射频单元(RRU)中面临的硬件资源约束与工程实现挑战。文章为通信设备的技术决策者提供了算法选型、性能权衡及混合架构设计的实用评估框架,助力在性能、功耗与成本间找到最优平衡。

cherry的博客 1076

Windows系统监控实战:Grafana+Prometheus+node_exporter配置全攻略

本文提供了一套完整的Windows系统监控解决方案,详细介绍了如何使用Grafana、Prometheus和node_exporter(Windows版为windows_exporter)构建可视化监控平台。从环境准备、组件安装配置,到数据可视化与常见问题排查,手把手指导您实现从数据采集到仪表盘展示的全过程,帮助您从被动救火转向主动预警,有效保障Windows服务器稳定运行。

assembly8low的博客 247

手把手教你使用 BERT 进行文本分类——代码逐行注释讲解

BERT(Bidirectional Encoder Representations from Transformers,全称“基于双向编码器表示的变换器”)是 Google 开发的一种强大的自然语言处理(NLP)模型,基于 Transformer 的深度神经网络架构。

python1234_的博客 6531

Arthas实战(3)- CPU使用率高问题排查

Arthas实战(3)- CPU使用率高问题排查

java_liuyuan的博客 1731

BERT中的Tokenizer说明

BERT中的Tokenizer说明

weixin_42223207的博客 4万+

iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决

问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这是什么原因导致的呢? Let’s find out!???? 问题分析 1. 排除其它原因 首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。 在SKProductsRequestDelegat代理实现的productsRequest方法里下断点: func produc

享受开发,颠倒银河 6141

Dify框架面试内容整理-如何优化Dify的应用性能?

为1536维)可选用 PCA、FAISS 的量化压缩方法降低维度(如128、256、512);对知识库预览、任务流配置等页面,使用 nginx/cache-control 减少请求。API 响应耗时(P50/P95)、Token 使用量、缓存命中率、向量检索耗时;对 Prompt+输入内容计算 Hash,缓存相同请求的返回结果;使用占位符 + 函数拼接,按需组合 Prompt,而非静态长模板;数据量大时,应在构建索引前清洗冗余段落、统一格式,避免重复向量。维度越低,检索越快,但可能影响召回准确度,需平衡。

不务正业的猿 1549

BertTokenizer 使用方法

BertTokenizer 使用方法,BertTokenizer 函数详解,tokenizer使用方法

Defiler_Lee的博客 1万+

基于Simulink的MIMO-OFDM系统仿真建模示例

MIMO概述MIMO技术利用多个天线进行信号发送和接收,通过空间复用来提高数据传输速率,或通过空间分集来增强信号的可靠性。OFDM概述OFDM是一种将高速率数据流分成多个低速数据流并行传输的技术,每个子载波都采用调制方式(如BPSK、QPSK),并通过IFFT/FFT变换实现串并转换。MIMO-OFDM优势结合了MIMO的空间分集增益与OFDM对抗多径效应的能力,适用于宽带无线通信系统。提供了更高的数据速率和更好的频谱效率,是现代无线通信标准(如4G LTE、5G NR等)的核心技术之一。

xiaoheshang_123的博客 327

bert 中文 代码 谷歌_1美元从零开始训练Bert,手把手教你优雅地薅谷歌云TPU羊毛...

大数据文摘出品来源:Google Colab编译:武帅、曹培信2018年10月,Google AI团队推出了Bert,可以说Bert一出生就自带光环。在斯坦福大学机器阅读理解水平测试SQuAD1.1中,Bert在全部两个衡量指标上,全面超越人类表现。并且在另外11种不同NLP测试中均创造了历史以来最好成绩,将GLUE基准提升7.6%,将MultiNLI的准确率提提升5.6%。然而这个拥有...

weixin_39609166的博客 282

MOSFET雪崩特性参数解析

但是,一些电源在输出短路时,初级中会产生较大的电流,加上初级电感,器件就会有雪崩损坏的可能,因此在这样的应用条件下,就要考虑器件的雪崩能量。对于那些在MOSFET的D和S极产生较大电压的尖峰应用,就要考虑器件的雪崩能量,电压的尖峰所集中的能量主要由电感和电流所决定,因此对于反激的应用,MOSFET关断时会产生较大的电压尖峰。雪崩击穿能量标定了器件可以容忍的瞬时过冲电压的安全值,其依赖于雪崩击穿需要消散的能量。EAS单脉冲雪崩击穿能量, EAS标定了器件可以安全吸收反向雪崩击穿能量的高低。

Airer_00的博客 806

视觉Transformer实战 | Vision Transformer(ViT)详解与实现

在计算机视觉领域,卷积神经网络 (CNN) 长期以来一直是处理图像任务的主流架构。然而,随着 Transformer 在自然语言处理领域的巨大成功,研究人员开始探索将这种基于自注意力机制的架构应用于视觉任务。Vision Transformer (ViT) 是这一探索的重要里程碑,它首次证明了纯 Transformer 架构在图像分类任务上可以超越最先进的 CNN 模型。本文将详细介绍 ViT 的技术原理,并使用 PyTorch 从零开始构建 ViT 模型用于图像分类任务。

盼小辉丶的博客 4万+

怎样判断keras模型是否使用了tpu_1美元从零开始训练Bert,手把手教你优雅地薅谷歌云TPU羊毛...

大数据文摘出品来源:Google Colab编译:武帅、曹培信2018年10月,Google AI团队推出了Bert,可以说Bert一出生就自带光环。在斯坦福大学机器阅读理解水平测试SQuAD1.1中,Bert在全部两个衡量指标上,全面超越人类表现。并且在另外11种不同NLP测试中均创造了历史以来最好成绩,将GLUE基准提升7.6%,将MultiNLI的准确率提提升5.6%。然而这个拥有12层神经...

weixin_39718006的博客 161

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

BertTokenizer的使用方法(超详细)

convert_tokens_to_ids是将分词后的token转化为id序列,而encode包含了分词和token转id过程,即encode是一个更全的过程,另外,encode默认使用basic的分词工具,以及会在句子前和尾部添加特殊字符[CLS]和[SEP],无需自己添加。从下可以看到,虽然encode直接使用tokenizer.tokenize()进行词拆分,会保留头尾特殊字符的完整性,但是自己也会额外添加特殊字符。将token映射为其对应的id(ids是我们训练中真正会用到的数据)

gary101818的博客 2万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

BERT轻量化探索—模型裁剪(BERT Pruning)—层数裁剪

继BERT维度剪枝之后,尝试了BERT层数暴力裁剪,直接剪掉若干层。 试验结果: 结论:训练提升40%左右、效果下降1.2%,推断速度提升50%。 代码参考 : 最简单的模型轻量化方法:20行代码为BERT剪枝 https://cloud.tencent.com/developer/article/1542897, 但是进行了一些调整。 1)首先,将谷歌pretr...

ai_1046067944的专栏 4531

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

1美元训练BERT,教你如何薅谷歌TPU羊毛 | 附Colab代码

晓查 发自 凹非寺量子位 出品 | 公众号 QbitAIBERT是谷歌去年推出的NLP模型,一经推出就在各项测试中碾压竞争对手,而且BERT是开源的。只可惜训练BERT的...

量子位 1241

从源码解析 Bert 的 BertPooler 模块

前文链接: energy百分百:从源码解析 Bert 的 Embedding 模块 ​energy百分百:从源码解析 Bert 的 BertEncoder 模块 以上两篇文章解析了Bert的BertEmbedding、BertEncoder模块,接下来分析bert的第三个重要模块 BertPooler BertPooler模块本质上就是一个全连接层网络,或者说一个分类器;BertPooler模块接在bert的堆叠encoder层后,主要用于解决序列级的NLP任务 BertPooler模块源码 class

lch551218的博客 5508

学习AI之NLP后对预训练语言模型——心得体会总结

一、学习NLP背景介绍: 从2019年4月份开始跟着华为云ModelArts实战营同学们一起进行了6期关于图像深度学习的学习,初步了解了关于图像标注、图像分类、物体检测,图像都目标物体检测等,基本了解了卷积神经网络(CNN)原理及相关常用模型,如:VGG16、MaxNet等。之后从9月份开始在华为云AI专家的带领指引下,对AI深度学习的另外一个重要领域:自然语言处理(NLP)的学习,到...

华为云官方博客 5297

bert实例

from transformers import BertTokenizer tz = BertTokenizer.from_pretrained("bert-base-chinese") # 返回bert切成token之后的结果 tz.tokenize("今天的天气怎么样") ['今', '天', '的', '天', '气', '怎', '么', '样'] # 将token转化成对应的id,如果token不存在,返回未登录词的token 100 tz.convert_tokens_to_ids.

u011939633的博客 637

谷歌开源 BERT:最先进的 NLP 预训练技术,支持中文和更多语言

谷歌本周开源了一种 NLP 预训练新技术Bidirectional Encoder Representations from Transformers(BERT)。此次发布的版本中,世界上任何人都可以在一个云 TPU 上花费大约 30 分钟,或使用单个 GPU 在几个小时内训练他们自己最先进的问答系统(或各种其他模型)。该版本包括在 TensorFlow 之上构建的源代码和许多预先训练的语言表示模...

TensorFlowers的博客 1640

使用Google免费GPU进行BERT模型fine-tuning

使用Google Colab中自带的免费GPU进行BERT fine-tuning。 前期准备 首先,需要申请一个谷歌账号。 打开谷歌云端硬盘,新建一个文件夹,例如:BERT。将代码和数据上传到该文件里。这里的代码应该是已经修改好的代码,具体方法参照上一篇博客,博客最后也有提到,谷歌Colab可以在运行的时候设定参数,因此这里代码里的参数可以保持为默认参数,方便在每次运行的时候修改。 在云盘任...

LeoWood的博客 6997

怎么理解token,tokenize,tokenizer.

1、一种解释token:令牌tokenize:令牌化tokenizer:令牌解析器2、另一种翻译是:token可以翻译为“标记”,tokenize可以翻译为“标记解析”或“解析标记”,tokenizer可以翻译为“标记解析器”。在编写词法分析器(Lexer)或语法分析器(Parser)的时候,除了Lexer和Parser这两个词会经常使用外,tokenize和tokenizer也会经常出现,基本上...

feng98ren的专栏 3万+
上一篇: 电子科大周涛:半路出家的物理人怎么玩转大数据和AI | 上海市北·GMIS
下一篇: AI会玩魔方了!全是自学,比任何人都快,包括机器人
BigDataDigest
博客等级 码龄9年 448粉丝 500原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值