2018年6月 GPT-1:【无监督预训练+有监督微调】
大量数据(约5GB文本)上无监督训练,然后针对具体任务在小的有监督数据集上做微调;
关键词:“scalable, task-agnostic system”;8个GPU上训练一个月;
预训练模型(1.1亿参数)可下载;Improving Language Understanding with Unsupervised Learning​openai.com/blog/language-unsupervised/

2019年2月 GPT-2:【纯无监督预训练】
大量数据(约40GB文本)上无监督训练,然后针对具体任务在小的有监督数据集上做微调,尝试在一些任务上不微调(即使结果离SOTA还远);
关键词“without task-specific training”;据说在256个Google Cloud TPU v3上训练,256刀每小时,训练时长未知[2];
预训练模型(15亿参数)最终公开可下载;https://openai.com/blog/better-language-models/​openai.com/blog/better-language-models/

2020年5月 GPT-3:【沿用了GPT-2的纯无监督预训练,但是数据大了好几个量级】
大量数据(499B tokens)上无监督训练,不微调就超越SOTA;
关键词“zero-shot, one-shot, few-shot”;训练据说话费1200万刀;1750亿参数,将会开放付费API。

2022.11月 GPT-3.5系列
InstructGPT【在GPT-3上用强化学习做微调,内核模型为PPO-ptx】
ChatGPT沿用了InstructGPT,但是数据大了好几个量级。
InstructGPT/ChatGPT都是采用了GPT-3的网络结构,通过指示学习构建训练样本来训练一个反应预测内容效果的奖励模型(RM),最后通过这个奖励模型的打分来指导强化学习模型的训练。

一 GPT–无监督学习

1.1 论文

《Improving Language Understanding by Generative Pre-Training》,GPT 是"Generative Pre-Training"的简称,从名字看其含义是指的生成式的预训练。

GPT 采用两阶段过程,第一个阶段是利用语言模型进行预训练(无监督形式),第二阶段通过 Fine-tuning 的模式解决下游任务(监督模式下)。

2.1 第一阶段

GPT 的预训练过程,其实和 ELMO 是类似的,主要不同在于两点:
特征抽取器不是用的 RNN,而是用的 Transformer,上面提到过它的特征抽取能力要强于 RNN,这个选择很明显是很明智的;
ELMO使用上下文对单词进行预测,而 GPT 则只采用 Context-before 这个单词的上文来进行预测,而抛开了下文。

GPT 使用 Transformer 的 Decoder 结构,并对 Transformer Decoder 进行了一些改动,原本的 Decoder 包含了两个 Multi-Head Attention 结构,GPT 只保留了 Mask Multi-Head Attention,如下图所示。

无监督预训练
给定一个无标签的序列 ,语言模型的优化目标是最大化下面的似然值:其中k 是滑动窗口的大小,p是条件概率, theta是模型的参数。这些参数使用SGD进行优化。

其中 U = ( u − k , … , u − 1 ) U=(u_{-k},\dots,u_{-1}) U=(uk,,u1)是当前时间片的上下文token,n是层数,We是词嵌入矩阵,Wp是位置嵌入矩阵。

2.2 第二阶段

在做下游任务的时候,利用第一步预训练好的参数初始化 GPT 的网络结构,这样通过预训练学到的语言学知识就被引入到你手头的任务里来了,这是个非常好的事情。再次,你可以用手头的任务去训练这个网络,对网络参数进行 Fine-tuning,【类似图像领域预训练的过程】

GPT 论文给了一个改造施工图如上:

对于分类问题,不用怎么动,加上一个起始和终结符号即可;
对于句子关系判断问题,比如 Entailment,两个句子中间再加个分隔符即可;
对文本相似性判断问题,把两个句子顺序颠倒下做出两个输入即可,这是为了告诉模型句子顺序不重要;
对于多项选择问题,则多路输入,每一路把文章和答案选项拼接作为输入即可。从上图可看出,这种改造还是很方便的,不同任务只需要在输入部分施工即可。

2.3 效果

GPT-1使用了BooksCorpus数据集[7],这个数据集包含 [公式] 本没有发布的书籍。作者选这个数据集的原因有二:1. 数据集拥有更长的上下文依赖关系,使得模型能学得更长期的依赖关系;2. 这些书籍因为没有发布,所以很难在下游数据集上见到,更能验证模型的泛化能力。

1.3.1 无监督训练
使用字节对编码(byte pair encoding,BPE),共有40000个字节对;
词编码的长度为 768;
位置编码也需要学习;
12层的transformer,每个transformer块有 12个头;
位置编码的长度是3072 ;
Attention, 残差,Dropout等机制用来进行正则化,drop比例为 0.1;
激活函数为GLEU;
训练的batchsize为64,学习率为2.5e-4,序列长度为512 ,序列epoch为100;
模型参数数量为1.17亿。
1.3.2 有监督微调
无监督部分的模型也会用来微调;
训练的epoch为3,学习率为6.25e-5,这表明模型在无监督部分学到了大量有用的特征。

在有监督学习的12个任务中,GPT-1在9个任务上的表现超过了state-of-the-art的模型。在没有见过数据的zero-shot任务中,GPT-1的模型要比基于LSTM的模型稳定,且随着训练次数的增加,GPT-1的性能也逐渐提升,表明GPT-1有非常强的泛化能力,能够用到和有监督任务无关的其它NLP任务中。GPT-1证明了transformer对学习词向量的强大能力,在GPT-1得到的词向量基础上进行下游任务的学习,能够让下游任务取得更好的泛化能力。对于下游任务的训练,GPT-1往往只需要简单的微调便能取得非常好的效果。
GPT-1在未经微调的任务上虽然也有一定效果,但是其泛化能力远远低于经过微调的有监督任务,说明了GPT-1只是一个简单的领域专家,而非通用的语言学家。

3.1、总结

GPT 预训练时利用上文预测下一个单词,ELMO和BERT (下一篇将介绍)是根据上下文预测单词,因此在很多 NLP 任务上,GPT 的效果都比 BERT 要差。但是 GPT 更加适合用于文本生成的任务,因为文本生成通常都是基于当前已有的信息,生成下一个单词。

优点
RNN所捕捉到的信息较少,而Transformer可以捕捉到更长范围的信息。
计算速度比循环神经网络更快,易于并行化
实验结果显示Transformer的效果比ELMo和LSTM网络更好
缺点
对于某些类型的任务需要对输入数据的结构作调整
对比bert,没有采取双向形式,削弱了模型威力

二 GPT2–多任务学习

基本是机器翻译,也进行了基本的人工矫正,凑活看吧
原论文:《Language Models are Unsupervised Multitask Learners》
原论文地址:https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf
OpenAI发布的一个小版本GPT-2:https://github.com/openai/gpt-2
官网:https://www.openai.com/blog/better-language-models/
原论文最后是一个十几页的附录,里面给出了GPT-2生成的一些例子,有兴趣的话可以阅读原论文。

其他资料:
https://www.jiqizhixin.com/articles/OpenAI-GPT-2
https://blog.csdn.net/u012526436/article/details/87882985
https://www.jianshu.com/p/874fd64584f5

GPT-2的目标旨在训练一个泛化能力更强的词向量模型,它并没有对GPT-1的网络进行过多的结构的创新与设计,只是使用了更多的网络参数和更大的数据集。下面我们对GPT-2展开详细的介绍。

GPT-2将所有NLP任务的输出转换成了和语言模型一样的方式,每轮只输出一个词。
假如是文本摘要类任务,那么GPT-2在输入的时候加“TL:DR”作为引导字符告诉模型这是文本摘要类任务。而模型的输出和语言模型是一样的,就是每轮输出一个词。当我们需要模型输出的结果是一句话或者几句话的时候,只需要将每轮输出的词连接起来就是我们想要的结果。GPT-2将所有NLP任务的输出转换成了和语言模型一样的方式,每轮只输出一个词。

2.1 GPT-2的核心思想

GPT-2的学习目标是使用无监督的预训练模型做有监督的任务。因为文本数据的时序性,一个输出序列可以表示为一系列条件概率的乘积:

