淘优惠

淘优惠

The team that has been maintaining Gym since 2021 has moved all future development to Gymnasium, a d

热门文章 0

淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】


Gym is an open source Python library for developing and comparing reinforcement learning algorithms by providing a standard API to communicate between learning algorithms and environments, as well as a standard set of environments compliant with that API. Since its release, Gym's API has become the field standard for doing this.

Gym documentation website is at , and you can propose fixes and changes to it here.

Gym also has a discord server for development purposes that you can join here:

To install the base Gym library, use .

This does not include dependencies for all families of environments (there's a massive number, and some can be problematic to install on certain systems). You can install these dependencies for one family like or use to install all dependencies.

We support Python 3.7, 3.8, 3.9 and 3.10 on Linux and macOS. We will accept PRs related to Windows, but do not officially support it.

The Gym API's API models environments as simple Python classes. Creating environment instances and interacting with them is very simple- here's an example using the "CartPole-v1" environment:

import gym
env = gym.make("CartPole-v1")
observation, info = env.reset(seed=42)

for _ in range(1000):
    action = env.action_space.sample()
    observation, reward, terminated, truncated, info = env.step(action)

    if terminated or truncated:
        observation, info = env.reset()
env.close()

Please note that this is an incomplete list, and just includes libraries that the maintainers most commonly point newcommers to when asked for recommendations.

  • CleanRL is a learning library based on the Gym API. It is designed to cater to newer people in the field and provides very good reference implementations.
  • Tianshou is a learning library that's geared towards very experienced users and is design to allow for ease in complex algorithm modifications.
  • RLlib is a learning library that allows for distributed training and inferencing and supports an extraordinarily large number of features throughout the reinforcement learning space.
  • PettingZoo is like Gym, but for environments with multiple agents.

Gym keeps strict versioning for reproducibility reasons. All environments end in a suffix like "_v0". When changes are made to environments that might impact learning results, the number is increased by one to prevent potential confusion.

The latest "_v4" and future versions of the MuJoCo environments will no longer depend on . Instead will be the required dependency for future gym MuJoCo environment versions. Old gym MuJoCo environment versions that depend on will still be kept but unmaintained. To install the dependencies for the latest gym MuJoCo environments use . Dependencies for old MuJoCo environments can still be installed by .

A whitepaper from when Gym just came out is available , and can be cited with the following bibtex entry:

@misc{1606.01540,
  Author={Greg Brockman and Vicki Cheung and Ludwig Pettersson and Jonas Schneider and John Schulman and Jie Tang and Wojciech Zaremba},
  Title={OpenAI Gym},
  Year={2016},
  Eprint={arXiv:1606.01540},
}

There used to be release notes for all the new Gym versions here. New release notes are being moved to releases page on GitHub, like most other libraries do. Old notes can be viewed here.


transformers 使用自定义模型 动图详解transformer模型

transformer神经网络,transformers主题曲,transformers prime,transformer算法

作者|huggingface编译|VK来源|Github

加载Google AI或OpenAI预训练权重或PyTorch转储

要加载Google AI、OpenAI的预训练模型或PyTorch保存的模型(用保存的实例),PyTorch模型类和tokenizer可以被实例化:

其中

  • 要么是用于加载词汇表的tokenizer(或类),要么是加载八个BERT或三个OpenAI GPT PyTorch模型类之一(用于加载预训练权重): ,,,,,, ,,,或
  • 为:

    • Google AI或OpenAI的预定义的快捷名称列表,其中的模型都是已经训练好的模型:

      • :12个层,768个隐藏节点,12个heads,110M参数量。
      • :24个层,1024个隐藏节点,16个heads,340M参数量。
      • :12个层,768个隐藏节点,12个heads,110M参数量。
      • :24个层,1024个隐藏节点,16个heads,340M参数量。
      • :(原始,不推荐)12个层,768个隐藏节点,12个heads,110M参数量。
      • :(新的,推荐)12个层,768个隐藏节点,12个heads,110M参数量。
      • :简体中文和繁体中文,12个层,768个隐藏节点,12个heads,110M参数量。
      • :仅针对德语数据训练,12个层,768个隐藏节点,12个heads,110M参数量。性能评估(
      • :24个层,1024个隐藏节点,16个heads,340M参数量。经过Whole Word Masking模式训练(该单词对应的标记全部掩码处理)
      • :24个层,1024个隐藏节点,16个heads,340M参数量。经过Whole Word Masking模式训练(该单词对应的标记全部掩码处理)
      • :在SQuAD上微调的模型(使用)。结果:exact_match:86.91579943235573,f1:93.1532499015869
      • :仅针对德语数据训练,12个层,768个隐藏节点,12个heads,110M参数量。性能评估(
      • :仅针对德语数据(无大小写),12个层,768个隐藏节点,12个heads,110M参数量。性能评估(
      • :OpenAI GPT英文模型,12个层,768个隐藏节点,12个heads,110M参数量。
      • :OpenAI GPT-2英语模型,12个层,768个隐藏节点,12个heads,117M参数量。

        • :OpenAI GPT-2英语模型,24个层,1024个隐藏节点、16个heads,345M参数量。
      • :使用Transformer-XL英语模型在wikitext的-103上训练的模型,24个层,1024个隐藏节点、16个heads,257M参数量。
    • 一个路径或URL包含一个预训练模型:

      • 或是用于模型的配置文件
      • 是保存的, 和的预训练实例的PyTorch转储。(使用常用的保存)

如果是快捷名称,则将从AWS S3下载预训练权重。可以参见链接(中找到该缓存文件夹)。

  • 可以是特定目录的可选路径,以下载和缓存预先训练的模型权重。该选项在使用分布式训练时特别有用:为避免同时访问相同的权重,你可以设置例如。)。
  • :我们应该从本地保存的TensorFlow checkpoint加载权重
  • :可选状态字典(collections.OrderedDict对象),而不是使用Google的预训练模式
  • ,:特定Bert类的附加输入(例如:BertForSequenceClassification的num_labels)

表示在WordPiece标记化之前,文本已小写,例如,变为。Uncased模型还会删除任何重音标记。表示保留了真实的大小写和重音标记。通常,除非你知道案例信息对于你的任务很重要(例如,命名实体识别或词性标记),否则模型会更好。有关多语言和中文模型的信息,请参见(。

当使用的模型时,请确保将--do_lower_case传递给示例训练脚本(如果使用自己的脚本,则将传递给FullTokenizer))。

示例:

将预训练权重保存在缓存目录中(位于此优先级):

  • 是方法的可选参数(见上文),
  • shell环境变量,
  • PyTorch缓存目录+ ,其中PyTorch缓存目录由(按此顺序定义):

    • 外壳环境变量
    • shell环境变量 +)
    • 默认值:

通常,如果你未设置任何特定的环境变量缓存将位于中。

你可以始终安全地删除缓存,但是必须从我们的S3重新下载预训练模型权重和词汇文件。

原文链接:

欢迎关注磐创AI博客站:

OpenCV中文官方文档:

欢迎关注磐创博客资源汇总站:


transformer扩散模型 transformer模型和卷积模型

transform,transformation,transformer神经网络,transform翻译

模型原理与架构

原文[Improving Language Understanding by Generative Pre-Training ]

        OpenAI Transformer是一类可迁移到多种NLP任务的,基于Transformer的语言模型,其利用Transformer的结构来进行单向语言模型的训练。它的基本思想同ULMFiT相同,都是在尽量不改变模型结构的情况下将预训练的语言模型应用到各种任务。不同的是,OpenAI Transformer主张用Transformer结构,而ULMFiT中使用的是基于RNN的语言模型。

文中所用的网络结构如下:

模型的训练过程分为两步:

1. Unsupervised pre-training

        第一阶段的目标是预训练语言模型,给定tokens的语料 ,  ,目标函数为最大化似然函数:

        该模型中应用multi-headed self-attention,并在之后增加position-wise的前向传播层,最后输出一个分布:

2. Supervised fine-tuning

        有了预训练的语言模型之后,对于有标签的训练集  ,给定输入序列  和标签 ,可以通过语言模型得到  ,经过输出层后对  进行预测:

则目标函数为:

整个任务的目标函数为:

GPT模型评价

模型的优缺点

优点:

循环神经网络所捕捉到的信息较少,而Transformer可以捕捉到更长范围的信息。 计算速度比循环神经网络更快,易于并行化 实验结果显示Transformer的效果比ELMo和LSTM网络更好 缺点:

对于某些类型的任务需要对输入数据的结构作调整

适用任务

Natural Language Inference

Question Answering and commonsense reasoning

  • Classification
  • Semantic Similarity  

        BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder。模型的主要创新点都在pre-train方法上,即用了Masked LMNext Sentence Prediction两种方法分别捕捉词语和句子级别的representation。作为一个Word2Vec的替代者,其在NLP领域的11个方向大幅刷新了精度,可以说是近年来自残差网络最优突破性的一项技术了。

Bert模型的主要特点:

  1. BERT的网络架构使用的是《Attention is all you need》中提出的多层Transformer结构,其最大的特点是抛弃了传统的RNN和CNN,通过Attention机制将任意位置的两个单词的距离转换成1,有效的解决了NLP中棘手的长期依赖问题,能更彻底的捕捉语句中的双向关系。
  2. 使用了Mask Language Model(MLM) [Wilson L Taylor. 1953. cloze procedure: A new tool for measuring readability.] 和 Next Sentence Prediction(NSP) 的多任务训练目标;
  3. 使用更强大的机器训练更大规模的数据,使BERT的结果达到了全新的高度,并且Google开源了训练好的多语言BERT模型代码,用户可以直接使用BERT作为Word2Vec的转换矩阵并高效的将其应用到自己的任务中。

Bert模型的模型结构

其中的“Trm”就是下图的Transformer Block(Transformer的编码器结构)。

BERT提供了简单和复杂两个模型,对应的超参数分别如下:

  •  : L=12,H=768,A=12,参数总量110M;
  •  : L=24,H=1024,A=16,参数总量340M;

        在上面的超参数中,L表示网络的层数(即Transformer blocks的数量Nx),H表示隐层大小,A表示Multi-Head Attention中self-Attention的数量/heads数量,feed-forward/filter 的尺寸是4H(即H=768时为3072)。

        BERT的本质上是通过在海量的语料的基础上运行自监督学习方法为单词学习一个好的特征表示,所谓自监督学习是指在没有人工标注的数据上运行的监督学习。在以后特定的NLP任务中,我们可以直接使用BERT的特征表示作为该任务的词嵌入特征。所以BERT提供的是一个供其它任务迁移学习的模型,该模型可以根据任务微调或者固定之后作为特征提取器。

        从Word2vec到AllenNLP ELMo,从OpenAI GPT到BERT的不同。Word2vec本身是一种浅层结构,而且其训练的词向量所“学习”到的语义信息受制于窗口大小;因此后续有学者提出利用可以获取长距离依赖的LSTM语言模型预训练词向量,而此种语言模型也有自身的缺陷,因为此种模型是根据句子的上文信息来预测下文的,或者根据下文来预测上文,传统的LSTM模型只学习到了单向的信息。ELMO的出现在一定程度上解决了这个问题,ELMO是一种双层双向的LSTM结构,其训练的语言模型可以学习到句子左右两边的上下文信息,但此处所谓的上下文信息并不是真正意义上的上下文。OpenAI 的GPT是利用了transform的编码器作为语言模型进行预训练的,之后特定的自然语言处理任务在其基础上进行微调即可,和LSTM相比,此种语言模型的优点是可以获得句子上下文更远距离的语言信息,但也是单向的。BERT的出现,似乎融合了它们所有的优点,并摒弃了它们的缺点,因此才可以在诸多后续特定任务上取得最优的效果。

                                                                    OpenAI GPT和ELMo

        BERT对比AI2的 ELMo和OpenAI的fine-tune transformer的优点是只有BERT表征会基于所有层中的左右两侧语境,BERT能做到这一点得益于Transformer中Attention机制将任意位置的两个单词的距离转换成了1。区别是:

  • 1 它在训练双向语言模型时以减小的概率把少量的词替成了Mask或者另一个随机的词。我个人感觉这个目的在于使模型被迫增加对上下文的记忆。至于这个概率,可能是Jacob拍脑袋随便设的。
  • 2 增加了一个预测下一句的loss。
  • 3 对比ELMo,虽然都是“双向”,但目标函数其实是不同的。ELMo是分别以 和  作为目标函数,独立训练处两个representation然后拼接,是一种双向预测 bi-directional;而BERT则是以  作为目标函数训练LM,称之为 deep bi-directional。  

        ELMO的设置其实是最符合直觉的预训练套路,两个方向的语言模型刚好可以用来预训练一个BiLSTM,非常容易理解。但是受限于LSTM的能力,无法变深了。那如何用transformer在无标注数据行来做一个预训练模型呢?一个最容易想到的方式就是GPT的方式。BERT用了两个反直觉的手段来找到了一个“更好”的方式。(1) 用比语言模型更简单的任务来做预训练。直觉上要做更深的模型,需要设置一个比语言模型更难的任务,而BERT则选择了两个看起来更简单的任务:完形填空和句对预测。(2) 完形填空任务在直观上很难作为其它任务的预训练任务。在完形填空任务中,需要mask掉一些词,这样预训练出来的模型是有缺陷的,因为在其它任务中不能mask掉这些词。而BERT通过随机的方式来解决了这个缺陷:80%加Mask,10%用其它词随机替换,10%保留原词。这样模型就具备了迁移能力。

BERT的输入的编码向量(d_model=512)是3个嵌入特征的单位和,这三个词嵌入特征是:

  1. WordPiece 嵌入[Google’s neural machine translation system: Bridging the gap between human and machine translation. ]:WordPiece是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡。例如示例中‘playing’被拆分成了‘play’和‘ing’。
  2. 位置嵌入(Position Embedding):位置嵌入是指将单词的位置信息编码成特征向量,位置嵌入是向模型中引入单词位置关系的至关重要的一环。和之前文章中的Transformer不一样,它不是三角函数,而是学习出来的。
  3. 分割嵌入(Segment Embedding):用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)。对于句子对,第一个句子的特征值是0,第二个句子的特征值是1。(lz:/segment_ids/token_type_ids。如果不使用,可以全默认为0)。

                 BERT的输入特征。特征是token嵌入,位置嵌入和分割嵌入的单位和

Note: 语料的选取很关键,要选用document-level的而不是sentence-level的,这样可以具备抽象连续长序列特征的能力。

        BERT是一个多任务模型,它的任务是由两个自监督任务组成,即MLM和NSP。《A Neural Probabilistic Language Model》这篇论文曾说,每一篇文章,天生是训练语料。

Task #1: Masked Language Model/完形填空

        Masked Language Model(MLM)和核心思想取自Wilson Taylor在1953年发表的一篇论文[cloze procedure: A new tool for measuring readability. ]。所谓MLM是指在训练的时候随即从输入预料上mask掉一些单词,然后通过的上下文预测该单词,该任务非常像我们在中学时期经常做的完形填空。正如传统的语言模型算法和RNN匹配那样,MLM的这个性质和Transformer的结构是非常匹配的。

        在BERT的实验中,15%的WordPiece Token会被随机Mask掉(而不是把像cbow一样把每个词都预测一遍),假如有 1 万篇文章,每篇文章平均有 100 个词汇,随机遮盖 15% 的词汇,模型的任务是正确地预测这 15 万个被遮盖的词汇。在训练模型时,一个句子会被多次喂到模型中用于参数学习,但是Google并没有在每次都mask掉这些单词,而是在确定要Mask掉的单词之后,80%的时候会直接替换为[Mask],10%的时候将其替换为其它任意单词,10%的时候会保留原始Token。

  • 80%:my dog is hairy -> my dog is [mask]
  • 10%:my dog is hairy -> my dog is apple
  • 10%:my dog is hairy -> my dog is hairy

        这么做的原因是如果句子中的某个Token100%都会被mask掉,那么在fine-tuning的时候模型就会有一些没有见过的单词。加入随机Token的原因是因为Transformer要保持对每个输入token的分布式表征,否则模型就会记住这个[mask]是token ’hairy‘,随机词替换会给模型增加一点点噪声,但是因为此时模型不知道哪个词是被随机换了(不像[MASK],给模型[MASK]则模型知道此处词的是被挖了,他需要预测这个位置是啥),所以就迫使他去更好地保留每个词的词义,为下游任务提供方便。至于单词带来的负面影响,因为一个单词被随机替换掉的概率只有15%*10%=1.5%,这个负面影响其实是可以忽略不计的。

        另外文章指出每次只预测15%的单词,因此模型收敛的比较慢。

Note: 为什么要使用MaskLM的方式来训练语言模型?

        传统的语言模型是单向的(数学上已经定义了)。而且往往都很浅(想象一下LSTM堆三层就train不动了,就要上各种trick了),比如ELMo。与之前使用的单向语言模型进行预训练不同,BERT使用遮蔽语言模型来实现预训练的深度双向表示。举个例子:

> 今天 天气 不错, 我们 去 公园 玩 吧。

        这句话,单向语言模型在学习的时候是从左向右进行学习的,先给模型看到“今天 天气”两个词,然后告诉模型下一个要填的词是“不错”。然而单向语言模型有一个欠缺,就是模型学习的时候总是按照句子的一个方向去学的,因此模型学习每个词的时候只看到了上文,并没有看到下文。更加合理的方式应该是让模型同时通过上下文去学习,这个过程有点类似于完形填空题。例如:

>今天 天气 { }, 我们 去 公园 玩 吧。

        通过这样的学习,模型能够更好地把握“不错”这个词所出现的上下文语境。

    &nb