ChatGPT 背后的“功臣”——RLHF 技术详解

OpenAI 推出的 ChatGPT 对话模型掀起了新的 AI 热潮,它面对多种多样的问题对答如流,似乎已经打破了机器和人的边界。这一工作的背后是大型语言模型 (Large Language Model,LLM) 生成领域的新训练范式:RLHF (Reinforcement Learning from Human Feedback) ,即以强化学习方式依据人类反馈优化语言模型。

过去几年里各种 LLM 根据人类输入提示 (prompt) 生成多样化文本的能力令人印象深刻。然而,对生成结果的评估是主观和依赖上下文的,例如,我们希望模型生成一个有创意的故事、一段真实的信息性文本,或者是可执行的代码片段,这些结果难以用现有的基于规则的文本生成指标 (如 BLUE 和 ROUGE) 来衡量。除了评估指标,现有的模型通常以预测下一个单词的方式和简单的损失函数 (如交叉熵) 来建模,没有显式地引入人的偏好和主观意见。

如果我们 用生成文本的人工反馈作为性能衡量标准,或者更进一步用该反馈作为损失来优化模型,那不是更好吗?这就是 RLHF 的思想:使用强化学习的方式直接优化带有人类反馈的语言模型。RLHF 使得在一般文本数据语料库上训练的语言模型能和复杂的人类价值观对齐。

看看 ChatGPT 是如何解释 RLHF 的:

ChatGPT 解释的很好,但还没有完全讲透;让我们更具体一点吧!

RLHF 技术分解

RLHF 是一项涉及多个模型和不同训练阶段的复杂概念,这里我们按三个步骤分解:

  1. 预训练一个语言模型 (LM) ;

  2. 聚合问答数据并训练一个奖励模型 (Reward Model,RM) ;

  3. 用强化学习 (RL) 方式微调 LM。

Step 1. 预训练语言模型

首先,我们使用经典的预训练目标训练一个语言模型。对这一步的模型,OpenAI 在其第一个流行的 RLHF 模型 InstructGPT 中使用了较小版本的 GPT-3; Anthropic 使用了 1000 万 ~ 520 亿参数的 Transformer 模型进行训练;DeepMind 使用了自家的 2800 亿参数模型 Gopher。

这里可以用额外的文本或者条件对这个 LM 进行微调,例如 OpenAI 对 “更可取” (preferable) 的人工生成文本进行了微调,而 Anthropic 按 “有用、诚实和无害” 的标准在上下文线索上蒸馏了原始的 LM。这里或许使用了昂贵的增强数据,但并不是 RLHF 必须的一步。由于 RLHF 还是一个尚待探索的领域,对于” 哪种模型” 适合作为 RLHF 的起点并没有明确的答案。

接下来,我们会基于 LM 来生成训练奖励模型 (RM,也叫偏好模型) 的数据,并在这一步引入人类的偏好信息。

Step 2. 训练奖励模型

RM 的训练是 RLHF 区别于旧范式的开端。这一模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好。我们可以用端到端的方式用 LM 建模,或者用模块化的系统建模 (比如对输出进行排名,再将排名转换为奖励) 。这一奖励数值将对后续无缝接入现有的 RL 算法至关重要。

关于模型选择方面,RM 可以是另一个经过微调的 LM,也可以是根据偏好数据从头开始训练的 LM。例如 Anthropic 提出了一种特殊的预训练方式,即用偏好模型预训练 (Preference Model Pretraining,PMP) 来替换一般预训练后的微调过程。因为前者被认为对样本数据的利用率更高。但对于哪种 RM 更好尚无定论。

