准备工作

作业五是机器翻译,需要助教代码,运行代码过程中保持联网可以自动下载数据集,已经有数据集的情况可关闭助教代码中的下载数据部分。关注本公众号,可获得代码和数据集(文末有方法)。

提交地址

这次作业在NTU上面提交,需要做一个survey才能提交,不过我当时做了也无法提交,原因未知,所以该作业没法给出提交分数了,关于作业有想讨论的可进QQ群:156013866。

数据预处理流程梳理

这次作业的数据预处理部分较多,这里梳理下预处理过程,数据集有两个压缩包:ted2020.tgz(包含raw.en, raw.zh两个文件),test.tgz(包含test.en, test.zh两个文件)。

第一步将解压后的文件全部放到一层目录中,目录位置是:"DATA/rawdata/ted2020",并将raw.en,raw.zh,test.en,test.zh分别改名称为train_dev.raw.en, train_dev.raw.zh, test.raw.en, test.raw.zh。

第二步是数据清洗操作,去掉或者替换一些特殊字符,例如符号单破折号’—‘会被删除,清洗后的文件名称是,train_dev.raw.clean.en, train_dev.raw.clean.zh, test.raw.clean.en, test.raw.clean.zh。

第三步是划分训练集和验证集,train_dev.raw.clean.en和train_dev.clean.zh被分成train.clean.en, valid.clean.en和train.clean.zh, train.clean.zh。

第四步是分词,使用sentencepiece中的spm对训练集和验证集进行分词建模,模型名称是spm8000.model,同时产生词汇库spm8000.vocab,使用模型对训练集、验证集、以及测试集进行分词处理,得到文件train.en, train.zh, valid.en, valid.zh, test.en, test.zh。

第五步是文件二进制化,该过程使用fairseq库,这个库对于序列数据的处理很方便。运行后最终生成了一系列的文件,文件目录是"DATA/data_bin/ted2020",这下面有18个文件,其中的一些二进制文件才是我们最终想要的训练数据。

数据的预处理流程基本不需要修改,如果在个人电脑上训练,跑一遍程序后,之后可直接从数据预处理结束开始跑,能节省不少时间。

Simple Baseline (score>14.58)

方法:直接运行助教代码。

Medium Baseline (score>18.04)

方法:修改get_rate函数+epoch改为30。lr随step变化形状如下图,运行后loss有所下降。

def get_rate(d_model, step_num, warmup_step):    # TODO: Change lr from constant to the equation shown above    #lr = 0.001    lr = (d_model**(-0.5)) * min(step_num**(-0.5), step_num*(warmup_step**(-1.5)))    return lr

Strong Baseline (score>25.20)

方法:修改get_rate函数+epoch改为30+transformer架构。与medium baseline相比,将RNN架构改为Transoformer架构,模型的参数改变采用了Attention is all you need论文中的table3 base模型进行适当修改,因为我们的数据量不够,所以相对论文中的模型,降低了维度,实现方法如下。运行后loss相比medium baseline有所下降。

# config里面savedir文件夹位置需要改变,否则无法loadcheckpoint的modelconfig = Namespace(    datadir = "./DATA/data-bin/ted2020",    #savedir = "./checkpoints/rnn",    savedir = "./checkpoints/transformer",​​​​​​
#启用transoformer架构#encoder = RNNEncoder(args, src_dict, encoder_embed_tokens)#decoder = RNNDecoder(args, tgt_dict, decoder_embed_tokens)encoder = TransformerEncoder(args, src_dict, encoder_embed_tokensdecoder = TransformerDecoder(args, tgt_dict, decoder_embed_tokens)​​​​​​​
#修改模型参数并启用add_transformer_args函数#模型根据attention is all you need文章中table3 base适当修改arch_args = Namespace(    encoder_embed_dim=256,    encoder_ffn_embed_dim=1024,    encoder_layers=4,    decoder_embed_dim=256,    decoder_ffn_embed_dim=1024,    decoder_layers=4,    share_decoder_input_output_embed=True,    dropout=0.15,)# HINT: these patches on parameters for Transformerdef add_transformer_args(args):    args.encoder_attention_heads=4    args.encoder_normalize_before=True    args.decoder_attention_heads=4    args.decoder_normalize_before=True    args.activation_fn="relu"    args.max_source_positions=1024    args.max_target_positions=1024    # patches on default parameters for Transformer (those not set above)    from fairseq.models.transformer import base_architecture    base_architecture(arch_args)add_transformer_args(arch_args)

Boss Baseline (acc>29.13)

方法:先训练中文到英文的反向模型+下载中文数据+利用反向模型将中文翻译为英文+中英文对应+数据合并+训练。时间太长了,这个没具体的跑,等我电脑升级一定跑一遍,坐等显卡崩盘。

Report 1

作业中另外要求了两个report,第一个是关于Postional Embedding以及可视化。在strong baseline任务中,可以看到encoder下embed_positions层,该层即是positional embedding层,model.decoder.embed_positions.weights就是positional embedding值,使用pytorch自带的cosine similarity,辅助torch tensor的广播应用,可以得到similarity矩阵,最后用plt.matshow画出该矩阵,可以看出对角线上的相似度最强(对角线是求自身的相似度,都是1),并且相似性是对角线对称的(对称性)且距离对角线同等距离的位置相似度一样(平移不变性)。

Report 2

第二个report是关于Clipping Gradient Norm以及可视化。这个工作在meidium baseline版本中实现,我在函数train_one_epoch之前定义了一个列表全局变量gnorms,并在函数内部将gnorm的值放到gnorms中,等训练结束,对gnorms做可视化,gnorms和直线y=1.0的交界处即为clipping生效的地方。注意gnorm是函数nn.utils.clip_grad_norm_的返回值,该值为model.parameters()L_p norm,p的值默认为2,可通过参数调节。​​​​​​​

