自然语言推理(NLI)是自然语言处理(NLP)的一个子集,它涉及到机器尝试理解一个假设是否与前提相矛盾,是否是前提的推论,或者是中立的。例如,如果前提为“男孩们踢得很好”,而假设为“印度女子队在国际上赢得荣誉”,那么这个假设与前提是相矛盾的。另一个例子是,前提为“气旋阿萨尼可能在孟加拉湾造成破坏”,而假设为“印度政府已经开始疏散”,在这里,假设是前提的推论,即它遵循前提。
数据探索
在开始模型训练之前,首先检查数据的平衡性。通过使用Seaborn库的countplot函数,可以直观地看到数据的分布情况。如果数据是平衡的,那么模型训练的效果会更好。接下来,检查每种语言的样本数量。通过绘制不同语言的样本数量图表,发现在15种语言中,大部分数据来自英语,几乎有6870个样本,而其他语言大约有400个样本。超过50%的数据是英语的,因此在模型训练时需要考虑这一点。还绘制了不同语言的词云,包括德语、俄语、英语和越南语。
基线模型
作为基线模型,采取了以下步骤:首先,将所有数据翻译成一种语言(英语);其次,使用TF-IDF对文本数据进行向量化;最后,使用随机森林模型和网格搜索CV进行超参数优化。对于数据的翻译,可以使用谷歌翻译API。然后,使用TF-IDF进行文本数据的向量化。接着,使用随机森林和网格搜索CV的代码。通过这个模型,得到了38.209%的准确率,这还有很大的提升空间。
# 翻译数据到英语的代码示例
from googletrans import Translator
def Translate(x):
translator = Translator()
translator.raise_Exception = True
return str(translator.translate(x, dest="en").text)
# 使用TF-IDF进行文本数据向量化的代码示例
from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(ngram_range=(1,3), min_df=15, max_features=500, stop_words='english')
train_premise = vect.fit_transform(trans_train["premise"])
test_premise = vect.transform(trans_test["premise"])
train_hypothesis = vect.fit_transform(trans_train["hypothesis"])
test_hypothesis = vect.transform(trans_test["hypothesis"])
train_lang_abv = vect.fit_transform(trans_train["lang_abv"])
test_lang_abv = vect.transform(trans_test["lang_abv"])
# 随机森林和网格搜索CV的代码示例
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from scipy.sparse import hstack
X = hstack([train_premise, train_hypothesis, train_lang_abv])
X_test = hstack([test_premise, test_hypothesis, test_lang_abv])
model = RandomForestClassifier(random_state=0)
param_grid = {'n_estimators': [50, 150, 200], 'max_depth': [4, 6, 8, 10, 12], 'learning_rate': [0.025, 0.05, 0.075, 0.1, 0.125, 0.15], 'eval_metric': ['logloss']}
kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
grid_model = GridSearchCV(model, param_grid, cv=kf)
grid_model.fit(X, y)
预训练模型
在研究NLI问题的最佳解决方案时,接触到了变换器和迁移学习的概念。变换器是使用注意力机制的深度神经网络模型。由于自然语言处理中存在长期依赖问题,变换器被引入来解决这些问题。变换器可以分为编码器和解码器两个主要部分。编码器是双向LSTM,提供更好的句子上下文。解码器是单向LSTM,因为单词需要逐个顺序生成。注意力机制通过提供相应的权重,帮助模型关注目标词附近的单词。如果对变换器的主题还不熟悉,推荐以下阅读材料。
迁移学习在计算机视觉领域已经是一个突破性的概念,它首次在自然语言处理领域与变换器一起使用。大多数时候没有高计算能力或大量数据。使用已经在大量数据上训练过的模型,并对其进行微调以适应任务,可以节省大量的时间,并帮助获得惊人的结果。
# 导入模型和分词器的代码示例
from transformers import AutoModelForSequenceClassification, AutoTokenizer
nli_model = AutoModelForSequenceClassification.from_pretrained('joeddav/xlm-roberta-large-xnli')
tokenizer = AutoTokenizer.from_pretrained('joeddav/xlm-roberta-large-xnli')
# 使用预训练模型进行预测的代码示例
def get_tokens_xlmr_model(data):
batch_tokens = []
for i in range(len(data)):
tokens = tokenizer.encode(data["premise"][i], data["hypothesis"][i], return_tensors="pt", truncation_strategy="only_first")
batch_tokens.append(tokens)
return batch_tokens
def get_predicts_xlmr_model(tokens):
batch_predicts = []
for i in tokens:
predict = nli_model(i)[0][0]
predict = int(predict.argmax())
batch_predicts.append(predict)
return batch_predicts
sample_train_data_tokens = get_tokens_xlmr_model(train)
sample_train_data_predictions = get_predicts_xlmr_model(sample_train_data_tokens)