李宏毅机器学习 hw2 boss baseline 解析

这篇具有很好参考价值的文章主要介绍了李宏毅机器学习 hw2 boss baseline 解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

hw2

代码

任务描述:

Multiclass Classification,让你判断给定的向量是属于哪一个phoneme,由于一个phoneme可能包含好多个向量,所以要对数据进行处理,对向量进行拼接。

李宏毅机器学习 hw2 boss baseline 解析
不同baseline 要求
李宏毅机器学习 hw2 boss baseline 解析

方法分析

先给出我最终使用的过boss baseline的方法,后面再介绍我一步步的思考过程。
助教提示过boss baseline要使用RNN模型,所以我们直接使用BiLSTM模型,在pytorch里面实现也非常方便。模型结构如下:只需要将经过BiLSTM后的中间向量再经过一个预测层就可以得到结果。

import torch
import torch.nn as nn
import torch.nn.functional as F



class Classifier(nn.Module):
    def __init__(self, batch_size, num_layers=3, hidden_dim=356, seq_length=concat_nframes):  #inputsize: batch_size * concat_nframes * 39
        super(Classifier, self).__init__()
        self.batch_size = batch_size
        self.num_layers = num_layers
        self.hidden_dim = hidden_dim
        self.seq_length = seq_length
        self.lstm = nn.LSTM(input_size=39, hidden_size=hidden_dim, num_layers= num_layers, batch_first=True, dropout=0.4, bidirectional=True)
        # self.h0 = torch.zeros(num_layers * 2, batch_size, hidden_dim).to(device)
        # self.c0 = torch.zeros(num_layers * 2, batch_size, hidden_dim).to(device)
        self.fc = nn.Sequential(
            nn.LeakyReLU(0.1),
            nn.BatchNorm1d(2 * hidden_dim),
            nn.Dropout(0.4),
            nn.Linear(2 * hidden_dim, hidden_dim),
            nn.LeakyReLU(0.1),
            nn.BatchNorm1d(hidden_dim),
            nn.Dropout(0.4),
            nn.Linear(hidden_dim, 41)
        )

    def forward(self, x):
        x, _ = self.lstm(x)
        x = x[:,self.seq_length//2]
        x = self.fc(x)
        return x

Hyper-parameters optimizerscheduler设置如下:

optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate  * 200)
scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, 
                                        T_0=2, T_mult=4, eta_min=0)
# data prarameters
concat_nframes = 51              # the number of frames to concat with, n must be odd (total 2k+1 = n frames)
train_ratio = 0.99               # the ratio of data used for training, the rest will be used for validation

# training parameters
seed = 0                        # random seed
batch_size = 2048                # batch size
num_epoch = 30                  # the number of training epoch
learning_rate = 1e-5         # learning rate
model_path = './model.ckpt'     # the path where the checkpoint will be saved
                                        

最终只训练了16个epoch,使用Tesla P100 花费了大约九个小时。

提交结果

李宏毅机器学习 hw2 boss baseline 解析
双榜均过 boss baseline!

过程总结

上面的技巧你可能五分钟以内就可以看完并实现,但是我却花费了一周。过程极其曲折,走了很多弯路。

首先看到这个任务,我没兴趣在它原来的线性层构建的网络结构上调参,我知道线性网络再调参它也是有上限的,我直接就尝试了LSTM模型,初步写了一个跑了一下,正确率大概在0.75左右,之后就是调参了,包括网络参数(hidden_dim,num_layers,bidirectional等等),网络结构(直接取中间向量的输出,还是所有向量的输出)加上batchnorm,LeakyReLU,dropout设置等等。

这些慢慢尝试,调了两三天最后得到的结果是0.785,此时我感觉已经把能尝试的都尝试了,心里感觉非常的毛躁,安慰自己说过了strong baseline已经很棒了,这个差不多了,写下一个任务吧。但是看看自己的排名,0.785不是有手就行,肯定有人会这样说,于是就又开始尝试看有没有更加强力的模型。通过看其他人的经验分享我知道了BiLSTM–CRF 模型,这个是序列标注任务常用的模型,通过在BiLSTM模型后面加一个CRF模型,从而让它学到关于序列间的某些约束,从而可以更好的进行预测,刚好我的这个也是个序列,不过我只需要预测中间的向量即可,但也可以用,又看了一天原理及实现,成功将其应用,最后跑出来正确率0.77左右,进行调参0.78左右,还是不行啊,加个CRF模型没啥用啊。

基于BiLSTM–CRF模型我实现了两个版本,一个是直接使用经过CRF层得到的输出计算loss,另一个是经过使用BiLSTM的输出计算loss1和经过CRF的输出计算的loss2按一定比例相加得到总的loss。
l o s s = ( 1 − α ) l o s s 1 + α l o s s 2 loss =(1-\alpha) loss1 + \alpha loss2 loss=(1α)loss1+αloss2
α \alpha α e p o c h epoch epoch从0增长到1,我设计这个loss函数的意义是训练初期强调loss1注重BiLSTM的正确率,等到中后期BiLSTM训练的差不多了再着重训练CRF,使用CRF来优化BiLSTM的输出。

想法非常的好,loss函数的设计也是之后的任务会经常使用的技巧,可惜对于这个任务来说并没有卵用,但是也算是一种尝试吧,只有失败了你才知道不行。

