我有逛豆瓣社区的习惯,因此不经意间会看到一些外文翻译成中文书的评价。“书是好书,翻译太臭”、“中文版别看”、“有能力尽量看原版”…在翻译PP-OCR的时候,我有认真校对每一句话,但难免有一些歧义在里头,比如 Ablation study of PACT quantization for text /question//answer/
打算详细深入了解bert和transform的原理和源代码,先从基于attention的seq2seq学起,代码来自//p/的文章,原文是对LSTM模块的这俩参数的设置,我改了改,重做了实验。
# 隐藏层的形状 == (批大小,隐藏层大小) # 这样做是为了执行加法以计算分数 # values就是Encoder最后一步输出,所以维度是(批大小,序列长度,隐藏层units) # score的形状 == (批大小,最大长度,1) # 我们在最后一个轴上得到 1, 因为我们把分数应用于 self.V # 在应用 self.V 之前,张量的形状是(批大小,最大长度,单位) # 上下文向量 (context_vector) 求和之后的形状 == (批大小,隐藏层大小) # 和Encoder类差不多,就不过多注释了 # 刚开始看到这里挺费解,这样直接用一个完整的GRU层,而不是GRUCell,解码时岂不是只有第一个起始符考虑了attention # 然后往下翻代码,发现是输出的每一步都会调用一次这个解码器 # 编码器输出 (enc_output) 的形状 == (批大小,最大长度,隐藏层大小) # x 在通过嵌入层后的形状 == (批大小,1,嵌入维度) # 将合并后的向量传送到 GRU # 输出的形状 == (批大小 * 1,隐藏层大小)定义优化器和损失函数:
# 损失函数带sparse,表示目标变量是未经one hot编码的分类变量 # 能一行一行看到这里的,这两点应该都懂 # 这俩函数如其名,equal判断是否相等,返回T或者F,logical_not取反 # 变量类型转换,将mask转为loss_的数据类型 # 一顿操作下来,如果real是0,mask就先是False,转张量后就变成0,如果real不是0,最后就变成1 # mask机制,我个人理解就是,很多句子达不到指定长度,原句后面都是0的,就不计入loss,so easy检查点(基于对象保存):
1、将 输入 传送至 编码器,编码器返回 编码器输出 和 编码器隐藏层状态。
2、将编码器输出、编码器隐藏层状态和解码器输入(即 开始标记)传送至解码器。
3、解码器返回 预测 和 解码器隐藏层状态。
4、解码器隐藏层状态被传送回模型,预测被用于计算损失。
5、使用 教师强制 (teacher forcing) 决定解码器的下一个输入。
6、教师强制 是将 目标词 作为 下一个输入 传送至解码器的技术。
7、最后一步是计算梯度,并将其应用于优化器和反向传播。
1、评估函数类似于训练循环,不同之处在于在这里我们不使用 教师强制。每个时间步的解码器输入是其先前的预测、隐藏层状态和编码器输出。
2、当模型预测 结束标记 时停止预测。
3、存储 每个时间步的注意力权重。
4、请注意:对于一个输入,编码器输出仅计算一次。
画图函数,没啥好说的:
翻译,并画注意力图,也没啥好说的:
恢复检查点目录 (checkpoint_dir) 中最新的检查点: