BERT解读 —— 基础概念

word embedding

pretrained embedding

Word2Vec、GloVe等从未标注数据无监督的学习到词的Embedding,用到不同特定任务中。
用于训练的Embedding来初始化模型的Embedding,而后用特定任务的监督数据来fine-tuning.
如果监督数据较少,fix Embedding,只让模型学习其它的参数(Transfer Learning)

句子Embedding

如输入是一个句子,输出是正向或负向情感。表征句子,常使用CNN、RNN编码,输出一个向量(把句子映射到语义空间,相似的句子映射到相近的地方)。

无监督的通用(universal)的句子encode称为热点。无监督:使用未标注的原始数据学习encode参数,通用:学习到的参数不需要太多的fine-tuning就可以直接用到不同任务中。

batch \ batch size \ epoch \ iteration

https://blog.csdn.net/nini_coded/article/details/79250703

batch size(通常从128开始调整)

每批数据量的大小。SGD:将训练集分成多个mini_batch(即常说的batch),一次迭代(1 个iteration)训练一个minibatch(即batchsize个样本),根据该batch数据的loss更新权值。

batchsize越小 =》 一个batch中的随机性越大,越不易收敛。
batchsize越大 =》 越能够表征全体数据的特征,梯度下降方向准确,收敛快。缺乏随机性,容易使梯度始终向单一方向下降,陷入局部最优;而且当batchsize增大到一定程度,一次batch产生的权值更新(即梯度下降方向)基本不变。
因此理论上存在一个最合适的batchsize值,使得训练能够收敛最快或者收敛效果最好(全局最优点)。

iteration

1个iteration即迭代一次,也就是用batchsize个样本训练一次。

epoch

1个epoch指用训练集中的全部样本训练一次。

warm up

先采用小的学习率训练,之后再采用较大的学习率正式训练

学习率 learning rate

http://www.sohu.com/a/219390129_100044418

值越低,沿着梯度下降越慢。花费很长的时间来收敛。

学习率会影响我们的模型能够以多快的速度收敛到局部最小值(也就是达到最好的精度)。 因此,从正确的方向做出正确的选择意味着我们能用更少的时间来训练模型。

dropout:防止过拟合

  1. 典型的神经网络训练流程:将输入通过网络正向传导,而后将误差进行反向传播。Dropout针对这一过程,随机地删除隐藏层的部分单元。
  2. 训练中,对于神经网络单元,按照一定的概率(若dropout=0.5,即以50%的概率移除,停止工作)暂时从网络中随机丢弃。训练中,对于神经网络单元,按照一定的概率暂时从网络中随机丢弃
  3. 步骤:
    3.1. 随机删除网络中的一些隐藏神经元,保持输入输出神经元不变。
    3.2. 将输入通过修改后的网络进行前向传播,将误差通过修改后的网络反向传播。
    3.3. 对于另一批训练样本,重复上述操作。
  4. 对一个有N个节点的神经网络,看做2^n(p=0.5)个模型集合,但要训练的参数数目不变。
  5. 强迫一个神经单元,和随机挑选出来的其他神经单元共同工作。减弱了神经元节点间的联合适应性(稀疏化),增强了泛化能力。
  6. 也可作为添加噪声的方法,直接对input操作。
  7. dropout、max-normalization(防止大的learning rate导致的参数blow up)、large decaying learning rates and high momentum组合效果更好。

解决过拟合一般方法:ensemble

训练多个模型做组合 =》 费时

其他方法

  1. 提前终止
  2. L1和L2正则化加权
  3. soft weight sharing

unicodedata

unicodedata.category

返回在UNICODE里分类的类型
Code Description
[Cc] Other, Control
[Cf] Other, Format
[Cn] Other, Not Assigned (no characters in the file have this property)
[Co] Other, Private Use
[Cs] Other, Surrogate
[LC] Letter, Cased
[Ll] Letter, Lowercase
[Lm] Letter, Modifier
[Lo] Letter, Other
[Lt] Letter, Titlecase
[Lu] Letter, Uppercase
[Mc] Mark, Spacing Combining
[Me] Mark, Enclosing
[Mn] Mark, Nonspacing
[Nd] Number, Decimal Digit
[Nl] Number, Letter
[No] Number, Other
[Pc] Punctuation, Connector
[Pd] Punctuation, Dash
[Pe] Punctuation, Close
[Pf] Punctuation, Final quote (may behave like Ps or Pe depending on usage)
[Pi] Punctuation, Initial quote (may behave like Ps or Pe depending on usage)
[Po] Punctuation, Other
[Ps] Punctuation, Open
[Sc] Symbol, Currency
[Sk] Symbol, Modifier
[Sm] Symbol, Math
[So] Symbol, Other
[Zl] Separator, Line
[Zp] Separator, Paragraph
[Zs] Separator, Space

unicodedata.normalize(form, unistr):

返回Unicode字符串unistr的常规表单形式。表单的有效值为’NFC’,‘NFKC’,‘NFD’和’NFKD’。

list.extend()

在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

str.split(str="", num=string.count(str))

split() 通过指定分隔符(默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等)对字符串进行切片。

enumerate(sequence, [start=0])

将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标

str.startswith(str, beg=0,end=len(string));

检查字符串是否是以指定子字符串开头

str.decode(encoding=‘UTF-8’,errors=‘strict’)

以 encoding 指定的编码格式解码字符串。默认编码为字符串编码。

str.strip([chars])

  1. 用于移除字符串头尾指定的字符(默认:空白符,如 /n,/r,/t,’ ')或字符序列
  2. 删除多个字符时:只要头尾有对应其中的某个字符即删除,不考虑顺序,直到遇到第一个不包含在其中的字符为止。

ord()

以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值

错误处理:try…except…finally…

  1. 可以有多个except来捕获不同类型的错误
  2. 如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句
  3. 所有的错误类型都继承自BaseException
  4. 使用except时,不但捕获该类型的错误,还把其子类也“一网打尽”
  5. 可以跨越多层调用,比如函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理。
  6. 如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。
  7. 使用内置的logging模块:记录错误信息,同时,让程序继续执行下去。
except StandardError, e:
     logging.exception(e)
  1. 抛出错误:定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例(错误类型:ValueError,TypeError)
    raise语句如果不带参数,就会把当前错误原样抛出。此外,在except中raise一个Error,还可以把一种类型的错误转化成另一种类型。

dict.items() VS six.iteritems()

python2里面,dict.items返回的是数组,six.iteritems(dict)则返回生成器。
python3 里面, dict.items改变了默认实现,也返回生成器。

copy.deepcopy() VS copy.copy()

浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象不复制。
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。

tf.matmul() VS tf.multiply()

tf.multiply(x, y, name=None)
两个矩阵中对应元素各自相乘

tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
将矩阵a乘以矩阵b,生成a * b。

dataset

dataset.repeat()

repeat()在batch操作输出完毕后再执行,若在之前,相当于先把整个数据集复制两次。

将数据集重复多少次,即epoch。

dataset.shuffle()

维持一个buffer size 大小的 shuffle buffer,所需的每个样本从shuffle buffer中获取,取得一个样本后,就从源数据集中加入一个样本到shuffle buffer中。

dataset.batch()

读取batch_size大小的数据

six模块

  1. six.PY3:当前运行环境为python3的boolean值;six.PY2:当前运行环境为Python2
  2. python2中,文本字符的类型为unicode;python3中文本字符的类型为str。
  3. python2中,字节序列的类型为str;python3中字节序列的类型为bytes。

@classmethod装饰:可将当前类作为第一个参数

cls:调用当前类名,返回初始化后的类
eg. def from_dict(cls, json_object):
参考:https://blog.csdn.net/dyh4201/article/details/78336529

future: python 2中导入python 3.x新内容

# 绝对引入:from __future__ import absolute_import,用import string来引入系统的标准string.py
# 用from pkg import string来引入当前目录下的string.py了
from __future__ import absolute_import

# 精确除法
# 没有导入该特征时,"/"操作符:执行的是截断除法(Truncating Division)
# 导入精确除法之后,"/"执行:精确除法,"//"操作符:执行截断除法
from __future__ import division

# print用法
# 在python2.X,使用print就得像python3.X那样加括号使用。
from __future__ import print_function

运行关键步骤

  1. 通过命令行指定参数
if __name__ == "__main__":  
  # 指定必须的参数
  flags.mark_flag_as_required("xxx")
  ……
  tf.app.run()  # 解析命令行参数,调用main 函数 main(sys.argv)
  1. 将待处理dataset,设置processors, 并设计Processors类
processors = {"dataset": datasetProcessor}
  1. 判定train\eval\predict至少需有一个为true
  2. 读取配置文件,以dict存储
  3. 判定“设定的超参序列最大长度 不能大于 bert支持的最大长度(512)”
  4. 创建output目录
  5. 根据dataset对应的task类型,创建processors类的实例
  6. 获取dataset labels
  7. tokenizer实例化
    9.1. 加载字典文件到dict,并对每一行编序
  8. tpu配置
  9. 训练
    11.1. 读取train.csv文件,每行作为一个example;
    11.2. 训练步数计算=训练例子总数/批大小*次数;
    warmup 步数计算 = 训练步数 * warmup 率(0.1);
    11.3. 创建model:model_fn_builder()
    11.4.
    11.4. 创建Estimator
    11.5. TFRecoder文件
    11.5.1. 创建一个写对象(通过协议缓冲区(protocol buffer)写入)
    11.5.2. 遍历examples,获取每个example下标。
    11.5.2.1. 对%10000==0的example输出
    11.5.2.2. input representation处理,得到协议块
    11.5.2.3. 构造每个example的信息特征feature(键值对)。
    11.5.2.4. 将example protocol buffer序列化后成字符串(二进制数据),写入文件
    11.5.3.
    11.5.3.1. 构造feature
    11.5.3.2. 从TFRecord创建数据集对象
    11.5.3.3. For training, we want a lot of parallel reading and shuffling.
    For eval, we want no shuffling and parallel reading doesn’t matter.
    11.5.3.4. map\batch融合,example协议块解析为张量,去掉最后一个batch。
    11.5.4. estimator.train()
  10. eval
    12.1. examples
    12.2. feature序列化后写入eval.tf_record
    12.3. tpu
    12.4. 从TFRecord中创建数据集对象,融合map\batch,解析协议块feature为tensor
    12.5. estimator.evaluate()
    12.6. eval结果写入文件txt
  11. predict
    13.1.

wordpiece按字典分词:贪心
分词后的A+B句子长度超过最大长度截断:如果A句长则去掉A最后的token,如果B句长则去掉B最后的token,直到小于等于最大长度

你可能感兴趣的:(BERT)