gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

分类归档深度学习

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  人工智能
  • 分类归档: "深度学习"
深度学习 2月 8,2025

DeepSeek-R1论文中文翻译及通俗解释

最近火遍全网,功能媲美OpenAI等国外最强大模型的DeepSeek,

R1论文链接以放在下面,供大家学习参考。
论文链接:https://github.com/deepseek-ai/DeepSeek-R1/blob/main/DeepSeek_R1.pdf

考虑到很多人英文阅读起来还是有点障碍,翻译成中文并附上通俗解释。

摘要

我们推出了第一代推理模型 DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是通过大规模强化学习(RL)训练出来的模型,它在训练时没有将监督微调(SFT)作为初步步骤,却展现出了卓越的推理能力。在强化学习的过程中,DeepSeek-R1-Zero 自然而然地产生了许多强大且有趣的推理行为。不过,它也面临一些问题,比如生成内容的可读性差、存在语言混合现象。为了解决这些问题并进一步提升推理性能,我们推出了 DeepSeek-R1,该模型在强化学习之前加入了多阶段训练和冷启动数据。DeepSeek-R1 在推理任务上的表现与 OpenAI-o1-1217 相当。为了支持研究社区,我们开源了 DeepSeek-R1-Zero、DeepSeek-R1,以及基于 Qwen 和 Llama 从 DeepSeek-R1 中提炼出来的六个稠密模型(15 亿、70 亿、80 亿、140 亿、320 亿、700 亿参数规模)。

通俗解释

这部分主要讲了团队搞出了两个超厉害的推理模型,叫 DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是靠大规模强化学习训练出来的,没经过监督微调,就能自己 “琢磨” 出好多厉害的推理方法。但它也有点小毛病,像写出来的东西不太好懂,还会把不同语言混在一起。所以团队又搞出了 DeepSeek-R1,这个模型训练的时候加了些 “冷启动数据”,还分好几个阶段训练,就解决了前面那些问题,在推理能力上和 OpenAI 的一个超厉害的模型(OpenAI-o1-1217 )差不多厉害。最后,为了让大家一起研究,团队把这些模型还有基于它们做出来的一些小模型都开源了,谁都能拿去用。

1. 引言

近年来,大语言模型(LLMs)经历了快速的迭代和发展(Anthropic, 2024; Google, 2024; OpenAI, 2024a),与通用人工智能(AGI)之间的差距逐渐缩小。
最近,后训练成为完整训练流程的重要组成部分。研究表明,后训练可以提高推理任务的准确性,使模型符合社会价值观,并适应用户偏好,同时与预训练相比,所需的计算资源相对较少。在推理能力方面,OpenAI 的 o1(OpenAI, 2024b)系列模型率先通过增加思维链推理过程的长度来实现推理时的扩展。这种方法在数学、编码和科学推理等各种推理任务中取得了显著的改进。然而,如何在测试时有效地进行扩展,仍然是研究界有待解决的问题。此前有多项研究探索了各种方法,包括基于过程的奖励模型(Lightman 等人,2023; Uesato 等人,2022; Wang 等人,2023)、强化学习(Kumar 等人,2024)以及蒙特卡洛树搜索和束搜索等搜索算法(Feng 等人,2024; Trinh 等人,2024; Xin 等人,2024)。但这些方法中,没有一种能在通用推理性能上与 OpenAI 的 o1 系列模型相媲美。
在本文中,我们迈出了利用纯强化学习(RL)提升语言模型推理能力的第一步。我们的目标是探索大语言模型在没有任何监督数据的情况下发展推理能力的潜力,重点关注它们如何通过纯强化学习过程实现自我进化。具体来说,我们以 DeepSeek-V3-Base 为基础模型,采用 GRPO(Shao 等人,2024)作为强化学习框架,以提高模型在推理任务中的性能。在训练过程中,DeepSeek-R1-Zero 自然地展现出许多强大且有趣的推理行为。经过数千次强化学习步骤后,DeepSeek-R1-Zero 在推理基准测试中表现卓越。例如,在 2024 年美国数学邀请赛(AIME 2024)上,其单次回答正确(pass@1)的得分从 15.6% 提升到了 71.0%,通过多数投票法,得分进一步提高到 86.7%,与 OpenAI-o1-0912 的性能相当。
然而,DeepSeek-R1-Zero 也面临着诸如可读性差和语言混合等挑战。为了解决这些问题并进一步提升推理性能,我们推出了 DeepSeek-R1,它结合了少量冷启动数据和多阶段训练流程。具体而言,我们首先收集数千条冷启动数据,对 DeepSeek-V3-Base 模型进行微调。之后,像训练 DeepSeek-R1-Zero 一样,进行面向推理的强化学习。在强化学习过程接近收敛时,我们通过对强化学习检查点进行拒绝采样,结合来自 DeepSeek-V3 在写作、事实性问答和自我认知等领域的监督数据,创建新的监督微调(SFT)数据,然后重新训练 DeepSeek-V3-Base 模型。用新数据微调后,该检查点再进行一轮强化学习,同时考虑所有场景的提示。经过这些步骤,我们得到了一个名为 DeepSeek-R1 的检查点,其性能与 OpenAI-o1-1217 相当。
我们进一步探索从 DeepSeek-R1 向较小的稠密模型进行知识蒸馏。以 Qwen2.532B(Qwen, 2024b)为基础模型,直接从 DeepSeek-R1 进行蒸馏的效果优于在其基础上应用强化学习。这表明,较大基础模型发现的推理模式对于提高推理能力至关重要。我们开源了基于 Qwen 和 Llama(Dubey 等人,2024)系列的蒸馏模型。值得注意的是,我们蒸馏得到的 140 亿参数模型大幅超越了当前最先进的开源模型 QwQ-32B-Preview(Qwen, 2024a),而蒸馏得到的 320 亿和 700 亿参数模型在稠密模型的推理基准测试中创下了新纪录。

1.1 研究贡献

  • 后训练:在基础模型上进行大规模强化学习:我们直接将强化学习应用于基础模型,而不依赖监督微调(SFT)作为初步步骤。这种方法使模型能够探索思维链(CoT)来解决复杂问题,从而开发出 DeepSeek-R1-Zero。DeepSeek-R1-Zero 展示了自我验证、反思和生成长思维链等能力,为研究界树立了重要的里程碑。值得注意的是,这是首次通过公开研究验证,大语言模型的推理能力可以纯粹通过强化学习来激发,而无需监督微调。这一突破为该领域未来的发展铺平了道路。
    我们介绍了开发 DeepSeek-R1 的流程。该流程包含两个强化学习阶段,旨在发现更好的推理模式并符合人类偏好,还包含两个监督微调阶段,为模型的推理和非推理能力奠定基础。我们相信这个流程将有助于行业开发出更优秀的模型。
  • 知识蒸馏:小模型也能有强大能力:我们证明了可以将大模型的推理模式蒸馏到小模型中,与小模型通过强化学习发现的推理模式相比,这样能带来更好的性能。开源的 DeepSeek-R1 及其应用程序编程接口(API)将有助于研究社区在未来蒸馏出更好的小模型。
    利用 DeepSeek-R1 生成的推理数据,我们对研究社区中广泛使用的几个稠密模型进行了微调。评估结果表明,蒸馏得到的较小稠密模型在基准测试中表现出色。DeepSeek-R1-Distill-Qwen-7B 在 2024 年美国数学邀请赛(AIME 2024)上的得分达到 55.5%,超过了 QwQ-32B-Preview。此外,DeepSeek-R1-Distill-Qwen-32B 在 AIME 2024 上的得分达到 72.6%,在 MATH-500 上的得分达到 94.3%,在 LiveCodeBench 上的得分达到 57.2% 。这些结果显著超越了以前的开源模型,与 o1-mini 相当。我们向社区开源了基于 Qwen2.5 和 Llama3 系列的 15 亿、70 亿、80 亿、140 亿、320 亿和 700 亿参数规模的蒸馏模型检查点。

1.2 评估结果总结

  • 推理任务:(1)DeepSeek-R1 在 2024 年美国数学邀请赛(AIME 2024)上的单次回答正确(Pass@1)得分达到 79.8%,略高于 OpenAI-o1-1217。在 MATH-500 测试中,它取得了令人瞩目的 97.3% 的高分,与 OpenAI-o1-1217 表现相当,且显著超越其他模型。(2)在与编码相关的任务中,DeepSeek-R1 在代码竞赛任务中展现出专家水平,在 Codeforces 平台上获得 2029 的 Elo 评级,超过了竞赛中 96.3% 的人类参与者。在与工程相关的任务中,DeepSeek-R1 的表现略优于 DeepSeek-V3,这对开发者在实际工作中会有所帮助。
  • 知识水平:在 MMLU、MMLU-Pro 和 GPQA Diamond 等基准测试中,DeepSeek-R1 取得了出色的成绩,在 MMLU 上得分为 90.8%,在 MMLU-Pro 上得分为 84.0%,在 GPQA Diamond 上得分为 71.5%,显著超越 DeepSeek-V3。虽然在这些基准测试中,其性能略低于 OpenAI-o1-1217,但 DeepSeek-R1 超越了其他闭源模型,展示了其在教育任务中的竞争优势。在事实性基准测试 SimpleQA 上,DeepSeek-R1 的表现优于 DeepSeek-V3,证明了它处理基于事实的查询的能力。在这个基准测试中,OpenAI-o1 也超越了 GPT-4o,呈现出类似的趋势。
  • 其他方面:DeepSeek-R1 在广泛的任务中也表现出色,包括创意写作、通用问答、编辑、总结等。它在 AlpacaEval 2.0 上的长度控制胜率达到 87.6%,在 ArenaHard 上的胜率达到 92.3%,展示了其智能处理非考试类查询的强大能力。此外,DeepSeek-R1 在需要长上下文理解的任务中表现卓越,在长上下文基准测试中大幅超越 DeepSeek-V3。

通俗解释

大语言模型这几年发展特别快,和通用人工智能的距离越来越近。后训练在提升模型能力上很有用,OpenAI 的 o1 系列模型通过增加推理步骤让模型在很多推理任务上表现变好,但怎么让模型在测试的时候也能这么厉害,大家还在研究。
这篇论文里,团队想用纯强化学习来提升模型的推理能力。他们用 DeepSeek-V3-Base 做基础模型,通过强化学习训练出了 DeepSeek-R1-Zero。这个模型训练的时候自己就琢磨出好多厉害的推理方法,在 AIME 2024 测试里成绩提高特别多。不过它也有问题,写出来的东西不好懂,还会把不同语言混在一起。
所以团队又搞出了 DeepSeek-R1,训练的时候先给模型一些 “冷启动数据”,再分阶段训练,最后这个模型的表现和 OpenAI-o1-1217 差不多。而且,团队还把 DeepSeek-R1 的推理能力 “教” 给了一些小模型,这些小模型在测试里成绩也很好,超过了很多以前的开源模型。
从测试结果来看,DeepSeek-R1 在推理任务上特别厉害,像数学和编码任务成绩都很好;在知识类测试里也不错,比 DeepSeek-V3 好很多;在其他任务,像写作、问答这些方面也表现很棒,理解长文章的能力也很强。

2. 方法

2.1 概述

以往的研究大多依赖大量的监督数据来提升模型性能。在本研究中,我们证明了即使不使用监督微调(SFT)作为冷启动,通过大规模强化学习(RL)也能显著提升模型的推理能力。此外,加入少量冷启动数据可以进一步提升模型性能。在接下来的章节中,我们将介绍:(1)DeepSeek-R1-Zero,它直接在基础模型上应用强化学习,不使用任何监督微调数据;(2)DeepSeek-R1,它从用数千个长思维链(CoT)示例微调后的检查点开始应用强化学习;(3)将 DeepSeek-R1 的推理能力蒸馏到小型稠密模型中。

2.2 DeepSeek-R1-Zero:基础模型上的强化学习

强化学习在推理任务中已显示出显著的有效性,我们之前的研究(Shao 等人,2024;Wang 等人,2023)已证实了这一点。然而,这些研究严重依赖监督数据,而收集监督数据非常耗时。在本节中,我们探索大语言模型在无任何监督数据的情况下发展推理能力的潜力,重点关注其通过纯强化学习过程的自我进化。我们先简要介绍我们的强化学习算法,然后展示一些令人振奋的结果,希望能为研究社区提供有价值的见解。

2.2.1 强化学习算法:组相对策略优化

为节省强化学习的训练成本,我们采用组相对策略优化(GRPO)(Shao 等人,2024)。该方法舍弃了通常与策略模型规模相同的价值网络,而是通过组得分来估计基线。具体来说,对于每个问题,

用户与助手进行对话。用户提出问题,助手进行解答。助手先在脑海中思考推理过程,然后为用户提供答案。推理过程和答案分别包含在<think></think>和<answer></answer>标签内,即<think>推理过程在此处</think><answer>答案在此处</answer>。用户:提示。助手:

用户助手
提示<think>推理过程在此处</think><answer>答案在此处</answer>

表 1 DeepSeek-R1-Zero 的模板。训练过程中,提示部分会被具体的推理问题替代。

2.2.2 奖励建模

奖励是训练信号的来源,它决定了强化学习的优化方向。为训练 DeepSeek-R1-Zero,我们采用基于规则的奖励系统,主要包含两种类型的奖励:

  • 准确率奖励:准确率奖励模型用于评估回答是否正确。例如,对于有确定答案的数学问题,要求模型以指定格式(如在方框内)给出最终答案,以便基于规则可靠地验证答案的正确性。同样,对于 LeetCode 问题,可以使用编译器根据预定义的测试用例生成反馈。
  • 格式奖励:除准确率奖励模型外,我们还采用格式奖励模型,强制模型将其思考过程置于<think>和</think>标签之间。
    在开发 DeepSeek-R1-Zero 时,我们没有应用结果或过程神经奖励模型,因为我们发现神经奖励模型在大规模强化学习过程中可能会遭受奖励作弊问题,并且重新训练奖励模型需要额外的训练资源,还会使整个训练流程变得复杂。

2.2.3 训练模板

为训练 DeepSeek-R1-Zero,我们首先设计了一个简单的模板,引导基础模型遵循我们指定的指令。如表 1 所示,该模板要求 DeepSeek-R1-Zero 首先生成推理过程,然后给出最终答案。我们有意将约束限制在这种结构格式上,避免任何特定内容的偏差,例如强制要求反思性推理或推崇特定的问题解决策略,以确保我们能准确观察模型在强化学习过程中的自然发展。

2.2.4 DeepSeek-R1-Zero 的性能、自我进化过程和顿悟时刻

  • DeepSeek-R1-Zero 的性能:图 2 展示了 DeepSeek-R1-Zero 在 2024 年美国数学邀请赛(AIME 2024)基准测试中,整个强化学习训练过程中的性能变化轨迹。如图所示,随着强化学习训练的推进,DeepSeek-R1-Zero 的性能稳步提升。值得注意的是,AIME 2024 上的平均单次回答正确(pass@1)得分显著提高,从最初的 15.6% 跃升至令人瞩目的 71.0%,达到了与 OpenAI-o1-0912 相当的性能水平。这一显著改进凸显了我们的强化学习算法随着时间推移优化模型性能的有效性。
    表 2 对 DeepSeek-R1-Zero 和 OpenAI 的 o1-0912 模型在各种推理相关基准测试中的表现进行了对比分析。结果显示,强化学习使 DeepSeek-R1-Zero 在无需任何监督微调数据的情况下获得了强大的推理能力。这是一项值得关注的成就,因为它强调了模型仅通过强化学习就能有效学习和泛化的能力。此外,通过多数投票法,DeepSeek-R1-Zero 的性能还可以进一步提升。例如,在 AIME 基准测试中采用多数投票法时,DeepSeek-R1-Zero 的性能从 71.0% 提升至 86.7%,超过了 OpenAI-o1-0912 的性能。DeepSeek-R1-Zero 在使用和不使用多数投票法的情况下都能取得如此有竞争力的性能,凸显了其强大的基础能力以及在推理任务中进一步提升的潜力。
  • DeepSeek-R1-Zero 的自我进化过程:DeepSeek-R1-Zero 的自我进化过程生动展示了强化学习如何驱动模型自主提升推理能力。通过直接从基础模型启动强化学习,我们可以在不受监督微调阶段影响的情况下,密切监测模型的发展。这种方法清晰呈现了模型随时间的演变,尤其是在处理复杂推理任务的能力方面。
    如图 3 所示,DeepSeek-R1-Zero 的思考时间在整个训练过程中持续改善。这种改善并非外部调整的结果,而是模型内部的自然发展。DeepSeek-R1-Zero 通过利用更长的测试时计算资源,自然而然地获得了解决日益复杂推理任务的能力。这种计算过程从生成数百到数千个推理令牌不等,使模型能够更深入地探索和优化其思维过程。
    这种自我进化最显著的特点之一是,随着测试时计算量的增加,模型会出现复杂的行为。例如,模型会自发地进行反思(重新审视和评估之前的步骤),并探索解决问题的替代方法。这些行为并非预先编程设定,而是模型与强化学习环境交互的结果。这种自发的发展显著增强了 DeepSeek-R1-Zero 的推理能力,使其能够更高效、准确地处理更具挑战性的任务。
  • DeepSeek-R1-Zero 的顿悟时刻:在训练 DeepSeek-R1-Zero 的过程中,观察到一个特别有趣的现象 ——“顿悟时刻”。如表 3 所示,这个时刻出现在模型的一个中间版本中。在此阶段,DeepSeek-R1-Zero 学会了通过重新评估初始方法,为一个问题分配更多思考时间。这种行为不仅证明了模型推理能力的不断提升,也是强化学习能够产生意想不到的复杂结果的生动例证。
    这个时刻不仅对模型来说是一个 “顿悟时刻”,对于观察其行为的研究人员而言也是如此。它凸显了强化学习的力量与魅力:我们并非直接教模型如何解决问题,而只是为其提供正确的激励,它就能自主开发出先进的问题解决策略。“顿悟时刻” 有力地提醒我们,强化学习具有解锁人工智能系统新智能水平的潜力,为未来开发更自主、自适应的模型铺平了道路。
  • DeepSeek-R1-Zero 的缺点:尽管 DeepSeek-R1-Zero 展现出强大的推理能力,并自主发展出了意想不到的强大推理行为,但它也面临一些问题。例如,DeepSeek-R1-Zero 存在可读性差和语言混合等挑战。为了使推理过程更具可读性并与开放社区共享,我们探索了 DeepSeek-R1,这是一种利用强化学习并结合对人类友好的冷启动数据的方法。

