自然语言推理入门与实践

自然语言推理(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)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485