李宏毅 HW4 hard baseline 解析

前言

在这个暑假我从头到尾把李宏毅机器学习的课后作业做了一遍,之前看了一遍课程,对相关知识都有一些了解,觉得这就够了,准备开始我的研究生生涯,奈何暑假在家一直没有任务。但也要自学,自己给自己布置任务。李宏毅的课后作业实在是一个很好的练手项目,而且要真正起到效果的话,不能浅尝辄止,每一个任务的目标一定是过boss baseline。
我现在任务已经完成得差不多了,临近开学,趁着这段时间把这个暑假自己的一些收获进行总结,我发现,如果不进行总结的话,这些等于没学,到时候应用的时候又会忘了。
我的分享会偏向于代码方面,关于如何修改代码能让模型的结果有所提升,因此对于任务的介绍部分我不会投入太多的精力,这部分分享一下几个链接,大家可以去这里找到课程的详细信息以及每节课课后作业助教的介绍。
2021课程官方地址
2022课程官方地址
B站搬运视频地址
另2022和2021的homework非常像,所以我是选择其中一个进行做的,我会注明我的结果是基于哪一年的数据和要求的。

HW042021数据

代码

任务描述:Speaker Classification,给你一段声音信号,让你判断出这个声音是哪个人发出来的,当然这个声音信号都是处理好的,关于声音的数据处理不多阐释,最终得到的声音信号用向量表示为:batch_size * seq_length * dim ,本次任务数据处理由助教帮忙处理好了,seq_length=512, dim=40
然后人的类别及label 共有600类。
simple baseline:助教的代码用了一层TransformerEncoderlayer,再加上pernet和pred_layer,模型很简单。
李宏毅 HW4 hard baseline 解析_第1张图片
下面来说优化的思路:

  1. 只有一层的TransformerEncoderlayer复杂度可能是不够的,我们知道模型越大它越容易拟合,同样的结构大模型就是比小模型效果好,(这一部分理论可以看李宏毅课程网络压缩部分大乐透假说)。所以我们使用nn.TransformerEncoder设置numlayer为3,增加模型的复杂度。
  2. pernetpred_layer的存在很有必要,对模型的结果起着重要的左右,助教代码的参数设置并不是太好,首先是prenet中的d_model 参数助教设置为80,有点小了,d_model决定了输入到TransformerEncoder中的向量尺寸,而最后要预测的维度为600,80->600跨度有点大了,这里设置d_model为224,对于pred_layer来说,使用Batchnorm1d,并且去掉第一层直接经过一层得到预测结果就行。
  3. 使用上述技巧再训练得更久一点,就可以过2021的Medium baseline: 0.90547
  4. 要过Hard baseline: 0.95404根据助教的提示,要使用ConformerBlock代替nn.TransformerEncoder,Conformer就是基于Transformer但要比Transformer更强的一个模型,具体可以看论文:Conformer
    最终的模型结构如图:
    李宏毅 HW4 hard baseline 解析_第2张图片
    提交kaggle结果如下:
    在这里插入图片描述

你可能感兴趣的:(深度学习,人工智能)