找回密码
 立即注册
搜索
查看: 2084|回复: 12

[软件] 机器学习 相关求助

[复制链接]
     
发表于 2023-10-12 14:38 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 sqlist 于 2023-10-12 15:39 编辑

           rt,我自己在拿kaggle上老竞赛项目当练手项目的时候遇到了一个很麻烦的问题。具体情况是这样的:kaggle上有个竞赛是tweet sentiment.                  简单来说,这个竞赛的训练集包含原始文本、筛选文本和情感词三列,测试集包括原始文本和情感词两列。  这个比赛的目标,是把模型训练到可以从原始文本里挑出能代表感情色彩的词。               举一个简单的例子:原文本是my boss is bullying me...  情感标签是negative。模型要筛选出来文本是bullying me 。  
          我的思路是,把情感词和原始文本拼接,用tokenizer将筛选文本和原始文本token化后,逐个比对出一个列表。-1表示原文本对应词没有选中,1表示选中,0表示填充部分。loss函数是自己拿交叉熵小改了一下。用bert预训练模型修改以后学习。如果用上面的举例,比对之后,生成的标签就应该是[0 -1 -1 -1 -1 1 1 0 ...]这样的。
          但是这样一来有两个问题:虽然我训练集和测试集都有掩码,但是标签没有掩码,由于文本需要被填充到一样的长度,标签也要填充到相同长度。模型会给标签里被填充的部分也赋予概率。此外,由于每个句子不一样长,分配给词的概率也没有一个统一水平。句子长,分给每个词的概率就小,反之就大。我的做法,还需要把概率再转回 0-1标签。但这种情况根本不能过滤。我是自己一点点学的,这种情况是第一次遇见,坛友做机器学习相关的能不能给点解决方法?
我把少量代码直接放在这里吧,这是训练集数据的处理和对应标签的生成:

def generate_labels(text_token, selected_text_token):
    len1=len(text_token)
    labels=[-1]*len1
    labels[0]=-1   
    j=1
    for i in range(1,len1):
        if(j>=len(selected_text_token)-1):
            break
        if(text_token==selected_text_token[j]):
            labels=1
            j+=1
        else:
            labels=-1
    labels=-1  
    return labels


X_data=train['sentiment']+' '+train['text']  
for i in range(len(X_data)):
    if(i%1000==0):   print(i)
   
    input_ids=tokenizer.encode(X_data,max_length=MAXLEN)
    selected_text_ids=tokenizer.encode(train.loc[i,'selected_text'], max_length=MAXLEN)
    labels=generate_labels(input_ids,selected_text_ids)


    padding_length=MAXLEN-len(input_ids)


    train_input_ids.append(input_ids+[0]*padding_length)
    train_labels.append(labels+[0]*padding_length)
    train_attention_mask.append([1]*len(input_ids)+[0]*padding_length)  
    train_token_type_ids.append([0]*MAXLEN)



回复

使用道具 举报

     
发表于 2023-10-12 14:58 | 显示全部楼层
不懂NLP
听起来像是要做padding
回复

使用道具 举报

     
 楼主| 发表于 2023-10-12 15:06 来自手机 | 显示全部楼层
本帖最后由 sqlist 于 2023-10-12 15:18 编辑
npk7k 发表于 2023-10-12 14:58
不懂NLP
听起来像是要做padding

填充肯定做了的,在清洗数据的时候,训练集里面的input mask type和label都会加上padding到最大长度。测试集也是。这么做是为了方便模型学习,但也导致了后面的问题。如果只需要分类,那就不用担心这么多了
回复

使用道具 举报

     
发表于 2023-10-12 15:10 | 显示全部楼层
我没有完全理解你的问题,不过“模型会对被填充的 token 赋予概率”,这个听起来不太合理,padding 的部分应该都要 mask 掉,比如在算softmax 之前赋一个负无穷值之类的。
回复

使用道具 举报

发表于 2023-10-12 15:10 | 显示全部楼层
长短不齐的话,图像里尺寸不一样可以直接resize,nlp里的句子转成特征向量之后可以resize嘛?
感觉深度学习最无脑的地方在于,反正都是各种拟合,遇事不决先再加一层mlp再说
回复

使用道具 举报

     
 楼主| 发表于 2023-10-12 15:15 来自手机 | 显示全部楼层
本帖最后由 sqlist 于 2023-10-12 15:19 编辑
ArthurFyc 发表于 2023-10-12 15:10
我没有完全理解你的问题,不过“模型会对被填充的 token 赋予概率”,这个听起来不太合理,padding 的部分 ...

这点我也感觉不太合理,但是预处理训练集和测试集,我检查二者掩码都是正常的,我想问题可能就是标签上吧
回复

使用道具 举报

     
 楼主| 发表于 2023-10-12 15:16 来自手机 | 显示全部楼层
東京急行 发表于 2023-10-12 15:10
长短不齐的话,图像里尺寸不一样可以直接resize,nlp里的句子转成特征向量之后可以resize嘛?
感觉深度学习 ...

感觉这么做不太适合学习吧....
回复

使用道具 举报

     
发表于 2023-10-12 15:21 | 显示全部楼层
你的输出层设计是不是有问题,看起来你这个任务应该是对每个 token 做一个二分类,输出层应该是一个sigmoid 激活的层,不会受句子长度影响才对。
回复

使用道具 举报

头像被屏蔽
     
发表于 2023-10-12 15:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2023-10-12 15:22 来自手机 | 显示全部楼层
ArthurFyc 发表于 2023-10-12 15:21
你的输出层设计是不是有问题,看起来你这个任务应该是对每个 token 做一个二分类,输出层应该是一个sigmoid ...

你说的有道理,不过我的bert模型只接了一个全连接层,其实和多标签分类有点相近了,用的确实是sigmoid函数
回复

使用道具 举报

     
 楼主| 发表于 2023-10-12 15:24 来自手机 | 显示全部楼层
seawindfog 发表于 2023-10-12 15:21
2023年了这类问题是不是可以扔给各种llm一把梭了

—— 来自 S1Fun

用的就是预训练的bert……不过llm效果确实是比之前的模型效果强,哪怕不调,准确率也往往高了一截
回复

使用道具 举报

头像被屏蔽
     
发表于 2023-10-12 15:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2023-10-12 16:23 来自手机 | 显示全部楼层
seawindfog 发表于 2023-10-12 15:28
不过看描述你是不是把multilabel和multiclass搞混了,如果最后输出是对每个词独立用一个sigmoid的话概率不 ...

抱歉,我没太看明白。我是在bert后面添加的全连接层,没有对词语单独用sigmoid
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-6-7 12:26 , Processed in 0.043294 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表