全网唯一,不忽悠的ChatGPT

news2024/11/25 23:35:37

 Datawhale干货 

作者:Ben,中山大学,Datawhale成员

最近ChatGPT火出圈了,它和前阵子的Stable Diffusion(AIGC)一样成为社交媒体上人们津津乐道的话题。“ChatGPT要取代谷歌搜索了?”“ChatGPT要让程序员失业了吗?”……类似的标题又一次刺激了我们的神经。作为一名码农,我对后一个标题其实是嗤之以鼻的。无论ChatGPT是用了什么样的“魔法”,仅从目前展现的能力来看,它学会的顶多就是熟练使用编程语言的API,去实现某个函数完成人类给定的特定小任务。在真实的项目场景下,程序员通常要接过一个含糊不清的需求,梳理其中的每个细节直至形成逻辑闭环,再将其抽象成一个个特定任务并实现功能,现有AI至多能帮上最后一个小阶段;更别提真正让程序员头大的往往是并发、事务一致性等问题,这些都是现有AI无法解决的。

但是作为一名深度学习爱好者,我对ChatGPT表现出来的能力是惊叹的。无论是OpenAI提供的示例还是社交媒体上的各路花活,都让我更新了以往对AI语言模型特有的“人工智障”的认识。因此我其实十分好奇,ChatGPT的“魔法”原理是什么?遗憾的是,我在中文互联网上并没有找到对这个工作很好的解读文字,而直接看论文既费事又不是特别能理解。在一些网上优质解读视频的帮助下,我逐渐理解了所谓的“魔法”究竟是什么,并尝试梳理成如下的文字。

ChatGPT的“魔法”原理

由于ChatGPT并没有放出论文,我们没法直接了解ChatGPT的设计细节。但它的blog中提到一个相似的工作InstructGPT,两者的区别是ChatGPT在后者的基础上针对多轮对话的训练任务做了优化,因此我们可以参考后者的论文去理解ChatGPT。

然而,InstructGPT的论文由25页正文和43页附录组成,所以本文并不试图去讲清包括训练策略在内的每个细节。为了保证梳理的完整性,本文将分为上下两个部分:第一部分参考了Youtube上的 李宏毅 和 陈蕴侬 老师,旨在讲清InstructGPT的改进思路;第二部分参考了B站UP主弗兰克甜,试图转述他对ChatGPT的深刻理解。

InstructGPT的改进思路

对任何一篇工作的理解,都要回归到两个问题:一是它相比以往的工作有哪些改进,二是这些改进基于什么设计思路或者说有什么用。对InstructGPT的简单理解,可以是基于人类反馈的强化学习(RLHF)手段微调的GPT。那么我们去搞懂RLHF,其实就可以大概了解InstructGPT了。

根据下边的论文图片,我们可以知道InstructGPT的训练可以分为三个阶段:

  1. 利用人类的标注数据(demonstration data)去对GPT进行有监督训练,不妨把微调好的GPT叫做SFT;

  2. 收集多个不同(如4个)的SFT输出,这些输出基于同一个输入,然后由人类对这些输出进行排序并用来训练奖赏模型(RM)

  3. 由RM提供reward,利用强化学习的手段(PPO)来训练之前微调过的SFT。

一个需要补充的细节是,RM是会保持更新的,因此阶段2与阶段3其实是递交进行的。

ba920c26cd01c3a287a95149674619e8.png

由于我此前并不是特别了解强化学习,因此一开始读论文时尚能理解阶段1和3,但完全搞不懂阶段2在说什么。相信不少读者也有类似的疑问:

  1. InstructGPT为什么要做这样的改进,或者说它的novelty是什么?

  2. 为什么要训练一个RM,这个奇奇怪怪的RM为什么能用来充当奖赏函数?

  3. 人类对模型的多个输出做个排序,为什么就能够提供监督信号,或者说在训练RM时如何怎么做到loss的梯度回传?

可能部分人还有其它疑问,但我相信回答了这三个问题,应该也能帮助理解。

