【大模型NLP保姆级教程】手把手带你RNN文本分类(附代码)

自然语言处理 (NLP) 入门教程 本教程介绍了自然语言处理 (NLP) 领域的基本概念和关键技术,包括词嵌入、循环神经网络、Transformer 等模型,以及文本分类、机器翻译、问答系统等应用。希望这能帮助你入门 NLP,并启发你在这个快速发展的领域进行更深入的探索。NLP 领域还在不断发展,新的技术和应用层出不穷。学习和实践是掌握 NLP 的关键。希望你能够通过不断学习和探索,在 NLP 领域取得更大的成就。 阅读详情

写在前面


这是NLP保姆级教程的第二篇----基于RNN的文本分类实现(Text RNN)

参考的的论文是来自2016年复旦大学IJCAI上的发表的关于循环神经网络在多任务文本分类上的应用:Recurrent Neural Network for Text Classification with Multi-Task Learning[1]

论文概览

在先前的许多工作中,模型的学习都是基于单任务,对于复杂的问题,也可以分解为简单且相互独立的子问题来单独解决,然后再合并结果,得到最初复杂问题的结果。这样做看似合理,其实是不正确的,因为现实世界中很多问题不能分解为一个一个独立的子问题,即使可以分解,各个子问题之间也是相互关联的,通过一些共享因素或「共享表示(share representation)」 联系在一起。把现实问题当做一个个独立的单任务处理,往往会忽略了问题之间所富含的丰富的关联信息。

上面的问题引出了本文的重点——「多任务学习(Multi-task learning)」,把多个相关(related)的任务(task)放在一起学习。多个任务之间共享一些因素,它们可以在学习过程中,共享它们所学到的信息,这是单任务学习没有具备的。相关联的多任务学习比单任务学习能去的更好的泛化(generalization)效果。本文基于 RNN 循环神经网络,提出三种不同的信息共享机制,整体网络是基于所有的任务共同学习得到。

下图展示的是单任务学习和多任务学习的流程图,可以对比一下区别。

下面具体介绍一下文章中的三个模型。

Model I: Uniform-Layer Architecture

在他们提出的第一个模型中,不同的任务共享一个LSTM网络层和一个embedding layer,此外每个任务还有其自己的embedding layer。所以对于上图中的任务m,输入x包括了两个部分:
在这里插入图片描述

其中等号右侧第一项和第二项分别表示该任务「特有」的word embedding和该模型中「共享」的word embedding,两者做一个concatenation。

LSTM网络层是所有任务所共享的,对于任务m的最后sequence representation为LSTM的输出:
在这里插入图片描述

Model II: Coupled-Layer Architecture

在第二个模型中,为每个任务都指定了「特定」的LSTM layer,但是不同任务间的LSTM layer可以共享信息。

为了更好地控制在不同LSTM layer之间的信息流动,作者提出了一个global gating unit,使得模型具有决定信息流动程度的能力。

为此,他们改写了LSTM中的表达式:

在这里插入图片描述

Model III: Shared-Layer Architecture

与模型二相似,作者也为每个单独的任务指派了特定的LSTM层,但是对于整体的模型使用了双向的LSTM,这样可以使得信息共享更为准确。

模型表现

论文作者在4个数据集上对上述模型做了评价,并和其他state-of-the-art的网络模型进行了对比,均显示最好的效果。

代码实现

RNN的代码框架和上一篇介绍的CNN类似,首先定义一个RNN类来实现论文中的模型

class RNN(BaseModel):  
    """  
    A RNN class for sentence classification  
    With an embedding layer + Bi-LSTM layer + FC layer + softmax  
    """  
    def __init__(self, sequence_length, num_classes, vocab_size,  
                 embed_size, learning_rate, decay_steps, decay_rate,  
                 hidden_size, is_training, l2_lambda, grad_clip,  
                 initializer=tf.random_normal_initializer(stddev=0.1)):  

这里的模型包括了一层embedding,一层双向LSTM,一层全连接层最后接上一个softmax分类函数。

然后依次定义模型,训练,损失等函数在后续调用。

def inference(self):  
    """  
    1. embedding layer  
    2. Bi-LSTM layer  
    3. concat Bi-LSTM output  
    4. FC(full connected) layer  
    5. softmax layer  
    """  
    # embedding layer  
    with tf.name_scope('embedding'):  
        self.embedded_words = tf.nn.embedding_lookup(self.Embedding, self.input_x)  
  
    # Bi-LSTM layer  
    with tf.name_scope('Bi-LSTM'):  
        lstm_fw_cell = rnn.BasicLSTMCell(self.hidden_size)  
        lstm_bw_cell = rnn.BasicLSTMCell(self.hidden_size)  
  
        if self.dropout_keep_prob is not None:  
            lstm_fw_cell = rnn.DropoutWrapper(lstm_fw_cell, output_keep_prob=self.dropout_keep_prob)  
            lstm_bw_cell = rnn.DropoutWrapper(lstm_bw_cell, output_keep_prob=self.dropout_keep_prob)  
  
        outputs, output_states = tf.nn.bidirectional_dynamic_rnn(lstm_fw_cell, lstm_bw_cell,  
                                                                self.embedded_words,  
                                                                dtype=tf.float32)  
        output = tf.concat(outputs, axis=2)  
        output_last = tf.reduce_mean(output, axis=1)  
  
        # FC layer  
        with tf.name_scope('output'):  
            self.score = tf.matmul(output_last, self.W_projection) + self.b_projection  
        return self.score  
  
def loss(self):  
    # loss  
    with tf.name_scope('loss'):  
        losses = tf.nn.softmax_cross_entropy_with_logits(labels=self.input_y, logits=self.score)  
        data_loss = tf.reduce_mean(losses)  
        l2_loss = tf.add_n([tf.nn.l2_loss(cand_v) for cand_v in tf.trainable_variables()  
                                if 'bias' not in cand_v.name]) * self.l2_lambda  
        data_loss += l2_loss  
        return data_loss  
  
def train(self):  
    learning_rate = tf.train.exponential_decay(self.learning_rate, self.global_step,  
                                               self.decay_steps, self.decay_rate, staircase=True)  
    optimizer = tf.train.AdamOptimizer(learning_rate)  
    grads_and_vars = optimizer.compute_gradients(self.loss_val)  
  
    grads_and_vars = [(tf.clip_by_norm(grad, self.grad_clip), val) for grad, val in grads_and_vars]  
  
    train_op = optimizer.apply_gradients(grads_and_vars, global_step=self.global_step)  
    return train_op  

训练部分的数据集这里就直接采用CNN那篇文章相同的数据集(懒…),预处理的方式与函数等都是一样的,,,

def train(x_train, y_train, vocab_processor, x_dev, y_dev):  
    with tf.Graph().as_default():  
        session_conf = tf.ConfigProto(  
            # allows TensorFlow to fall back on a device with a certain operation implemented  
            allow_soft_placement= FLAGS.allow_soft_placement,  
            # allows TensorFlow log on which devices (CPU or GPU) it places operations  
            log_device_placement=FLAGS.log_device_placement  
        )  
        sess = tf.Session(config=session_conf)  
        with sess.as_default():  
            # initialize cnn  
            rnn = RNN(sequence_length=x_train.shape[1],  
                      num_classes=y_train.shape[1],  
                      vocab_size=len(vocab_processor.vocabulary_),  
                      embed_size=FLAGS.embed_size,  
                      l2_lambda=FLAGS.l2_reg_lambda,  
                      is_training=True,  
                      grad_clip=FLAGS.grad_clip,  
                      learning_rate=FLAGS.learning_rate,  
                      decay_steps=FLAGS.decay_steps,  
                      decay_rate=FLAGS.decay_rate,  
                      hidden_size=FLAGS.hidden_size  
                      )  
  
  
            # output dir for models and summaries  
            timestamp = str(time.time())  
            out_dir = os.path.abspath(os.path.join(os.path.curdir, 'run', timestamp))  
            if not os.path.exists(out_dir):  
                os.makedirs(out_dir)  
            print('Writing to {} \n'.format(out_dir))  
  
            # checkpoint dir. checkpointing – saving the parameters of your model to restore them later on.  
            checkpoint_dir = os.path.abspath(os.path.join(out_dir, FLAGS.ckpt_dir))  
            checkpoint_prefix = os.path.join(checkpoint_dir, 'model')  
            if not os.path.exists(checkpoint_dir):  
                os.makedirs(checkpoint_dir)  
            saver = tf.train.Saver(tf.global_variables(), max_to_keep=FLAGS.num_checkpoints)  
  
            # Write vocabulary  
            vocab_processor.save(os.path.join(out_dir, 'vocab'))  
  
            # Initialize all  
            sess.run(tf.global_variables_initializer())  
  
  
            def train_step(x_batch, y_batch):  
                """  
                A single training step  
                :param x_batch:  
                :param y_batch:  
                :return:  
                """  
                feed_dict = {  
                    rnn.input_x: x_batch,  
                    rnn.input_y: y_batch,  
                    rnn.dropout_keep_prob: FLAGS.dropout_keep_prob  
                }  
                _, step, loss, accuracy = sess.run(  
                    [rnn.train_op, rnn.global_step, rnn.loss_val, rnn.accuracy],  
                    feed_dict=feed_dict  
                )  
                time_str = datetime.datetime.now().isoformat()  
                print("{}: step {}, loss {:g}, acc {:g}".format(time_str, step, loss, accuracy))  
  
  
            def dev_step(x_batch, y_batch):  
                """  
                Evaluate model on a dev set  
                Disable dropout  
                :param x_batch:  
                :param y_batch:  
                :param writer:  
                :return:  
                """  
                feed_dict = {  
                    rnn.input_x: x_batch,  
                    rnn.input_y: y_batch,  
                    rnn.dropout_keep_prob: 1.0  
                }  
                step, loss, accuracy = sess.run(  
                    [rnn.global_step, rnn.loss_val, rnn.accuracy],  
                    feed_dict=feed_dict  
                )  
                time_str = datetime.datetime.now().isoformat()  
                print("dev results:{}: step {}, loss {:g}, acc {:g}".format(time_str, step, loss, accuracy))  
  
            # generate batches  
            batches = data_process.batch_iter(list(zip(x_train, y_train)), FLAGS.batch_size, FLAGS.num_epochs)  
            # training loop  
            for batch in batches:  
                x_batch, y_batch = zip(*batch)  
                train_step(x_batch, y_batch)  
                current_step = tf.train.global_step(sess, rnn.global_step)  
                if current_step % FLAGS.validate_every == 0:  
                    print('\n Evaluation:')  
                    dev_step(x_dev, y_dev)  
                    print('')  
  
            path = saver.save(sess, checkpoint_prefix, global_step=current_step)  
            print('Save model checkpoint to {} \n'.format(path))  
  
def main(argv=None):  
    x_train, y_train, vocab_processor, x_dev, y_dev = prepocess()  
    train(x_train, y_train, vocab_processor, x_dev, y_dev)  
  
if __name__ == '__main__':  
    tf.app.run()

​

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

深入浅出:RNN文本分类模型实战攻略 RNN文本分类模型是一种使用循环神经网络(RNN)进行文本分类的模型。RNN是一种递归神经网络,能够处理序列数据,如文本。在文本分类任务中,RNN模型可以将文本序列转换为连续的向量表示,并使用这些向量进行分类。它可以用于各种文本分类任务,如情感分析主题分类垃圾邮件检测等。它的优点是可以处理变长序列,捕捉序列中的长期依赖关系和上下文信息。然而,它的缺点是训练过程可能较慢,并且需要对数据进行正确的预处理和特征工程。 阅读详情

相关推荐

【NLP】NLP基础之RNN循环神经网络

输出张量 包含RNN在输入序列的每个时间步的输出。形状:(seq_len, batch, num_directions * hidden_size) 或 (batch, seq_len, num_directions * hidden_size)(如果 batch_first=True)。它是基于当前时间步输入和先前隐藏状态计算的RNN层的激活输出。

m0_37697141的博客 931

NLP终极入门教程

yuanfwenUltimate Guide to Understand and Implement Natural Language Processing

weixin_40005699的博客 4120

深入探索循环神经网络(RNN)(附代码示例)

​ 循环神经网络(RNN)是一种能够处理序列数据的神经网络,其主要特点是引入了循环结构,使得网络能够捕捉序列数据中的时间依赖关系。基于这种能力,RNN 在自然语言处理任务中广泛用于语言建模、机器翻译、语音识别和文本生成等任务。根据反向传播算法和链式法则, 梯度的计算可以简化为以下公式:​Dnσ′z1w1⋅σ′z2w2⋅⋯⋅σ′znwnDnσ′z1w1⋅σ′z2w2⋅⋯⋅σ′znwn​Dnσ′z1。