通俗解释

以前提升模型能力大多靠大量的监督数据,这篇论文则证明了用大规模强化学习,就算不用监督微调,也能提升模型推理能力,加点冷启动数据效果还会更好。接下来就介绍了三种方法,这里先讲 DeepSeek-R1-Zero。
强化学习在推理任务里本来就挺好用,但以前收集监督数据太费时间。这次用的 GRPO 算法能省点训练成本,它不用和策略模型一样大的价值网络,通过一组数据的得分来估算基线,然后优化策略模型。
训练的时候,奖励很重要。DeepSeek-R1-Zero 用的是基于规则的奖励系统,一方面看答案对不对,对了就给准确率奖励,像数学题按要求格式答对了、LeetCode 问题通过测试用例就给分;另一方面要求模型按规定格式写推理过程,符合格式就给格式奖励。因为神经奖励模型容易出问题,还费资源,所以没采用。
训练模板就是让模型按规定来,先写推理过程,再写答案,这样能看看模型自己在强化学习过程中是怎么发展的。
从结果来看,DeepSeek-R1-Zero 在 AIME 2024 测试里成绩越来越好,和 OpenAI-o1-0912 差不多,用多数投票法还能超过它。而且在训练过程中,它思考时间越来越长,自己就学会解决更难的问题,还能反思、找新方法,就像突然 “开窍” 了一样。不过它也有问题,写的东西不好懂,还会混着多种语言,所以就有了后面的 DeepSeek-R1 。

2.3 DeepSeek-R1:基于冷启动的强化学习

受 DeepSeek-R1-Zero 令人鼓舞的结果启发,自然产生了两个问题:1)通过引入少量高质量数据作为冷启动,能否进一步提高推理性能或加快收敛速度?2)如何训练一个既能够生成清晰、连贯的思维链(CoT),又具备强大通用能力的用户友好型模型?为了解决这些问题,我们设计了一个训练 DeepSeek-R1 的流程,该流程包含四个阶段,具体如下。

2.3.1 冷启动

与 DeepSeek-R1-Zero 不同,为避免从基础模型进行强化学习训练时早期冷启动阶段的不稳定性,对于 DeepSeek-R1,我们构建并收集了少量长思维链数据,对模型进行微调,以此作为初始的强化学习执行者。为收集此类数据,我们探索了多种方法:使用带有长思维链示例的少样本提示;直接促使模型生成带有反思和验证的详细答案;收集格式易读的 DeepSeek-R1-Zero 输出;以及通过人工标注进行后处理来优化结果。
在本研究中,我们收集了数千条冷启动数据,对 DeepSeek-V3-Base 进行微调,作为强化学习的起点。与 DeepSeek-R1-Zero 相比,冷启动数据具有以下优势:

  • 可读性:DeepSeek-R1-Zero 的一个关键局限在于其内容往往不便于阅读。生成的回答可能会混合多种语言,或者缺少用于突出答案的 Markdown 格式,不便于用户查看。相比之下,在为 DeepSeek-R1 创建冷启动数据时,我们设计了一种易读的模式,在每个回答的末尾添加总结,并过滤掉对读者不友好的回答。这里,我们将输出格式定义为 | 特殊标记 |<推理过程>| 特殊标记 |< 总结 >,其中推理过程是针对查询的思维链,总结用于概括推理结果。
  • 潜力:通过结合人类先验知识精心设计冷启动数据的模式,我们发现其性能优于 DeepSeek-R1-Zero。我们认为迭代训练对于推理模型而言是一种更好的方式。

2.3.2 面向推理的强化学习

在利用冷启动数据对 DeepSeek-V3-Base 进行微调后,我们采用与 DeepSeek-R1-Zero 相同的大规模强化学习训练过程。这个阶段专注于提升模型的推理能力,特别是在编码、数学、科学和逻辑推理等推理密集型任务中,这些任务通常具有明确的问题和清晰的解决方案。在训练过程中,我们发现思维链经常出现语言混合的情况,尤其是当强化学习提示涉及多种语言时。为缓解语言混合问题,我们在强化学习训练过程中引入了语言一致性奖励,该奖励通过计算思维链中目标语言词汇的比例来衡量。尽管消融实验表明,这种调整会导致模型性能略有下降,但该奖励符合人类偏好,使生成的内容更具可读性。最后,我们将推理任务的准确率与语言一致性奖励直接相加,形成最终的奖励。然后,对微调后的模型进行强化学习训练,直至其在推理任务上达到收敛。

2.3.3 拒绝采样与监督微调

当面向推理的强化学习收敛后,我们利用得到的检查点为下一轮收集监督微调(SFT)数据。与最初主要聚焦于推理的冷启动数据不同,这个阶段整合了来自其他领域的数据,以增强模型在写作、角色扮演和其他通用任务方面的能力。具体而言,我们按照以下方式生成数据并微调模型:

  • 推理数据:我们整理推理提示,并通过对上述强化学习训练得到的检查点进行拒绝采样,生成推理轨迹。在之前的阶段,我们仅纳入了可以使用基于规则的奖励进行评估的数据。然而在这个阶段,我们通过纳入更多数据来扩展数据集,其中部分数据使用生成式奖励模型,将真实答案和模型预测输入 DeepSeek-V3 进行判断。此外,由于模型输出有时较为混乱且难以阅读,我们过滤掉了包含混合语言的思维链、冗长的段落和代码块。对于每个提示,我们采样多个回答,仅保留正确的回答。总体而言,我们收集了约 60 万个与推理相关的训练样本。
  • 非推理数据:对于写作、事实性问答、自我认知和翻译等非推理数据,我们采用 DeepSeek-V3 的流程,并复用了 DeepSeek-V3 的部分监督微调数据集。对于某些非推理任务,在回答问题之前,我们通过提示促使 DeepSeek-V3 生成潜在的思维链。然而,对于诸如 “你好” 这类简单查询,我们则不提供思维链作为回应。最终,我们总共收集了约 20 万个与推理无关的训练样本。
    我们使用上述整理的约 80 万个样本的数据集,对 DeepSeek-V3-Base 进行了两个轮次的微调。

2.3.4 全场景强化学习

为了进一步使模型符合人类偏好,我们实施了第二个强化学习阶段,旨在提升模型的实用性和无害性,同时优化其推理能力。具体而言,我们结合奖励信号和多样化的提示分布来训练模型。对于推理数据,我们遵循 DeepSeek-R1-Zero 中概述的方法,利用基于规则的奖励来指导数学、代码和逻辑推理领域的学习过程。对于通用数据,我们借助奖励模型来捕捉复杂和微妙场景中的人类偏好。我们基于 DeepSeek-V3 的流程,采用类似的偏好对和训练提示分布。在评估实用性时,我们仅关注最终的总结,确保评估重点在于回答对用户的实用性和相关性,同时尽量减少对底层推理过程的干扰。在评估无害性时,我们评估模型的整个回答,包括推理过程和总结,以识别并减轻生成过程中可能出现的任何潜在风险、偏差或有害内容。最终,奖励信号和多样化数据分布的整合使我们能够训练出一个在推理方面表现出色,同时注重实用性和无害性的模型。

通俗解释

DeepSeek-R1-Zero 表现不错,但是大家还想让模型更好,就有了两个新问题:用点高质量数据做冷启动,能不能让模型推理能力更强、训练更快?能不能训练出既会清晰推理,又有很多通用能力,对用户很友好的模型?所以就设计了 DeepSeek-R1 的训练流程,有四个阶段。
第一个阶段是冷启动。DeepSeek-R1-Zero 从基础模型直接训练,前期不太稳定。DeepSeek-R1 就先收集一些长思维链数据,微调模型。收集数据的方法有好几种,像用带长思维链的例子提示模型、让模型自己生成详细答案再优化等。冷启动数据有两个好处,一是更可读,以前模型回答的内容不好懂,现在设计了新格式,回答完还有总结;二是性能更好,结合了人的经验设计的数据,训练效果更好。
第二个阶段是面向推理的强化学习。用冷启动数据微调完模型后,就用和训练 DeepSeek-R1-Zero 一样的强化学习方法训练。这个阶段主要提升模型在一些推理任务上的能力。训练时发现思维链会混语言,就加了个语言一致性奖励,虽然对性能有点影响,但是生成的内容更符合人的习惯,更好懂。把准确率和这个奖励加起来作为最终奖励,一直训练到模型在推理任务上表现稳定。
第三个阶段是拒绝采样与监督微调。前面强化学习训练稳定后,就用得到的模型收集新数据来微调。这次的数据不只是推理的,还有写作、问答这些其他领域的数据。推理数据通过拒绝采样得到,还扩展了数据集,去掉不好的内容;非推理数据用 DeepSeek-V3 的流程收集,简单问题就不用思维链回答。最后用这些收集到的 80 万个样本的数据,微调模型两轮。
最后一个阶段是全场景强化学习。为了让模型更符合人的喜好,又进行了一次强化学习训练。对推理数据和以前一样用基于规则的奖励训练;对通用数据,用奖励模型来符合人的偏好。评估的时候,实用性只看总结有没有用、相不相关,无害性则检查整个回答有没有问题。这样训练出来的模型,推理厉害,还好用、安全。

2.4 知识蒸馏:赋予小模型推理能力

为了使更高效的小模型也具备像 DeepSeek-R1 那样的推理能力,我们使用为 DeepSeek-R1 整理的 80 万个样本,直接对 Qwen(Qwen, 2024b)和 Llama(AI@Meta, 2024)等开源模型进行微调,具体细节见 2.3.3 节。我们的研究结果表明,这种简单的知识蒸馏方法能够显著提升小模型的推理能力。这里使用的基础模型包括 Qwen2.5-Math-1.5B、Qwen2.5-Math-7B、Qwen2.5-14B、Qwen2.5-32B、Llama-3.1-8B 和 Llama-3.3-70B-Instruct。我们选择 Llama-3.3,是因为其推理能力略优于 Llama-3.1。
对于蒸馏后的模型,我们仅进行监督微调,不包含强化学习阶段,尽管加入强化学习可以大幅提升模型性能。我们在此的主要目的是展示知识蒸馏技术的有效性,将强化学习阶段的探索留给更广泛的研究社区。

通俗解释

团队想让小模型也能像 DeepSeek-R1 一样会推理,就用 DeepSeek-R1 整理的 80 万个样本去微调 Qwen、Llama 这些开源模型。结果发现,这样简单的操作就能让小模型推理能力变强。用的基础模型有不同参数规模的,像 15 亿、70 亿参数的等,选 Llama-3.3 是因为它推理能力相对好一点。
蒸馏后的小模型只做了监督微调,没做强化学习,虽然做强化学习能让模型性能更好,但团队这次主要是想看看蒸馏方法好不好用,强化学习就留给其他研究人员去探索了。

3. 实验

3.1 DeepSeek-R1 评估

基准测试(指标)Claude-3.5-Sonnet-1022GPT-4o-0513DeepSeek V3OpenAI o1-miniOpenAI o1-1217DeepSeek R1
架构混合专家(MoE)混合专家(MoE)
激活参数数量370 亿370 亿
参数总数6710 亿6710 亿
英语MMLU(单次准确率)88.387.288.585.291.890.8
MMLU-Redux(精确匹配率)88.988.089.186.792.9
MMLU-Pro(精确匹配率)78.072.675.980.384.0
DROP(3 次提示 F1 值)88.383.791.683.990.292.2
IF-Eval(严格提示)86.584.386.184.883.3
GPQA Diamond(单次准确率)65.049.959.160.075.771.5
SimpleQA(正确率)28.438.224.97.047.030.1
FRAMES(准确率)72.580.573.376.982.5
AlpacaEval2.0(长度控制胜率)52.051.170.057.887.6
ArenaHard(GPT-4-1106 评判)85.280.485.592.092.3
代码LiveCodeBench(思维链单次准确率)38.932.936.253.863.465.9
Codeforces(百分比排名)20.323.658.793.496.696.3
Codeforces(评级)7177591134182020612029
SWE Verified(问题解决率)50.838.842.041.648.949.2
Aider-Polyglot(准确率)45.316.049.632.961.753.3
数学AIME 2024(单次准确率)16.09.339.263.679.279.8
MATH-500(单次准确率)78.374.690.290.096.497.3
CNMO 2024(单次准确率)13.110.843.267.678.8
中文CLUEWSC(精确匹配率)85.487.990.989.992.8
C-Eval(精确匹配率)76.776.086.568.991.8
C-SimpleQA(正确率)55.458.768.040.363.7

表 4 DeepSeek-R1 与其他代表性模型的比较
在 MMLU、MMLU-Pro 和 GPQA Diamond 等面向教育的知识基准测试中,DeepSeek-R1 相较于 DeepSeek-V3 展现出更优的性能。这种提升主要归因于在 STEM 相关问题上准确率的提高,这得益于大规模强化学习。此外,DeepSeek-R1 在 FRAMES(一个依赖长上下文的问答任务)上表现出色,展示了其强大的文档分析能力。这凸显了推理模型在人工智能驱动的搜索和数据分析任务中的潜力。在事实性基准测试 SimpleQA 上,DeepSeek-R1 的表现优于 DeepSeek-V3,证明了它处理基于事实的查询的能力。在该基准测试中,OpenAI-o1 优于 GPT-4o,DeepSeek-R1 也呈现出类似的超越趋势。不过,DeepSeek-R1 在中文 SimpleQA 基准测试上的表现比 DeepSeek-V3 差,这主要是因为在经过安全性强化学习后,它倾向于拒绝回答某些查询。如果不进行安全性强化学习,DeepSeek-R1 在该测试上的准确率能超过 70%。
DeepSeek-R1 在 IF-Eval(一个用于评估模型遵循格式指令能力的基准测试)上也取得了令人瞩目的成绩。这些改进可归因于在监督微调(SFT)和强化学习训练的最后阶段纳入了指令遵循数据。此外,在 AlpacaEval2.0 和 ArenaHard 上,DeepSeek-R1 表现卓越,这表明它在写作任务和开放域问答方面具有优势。它大幅超越 DeepSeek-V3 的表现,突出了大规模强化学习的泛化优势,不仅提升了推理能力,还改善了模型在不同领域的性能。而且,DeepSeek-R1 生成的总结长度简洁,在 ArenaHard 上平均为 689 个词元,在 AlpacaEval 2.0 上平均为 2218 个字符。这表明 DeepSeek-R1 在基于 GPT 的评估中避免了引入长度偏差,进一步巩固了其在多个任务上的稳健性。
在数学任务上,DeepSeek-R1 的表现与 OpenAI-o1-1217 相当,大幅超越其他模型。在编码算法任务(如 LiveCodeBench 和 Codeforces)中也呈现出类似趋势,以推理为核心的模型在这些基准测试中占据主导地位。在面向工程的编码任务上,OpenAI-o1-1217 在 Aider 测试中表现优于 DeepSeek-R1,但在 SWE Verified 测试中二者性能相当。我们认为,随着相关强化学习训练数据量的增加,DeepSeek-R1 的工程性能将在后续版本中得到提升。

通俗解释

研究人员对 DeepSeek-R1 进行了各种测试,和好多厉害的模型对比。从表格里能看到,在知识类测试里,像 MMLU 这些,DeepSeek-R1 比 DeepSeek-V3 考得好,特别是在 STEM 相关的问题上,因为大规模强化学习让它更会做这类题。在处理长文章问答的 FRAMES 测试里,它也表现不错,说明分析文档能力强。在 SimpleQA 这个测试里,它比 DeepSeek-V3 厉害,能更好地回答事实类问题,和 OpenAI-o1 比 GPT-4o 表现好是一个道理。不过在中文 SimpleQA 测试里,它比 DeepSeek-V3 差,是因为做了安全性强化学习后,有些问题它不愿意回答,如果没这个限制,准确率能更高。
在测试模型按格式回答问题能力的 IF-Eval 测试里,DeepSeek-R1 成绩很好,这是因为训练后期加了相关的数据。在写作和开放域问答的测试(AlpacaEval2.0 和 ArenaHard)里,它表现也很棒,比 DeepSeek-V3 强很多,说明大规模强化学习让它在好多领域都更厉害。而且它生成的总结不长,在评估的时候不会因为长度问题影响结果,很稳定。
在数学任务和编码算法任务测试里,DeepSeek-R1 和 OpenAI-o1-1217 水平差不多,比其他模型好很多。在工程编码任务上,OpenAI-o1-1217 在 Aider 测试里比它好一点,但在 SWE Verified 测试里二者差不多。以后随着训练数据变多,DeepSeek-R1 在工程方面的能力还能提升。

3.2 蒸馏模型评估

模型AIME 2024MATH-500 单次准确率GPQA Diamond 单次准确率LiveCodeBench 单次准确率CodeForces 评级
单次准确率64 次采样多数投票准确率
GPT-4o-05139.313.474.649.932.9759
Claude-3.5-Sonnet-102216.026.778.365.038.9717
OpenAI-o1-mini63.680.090.060.053.81820
QwQ-32B-Preview50.060.090.654.541.91316
DeepSeek-R1-Distill-Qwen-1.5B28.952.783.933.816.9954
DeepSeek-R1-Distill-Qwen-7B55.583.392.849.137.61189
DeepSeek-R1-Distill-Qwen-14B69.780.093.959.153.11481
DeepSeek-R1-Distill-Qwen-32B72.683.394.362.157.21691
DeepSeek-R1-Distill-Llama-8B50.480.089.149.039.61205
DeepSeek-R1-Distill-Llama-70B70.086.794.565.257.51633