第一个问题其实在ChatGPT的blog中也有回答。这两个模型的改进思路,都是尽可能地对齐(Alignment)GPT的输出与对用户友好的语言逻辑,即微调出一个用户友好型GPT。以往的GPT训练,都是基于大量无标注的语料,这些语料通常收集自互联网。我们都知道,大量“行话”“黑话”存在于互联网中,这样训练出来的语言模型,它可能会有虚假的、恶意的或者有负面情绪等问题的输出。因此,一个直接的思路就是,通过人工干预微调GPT,使其输出对用户友好。

为了回答第二个问题,其实要稍微拓展下强化学习相关的一些研究。我们都知道,经典的强化学习模型可以总结为下图的形式:

14fe771e041ed2c522fa5a2c037a8510.png

具体来说,智能体(Agent)就是我们要训练的模型,而环境是提供reward的某个对象,它可以是AlphaGo中的人类棋手,也可以是自动驾驶中的人类驾驶员,甚至可以是某些游戏AI里的游戏规则。强化学习理论上可以不需要大量标注数据,然而实际上它所需求的reward存在一些缺陷,这导致强化学习策略很难推广:

  1. reward的制定非常困难。比如说游戏AI中,可能要制定成百上千条游戏规则,这并不比标注大量数据来得容易;

  2. 部分场景下reward的效果不好。比如说自动驾驶的多步决策(sequential decision)场景中,学习器很难频繁地获得reward,容易累计误差导致一些严重的事故。

e1be90156a00b46626cd2653c468ca61.png

想把上面的多步决策问题讲清是一件困难的事,而且我本人也不是十分理解。总之,为了解决这些问题,模仿学习(Imitation Learning)应运而生。模仿学习的思路是不让模型在人类制定的规则下自己学习,而是让模型模仿人类的行为。有的人可能会疑惑,这与监督学习有什么异同吗?我认为相同点在于都要收集人类的标注数据,不同点在于模仿学习最终是以强化学习的形式进行的;简单来说,模仿学习将强化学习的Environment替换成一个Reward Model,而这个RM是通过人类标注数据去训练得到的。其中,逆强化学习就是模仿学习的一种形式,如下图。(PS:由于我实在是不了解强化学习领域,所以这里的理解可能不准确)

354d1fadbe59bd3315a63a59fb6bb913.png

在回答了第二个“为什么要训练RM”的问题后,就要接着回答“如何训练RM”。如下图,训练RM的核心是由人类对SFT生成的多个输出(基于同一个输入)进行排序,再用来训练RM。按照模仿学习的定义,直观上的理解可以是,RM在模仿人类对语句的排序思路,或者按照OpenAI团队论文《Learning from Human Preferences》的说法是,模仿人类的偏好(Preference)。那么到底是如何模仿的呢,或者说如何实现梯度回传?

286d8265020b126a51cb3119d8acc43a.png

这里我们代入一个场景。如上图,SFT生成了ABCD四个语句,然后人类对照着Prompt输入来做出合适的排序选择,如D>C>A=B。这里的排序实质是人类分别给四个语句打分,比如说D打了7分,C打了6分,A和B打了4分。为了让RM学到人类偏好(即排序),可以四个语句两两组合分别计算loss再相加取均值,即分别计算个loss。具体的loss形式如下图。

eeb2fc3e714337f97c7d08f53ebe0048.png

需要说明的是,是Prompt输入,是SFT的输出,是RM的输出。其中总是语句组合对中打分更高的,反之。通过这种形式的梯度回传,RM逐渐学会了给D这类语句打高分,给AB这类语句打低分,从而模仿到了人类偏好。

到了这一步,不妨可以这么简单理解RLHF:所谓的人类反馈的强化学习,某种意义上来说,就是由人类的打分来充当reward。那么,虽然我们已经知道reward的设计确实比较麻烦,但为什么要用RLHF的形式而不是其它形式?以及ChatGPT是如何将这一套框架应用到多轮对话场景中的?

对ChatGPT的进一步理解

这一个部分我们回答两个问题:一,为什么是RLHF?二,RLHF是如何运用到ChatGPT中的多轮对话场景中的?至于为什么要问这两个问题,以及这两个问题如何更进一步帮助理解ChatGPT,将会在下文阐述。

首先,为什么是RLHF?我们当然知道,强化学习(RL)的reward有一些缺陷,所以有人提出了模仿学习(IL),而上文提到的RM与IL有一定的联系。那么如何理解RLHF,RL和IL之间的区别与联系?

