稍微记录(翻译)一下guide:https://guide.allennlp.org/

目录

  • PART 1: QUICK START
    • Your first model
      • 1 What is text classification
      • 2 Defining input and output
      • 3 Reading Data
      • 4 Making a DatasetReader
      • 5 Building your model
        • 模型的作用
        • 用token ID表示文本
        • 对token做词嵌入(Embedding tokens)
        • 使用序列到向量的编码器(Apply Seq2Vec encoder)
        • 计算各标签的贡献
      • 6 Implementing the model — the constructor(执行)
        • AllenNLP Model basics
        • Constructing the Model
          • Passing the vocabulary
          • Embedding words
          • Applying a Seq2VecEncoder
          • Applying a classification layer
      • 7 Implementing the model — the forward method
        • Model.forward()
          • Inputs to forward
          • Embedding the text
          • Applying a Seq2VecEncoder
          • Making predictions

PART 1: QUICK START

Your first model

1 What is text classification

介绍一下文本分类及简单的例子。

2 Defining input and output

在AllenNLP中,每个训练样本是用一个Instance对象表示的。一个Instance对象包含一个或多个Fields,每个Fields代表一部分数据,输入或者是输出,计算中会转成张量tensors。

细节在PART 2 Reading Data。

3 Reading Data

读入数据时使用的是DatasetReader,把原始数据文件转成符合输入输出格式的Instance对象。格式为:

# Inputs
text: TextField
# Outputs
label: LabelField

我们会使用两个Field分别代表输入输出,并用输入预测输出。

假定数据集的格式为[text] [TAB] [label]

4 Making a DatasetReader

官方提供了DatasetReader类,用的时候继承就行了,至少要重写_read()方法,这个方法的目的是读入数据集生成Instance对象。

@DatasetReader.register('classification-tsv')
class ClassificationTsvReader(DatasetReader):def __init__(self):self.tokenizer = SpacyTokenizer()self.token_indexers = {'tokens': SingleIdTokenIndexer()}def _read(self, file_path: str) -> Iterable[Instance]:with open(file_path, 'r') as lines:for line in lines:text, label = line.strip().split('\t')text_field = TextField(self.tokenizer.tokenize(text),self.token_indexers)label_field = LabelField(label)fields = {'text': text_field, 'label': label_field}yield Instance(fields)

最简单的写法,调用reader.read(file)的时候会返回一个Instance列表。这个读入器会使用tokenizer把读入文件的每一行切分成单词,然后把单词用我们构建的词汇表中的id来表示,这样每一行就可以用tensor来表示了。

特别注意在字典fields里使用的中使用的text label键,在之后向模型传递参数时就是用的这些名字。

其实output label是可选的,所以也可以读入无标签数据,这里暂不讨论。

更加灵活和功能齐全的使用方法请参阅PART 2 Dataset reader。

5 Building your model

(详见原网站的示意图)

模型的作用

(1)从输入中的每个单词中获取一些特征;
(2)单词级的特征融合成表示文章级特征的向量;
(3)把这些向量分到某一类标签上。
AllenNLP把每一个部分拆分开来写成generic abstraction,方便灵活使用。

用token ID表示文本

使用SingleIdTokenIndexer把字符串转为token ID(一个句子?)。

对token做词嵌入(Embedding tokens)

使用一个Embedding函数,把每个token ID转成一个向量。

使用序列到向量的编码器(Apply Seq2Vec encoder)

使用一些函数把一系列向量(一篇文章?)转成一个向量。

计算各标签的贡献

用这个向量进行分类,依据它属于每一类标签的概率。

6 Implementing the model — the constructor(执行)

AllenNLP Model basics

一个AllenNLP模型只是一个PyTorch模块,它执行一个forward() 方法,输出是一个字典,键为loss,用来优化模型。
训练的循环是这样的:将一个batch的Instance传到模型里,从结果字典中获取loss,使用backprop计算梯度并更新模型参数。此循环无需用户执行。

Constructing the Model