尝试过CRF之后我又开始回归到我之前的模型上,感觉还是只取中间层的向量更加靠谱,因为我最终也只需要中间向量的结果。然后还是使用双向的LSTM。加大hidden_dimnum_layers,同时要提高dropout,(因为模型变得更复杂了)这里说明一点,之前我的hidden_dim一直不敢加太多,我尝试了39 和 78但发现问题的关键就在于这里,hidden_dim勇敢加,发现模型的正确率也在稳步提升,最终一直加到了356,如果你想要继续提高正确率的话可以继续调大hidden_dim,不过训练时间也会变得更加长。同时数据方面,为了能够有更多的训练数据,提高train_ratio。

总结一下,我发现正确率提高不了,不是其他参数没有调好,而是我的模型复杂度不够,hidden_dim太小,就这一点!文章来源地址https://www.toymoban.com/news/detail-406910.html

到了这里,关于李宏毅机器学习 hw2 boss baseline 解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 李宏毅2022机器学习HW10解析

    准备工作 作业十是 黑箱攻击(Blackbox Attack) ,完成作业需要助教代码和数据集,运行代码过程中保持联网可以自动下载数据集,已经有数据集的情况可关闭助教代码中的下载数据部分。关注本公众号,可获得代码和数据集(文末有方法)。 提交地址 JudgeBoi: https://ml.ee.nt

    2024年02月07日
    浏览(42)
  • 2023李宏毅机器学习HW05样例代码中文注释版

    这里只是 2023 李宏毅机器学习 HW05 样例代码的中文注释版的分享,下面的内容绝大部分是样例代码,补充了小部分函数的功能解释,没有做函数功能上的修改,是 Simple baseline 版本。 notebook 代码下载: [EN] [ZH] 进阶阅读:李宏毅2023机器学习作业HW05解析和代码分享 英译中(繁体

    2024年02月05日
    浏览(87)
  • 李宏毅_机器学习_作业4(详解)_HW4 Classify the speakers

    本次作业需要学习完transformer后完成! 做语者辨识任务,一共有600个语者,给了每一个语者的语音feature进行训练,然后通过test_feature进行语者辨识。(本质上还是分类任务Classification) Simple(0.60824):run sample code and know how to use transformer Medium(0.70375):know how to adjust parameters of tra

    2024年02月01日
    浏览(42)
  • 李宏毅-机器学习hw4-self-attention结构-辨别600个speaker的身份

    一、慢慢分析+学习pytorch中的各个模块的参数含义、使用方法、功能: 1.encoder编码器中的nhead参数: self.encoder_layer = nn.TransformerEncoderLayer( d_model=d_model, dim_feedforward=256, nhead=2) 所以说,这个nhead的意思,就是有window窗口的大小,也就是一个b由几个a得到 2.tensor.permute改变维度的用

    2024年02月09日
    浏览(42)
  • 【李宏毅】HW12

    在这个HW中,你可以自己实现一些深度强化学习方法: 1、策略梯度Policy Gradient 2、Actor-Critic 这个HW的环境是OpenAI gym的月球着陆器。希望这个月球着陆器落在两个旗子中间。 什么是月球着陆器? “LunarLander-v2”是模拟飞行器在月球表面着陆时的情况。 这项任务是使飞机能够“

    2024年02月10日
    浏览(36)
  • 李宏毅-21-hw3:对11种食物进行分类-CNN

    一、代码慢慢阅读理解+总结内化: 1.关于torch.nn.covd2d()的参数含义、具体用法、功能: (1)参数含义: 注意,里面的“padding”参数:《both》side所以是上下左右《四》边都会加一个padding数量的0列: 证明如下: 运行结果:torch.Size([3, 4, 5, 4] (2)具体用法: 输入:x[ batch_size,

    2024年02月09日
    浏览(36)
  • 机器学习李宏毅学习笔记39

    大模型+大资料 大模型的顿悟时刻 随数据量增加,模型可以从量变达到质变,从某一刻开始突然学会东西。 当成为大模型时,分数会从0,0突然变成100,完成“顿悟”. 横轴表示分布中产生答案的概率(信心分数),纵轴表示答案正确的概率。可以发现小模型的信心分数跟答案

    2024年02月14日
    浏览(74)
  • 机器学习李宏毅学习笔记33

    神经网络压缩(一) 类神经网络剪枝(pruning) 简化模型,用比较少的参数,但让效能差不多,这就是network compression这件事。有些情况下需要把模型用在resource constrain(资源有限)的情况下,比如说跑在智能手表上、小型无人机上等等。只有比较少的内存和计算能力,这时就

    2024年02月11日
    浏览(87)
  • 机器学习HW15元学习

    任务对象是Omniglot数据集上的few-shot classification任务,内容是利用元学习找到好的初始化参数。 The Omniglot dataset Omniglot数据集-背景集: 30个字母 -评估集: 20个字母 问题设置: 5-way 1-shot classification Training MAML on Omniglot classification task. Training / validation set:30 alphabets multiple charac

    2024年02月16日
    浏览(38)
  • 机器学习李宏毅学习笔记37

    ChatGPT简单原理介绍 Chatgpt以句子为输入,输出这个句子后面接的词汇的概率分布,给每一个可能的符号一个概率,根据这个分布进行sample,每次sample出来的词汇可能都是不一样的,所以答案每次也都不相同。把输出的词汇加在输入给gpt的句子后面,重复上面的过程,直到最后

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包