ludwig 使用特定的Transformer编码器模型进行文本分类任务

hivapdat  于 2个月前  发布在  其他
关注(0)|答案(5)|浏览(29)

你好,
我想使用特定的变压器编码器模型,例如roberta-large,而不是默认的roberta,它加载了roberta-base。有没有办法实现这一点?

r6hnlfcb

r6hnlfcb1#

你好,
你可以使用 auto_transformer,即:

import pandas as pd
import yaml

from ludwig.api import LudwigModel

config = """
input_features:
- name: text
type: text
encoder: auto_transformer
pretrained_model_name_or_path: 'roberta-large'
output_features:
- name: category
type: category
trainer:
epochs: 1
"""
model = LudwigModel(yaml.load(config), backend="local")

df = pd.DataFrame(
    {
        "text": ["Suomessa vaihtuu kesän aikana sekä pääministeri että valtiovarain"],
        "category": ["Suomi"],
    }
)
model.train(df)
model.predict(df)

相关讨论:
#2057
文档:
https://ludwig-ai.github.io/ludwig-docs/0.5/configuration/features/text_features/#autotransformer

vs91vp4v

vs91vp4v2#

感谢@justinxzhao提供的示例!
我想更深入地了解Ludwig的工作原理。指定的编码器(例如,roberta-large)是在对文本序列进行编码后用于训练的模型吗?还是用于获取序列嵌入的编码器,该嵌入随后被输入到另一个模型(不确定它是什么黑盒模型)?
提出这个问题是因为,如果我们的数据中有多个文本序列(例如,问题 (type: text, encoder: auto_transformer, pretrained_model_name_or_path: 'roberta-large') 和段落 (type: text, encoder: auto_transformer, pretrained_model_name_or_path: 'bert-base') ),每个都有一个唯一的编码器,我应该如何指定将两个序列嵌入都输入到哪个编码器模型中?

ttcibm8c

ttcibm8c3#

指定的编码器(例如,roberta-large)是在对文本序列进行编码后用于训练的模型,还是用于获得序列嵌入的编码器,该嵌入随后被输入到另一个模型(不确定它是什么黑盒模型)?
以下是发生的事情的顺序:

  1. 使用与roberta-large相同的分词器对文本序列进行预处理和分词。
  2. 将编码后的序列输入到roberta-large模型。
  3. 所有Ludwig编码器的输出(对于所有特征)输入到一个Combiner(默认情况下,简单的连接)。
  4. Combiner的输出输入到二进制解码器,默认情况下是一个简单的nn.Linear层,输出大小为2。
  5. 解码器的输出经过后处理,得到实际的预测指标。
    作为这个问题,如果我们的数据中有多个文本序列(例如,问题(type: text, encoder: auto_transformer, pretrained_model_name_or_path: 'roberta-large')和文章(type: text, encoder: auto_transformer, pretrained_model_name_or_path: 'bert-base')),每个都有唯一的编码器,我应该如何指定将两个序列嵌入都输入到哪个编码器模型?
    Combiner将所有输入特征编码器的输出组合在一起,然后在提供组合表示给输出特征解码器之前提供组合表示。您可以在配置中的组合部分指定要使用哪个,如果您没有指定组合器,则将使用concat组合器。
    如果您有多个文本特征并且正在使用concat组合器,那么它们的编码器输出(一个来自roberta-large的特征的编码器输出和一个来自bert-base的特征的编码器输出)将被连接起来,这个组合表示将被输入到解码器。
    为每个文本特征单独使用单独的变压器似乎非常重。要考虑的一种替代技术是在线连接您的特征,并使用单个模型来处理组合特征,例如:
question: "...x..."
passage: "...y..."

变为:

combined_text: "question ...x... SEP passage ...y..."

序列长度变得更长,但是一个用于组合文本的变压器应该比一个用于每个文本输入特征的变压器训练得更快。

nhn9ugyo

nhn9ugyo4#

感谢@justinxzhao的详细解释。提到了两个变压器模型的例子,以了解Ludwig中的编码器是否执行两项任务 - 对文本序列进行编码和对编码器中指定的模型进行训练(基本上,它是否只是一个编码器或编码器+编码器层)。

fafcakar

fafcakar5#

你好@justinxzhao!我最近遇到了一个类似的机器学习框架-Lightwood
与Ludwig相比,它们都具有处理多种输入类型功能,根据输入类型对它们进行预处理,对输入进行编码,使用编码后的输入训练模型(强调模型),将训练好的模型的输出解码为输出特征。
在Lightwood中,可以在这里提供可能用于训练的模型-https://lightwood.io/mixer.html
以类似的方式,是否有一个列表列出了可以使用Ludwig训练的可能模型?如果有,我们如何指定要训练的首选模型(使用组合器的连接输出)?
谢谢!

相关问题