基于上面的思想,作者认为,当一个语言模型的容量足够大时,它就足以覆盖所有的有监督任务,也就是说所有的有监督学习都是无监督语言模型的一个子集。例如当模型训练完“Micheal Jordan is the best basketball player in the history”语料的语言模型之后,便也学会了(question:“who is the best basketball player in the history ?”,answer:“Micheal Jordan”)的Q&A任务。
综上,GPT-2的核心思想概括为:任何有监督任务都是语言模型的一个子集,当模型的容量非常大且数据量足够丰富时,仅仅靠训练语言模型的学习便可以完成其他有监督学习的任务。

2.2 模型细节

同样使用了使用字节对编码构建字典,字典的大小为50257 ;
滑动窗口的大小为1024;
batchsize的大小为512;
Layer Normalization移动到了每一块的输入部分,在每个self-attention之后额外添加了一个Layer Normalization;
将残差层的初始化值用1/根号n 进行缩放,其中n是残差层的个数。
GPT-2训练了4组不同的层数和词向量的长度的模型,具体值见表2。通过这4个模型的实验结果我们可以看出随着模型的增大,模型的效果是不断提升的。

在8个语言模型任务中,仅仅通过zero-shot学习,GPT-2就有7个超过了state-of-the-art的方法;
在“Children’s Book Test”数据集上的命名实体识别任务中,GPT-2超过了state-of-the-art的方法约7%;
“LAMBADA”是测试模型捕捉长期依赖的能力的数据集,GPT-2将困惑度从99.8降到了8.6;
在阅读理解数据中,GPT-2超过了4个baseline模型中的三个;
在法译英任务中,GPT-2在zero-shot学习的基础上,超过了大多数的无监督方法,但是比有监督的state-of-the-art模型要差;
GPT-2在文本总结的表现不理想,但是它的效果也和有监督的模型非常接近。

2.3 总结

GPT-2的最大贡献是验证了通过海量数据和大量参数训练出来的词向量模型有迁移到其它类别任务中而不需要额外的训练。但是很多实验也表明,GPT-2的无监督学习的能力还有很大的提升空间,甚至在有些任务上的表现不比随机的好。尽管在有些zero-shot的任务上的表现不错,但是我们仍不清楚GPT-2的这种策略究竟能做成什么样子。GPT-2表明随着模型容量和数据量的增大,其潜能还有进一步开发的空间,基于这个思想,诞生了我们下面要介绍的GPT-3。

三 GPT-3:海量参数

延续GPT的模型架构,用更多的数据,更大的模型,训练模型。
预测时,不需要Finetune,在某些任务上小样本条件下也能达到和BERT媲美的性能。
预测时,分别用自然语言描述任务(零样本)、一个示例(单样本,和人类学习很像)、少量示例作为上文文本,将续写的文本作为预测结果。

GPT-3共训练了5个不同的语料,分别是低质量的Common Crawl,高质量的WebText2,Books1,Books2和Wikipedia,GPT-3根据数据集的不同的质量赋予了不同的权值,权值越高的在训练的时候越容易抽样到,如表1所示。

GPT-3沿用了GPT-2的结构,但是在网络容量上做了很大的提升,具体如下:
GPT-3采用了96 层的多头transformer,头的个数为96;
词向量的长度是 12888;
上下文划窗的窗口大小提升至2048个token;
使用了alternating dense和locally banded sparse attention[11]。

四. chatGPT

4.1 指示学习(Instruct Learning)和提示(Prompt Learning)学习

指示学习是谷歌Deepmind的Quoc V.Le团队在2021年的一篇名为《Finetuned Language Models Are Zero-Shot Learners》[5]文章中提出的思想。指示学习和提示学习的目的都是去挖掘语言模型本身具备的知识。

不同的是Prompt是激发语言模型的补全能力,例如根据上半句生成下半句,或是完形填空等。
Instruct是激发语言模型的理解能力,它通过给出更明显的指令,让模型去做出正确的行动。
提示学习:给女朋友买了这个项链,她很喜欢,这个项链太____了。
指示学习:判断这句话的情感:给女朋友买了这个项链,她很喜欢。选项:A=好;B=一般;C=差。