weixin_67656334的博客 2831

NLP超详细新手快速入门上手篇(1)常用函数

自然语言处理(NLP)是机器学习的应用之一,用于分析、理解和生成自然语言,以便人类与计算机,人类与人类更好的交流。自然语言处理按照任务类型可以分为分类、匹配、翻译、结构化预测、与序贯决策过程这五类。本篇参考自TensorFlow官方文档,旨在让大家能够通过简单的代码,快速上手自己的第一个nlp模型。

学习,是熵减的最有效途径。 1737

【NLP入门教程】二十三、循环神经网络(RNN)| 小白专场

本教程旨在为初学者提供一份全面而系统的,探索NLP的核心概念、方法和技术。无论你是计算机科学的新手,还是对自然语言处理领域感兴趣的研究人员,本教程都将为你提供所需的基础知识和实用技能。当谈到自然语言处理(NLP)时,深度学习已经成为一种强大而广泛应用的技术。深度学习是一种机器学习方法,通过构建具有多层神经网络的模型来模拟和学习数据的复杂特征。在NLP领域,深度学习模型已经在多个任务上取得了突破性的性能,如文本分类、情感分析、机器翻译等。

m0_68629936的博客 1426

用于文本分类的RNN-Attention网络

这篇博客主要介绍Attention机制在文本分类任务上的作用,原理以及附带的代码实现。

thriving_fcl的博客 3万+

【NLP保姆级教程】手把手带你RNN文本分类(附代码)

写在前面这是NLP保姆级教程的第二篇----基于RNN的文本分类实现(Text RNN)参考的的论文是来自2016年复旦大学IJCAI上的发表的关于循环神经网络在多任务文本分类上的应用:R...

Kaiyuan_sjtu的博客 2913

NLP自然语言处理

自然语言处理( NLP)是计算机科学、人工智能和语言学的一个分支,旨在使计算机能够理解、解释和生成人类的自然语言。

qq_56246012的博客 1836

【自然语言处理(NLP)】循环神经网络RNN

循环神经网络(Recurrent Neural Network,RNN)是一类特殊的人工神经网络,它适合处理序列数据,在自然语言处理、语音识别等领域应用广泛。下面从结构原理、特点、存在的问题及应用场景等方面详细介绍。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

【自然语言处理】RNN模型(循环神经网络)

当前时间步的输入不仅有当前的输入还有上一时间步隐藏层的输出,它们进入RNN结构会进行融合拼接,形成新的张量x(t),h(t-1),之后新的张量通过一个全连接层(线性层),该层使用anh激活函数,最终得到当前时间步的输出h(t),它将作为下一时间步的输入和x(t+1)一起进入结构体,以此循环。其结构图如下所示,其特点是输入一个序列,而输出一个值而不是序列,要得到模型只需要在最后一个隐藏层进行线性变换就可以了,为了更好的结果,还要使用sigmoid和softmax进行处理。该模型可应用于图片转文字等问题上。

m0_69355534的博客 1701

《自然语言处理实战入门》聊天机器人 ---- 初探

自动问答是指利用计算机自动回答用户所提出的问题以满足用户知识需求的任务。问答系统是信息服务的一种高级形式,系统反馈给用户的不再是基于关键词匹配排序的文档列表,而是精准的自然语言答案,这和搜索引擎提供给用户模糊的反馈是不同的。在自然语言理解领域,自动问答和机器翻译、复述和文本摘要一起被认为是验证机器是否具备自然理解能力的四个任务。...

shiter编写程序的艺术 1587

【NLP傻瓜式教程】手把手带你RNN文本分类(附代码)

文章来源于NewBeeNLP,作者kaiyuan写在前面这是NLP傻瓜式教程的第二篇----基于RNN的文本分类实现(Text RNN)参考的的论文是来自2016年复旦大学IJCAI上的...

fengdu78的博客 4345

《AI大模型开发笔记》NLP基础——3、RNN模型

了解什么是RNN模型. 了解RNN模型的作用. 了解RNN模型的分类.

qq837993702的博客 1万+

【NLP傻瓜式教程】手把手带你CNN文本分类(附代码)

文章来源于NewBeeNLP,作者kaiyuan写在前面本文是对经典论文《Convolutional Neural Networks for Sentence Classificatio...

