1.Bleu测评算法:
BLEU 的全称是 Bilingual evaluation understudy,BLEU 的分数取值范围是 0~1,分数越接近1,说明翻译的质量越高。BLEU 主要是基于精确率(Precision)的。
另外,还有召回率计算、惩罚因子等,可参考链接:机器翻译评测——BLEU算法详解(新增 在线计算BLEU分值)
2. BPE算法:
BPE(byte pair encoder)字节对编码,是2016年发表在ACL,提出来的一种算法,论文题目:《Neural Machine Translation of Rare Words with Subword Units》
(1)解决问题:
对于机器翻译,会维持一个固定大小的词表,每次通过softmax从词表选取一个词输出,直到遇到字符。
如果一个词语不在词表中,那么是无法生成的对应的词语,这样的问题是Out-Of-Vocabulary(OOV)。
如果词表是character,虽然可以表示所有的单词,但是效果不好,而且由于粒度太小,难以训练。基于此,提出了一个折中方案,选取粒度小于单词,大于character的词表,BPE因此而产生。
BPE词表既存在char-level级别的字符,也存在word-level级别的单词。通过BPE得到了更加合适的词表,这个词表可能会出现一些不是单词的组合,但是这个本身是有意义的一种形式
(2)算法流程
- 确定subword词表大小
- 统计每一个连续字节对的出现频率,并保存为code_file。这个是git中learn-bpe完成
- 将单词拆分为字符序列并在末尾添加后缀“ ”,而后按照code_file合并新的subword,首先合并频率出现最高的字节对。例如单词birthday,分割为[‘b’, ‘i’, ‘r’, ‘t’, ‘h’, ‘d’, ‘a’, ‘y’],查code_file,发现’th’出现的最多,那么合并为[‘b’, ‘i’, ‘r’, ‘th’, ‘d’, ‘a’, ‘y’],最后,字符序列合并为[‘birth’, ‘day’]。然后去除’’,变为[‘birth’, ‘day’],将这两个词添加到词表。这个是apply-bpe完成。
- 重复第3步直到达到第2步设定的subword词表大小或下一个最高频的字节对出现频率为1
可参考链接:BPE详解
3. ROUGE评测算法:
在机器翻译任务中,BLEU 和 ROUGE 是两个常用的评价指标,BLEU 根据精确率(Precision)衡量翻译的质量,而 ROUGE 根据召回率(Recall)衡量翻译的质量。
可参考链接:机器翻译与自动文摘评价指标 BLEU和ROUGE
ROUGE 指标的全称是 (Recall-Oriented Understudy for Gisting Evaluation),主要是基于召回率 (recall) 的。
ROUGE 是一种常用的机器翻译和文章摘要评价指标,由 Chin-Yew Lin 提出,其在论文中提出了 4 种 ROUGE 方法:
ROUGE-N: 在 N-gram 上计算召回率
ROUGE-L: 考虑了机器译文和参考译文之间的最长公共子序列
ROUGE-W: 改进了ROUGE-L,用加权的方法计算最长公共子序列
关于Rouge1、Rouge2具体怎么算可参考链接:自动文摘评测方法:ROUGE1、ROUGE2、ROUGE-L、ROUGE-S
举例:
机器生成的自动摘要:the cat was found under the bed
人工生成的标准摘要:the cat was under the bed
如果我们只考虑单个单词,自动摘要和标准摘要之间的重叠单词数量为6。但是,这并不能作为度量标准。为了获得良好的定量值,我们实际上可以使用二者共线的n-gram数来计算精度和召回率。
4. F-score:
一般来说准确率和召回率呈负相关,一个高,一个就低,如果两个都低,一定是有问题的。 一般来说,精确度和召回率之间是矛盾的,这里引入F1-Score作为综合指标,就是为了平衡准确率和召回率的影响,较为全面地评价一个分类器。F1是精确率和召回率的调和平均。
可参考链接:准确率、精确率、召回率和F-Score
5. Xavier初始化方法:
参考链接:pytorch系列-- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization
6. 检查点(checkpoint):
检查点只是一个数据库事件,它存在的根本意义在于减少崩溃恢复(Crash Recovery)时间。
当修改数据时,需要首先将数据读入内存中(Buffer Cache),修改数据的同时,Oracle会记录重做信息(Redo)用于恢复。因为有了重做信息的存在,Oracle不需要在提交时立即将变化的数据写回磁盘(立即写的效率会很低),重做(Redo)的存在也正是为了在数据库崩溃之后,数据就可以恢复。
最常见的情况,数据库可以因为断电而Crash,那么内存中修改过的、尚未写入文件的数据将会丢失。在下一次数据库启动之后,Oracle可以通过重做日志(Redo)进行事务重演,也就是进行前滚,将数据库恢复到崩溃之前的状态,然后数据库可以打开提供使用,之后Oracle可以将未提交的数据进行回滚。
在这个过程中,通常大家最关心的是数据库要经历多久才能打开。也就是需要读取多少重做日志才能完成前滚。当然用户希望这个时间越短越好,Oracle也正是通过各种手段在不断优化这个过程,缩短恢复时间。
检查点的存在就是为了缩短这个恢复时间。
当检查点发生时(此时的SCN被称为CheckPoint SCN),Oracle会通知DBWR进程,把修改过的数据,也就是Checkpoint SCN之前的脏数据(Dirty Data)从Buffer Cache写入磁盘,当写入完成之后,CKPT进程更新控制文件和数据文件头,记录检查点信息,标识变更。
7. Adam算法((Adaptive Moment Estimation)):
一种优化器算法,来自于论文:Adam: A Method for Stochastic Optimization
参考链接:torch.optim优化算法理解之optim.Adam()
8. model.train()与model.eval():
简单来说,是设置了训练或者测试模式,定义模型是否需要学习。
对部分层有影响,如Dropout和BN。具体影响如下:
- Dropout: 训练过程中,为防止模型过拟合,增加其泛化性,会随机屏蔽掉一些神经元,相当于输入每次走过不同的“模型”。而测试模式时,所有神经元共同作用,类似于boosting。
- BN: 训练过程中,模型每次处理一个minibatch数据,BN根据一个minibatch来计算mean和std后做归一化处理,这也是为什么模型的性能和minibatch的大小关系很大(后续也有系列文章来解决BN在小minibatch下表现不佳的问题)。测试时,BN会利用训练时得到的参数来处理测试数据。如果不设置model.eval(),输入单张图像,会报错。
另一个回答:
- Dropout在训练时,是启用的,有p%的几率丢弃神经元,但在测试过程中,不需要去丢弃神经元
- BatchNormal也是一样,训练过程中使用的归一化的均值和标准差在测试过程中使用的是一致的。
model. train()和model. eval()可以看做是对这种训练和测试需要联动的模块进行一个统一的设置。当你在写model的时候,你写的是测试和训练通用的model,这个时候,就是通过model. train()和model. eval()来来设置model的测试阶段和训练阶段。这样在用需要训练和测试联动的模块的时候,就不用再专门写一个训练的model和一个测试的model了。
参考链接:pytorch中的model. train()和model. eval()到底做了什么?
参考链接:Pytorch:model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别
9. DIM(Deep InfoMax损失函数):
参考链接:Deep InfoMax损失函数小记
loss function由LOCAL+GLOBAL+PRIOR三部分构成。
DIM优化目标为: