基于bert模型的文本分类研究:“Predict the Happiness”挑战

2023-05-16

1. 前言

在2018年10月,Google发布了新的语言表示模型BERT-“Bidirectional Encoder Representations from Transformers”。根据他们的论文所言,在文本分类、实体识别、问答系统等广泛的自然语言处理任务上取得了最新的成果。

2017年12月,参加了Hackerreath的一个挑战“Predict the Happiness”。在这个挑战中,我为这个文本分类问题(Predict the Happiness)构建了一个多层全连接神经网络通过提交的测试数据,我可以得到87.8%的准确率,排名是66。

在互联网上围绕BERT进行了大量的讨论之后,我选择将BERT应用到同一个Challenge中,以证明调整BERT模型是否能将我带到这个挑战的更好排名。

2. Bert安装与预训练模型

  • 将BERT Github项目Copy到自己的机器上:

git clone https://github.com/google-research/bert.git
  • 直接下载预训练的Bert模型

Google提供了四个预训练模型:

  • BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters
  • BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters
  • BERT-Base, Cased: 12-layer, 768-hidden, 12-heads , 110M parameters
  • BERT-Large, Cased: 24-layer, 1024-hidden, 16-heads, 340M parameters

本文下载了BERT-Base, Cased第一个进行文本分类实验。这里,我们需要以符合bert模型的格式准备文本数据。Google规定了数据的格式:

对于train.tsv or dev.tsv:

  • 每行需要一个ID
  • 每行需要一个整数值作为标签 ( 0,1,2,3 etc)
  • 一列完全相同的字母
  • 要分类的文本示例

对于test.tsv:

  • 每行需要一个ID
  • 想要测试的文本示例

下面的python代码片段将读取hackerreath训练数据(train.csv),并根据bert模型机型数据准备:

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from pandas import DataFrame
 
le = LabelEncoder()
 
df = pd.read_csv("data/train.csv")
 
# Creating train and dev dataframes according to BERT
df_bert = pd.DataFrame({'user_id':df['User_ID'],
            'label':le.fit_transform(df['Is_Response']),
            'alpha':['a']*df.shape[0],
            'text':df['Description'].replace(r'\n',' ',regex=True)})
 
df_bert_train, df_bert_dev = train_test_split(df_bert, test_size=0.01)
 
# Creating test dataframe according to BERT
df_test = pd.read_csv("data/test.csv")
df_bert_test = pd.DataFrame({'User_ID':df_test['User_ID'],
                 'text':df_test['Description'].replace(r'\n',' ',regex=True)})
 
# Saving dataframes to .tsv format as required by BERT
df_bert_train.to_csv('data/train.tsv', sep='\t', index=False, header=False)
df_bert_dev.to_csv('data/dev.tsv', sep='\t', index=False, header=False)
df_bert_test.to_csv('data/test.tsv', sep='\t', index=False, header=True)

原始训练数据格式如下:

符合Bert的训练数据格式如下:

3. 使用BERT预训练模型进行模型训练

进行训练前的检查(太重要了):

  • 所有的.tsv文件都在“data”的文件夹中
  • 创建文件夹“bert_output”,保存经过微调的模型,并以“test_results.tsv”的名称生成测试结果
  • 检查是否下载了“cased_l-12_h-768_a-12”中的预先训练的bert模型到当前目录

  • 确保命令中的路径是相对路径(以“/”开头)

在终端上运行以下命令:

python run_classifier.py 
--task_name=cola 
--do_train=true 
--do_eval=true 
--do_predict=true 
--data_dir=./data/ 
--vocab_file=./cased_L-12_H-768_A-12/vocab.txt 
--bert_config_file=./cased_L-12_H-768_A-12/bert_config.json 
--init_checkpoint=./cased_L-12_H-768_A-12/bert_model.ckpt 
--max_seq_length=400 
--train_batch_size=8 
--learning_rate=2e-5 
--num_train_epochs=3.0 
--output_dir=./bert_output/ 
--do_lower_case=False

在输出目录中生成“test_results.tsv”,作为对测试数据集的预测的结果它包含所有类在列中的预测概率值。

4. 提交结果

下面的python代码将结果从BERT模型转换为.csv格式,以便提交给hackerreath Challenge:

df_results = pd.read_csv("bert_output/test_results.tsv",sep="\t",header=None)
df_results_csv = pd.DataFrame({'User_ID':df_test['User_ID'],
                               'Is_Response':df_results.idxmax(axis=1)})
 
# Replacing index with string as required for submission
df_results_csv['Is_Response'].replace(0, 'happy',inplace=True)
df_results_csv['Is_Response'].replace(1, 'not_happy',inplace=True)
 
# writing into .csv
df_results_csv.to_csv('data/result.csv',sep=",",index=None)

下图显示了将概率值转换为提交结果的过程:

BERT的威力就是可以将排名从66升到第4!!!

5. 总结

  • Bert的训练环节:

该模型使用两个新的无监督预测任务进行预训练:

BERT使用了一种简单的方法:MASK输入中15%的单词,通过一个深度Bidirectional Transformer encoder运行整个序列,然后只预测MASK的单词例如:

Input: the man went to the [MASK1] . he bought a [MASK2] of milk.
Labels: [MASK1] = store; [MASK2] = gallon

为了学习句子之间的关系,BERT还训练了一个可以从任何单语语料库生成的简单任务:给定两个句子a和b,预测b是a之后的实际下一个句子,还是只是语料库中的一个随机句子。

Sentence A: the man went to the store.
Sentence B: he bought a gallon of milk.
Label: IsNextSentence

Sentence A: the man went to the store.
Sentence B: penguins are flightless.
Label: NotNextSentence
  • 根据模型体系结构的规模,有两个预先训练的模型,即BASE和LARGE。
BERT BASE:
    Number of Layers =12
    No. of hidden nodes = 768
    No. of Attention heads =12
    Total Parameters = 110M

BERT LARGE:
    Number of Layers =24,
    No. of hidden nodes = 1024
    No. of Attention heads =16
    Total Parameters = 340M

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于bert模型的文本分类研究:“Predict the Happiness”挑战 的相关文章

  • Bert CNN信息抽取

    Github参考代码 https github com Wangpeiyi9979 IE Bert CNN 数据集来源于百度2019语言与智能技术竞赛 在上述链接中提供下载方式 感谢作者提供的代码 1 信息抽取任务 给定schema约束集合
  • 手把手教你用Keras实现英文到中文机器翻译 seq2seq+LSTM

    原文链接 https blog csdn net qq 44635691 article details 106919244 该模型实现的是英文到中文的翻译 下图为了更好展示模型架构借用大佬的图 这里没有用到Embeddings 本文完整代
  • 【自然语言处理】ChatGPT 相关核心算法

    ChatGPT 相关核心算法 ChatGPT 的卓越表现得益于其背后多项核心算法的支持和配合 本文将分别介绍作为其实现基础的 Transformer 模型 激发出其所蕴含知识的 Prompt Instruction Tuning 算法 其涌
  • Bert模型做多标签文本分类

    Bert模型做多标签文本分类 参考链接 BERT模型的详细介绍 图解BERT模型 从零开始构建BERT 强推 李宏毅2021春机器学习课程 我们现在来说 怎么把Bert应用到多标签文本分类的问题上 注意 本文的重点是Bert的应用 对多标签
  • NLP之BERT和GPT

    NLP之BERT和GPT杂谈 我们介绍了好几种获取句子表征的方法 然而值得注意的是 我们并不是只对如何获取更好的句子表征感兴趣 在评估他们各自模型性能的时候所采取的方法 回过头去进行梳理 发现 无论是稍早些的 InferSent 还是 20
  • BERT论文阅读笔记

    文章题目 BERT Pre training of Deep Bidirectional Transformers for Language Understanding Pre training指的是在一个数据集上训练好一个模型 然后这个模
  • 【BERT类预训练模型整理】

    BERT类预训练模型整理 1 BERT的相关内容 1 1 BERT的预训练技术 1 1 1 掩码机制 1 1 2 NSP Next Sentence Prediction 1 2 BERT模型的局限性 2 RoBERTa的相关内容 2 1
  • NLP--BPE、WordPiece、ULM、SentencePiece子词分词器总结【原理】

    序言 当我们在做英语文本任务时 机器无法理解文本 当我们将句子序列送入模型时 模型仅仅能看到一串字节 它无法知道一个词从哪里开始 到哪里结束 所以也不知道一个词是怎么组成的 所以 为了帮助机器理解文本 我们需要 将文本分成一个个小片段 然后
  • Self-attention计算方法

    三个矩阵 首先 Inputs为x1 x4 是一个sequence 每一个Input先通过一个Embedding 乘上一个Matrix得到 a1 a4 然后放入self attention 在self attention当中 每一个Input
  • #手写代码# 用Bert+CNN解决文本分类问题

    文章目录 1 配置文件 2 定义模型 2 1 init self config 函数 2 1 conv and pool 函数 2 3 forward self x 函数 1 配置文件 首先定义一个配置文件类 类里边存放Bert和CNN的一
  • 基于tensorflow2.0+使用bert获取中文词、句向量并进行相似度分析

    本文基于transformers库 调用bert模型 对中文 英文的稠密向量进行探究 开始之前还是要说下废话 主要是想吐槽下 为啥写这个东西呢 因为我找了很多文章要么不是不清晰 要么就是基于pytorch 所以特地写了这篇基于tensorf
  • NLP中BERT在文本二分类中的应用

    最近参加了一次kaggle竞赛Jigsaw Unintended Bias in Toxicity Classification 经过一个多月的努力探索 从5月20日左右到6月26日提交最终的两个kernel 在public dataset
  • Coxph 预测与系数不匹配

    下午好 我可以发布可重现的代码 如果每个人都同意有些问题 我当然会发布 但现在我认为我的问题非常简单 有人会为我指出正确的道路 我正在处理这样的数据集 created as free user t c
  • 使用 R 中的 glmmTMB 预测人口级别的栅格堆栈

    我正在尝试使用适合的 GLMM 来预测 R 中的栅格堆栈glmmTMB包 在人口水平 即将随机效应设置为 0 我遵循了 Ben Bolker 的解决方案这个线程适用于适合的模型lme4 但即使函数参数re form 0似乎适用于predic
  • ggplot2 中稳健的标准错误

    我想用 ggplot2 绘制一个模型 我估计了一个稳健的方差 协方差矩阵 我想在估计置信区间时使用它 我可以告诉 ggplot2 使用我的 VCOV 或者 我可以以某种方式强制 Predict lm 使用我的 VCOV 矩阵吗 一个虚拟示例
  • 使用step_naomit进行预测并使用tidymodels保留ID

    在使用随机森林模型进行预测以合并回原始数据帧时 我尝试在行上保留 ID 我在配方中使用了step naomit 它在烘焙训练数据时删除了缺少数据的行 同时也删除了测试数据上缺少数据的记录 不幸的是 我没有 ID 来轻松知道哪些记录被删除 因
  • 使用R中的randomForest包,如何从分类模型中获取概率?

    TL DR 有什么我可以在原件中标记的吗 randomForest 调用以避免重新运行 predict 函数来获取预测的分类概率 而不仅仅是可能的类别 Details 我正在使用随机森林 http cran r project org we
  • 由于环境设置错误,使用 Keras 进行预测失败

    我无法让 Keras 预测任何事情 即使在这个简约的模型中也不行 from keras models import Sequential from keras layers import Dense import numpy as np i
  • 如何在几年前拟合的逻辑回归中使用 R 中的预测函数?

    我有一个问题正在尝试解决 但没有成功 寻找了两天多 却没有得到任何线索 很抱歉 如果答案就在那里 但我没有找到 假设您有一个来自几年前估计的旧模型的逻辑方程回归 二元模型 因此 您知道参数 k k 1 2 p 因为它们是过去估计的 但您没有
  • R中的预测和预测函数之间的区别

    两者之间有什么区别吗predict and forecast R 中的函数 如果是 在哪些具体情况下应该使用它们 Intro predict 适用于多种 R 对象 模型 基础库的一部分 forecast 对于时间序列 预测包的一部分 参见示

随机推荐