指示学习的优点是它经过多任务的微调后,也能够在其他任务上做zero-shot,
而提示学习都是针对一个任务的。泛化能力不如指示学习。

4.2 Reinforcement Learning from Human Feedback (RLHF)

强化学习的思路是通过对奖励的大量采样来拟合损失函数,从而实现模型的训练。同样人类反馈也是不可导的,那么我们也可以将人工反馈作为强化学习的奖励,基于人工反馈的强化学习便应运而生。

RLHF最早可以追溯到Google在2017年发表的《Deep Reinforcement Learning from Human Preferences》,它通过人工标注作为反馈,提升了强化学习在模拟机器人以及雅达利游戏上的表现效果。

RLHF就是基于人类反馈(Human Feedback)对语言模型进行强化学习(Reinforcement Learning),和一般的fine-tune过程乃至prompt tuning自然也不同。

4.3 RLHF是怎么训练的

4.3.1 预训练一个语言模型LM

从测试用户提交的prompt(就是指令或问题)中随机抽取一批,靠专业的标注人员,给出指定prompt的高质量答案,然后用这些人工标注好的<prompt,answer>数据来Fine-tune GPT 3.5模型。
这一步可以多训几个版本,第二步会用到。

对这一步的模型,
OpenAI 在其第一个流行的 RLHF 模型 InstructGPT 中使用了较小版本的 GPT-3;
Anthropic 使用了 1000 万 ~ 520 亿参数的 Transformer 模型进行训练;
DeepMind 使用了自家的 2800 亿参数模型 Gopher。
这里可以用额外的文本或者条件对这个 LM 进行微调,例如
OpenAI 对 “更可取” (preferable) 的人工生成文本进行了微调,
而 Anthropic 按 “有用、诚实和无害” 的标准在上下文线索上蒸馏了原始的 LM。

这里或许使用了昂贵的增强数据,但并不是 RLHF 必须的一步。由于 RLHF 还是一个尚待探索的领域,对于” 哪种模型” 适合作为 RLHF 的起点并没有明确的答案。

4.3.2 聚合问答数据并训练一个奖励模型 (Reward Model,RM) ------基于RM, 引入人类偏好

随机抽样一批用户提交的prompt(大部分和第一阶段的相同),用多个模型(可以是初始模型、finetune模型和人工等等)给出问题的多个回答<prompt,answer1>,<prompt,answer2>….<prompt,answerK>,然后人工给这些问答对按一些标准(可读性、无害、正确性,相关性、富含信息性、有害信息等诸多标准)进行排序,给出K个结果的排名顺序,
训练一个奖励模型/偏好模型来打分(reward model)。

对于学好的RM模型来说,输入<prompt,answer>,输出结果的质量得分,得分越高说明产生的回答质量越高。
RM模型接受一个输入<prompt,answer>,给出评价回答质量高低的回报分数Score。
对于一对训练数据<answer1,answer2>,我们假设人工排序中answer1排在answer2前面,那么Loss函数则鼓励RM模型对<prompt,answer1>的打分要比<prompt,answer2>的打分要高。

如何进行模型选择,训练文本选择,奖励数值,排序方式

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