这里我们举一个具体的场景,当我们想要训练一个能够对话的机器人时,我们可以怎么做?在一般的强化学习设定中,我们人类可以扮演Environment的角色,衡量机器人每句对话的好坏(reward),但这显然非常折磨人。即,确定一个合适的Reward机制是很困难的。而在模仿学习(如逆强化学习)设定中, 人类不去对机器人的对话做评价,而是机器人反过来模仿人类的对话方式。具体来说,可以从网上或者其它渠道收集大量历史对话数据来训练一个奖赏模型(RM)。

看起来模仿学习很好地解决了Reward机制的问题,然而同样的,它也带来了如何收集高质量数据训练RM的问题。还是以对话机器人举例,如果只是简单地拉家常,那么找一些稍微培训过的普通人就可以了;但是如果要解决医疗对话等场景,显然普通人不足以胜任,而一名有经验的医生的标注数据成本可能高于十名普通人的。因此,一个合理的思路是,如何借鉴监督学习中降低标注成本的思路,来降低RM的训练成本。

在我看来,RLHF中的rank就好比监督学习中的弱标注——它并不提供直接的监督信号。但通过学习简单的排序,RM可以学到人类的偏好。那怎么去理解这里的“偏好”呢?打个比方,有一家冰箱工厂生产了好几种类型的冰箱,虽然这些客户中没有一个懂得如何造冰箱的(或者说他们不需要懂),但他们可以通过消费行为,让厂商明白消费者对冰箱类型的“偏好”,从而引导冰箱厂商生产销量更好的冰箱。

38a7ef3ec2893e8fbb0c60be6ae05013.png

既然RLHF能很好地解决RL甚至IL的一些问题,也在InstructGPT中取得了很好的效果。那么,是否可以顺理成章地将之迁移到多轮对话场景中呢?

我们可以从强化学习的假设出发去理解这个问题。“我们都知道”,以PPO为代表的强化学习模型,基于马尔可夫性的假设。简单理解马尔科夫性就是,它将来的状态只取决于现在,与过去无关。也就是说,马尔可夫性有一个很重要的特点:无记忆性。然而,在多轮人机对话场景中,模型却应该具备部分可观测马尔可夫性,即要求语言模型有“记忆性”。这理解起来也比较直观,在多轮对话场景里,存在某一轮对话中的代词指向上一轮对话中的某个人或物的可能,假如模型不具备记忆性,那就无法很好地处理这种问题。显然,强化学习的假设与多轮对话场景的相背,不做一些优化的话很难直接应用。那么进一步的问题来了,ChatGPT是如何做优化的呢?

这里我们先从自然语言任务中最基本的语言模型简单说起。一个语言模型大概是说,当你给定前面的若干个词后,它会给你下一个词;而当你有了下一个词后,它会再给你接一个词,以此递推。这就好比我们使用手机输入法,你打出一些词句后,输入法会提供若干个候选词——这里的手机输入法其实就是一个语言模型。那么我们如何利用这个最基本的语言模型来建模多轮对话问题呢?实际上,我们向ChatGPT提出的问题,可以看成一句话,或者说是下图的输入。然后我们可以将ChatGPT给出的答案,抽象成下图的输出。而ChatGPT这类语言模型,提供了若干个类似手机输入法的“候选句”,每个候选句对应的概率不一。所谓的语言模型的训练,其实就是让模型调整候选句对应的概率,使我们人类希望输出的候选句的概率尽可能大,而不希望输出的概率尽可能小。

fb5a917defdcef68a58da3ecb6c73d5a.png

那么这个语言模型和强化学习又有什么样的联系呢?在强化学习中,我们确实有智能体/模型(Agent)和环境(Environment)交互这样的范式。但是在ChatGPT所使用的这种训练方式中,环境从某种意义上说被另一个模型取缔了(即前面提到的RM)。如下图,图中的状态State是之前提到的输入语句,而当智能体拿到一个,它给出的动作action其实是下一个单词。注意,GPT确实可以输出一整句话,但其实要完成这个最终的输出,需要做若干次如图所示的action。当环境(或RM)接收到它给出的单词后,会把这个单词放到已有的单词序列末尾,然后再把这个新的单词序列还给智能体,之后依次类推。打个比方,这里的智能体就是手机输入法,而环境就是使用输入法的用户。用户所做的事情,就是当输入法给出一系列候选词后,基于某种偏好选择某个词,然后让手机输入法再去猜下一个词,直到输入法把整个句子猜出来为止。这里我们明白了在语言模型场景下,强化学习的状态和动作对应什么,那么什么是奖赏Reward呢?更进一步地,ChatGPT中的Reward,是否就是前面所提到的RM呢?