表 5 DeepSeek-R1 蒸馏模型与其他可比模型在推理相关基准测试中的比较
如表 5 所示,仅仅通过蒸馏 DeepSeek-R1 的输出,高效的 DeepSeek-R1-7B(即 DeepSeek-R1-Distill-Qwen-7B,以下简称类似)就能在所有方面超越像 GPT-4o-0513 这样的非推理模型。DeepSeek-R1-14B 在所有评估指标上都超过了 QwQ-32B-Preview,而 DeepSeek-R1-32B 和 DeepSeek-R1-70B 在大多数基准测试中显著超越 o1-mini。这些结果展示了知识蒸馏的强大潜力。此外,我们发现对这些蒸馏模型应用强化学习会带来进一步的显著提升。我们认为这值得进一步探索,因此在此仅展示简单监督微调蒸馏模型的结果。

通俗解释

研究人员还测试了从 DeepSeek-R1 蒸馏出来的小模型。从表格数据能看出,这些小模型表现很不错。就拿 DeepSeek-R1-Distill-Qwen-7B 来说,它在各个测试里都比 GPT-4o-0513 考得好。DeepSeek-R1-14B 比 QwQ-32B-Preview 厉害,DeepSeek-R1-32B 和 DeepSeek-R1-70B 在大部分测试里比 o1-mini 还好。这说明把大模型的能力蒸馏到小模型里这个方法很有用。而且如果再给这些蒸馏后的小模型做强化学习,它们还能变得更厉害,不过这次研究人员没展示这部分结果,以后可以继续研究。

4. 讨论

4.1 知识蒸馏与强化学习

在 3.2 节中可以看到,通过对 DeepSeek-R1 进行知识蒸馏,小模型能取得令人瞩目的成绩。然而,仍有一个问题:模型不经过知识蒸馏,通过本文中讨论的大规模强化学习训练,能否达到类似的性能?
为回答这个问题,我们使用数学、代码和 STEM 数据,对 Qwen-32B-Base 进行了超过 10,000 步的大规模强化学习训练,得到了 DeepSeek-R1-Zero-Qwen-32B。实验结果如表 6 所示,经过大规模强化学习训练的 320 亿参数基础模型,其性能与 QwQ-32B-Preview 相当。然而,从 DeepSeek-R1 蒸馏得到的 DeepSeek-R1-Distill-Qwen-32B,在所有基准测试中的表现都显著优于 DeepSeek-R1-Zero-Qwen-32B。
因此,我们可以得出两个结论:第一,将更强的模型知识蒸馏到较小模型中能产生优异的效果,而较小模型依靠本文提到的大规模强化学习则需要巨大的计算资源,甚至可能无法达到知识蒸馏的性能。第二,虽然知识蒸馏策略既经济又有效,但要突破智能的边界,可能仍需要更强大的基础模型和大规模强化学习。

模型AIME 2024MATH-500 单次准确率GPQA Diamond 单次准确率LiveCodeBench 单次准确率
单次准确率64 次采样多数投票准确率
QwQ-32B-Preview50.060.090.654.541.9
DeepSeek-R1-Zero-Qwen-32B47.060.091.655.040.2
DeepSeek-R1-Distill-Qwen-32B72.683.394.362.157.2

表 6 知识蒸馏模型与强化学习模型在推理相关基准测试中的比较

通俗解释

前面看到知识蒸馏让小模型成绩很好,大家就想知道,小模型不蒸馏,直接用大规模强化学习训练,能不能有同样好的表现呢?于是研究人员就用 Qwen-32B-Base 这个模型,用数学、代码等数据进行大规模强化学习训练,训练了 10000 多步,得到了 DeepSeek-R1-Zero-Qwen-32B 这个模型。
对比发现,这个经过强化学习训练的模型,和 QwQ-32B-Preview 表现差不多。但是从 DeepSeek-R1 蒸馏出来的 DeepSeek-R1-Distill-Qwen-32B,在各项测试里都比 DeepSeek-R1-Zero-Qwen-32B 好很多。
这就说明,把大模型的知识 “传” 给小模型的知识蒸馏方法效果很好,小模型要是想用大规模强化学习达到同样效果,不仅特别费计算资源,可能还做不到。虽然知识蒸馏又省钱又好用,但想要让模型更聪明,可能还是得靠更厉害的大模型和大规模强化学习。

4.2 失败尝试

在开发 DeepSeek-R1 的早期阶段,我们也经历了失败和挫折。在此分享这些失败经验以供参考,但这并不意味着这些方法无法用于开发有效的推理模型。

  • 过程奖励模型(PRM):过程奖励模型是一种引导模型寻找更好推理任务解决方法的合理途径(Lightman 等人,2023;Uesato 等人,2022;Wang 等人,2023)。然而在实际应用中,PRM 存在三个主要局限性,可能会阻碍其最终成功。第一,在一般推理中,明确定义精细的推理步骤具有挑战性。第二,判断当前中间步骤是否正确是一项艰巨的任务。使用模型进行自动标注可能无法得到令人满意的结果,而人工标注不利于大规模应用。第三,一旦引入基于模型的 PRM,不可避免地会导致奖励作弊(Gao 等人,2022),重新训练奖励模型需要额外的训练资源,并且会使整个训练流程变得复杂。总之,虽然 PRM 在对模型生成的前 N 个响应进行重新排序或辅助引导搜索方面(Snell 等人,2024)表现出良好的能力,但在我们的实验中,与大规模强化学习过程中引入的额外计算开销相比,其优势有限。
  • 蒙特卡洛树搜索(MCTS):受 AlphaGo(Silver 等人,2017b)和 AlphaZero(Silver 等人,2017a)的启发,我们探索使用蒙特卡洛树搜索(MCTS)来提高测试时计算的可扩展性。这种方法将答案分解为较小的部分,使模型能够系统地探索解决方案空间。为实现这一点,我们促使模型生成多个与搜索所需的特定推理步骤相对应的标签。在训练过程中,我们首先使用收集到的提示,通过由预训练价值模型引导的 MCTS 来寻找答案。随后,我们使用得到的问答对来训练策略模型和价值模型,迭代优化这个过程。

然而,在扩大训练规模时,这种方法遇到了几个挑战。第一,与国际象棋不同,在国际象棋中搜索空间相对明确,而令牌生成的搜索空间呈指数级增大。为解决这个问题,我们为每个节点设置了最大扩展限制,但这可能导致模型陷入局部最优解。第二,价值模型直接影响生成的质量,因为它引导搜索过程的每一步。训练一个精细的价值模型本身就很困难,这使得模型难以通过迭代得到改进。虽然 AlphaGo 的核心成功在于训练价值模型以逐步提升性能,但由于令牌生成的复杂性,在我们的设置中难以复制这一原理。
总之,虽然 MCTS 与预训练价值模型结合可以在推理时提高性能,但通过自我搜索迭代提升模型性能仍然是一个巨大的挑战。

通俗解释

在研究 DeepSeek-R1 的时候,团队也试过一些方法但没成功。
有一种叫过程奖励模型(PRM)的方法,本来想着用它能引导模型更好地推理。但实际用的时候发现有问题:一是在推理过程中,很难把每一步都规定得很清楚;二是判断中间步骤对不对很难,用模型自动标注不准,人工标注又没办法大规模做;三是用了这个模型容易出现奖励作弊的情况,重新训练奖励模型又费资源又让训练过程变复杂。虽然它在给模型的回答排序、引导搜索这些方面有点用,但总体来说,在大规模强化学习里,它带来的麻烦比好处多。
还有蒙特卡洛树搜索(MCTS)方法,是从 AlphaGo 这些成功的例子里得到的启发,想用它让模型在测试的时候计算能力更强。这个方法就是把答案拆成小部分,让模型慢慢找解决方案,训练的时候用预训练的价值模型帮忙找答案,再用这些答案训练模型。
但是扩大训练规模的时候就不行了。一方面,和国际象棋比起来,模型生成内容的搜索范围大太多了,限制搜索节点又容易让模型卡在局部最优解里;另一方面,价值模型对生成结果影响很大,但是很难训练好,所以模型很难通过不断训练变得更好。虽然 MCTS 和预训练价值模型一起用,在推理的时候有点用,但想靠它让模型一直进步太难了。

5. 结论、局限性与未来工作

在本研究中,我们分享了通过强化学习提升模型推理能力的历程。DeepSeek-R1-Zero 代表了一种不依赖冷启动数据的纯强化学习方法,在各种任务中都取得了优异的性能。DeepSeek-R1 则更强大,它利用冷启动数据和迭代强化学习微调。最终,DeepSeek-R1 在一系列任务上的表现与 OpenAI-o1-1217 相当。
我们进一步探索了将推理能力蒸馏到小型稠密模型中。以 DeepSeek-R1 为教师模型生成 80 万个训练样本,对几个小型稠密模型进行微调。结果很有前景:DeepSeek-R1-Distill-Qwen-1.5B 在数学基准测试中表现超过 GPT-4o 和 Claude-3.5-Sonnet,在 AIME 测试中得分为 28.9%,在 MATH 测试中得分为 83.9%。其他稠密模型也取得了令人瞩目的成绩,显著超越了基于相同基础检查点的其他指令微调模型。
未来,我们计划在以下几个方向对 DeepSeek-R1 进行研究:

  • 通用能力:目前,DeepSeek-R1 在函数调用、多轮对话、复杂角色扮演和 JSON 输出等任务上的能力不如 DeepSeek-V3。未来,我们计划探索如何利用长思维链来提升这些领域的任务表现。
  • 语言混合:DeepSeek-R1 目前针对中文和英文进行了优化,在处理其他语言的查询时可能会出现语言混合问题。例如,即使查询使用的是非中文或英文的其他语言,DeepSeek-R1 也可能会用英文进行推理和回答。我们旨在在未来的更新中解决这一局限性。
  • 提示工程:在评估 DeepSeek-R1 时,我们发现它对提示很敏感。少样本提示始终会降低其性能。因此,我们建议用户直接描述问题,并使用零样本设置指定输出格式,以获得最佳结果。
  • 软件工程任务:由于评估时间长,影响了强化学习过程的效率,大规模强化学习在软件工程任务中尚未得到广泛应用。因此,DeepSeek-R1 在软件工程基准测试上相比 DeepSeek-V3 并没有显著改进。未来版本将通过对软件工程数据实施拒绝采样,或在强化学习过程中纳入异步评估来提高效率,从而解决这一问题。

通俗解释

这篇研究主要是讲怎么用强化学习让模型更会推理。DeepSeek-R1-Zero 是直接用强化学习训练的,不用冷启动数据,在很多任务里表现都不错。DeepSeek-R1 更厉害,用了冷启动数据,还反复用强化学习微调,最后和 OpenAI 很厉害的 o1-1217 模型表现差不多。
团队还把 DeepSeek-R1 的推理能力教给了小模型,用它生成的 80 万个样本去训练小模型,结果小模型成绩很好,比一些以前的模型考得都好。
不过,DeepSeek-R1 也有不足的地方,以后团队打算从这几个方面继续研究改进。在通用能力方面,它在函数调用这些任务上不如 DeepSeek-V3,以后看看能不能用长思维链让它在这些任务里表现更好。在语言方面,它对中文和英文优化得比较好,处理其他语言容易混,之后要解决这个问题。在提示方面,它对提示很敏感,少样本提示会让它发挥不好,所以建议用户直接描述问题、用零样本设置。在软件工程任务方面,因为评估时间长,大规模强化学习用得少,它在这方面进步不大,以后会用拒绝采样、异步评估这些方法来提高效率。


作者 east
深度学习 1月 30,2023

如何使用 ChatGPT 写文章

介绍

出于很多原因,写博客是有益的。 今天在本文中,我将向您展示如何使用来自 openAI 的新的高级 AI ChatGPt 撰写博客文章。 它是免费使用的,使用 ChatGPT 撰写文章所需的时间明显减少。 所以让我们深入探讨一下。

我们将逐步解决这个问题。 所以让我们开始吧

第 1 步:在 OpenAI 中创建一个帐户以访问该服务

创建一个帐户以访问 chatgpt。 它简单易行。 你可以注册使用谷歌。

第 2 步:访问 ChatGPT

转到左下角的 chatGPT 部分或标题中的 TRY 部分。 如果你成功了,你会看到这样的界面

第 3 步:搜索需求旺盛且竞争激烈的细分领域

如果您已经确定了要写的主题,那很好。 否则,您可以借助 vidIQ 等关键字搜索工具

在这里你可以找到高搜索量和低竞争的关键字,就像我找到的那样。 这个工具非常有用。

第4步:在chatgpt中搜索以提供有关关键字的博客标题

在那里。 chatgpt 已回复了 5 个关于您提供的关键字的博客标题。 选择其中一个来写一篇文章。

第 5 步:在 chatgpt 中搜索大纲

在搜索框中搜索“provide the outline for this title : Title”。

你可以看到回复。 它将恢复为 5-6 个轮廓。

第 6 步:搜索博客部分

搜索“提供此大纲的博客部分:大纲”

如您所见,它已通过博客部分作出回应。

现在将所有这些复制并粘贴到一个 .doc 文件中

对每个轮廓逐一重复第 5 步和第 6 步,然后按顺序粘贴到同一个 .doc 文件中。 一旦你复制并粘贴了所有的大纲和博客部分,你就可以进入下一步了

第七步:重写文章

转到 duplichecker 文章重写器

复制 ae 到目前为止复制和粘贴的 .doc 文件中的所有内容。 粘贴在中间的框中。 解决验证码并单击重写文章。

在右侧部分,您将获得一篇新改写的文章。 按下一步并通过单击复制按钮复制所有内容

粘贴回 .doc 文件以代替上一篇文章。

这是您新改写的文章。 这篇文章可能有一些拼写错误和字体问题。 修改它,我们很高兴。

第 8 步:GPT-2 输出检测器演示

您可以遵循的另一个步骤是您可以在此工具中检查是否存在抄袭。 您的文章有多少是真实的并且是从某处复制的。

第 9 步:发布

如果您已正确执行所有步骤,那么您可以继续在任何平台上发布您的文章。

作者 east
深度学习 1月 30,2023

ChatGPT 如何运行原理?AIGC 的演变过程

AIGC,即AI-generated Content,是一种利用人工智能进行内容创作的方式,被认为是继PGC(Professionally-generated Content)和UGC(User-generated Content)之后的一种新型内容创作方式。 AIGC在文字、图片、音视频、软件开发等多个领域发展迅速,近几年也有很多专注于AIGC的创作体验平台,用户输入一句话,让AI合成一张与之相关的图片 描述,或者更常见的是,输入一篇文章的描述,或者只是一个故事的开头,然后让 AI 为您完成文章。 它在任何需要写作或内容创建的地方都有广泛的应用,例如编写财务报告、开发代码或创建销售/营销材料。 它可以帮助人们更快地理解和分析复杂的信息,从而帮助他们做出更好的决策并产生巨大的价值。 由于技术的进步,这些提高生产力的愿景正在成为现实。

RNN Seq2Seq

长期以来,AIGC 一直以基于 RNN 的 Seq2Seq 模型为主,该模型由两个 RNN 网络组成,第一个 RNN 是编码器,第二个 RNN 是解码器。 RNN Seq2Seq 生成的文本质量通常较差,常伴有语法错误或语义不明,主要是错误传递和放大造成的。

RNN Seq2Seq

2017 年,Transformer 模型结构被引入,并因其能够捕获复杂的特征表示以及与 RNN 模型相比提高了训练效率而迅速受到欢迎。 由此开发出一系列预训练模型,成为AIGC的领先技术。 下一节将概述这些模型。 Transformer 模型特别有用,因为它可以并行处理序列,导致文本编写算法研究的重点转向 Transformer 模型。

                Transformer 模型体系

UniLM

UniLM,Unified Language Model的简称,是微软研究院于2019年开发的生成式BERT模型。与传统的Seq2Seq模型不同,它只利用了BERT,没有Decoder组件。 它结合了其他几种模型的训练方法,例如 L2R-LM (ELMo, GPT)、R2L-LM (ELMo)、BI-LM (BERT) 和 Seq2Seq-LM,因此称为“Unified”模型。

UniLM 模型架构(来源)

UniLM的预训练分为三个部分:Left-to-Right、Bidirectional和Seq-to-Seq。

这三种方式的区别仅在于Transformer的mask矩阵的变化:

对于Seq-to-Seq,前一句的Attention被masked用于后一句,使得前一句只能关注自己而不能关注后一句; following sentence中的每个单词对其后续单词的Attention被masked,只能关注其之前的单词;

对于Left-to-Right,Transformer的Attention只关注词本身和它前面的词,不关注它后面的词,所以mask矩阵是一个下三角矩阵;

对于 Bidirectional,Transformer 的 Attention 关注所有的词,包括 NSP 任务,就像原始的 BERT 一样。

在 UniLM 预训练过程中,这三种方法中的每一种都训练了 1/3 的时间。 与原始BERT相比,增加的单向LM预训练增强了文本表示能力,增加的Seq-to-Seq LM预训练也使得UniLM在文本生成/编写任务中表现良好。

UniLM的预训练分为三个部分:Left-to-Right、Bidirectional和Seq-to-Seq。

这三种方式的区别仅在于Transformer的mask矩阵的变化:

对于Seq-to-Seq,前一句的Attention被masked用于后一句,使得前一句只能关注自己而不能关注后一句; following sentence中的每个单词对其后续单词的Attention被masked,只能关注其之前的单词;

对于Left-to-Right,Transformer的Attention只关注词本身和它前面的词,不关注它后面的词,所以mask矩阵是一个下三角矩阵;

对于 Bidirectional,Transformer 的 Attention 关注所有的词,包括 NSP 任务,就像原始的 BERT 一样。

在 UniLM 预训练过程中,这三种方法中的每一种都训练了 1/3 的时间。 与原始BERT相比,增加的单向LM预训练增强了文本表示能力,增加的Seq-to-Seq LM预训练也使得UniLM在文本生成/编写任务中表现良好。

T5

T5,全称Text-to-Text Transfer Transformer,是谷歌在2020年提出的一种模型结构,其总体思路是使用Seq2Seq文本生成来解决所有下游任务:例如问答、摘要、分类、翻译、匹配、 continuation、denotational disambiguation 等。这种方法使所有任务能够共享相同的模型、相同的损失函数和相同的超参数。

T5的模型结构是基于多层Transformer的Encoder-Decoder结构。 T5 与其他模型的主要区别在于,GPT 家族是仅包含 Decoder 结构的自回归语言模型(AutoRegressive LM),而 BERT 是仅包含 Encoder 的自编码语言模型(AutoEncoder LM)。

文本到文本框架图。 每个任务都使用文本作为模型的输入,模型经过训练可以生成一些目标文本。 这些任务包括翻译(绿色)、语言可接受性(红色)、句子相似性(黄色)和文档摘要(蓝色)(来源)。

T5的预训练分为无监督和监督两部分。

无监督训练

无监督部分是类似于BERT的MLM方法,只是BERT是masking单个单词,而T5是masking一段连续的单词,即text span。 被屏蔽的文本范围仅由单个屏蔽字符替换,即屏蔽后文本的屏蔽序列长度也是未知的。 Decoder部分只输出mask的text span,其他词统一替换为集合<X>、<Y>、<Z>符号。 这样做有三个好处,一是增加了预训练的难度,显然预测未知长度的连续文本跨度是比预测单个词更难的任务,这也使得训练好的语言模型的文本表示能力更强 通用且更适应于对质量差的数据进行微调; 二是生成任务输出序列长度未知,T5的预训练很好 T5中使用的这种预训练任务也称为CTR(Corrupted Text Reconstruction)。

监督培训

监督部分使用了GLUE和SuperGLUE中包含的四大类任务:机器翻译、问答、总结和分类。 Fine-tune 的核心是将这些数据集和任务组合在一起作为一个任务,为了实现这一点,人们想到了为每个任务设计不同的前缀,与任务文本一起输入。 例如,对于翻译任务,翻译“That is good”。 从英语到德语,然后“将英语翻译成德语:很好。 目标:Das ist gut。 进入培训,“将英语翻译成德语:很好。 target:”,模型输出预测为“Das ist gut.”。 其中“将英语翻译成德语:”是为此翻译任务添加的前缀。

Supervised training

BART 代表双向和自回归变压器。 它是Facebook在2020年提出的一种模型结构,顾名思义,它是一种结合了双向编码结构和自回归解码结构的模型结构。 BART模型结构吸收了BERT中Bidirectional Encoder和GPT中Left-to-Right Decoder的特点,建立在标准的Seq2Seq Transformer模型之上,比BERT更适合文本生成场景。 同时,相对于GPT,它还拥有更多的双向上下文上下文信息。

                            BART模型体系

BART的预训练任务采用了还原文本中[噪声]的基本思想。 BART 使用以下特定 [噪音]:

Token Masking:和BERT一样,随机选择一个token替换为[MASK];

Token Deletion:随机删除一个token,模型必须确定丢失了哪个输入;

Text Infilling:与 T5 方法类似,屏蔽一个文本范围,每个文本范围都被一个 [MASK] 标签替换。

Sentence Permutation:将输入分成多个句子,以句点为分隔符,随机打乱;

Document Rotation:随机均匀地选择一个token,并以所选token作为新的开始围绕它旋转输入,该任务训练模型识别文档的开头。

可以看出,相比于BERT或者T5,BART在Encoder端尝试各种[noise],原因和目的也很简单:

BERT 中使用的简单替换导致 Encoder 输入携带了一些关于序列结构的信息(例如序列的长度),这些信息在文本生成任务中通常不会提供给模型。

BART 使用一组更多样化的 [噪声],目的是破坏有关序列结构的信息并防止模型“依赖”它。 对于各种输入[噪声],BART在Decoder端采用统一的重构形式,即输出正确的原句。 BART 使用的预训练任务也称为 FTR(全文重建)。

通用技术

GPT代表生成预训练。 它是一种迭代预训练模型,其主要成员家族包括第一代GPT、GPT-2、GPT-3、InstructGPT,以及目前流行的ChatGPT。 下面我们一一介绍。

GPT-1

第一代GPT是OpenAI于2018年提出的预训练语言模型,其诞生早于BERT,其核心思想是基于大量未标注数据进行生成式预训练学习,然后fine- 根据特定任务调整它。 由于专注于生成式预训练,GPT模型结构只使用了Transformer的Decoder部分,其标准结构包括Masked Multi-Head Attention和Encoder-Decoder Attention。 GPT的预训练任务是SLM(Standard Language Model),根据之前的上下文(window)来预测词的当前位置,所以需要保留Mask Multi-Head Attention来屏蔽后面的context 防止信息泄露的词。 因为没有使用Encoder,所以从GPT结构中去掉了Encoder-Decoder Attention。

GPT-2

第一代GPT的问题是fine-tuning下游任务缺乏可迁移性,Fine-Tuning层不共享。 为了解决这个问题,OpenAI 在 2019 年引入了 GPT 家族的新成员:GPT-2。

           GPT-2模型体系

GPT-2 的学习目标是使用无监督的预训练模型来完成有监督的任务。 与第一代GPT相比,GPT-2有以下变化:

模型结构去掉了Fine-Tuning层,所有任务都通过为语言模型设计合理的语句进行预训练,训练需要保证每个任务的损失函数收敛;

Layer Normalization的位置移到了每个sub-block的input,在最后一个Self-Attention之后也增加了一个Layer Normalization;

使用改进的初始化方法,其中残差层的权重在初始化时缩放为1/√N倍,其中N是残差层的数量;

Vocabulary scale 扩展到 50257,输入上下文的大小从 512 扩展到 1024,并使用更大的 batch_size 进行训练。 GPT-2的多任务训练使其具有更强的泛化能力,当然这也得益于其使用了高达40G的训练语料。 GPT-2最大的贡献是验证了用海量数据和大量参数训练的模型无需额外训练即可迁移到其他类别任务的能力。

GPT-3

2020年,OpenAI在GPT-2的基础上进一步推出了GPT-3。 GPT-3的做法更简单粗暴,模型整体结构和训练目标与GPT-2相似,但GPT-3将模型规模增加到1750亿个参数(比GPT-2大115倍),使用45TB 的训练数据。 由于参数数量惊人,GPT-3 可以使用零样本和少量样本进行学习和预测,而无需进行梯度更新。

InstructGPT

超大模型GPT-3确实在生成任务方面取得了前所未有的成绩,尤其是在零样本和少样本场景下,但是GPT-3面临了一个新的挑战:模型的输出并不总是有用的,它可能会输出 不真实、有害或反映负面情绪的结果。 这种现象是可以理解的,因为预训练的任务是语言模型,预训练的目标是在输入约束下最大化输出为自然语言的可能性,而不是“用户需要安全和有用”的要求。 为了解决这个问题,OpenAI在2022年发表了基于GPT-3的重要研究:InstructGPT,引入了人类反馈强化学习(RLHF)技术。

                                 Instruct GPT处理流程

InstructGPT在模型本身方面与GPT-3没有太大变化,主要变化在训练策略上。 总体思路是让标注者为调用示例提供演示答案,然后使用这些数据对模型进行微调,使其做出更合适的响应。 其训练步骤分为三步:

收集演示数据并使用监督训练训练模型。 对提示数据集的一部分进行采样以进行手动注释,并将其用于 Fine-Tuning GPT-3。

收集对比数据并训练奖励模型。 对一批数据进行采样并将其输入到在步骤 1 中微调的模型中。注释者根据其优点对模型的输出进行排序,并使用该数据来训练奖励模型。

使用强化学习来优化模型的输出。 利用第2步得到的奖励模型,通过强化学习优化第1步微调后的模型输出,使模型输出更合适的反应。

由此产生的 InstructGPT 在 following instructions 方面比 GPT-3 好很多,而且 InstructGPT 不太可能凭空编造事实,有害输出的产生有小幅下降趋势。

ChatGPT

ChatGPT 是 OpenAI 于 2022 年 11 月 30 日正式发布的最新研究成果,它采用与 InstructGPT 相同的方法,使用从人类反馈中强化学习(RLHF)来训练模型,在数据收集方法上有所改进(未具体披露)。

ChatGPT 实战(来源)

可以看出,ChatGPT的训练过程与InstructGPT的训练过程是一致的,不同的是InstructGPT是在GPT-3上微调,而ChatGPT是在GPT-3.5上微调(GPT-3.5是OpenAI训练的模型 Q4 2021 自动化代码编写能力强)。

纵观从第一代GPT到ChatGPT的发展历程,OpenAI已经证明,使用超大数据训练超大模型,得到的预训练语言模型足以应对自然语言理解和自然语言生成等各种下游任务,甚至 无需微调,仍然可以处理零/少量样本任务。 在输出的安全性和可控性方面,OpenAI 的答案是基于人力强化学习:雇佣了 40 名全职标注员工作了近 2 年(标注时间官方未透露,作者仅从粗略推断) GPT-3和ChatGPT间隔两年半,因为强化学习需要不断迭代)为模型的输出提供标注反馈,只有有了这些数据才能进行强化学习来指导模型的优化。 Transformer+超大数据+超大模型+海量人力+强化学习,造就了今天现象级的ChatGPT。

作者 east
深度学习 1月 28,2023

使用 GPT3 帮助您写一篇读者会记住的博客

写博客时时间紧迫或缺乏灵感? 别担心 – GPT3 游乐场即将让您的生活真正轻松。

我假设您知道 GPT3 是什么,并且您已经拥有可以访问 GPT3 Playground 的 OpenAI 帐户。 您可以在此处访问游乐场。

1.集思广益

对我来说,第三个想法通常是黄金点子。 因为我会在淋浴时有一个绝妙的想法……最终不可避免地会变得太宽泛,我在大约 1/3 的方式中失去了动力。我对这篇文章的第一个想法是如何构建一个应用程序,它使用 GPT3 但这太宽泛了(对很多人来说用处不大)

我的第二个想法是如何构建一个使用 GPT3 的写作应用程序……这会更有用,但我不想泄露我所有的秘密���

所以我决定如何写一个你的读者会记住的博客(在 GPT3 的帮助下)。 这适合所有喜欢 DIY 的人。

此提示将帮助您深入了解想法,以便:

帮助 GPT3 帮你写(更多)

更好地吸引目标读者(你应该有一个!)。

这是提示语。

Create a list of content ideas related to [topic]. Focus on the following keywords:

 [keywords]

 These content ideas are for a person who [insert persona here]

如果你有一个主题(你最初的想法)、关键词和你想与之交谈的特定人,你几乎可以保证得到一个惊人的主题列表,你可以写。

您可能会节省其中的 30%。

好消息 – 在 GPT3 playground 中产生这些想法需要 30 秒,而不是你自己的 30 分钟。

2.生成大纲

一旦我从 GPT3 得到一个粗略的轮廓,我几乎总是会(大量)编辑它。 编辑大纲比完整的帖子更容易。

这是我用来生成平均博客大纲的提示语:

Create a blog outline with the topic of “[title]” for a reader who [reader description].    //IF YOU HAVE KEYWORDS YOU WANT TO FOCUS ON ADD THIS: Use the following keywords if possible: [keywords]

Outline as markdown:

  #

我喜欢 markdown,因为它很容易阅读,而且 GPT3 已经知道什么是 markdown。

想好主题后,将其输入 GPT3 提示框以生成大纲。 这将是您撰写博文的基础,因此请根据需要对其进行审查和编辑。

3. 写草稿

“引导”GPT3 生成对您有价值的东西的最佳方法是欺骗它,让它认为它是根据您的提示提出来的,并且它只是在继续思考。 这就像一个真正梦幻般的天才(或蹒跚学步的孩子),具体取决于您问的是谁,但重要的是不要打破咒语。

这实际上是谷歌和其他公司试图检测内容是否由 AI 创建的方式。 但这是另一天的博客文章。

一旦我有了一个大纲,我几乎总是会跳过生成一个完整的博客并自己充实内容。 但是 – 如果你想得到一个像样的草稿,这里有一个提示:

Create a full and comprehensive blog post on the “[topic]” from the following outline for a reader with the persona who [persona description]. Do not include a table of contents.

Outline:

[outline]

1000 word [contentType] formatted as markdown:

 #

这应该输出一个 500-1000 字的博客。 如果没有,点击重试几次,直到你能让 AI 做你想让它做的事。 GPT3 不擅长数词,也不擅长说真话。 所以你一定要在点击发布之前检查你的博客的准确性(并不是说你会发布人工智能写的东西而不编辑它,对吧?!)

同样,我喜欢 markdown,因为它让我更容易阅读。 如果您不在乎,可以删除该部分。

4、编辑发表

如果您一直在关注,您就会在 GPT3 操场上看到一个博客的草稿。 在将其复制并粘贴到 Google 文档或 Word 之前,请帮自己一个忙,让 GPT3 对您的内容进行编辑传递(为您节省一些时间,听起来不像机器人)。 你可以使用这个示例提示,但你不能在这里出错(随意试验!)

You’re a writer for the NYT writing an amazing blog. What do we need? Let’s think step by step.

    First, we need a first draft.

    First draft:

    [your draft from the step above]

    Then, we can write our final draft and lets format it as Markdown.

    Final Draft:

    #

这应该使您的内容听起来不像机器人。 您还可以尝试一些很酷的事情,例如:

像我是 16 世纪的英国海盗一样重写此博客

写一个很好的论据来反对这个博客。 我真的很喜欢这个,因为人工智能在反对我的观点方面做得很好

以[著名作者]的风格重写此博客

我希望本指南能帮助您成为更好的作家并与世界分享更多有价值的内容。

作者 east
深度学习 1月 26,2023

GPT-3:这将如何影响 SEO 和内容营销?

随着时间的推移,人工智能的进步使机器变得越来越聪明,以至于它们学会了利用自己的训练和知识做出基于逻辑的决策,而几乎不需要人工干预。
目录
围绕 GPT-3 的议论
人类与 GPT-3 写作
GPT 3:它对 SEO 和内容营销的影响
关键要点
最后的话
常见问题
AI(人工智能)引人入胜且充满未来感,但埃隆·马斯克和比尔·盖茨等科技巨头以及斯蒂芬·霍金斯等科学家都表示他们对 AI 越来越谨慎。 不可否认,通过促进自动化,人工智能生成的内容在很多方面让日常生活变得更轻松,但在专业方面,工作自动化加剧了人们对被机器人取代的恐惧。

随着时间的推移,人工智能的进步使机器变得更加智能,以至于它们学会了利用自己的训练和知识做出基于逻辑的决策,而几乎不需要人工干预。 因此,它不仅对重复性的体力工作构成威胁,甚至对那些需要学习和决策的工作也构成威胁。

其中一项工作是内容营销人员或作家,他们投入逻辑思维、创造力和研究来为读者创造相关的内容(文本)。 但似乎,随着 Generative Pre-Trained Transformer Version 3 (GPT-3) 和其他自动化内容编写技术的出现,AI 可以以更快的速度生成类似人类的文本。 因此,内容营销人员了解 GPT-3 内容生成器将如何影响内容营销和搜索引擎优化 (SEO) 的未来至关重要。

围绕 GPT-3 的议论
如果您专业从事内容营销、数字营销机构、作家或 SEO 专家,那么您现在一定已经听说过 GPT-3 文案写作的嗡嗡声。 在讨论它对 SEO 和内容营销的影响之前,让我们从技术上了解一下 GPT-3 内容生成器。

GPT-3 由总部位于旧金山的人工智能研究实验室 OpenAI 推出,是一种可以通过处理示例进行学习的深度神经网络。 它可用作自然语言处理 (NLP) 系统的自回归语言模型。 简单来说,GPT-3 是一种基于 AI 的预训练语言模型,可以自动生成文本。 这不是同类中的第一个,因为我们已经有了微软的语言模型、Turing NLG、NVIDIA 的 Megatron 和 GPT-2(GPT-3 的直接前身)。

但为什么 GPT-3 SEO 会产生如此大的炒作? 这是因为 GPT-3 文案自动编写的内容质量非常高,很难将其与真实作者编写的文本区分开来。

人类与 GPT-3 写作对比
2020 年 8 月,VWO 对 GPT-3 生成的文本与人工编写的文本进行了 A/B 测试。 450 个品牌中共有 18 个入围品牌参与,并使用 GPT-3 API 生成各种语言的副本以供测试。 根据 VWO,参与者对 AI 编写的内容所提供的语言准确性非常满意。

在几秒钟内,GPT-3 内容生成器就可以像人类一样写出令人信服的内容。 它可以写任何主题、任何风格或任何语气。 以下是用户发布的 GPT-3 生成内容示例。

想象一下,一位作家为了获得某个学科或主题的知识而投入研究的时间; 与他竞争的是 GPT-3 SEO 编写的自动化内容。 它经过海量千兆字节的文本数据训练,实时拥有整个互联网的集体智慧。

与其他语言模型相比,GPT-3 内容生成器如此特别的原因在于其 1750 亿个参数的容量。

GPT-3 能够进行称为“元学习”的事情,这使其成为与任务无关的模型。 因此,它可以在不同平台上执行多项 NLP 任务,无需或只需极少的微调(额外训练)。

