- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
首先需要介绍什么是自监督学习。我们知道监督学习是有明确的样本和对应的标签,将样本丢进去模型训练并且将训练结果将标签进行比较来修正模型,如下图:
而自监督学习就是 没有标签也要自己创建监督学习的条件,即当前只有样本x但是没有标签 \(\hat{y}\) ,那具体的做法就是将样本x分成两部分 \(x\prime\) 和 \(x\prime \prime\) ,其中一部分作为输入模型的样本,另一部分来作为标签 :
如果觉得很抽象也没关系,请继续往下阅读将会逐渐清晰这个定义.
BERT的架构可以简单地看成跟Transformer中的Encoder的架构是相同的(可以参考我这篇文章[点此]( [机器学习]李宏毅——Transformer - 掘金 (juejin.cn) )),其实现的功能都是 接受一排向量,并输出一排向量 。而BERT特别的地方在于 它对于接受的一排输入的向量(通常是文字或者语音等)会随机选择某些向量进行“遮挡”(mask) ,而进行遮挡的方式又分为两种:
而这两种方法的选择也是随机的,因此就是 随机选择一些文字再随机选择mask的方案来进行遮挡 。然后就让BERT来读入这一排向量并输出一排向量,那么训练过程就是 将刚才遮挡的向量其对应的输出向量,经过一个线性变换模型(乘以一个矩阵)再经过softmax模块得到一个result,包含该向量取到所有文字的所有概率 ,虽然BERT不知道被遮挡的向量代表什么文字但我们是知道的,因此 我们就拿答案的文字对应的one-hat-vector来与向量result最小化交叉熵,从而来训练BERT和这个线性变换模块 ,总体可以看下图:
这个任务是 判别两个句子它们是不是应该连接在一起 ,例如判断“我爱”和“中国”是不是应该连在一起,那么在BERT中具体的做法为:
具体如下图:
而前面我们介绍了两种BERT的应用场景,看起来似乎都是填空题或者判断题, 那么是否BERT只能够用于这种场景之下呢 ?当然不是!BERT具有强大的能力,它不仅可以用来解决我们感兴趣的下游任务,更有趣的是, 它只需要将刚才训练(Pre-train)完成的可以处理填空题任务的简单BERT进行微调(Fine-tune)就可以用来高效地解决一些下游、复杂的任务 。也就是说BERT只需要先用简单的任务来进行Pre-train,然后再进行微调就可以用于我们感兴趣的下游复杂任务! 。
这里补充一个知识点,因为BERT这类模型可以进行微调来解决各种下游任务,因此有一个任务集为GLUE,里面包好了9种自然语言处理的任务,一般评判BERT这种模型就是将BERT分为微调来处理这9个任务然后对正确率等进行平均。9个任务如下:
Case 1 是接受一个向量,输出一个分类,例如做句子的情感分析,对一个句子判断它是积极的还是消极的。那么如何用BERT来解决这个问题呢,具体的流程如下:
而重要的地方在于 线性变换模块的参数是随机初始化的,而BERT中的参数是之前就pre-train的参数 ,这样会比随机初始化的BERT更加高效。而这也代表 我们需要很多句子情感分析的样本和标签来让我们可以通过梯度下降来训练线性变换模块和BERT的参数 。如下图:
一般我们是将BERT和线型变换模块一起称为Sentiment analysis.
这个任务是输入一排向量,输出是和输入相同数目的向量,例如词性标注问题。那么具体的方法也是很类似的,BERT的参数也是经过pre-train得到的,而线性变化的参数是随机初始化的,然后就通过一些有标注的样本进行学习,如下图:
在该任务中,输入是两个句子,输出是一个分类,例如自然语言推断问题,输入是一个假设和一个推论,而输出就是这个假设和推论之间是否是冲突的,或者是相关的,或者是没有关系的:
那么BERT对这类任务的做法也是类似的,因为要输出两个句子,因此 在两个句子之间应该有一个SEP的特殊字符对应的向量,然后在开头也有CLS特殊字符对应的向量 ,并且由于输出是单纯一个分类, 那关注的也是CLS对应的输出向量,将其放入线性变换模块再经过softmax就得到分类结果了 。参数的设置跟之前都是一样的。如下图:
BERT还可以用来做问答模型!但是对这个问答模型具有一定的限制,即 需要提供给它一篇文章和一系列问题,并且要保证这些问题的答案都在文章之间出现过 ,那么经过BERT处理之后将会对一个问题输出两个正整数, 这两个正整数就代表问题的答案在文章中的第几个单词到第几个单词这样截出来的句子 ,即下图的s和e就能够截取出正确答案.
那么BERT具体在做这件事时,也是将文章和问题看成两个向量集,那么同样在它们中间要加上SEP,在开头要加上CLS,然后经过BERT之后会产生相同数目的向量。那么关键地方在于 会初始化两个向量称为A和B,它们的长度和BERT输出的向量的长度相同,那首先拿A和文章对应的所有输出向量逐个进行点乘,每一个都得到一个数字,再全部经过softmax,然后看看哪一个最终的结果最大,最大的就是对应s的取值;B也是同理经过相同的处理最后取最大的作为e的取值 ,那么得到s和e之后就可以去文章中取答案了!如下图:
那么我们要训练的就是随机初始化的两个向量和已经pre-train的BERT.
前面介绍的BERT的各种应用场景都没有用在seq2seq的场景,那么如果要将BERT用于这个场景呢还需要再加上一个Dncoder,即:
先将原始的输入加入一定的干扰,然后经过Encoder和Decoder之后呢输出的向量是和原来的输入具有相同的数目,那么目的就是希望输出向量能够和未加干扰之前的向量集足够接近.
具体的干扰方法也是多种多样:
先从一个事实来说明为什么BERT能够在文字处理中如此有效.
在BERT中,如果我们给它一个句子,也就是一排向量,那么它 对应输出的向量可以认为里面包含了对应输入向量文字的含义 ,怎么理解呢?看下面的例子,例如我们给输入”台湾大学“,那么BERT的对应”大“的输出其实可以认为它是知道其含义的。这么说明可能有点抽象,我们需要通过下一个例子来解释.
由于中文中常常存在一词多意,那么现在假设苹果的苹的两个含义,收集关于苹果的各种句子和关于苹果手机的各种句子让BERT先进行训练, 然后再输入关于苹果的五条句子和关于苹果手机的五条句子,如下图:
然后我们就来检查,两个意义中的“苹”字对应的输出向量之间的相似性 ,结果如下图:
可以看到,关于吃的苹果的句子之中“苹”的对应输出向量,它们彼此之间相似性较高;关于苹果手机的也是;但是如果是不同的“苹“那么相似性则较低 .
为什么会有这种神奇的现象呢? 难道是BERT学会了这个文字的多个含义吗 ?
实际上是因为在训练的时候我们将”苹“遮住的话,BERT要从上下文来分析做出预测,它会发现这两种不同的”苹“所对应的上下文经常是不一样的,因此它做出预测的输出向量也就会存在差异 !在许多论文上都是这个说法的。或者也可以认为由于上下文给这个遮掉的单词赋予了一定的意义,那么有可能,具有类似含义的单词在上下文就会比较接近(例如食物的话上下文可能都跟餐具有关),那么在做出预测的时候就向量比较接近.
这个模型也就是用很多种语言来训练一个模型:
那么有一个实验室表现了BERT的神奇之处,也就是用了104种语言Pre-trainBERT,也就是教BERT做填空题,然后再用英文的问答资料来教BERT做英文的问答题,再在测试集中用中文的问答题来测试BERT,它的结果如下,可以达到这个正确率真的很令人吃惊!因为在BERT之前最好的是QANet,它的正确率比这样的BERT还低! 。
经过上述中英文的训练,现在思考的问题是:为什么你给的是英文的训练集,在测试集的中文中,它不会给你在预测的地方预测出英文呢?那么这是否可以说明 在BERT中实际上它是能够区分不同语言之间的差别,而不是单纯的将其看做一个向量呢 ?那么来做下面这个实验:如果把所有中文都放进去BERT得到输出然后平均得到一个向量,英文也是相同做法得到一个向量,然后将这两个向量进行相减得到一个差值的向量;再将英文一句话丢进去BERT,得到输出后加上这个差值的向量,会出现这个神奇的现象:
可以发现 居然可以直接实现了翻译的功能 !再来看更复杂的例子:
可以看到虽然BERT不能够完全地将中文转为英文,但是在某些单词上还是能够正确的转换的!这也表达了BERT的强大之处.
GPT做的事情和BERT所做的填空题是不一样的,GPT具体做的是根据当前的输入预测下一个时刻可能的token,例如下图:
即给出Begin of Sequence,就预测出台,然后给出BOS和台就预测出湾,以此类推。对输出向量的处理就是右边那部分,先经过一个线性变化后再经过softmax得到结果向量,再跟理想结果来计算交叉熵,然后是最小化交叉熵来训练的.
那么要注意的地方是它预测的时候看到的只有上文而已,即不知道后面的句子是什么.
最后此篇关于【机器学习】李宏毅——自监督式学习的文章就讲到这里了,如果你想了解更多关于【机器学习】李宏毅——自监督式学习的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何在 Excel 中编写可以在我将打开的任何 Excel 文档上工作(使用快捷方式运行)的宏? 这可能吗? 最佳答案 您需要将宏添加到 Personal.xlsb 以使它们可用于所有 excel 文
我正在研究 problem #74在4clojure.com,我的解决方案如下: (defn FPS [s] (->> (map read-string (re-seq #"[0-9]+"
我还没有完全理解Clojure 箭头宏thread-first -> 和thread-last 宏->> 之间的区别。在阅读 https://clojure.org/guides/threading_
我想将一些调试输出语句插入到大型 C 代码库中。这些调试输出语句将由编译器选项开关控制。 调试输出语句如下所示: #ifdef DEBUG_FLAG Print(someSymbol) #endif
我正在通过宏将代码注入(inject)到 C++ 类中。有没有办法根据访问修饰符的上下文来做到这一点?有点像 #if (we_are_in_public_context) INJECT_PUBLIC_
这应该与 memoize 类似,但有很大不同。虽然 memoize 应该与纯函数一起使用,但它通常对加速 IO 相关函数很有用。 我正在寻找的函数/宏应该表现得像高阶函数。它产生的功能应该: 第一次调
对于下面的代码: let services: [MyServices] = [ MyService(), #if DEBUG DebugService(), #endi
假设我有以下文本文件 name: John Doe description: My name is John Doe and I'm really good at vim! name: John Do
在创建 Excel 宏方面需要帮助。我有一个 Excel 工作表。Excel 工作表不一致。我打算使它统一和结构化。 例如。 A B C
我正在 excel 中设置一个宏,以便在更新单元格时自动发送电子邮件。是否可以在电子邮件正文中包含单元格的内容?例如,如果单元格 G7 已更新,请在电子邮件中包含单元格 B7 的内容?单元格行将是相同
我创建了一个简单的 Excel 工作表。 这是我的宏代码: Sub MyMacro() Sheets("Sheet1").Select A$ = Cells(1, 1) Msg
在 Excel 的 VB 宏中,如何删除所有出现的以某个字符串开头的单词? 例如: 字符串内容为:xxxx $AUD543.43 yyyy 我想搜索以 $AUD 开头的字符串中的任何内容并删除下一个空
我是 Excel 宏的新手.. 谁能告诉我这个宏是做什么的? Sub People_Add_Document() prow = ActiveCell.row num = Cells(p
我对 Excel 中的 VBA 和宏非常陌生。我有一个非常大的 Excel 电子表格,其中 A 列保存日期。我正在尝试删除值小于某个日期的行,这就是我到现在为止的想法。 Sub DELETEDATE(
我在 Excel 2003 中有一个 VBA 对象,当通过流数据获得某些值时,它会触发三个简单的宏。它运行良好。我想打开一个重复的工作表,但具有不同的流数据,并在各自的工作表上触发宏。它现在可以使用,
下面的宏有什么问题?我只想评估一个选项卡中的一个单元格是否大于另一个选项卡中的另一个单元格。然后消息框: Sub Comhouse() If Worksheets("(2.2) TRA works
需要一个简单的 excel 宏的帮助。我在第 1 列 X1 到 X20 中有数据。我想自动将此信息粘贴到 A 列,然后当我更新 X 列中的数字时,我想将此信息粘贴到 B 列,然后再粘贴到 C 列...
我找到了以下代码,效果很好;但是,我必须手动更改月份,以便它转到第二个工作簿的右侧工作表。由于工作表以月为单位,我怎样才能使其自动更改为当月? Sub AlarmSheet() Dim wkb As
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
我的公司只使用 MS Office 2003 产品,所以我必须坚持下去。由于我的工作性质,我需要使用很多“复制和粘贴”功能。源数据主要来自网站,我将数据粘贴到 Excel 中的单元格中。问题是剪贴板保
我是一名优秀的程序员,十分优秀!