664501248df2bcedaa23c024f6668056.png

我们之前已经了解到,RM学到的其实是人类的SFT多个输出结果的排序,即人类对语句的偏好。它其实直接学到的,就是人类对语句的打分。那么这种RM模型是否可以直接对应强化学习中的Reward呢?实际上不全是。在下图InstructGPT给出的奖赏函数中,它的一部分确实是RM模型根据学到的人类偏好给出的打分,而另一部分则是参与了强化学习的ChatGPT和它的原始版本SFT的某种差距——这里我们不希望这种差距太大。之所以要加入后边的偏置项,是因为我们害怕ChatGPT在强化学习的训练过程中过于放飞自我,学会了通过某种刁钻的方式取悦人类,而不是老老实实地根据人类的问题给出正确答案。

同时,后面的偏置项可以被看作KL散度,而KL散度可以拆分成交叉熵减去熵的形式。注意这里是交叉熵减去熵,那么在整个奖赏函数中,熵前面的符号为正——这体现了强化学习的一种思想,即让策略的熵在允许的范围内尽可能大,这可以促进策略的探索。

但是,这个奖赏函数是对整个输入语句和整个输出语句而言的,而我们又在之前讨论过,智能体是根据一个一个词来去拼凑出整个回答的。图中的奖赏函数只能给出完整回答的奖赏,那么在智能体生成回答的过程中,每个动作action给出的词对应的奖赏是什么呢?

70de534d432c477774fd3188f3760d9f.png

这个细节在InstructGPT中并没有给出。幸运的是,OpenAI团队的另一篇论文《Learning from summarize from Human feedback》中的一个引脚标注给出了关于这个疑问的答案。作者说,奖赏模型只在最终生成回答之后才给出奖赏,在中间的过程中是不给出奖赏的。在这里作者没有使用回答一词,而是使用总结一词,因为它的任务是将一篇长文章进行归纳总结。顺着这位作者的思路,只有在ChatGPT输出了EOS token的时候,整个轨迹才结束(EOS token是自然语言处理中用来表示一段话结束的标志)。

6fd9f27e55503e9faa1407dff51d066f.png

这里我们可以梳理下RLHF和GPT的本质关系。实际上,这里使用RLHF就是为了解决我们无法对一个离散的训练进行求导的问题。而使用强化学习来解决这个问题也不是ChatGPT的独创:早在2016年SeqGAN的作者就已经使用了这样的方法了。因此我们可以从问题本质的角度去这么理解ChatGAN:它就是把Transformer和“SeqGAN”结合在一起。当然这个“SeqGAN”并不是标准版本,因为它不是像模仿学习那样通过示教来学习,而是通过人类的偏好来进行学习。从问题本质上看,ChatGPT与之前的工作的最大不同,就体现在它使用了SeqGAN进行微调。(PS:能力有限只能全盘照搬UP主观点,但这些对我非常有启发,因为我在读论文时也感觉ChatGPT使用到的强化学习,有点GAN的味道~)

7918a5d0cc42b4cfa59ffb041bf8fb4b.png

最后再让我们回顾梳理下第二个问题:RLHF是如何运用到ChatGPT中的多轮对话场景中的?由于多轮对话要求语言模型有记忆性,因此无法直接使用强化学习。这里的矛盾具体体现在了奖赏函数中:ChatGPT的奖赏函数是针对GPT的一整个输入语句  和一整个输出语句  而言的;而ChatGPT的语言模型在强化学习的训练策略中,每个action其实输出的是一个个词语  。因此,OpenAI的团队可能是采取不对序列的中间生成给予reward的方式解决上文提到的矛盾,而这种解决方式十分接近SeqGAN的思路。

作者后记