Gmail 完成你的电子邮件句子,这也是人工智能,但它是“狭义人工智能”,这意味着它只接受特定任务的训练,不会处理其他任何事情。 Siri、Alexa 和 Cortana 都由狭义人工智能提供支持。

但作为一个任务不可知论者,GPT-3 内容生成器可以展示通用智能的一些特性。 因此,即使没有对特定任务进行手动工程,它也可以在一系列自然语言处理任务中实现类似人类的效率和准确性,例如语言翻译、文本分类、情感提取、新闻文章生成、撰写博客、创建社交媒体帖子、 生成推文、释义、创建博客主题、问答系统和角色对话。 它甚至可以生成 HTML 代码。 GPT-3 的写作速度是人类作家的 500 倍,它对语法和拼写的掌握无可挑剔。 它产生出色的语法并具有广泛的词汇量。

GPT 3:它对 SEO 和内容营销的影响
GPT-3 内容生成器可以自动生成文本,但这对内容营销意味着什么? 这是否意味着从 SEO 的角度来看,内容营销专业人士将能够通过 GPT-3 自动化内容节省资金? 这是否意味着内容作者的工作将会过时? 那么搜索引擎算法呢? 他们会接受 GPT-3 内容,还是会被列为黑帽 SEO?

GPT-3 文案不能取代注重质量和读者参与度的内容,因为 GPT-3 也有局限性,即它不能像人脑一样思考或变得有创造力。 它通过消化庞大的语言内容数据库进行学习,然后利用其通过评估先前单词来预测下一个单词的能力来编写新的合成内容。 因此,它可能会创建与主题相关的内容,但有时它可能完全没有头脑。

GPT-3 可以淘汰低质量或低成本的内容工厂
GPT-3 内容可以胜过内容工厂出售的低成本和低质量的内容,这些内容可读性强,但无法提高社交媒体份额或吸引反向链接。 在创建低层文章时,GPT-3 内容会更可靠,因为它可以更好地包含来自可靠来源的特定主题信息。 GPT-3 内容生成器在未来将继续变得更加实惠,当这种情况发生时,它将迫使内容工厂倒闭。

GPT-3 擅长创建短期内容,是改写、主题优化、摘要等目的的智能工具。但对于长篇事实内容,它就迷失了方向。

GPT-3 内容会排名吗?
使用 GPT-3 SEO 工具,SEO 从业者可以通过投入更少的时间和金钱来访问大量的博客和文章。 但他们能否将这些自动化内容片段用于 SEO 实践,或者像谷歌这样的搜索引擎会更新他们的算法来检测 AI 生成的内容并对其进行惩罚?

由于其能够创建大量博客点,GPT-3 SEO 面临成为黑帽 SEO 策略的诱人工具的风险,这反过来可能导致前所未有的互联网垃圾邮件。

谷歌作为搜索引擎的成功在于其将用户与有用内容联系起来的能力,而且它不会在这一点上妥协。 谷歌声称,对于其算法,对内容进行排名的唯一标准是它为用户增加了多少实际价值。 不管是人工智能编写的还是人工编写的; 如果内容用陈旧和重复的信息向互联网发送垃圾邮件,它就不会获得排名。

GPT-3:内容营销人员如何从中受益?
注重质量的内容营销人员不会在这里用黑帽 SEO 或低质量文章向互联网发送垃圾邮件。 他们已经避免了此类内容,并专注于能够:

与读者联系
提高品牌知名度
增加网站和登陆页面的自然流量
促进潜在客户的产生和转化
在社交媒体上分享
吸引更多观众
GPT-3 文案可以帮助内容营销人员实现这些目标吗? GPT-3 内容生成器可能并不总是能够编写概念上原创的、高质量的、合乎逻辑的和更长的内容,至少在这个时间点上是这样。 但它的 AI 可以提供很多功能,可以通过增强作家的构思能力来增强作家的潜力。 例如,它可以通过为标题、产品描述、CTA 按钮等生成建议来支持作者的构思。

内容写作本身就是一个艰难的过程。 这不仅仅是写一些语法正确的句子。 专业作家需要弄清楚要写什么,如何使它更具吸引力,如何使其以解决方案为导向或流行等等。 但是相当多的时间花在了重新措辞、主题优化、编写 SEO 元描述、谷歌广告文案脚注、作者描述、产品描述等任务上。

GPT-3 SEO 工具可以自动化这些类型的写作,以方便作者,并让他或她有更多时间专注于需要人类创造力、勤奋、研究和准备的写作方面。

例如,Peppertype.ai 是一种基于 GPT-3 的内容创建工具,旨在使创作者的构思过程相对容易一些。 使用该平台,作家或内容营销人员可以在几秒钟内获得 AI 制作的简短内容片段,例如社交媒体帖子标题、推文、电子商务产品描述、SEO 元描述、Facebook 广告、博客创意、时事通讯、播客 和营销理念。 只需一次输入,它就可以建议 15 个备选博客创意或推文创意。 因此,作为 GPT-3 工具的 pepper.ai 对内容开发人员来说是一个很大的推动力,因为它可以帮助他们节省时间,做更有意义的工作,并提出更好的文章。

关键要点
GPT-3(Generative Pre-trained Transformer)是一种使用深度学习生成文本的语言模型。
GPT-3 内容生成器由 Elon Musk 的 Open AI 于 2020 年 6 月创建。
Peppertype.ai 等许多工具都使用 GPT-3 SEO 集成功能来生成内容。
GPT-3 内容生成器可以在不同平台上执行多个 NLP 任务,无需或只需极少的微调(额外训练)。
GPT-3 内容生成器可以胜过低质量机构生成的低质量、关键字填充的内容。
GPT-3 文案写作也是可能的,因为它生成的文本几乎与人类编写的文本相似。 它使用培训分析,因此可以提供有关用户的信息以生成内容。
GPT-3 内容生成器或任何 AI 生成的内容最适合创建小标题、CTA、标题等。 GPT-3 还不能用来创建高质量的长篇内容。
GPT-3 内容或任何人工智能生成的内容无法与人类书面内容竞争,因为有时它没有意义。
GPT-3 将为 SEO 和数字营销人员提供一个新的搜索引擎市场,具有强大的 NLP。
Google 根据内容的相关性对内容进行排名。 因此,由 GPT-3 SEO 串在一起的一堆词不会像有意义的内容那样排名。
GPT-3 内容生成器将改变未来数字营销的面貌。
GPT-3 文案写作不会完全取代人类作家。 这会帮助他们。

最后的话
GPT-3 内容生成器是在推出其前身 GPT-2 一年后推出的。 仅在一年内,其制造商就将其容量从 15 亿个参数更新为高达 1750 亿个参数。 这就是 GPT 语言模型快速发展的方式。

未来,这些模型将变得更加复杂,并将开发出更像人类的 NLP 能力。 随着演变的每个阶段,它将继续影响内容营销和实践它的人。 保持领先地位的唯一方法是根据 GPT 和其他此类技术带来的变化进行调整和发展。 如果内容营销人员学习如何释放其潜力,该工具可以成为对内容营销人员的强大、增强的支持。

常见问题

谁可以使用 GPT-3?
Elon Musk 的 Open AI 于 2020 年 6 月发布了 GPT-3 内容生成器。它已经发布了有限的 beta 容量。 开发人员在候补名单上注册以使用其功能。 世界各地的许多开发人员已经认识到 GPT-3 文案的潜力,候补名单已被淘汰。 Open AI 于 2021 年 11 月宣布将立即提供给开发者使用。 但是,有一些条件。 只有某些国家可以使用它。 来自古巴、伊朗和俄罗斯的开发人员将无法使用这种完全集成的 GPT-3 SEO 的功能。

GPT-3有什么用?
GPT-3 内容生成器,顾名思义,用于生成逼真的自动化内容,就像真人制作的那样。 诚然,创造力无法喂给机器。 但是,通过用户培训分析,GPT-3 SEO 结合了搜索引擎优化。 有关目标受众的信息被输入其中,以生成近乎完美的副本。 它已经产生了文章、诗歌、新闻报道、故事、对话等等。

训练GPT-3需要多长时间?
大型机器学习模型,如训练 GPT-3 内容生成器所需的模型,需要巨大的计算能力(数百 exaflops)并减少内存占用。 这些模型包含大型嵌入表。 单个 GPU 是不够的。 如果他们的任务是运行像 BERT 或 GPT-3 这样的数十亿参数语言模型,它就会崩溃。 模型并行技术用于跨多个 GPU 拆分参数。 然而,它们非常昂贵、难以使用且难以扩展。 使用 8 个 V100 GPU 训练 1750 亿个参数的 GPT-3 内容生成器需要 36 年。

GPT-3训练了哪些数据?
GPT-3 SEO 拥有 1750 亿个参数,是最大的内容生成器语言学习模型。 它使用来自不同数据集的 45TB 文本数据进行训练。 模型本身没有信息。 它不是为存储事实而设计的。 GPT-3 内容生成器的唯一目的是预测下一个单词或句子序列。

GPT-2 和 GPT-3 有什么区别?
GPT-2 内容生成器无法生成音乐和广泛的故事。 GPT-3 可能是迄今为止最大的语言学习模型。 GPT-3 SEO 非常擅长生成讲故事的内容。 它还可以总结文本、翻译语言、生成计算机代码、撰写论文、回答问题等等。 但是,GPT-3 只擅长预测下一个句子序列。 它不能存储信息。

作者 east
深度学习 4月 12,2022

Jaccard 相似度 – NLP 中的文本相似度度量

Jaccard 相似度也称为 Jaccard 指数和联合交集。用于确定两个文本文档之间的相似性的 Jaccard 相似度矩阵是指两个文本文档在上下文方面彼此接近的程度,即在总词中存在多少常用词。

在自然语言处理中,我们经常需要估计文本文档之间的文本相似度。存在许多文本相似度矩阵,例如余弦相似度、Jaccard 相似度和欧几里得距离测量。所有这些文本相似度指标都有不同的行为。

在本教程中,您将通过示例详细了解 Jaccard 相似度矩阵。您还可以参考本教程来探索余弦相似度指标。

Jaccard 相似度定义为两个文档的交集除以这两个文档的并集,这两个文档指的是总单词数中的常用单词数。在这里,我们将使用单词集来查找文档的交集和并集。

Jaccard 相似度的数学表示为:

Jaccard Similarity mathematical equation

Jaccard Similarity 得分在 0 到 1 的范围内。如果两个文档相同,则 Jaccard Similarity 为 1。如果两个文档之间没有共同词,则 Jaccard 相似度得分为 0。

让我们看一下 Jaccard Similarity 如何工作的示例?

doc_1 = "Data is the new oil of the digital economy"
doc_2 = "Data is a new oil"

让我们为每个文档获取一组唯一的单词。

words_doc1 = {'data', 'is', 'the', 'new', 'oil', 'of', 'digital', 'economy'}
words_doc2 = {'data', 'is', 'a', 'new', 'oil'}

现在,我们将计算这两组词的交集和并集,并测量 doc_1 和 doc_2 之间的 Jaccard 相似度。

Calculate the Jaccard similarity example
Jaccard similarity visual example

查找 Jaccard 相似性的 Python 代码

让我们为 Jaccard Similarity 编写 Python 代码。

def Jaccard_Similarity(doc1, doc2): 
    
    # List the unique words in a document
    words_doc1 = set(doc1.lower().split()) 
    words_doc2 = set(doc2.lower().split())
    
    # Find the intersection of words list of doc1 & doc2
    intersection = words_doc1.intersection(words_doc2)

    # Find the union of words list of doc1 & doc2
    union = words_doc1.union(words_doc2)
        
    # Calculate Jaccard similarity score 
    # using length of intersection set divided by length of union set
    return float(len(intersection)) / len(union)
doc_1 = "Data is the new oil of the digital economy" doc_2 = "Data is a new oil" Jaccard_Similarity(doc_1,doc_2)
0.44444

doc_1 和 doc_2 之间的 Jaccard 相似度为 0.444

作者 east
深度学习 4月 5,2022

Word Embedding的几种模型和示例

介绍

人类有能力理解单词并轻松地从中获取含义。然而,在当今世界,大多数任务都是由计算机执行的。例如,如果您想知道今天是晴天还是下雨天,则必须在 Google 中输入文本查询。现在的问题是,机器将如何频繁地理解和处理文本中呈现的如此大量的信息?答案是词嵌入。

Word Embeddings 基本上是向量(文本转换为数字),用于捕获单词的含义、各种上下文和语义关系。嵌入本质上是使用预定义字典将单词映射到其对应向量。

例如,

句子: It will rain heavily today.

字典:{“it”:[1,0,0,0,0],“will”:[0,1,0,0,0],“rain”:[0,0,1,0,0] , “ heavily ”: [0,0,0,1,0], “today”: [0,0,0,0,1]}

在这里,每个单词都被分配了一个唯一的向量(例如),以便区分所有单词。

Let the corpus comprise three sentences.

S1 = In monsoon, it will rain.

S2 = rain rain come again.

S3 = sun is visible in summer. In the monsoon, the sun is hidden by clouds.

Let N be the list of unique words = [‘monsoon’, ‘rain’, ‘come’, ‘again’, ‘sun’, ‘visible’, ‘summer’, ‘hidden’, ‘clouds’]

计数矩阵的维度将是 3X9,因为语料库中有 3 个文档和 9 个唯一词。
计数矩阵如下所示:

优点:由于只考虑单词的频率,因此计算成本较低。


缺点:由于计算只是基于计数并且没有考虑单词的上下文,因此该方法证明不太有用。
代码:

#Importing libraries
from sklearn.feature_extraction.text import CountVectorizer
import nltk 
from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 

#Downloading stopwords and punkt packages
nltk.download('stopwords') 
nltk.download('punkt') 

#Initialising stopwords for english
set(stopwords.words('english')) 

#sample sentences
text = ["In monsoon, it will rain", "rain rain come again", "sun is visible in summer. In the monsoon, the sun is hidden by clouds"]

#set of stop words
stop_words = set(stopwords.words('english')) 
all_sentences = []

#Logic for removing stop words and obtaining filtered sentences from the list 

for i in range(len(text)):
  word_tokens[i] = word_tokenize(text[i]) 
  tokenized_sentence = []

  for j in word_tokens[i]: 
      if j not in stop_words: 
          tokenized_sentence.append(j) 
  all_sentences.append(" ".join(tokenized_sentence))

#Initialising the CountVectorizer
countvectorizer = CountVectorizer()

#Applying CountVectorizer to the list of sentences
X = countvectorizer.fit_transform(all_sentences)

#Converting output to array
result = X.toarray()

print("Sentences after removing stop words", all_sentences)
print("Count Vector:", result)

2.TF-IDF:

TF-IDF 代表词频-逆文档频率。 该方法是对 Count Vector 方法的即兴创作,因为特定单词的频率被考虑在整个语料库中,而不仅仅是单个文档。 主要思想是对某些文档非常具体的词给予更多的权重,而对更普遍且在大多数文档中出现的词给予较少的权重。

例如,诸如“is”、“the”、“and”之类的通用词会经常出现,而诸如“Donald Trump”或“Indira Gandhi”之类的词将特定于特定文档。

数学上,

词频 (TF) = 词条在文档中出现的次数 / 文档中词条的总数

逆文档频率 (IDF) = log(N/n) 其中 N 是文档总数,n 是一个术语出现的文档数。

考虑以下示例。
给出了两个文档——D1 和 D2。

TF(Today, Document 1) = 1/8

TF(Today, Document 2) = 1/8

TF(sunny, Document 1) = 4/8

IDF(Today) = log(2/2) = log(1) = 0

IDF(sunny) = log(2/1) = log(2) = 0.301

Therefore,

TF-IDF(Today, Document 1) = 1/8 * 0 = 0

TF-IDF(Today, Document 2) = 1/8 * 0 = 0

TF-IDF(sunny, Document 1) = 4/8 * 0.301 = 0.1505

从上面的计算可以看出,与文档 1 的上下文中的重要词“sunny”相比,常用词“Today”的权重较低。

优点:

它在计算上很容易。
文档中最重要的单词是通过基本计算提取的,不需要太多努力。

缺点:

它无法捕捉单词的语义,只能像词汇级别的特征一样工作。
代码:

from sklearn.feature_extraction.text import TfidfVectorizer 
import pandas as pd

#Declaring the list of sentences
documents = ['Today is sunny day', 'Today is rainy day']

#Initialising Tfidf Vectorizer
vectorizer = TfidfVectorizer()

#Fitting the Vectorizer to the list
X = vectorizer.fit_transform(documents)
print(X)

#Printing the feature names
print(vectorizer.get_feature_names()) 

matrix = X.todense()
tfidf_list = matrix.tolist()
tfidf_df = pd.DataFrame(tfidf_list, columns = vectorizer.get_feature_names())

print(tfidf_df)

3.Word2Vec:

Word2Vec 是一种基于预测的词嵌入方法。 与确定性方法不同,它是一个浅层的两层神经网络,能够预测单词之间的语义和相似性。 Word2Vec 是两种不同模型的组合——(i)CBOW(连续词袋)和(ii)Skip-gram。

模型概述 – CBOW(连续词袋)和 Skip-gram。

word_2_vec

3.1 CBOW(连续词袋):

该模型是一个浅层神经网络,可以在给定上下文的情况下预测单词的概率。 这里,上下文是指围绕要预测的单词的单词的输入。
CBOW模型的架构:

Architecture of CBOW model

作为第一步,输入是通过为给定文本形成一个词袋来创建的。
例如,

Sentence 1 = All work and no play make Jack a dull boy.

Sentence 2 = Jack and Jill went up the hill.

Bag of Words: {“All”:1, “work”:1, “no”:1, “play”:1, “makes”:1, “Jack”:2, “dull”:1, “boy”:1, “Jill”:1, “went”:1, “up”:1, “hill”:1} (after removing the stop words)

这个由单词及其出现频率组成的输入作为向量发送到输入层。对于 X 个单词,输入将是 X[1XV] 个向量,其中 V 是向量的最大长度。

接下来,输入隐藏层矩阵由维数 VXN 组成,其中 N 是表示单词的维数。输出隐藏层矩阵由维数 NXV 组成。在这里,这些值是通过将输入乘以隐藏输入权重来计算的。

在输出层,通过将隐藏输入乘以隐藏输出权重来计算输出。在隐藏层和输出层之间计算的权重给出了单词的表示。作为一个连续的中间步骤,通过对输出和目标值之间计算的误差使用反向传播来调整权重。
优点:

与确定性方法相比,概率性方法给出了更好的结果。
由于不需要计算巨大的矩阵,因此内存需求较少。
缺点:

优化非常重要,否则培训将需要很长时间才能完成。


3.2 Skip-gram :

Skip-gram 模型预测给定单词的上下文,与 CBOW 所做的正好相反。 Skip-gram 模型的架构:

Architecture of Skip-gram model:

输入层大小:[1XV],输入隐藏权重矩阵大小:[VXN],输出隐藏权重矩阵:[NXV],输出层大小:C[1XV]

模型的输入和直到隐藏层的进一步步骤将类似于 CBOW。 输出目标变量的数量取决于上下文窗口的大小。 例如,如果上下文窗口的大小为 2,那么将有四个目标变量,两个词在给定词之前,两个词在给定词之后。

将针对四个目标变量计算四个单独的误差,并通过执行元素相加获得最终向量。 然后反向传播这个最终向量以更新权重。 对于训练,输入和隐藏层之间的权重用于单词表示。

优点:

Skip-gram 模型可以捕获单词的不同上下文信息,因为每个上下文都有不同的向量表示。
对于不常用的术语更准确,并且适用于更大的数据库。
缺点:

它需要更多的 内存 进行处理。
代码:

要使用 genism 库中预训练的 Word2Vec 模型:

import gensim 
import gensim.downloader as api
from gensim.models.keyedvectors import KeyedVectors

#loading pretrained model
nlp_w2v = api.load("word2vec-google-news-300") 

#save the Word2Vec model
nlp_w2v.wv.save_word2vec_format('model.bin', binary=True)

#load the Word2Vec model 
model = KeyedVectors.load_word2vec_format('model.bin', binary=True)

#Printing the most similar words to New York from vocabulary of pretrained model
model.most_similar('New_York')

从头开始训练 Word2Vec 模型:

import gensim 
'''
Data for training Word2Vec
train: A data frame comprising of text samples
'''

#training data
corpus = train

#creates a list for a list of words for every training sample
w2v_corpus = []
for document in corpus:
   w2v_words = document.split()
   w2v_grams = [" ".join(w2v_words[i:i+1]) 
               for i in range(0, len(w2v_words), 1)]
   w2v_corpus.append(w2v_grams)

#initialising and training the custom Word2Vec model 
'''
size: dimensions of word embeddings 
window: context window for words 
min_count: words which appear less number of times than this count will be ignored 
sg: To choose skip-gram model 
iter: Number of epochs for training
'''

word2vec_model = gensim.models.word2vec.Word2Vec(w2v_corpus, size=300,   
            window=8, min_count=1, sg=1, iter=30)

#vector size of the model
print(word2vec_model.vector_size)

#vocabulary contained by the model
print(len(word2vec_model.wv.vocab))

4.GloVE:

GloVe 代表词表示的全局向量。 该算法是对 Word2Vec 方法的改进,因为它考虑全局统计而不是局部统计。 在这里,全局统计数据意味着从整个语料库中考虑的单词。 GloVe 基本上试图解释特定单词对在文档中出现的频率。 为此,构建了一个共现矩阵,该矩阵将表示特定单词相对于另一个单词的存在。

例如,

Corpus – It is rainy today, tomorrow it will be sunny and the day after will be windy.

上面的矩阵表示一个共现矩阵,其值表示在给定示例语料库中一起出现的每对单词的计数。

在计算给定“today”、p(rainy/today) 和给定“tomorrow”、p(rainy/tomorrow) 的单词“rainy”的出现概率后,结果是与“rainy”最相关的单词 与“明天”相比,“今天”是“今天”。

代码:

#Import statements
from numpy import array
from numpy import asarray
from numpy import zeros
from keras.preprocessing.text import Tokenizer 

#Download the pretrained GloVe data files
!wget http://nlp.stanford.edu/data/glove.6B.zip

#Unzipping the zipped folder
!unzip glove*.zip

#Initialising a tokenizer and fitting it on the training dataset
'''
train: a dataframe comprising of rows containing text data
'''
tokenizer = Tokenizer(num_words=5000)
tokenizer.fit_on_texts(train)

#Creating a dictionary to store the embeddings
embeddings_dictionary = dict()

#Opening GloVe file
glove_file = open('glove.6B.50d.txt', encoding="utf8")

#Filling the dictionary of embeddings by reading data from the GloVe file
for line in glove_file:
    records = line.split()
    word = records[0]
    vector_dimensions = asarray(records[1:], dtype='float32')
    embeddings_dictionary[word] = vector_dimensions
glove_file.close()

#Parsing through all the words in the input dataset and fetching their corresponding vectors from the dictionary and storing them in a matrix 
embedding_matrix = zeros((vocab_size, 50))
for word, index in tokenizer.word_index.items():
    embedding_vector = embeddings_dictionary.get(word)
    if embedding_vector is not None:
        embedding_matrix[index] = embedding_vector

#Displaying embedding matrix 
print(embedding_matrix) 

结论:

在这篇博客中,我们回顾了一些方法——Count Vector、TF-IDF、Word2Vec 和 GloVe,用于从原始文本数据创建词嵌入。 预处理文本然后发送预处理数据以创建词嵌入总是一个好习惯。 作为进一步的步骤,这些词嵌入可以发送到机器学习或深度学习模型,用于各种任务,例如文本分类或机器翻译。

作者 east
深度学习 4月 2,2022

Tensorflow:使用 GPU 进行 BERT 微调

训练数据的短缺是自然语言处理面临的最大挑战之一。 因为 NLP 是一个多元化的领域,在多语言数据中具有多种任务。 最特定于任务的数据集仅包含几千个训练数据,这不足以实现更好的准确性。

为了提高现代基于深度学习的 NLP 模型的性能,需要数百万或数十亿的训练数据。 研究人员已经开发出各种方法来使用网络上的大量未注释文本来训练通用语言表示模型。 这称为预训练。

这些预训练模型可用于为广泛的 NLP 任务(例如问答和测试分类)创建最先进的模型。 它被称为微调。 当我们没有足够数量的训练样本时,微调是有效的。

BERT

BERT 代表来自 Transformers 的双向编码器表示。 BERT 是由 Google AI 的研究人员推出的 NLP 框架。 它是一种新的预训练语言表示模型,可在各种自然语言处理 (NLP) 任务上获得最先进的结果。 只需添加单个输出层即可对预训练的 BERT 模型进行微调。 你可以在这里找到 BERT 的学术论文:https://arxiv.org/abs/1810.04805。

在本教程中,您将通过一个示例学习对 BERT 模型进行微调。 可以参考之前的 BERT 教程,里面已经解释了 BERT 模型的架构。

我们将使用 Kaggle 的 Quora Insincere Questions Classification 任务数据进行演示。

In [1]:
# Let's load the required packages
import pandas as pd
import numpy as np
import datetime
import zipfile
import sys
import os

下载预训练的 BERT 模型以及模型权重和配置文件

In [2]: !wget storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip

提取下载的模型 zip 文件。

In [3]:
repo = 'model_repo'
if not os.path.exists(repo):
    print("Dir created!")
    os.mkdir(repo)
with zipfile.ZipFile("uncased_L-12_H-768_A-12.zip","r") as zip_ref:
    zip_ref.extractall(repo)
In [4]:
BERT_MODEL = 'uncased_L-12_H-768_A-12'
BERT_PRETRAINED_DIR = f'{repo}/uncased_L-12_H-768_A-12'

OUTPUT_DIR = f'{repo}/outputs'
if not os.path.exists(OUTPUT_DIR):
    os.makedirs(OUTPUT_DIR)

print(f'***** Model output directory: {OUTPUT_DIR} *****')
print(f'***** BERT pretrained directory: {BERT_PRETRAINED_DIR} *****') 

Out[4]:
***** Model output directory: model_repo/outputs *****
***** BERT pretrained directory: model_repo/uncased_L-12_H-768_A-12 *****

准备和导入 BERT 模块

以下 BERT 模块是从 GitHub 克隆源代码并导入模块。

In [5]:
# Download the BERT modules
!wget raw.githubusercontent.com/google-research/bert/master/modeling.py 
!wget raw.githubusercontent.com/google-research/bert/master/optimization.py 
!wget raw.githubusercontent.com/google-research/bert/master/run_classifier.py 
!wget raw.githubusercontent.com/google-research/bert/master/tokenization.py
!wget raw.githubusercontent.com/google-research/bert/master/run_classifier_with_tfhub.py
In [6]: # Import BERT modules 
import modeling 
import optimization 
import run_classifier 
import tokenization 
import tensorflow as tf 
import run_classifier_with_tfhub

准备训练数据

在这里,我们将在一小部分训练数据上训练 BERT 模型。

In [7]:
from sklearn.model_selection import train_test_split

train_df =  pd.read_csv('input/train.csv')
train_df = train_df.sample(2000)                 # Train on 2000 data

train, val = train_test_split(train_df, test_size = 0.1, random_state=42)

train_lines, train_labels = train.question_text.values, train.target.values
val_lines, val_labels = val.question_text.values, val.target.values

