草庐IT

BERT模型基本理念、工作原理、配置讲解(图文解释)

showswoller 2023-10-12 原文

一、BERT的基本理念

BERT是Birdirectional Encoder Representation from Transformers的缩写,意为多Transformer的双向编码器表示法,它是由谷歌发布的先进的嵌入模型,BERT是自然语言处理领域的一个重大突破,它在许多自然语言处理任务中取得了突出的成果,比如问答任务,文本生成,句子分类等等,BERT成功的一个主要原因是,它是基于上下文的嵌入模型,这是它与其他流行的嵌入模型的最大不同,首先让我么了解有上下文的嵌入模型和无上下文的嵌入模型之间的区别,如以下两个句子

A:he got bit by python(他被蟒蛇咬了)

B:python is my favorite programming lauguage(python是我最喜爱的编程语言)

如果使用上下文无关的的嵌入模型进行计算单词python的嵌入值,则两个句子中python嵌入值相同,因为它会忽略语境

BERT是一个基于上下文的模型,它先理解预警,然后根据上下文生成该词的嵌入值,对于上面两个句子它将生成python不同的嵌入值,BERT将该句中的每个单词与句子中的所有单词相关联,以了解每个单词的上下文含义

 

由此可见,与上下文无关的模型生成的静态嵌入不同,BERT能够根据语境生成动态嵌入

二、BERT的工作原理

 顾名思义,BERT是基于Transformer的,我们可以把它看成只有编码器的Transformer

Transformer的编码器是双向的,它可以从两个方向读取一个句子,因此BERT由Transformer获得双向编码器特征,通过BERT模型,对于一个给定的句子,我们可以获得每个单词的上下文特征

三、BERT的配置

BERT的研究人员在发布该模型是提出了两种标准配置

BERT-base

BERT-large

1:BERT-base 

它由十二层编码器叠加而成,每层编码器都使用十二个注意力头,其中前馈网络层由768个隐藏神经元组成,所以它得到的特征向量的大小为768

我们使用符号来表示上述内容

编码器的层数用L表示

注意力头的数量用A表示

隐藏神经元的数量用H表示

它的网络参数总数可达1.1亿个

2:BERT-large

该模型由二十四层编码器叠加而成,每层编码器都使用十六个注意力头,其中前馈网络层包含1024个隐藏神经元,所以得到的特征向量大小为1024

它的网络参数可达3.4亿个

3:BERT的其他配置

除了上述两种标准配置外,BERT还有多种不同的配置,下面列举一些小型配置

BERT-tiny L=2 H=128

BERT-mini L=4 H=256

BERT-small L=4 H=512

BERT-medium L=8 H=512

在计算资源有限的情况下,我们可以使用较小的BERT配置,但是标准的BERT配置可以得到更准确的结果并且应用更为广泛

创作不易 觉得有帮助请点赞关注收藏~~~ 

有关BERT模型基本理念、工作原理、配置讲解(图文解释)的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  7. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  8. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  9. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  10. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

随机推荐