在Model构造函数中,我们需要实例化我们要训练的所有变量。在AllenNLP中,我们建议将这些变量中的大多数作为构造函数的参数,以便我们可以配置模型的行为而无需更改模型代码,并且可以在更高层次上考虑模型的工作方式。我们的文本分类模型的构造函数如下所示:

@Model.register('simple_classifier')
class SimpleClassifier(Model):def __init__(self,vocab: Vocabulary,embedder: TextFieldEmbedder,encoder: Seq2VecEncoder):super().__init__(vocab)self.embedder = embedderself.encoder = encodernum_labels = vocab.get_vocab_size("labels")self.classifier = torch.nn.Linear(encoder.get_output_dim(), num_labels)

你会发现,我们在AllenNLP代码中使用了很多类型标注,这既是对代码的可读性(如果你知道一个模型它参数的类型,而不仅仅是名字,更容易理解它在做什么),因为我们在某些情况下,使用这些批注玩些花样。

其中一种情况是构造函数变量,在这里我们可以使用这些类型注释从配置文件中自动构造编码器器和解码器。更多信息请参见PART 2 Using config files: FromParams and Registrable。该章还将告诉您有关的调用方法@Model.register()

如果您将allennlp train命令与配置文件一起使用(我们将在下面显示操作方法),则无需调用此构造函数,这一切都将为您解决。

Passing the vocabulary

Vocabulary管理词汇表项(例如单词和标签)及其整数ID之间的映射。在我们的预建培训循环中,词汇是由AllenNLP在读取您的培训数据后创建的,然后Model在构建时传递给。我们将找到您使用的所有标记和标签,并在单独的命名空间中为它们分配所有整数ID。这种情况的发生方式是完全可配置的。有关更多信息,请参见本指南的“词汇”部分。

我们在中所做的操作DatasetReader会将标签放在默认的“标签”命名空间中,然后从第10行的词汇表中获取标签的数量。

Embedding words

为了获得初始单词嵌入,我们将使用AllenNLP的TextFieldEmbedder。这种抽象采用由a创建的张量TextField并嵌入每个张量。这是我们最复杂的抽象,因为在NLP中有很多方法可以执行此特定操作,并且我们希望能够在不更改代码的情况下在这些方法之间进行切换。我们不会在这里详细介绍;我们将在本指南的整个 章节中专门介绍这种抽象的工作原理和使用方法。现在,您只需要知道将其应用到输入的 text参数中forward(),就可以得到一个张量,该张量的每个输入令牌都具有单个嵌入矢量,且形状为(batch_size, num_tokens, embedding_dim)。

Applying a Seq2VecEncoder

为了将令牌向量的序列压缩为单个向量,我们使用AllenNLP的Seq2VecEncoder 抽象。顾名思义,这封装了一个采用一系列向量并返回单个向量的操作。因为我们所有的模块都在成批输入上运行,所以这将采用形如(batch_size, num_tokens, embedding_dim)的张量,并返回形如的张量 (batch_size, encoding_dim)。

Applying a classification layer

我们Model需要的最后一个参数是分类层,它可以将我们的输出转换Seq2VecEncoder为logit,每个可能的标签一个值。这些值将在以后转换为概率分布,并用于计算损失。

我们不需要将此作为构造函数参数,因为我们将只使用一个简单的线性层,该层的大小可以在构造函数内部确定-Seq2VecEncoder知道其输出尺寸,并且Vocabulary知道有多少个标签。

7 Implementing the model — the forward method

接下来,我们需要实现forward()模型的方法,该方法采用输入,产生预测并计算损失。在这里,我们将展示如何在中使用这些参数Model.forward(),这些参数将获取与我们的输入/输出规范匹配的参数(因为这是我们对进行编码的方式 DatasetReader)。

Model.forward()

在中forward,我们使用在构造函数中创建的参数将输入转换为输出。在预测了输出之后,我们将根据与真实输出的接近程度来计算一些损失函数,然后返回该损失(以及我们想要的任何其他损失),以便我们可以使用它来训练参数。