label_list = ['0', '1']
In [8]:
def create_examples(lines, set_type, labels=None):
    guid = f'{set_type}'
    examples = []
    if guid == 'train':
        for line, label in zip(lines, labels):
            text_a = line
            label = str(label)
            examples.append(
              run_classifier.InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
    else:
        for line in lines:
            text_a = line
            label = '0'
            examples.append(
              run_classifier.InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
    return examples

指定 BERT 预训练模型。

这里使用的是 uncased_L-12_H-768_A-12 型号。 该模型由12层、768个隐藏、12个头、110M个参数组成。 它是一个 Uncased 模型,这意味着文本在标记化之前已被小写。

In [9]:
BERT_MODEL = 'uncased_L-12_H-768_A-12' 
BERT_MODEL_HUB = 'https://tfhub.dev/google/bert_' + BERT_MODEL + '/1'

初始化模型超参数。

In [10]:
TRAIN_BATCH_SIZE = 32
EVAL_BATCH_SIZE = 8
LEARNING_RATE = 2e-5
NUM_TRAIN_EPOCHS = 3.0
WARMUP_PROPORTION = 0.1
MAX_SEQ_LENGTH = 128

# Model Configuration
SAVE_CHECKPOINTS_STEPS = 1000 
ITERATIONS_PER_LOOP = 1000
NUM_TPU_CORES = 8

VOCAB_FILE = os.path.join(BERT_PRETRAINED_DIR, 'vocab.txt')
CONFIG_FILE = os.path.join(BERT_PRETRAINED_DIR, 'bert_config.json')
INIT_CHECKPOINT = os.path.join(BERT_PRETRAINED_DIR, 'bert_model.ckpt')
DO_LOWER_CASE = BERT_MODEL.startswith('uncased')

tpu_cluster_resolver = None   # Model trained on GPU, we won't need a cluster resolver

def get_run_config(output_dir):
    return tf.contrib.tpu.RunConfig(
    cluster=tpu_cluster_resolver,
    model_dir=output_dir,
    save_checkpoints_steps=SAVE_CHECKPOINTS_STEPS,
    tpu_config=tf.contrib.tpu.TPUConfig(
        iterations_per_loop=ITERATIONS_PER_LOOP,
        num_shards=NUM_TPU_CORES,
        per_host_input_for_training=tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2))

加载分词器模块

注意:当您使用 Cased 模型时,传递 do_lower_case = False。

In [11]:
tokenizer = tokenization.FullTokenizer(vocab_file=VOCAB_FILE, do_lower_case=DO_LOWER_CASE)
train_examples = create_examples(train_lines, 'train', labels=train_labels)

# compute number of train and warmup steps from batch size
num_train_steps = int( len(train_examples) / TRAIN_BATCH_SIZE * NUM_TRAIN_EPOCHS)
num_warmup_steps = int(num_train_steps * WARMUP_PROPORTION)

微调来自 TF Hub 的预训练 BERT 模型

本节说明了来自 TensorFlow 集线器模块的微调预训练 BERT 模型。

In [12]:

model_fn = run_classifier_with_tfhub.model_fn_builder(
  num_labels=len(label_list),
  learning_rate=LEARNING_RATE,
  num_train_steps=num_train_steps,
  num_warmup_steps=num_warmup_steps,
  use_tpu=False,
  bert_hub_module_handle=BERT_MODEL_HUB
)

estimator_from_tfhub = tf.contrib.tpu.TPUEstimator(
  use_tpu=False,    #If False training will fall on CPU or GPU
  model_fn=model_fn,
  config=get_run_config(OUTPUT_DIR),
  train_batch_size=TRAIN_BATCH_SIZE,
  eval_batch_size=EVAL_BATCH_SIZE,
)
In [13]:
# Train the model
def model_train(estimator):
    print('Please wait...')
    train_features = run_classifier.convert_examples_to_features(
      train_examples, label_list, MAX_SEQ_LENGTH, tokenizer)
    print('***** Started training at {} *****'.format(datetime.datetime.now()))
    print('  Num examples = {}'.format(len(train_examples)))
    print('  Batch size = {}'.format(TRAIN_BATCH_SIZE))
    tf.logging.info("  Num steps = %d", num_train_steps)
    train_input_fn = run_classifier.input_fn_builder(
      features=train_features,
      seq_length=MAX_SEQ_LENGTH,
      is_training=True,
      drop_remainder=True)
    estimator.train(input_fn=train_input_fn, max_steps=num_train_steps)
    print('***** Finished training at {} *****'.format(datetime.datetime.now()))
In [14]: model_train(estimator_from_tfhub)
In [15]:
# Evaluate the model
def model_eval(estimator):
    
    eval_examples = create_examples(val_lines, 'test')
    
    eval_features = run_classifier.convert_examples_to_features(
        eval_examples, label_list, MAX_SEQ_LENGTH, tokenizer)
        
    print('***** Started evaluation at {} *****'.format(datetime.datetime.now()))
    print('  Num examples = {}'.format(len(eval_examples)))
    print('  Batch size = {}'.format(EVAL_BATCH_SIZE))
    
    eval_steps = int(len(eval_examples) / EVAL_BATCH_SIZE)
    
    eval_input_fn = run_classifier.input_fn_builder(
      features=eval_features,
      seq_length=MAX_SEQ_LENGTH,
      is_training=False,
      drop_remainder=True)
    
    result = estimator.evaluate(input_fn=eval_input_fn, steps=eval_steps)
    
    print('***** Finished evaluation at {} *****'.format(datetime.datetime.now()))
    
    print("***** Eval results *****")
    for key in sorted(result.keys()):
        print('  {} = {}'.format(key, str(result[key])))
In [16]: model_eval(estimator_from_tfhub)

从检查点微调预训练的 BERT 模型

您还可以从保存的检查点加载预训练的 BERT 模型。

In [17]:
CONFIG_FILE = os.path.join(BERT_PRETRAINED_DIR, 'bert_config.json')
INIT_CHECKPOINT = os.path.join(BERT_PRETRAINED_DIR, 'bert_model.ckpt')

OUTPUT_DIR = f'{repo}/outputs_checkpoints'
if not os.path.exists(OUTPUT_DIR):
    os.makedirs(OUTPUT_DIR)

model_fn = run_classifier.model_fn_builder(
    bert_config=modeling.BertConfig.from_json_file(CONFIG_FILE),
    num_labels=len(label_list),
    init_checkpoint=INIT_CHECKPOINT,
    learning_rate=LEARNING_RATE,
    num_train_steps=num_train_steps,
    num_warmup_steps=num_warmup_steps,
    use_tpu=False, #If False training will fall on CPU or GPU, 
    use_one_hot_embeddings=True)

estimator_from_checkpoints = tf.contrib.tpu.TPUEstimator(
    use_tpu=False,
    model_fn=model_fn,
    config=get_run_config(OUTPUT_DIR),
    train_batch_size=TRAIN_BATCH_SIZE,
    eval_batch_size=EVAL_BATCH_SIZE)
In [18]: 
# Train the Model
model_train(estimator_from_checkpoints)
# Evaluate the Model
In [19]: model_eval(estimator_from_checkpoints)
作者 east
深度学习 4月 2,2022

BERT:如何处理长文档

BERT 的问题

BERT,即 Transformers 的双向编码器表示,目前是公众可以使用的最著名的预训练语言模型之一。事实证明,它在包括问答和分类在内的各种任务中非常有用。

但是,BERT 最多只能接受长度为 512 个标记的输入序列。这是一个很大的限制,因为许多常见的文档类型都比 512 个单词长得多。在这一点上,我们将解释和比较一些方法来克服这个限制,并使您更容易使用 BERT 处理更长的输入文档。

为什么 BERT 不能处理长文档?

BERT 继承了转换器的架构,转换器本身使用自注意力、前馈层、残差连接和层规范化作为其基础组件。如果您不熟悉变压器架构,您可以阅读Deep Learning 101: What is a Transformer and Why Should I Care? 在继续读本文之前。

bertarchitecture.png

BERT 和长输入文档的问题源于 BERT 架构的几个领域。

Transformer 本身是自回归的,BERT 的创建者指出,当使用超过 512 个令牌的文档时,性能会显着下降。所以,这个限制是为了防止低质量的输出。
自注意力模型的空间复杂度为 O(n²)。像这样的二次复杂性使得这些模式非常耗费资源进行微调。输入的时间越长,微调模型所需的资源就越多。二次复杂度使大多数用户的成本高得令人望而却步。
鉴于上述两点,BERT 使用基于较短输入序列的位置编码进行了预训练。这意味着该模型不能很好地推广到更长的序列,并且为收益递减而进行微调的费用意味着解决这个问题的方法有限。
但是我的文件很长,那我现在该怎么办?

幸运的是,您可以做一些事情来有效地使用 BERT 处理更长的输入文档。这里有一些经过验证的技术可以尝试。

修整输入序列

这可能是处理 BERT 和长输入文档时最常用的技术。鉴于 BERT 对多达 512 个令牌的文档表现良好,只需将较长的文档拆分为 512 个令牌块即可让您将长文档分段传递。

对于较长的连续文档(例如长新闻文章或研究论文),将完整长度的文档切成 512 个字块不会造成任何问题,因为文档本身组织良好并且专注于单个主题。但是,如果您的文本块不太连续(例如聊天机器人脚本或一系列推文),则中间可能有与核心主题无关的块。

平均段输出的投票

另一种常见的技术是将长文档分成相等长度的重叠段,并使用投票机制进行分类。这将缓解诸如对话记录之类的非连续文档所带来的问题。使用来自较大文档的各个块的投票将合并来自整个事物的信息。

这在实践中的工作方式是将文档分成段,并通过 BERT 运行每个段,以获得分类 logits。然后通过组合投票(每段一个),我们可以得到一个平均值,我们将其作为最终分类。

这里的缺点是你不能在任务上微调 BERT,因为损失是不可微的。即使存在重叠,您也会错过每个段之间的一些共享信息。这可能会产生特定于分析管道架构的下游影响。

结论

对长输入文档使用 BERT 取决于您的具体任务。有一些更新的模型——比如 RoBERTa——是为了解决 BERT 的弱点而创建的。我们将在以后的帖子中更多地讨论这些内容。对于需要来自整个文档的信息的复杂任务,或者您使用的是非连续文档,使用像 RoBERTa 这样的 BERT 变体可能是最佳解决方案。

作者 east
深度学习 3月 31,2022

BERT 模型的深度揭秘

2018 年,Google 提出了一种特殊的语言表示模型,称为“BERT”,代表“来自 Transformers 的双向编码器表示”。 以前的语言表示模型(例如 OpenAI GPT)使用单向方法(从左到右)来编码序列。 然而,这种方法是有限的,因为上下文只能从一个方向学习。

例如,考虑到这句话——“ The man was looking at the cloudy sky. The man witnessed a cloudy state of mind for the whole day 。” 在这里,无论考虑上下文或句子中单词的实际含义,之前的模型都会产生相同的单词“cloudy”嵌入。 而对于 BERT 模型,“多云”一词将根据不同的上下文具有不同的嵌入。

该模型在现实生活中的主要应用之一是提高对谷歌搜索引擎的查询理解。 早些时候,搜索引擎是基于关键字的,无法考虑可以提出相同问题的各种格式。 因此,在搜索引擎中使用 BERT 有助于显着改善查询结果。

BERT Example

需要注意的重要一点是,BERT 不是一种新的架构设计,而是一种新的训练策略。 由于 BERT 使用了论文中提出的 Transformer 的编码器部分——Attention Is All You Need,我们将花一些时间首先了解相同的内容,然后再讨论 BERT 不同阶段的详细工作。

变换器 – 编码器

1.1 简单多头注意力机制:

Transformer 中使用的最重要的概念是“注意”机制。 让我们看看下面的图片:

当我们第一次看到图像时,我们的大部分注意力都被绿色人物——自由女神像所吸引。

同样,当提供上下文(查询)时,我们不应该对每个输入给予同等的重视,而应该更多地关注一些重要的输入。

在这里,如果查询是关于建筑物的,那么我们的注意力就会放在背景上。

因此,我们将输入一个称为 Z 的新项,而不是普通的原始输入 x 到一个层,这将是所有单个输入 xi 的加权和。

在数学上它表示为,

其中 ai 是决定注意力的个体权重。

为了更好地理解注意力的概念,让我们引入以下变量——Q、K、V。Q 代表 Query,这是我们试图查看的上下文,Value 表示给定的输入(像素或文本特征), Key 是 Value 的编码表示。

例如,在上图中,如果:

Query = 绿色

Key=建筑

那么价值将是,

因此,为了形成对输入的注意力,我们需要将查询和键相关联并删除不相关的值。

再次考虑这个例子,

| The man was looking at the cloudy sky 。 (字数 = 8)

由于有 8 个单词,我们将有 8 个查询、8 个键和 8 个值。

Q = 8X512、K^T = 512X8、V = 8X512 和最后 d_k = 512 的维度。512 是作为输入馈送到编码器的固定维度数。

在等式中,Q 和 K 矩阵之间的点积将导致它们之间的相似度同时生成,而不是单独计算每个单词的相似度。 此外,我们在分母中有一个维度数的平方根,以便缩放完整值。 这将有助于确保顺利进行训练。

刚才我们理解的是简单的注意力,现在让我们继续理解
multi-head 注意力是什么意思?

多头注意力是转换器使用的一项功能,它为每个查询生成 h 个注意力,而不是一个注意力。使用 h attention 的主要原因是为特定查询获得 h 个不同的视角。考虑这么多角度将大大提高模型的整体准确性。对于输出,将所有 h 个注意力连接起来,然后输入到点积方程中。

1.2 跳过连接和层规范化:

编码器的另一个主要组成部分是跳过连接和归一化层。

跳过连接基本上是通过跳过中间的一些层将一层连接到另一层的残差块。引入跳跃连接的想法是解决深度神经网络中的退化问题(梯度消失)。跳过连接有助于网络的最佳训练。

层归一化类似于批量归一化,除了在层归一化中,归一化发生在同一层中的特征上。

下图展示了编码器的结构,展示了multi-head 注意力、跳过连接和层归一化的使用。

1.3 前馈网络:

如上图所示,层归一化的输出被馈送到一个全连接层、ReLU 层和另一个全连接层。这些操作分别应用于每个位置,因为每个输出都依赖于与其相关的相应注意力。

通过以上部分,您对编码器中存在的不同模块及其使用有了基本的了解。

在下一节中,让我们继续了解 BERT 的强大功能。

BERT 模型:

使用 BERT 的动机是解决这两个主要挑战:

对所有单词的深刻上下文理解。与转换器不同,它尝试实现双向词嵌入策略。
一个可以服务于多种目的的单一模型,因为从头开始为每个单独的任务进行训练,在计算上既昂贵又耗时。

理解输入:

输入包括分成标记的句子——T1、T2、… Tn。一开始,总是有一个 [CLS] 令牌。如果输入中有多个序列,则它们被 [SEP] 标记分割。输出令牌的数量与输入令牌的数量相同。请看下图以更好地理解。

输入嵌入包括三种——令牌嵌入、段嵌入和位置嵌入。

1、令牌嵌入——为了计算嵌入,输入令牌使用固有词汇表(大小 – 30,000 个令牌)转换为单词片段。 例如,“bullying”这个词将被拆分为“bully”和“ing”。
2、Segment Embeddings——这些嵌入确保了每个标记的序列标记,以确定标记属于哪个序列。 为了做到这一点,嵌入值添加了一个常量偏移量,其值决定了它所属的序列。
3、 位置嵌入——这有助于跟踪令牌的位置。

最终的嵌入将是 Token 嵌入、Segment 嵌入和位置嵌入的总和。

预训练和微调任务:

BERT 模型包括两个阶段——预训练和微调。

在预训练阶段,该模型使用两个 NLP 任务进行训练——(i) 掩蔽语言模型 (MLM) 和 (ii) 下一句预测 (NSP)。使用 Masked LM,解码器生成输入的向量表示,其中包含一些掩码单词。

例如,如果输入句子是——“ my cat is furry ”,那么掩码向量看起来像——“ my cat is  [MASK]”。

在这种策略中,80% 的时间单词会被屏蔽。 10% 的情况下,它会被一个随机词替换——“ my cat is human ”。在剩下的 10% 的时间里,这个词保持不变——“ my cat is furry ”。这种学习方法将使模型变得健壮,因为它将提高预测准确性。需要注意的一点是,模型不会被评估预测整个序列,而只会评估缺失的单词。

第二个 NLP 任务是 Next Sentence Prediction (NSP)。输入将包含两个句子——A 和 B。这个想法是预测第二个句子是否是第一个句子的后续。这样,模型将能够学习两个句子之间的关系。模型有 50% 的时间是连续的句子,其余 50% 的序列是随机设置的。查看下图以获取 NSP 任务的示例。

总而言之,这两个训练任务能够丰富学习序列的上下文信息和语义。

BERT 模型可以针对许多不同的任务进行微调——自然语言推理 (NLI)、问答、情感分析、文本分类等。在微调的同时,我们保持完整的架构相同,除了最后一层将在自定义数据上训练模型。添加一个浅层分类器或解码器可以完成这项工作。

预训练模型:

BERT 论文提出了以下预训练模型:-

BERT-Base, Uncased:12 层,768 隐藏,12 注意力头,110M 参数
BERT-Large, Uncased:24 层,1024 隐藏,16 注意力头,340M 参数

BERT-Base,Cased:12 层,768 隐藏,12 注意力头,110M 参数
BERT-Large,Cased:24 层,1024 隐藏,16 注意力头,340M 参数

代码实现:

现在,让我们使用 BERT 实现一个多标签文本分类模型。

多标签文本分类概述

那么,什么是多标签文本分类?它基本上是将文本分类为它所属的一个或多个类别。例如,考虑电影《神奇女侠》的影评——“在一个痴迷于有缺陷的英雄、不受欢迎的英雄和反英雄的娱乐环境中,戴安娜毫无歉意地是一个真正的英雄”。从这段文字可以预测,这部电影属于“奇幻”、“冒险”和“科幻”的类型。

因此,为了解决多标签分类任务,第一步是创建由清洁文本和单热编码目标向量组成的数据。例如,在上述情况下,目标向量可能看起来像 – [0,0,1,0,1,0,1,0,0…] 其中 1 代表类别 – 幻想、冒险和科幻,而 0代表剩余的缺席类别。第二步是创建词嵌入,最后在这些嵌入上训练模型。

使用 BERT 进行多标签文本分类:

第 1 步:安装:

使用以下命令在 google colab 上安装 simpletransformers 库:

!pip install simpletransformers

Simpletransformers 是一个建立在著名的变形金刚库 – Hugging Face 之上的库。这使得只使用几行代码就可以进行预处理、训练和评估。

第 2 步:加载和预处理数据:

我们将致力于有毒评论分类的 kaggle 挑战,其中文本需要分为六个类别——有毒、严重有毒、淫秽、威胁、侮辱和身份仇恨。数据集可以从这里下载。将下载的文件存储在您当前的工作目录中。我们将使用 train.csv 文件来创建训练和评估数据。

# Import statements

import pandas as pd
from sklearn.model_selection import train_test_split
from simpletransformers.classification import MultiLabelClassificationModel

# ’dir’ would be your current working directory
df = pd.read_csv('dir/train.csv') 
# taking nearly 15,000 samples out of nearly 1,50,000 samples
df= df.sample(frac=0.1) 

# Combining all the tags into a single list
df['labels'] = df[df.columns[2:]].values.tolist() 

# Removing '\n' from the text
df['text'] = df['comment_text'].apply(lambda x: x.replace('\n', ' ')) 

# Creating new dataframe consisting of just text and their labels
new_df = df[['text', 'labels']].copy() 

# Splitting the data into training and testing sets, 80% of data is kept for training and 20% for evaluation
train, eval = train_test_split(new_df, test_size=0.2)

第 3 步:加载预训练的 BERT 模型:

在这里,我们将使用 roberta 模型的预训练“roberta-base”版本。 RoBERTa 代表 Robustly Optimized BERT Pretraining Approach。 由于原始 BERT 模型的以下变化,RoBERTa 提高了性能——更长的训练、使用更多数据以及更长的训练序列、动态掩码模式以及从预训练任务中删除下一句预测目标。

'''
Description of params:
model_type: type of the model from the following {'bert', 'xlnet', 'xlm', 'roberta', 'distilbert'}

model_name: choose from a list of current pretrained models {roberta-base, roberta-large} roberta-base consists of 12-layer, 768-hidden, 12-heads, 125M parameters.
num_labels: number of labels(categories) in target values

args: hyperparameters for training. max_seq_length truncates the input text to 512. 512 because that is the standard size accepted as input by the model.
'''
model = MultiLabelClassificationModel('roberta', 'roberta-base', num_labels=6, args={'train_batch_size':2, 'gradient_accumulation_steps':16, 'learning_rate': 3e-5, 'num_train_epochs': 2, 'max_seq_length': 512})

步骤4:训练模型

# train_model is an inbuilt function which directly trains the data with the specified parameter args. Output_dir is the location for the model weights to be stored in your directory.

model.train_model(train, multi_label=True, output_dir='/dir/Output')

步骤5:评估模型

'''
Description of params: 

result: Label Ranking Average Precision (LRAP) is reported in the form of a dictionary 
model_outputs: Returns model predictions in the form of probabilities for each sample in the evaluation set
wrong_predictions: Returns a list for each incorrect prediction

'''

# eval_model is an inbuilt method which performs evaluation on the eval dataframe
result, model_outputs, wrong_predictions = model.eval_model(eval) 

# Converting probabilistic scores to binary - 0/1 values using 0.5 as threshold
for i in range(len(model_outputs)):
  for j in range(6):
    if model_outputs[i][j]<0.5:
      model_outputs[i][j] = 0
    else:
      model_outputs[i][j] = 1

第 6 步:预测:

test.csv 文件也将从此处下载到数据集中。 它只包含文本,不包含标签。

# Reading the test data for prediction
test_data = pd.read_csv('dir/test.csv')

# Replacing '\n' values in the text
predict_data = test_data.comment_text.apply(lambda x: x.replace('\n', ' '))

# Convert the dataframe to a list as the predict function accepts a list
predict_data = predict_data.tolist()

# Makes predictions for the test data
predictions, outputs = model.predict(predict_data) 

结论:

在本文中,我们深入探讨了 BERT 模型。 我们还对变压器使用的编码器模块有了基本的了解。 BERT 模型由于其双向编码的特性而被证明比其他以前的模型具有优势。 该模型经过预训练,可以针对自然语言推理 (NLI)、情感分析、多类/多标签文本分类等多项任务进行微调。 该模型通过大幅减少针对不同目的的不同模型从头开始训练的需求,无疑提高了多个领域的准确性。

作者 east
深度学习 3月 31,2022

为什么google应用bert模型到搜索及如何SEO

随着新BERT算法的实现,谷歌已经在谷歌搜索中出现的结果进行了另一种重要的排序调整。了解BERT算法更新对搜索结果造成的哪些更改,还有哪些方面没有造成改变, 对于SEO维护搜索中现有的结果至关重要,以及在搜索中建立新的排名。

谷歌不断调整其超级秘密搜索算法。一般来说,这些调整很小,不足导致大量搜索结果突然变化。 但BERT更新并非如此。BERT代表了Google对搜索结果内容策略有了地震般转变,肯定会影响每个公司的内容展示结果和SEO的方法。

随着BERT算法的引入,许多公司将看到搜索结果的突然变化,无论好坏。并考虑到许多公司今天接近内容营销的方式,“更糟糕的”案例可能更有可能。

什么是bert算法?

那么,BERT是什么,为什么现在改变?使用Google的Pandu Nayak,Google Clower和副总裁最近的博客文章的参考,最好回答这个问题,搜索谷歌搜索。来自他的博客文章:“随着我们研究团队的最新进展,在语言理解的科学中 – 通过机器学习使得可以实现重大改进,我们如何理解查询,代表过去五年中最大的飞跃和搜索历史上的最大跳跃之一。“

机器学习,解释模式和语音过程的数学方式和语言语言,正在推进搜索科学。该进步的一个结果是BERT,它代表来自变压器的双向编码器表示。根据Nayak的说法,“[BERT]使任何人能够培养自己的最先进的问题回答系统。”

在这篇文章的剩余部分中,我将更多地挖掘这个主题以及伯特将如何影响您的SEO和内容开发方法。以及这种变化如何改变您的短期和长期可见性和在搜索中的存在。

什么是机器学习?

根据Google的说法,Transformers (the “T” in BERT)是根据句子中的所有其他单词,而不是一个逐个地处理词语的模型。“这意味着BERT机器学习模型现在将通过检查之前和之后的单词来解析查询中的句子或短语的完整上下文。根据Google,这种上下文分析,而不是与主题的特定关键字关联,是了解搜索查询背后的意图的卓越过程。结果是Google的SEO更进一步的方法。

特别是关于以较长的对话为中心的查询,在当今由基于语音的设备驱动的搜索设备中变得越来越常见,如亚马逊的Alexa或Apple的Siri等,机器学习算法将能够更好地了解理解介词用于限定查询的句子的上下文含义和目的。

换句话说,Google搜索现在将能够更清楚地了解查询中一串单词的上下文。这意味着用户可以越来越多地搜索感觉自然,谷歌将能够更准确地理解和响应搜索查询。

在他的博客帖子中,谷歌的Nayak使用这个例子:“2019 Brazil traveler to USA needs a Visa。” Nayak指出,“to”这个词及其与其余查询的关系对于了解查询的含义至关重要。这是关于一个前往美国的巴西旅行而不是其他意思。它对官方旅行证件相关,而非对信用卡的需求有关。

Nayak指出,过去的谷歌算法的过去版本将无法使用“to”这个词来接受查询上下文的重要性。因此,使用旧算法,Google可能实际上可以返回关于前往巴西的美国公民的结果列表,而不是想要的展示方式。通过BERT,Google现在能够掌握这种级别的细节 – 使用“to”单词作为限定符 – 并返回查询的更相关的结果。

凭借其对上下文细微差别的新方法,BERT算法改变了SEO的策略,以及SEO的日常惯例,减少了关键字和关键字基于短语的SEO的权重值。关键词和短语在对竞争SEO排名的战略方向和理解方面仍然重要,因为它涉及高级内容策略和内容营销。但是,在改善排名方面,SEO的关键字分析方法现在具有较少的价值和影响。

了解这一变化的影响对于寻求前进的成功至关重要。这是因为BERT了解句子级别的搜索查询的上下文,包括Word Order和同义词。在BERT之前,谷歌依靠精确的关键字和关键字短语关联,以确定搜索排名和相关性。

BERT如何改变SEO策略?

要重申一个关键点,BERT将实心SEO策略的主要焦点从关注关键字和关键字短语的关注转移到主题的关键词。更广泛地关注关于搜索查询的主题相关性。

以下是您应该开始做的一些事情 – 或者应该停止执行 – 解决BERT算法的变化。

1、停止使用低质量的外包内容开发资源。现在,使用外包内容,写出的内容具有很少的知识或专业知识现在将损害您的SEO排名。这是因为搜索引擎不是基于关键字来排名,BERT现在考虑专业知识,权威和信任作为其核心资格排名因素。

2、制定主题重点的资源清单。正式确定您的主题重点,或将来将在未来。这就是:为什么:中小企业更有可能在会话语言中使用相关的行业行业行业和相关的同义词和短语。 BERT能够拿起这种级别的上下文协会,因为它与主题专业知识和权威有关。结果随着时间的推移将是更高且更有利的排名。

3、内容的质量与数量相比。在以前很长时间,内容营销人员已经不断通过更新内容来改善排名。内容新鲜度仍然重要,但现在,内容深度和质量问题超过发布一致性和更新。

BERT会改变我的搜索排名吗?

希望您现在有更好的掌握,现在BERT算法对SEO的当前状态和未来以及整体搜索排名的影响。下一个问题显然是“BERT改变了我在搜索中看到的结果?”

没有真正的“是”或“不”的方式来回答这个问题。真实的反应是“取决于”。

如果您只使用基于关键字的SEO,随着BERT算法的引入就更变旧的游戏规则。原本排名不错的公司突然大幅度下降。 (您正在监控您的搜索结果相对竞争对手的排名,不是吗?)

我该怎么SEO?

正如我之前提到的那样,这个问题的答案是“这取决于”。无论您的内容开发计划在哪个阶段,它可能会出现完善的速度。幸运的是,谷歌为我们提供了一些关于如何继续的指导。

让我们圈回电子邮件的E-A-T(专业知识,权威,值得信赖性)Litmus测试,以便在这篇文章中提到的内容。 E-A-T参考谷歌认为对网上合格内容的分类非常重要的三个战略内容柱。

“e”代表专业知识。如果您尚未使用中小企业作为您的内容开发的基石,则需要首先开始这样做。例如,在基于技术的公司中,中小企业可以是开发人员,程序员或产品经理。 “但我公司中的这些类型的人不是作家!”你可能会说。或者,“我们的开发人员没有时间编写2000字的博客帖子关于系统工程机器专有代码的重要性。”

请记住,搜索中的新标准并不是您内容的单词的方式,但它对有多权威和相关性。您的中小企业将适合BERT算法,以便完美地符合Google对内容的基线测试。

所以不是要求这些人自己写作,采访他们并记录谈话。如果他们是大多数中小企业,他们可以轻松地在与您的15分钟对话中生成2,000字的会话风格的博客文章。通过这种方法(关于主题的录制对话),您可以获得相关行业的行业术语,细微差别和上下文情绪,这将符合这个新的搜索时代内容。拍摄专家的访谈并转化为博客文章或新闻稿等。

只需这一步,您不仅处理了专业知识因素,而且通过采访贵公司或行业的权威者,您也在变得更有行业权威,以及符合E-A-T 内容策略。

通过在BERT算法的新时代应用E-A-T方法,您将在途中提高搜索排名,并在您网站的流量增加,而不是您思考的时间。

作者 east
深度学习 3月 29,2022

什么是Google BERT如何对它进行优化

听说过 Google 的新更新 BERT?如果您对搜索引擎优化 (SEO) 很感兴趣,您可能会拥有。在 SEO 世界中对 Google BERT 的炒作是有道理的,因为 BERT 使搜索更多地关注单词背后的语义或含义,而不是单词本身。

换句话说,搜索意图比以往任何时候都更加重要。谷歌最近更新的 BERT 影响了 SEO 世界,影响了十分之一的搜索查询,谷歌预计随着时间的推移,这将随着更多的语言和地区而增加。由于 BERT 将对搜索产生巨大影响,因此拥有高质量的内容比以往任何时候都更加重要。

为了使您的内容能够为 BERT(和搜索意图)发挥最佳效果,在本文中,我们将介绍 BERT 如何与搜索一起工作,以及如何使用 BERT 为您的网站带来更多流量。想与 SEO 专家交谈?与 WebFX 连接!

什么是 BERT?
BERT 代表来自 Transformers 的双向编码器表示。现在,这是一个包含一些非常技术性的机器学习术语的术语!

这是什么意思:

双向:BERT 同时对两个方向的句子进行编码
编码器表示:BERT 将句子翻译成它可以理解的词义表示
Transformers:允许 BERT 使用相对位置对句子中的每个单词进行编码,因为上下文在很大程度上取决于单词顺序(这是一种比准确记住句子如何输入框架更有效的方法)
如果你要改写它,你可以说 BERT 使用转换器来编码目标单词两侧的单词表示。从根本上说,BERT 是一个全新的、从未实现过的、最先进的自然语言处理 (NLP) 算法框架。这种类型的结构为谷歌的人工智能增加了一层机器学习,旨在更好地理解人类语言。

换句话说,通过这次新的更新,谷歌的人工智能算法可以以比以往更高水平的人类语境理解和常识来阅读句子和查询。虽然它对语言的理解程度不如人类,但它仍然是 NLP 在机器语言理解方面向前迈出的一大步。

BERT 不是什么
Google BERT 不会像之前的算法更新(如 Penguin 或 Panda)那样改变网页的判断方式。它不会将页面评为正面或负面。相反,它改进了对话式搜索查询中的搜索结果,因此结果更好地匹配其背后的意图。

BERT 历史
BERT 的存在时间比几个月前推出的 BIG 更新要长。自 2018 年 10 月发表研究论文 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 以来,自然学习处理 (NLP) 和机器学习 (ML) 社区一直在讨论它。不久之后,Google 发布了一个突破性的开源 NLP 框架,该框架基于 NLP 社区可以用来研究 NLP 并将其整合到他们的项目中的论文。

从那以后,出现了几个基于或合并了 BERT 的新 NLP 框架,包括谷歌和丰田的组合 ALBERT、Facebook 的 RoBERTa、微软的 MT-DNN 和 IBM 的 BERT-mtl。 BERT 在 NLP 社区引起的波澜占互联网上的大部分提及,但 BERT 在 SEO 世界中的提及正在获得牵引力。这是因为 BERT 专注于长尾查询中的语言以及像人类一样阅读网站,以便为搜索查询提供更好的结果。

BERT 是如何工作的?
Google BERT 是一个非常复杂的框架,理解它需要多年研究 NLP 理论和过程。搜索引擎优化世界不需要那么深入,但了解它在做什么以及为什么对于理解它将如何影响搜索结果从现在开始很有用。

因此,以下是 Google BERT 的工作原理:

谷歌 BERT 解释
以下是 BERT 如何从整体上查看句子或搜索查询的上下文:

BERT 接受查询
逐字逐句分解
查看单词之间所有可能的关系
构建一个双向地图,概述两个方向上的单词之间的关系
当单词彼此配对时,分析单词背后的上下文含义。
好的,为了更好地理解这一点,我们将使用以下示例:

每行代表“pandas”的含义如何改变句子中其他单词的含义,反之亦然。 关系是双向的,所以箭头是双向的。 当然,这是 BERT 如何看待上下文的一个非常非常简单的例子。

这个例子只检查我们的目标词“pandas ”和句子中其他有意义的片段之间的关系。 然而,BERT 分析句子中所有单词的上下文关系。 这张图可能更准确一点:

BERT 的类比
BERT 使用 Encoders 和 Decoders 来分析单词之间的关系。想象一下 BERT 如何作为翻译过程发挥作用,提供了一个很好的例子来说明它是如何工作的。您从输入开始,无论您想翻译成另一种语言的任何句子。

假设您想将上面的熊猫句子从英语翻译成韩语。不过,BERT 不懂英语或韩语,所以它使用编码器来翻译“熊猫除了竹子还吃什么?”变成它确实理解的语言。这种语言是它在分析语言的过程中为自己构建的语言(这是编码器表示的来源)。

BERT 根据单词的相对位置和对句子含义的重要性来标记单词。然后它将它们映射到一个抽象向量上,从而创建一种想象的语言。因此,BERT 将我们的英语句子转换为其想象的语言,然后使用解码器将想象的语言转换为韩语。

该过程非常适合翻译,但它也提高了任何基于 BERT 的 NLP 模型正确解析语言歧义的能力,例如:

代词参考
同义词和同音词
或具有多个定义的单词,例如“运行”
BERT 经过预训练
BERT 是经过预训练的,这意味着它有很多学习内容。但是使 BERT 与以前的 NLP 框架不同的一件事是 BERT 是在纯文本上进行预训练的。其他 NLP 框架需要一个由语言学家精心标记句法的单词数据库来理解单词。

语言学家必须将数据库中的每个单词标记为词性。这是一个严格而苛刻的过程,可能会在语言学家之间引发冗长的激烈辩论。词性可能很棘手,尤其是当词性由于句子中的其他单词而发生变化时。

BERT 自己做这件事,而且它是在无人监督的情况下做的,这使它成为世界上第一个这样做的 NLP 框架。它是使用维基百科训练的。那是超过 25 亿字!

BERT 可能并不总是准确的,但它分析的数据库越多,它的准确度就会越高。

BERT 是双向的
BERT 对句子进行双向编码。 简而言之,BERT 在一个句子中取一个目标词,并在任一方向查看围绕它的所有词。 BERT 的深度双向编码器在 NLP 框架中是独一无二的。

早期的 NLP 框架(例如 OpenAI GPT)仅在一个方向上对句子进行编码,在 OpenAI GPT 的情况下是从左到右。 后来的模型(如 ELMo)可以在目标词的左侧和右侧进行训练,但这些模型独立地连接编码。 这会导致目标词的每一侧之间的上下文断开。

另一方面,BERT 识别目标单词两侧所有单词的上下文,并且同时完成所有操作。 这意味着它可以完全看到和理解单词的含义如何影响整个句子的上下文。

单词如何相互关联(意味着它们一起出现的频率)是语言学家所说的搭配。

搭配词是经常一起出现的词——例如,“圣诞节”和“礼物”经常出现在每个词的几个词中。能够识别搭配有助于确定单词的含义。在我们之前的示例图像中,“trunk”可以有多种含义:

  • the main woody stem of a tree
  • the torso of a person or animal
  • a large box for holding travel items
  • the prehensile nose of an elephant
  • the storage compartment of a vehicle.

树的主要木质茎
人或动物的躯干
一个装旅行用品的大盒子
大象的鼻子
车辆的储藏室。
确定这句话中所用单词含义的唯一方法是查看周围的搭配。 “低音炮”通常与“汽车”一起出现,“后备箱”也是如此,因此根据上下文,“车辆储物箱”的定义可能是正确的答案。这正是 BERT 在查看句子时所做的。

它通过使用从预训练中学到的单词搭配来识别句子中每个单词的上下文。如果 BERT 单向阅读句子,则可能会错过识别低音炮和后备箱之间“汽车”的共享搭配。双向和整体查看句子的能力解决了这个问题。

BERT 使用变压器
BERT 的双向编码功能与转换器,这是有道理的。如果您还记得,BERT 中的“T”代表变压器。谷歌认为 BERT 是他们在变压器研究方面取得突破的结果。

谷歌将转换器定义为“处理与句子中所有其他单词相关的单词的模型,而不是按顺序一个接一个地处理。” Transformers 使用 Encoders 和 Decoders 来处理句子中单词之间的关系。 BERT 提取句子的每个单词,并赋予它单词含义的表示。每个单词的含义相互关联的强度由线条的饱和度来表示。

在下图的情况下,在左侧,“它”与“the”和“animal”的联系最紧密,在这种情况下识别“it”指的是什么。在右边,“it”与“street”的联系最为紧密。像这样的代词引用曾经是语言模型难以解决的主要问题之一,但 BERT 可以做到这一点

self attention diagram

来源 如果您是 NLP 爱好者,想知道什么是转换器及其工作原理背后的细节,您可以观看这段基于开创性文章的视频:Attention Is All You Need。

它们是一个很棒的视频和一篇优秀的论文(但老实说,它直接在我脑海中浮现)。对于我们其他麻瓜,BERT 背后的转换器的技术效果转化为更新,谷歌搜索可以更好地理解搜索结果背后的上下文,也就是用户意图。

BERT 使用掩码语言模型 (MLM)
BERT 的训练包括使用 Masked Language Modeling 预测句子中的单词。它的作用是掩盖句子中 15% 的单词,如下所示:

What do [MASK] eat other than bamboo?


然后,BERT 必须预测被掩码的词是什么。这做了两件事:它在单词上下文中训练 BERT,它提供了一种衡量 BERT 学习量的方法。被屏蔽的词阻止 BERT 学习复制和粘贴输入。

其他参数,例如向右移动解码器、下一个句子预测或回答上下文,有时是无法回答的问题也可以这样做。 BERT 提供的输出将表明 BERT 正在学习和实施其关于单词​​上下文的知识。

BERT 有什么影响?
这对搜索意味着什么?像 BERT 那样使用转换器双向映射查询尤为重要。

这意味着算法正在考虑诸如介词之类的单词背后的细微但有意义的细微差别,这些细微差别可能会极大地改变查询背后的意图。以这两个不同的搜索页面结果为例。我们将继续我们早期的熊猫和竹子主题。

关键字是:What do pandas eat other than bamboo

google search what do pandas eat other than bamboo

Panda bamboo

google search panda bamboo

请注意结果页面非常相似?几乎一半的有机结果是相同的,人们也问 (PAA) 部分有一些非常相似的问题。但是,搜索意图非常不同。

“熊猫竹”的范围很广,所以很难确定其意图,但它可能在想熊猫的竹子饮食。搜索页面非常好。另一方面,“熊猫除了竹子还吃什么”的搜索意图非常具体,搜索页面上的结果完全错过了。

唯一接近达到意图的结果可能有两个 PAA 问题:

大熊猫吃什么肉?
只吃竹子的大熊猫如何生存?
可以说是 Quora 的两个问题,其中一个很有趣:

可以训练熊猫吃竹子以外的食物吗?
熊猫吃人吗?
苗条的采摘,确实。在此搜索查询中,“其他”一词在搜索意图的含义中起着重要作用。在 BERT 更新之前,Google 的算法在返回信息时会定期忽略诸如“other than”之类的功能/填充词。

这导致搜索页面无法匹配像这样的搜索意图。由于 BERT 仅影响 10% 的搜索查询,因此在撰写本文时左侧页面并未受到 BERT 的影响也就不足为奇了。 Google 在其 BERT 解释页面上提供的这个示例显示了 BERT 如何影响搜索结果:

can you get medicine for someone pharmacy before and after

精选片段
BERT 将产生的最重要影响之一将是精选片段。精选片段是有机的,并且依赖于机器学习算法,而 BERT 完全符合要求。精选片段结果最常从第一个搜索结果页面中提取,但现在可能会有一些例外。

因为它们是有机的,很多因素都可以使它们发生变化,包括像 BERT 这样的新算法更新。使用 BERT,影响精选片段的算法可以更好地分析搜索查询背后的意图,并更好地将搜索结果与它们匹配。 BERT 也很可能能够获取冗长的结果文本,找到核心概念,并将内容总结为特色片段。

国际搜索
由于语言具有相似的基本语法规则,BERT 可以提高翻译的准确性。 BERT 每次学习翻译一种新语言时,都会获得新的语言技能。这些技能可以转移并帮助 BERT 翻译它从未见过的更高精度的语言。

如何针对 BERT 优化我的网站?
现在我们遇到一个大问题:如何针对 Google BERT 进行优化?简短的回答?

你不能。 BERT 是一个人工智能框架。它利用它获得的每一条新信息进行学习。

它处理信息和做出决策的速度意味着即使是 BERT 的开发人员也无法预测 BERT 将做出的选择。很可能,BERT 甚至不知道它为什么会做出这样的决定。如果它不知道,那么 SEO 就无法直接针对它进行优化。

但是,您可以在搜索页面中进行排名的方法是继续生成符合搜索意图的人性化内容。 BERT 的目的是帮助 Google 了解用户意图,因此针对用户意图进行优化将针对 BERT 进行优化。

所以,做你一直在做的事情。
研究你的目标关键词。
关注用户并生成他们想要看到的内容。
最终,当你写内容时,问问自己:

我的读者能否在我的内容中找到他们正在寻找的内容?

作者 east

1 2 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?
  • C++ 中避免悬挂引用的企业策略有哪些?
  • 嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
  • C++如何在插件式架构中使用反射实现模块隔离?
  • C++如何追踪内存泄漏(valgrind/ASan等)并定位到业务代码?
  • C++大型系统中如何组织头文件和依赖树?

文章归档

  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (43)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (4)
  • 大数据开发 (488)
    • CDH (6)
    • datax (4)
    • doris (30)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (40)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (99)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (70)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (6)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.