gnorms = []def train_one_epoch(epoch_itr, ...):        ......        gnorm = nn.utils.clip_grad_norm_(model.parameters(), config.clip_norm)         # grad norm clipping prevents gradient exploding        gnorms.append(gnorm.cpu().item())        ......​​​​​​
plt.plot(range(1, len(gnorms)+1), gnorms)plt.plot(range(1, len(gnorms)+1), [config.clip_norm]*len(gnorms), "-")plt.title('Grad norm v.s. step')plt.xlabel("step")plt.ylabel("Grad norm")plt.show()

作业五答案获得方式:

  1. 关注微信公众号 “机器学习手艺人” 

  2. 后台回复关键词:202205

李宏毅2022机器学习HW5解析相关推荐

  1. 李宏毅2022机器学习HW2解析

    准备工作:去课程github下载原始代码,kaggle下载数据集.或者关注本公众号,下载代码和数据集(文末有方法).解压数据集,出现libriphone文件夹,将文件和代码放到同一目录下. kaggl ...

  2. 李宏毅2022机器学习HW10解析

    准备工作 作业十是黑箱攻击(Blackbox Attack),完成作业需要助教代码和数据集,运行代码过程中保持联网可以自动下载数据集,已经有数据集的情况可关闭助教代码中的下载数据部分.关注本公众号,可 ...

  3. 李宏毅老师机器学习选择题解析

    机器学习选择题解析加整理 项目说明,本项目是李宏毅老师在飞桨授权课程的配套问题 课程 传送门 该项目AiStudio项目 传送门 仅供学习参考! 三岁出品必是精品! 整理内容源于李宏毅老师机器学习课程 ...

  4. 李宏毅2022机器学习hw6

    目录 ​Machine Learning HW6 一.任务 二.数据集 Crypko: 三.结果 四.改进方法 4.

  5. 李宏毅2022机器学习HW1收获

    colab的使用 把训练集取出一部分作为验证集 选择特征 tqdm,tensorboard使用 在训练和验证时要关闭梯度计算 要把模型和数据放在同一个device上 保证模型可复现性 pytorch和 ...

  6. 【李宏毅《机器学习》2022】作业1:COVID 19 Cases Prediction (Regression)

    文章目录 [李宏毅<机器学习>2022]作业1:COVID 19 Cases Prediction (Regression) 作业内容 1.目标 2.任务描述 3.数据 4.评价指标 代码 ...

  7. 李宏毅《机器学习》国语课程(2022)来了

    提起李宏毅老师,熟悉机器学习的读者朋友一定不会陌生.很多人选择的机器学习入门学习材料都是李宏毅老师的台大公开课视频.今年李宏毅老师开设一门新的机器学习机器学习课程,涵盖最新热门主题,非常值得关注! 李 ...

  8. 【千呼万唤】李宏毅《机器学习》国语课程(2022)终于来了

    提起李宏毅老师,熟悉机器学习的读者朋友一定不会陌生.很多人选择的机器学习入门学习材料都是李宏毅老师的台大公开课视频.今年李宏毅老师开设一门新的机器学习机器学习课程,涵盖最新热门主题,非常值得关注! 李 ...

  9. 李宏毅2020机器学习作业2-Classification:年收入二分类

    更多作业,请查看 李宏毅2020机器学习资料汇总 文章目录 0 作业链接 1 作业说明 环境 任务说明 数据说明 作业概述 2 原始代码 2.0 数据准备 导入数据 标准化(Normalization ...

最新文章

  1. 神经风格迁移模型综述
  2. 1.2 C语言--函数与数组
  3. join 方法代码实例
  4. redis 上亿数据_票房上亿,稳居第一?肖战《诛仙》日本上映,真实数据到底怎样...
  5. mysql insert 字符集_有关 MySQL 字符集的注意事项-爱可生
  6. mysql master host_mysql异步备份的有关问题,MASTER_HOST可否指定多个
  7. android 自定义指南针,如何在android中制作自定义指南针视图
  8. 新iPhone同款?谷歌Pixel 4渲染图曝光:“浴霸”相机模组抢眼
  9. 设计模式 之 《抽象工厂模式》
  10. python后台架构Django教程——templates模板
  11. Day9--Python--函数入门
  12. [readable]轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)
  13. 如何知道一个exe或者dll是用什么语言编译的
  14. C语言根号下ln怎么表示,c语言ln根号x
  15. PointCNN程序简介
  16. Springboot2.X项目中添加druid连接池监控
  17. 【西汉文学】之《贾谊·过秦论》
  18. 基于堆叠双向LSTM的中文诗歌生成
  19. Redux中的reducer到底是什么,以及它为什么叫reducer?
  20. 【C++】pcl中的简单点云可视化

热门文章

  1. 接口测试(一)--soapui实践
  2. 昆仑万维:如涵在纳斯达克挂牌 公司持有其3.91%股权
  3. 使用Typora设置图片自动上传至gitee仓库
  4. 人工智能(Artificial Intelligence)浅谈,填补你的人工智能空白
  5. js内置对象——String对象
  6. apache中配置404错误页的方法
  7. 大类资产配置策略(一)恒定混合策略(Constant-mix Strategy)
  8. JS-正则表达式匹配获取
  9. rpc介绍,和PHP常用的rpc框架
  10. [转载]关于中文乱码问题的一些解决方案和经验