淘优惠

淘优惠

【ChatGPT前世今生】前置知识Seq2Seq入门理解

双十一活动 0
chatgpt是什么意思,chatgpt怎么下载,chatgpt国内能用吗,chatgpt怎么读
    • 1、环境准备与依赖包安装
    • 2、数据集准备
    • 3、数据集预处理与读取
    • 4、定义【【微信】】模型的基础类
    • 5、预处理训练数据集
    • 6、定义训练过程
    • 7、定义验证过程
    • 8、执行训练与验证过程
    • 9、展示模型的结果,进行进一步分析

最近一段时间,ChatGPT非常热门,但是,要理解ChatGPT的工作原理,得追溯至Transformer、【【微信】】、【【微信】】这些早期的自然语言处理研究成果,本文主要回顾【【微信】】。 【【微信】】,其英文原称就是Se【【微信】】,翻译过来就是“序列到序列”,其文献可以追溯至发表在NIPS 2014的《Se【【微信】】 Learning with Neural Networks》,该文章的谷歌学术引用已经多于2.1万次,可见其在NLP领域的重要性,此后近9年的研究工作,可以说都或多或少受到了该论文思维的影响。

我们现在回过头来看,其实【【微信】】的思想真的很直观,就是把语言生成任务建模为序列到序列的任务,输入是一个序列,输出也是一个序列。其在提出之初,主要是用于翻译任务,后来广泛用到对话生成、摘要生成等文本生成任务当中。这种结构的显著特点是:输入序列和输出序列的长度是可变的,且没有直接的一一对应的关系,如上图所示。

下面将以翻译任务,简单介绍【【微信】】的工作原理。

参考博客:

  • 【Python学习】纯终端命令开始你的Anaconda安装与Python环境管理
  • 【Python学习】Windows10开始你的Anaconda安装与Python环境管理
  • 【Python编程】服务器长期开启jupyter notebook远程连接服务
  • Pytorch安装指南

在conda创建的python环境当中安装pytorch以及wget:

导入re、torch等依赖包

通过以下链接下载数据集并且解压到与本文件相同的路径

【【网址】】/tutorial/data.zip

解压数据文件:

众所周知,NLP任务是需要有一个词表的,我们需要将句子转换为词序列,再将词序列映射为向量,然后用这个词向量进行各种任务运算,词向量的工作原理会在另一篇博客展开讨论。我们现在需要知道的是:

  • 1、给定一个语料库(指由若干个句子序列组成的数据集,可以是翻译数据集,可以是对话数据集等等),我们首先要基于该数据集进行分词,然后进行词频统计,得到一个词表(词及其编号),如果是翻译任务,则有两个不同的词表分别对应待翻译语言以及翻译后的语言,通常如下所示:

这个词表,实际上就是我们在执行NLP任务时的搜索空间,每执行一步生成,实际上就是在词表当中检索最可能生成的一个词。特别地,词表可能很大,通常会由几万个单词组成,因此其对应的分类器也会非常大,每次需要从数万个单词当中挑出最可能的一个或若干个单词作为输出。

  • 2、然后,针对每一个句子,需要先根据词表把其转换为由编号组成的序列,类似于的形式,然后再根据编号获得每个词对应的向量表示,将向量序列输入到【【微信】】模型当中,进行模型的运算推理,并返回推理后的结果,例如某一步推理得到的预测向量,根据这个向量检索最接近的词向量,用该词向量对应的单词作为输出。

以下代码为词表类的实现代码,其中类的成员word2index、index2word分别可以通过单词查询对应的编号,以及通过编号查询对应的单词,那怕是ChatGPT,实际上也是需要进行这两步的。

以下过程是一些正则化处理过程,实际上就是进行数据清洗,简化任务

通过readLangs函数实现词表的构建,其包括:读入语料库/数据集,分词,更新词表。

广义来说,一切序列到序列的任务,都可以通过模型【【微信】】来实现,但是具体到最初的模型,【【微信】】的具体实现是基于RNN算法/模型的。 更通俗一点,【【微信】】框架通常包含:处理输入序列的模块(通常称为编码器,Encoder),生成输出序列的模块(通常称为解码器,Decoder)。 我们在这里不赘述RNN算法的具体计算步骤,感兴趣的同学可以百度一下。下面的模型的实现主要采用了RNN的一种变体:GRU,但它仍然属于RNN算法的一种。