class SimpleClassifier(Model):def forward(self,text: TextFieldTensors,label: torch.Tensor) -> Dict[str, torch.Tensor]:# Shape: (batch_size, num_tokens, embedding_dim)embedded_text = self.embedder(text)# Shape: (batch_size, num_tokens)mask = util.get_text_field_mask(text)# Shape: (batch_size, encoding_dim)encoded_text = self.encoder(embedded_text, mask)# Shape: (batch_size, num_labels)logits = self.classifier(encoded_text)# Shape: (batch_size, num_labels)probs = torch.nn.functional.softmax(logits)# Shape: (1,)loss = torch.nn.functional.cross_entropy(logits, label)return {'loss': loss, 'probs': probs}
Inputs to forward

首先要注意的是此功能的输入。在AllenNLP训练循环的工作方式是,我们将采取字段名称您在使用DatasetReader,给你一个批次的情况下与那些相同的字段名称中forward。因此,因为我们使用text和label作为字段名称,所以我们需要以forward相同的方式命名参数。

其次,注意这些参数的类型。每种类型的技术都Field知道如何将其转换为 torch.Tensor,然后torch.Tensor从批处理中Fields以相同的名称从所有批处理中创建批处理Instances。您看到的类型text和label是由TextField和产生的张量 LabelField(再次,请参见我们有关使用TextField的章节以获取有关的更多信息TextFieldTensors)。要知道的重要部分是,我们TextFieldEmbedder在构造函数中创建的our期望将这种类型的对象作为输入,并且将返回嵌入式张量作为输出。

Embedding the text

我们执行的第一个实际建模操作是嵌入文本,为每个输入令牌获取一个向量。请注意这里我们并没有指定任何东西如何在操作完成后,只是一个TextFieldEmbedder是我们在构造函数中得到的是要做到这一点。这使我们以后变得非常灵活,可以在各种嵌入方法或预训练表示形式(包括ELMo和BERT)之间进行更改,而无需更改模型代码。

Applying a Seq2VecEncoder

嵌入文本后,接下来必须将向量序列(每个标记一个)压缩为整个文本的单个向量。我们使用Seq2VecEncoder作为构造函数参数获得的来做到这一点。为了在将可能具有不同长度的文本片段批处理在一起时正常运行,我们需要对张量中仅由于填充而存在的元素进行遮罩embedded_text。我们使用实用程序功能从TextField输出中获取掩码,然后将该掩码传递到编码器中。

在这些行的末尾,对于批次中的每个实例,我们都有一个向量。

Making predictions

我们模型的最后一步是为批次中的每个实例获取向量,并为其预测标签。我们classifier的torch.nn.Linear图层logit为每个可能的标签提供分数(通常称为)。我们使用softmax操作对这些分数进行归一化,以获取标签上的概率分布,然后我们可以返回给该模型的使用者。为了计算损失,PyTorch具有一个内置函数,该函数计算我们预测的对数与真实标签分布之间的交叉熵,并将其用作损失函数。

就是这样!这是简单分类器所需的全部。编写完DatasetReader and之后Model,AllenNLP会处理其余工作:将输入文件连接到数据集读取器,智能地将实例批处理在一起并将它们馈送到模型,并通过对丢失使用backprop来优化模型的参数。我们将在下一章中详细介绍这一部分。