关于训练文本方面,RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。Anthropic 的数据主要是通过 Amazon Mechanical Turk 上的聊天工具生成的,并在 Hub 上可用 (http://huggingface.co/datasets/Anthropic/hh-rlhf),而 OpenAI 使用了用户提交给 GPT API 的 prompt。

关于训练奖励数值方面,这里需要人工对 LM 生成的回答进行排名。起初我们可能会认为应该直接对文本标注分数来训练 RM,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音。通过排名可以比较多个模型的输出并构建更好的规范数据集。

对具体的排名方式,一种成功的方式是对不同 LM 在相同提示下的输出进行比较,然后使用 Elo 系统建立一个完整的排名。这些不同的排名结果将被归一化为用于训练的标量奖励值。

这个过程中一个有趣的产物是目前成功的 RLHF 系统使用了和生成模型具有 不同 大小的 LM (例如 OpenAI 使用了 175B 的 LM 和 6B 的 RM,Anthropic 使用的 LM 和 RM 从 10B 到 52B 大小不等,DeepMind 使用了 70B 的 Chinchilla 模型分别作为 LM 和 RM) 。一种直觉是,偏好模型和生成模型需要具有类似的能力来理解提供给它们的文本。

接下来是最后一步:利用 RM 输出的奖励,用强化学习方式微调优化 LM。

Step 3. 用强化学习微调

长期以来出于工程和算法原因,人们认为用强化学习训练 LM 是不可能的。而目前多个组织找到的可行方案是使用策略梯度强化学习 (Policy Gradient RL) 算法、近端策略优化 (Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数。因为微调整个 10B~100B+ 参数的成本过高 (相关工作参考低秩适应 LoRA 和 DeepMind 的 Sparrow LM) 。PPO 算法已经存在了相对较长的时间,有大量关于其原理的指南,因而成为 RLHF 中的有利选择。

事实证明,RLHF 的许多核心 RL 进步一直在弄清楚如何将熟悉的 RL 算法应用到更新如此大的模型。

让我们首先将微调任务表述为 RL 问题。首先,该策略 (policy) 是一个接受提示并返回一系列文本 (或文本的概率分布) 的 LM。这个策略的行动空间 (action space) 是 LM 的词表对应的所有词元 (一般在 50k 数量级) ,观察空间 (observation space) 是可能的输入词元序列,也比较大 (词汇量 ^ 输入标记的数量) 。奖励函数是偏好模型和策略转变约束 (Policy shift constraint) 的结合。

PPO 算法确定的奖励函数具体计算如下:将提示  输入初始 LM 和当前微调的 LM,分别得到了输出文本 ,将来自当前策略的文本传递给 RM 得到一个标量的奖励 。将两个模型的生成文本进行比较计算差异的惩罚项,在来自 OpenAI、Anthropic 和 DeepMind 的多篇论文中设计为输出词分布序列之间的 Kullback–Leibler (KL) 散度的缩放,即  。这一项被用于惩罚 RL 策略在每个训练批次中生成大幅偏离初始模型,以确保模型输出合理连贯的文本。如果去掉这一惩罚项可能导致模型在优化中生成乱码文本来愚弄奖励模型提供高奖励值。此外,OpenAI 在 InstructGPT 上实验了在 PPO 添加新的预训练梯度,可以预见到奖励函数的公式会随着 RLHF 研究的进展而继续进化。

最后根据 PPO 算法,我们按当前批次数据的奖励指标进行优化 (来自 PPO 算法 on-policy 的特性) 。PPO 算法是一种信赖域优化 (Trust Region Optimization,TRO) 算法,它使用梯度约束确保更新步骤不会破坏学习过程的稳定性。DeepMind 对 Gopher 使用了类似的奖励设置,但是使用 A2C (synchronous advantage actor-critic) 算法来优化梯度。

作为一个可选项,RLHF 可以通过迭代 RM 和策略共同优化。随着策略模型更新,用户可以继续将输出和早期的输出进行合并排名。Anthropic 在他们的论文中讨论了迭代在线 RLHF,其中策略的迭代包含在跨模型的 Elo 排名系统中。这样引入策略和 RM 演变的复杂动态,代表了一个复杂和开放的研究问题。


RLHF 的未来

尽管 RLHF 取得了一定的成果和关注,但依然存在局限。这些模型依然会毫无不确定性地输出有害或者不真实的文本。这种不完美也是 RLHF 的长期挑战和动力 —— 在人类的固有领域中运行意味着永远不会到达一个完美的标准。

收集人类偏好数据的质量和数量决定了 RLHF 系统性能的上限。RLHF 系统需要两种人类偏好数据:人工生成的文本和对模型输出的偏好标签。生成高质量回答需要雇佣兼职人员 (而不能依赖产品用户和众包) 。另一方面,训练 RM 需要的奖励标签规模大概是 50k 左右,所以并不那么昂贵 (当然远超了学术实验室的预算) 。目前相关的数据集只有一个基于通用 LM 的 RLHF 数据集 (来自 Anthropic) 和几个较小的子任务数据集 (如来自 OpenAI 的摘要数据集) 。另一个挑战来自标注者的偏见。几个人类标注者可能有不同意见,导致了训练数据存在一些潜在差异。

除开数据方面的限制,一些有待开发的设计选项可以让 RLHF 取得长足进步。例如对 RL 优化器的改进方面,PPO 是一种较旧的算法,但目前没有什么结构性原因让其他算法可以在现有 RLHF 工作中更具有优势。另外,微调 LM 策略的一大成本是策略生成的文本都需要在 RM 上进行评估,通过离线 RL 优化策略可以节约这些大模型 RM 的预测成本。最近,出现了新的 RL 算法如隐式语言 Q 学习 (Implicit Language Q-Learning,ILQL) 也适用于当前 RL 的优化。在 RL 训练过程的其他核心权衡,例如探索和开发 (exploration-exploitation) 的平衡也有待尝试和记录。探索这些方向至少能加深我们对 RLHF 的理解,更进一步提升系统的表现。


参考资料

首先介绍一些相关的开源工作:

关于 RLHF 的第一个项目,来自 OpenAI:
http://github.com/openai/lm-human-preferencesy

一些 PyTorch 的 repo:

  • http://github.com/lvwerra/trl

  • http://github.com/CarperAI/trlx

  • http://github.com/allenai/RL4LMs

此外,Huggingface Hub 上有一个由 Anthropic 创建的大型数据集:
http://huggingface.co/datasets/Anthropic/hh-rlhf

相关论文包括在现有 LM 前的 RLHF 进展和基于当前 LM 的 RLHF 工作:

  • TAMER: Training an Agent Manually via Evaluative Reinforcement (Knox and Stone 2008)

  • Interactive Learning from Policy-Dependent Human Feedback (MacGlashan et al. 2017)

  • Deep Reinforcement Learning from Human Preferences (Christiano et al. 2017)

  • Deep TAMER: Interactive Agent Shaping in High-Dimensional State Spaces (Warnell et al. 2018)

  • Fine-Tuning Language Models from Human Preferences (Zieglar et al. 2019)

  • Learning to summarize with human feedback (Stiennon et al., 2020)

  • Recursively Summarizing Books with Human Feedback (OpenAI Alignment Team 2021)

  • WebGPT: Browser-assisted question-answering with human feedback (OpenAI, 2021)

  • InstructGPT: Training language models to follow instructions with human feedback (OpenAI Alignment Team 2022)

  • GopherCite: Teaching language models to support answers with verified quotes (Menick et al. 2022)

  • Sparrow: Improving alignment of dialogue agents via targeted human judgements (Glaese et al. 2022)

  • ChatGPT: Optimizing Language Models for Dialogue (OpenAI 2022)

  • Scaling Laws for Reward Model Overoptimization (Gao et al. 2022)

  • Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback (Anthropic, 2022)

  • Red Teaming Language Models to Reduce Harms: Methods, Scaling Behaviors, and Lessons Learned (Ganguli et al. 2022)

  • Dynamic Planning in Open-Ended Dialogue using Reinforcement Learning (Cohen at al. 2022)

  • Is Reinforcement Learning (Not) for Natural Language Processing?: Benchmarks, Baselines, and Building Blocks for Natural Language Policy Optimization (Ramamurthy and Ammanabrolu et al. 2022)

本文翻译自 Hugging Face 官方博客 (http://huggingface.co/blog/rlhf)
参考资料部分链接请点击阅读原文到博客上查看。你也可以查看我们的直播活动回放了解更多: RLHF: From Zero to ChatGPT

本文译者:

李泺秋,浙江大学计算机科学硕士,主要研究 NLP 领域。

本文转载于网络 如有侵权请联系删除

相关文章

  • 接口测试平台番外翻页功能

    可能是平台目前在一些公司已经进行大规模应用的缘故,很多因量变引起质变的问题也相继出现,比如接口库的接口过多,一页暂时不全,就想做分页显示这个功能。正巧最近接到一些反馈分页的需求,就打算插入一节来实现下。 分页功能开发之前大家要先明白一个原理,我们目前的接口数据,进入接口库的时候,是全部从数据库拿出来,一次性都送给前端html模版的。当接口数过多的时候,难免引起渲染卡顿,显示缓慢,搜索困难,眼花缭乱等问题。 但是分页功能绝对不仅仅是简单的前端展示效果。而是在后端就进行了分页处理,有种说法叫异步加载。当然今天我们讲的方法是不是大家可以自己偷偷验证哦~ 我们先在views.py中的child_json中找到控制接口库的接口列表。看到其中的apis了么,这就是我们所有的该项目接口了。现在我们要在它身上动手脚,让其变成分页的状态。不过我们需要借助一个第三方方法,Paginator,所以先用pip3来下载它: 然后在views.py顶部导入:(这里要吐槽下网络上的很多博客教程,从来不给你说导入语句,上来就用,这导致很多新人压根不知道要怎么导入,简直就是为了宣传自己而写博客,从来不站在初学者读者的角

  • 夯实基础:Go 语言结构体和方法的应用实践

    前文回顾 前面的文章主要介绍了Go语言中函数和接口相关的使用实践。与C语言类似,Go语言提供结构体类型。结构体作为一种复合类型,由多个字段组成,每个字段都具备自己的类型和值,结构体和字段可以理解为实体和实体对应的属性。在Go语言中,不仅结构体可以拥有方法,每一种自定义类型都可以拥有方法。本文将会开始介绍结构体和方法。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。首先了解下结构体的定义。结构体的定义配合使用type和struct关键字,可以自定义结构体。Go语言的type关键字可以将各种基本类型定义为自定义类型,结构体中可以复合多种基本类型和结构体,更便于使用。结构体的定义样式如下所示:typestructNamestruct{ value1valueType1 value2valueType2 ... } 复制结构体的名称在同一个包内不能重复,如果希望结构体在包外也能够被访问,结构体的首字母需要大小。结构体中字段名必须唯一,如果字段是公开的,字段名的首字母同样需要大写。我们尝试定义一个简单的结构体Person,它具备姓名、生日、身份证号等字段,代码如下所示:typePer

  • 网站服务器用什么配置 想要做好网站还要注意些什么

    现如今有很多公司都会创建自己的网站,而在创建网站的时候也会去运营商租用相关的服务器,如果没有服务器,作为后台支撑网站也没办法建立出来,那么一般网站服务器用什么配置?要想做好一个网站还需要注意些什么呢?网站服务器用什么配置网站服务器用什么配置网站服务器用什么配置?对于想构建网站的人来讲网站专用服务器要选对。首先就是关于服务器的运营商,如果没有好的运营商,那么就会导致各种数据信号的问题,网络不稳定和数据错误,这些都是常见现象,找一个靠谱的运营商能够很好的解决这些问题。再有就是机器的适配问题,有些服务器看似功能强大,但是所服务的机型也是非常小众的,而一些普遍大众机型根本无法使用,所以要找到适合自己机器使用的设备。除此之外还有安全问题,在安全这方面也是需要在挑选网站服务器时注意的,毕竟网站的访问人数众多,如果造成了数据隐私的泄露,这将是对网站非常有害的事情。想要做好网站还要注意些什么想要做好一个网站,除了对于服务器要挑选好适合自己的以外,在网站后期的维护方面也要做到面面俱到,因为网站不是在构建完成之后就万事大吉了,在后边还需要很多的维护工作,如果没有很好的维护,那么就会出现各种各样的问题,有可

  • 用Python复现一篇Nature的研究: 1.数据下载及预处理

    用Python从头到尾复现一篇Nature的工作:1.数据下载及预处理作者:Vector邮箱:mzll1202@163.comQQ:1192684038前言本篇文章将从数据下载、处理、神经网络训练、画图四个大步骤叙说笔者在复现Deeplearningformulti-yearENSOforecasts这篇文章的工作。所涉及Python库有wget,matplotlib,numpy,xarray,pytorch等一系列在深度学习以及气象数据处理中经常使用的函数库,希望这篇文章能够对大家有所帮助。笔者也只是大学二年级的本科生,做这些东西也只是凭借个人兴趣,水平低下、错误频出也是常有的事情,请大家见谅。Nature文章二维码链接:https://www.nature.com/articles/s41586-019-1559-7简单介绍一下这篇文章,这篇文章主要是用seasurfacetemp和seasurfaceheight来预测Nino3.4区的海温(一个厄尔尼诺指数)。此文使用的神经网络、数据的处理都不是很复杂,适合作为气象神经网络入门的第一个尝试性工作。本文是复现工作的第一篇文章,主要

  • Intellij IDEA 的 Soft-wrap 是什么

    如果你打算使用IntelliJIDEA来创建和书写技术文档的时候。在IntelliJIDEA第一次导入的时候在文档的最上面有一个提示为是否启用Soft-wrap。Soft-wrapSoft-wrap直译就是软包的意思。在编辑器中软包?没有明白对吧。其实非常简单的理解就是在编辑器对文档进行编写的时候,如果启用了Soft-wrap,能够帮助你进行软分行,或者说是折行。看下图:我们可以看到底248行非常长,已经超过了编辑器的可视范围。如果你需要对这行进行编辑的时候,你可能需要使用编辑器的左右移动对话框,这样会增加鼠标的使用降低书写效率。这个时候,你可以在左侧的行代码中,单击鼠标的右键,然后选择Soft-wrap。然后你再看看IntelliJIDEA的编辑界面,你会发现地248行IntelliJIDEA已经帮你自动折行了。如果你调制IntelliJIDEA的编辑框大小,你会发现这个折行会根据编辑框的大小自动进行调整。在对MD文件或者其他技术文档进行编辑的时候,这个自动软折行的功能还是能够帮助你降低鼠标使用率,增加文件输入的效率。https://www.ossez.com/t/intellij-

  • HTML学习

    HTML学习HTML是网页内容的载体,用户浏览的信息。CSS样式是表现,如标题字体,颜色变化等。JavaScript是用来实现网页上的特效效果。HTML标签<HTML>根标签 所有的网页标签都在里面 <head>文档头部 用于定义文档的头部,是鄋头部元素的容器,有<title>、<scrip>、<style>、<link>、<meta>等标签 <body>文档主体 之间的内容是网页的主要内容,如<h1>、<p>、<a>、<img>等网页内容标签,标签中的内容会在浏览器中显示出来 <hx>标题标签(x为1-6,共六级标题) <div>块级标签 可以划分出独立的逻辑部分 <p>段落标签 <imgsrc=”图片路径”>图片标签 1、scr:表示图像的位置; 2、alt:指定图像的描述性文本,当图像不可见时(下载不成功时),可看到该属性指定的文本; 3、提供在图像可见时对图像的描述(鼠标滑过图片时

  • Android中高级面试题持续助攻:图解Android Binder机制

    前言Binder做为Android中核心机制,对于理解Android系统是必不可少的,关于binder的文章也有很多,但是每次看总感觉看的不是很懂,到底什么才是binder机制?为什么要使用binder机制?binder机制又是怎样运行的呢?这些问题只是了解binder机制是不够的,需要从Android的整体系统出发来分析,在我找了很多资料后,真正的弄懂了binder机制,相信看完这篇文章大家也可以弄懂binder机制。1、Binder是什么?要理解binder,先要知道IPC,Inter-processcommunication,也就是进程中相互通信,Binder是Android提供的一套进程间相互通信框架。用来多进程间发送消息,同步和共享内存。已有的进程间通信方式有一下几种:1、Files文件系统(包括内存映射) 2、Sockets 3、Pipes管道 4、共享内存 5、Intents,ContentProviders,Messenger 6、BinderAndroid系统中的Binder框架图如下:拿Activity举例从上图可以看出来:Activity是由ActivityMan

  • 量子逻辑合成中CNOT电路的最佳空间-深度交错

    作者:JiaqingJiang,XiaomingSun,Shang-HuaTeng,BujiaoWu,KewenWu,JialinZhang摘要:由于量子计算机的最先进的物理实现的退相干,因此必须并行化量子电路以减小其深度。二十年前,摩尔等人。证明了额外的量子位(或ancillae)可用于为量子算子设计“浅”并联电路。他们证明任何n-qubitCNOT电路都可以并行化为O(logn)深度,具有O(n2)ancillae。然而,近期量子技术只能支持有限数量的量子比特,使得空间深度权衡成为量子电路综合的基础研究课题。在这项工作中,我们为CNOT电路的设计建立了渐近最优的空间-深度权衡。我们证明,对于任何m≥0,任何n-qubitCNOT电路都可以并行化为O(max{logn,n2(n+m)log(n+m)})深度,具有O(m)ancillae。我们通过计数参数表明这个界限是紧的,并且进一步表明即使使用任意的双量子比特量子门来近似CNOT电路,深度下限仍然符合我们的结构,说明了我们的结果的稳健性。我们的工作改进了之前的两个结果,一个由Moore等人提出。用于O(logn)-深度量子合成,以及

  • 为什么单线程Redis性能也很出色

    高性能的服务器,不一定是多线程实现的,也就是说多线程不一定比单线程效率高,这得分具体的情况。以redis为例,核心处理请求的线程只有一个,所以我们常常理解其仅仅只有一个线程,但准确来说其实并不是单线程的,比如日志的备份需要单独的fork一个进程或者线程去做备份等,那么redis何来单线程还能达到如此10万+的qps呢?其实这取决于具体的实现,redis采用了基于高性能Reactor的IO多路复用的模式+内存数据结构+单线程处理网络请求这几块,决定了其性能高的原因。 我们知道操作系统的主要资源有CPU,内存,磁盘,带宽,而对存储介质访问速度肯定是CPU缓存>内存>磁盘。引用阿里大神沈询说的一段话:redis核心就是如果我的数据全都在内存里,我单线程的去操作就是效率最高的,为什么呢,因为多线程的本质就是CPU模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis用单个进程或者线程绑定一块CPU,从而最大化提升该进程访问特定CPU缓存的速度,然后针对这块Cache内存的数据进行多次读写的时候,

  • GCD 概念解释方法:

    概念解释1.执行任务的函数:在GCD中,任务是通过block来封装的,并且任务的block没有参数也没有返回值。同步:你必须把我的代码执行完你再走,一定要执行完同步里的代码再执行下面的代码voiddispatch_sync(dispatch_queue_tqueue,dispatch_block_tblock);复制异步:你先走执行我下面的代码,我找人、找线程去执行我里面的代码voiddispatch_async(dispatch_queue_tqueue,dispatch_block_tblock);复制2.GCD使用步骤:第一步:创建/获取队列 第二步:创建任务,确定要做的事情 第三步:将任务添加到队列中 (1)GCD会自动将队列中的任务取出,放到对应的线程中执行 (2)任务的取出遵循队列的FIFO原则:先进先出,后进后出3.队列包括:串行队列、并发队列、主队列、全局队列1.串行队列(SerialDispatchQueue)串行队列的特点: 以先进先出的方式,按顺序调度队列中的任务去执行,一次只能调度一个任务。 无论队列中所指定的执行任务的函数是同步还是异步,都必须等待前一个任务执

  • JavaWeb核心之ServletContext

    3ServletContext3.1ServletContext概述3.1.1基本介绍ServletContext对象,它是应用上下文对象。每一个应用有且只有一个ServletContext对象。它可以实现让应用中所有Servlet间的数据共享。3.1.2生命周期出生——活着——死亡出生:应用一加载,该对象就被创建出来了。一个应用只有一个实例对象。(Servlet和ServletContext都是单例的)活着:只要应用一直提供服务,该对象就一直存在。死亡:应用被卸载(或者服务器挂了),该对象消亡。3.1.3域对象概念域对象的概念,它指的是对象有作用域,即有作用范围。域对象的作用,域对象可以实现数据共享。不同作用范围的域对象,共享数据的能力不一样。在Servlet规范中,一共有4个域对象。今天我们讲解的ServletContext就是其中一个。它也是我们接触的第一个域对象。它是web应用中最大的作用域,叫application域。每个应用只有一个application域。它可以实现整个应用间的数据共享功能。3.2ServletContext的使用3.21ServletContext介绍S

  • 你买的课程看了吗?

    前段时间《极客时间》做企业权益活动的时候,我和其它同事购买了一批课程。但每门课程只能学习30天,就写了个脚本(详情可以看另一篇文章:[](https://www.cnblogs.com/tester-xt/p/12893060.html)),把课程保存到了本地(Markdown或HTML文本)。 保存下来的极客时间课程 这一批课程保存下来后基本上都躺在磁盘里没动过了(和网盘中躺着的一堆学习资料同样的命运),主要是使用电脑时没有较多时间来看这些课程。于是就有想过把这些课程放到手机上,利用一些碎片时间用手机学习这些课程,但是把这些文档直接放到手机上查看也不太方便(在手机上找了个Markdown文档软件体验了下也不太好)。 尝试过无法用现有软件更好的学习这些课程后,就考虑着是不是可以像极客时间官方一样,把这些课程放到一个服务器上,然后在手机上用网页获取这些课程的信息然后展示。照着这个思路,利用业余时间去实现了下,发现还真可以达到我的目的,在手机上用网页查看这些课程的信息并且能正常播放各个课程的音频文件,下面就来大概介绍下。 怎么做的 整体思路还是按前面说的,把这些课程资源文件放到服务器里面,

  • 工控机网络配置记录

    工控机:ubuntu16.04,两个有线网,一个无线网 问题:插了有线网后无线网上不了网,原因ubuntu系统优先使用有线网的网关,解决办法,有线网不设置网关,无线网就可以上外网了 /etc/network/interface配置如下 autoenp1s0ifaceenp1s0inetstaticaddress192.168.1.102netmask255.255.255.0broadcast192.168.1.255autoenp2s0ifaceenp2s0inetstaticaddress192.168.2.102netmask255.255.255.0broadcast192.168.2.255 如果两个有线网设置为同一个网段会出现,一个网口可以ping通两个ip,另外一个网口两个ip都ping不通,所以将两个网口设置成了不同的网段

  • 关于在安装wampserver出现“由于找不到msvcr110.dll”的问题的解决办法

    按着下面的链接下载相应的文件安装“https://jingyan.baidu.com/album/4f7d57129fa86e1a201927de.html?picindex=2” 如果安装完成以后问题解决了,就好。如果没有解决便确认一下自己的wampserver的版本是32的还是64的,再重新在上面的链接里下载相应的版本安装以后就可以解决。

  • 快速阅读《构建之法》及问题汇总(不定时更新)

    第一章概论 问题一:什么是Bug?什么样的问题才算Bug? 解答: 去百度里搜了一下 程序设计方面的解释 所谓“Bug”,是指电脑系统的硬件、系统软件(如操作系统)或应用软件(如文字处理软件)出错。硬件的出错有两个原因,一是设计错误,一是硬件部件老化失效等。 软件的Bug,狭义概念是指软件程序的漏洞或缺陷,广义概念除此之外还包括测试工程师或用户所发现和提出的软件可改进的细节、或与需求文档存在差异的功能实现等。 知乎里比较认可的回答 和预期不一致的软件行为。 一个软件行为既可能是bug也可能不是bug,那是因为预期的主体千姿百态。 和测试员预期不一致的软件行为。 和程序员预期不一致的软件行为。 和文档预期不一致的软件行为。 和管理者预期不一致的软件行为。 和客户预期不一致的软件行为。 问题二:什么是软件?APP是软件吗? 解答: 上网查了一下,真的是众说纷纭…百度说“是安装在智能手机上的软件”,有网友说“app不是一款软件,是智能手机的第三方应用程序的统称” 但比较赞同把手机应用程序叫做APP(应用),而不是像电脑应用程序一样叫做Software(软件),这样的惯称是怎么形

  • setw

    设置输出宽度 靠左cout<<left<<setw(xxxx) 靠右同理

  • 排序算法时间空间复杂度比较

    排序法  平均时间 最差情形 稳定度 额外空间 备注 冒泡  O(n2)   O(n2)  稳定 O(1) n小时较好 交换   O(n2)   O(n2) 不稳定 O(1) n小时较好 选择  O(n2)  O(n2) 不稳定 O(1) n小时较好 插入  O(n2)  O(n2) 稳定 O(1) 大部分已排序时较好 基数 O(logRB) O(logRB) 稳定 O(n) B是真数(0-9), R是基数(个十百) Shell O(nlogn) O(ns)1<s<2 不稳定 O(1) s是所选分组 快速 O(nlogn) O(n2) 不稳定 O(nlogn) n大时较好 归并 O(nlogn) O(nlogn) 稳定 O(1) n大时较好 堆 O(nlogn) O(nlogn) 不稳定 O(1) n大时较好

  • 让vs IIS Express支持本地静态Json文件

    根据前辈的解决方案是IISExpress没有配置Json文件的处理程序,只要增加对应配置即可,IISExpress对应配置文件夹为:   “%UserProfile%\Documents\IISExpress\config\“ 找到applicationhost.config文件 location同一级的system.webServer节点下有个"staticContent"节点,节点里是mime类型列表,这个不是静态内容列表么,IIS对静态对允许的静态内容不是直接下载的么,那JSON文件也应该像JS文件一样直接下载的。在对于js类型文件后面增加一个对于json文件的配置: <staticContentlockAttributes="isDocFooterFileName"> <!--新增的--> <mimeMapfileExtension=".json"mimeType="application/javascript"/> <!--已有的--> <mimeMapfileExtension=".js"mimeType="appli

  • 学习笔记TF036:实现Bidirectional LSTM Classifier

    双向循环神经网络(BidirectionalRecurrentNeuralNetworks,Bi-RNN),Schuster、Paliwal,1997年首次提出,和LSTM同年。Bi-RNN,增加RNN可利用信息。普通MLP,数据长度有限制。RNN,可以处理不固定长度时序数据,无法利用历史输入未来信息。Bi-RNN,同时使用时序数据输入历史及未来数据,时序相反两个循环神经网络连接同一输出,输出层可以同时获取历史未来信息。 LanguageModeling,不适合Bi-RNN,目标是通过前文预测下一单词,不能将下文信息传给模型。分类问题,手写文字识别、机器翻译、蛋白结构预测,Bi-RNN提升模型效果。百度语音识别,通过Bi-RNN综合上下文语境,提升模型准确率。 Bi-RNN网络结构核心,普通单向RNN拆成两个方向,随时序正向,逆时序反赂。当前时间节点输出,同时利用正向、反向两个方向信息。两个不同方向RNN不共用state,正向RNN输出state只传给正向RNN,反向RNN输出state只传给反向RNN,正反向RNN没有直接连接。每个时间节点输入,分别传给正反向RNN,根据各自状态产生

  • 双馈风机通过串补并网的次同步振荡

    背景:最近要交一个核心论文的差,简单的串联补偿却无能为力,无奈之下只得找高级的理论和算法,就看到了去年的相关的硕士论文,只有拿来搏一搏了 其中扯上了双馈电机和电力系统的次同步振荡的理论,很有挑战性啊。 理论:    1双馈电机:        电机理论:双馈电机模型,同步电机理论         电力电子:PWM控制,AC-DC-AC变换器         控制理论:PI控制,矢量控制     2次同步振荡: 小信号分析  特征值分析 结果:   风机搭不出来,改做了PWM优化 生命之树常青葱,而理论总朦胧!

  • 不一样的双十一,移动云走进生活,开启不一样的篇章

    才开始,一台小巧的诺基亚按键机便能让你开心许久 随后触摸屏手机的问世 仿佛为你打开新世界的大门 而智能手机这一类的高端电子产品的一声平地惊雷 让你以为这将是这一行业的巅峰   但是移动云不一样 它将让你见识到什么叫做精妙绝伦 它将成为 屠龙勇士手中的屠龙利刃 IT行业“云上”的不可缺一   不论是“云上”,还是“上云” 不同凡响的“移动云”都在这个一样的双十一    01、每一个顶级极客身后,都有一款可靠稳定高性价比的云主机 行内人都知道,代码写得漂亮的,不一定是技术大咖,每天在同事们的目送中,背起双肩包准点下班的那位,也许才是隐藏在众多程序猿中间的“大佬”——因为他们有保证不加班的实力,更具备让自己免于加班之苦的“神器”。可以这样说,但一个程序员拥有了一台稳定、可靠、性价比高的 云主机以后,就相当于拥有了一个千兆光纤、骨干节点的BGP智能多线机房,而且能够让ta实现随时备份、恢复数据,二十四小时不停机的超强王牌,让一切工作都变得更安全、更稳定、价格更实惠。     02、“上云”是企业实现数字化转型的必经之路 当企业掌握

相关推荐

推荐阅读