本文实现的【【微信】】主要包括:【【微信】】模块以及AttnDecoderRNN,其中【【微信】】由词嵌入层(self.embedding)和一层GRU(self.gru)组成;AttnDecoderRNN由词嵌入层(self.embedding)、注意力计算层(self.attn、self.attn_combine)、GRU层(self.gru)以及输出的词分类层(self.out)组成。

本文通过一个可训练的线性层来实现编码器的输出和解码器的输入之间的注意力权重计算,同时也通过另一个可训练的线性层来实现将注意力加权到解码器的输入,得到最终的解码器的输入。这个实际上相当于注意力权重是可以通过训练得到的,解码器最终的输入由编码器的输出、注意力权重,以及对这两部分的加权的数值共同决定。 解码器最终的输入 = [ 编码器的输出 , 注意力权 重 可训练 ] ? [ 加权数值矩阵 ] 可训练 解码器最终的输入=[编码器的输出, 注意力权重_{可训练}]*[加权数值矩阵]_{可训练} 解码器最终的输入=[编码器的输出,注意力权可训练?]?[加权数值矩阵]可训练?

当然,给输入序列加注意力有很多种实现方式,并不局限于以上方法

定义原始输入文本的处理函数,将句子(字符串)转换为模型可以理解的数字序列(张量)。

一个神经网络模型的训练过程,实际上就是:

  • 不断读取数据样本,将数据样本转换为模型所需要的输入格式;
  • 步骤1:模型根据输入的样本计算输出值;
  • 步骤2:调用损失函数(某种计算距离的公式,例如标准差)计算模型输出值和真实值的差距(俗称损失值,loss);
  • 步骤3:利用损失值驱动优化算法(优化器)去对模型的所有参数进行更新,重复以上步骤若干次。

总的来说,每一步训练过程需要:样本(模型的输入和参考答案)、模型、优化器、损失函数。

经过训练,模型的参数会不断更新,最终得到一个训练后的模型,这就是神经网络模型的训练过程。更加具体而言,其中的损失函数、优化器又会有很多具体的实现,下面使用的损失函数是通过criterion参数传入的,模型分为编码器和解码器两部分,分别通过encoder、decoder传入,编码器和解码器的优化器通过encoder_optimizer、decoder_optimizer传入。

训练过程的辅助函数:

定义训练过程的显示函数:

训练过程实际上就是不停地调整encoder1和attn_decoder1的所有参数,使得模型的每一次输出尽可能拟合标准答案。 这其中涉及到优化算法,打印的是: 训练所需时间,当前所处迭代步数,当前已经执行的步数的百分比,平均损失值

主要是进行注意力分析,感兴趣的同学可以百度一下什么是注意力,实际上就是展示了模型通过训练,在进行翻译任务时,预测某个词是,对输入的句子的各个单词分配的权重。简单来说,预测某一个位置的词时,对于输入的序列的各个词的注意力(分配的权重),是不一样的。

参考: https://pytorch.org/tutorials/intermediate/se【【微信】】torial.html



chatgpt 实时 关键词 更新 用chatgpt生成零售洞察

chatgpt官网,chatgpt怎么下载,chatgpt怎么读,chatgpt使用

报告仅用于学习交流,通过对特定人群的大数据洞察,分析用户群体的特征、兴趣和偏好等,辅助您更好地进行思考、策划与行动。

阅读完全文,预计需要6分钟。

本文著作权归于作者个人所有,未经授权许可不得转载、转贴或以其它方式复制发布、发表,引用本文内容请注明来源及原作者。

【ChatGPT】

样本规则:近30天对【ChatGPT】有主动搜索行为的手机设备,样本数量113.24万个,报告中部分标签,可能存在识别性略低的情况。

为便于阅读理解,报告只呈现人群占比(%)和UV占比(%)维度。

01 ?人口属性

02? 社会属性

03? 区域分布

04? 手机品牌/有车无车/兴趣大类

09? 汽车/地产

10游戏

11文化娱乐

12软件应用和在装活跃APP