通过梳理完这篇ChatGPT的解读文章后,我对ChatGPT有了更深刻细致的理解。我还记得一开始看到UP主弗兰克甜的视频时,简直惊为天人,这也促使我耗费大量精力梳理出这篇文章。一个想升华的点是,我们对技术尤其是AI其实要抱着即尊重又亲近的态度,不要是敬畏,更别是鄙视。我对人工智能的发展长期看好,但目前也不太可能出现跳脱式的新技术,所有的技术都是在迭代发展中慢慢成长的。最后由于我的能力有限,这篇文章可能没法照顾到方方面面的细节。

参考链接:

1. https://www.bilibili.com/video/BV1zW4y1g7pQ/?share_source=copy_web&vd_source=fe0ed33242ba9d84a6e7da7e017223c2

2. https://www.youtube.com/watch?v=e0aKI2GGZNg

3. https://www.youtube.com/watch?v=ORHv8yKAV2Q

62acb23adec8cbdf9a1ad2f14e7a3e3c.png

整理不易,三连

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制作 Python Docker 镜像的最佳实践

概述 📚️Reference: 制作容器镜像的最佳实践 这篇文章是关于制作 Python Docker 容器镜像的最佳实践。(2022 年 12 月更新) 最佳实践的目的一方面是为了减小镜像体积,提升 DevOps 效率,另一方面是为了提高安全性。希望对各位有所…

无忧·企业文档,为企业客户的场景而思考

作为无忧企业文档的设计者,常常被问到一个问题,这个和腾X文档有什么区别?其实这个问题我口头回答了很多次,这次,我将这个问题做个记录与分析。 主要是有以下几个方面不同: 1、客户定位不同 2、核心功能不…

Java基础疑难点梳理(泛型到反射9章内容)

