sqlist 发表于 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标签。但这种情况根本不能过滤。我是自己一点点学的,这种情况是第一次遇见,坛友做机器学习相关的能不能给点解决方法?
我把少量代码直接放在这里吧,这是训练集数据的处理和对应标签的生成:

def generate_labels(text_token, selected_text_token):
    len1=len(text_token)
    labels=[-1]*len1
    labels=-1   
    j=1
    for i in range(1,len1):
      if(j>=len(selected_text_token)-1):
            break
      if(text_token==selected_text_token):
            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, max_length=MAXLEN)
    labels=generate_labels(input_ids,selected_text_ids)


    padding_length=MAXLEN-len(input_ids)


    train_input_ids.append(input_ids+*padding_length)
    train_labels.append(labels+*padding_length)
    train_attention_mask.append(*len(input_ids)+*padding_length)
    train_token_type_ids.append(*MAXLEN)



npk7k 发表于 2023-10-12 14:58

sqlist 发表于 2023-10-12 15:06

本帖最后由 sqlist 于 2023-10-12 15:18 编辑

npk7k 发表于 2023-10-12 14:58
不懂NLP
听起来像是要做padding
填充肯定做了的,在清洗数据的时候,训练集里面的input mask type和label都会加上padding到最大长度。测试集也是。这么做是为了方便模型学习,但也导致了后面的问题。如果只需要分类,那就不用担心这么多了

ArthurFyc 发表于 2023-10-12 15:10

我没有完全理解你的问题,不过“模型会对被填充的 token 赋予概率”,这个听起来不太合理,padding 的部分应该都要 mask 掉,比如在算softmax 之前赋一个负无穷值之类的。

東京急行 发表于 2023-10-12 15:10

长短不齐的话,图像里尺寸不一样可以直接resize,nlp里的句子转成特征向量之后可以resize嘛?
感觉深度学习最无脑的地方在于,反正都是各种拟合,遇事不决先再加一层mlp再说

sqlist 发表于 2023-10-12 15:15

本帖最后由 sqlist 于 2023-10-12 15:19 编辑

ArthurFyc 发表于 2023-10-12 15:10
我没有完全理解你的问题,不过“模型会对被填充的 token 赋予概率”,这个听起来不太合理,padding 的部分 ...
这点我也感觉不太合理,但是预处理训练集和测试集,我检查二者掩码都是正常的,我想问题可能就是标签上吧

sqlist 发表于 2023-10-12 15:16

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

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

ArthurFyc 发表于 2023-10-12 15:21

你的输出层设计是不是有问题,看起来你这个任务应该是对每个 token 做一个二分类,输出层应该是一个sigmoid 激活的层,不会受句子长度影响才对。

seawindfog 发表于 2023-10-12 15:21

sqlist 发表于 2023-10-12 15:22

ArthurFyc 发表于 2023-10-12 15:21
你的输出层设计是不是有问题,看起来你这个任务应该是对每个 token 做一个二分类,输出层应该是一个sigmoid ...

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

sqlist 发表于 2023-10-12 15:24

seawindfog 发表于 2023-10-12 15:21
2023年了这类问题是不是可以扔给各种llm一把梭了

—— 来自 S1Fun

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

seawindfog 发表于 2023-10-12 15:28

sqlist 发表于 2023-10-12 16:23

seawindfog 发表于 2023-10-12 15:28
不过看描述你是不是把multilabel和multiclass搞混了,如果最后输出是对每个词独立用一个sigmoid的话概率不 ...

抱歉,我没太看明白。我是在bert后面添加的全连接层,没有对词语单独用sigmoid
页: [1]
查看完整版本: 机器学习 相关求助