关于训练文本方面,RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。
Anthropic 的数据主要是通过 Amazon Mechanical Turk 上的聊天工具生成的,并在 Hub 上可用 (https://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) 。
一种直觉是,偏好模型和生成模型需要具有类似的能力来理解提供给它们的文本。

问题一,为什么不人工直接打分而是排序?
因为打分是主观的需要归一化,而排序一般大家会有共同的结论:对同一个问题,A和B哪个回答更好。

问题二,有了一组一组的偏序(A>B, A>C, C>B)怎么得到每个回答的奖励分数?
这一步在Hug的博客里用了Elo排名系统,打网游排位赛、看足球篮球比赛的可能都知道:
把每个偏序当作比赛,把奖励分数看作排位分,完美契合匹配排位赛有没有!当然这里我们是用Elo得到一个完整排序后,经过归一化得到了奖励分数。

问题三,这个RM用什么模型?
只要用Elo系统打分后归一化,然后直接上个LM做回归就行,可以从零训练也可以用老LM做finetune。
这里有个有趣的事情在于,做问答和做评分都需要输入所有的文本,实际上两个模型的容量(或者说理解能力)应该是差不多的,而现有的RLHF模型都使用了两个不同大小的模型。

问题四,有没有其他方式训练打分的模型?
这里我看到张俊林老师指出对偏序直接用pairwise learning to rank做打分,大概更符合常规的思路,当然具体效果如何就需要看实践了:

4.3.3 用强化学习 (RL) 方式微调 LM

用强化学习训练上面那个finetune后的GPT3模型。用强化学习做LM训练的一种思路是用Policy Gradient做,这一块OpenAI用的是他们在17年提出的PPO算法,即Proximal Policy Optimization。

本阶段无需人工标注数据,而是利用上一阶段学好的RM模型,靠RM打分结果来更新预训练模型参数。
具体而言,
首先,从用户提交的prompt里随机采样一批新的命令(指的是和第一第二阶段不同的新的prompt,这个其实是很重要的,对于提升LLM模型理解instruct指令的泛化能力很有帮助),且由冷启动模型来初始化PPO模型的参数。
然后,对于随机抽取的prompt,使用PPO模型生成回答answer, 并用上一阶段训练好的RM模型给出answer质量评估的回报分数score,这个回报分数就是RM赋予给整个回答(由单词序列构成)的整体reward。有了单词序列的最终回报,就可以把每个单词看作一个时间步,把reward由后往前依次传递,由此产生的策略梯度可以更新PPO模型参数。
这是标准的强化学习过程,目的是训练LLM产生高reward的答案,也即是产生符合RM标准的高质量回答。

如果我们不断重复第二和第三阶段,很明显,每一轮迭代都使得LLM模型能力越来越强。因为第二阶段通过人工标注数据来增强RM模型的能力,而第三阶段,经过增强的RM模型对新prompt产生的回答打分会更准,并利用强化学习来鼓励LLM模型学习新的高质量内容,这起到了类似利用伪标签扩充高质量训练数据的作用,于是LLM模型进一步得到增强。显然,第二阶段和第三阶段有相互促进的作用,这是为何不断迭代会有持续增强效果的原因。

尽管如此,我觉得第三阶段采用强化学习策略,未必是ChatGPT模型效果特别好的主要原因。假设第三阶段不采用强化学习,换成如下方法:类似第二阶段的做法,对于一个新的prompt,冷启动模型可以产生k个回答,由RM模型分别打分,我们选择得分最高的回答,构成新的训练数据<prompt,answer>,去fine-tune LLM模型。假设换成这种模式,我相信起到的作用可能跟强化学习比,虽然没那么精巧,但是效果也未必一定就差很多。第三阶段无论采取哪种技术模式,本质上很可能都是利用第二阶段学会的RM,起到了扩充LLM模型高质量训练数据的作用。

参考资料
【1】https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf

【2】从Word Embedding到Bert模型——自然语言处理预训练技术发展史: https://www.jiqizhixin.com/articles/2018-12-10-8

【3】GPT2 https://www.sohu.com/a/336262203_129720 https://jalammar.github.io/illustrated-gpt2/

【4】Pytorch代码实现: huggingface/pytorch-openai-transformer-lm

【5】GPT简介https://www.cnblogs.com/yifanrensheng/p/13167796.html
【6】词向量之GPT-1,GPT-2和GPT-3
https://zhuanlan.zhihu.com/p/350017443

GPT系列:GPT1 -> 2 -> 3 -> InstructGPT ->ChatGPT相关推荐

  1. NLP之PTM:自然语言处理领域—预训练大模型时代的各种吊炸天大模型算法概述(Word2Vec→ELMO→Attention→Transfo→GPT系列/BERT系列等)、关系梳理、模型对比之详细攻略

    NLP之PTM:自然语言处理领域-预训练大模型时代的各种吊炸天大模型算法概述(Word2Vec→ELMO→Attention→Transformer→GPT系列/BERT系列等).关系梳理.模型对比之 ...

  2. AIGC、ChatGPT、GPT系列?我的认识

    AIGC(AI generated content),新型内容生产方式.AIGC是利用人工智能技术来生成内容,也就是,它可以用输入数据生成相同或不同类型的内容,比如输入文字.生成文字,输入文字.生成图 ...

  3. GPT系列模型技术路径演进

    目录 前言 Transformer GPT-1 BERT GPT-2 GPT-3 InstructGPT/ChatGPT GPT-4 类ChatGPT产品 Google Bard(诗人) facebo ...

  4. 从GPT-1到GPT-4看ChatGPT的崛起

    整理了一下ChatGPT的发展历程.背后的技术原理,以及它的局限性在哪.(请注意:有部分内容来自于文内的参考资料,如有兴趣还请阅读原文,本文不构成任何投资建议或者对项目的推荐) *转载请扫码添加后台微 ...

  5. GPT系列简介与gpt训练(nanoGPT)

    generateivelt pre-trained transformer ,GPT使用transformer做特征提取行,单项语言模型作为训练任务 gpt 1.0 通过自左向右生成式的构建预训练任务 ...

  6. GPT系列:生成式预训练与零样本学习

    GPT系列:生成式预训练与零样本学习 本文的主要参考是李沐老师关于 GPT 系列的解读:GPT,GPT-2,GPT-3 论文精读[论文精读]. 关于BERT和GPT Transformer/BERT/ ...

  7. GPT系列详解:初代GPT

    本文详细解读了OpenAI公司在2018年6月发布的论文<Improving Language Understanding by Generative Pre-Training>,它其中介 ...

  8. NLP之GPT-3:NLP领域没有最强,只有更强的模型—GPT-3的简介(本质、核心思想、意义、特点、优缺点、数据集、实际价值,模型强弱体现,开源探讨,GPT系列对比与总结)、安装、使用方法之详细攻略

    NLP之GPT-3:NLP领域没有最强,只有更强的模型-GPT-3的简介(本质.核心思想.意义.特点.优缺点.数据集.实际价值,模型强弱体现,开源探讨,GPT系列对比与总结).安装.使用方法之详细攻略 ...

  9. NLP-预训练模型-GPT系列-20221130:chatGPT【证明了大语言模型的可行新】

      一.GPT底层原理 二.三步训练

最新文章

  1. 【青少年编程竞赛交流】02月份微信图文索引
  2. linux centos使用xrdp远程界面登陆
  3. Java多线程2:Thread中的实例方法
  4. java获取当前系统时间毫秒_java 获取当前系统时间简写 | 学步园
  5. kubernetes安装_kubernetes安装教程之三:安装kubeadm
  6. 【逆水寒三周年】大型MMO项目UI管理的价值与责任
  7. java强引用软引用深刻理解_Java-强引用、软引用、弱引用、虚引用
  8. Redmine性能测试
  9. PHP Warning: date() [function.date]解决方案
  10. mysql 查看索引
  11. 前端读者 | 从一行代码里面学点JavaScript
  12. idea 安装 Vue 插件后没有新建Vue文件Vue component选项
  13. javaScript入门
  14. 虽迟但到,手眼标定代码实现篇
  15. C# ajax上传图片
  16. 软件测试之测试报告案例
  17. 安装windows server 2003两种授权模式之间的区别
  18. EasyPlayer流媒体播放器播放HLS视频,起播速度慢的技术优化
  19. 新兴基金经理凯瑟琳·伍德ARKK基金在 2022 年初遭受新的打击
  20. python excel数据分析画直方图 饼状图_Excel数据可视化应用(直方图、折线图、饼状图)...

热门文章

  1. 微信公众号笔记---本地调试微信接口
  2. 联通运营商服务器繁忙,网友:为什么现在联通网络越来越慢,是不是该转运营商了?...
  3. 幽一把默:想摸个一筒,竟是个一筒!
  4. Android动画学习笔记-Android Animation
  5. 接商城类私活就靠他了,前后端都有
  6. bq30z55调试常见故障排除
  7. TimeSpan设置Tick数
  8. 运营精益创业组织的柔术
  9. 哈哈日语 五十音图中发音最难的四个假名
  10. 种草一个让程序员男友记住一辈子的神仙插件!