文章目录1. 泛型2. 基础类库3. 集合4. 异常5. 注解6. JDBC7. IO流8. 网络编程9. 类加载和反射1. 泛型 静态方法的形参,静态变量,静态代码块中不能使用泛型(因为即使泛型不同,还是同一个类,静态变量是属于类的&#xff…

锂电池实验室规划设计方案 | 喜格SICOLAB

锂电池实验室规划设计方案 | 喜格SICOLAB 锂电池生产基本工序 正负极混料、涂布、辊压、干燥、裁切、卷绕或叠片、封装、注液、化成、检测、出货等。锂电池实验室设计标准 1、《电子工业洁净厂房设计规范》GB50472-2008 2、《锂离子电池工厂设计标准》GB 51377-2019 《工业建筑…

在 Python 中使用 cv2 进行嗜睡检测

大家好,在这个博客中,我们将构建一个嗜睡检测应用程序,它将检测视频中的人是否变得昏昏欲睡。这是一个非常有趣且简单的项目,代码甚至不到 80 行,让我们开始吧看看最终输出注意——你不会在这里听到警报声,…

Stm32旧版库函数12——定时器的使用\time1

#include "stm32f10x_lib.h" #include "usart.h" #include "delay.h" #include "sys_config.h" #include <math.h> //Keil library #define uchar unsigned char #define uint unsigned int //通用定时器中断初始…

SpringCloud(6)— RabbitMQ(消息队列)

SpringCloud&#xff08;6&#xff09;— RabbitMQ(消息队列) 一 初识MQ 1.同步通信与异步通信 1.同步通信的问题 同步调用的优点在于时效性高&#xff0c;可以立即得到结果 微服务之间基于Feign的调用属于同步方式&#xff0c;存在一些问题 耦合性&#xff1a;业务较多时&a…

硅片检测半导体运动台控制器的设计

多自由度精密运动平台是半导体行业中硅片制造和检测过程里至关重要的问题&#xff0c;采用直线电机和音圈电机等先进驱动方式的精密运动平台相对传统滚珠丝杠旋转电机运动的运动平台&#xff0c;具有精度高、响应快、寿命长、免维护和结构简单等诸多优点&#xff0c;优势十分明…

为什么感觉现在很少有黑客了?

有一个词语&#xff0c;人人不是它&#xff0c;却人人都提及它&#xff0c;他就是&#xff1a;黑客&#xff01; 黑客&#xff0c;这个我们从小就接触的工种&#xff0c;总是衣服全身黑衣、眼戴墨镜、冷酷无情、超级厉害的形象&#xff0c;关键是&#xff0c;只要应用崩了/数据…

一颗芯片是怎样诞生的

目录 从沙子到单晶硅 单晶硅切片 电路实现 芯片的封装 芯片属于半导体。半导体是介于导体和绝缘体之间的一类物质&#xff0c;元素周期表中硅、锗、硒、硼的单质都属于半导体。这些单质通过掺杂其他元素生成的一些化合物&#xff0c;也属于半导体的范畴。 P型半导体是在单…

Linux安装phpstudy(无联网版)

下载install.sh Centos安装脚本&#xff0c;直接在浏览器打开https://notdocker.xp.cn/install.sh下载install.sh #官方安装命令 yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh #命令解析 yum install -y …

AI作画,AIGC领域新的引爆点

AI作画火爆&#xff0c;一帧秒创再创惊喜 2022年渐近尾声&#xff0c;这一年小事不断&#xff0c;大事不少。当今这个时代&#xff0c;似乎注定就是一个见证历史和颠覆观念的时代。AIGC领域在人工智能、元宇宙概念兴起的背景之下&#xff0c;在今年迎来一个火爆增长。 其中的…

Github每日精选(第76期):在 Mac 状态栏上显示进程流量的监视器ITraffic-monitor-for-mac

ITraffic-monitor-for-mac ITraffic-monitor-for-mac 在 Mac 状态栏上显示进程流量的监视器&#xff0c;在windows我们的流量可以通过电脑管家或者360进行显示&#xff0c;在进行网络编程的时候&#xff0c;这个确实帮了不少忙&#xff0c;但是咱Mac下&#xff0c;显示网络状况…

oracle的trunc函数改为hive的函数

trunc函数可以截取oracle的日期 select trunc(sysdate,yyyy) from dual;--返回当年第一天 select trunc(sysdate,mm) from dual; --返回当月第一天 select trunc(sysdate,dd) from dual;--返回当前年月日 select trunc(sysdate,d) from dual; --返回当前星期的第一天(星期日) …

怎么把电脑硬盘文件恢复回来?跟着我这么做

电脑的硬盘数据丢失了&#xff0c;用了很多方法都没有办法找回来&#xff0c;电脑文件还能找回来吗&#xff1f;硬盘文件恢复要怎么操作&#xff1f;这时候就要寻求第三方数据恢复软件来恢复数据了。下面有详细的操作步骤&#xff0c;简单几步就可以找回你消失的硬盘数据&#…

leetcode90子集II-回溯-Java

说明&#xff1a; 问题描述来源leetcode 题解1&#xff1a; /*** author xin麒* date 2022/12/15 11:18* 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。* 解集 不能 包含重复的子集。返回…

DPDK介绍

一、什么是DPDK&#xff1f; DPDK 全称是数据平面开发套件 (Data Plane Development Kit)&#xff0c;由 6WIND,Intel 等多家公司开发&#xff0c;主要基于 Linux 系统运行&#xff0c;用于快速数据包处理的函数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…

DGIOT边缘主机功能——6USB串口替代普通dtu/网关的设备接入

[小 迪 导读]&#xff1a; dgiot边缘主机自带6个USB口、2个RS232串口以及2个网口&#xff0c;可用组态对边缘主机上的USB口、串口和网口等上的外设进行可视化管理&#xff0c;包括如下功能&#xff1a; 通过6个USB口外接USB转485转换器模拟6个485转以太网/无线的网关/dtu2个RS…

JavaWeb——在线音乐播放器

文章目录效果演示1. 创建SpringBoot项目2. 数据库设计3. 配置数据库和xml4. 登录模块设计4.1 创建User类4.2 创建对应的Mapper和Controller5. 实现登录5.1 登录的请求和响应设计5.2 请求实现5.3 响应实现5.31 设置统一的响应体类工具类5.32 创建常量工具类5.33 优化后完整代码6…

纳米源表测试软件更新,新增太阳能电池测试、双通道脉冲扫描

源表在电测行业中应用十分广泛&#xff0c;尤其是在需求高精度的半导体、纳米器件和材料、太阳能电池、印刷电子技术等领域有着举足轻重的地位&#xff1b;而源表软件则可以实现源表的远程控制&#xff0c;通过在软件控制源表进行配置或者测量&#xff0c;也可以对测量的数据和…