allenNLP入门记录相关推荐

  1. jieba入门记录——nltk中文语料处理

    jieba入门记录--nltk中文语料处理 环境:pycharm(Anaconda) 1.官网下载jieba:https://pypi.org/project/jieba/ 2.将下载好的压缩包解压到 ...

  2. Cordova 快速入门记录

    本篇文章由:http://xinpure.com/cordova-quick-start-recording/ 记一笔 Cordova 官网入门文档 Get Started Fast,言简意该.通俗易 ...

  3. 【UE】Unreal Engine虚幻引擎自己的入门记录

    目录 Note注意 写这个的系列的原因 学习或者说转到UE的最重要的一点 IDE的推荐 Rider for Unreal 学习资料推荐 后面更新什么 Note注意 记录自己在UE引擎的学习路线,不保证 ...

  4. cuda入门——记录

    学习目标: cuda入门学习 记录一下看到的比较好的文章(个人记录用) 学习内容: 一些比较好的文章链接 例如: Cuda入门 Cuda入门 CUDA实现矩阵加法 CUDA实现矩阵加法 [CUDA编程 ...

  5. Linux 入门记录:六、Linux 硬件相关概念(硬盘、磁盘、磁道、柱面、磁头、扇区、分区、MBR、GPT)...

    一.硬盘 硬盘的功能相当简单但很重要,它负责记录系统所需要的各种数据.硬盘记录数据有两个方面,一个是硬件方面的存储原理和结构,另外一方面则是软件方面的数据和文件系统.硬盘的主要行为就是数据的存放和取出 ...

  6. 【数字图像处理】【个人入门记录】 绪论

    [数字图像处理] 萌新入门 一.绪论 1.什么是数字图像处理 1)什么是图像 Ⅰ图: Ⅱ像: Ⅲ图像: 2)什么是数字图像 2.数字图像处理系统 1)获取图像 Ⅰ成像 Ⅱ数字化 采样: 量化 量化结果 ...

  7. 个人学习宋红康老师java入门记录的笔记,严禁商用.

    1 Markdown语法学习 标题: #加上 空格 后面继续输入内容 回车即形成标题,二级,三级...标题依次多一个#即可 字体 Hello,world! Hello,world! 粗体 两边各加两个 ...

  8. 68 iso14443读卡入门记录

    1.前言 最近项目涉及射频读卡,我负责读卡程序移植以及基于APDU自定义数据收发接口实现.由于第一次参与读卡项目涉及读卡相关协议内容,因此特此学习记录. 2.读卡分析 基于ISO14443协议读卡流程 ...

  9. IC入门记录(持续更新)

    目录 软件-ADS安装 90nm, 65nm工艺指什么? 导入的65mm工艺文件之后的CMOS种类有什么不一样? PDK是什么? ADS电感元件上的小圆圈代表什么? ADS中如何设置仿真温度 关于La ...

最新文章

  1. 鸡年除夕全天微信红包收发量达142亿个增长75.7%
  2. 图像有用区域 bfs
  3. 阿里云计算平台招AI解决方案产品经理
  4. 概率论 第三章 多维随机变量及其分布
  5. 函数节流你应该知道的那点事,建议收藏!
  6. Eclipse中JBOSS莫名其妙自动关闭
  7. MyEclipse下安装MyBatis Generator代码反向生成工具
  8. iframe 自适应高度 跨域
  9. 课时40:类与对象:一些相关的BIF
  10. android 8.0 用户体验优化--day02
  11. 计算机系班级海报,系部动态 | 电子系“五彩班栏”班级海报评比
  12. 简单易扩展的爬虫架构
  13. 【已解决】请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记
  14. 如何解决Greenplum pg_dump备份时的分布策略缺失等问题
  15. Git(7):git撤销已经push到远端的commit
  16. Servlet运行原理(Tomcat为例)
  17. 浏览器模式电子海图快速显示的研究
  18. win11系统安装vmware虚拟机win10 汇总
  19. Linux图形终端与字符终端
  20. AI护老虎,智护生态,英特尔用人工智能解决大问题

热门文章

  1. 计算机多媒体从时效分,多媒体技术基础大学计算机基础课件.ppt
  2. 咸菜,粥,咸鸭蛋及其他_拔剑-浆糊的传说_新浪博客
  3. MAC OS 配置JDK环境变量
  4. 魔兽世界服务端centos架设
  5. 数据库中的blob是什么类型?
  6. 数据库期末考试知识点复习(1~7章)
  7. 计算机软件与plc兼容,触摸屏传程序的时候显示电脑里的软件和hmi中的不兼容
  8. 解决vscode中文注释乱码
  9. vue项目批量加载url文件并打包到zip下载
  10. 中兴交换机配置telnet连接_原创:思科交换机常用配置