fengdu78的博客 8612

自然语言处理之情感分析:使用循环神经网络(RNN)进行文本分类实战

序列模型是处理序列数据的机器学习模型,特别适用于自然语言处理中的任务,如情感分析、机器翻译和语音识别。在NLP中,序列模型可以捕捉文本中的顺序信息,这是理解语义的关键。循环神经网络长短时记忆网络门控循环单元情感分析(Sentiment Analysis),也称为意见挖掘(Opinion Mining),是自然语言处理(NLP)领域的一个重要分支,主要目标是从文本中识别、提取和量化作者的情感、态度或观点。

zhubeibei168的博客 1372

Verilog——反相器

反相器代码: module inv( A, Y );//A,Y是端口 //定义端口属性 input A; output Y; //定义输入输出关系 assign Y=~A;//Y等于A的反 endmodule //inv是module的名字

weixin_41788560的博客 9501

RNN(循环神经网络)

RNN(Recurrent Neural Network), 中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出.RNN的循环机制使模型隐层上一时间步产生的结果,能够作为当下时间步输入的一部分(当下时间步的输入除了正常的输入外还包括上一步的隐层输出)对当下时间步的输出产生影响.结构:三层,输入、输出、隐藏层(循环在隐藏层)图中sigma为sigmiod函数,将值压缩在0-1之间。

weixin_63685622的博客 2万+

【C语言项目合集】这十个入门必备练手项目,让C语言对你来说不再难学!

适合刚入门C语言的编程学习小白的十个练手项目,每个都很经典且实用,让你学完C语言不再迷茫!

kxtxdy的博客 3万+

【NLP保姆级教程】手把手带你CNN文本分类(附代码)

分享一篇老文章,文本分类的原理和代码详解,非常适合NLP入门!写在前面本文是对经典论文《Convolutional Neural Networks for Sentence Classif...

Kaiyuan_sjtu的博客 4745

K-L展开 (Karhunen-Loeve expansion)

K-L变换

susan_wang1的博客 2万+

自举电容的工作原理-3句话总结

1、一道面试题 照例,先抛出来一道面试题:“Buck电路的SW引脚通常会放置一颗小电容,这颗电容有什么用?”。这个问题问得比较细,非常考验被面试者的硬件基本功。 2、似懂非懂的答案 有小伙伴可能不太清楚这颗电容的作用,回答不上来。也有小伙伴脱口而出:自举电容,用来做升压的。但后面好像说不出来具体逻辑。 没具体了解过,答不上来,也没啥可惜的。但是了解过一点,但又似懂非懂的这种,给出的答案只是轻轻点水或者千篇一律,那无疑是错过了一个加分项。 3、异步Buck的自举环路组成 既然是针对Buck电路讲自举电容,前面

ltqdxl的博客 3万+

【NLP】循环神经网络--RNN学习.day3

循环神经网络(Recurrent Neural Network, RNN)是一种用于处理序列数据的深度学习模型。与传统的静态神经网络相比,RNN 可以有效处理输入数据的时间序列特性。这使得 RNN 在处理自然语言处理(NLP)、时间序列预测、音频处理等任务时非常有效。以下是对 RNN 的详细解释。

alb3117149013的博客 1406

JeecgBoot漏洞利用工具解析:一键getshell原理与安全加固实践

在应用安全领域,远程代码执行(RCE)和文件上传漏洞是Web系统面临的高危威胁,其核心原理在于对用户输入的控制不足或安全校验缺失。攻击者通过构造恶意请求,可绕过系统边界,在服务器上执行任意命令或上传恶意文件,从而获取系统控制权。这类漏洞的技术价值在于揭示了应用层安全防护的薄弱环节,其利用方式自动化、集成化趋势明显,极大地提升了攻击效率。在低代码开发平台等快速构建的业务系统中,此类风险尤为突出。应用场景广泛覆盖安全测试、渗透评估与应急响应。本文聚焦于JeecgBoot平台的历史高危漏洞,深入解析其SQL注入、

weixin_30787531的博客 553
上一篇: 一份在阿里内网悄悄流传的大模型面试真题!(2024年最新)
下一篇: 产品经理如何在AI时代“上岸”
AI大模型_学习君
博客等级 码龄3年 6138粉丝 551原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值