自然语言处理9——深度学习
空出来的地方是需要模型训练的,即输出的是对空出来的地方的分类。传统:以普通文本或图数据库存储语料,来一个问句后对问句的类型进行分类,根据对问句的解析,到数据库中搜索,将得到的多个文本抽取出中心思想得出答案,再和问句比较一下是否有偏,修正后发出去。传统:抽取式,单文档按照句子的顺序抽出来句子,按段首的句子权重较高,有较多关键词的句子权重较高,有转折的句子后边权重更大点等给句子以权重;模型优化:CBO
自然语言处理9——深度学习
文章目录
深度学习视角下的NLP任务
深度学习:是一个黑箱模型,内部神经网络单元之间、权重是干嘛的如何解释现在还是未知
根据模型输入和输出进行分类
文本-类别
文本分类任务
输入 | 输出 |
---|---|
文本 | 单一类别 |
包含:谣言检测、情感计算、立场检测、意图分类、对话策略
序列加标注问题
输入 | 输出 |
---|---|
文本 | 和输入(词)等长,为每个词或每个字加个标记 |
包含:分词、词性标注、命名实体识别、句法分析、关键词识别、完型填空
文本-文本(seq2seq)
输入 | 输出 |
---|---|
文本 | 文本,输入和输出的文本不一定等长 |
包含:自动文摘、机器翻译、问答系统、文本生成、对话生成、文本风格改写、问句生成、自动纠错(也可以变成输入文本,输出类别表示该词是否需要纠错)、个性推荐、代码补全
自动文摘
传统:抽取式,单文档按照句子的顺序抽出来句子,按段首的句子权重较高,有较多关键词的句子权重较高,有转折的句子后边权重更大点等给句子以权重;多文档中需要计算句子和句子间的关系生成摘要。
深度学习:将文章和摘要对用于训练,训练出一些规则,自动地生成摘要
问答系统
传统:以普通文本或图数据库存储语料,来一个问句后对问句的类型进行分类,根据对问句的解析,到数据库中搜索,将得到的多个文本抽取出中心思想得出答案,再和问句比较一下是否有偏,修正后发出去。或者对候选答案进行打分排序,选择最高的输出或者选择几个合并输出。
深度学习:训练时输入大量的问答对和知识资源,经过模型的处理后生成答案,和标准答案进行损失计算来调整模型。如果知识资源只有一篇文章相当于阅读理解
聊天机器人
不仅仅是问答系统的一问一答,而是根据聊天的历史来确定当前答案。因此要包含个性化、知识性及同理心
知识图谱
如何应用知识图谱到自动文摘、问答系统聊天机器人中?
将问题转换为图数据库的查询语句,到知识图谱中查询出相关的答案
如何自动生成知识图谱?
实体有属性和值,关系也有属性和值,需要在语料中抽取出实体,及实体关系。深度学习需要大量的标注的训练数据,才能抽取出来
多文本-类别
输入 | 输出 |
---|---|
多文本 | 类别 |
包含:搜索引擎、关系抽取、自然语言推理
多文本-文本(seq2seq)
输入 | 输出 |
---|---|
多文本 | 文本 |
包含:生成式问答系统、抽取式问答系统、聊天机器人、多文档自动文摘、
其他:指代消解、图文转换(输入图片/文本,输出文本/图片)、视频理解(输入视频,输出文本)
NLP方法的四个范式
讲述在发展过程中人们是用什么思想解决NLP问题
第一范式
非神经网络时代的完全监督学习(特征工程)
概率统计时代:特征工程+算法:从输入数据中抽取特征,人类做的是决定用什么方法来抽取特征,且特征抽取部分最重要。需要大量任务训练数据。
第二范式
基于神经网络的完全监督学习(架构工程)
深度学习时代:自动获取特征,不需要人来决定,由神经网络模型自动抽取特征。需要大量任务训练数据,要是没有相关的大量数据,只能用迁移学习。人要做的是如何设计网络架构,如:CNN、RNN、机器翻译中的seq2seq。
特点:一个模型只能处理一个任务。
第三范式
为了解决跨领域学习问题及模型过大的问题。
预训练+精调范式(目标工程):包含两个阶段:1. 大量预训练数据,训练出一个预训练语言模型。2.将预训练出的模型结合下游任务,用少量的和下游任务有关的数据来精调
特点:一个模型可以解决多个任务,不需要大量的有监督下游任务数据,任务主要在大型无监督数据上训练,只需要少量下游任务数据来微调少量网络层。如:GPT-1,GPT-2,Bert
第四范式
预训练+提示+预测范式(prompt工程):存在一个预训练模型,为了最大程度上发挥预训练模型的效果,使用模板将原始输入修改为具有一些填充槽的文本,使用语言模型对未填充信息进行概率填充以获得最终字符串,从中可以导出最终输出。空出来的地方是需要模型训练的,即输出的是对空出来的地方的分类。甚至可以做到零样本学习。
如:GPT-3、LAMA、Prefix-Tuning等
词向量
词的表示:将词转化为数值
one-hot
假设中文中共有n个词,那么每个词就是n维向量,在独一无二的位置上标为1,其他地方都是0。
应用:
- 文本向量化(Bag of word),看文章中有多少个词,就建立几维的向量,有词的地方就标上数。
- n-gram模型:将词当作一个个孤立的原子单元,没有考虑词之间的内在联系
one-hot问题:向量维度灾难,且很稀疏;向量之间相互独立,看不出词语之间的关联关系;词序无关,即两个完全不一样的句子也可以表示成两个相同的向量。
希望词向量中语义/语法上相近的词距离近。
传统改进:
- 增加额外的特征:词性特征、前后缀特征
- 语义词典:但需要解决一词多义问题,且收录的词补全且更新慢。
- 词聚类特征
分布式(Distributed)词表示
上下文相似的词,其语义也相似。
方法1:用上下文中经常出现的词来唯一表示这个词。语义相似度通过计算向量相似度获得
问题:维度爆炸、稀疏性(为避免稀疏性,可用SVD来降维)
方法2:用模型学习的方式得到稠密的向量,通过自监督的方法直接学习词向量,也称词嵌入。
静态词向量训练模型
Word2Vec
Word2Vec:使用相近(当前词上下文)的词来预测目标词,层与层之间加权求和。
-
CBOW:来了一个句子将中间的词扣掉,用上下文(人工设置上下文的窗口大小)来预测中间词是什么,将预测的误差用反向传播来训练参数
- 输入层:one-hot向量;
- 投影层(隐含层):将输入层的向量加权累加;W共享的输入权重矩阵,V*N维,V是词集的规模,N是自己设定的,表示希望输出的每个词向量的大小是N。
- 初始化先给定一个W,W和每个on-hot向量进行乘法预算,将得到的向量相加求平均作为隐层向量。
- 隐藏层到输出层有一个矩阵 W ′ W' W′,用 W ′ H W'H W′H得到一个输出,哪一个维度的值最高就认为是哪一个维度的值。
- 输出层:对当前值的预测
- 根据输出结果和标准结果得到一个Loss,使得loss最小,反向传播更新 W W W和 W ′ W' W′,得到的 W W W就是想要的词向量矩阵
- 梯度下降:用梯度下降来更新 w w w,梯度为负,增加权重;若偏导数数值较大,迈的步幅就大一点: w = w − 学习率 ∗ 偏导数 w = w - 学习率*偏导数 w=w−学习率∗偏导数
- 反向传播:用于快速求出梯度下降需要的偏导数。自顶向下分发梯度值。
-
模型优化:CBOW的输出维度由词集的维度决定,可能会很大,每一个值都需要计算它的误差值反向传播回去,计算量非常大。
-
输出层:将softmax改为层次化的softmax,如:对应一颗Huffman树,将多分类问题变为2分类问题。但是太复杂了可能容易出错;若答案比较生僻,时间复杂度还是很高。
-
负采样方法:只对上下文的词和随机采样的词进行调整,而不对所有的维度进行调整。即最大化正样本(给定的上下文,词w就是正样本)的概率,同时最小化负样本(其他词)的概率。
- 负样本选择:频率高的词选中概率较大
- 正样本:输出时要分清正例和反例,设负样本有V个,则构建V个独立的分类器(如逻辑回归模型),每次迭代时只需更新少量逻辑回归模型参数。
-
- Skip-Gram:给定当前词,来预测该词的上下文应该是什么,将预测的误差反向传播回来,得到中间的词向量
Glovc模型
运用回归拟合,利用了附近词来拟合当前词及词-上下文同现的统计信息。
先构建一个词-上下文共现的矩阵:统计两个词在定长窗口内共出现的次数
词向量的构建:
-
回归目标: v w T v c ′ + b w + b c ′ = l o g M w , c v_w^T v_c' + b_w + b_c' = logM_{w,c} vwTvc′+bw+bc′=logMw,c,即:
词 w 的词向量 ∗ 词 c 的词向量 + 偏置 = l o g 词 c 出现在 w 上下文的概率 词w的词向量*词c的词向量 + 偏置 = log词c出现在w上下文的概率 词w的词向量∗词c的词向量+偏置=log词c出现在w上下文的概率
-
参数估计 ∑ f ( M w , c ) ( v w T v c ′ + b w + b c ′ − l o g M w , c ) 2 \sum f(M_{w,c})(v_w^T v_c' + b_w + b_c'-logM_{w,c})^2 ∑f(Mw,c)(vwTvc′+bw+bc′−logMw,c)2,为求导方便取平方,而 f ( M w , c ) f(M_{w,c}) f(Mw,c)表示样本权重,若w和c的词对频繁出现,则权重大一些。令目标函数越小越好。
静态词向量问题
静态词向量假设一个词只对应一个向量,无法处理一词多义现象。
如何获得词义信息:动态词向量
动态词向量训练模型
CoVe:将神经机器翻译的表示迁移到通用NLP任务上:机器翻译一个词不同的意思可以翻译成不同的词
ELMo
ELMo:第一代预训练-微调模式的大模型
思想:在大规模语料库来训练好一个单词的word Embedding(静态词向量),具体使用时根据单词上下文单词的语义来调整word Embedding 表示。
预训练:根据海量数据训练出一个根据单词上下文来预测单词的模型
-
第一层:输入:给定每个词的静态词向量,表示单词特征
-
将输入放入两层LSTM中,第一层LSTM:句法特征;第二层LSTM:语义特征
将得到的三层特征整合起来作为词向量表示,作为下游任务的输入
特点:
- 动态:上下文相关
- 鲁棒性强:使用字符级输入
- 词向量在各个层次上都有表示,给下游任务提供了较大的使用自由度
应用
作为词的特征用于下游任务的输入;作为词表示在下游任务训练过程中进行学习。
计算相似度:寻找相似词、词类比、知识图谱补全
作为神经网络输入:文本分类、情感分析、推荐系统
句子/文档表示
循环神经网络(RNN)
前馈/卷积神经网络处理NLP不是很合适的原因:它们的输入输出维度都是固定的,不能处理变长的序列;词汇节点与位置无关,无法对语言中的词序进行建模
循环神经网络:反复地调用神经元,通过使用带自反馈(隐藏层)的神经元,能够处理任意长度的序列。
每个神经元的输入:当前时刻词/字符输入;上一时刻的输出
简单循环神经网络
h t = f ( U h t − 1 + W x t + b ) h_t = f(Uh_{t-1} + Wx_t + b) ht=f(Uht−1+Wxt+b), x i x_i xi指每一时刻的词/词向量, y t = s o f t m a x ( W ( s ) h t ) y_t = softmax(W^{(s)}h_t) yt=softmax(W(s)ht)
记忆单元作用:记忆前一时刻隐藏层的值,能够保证序列不同时输出结果不一样。
LSTM
RNN存在很久之前的输入对当前时刻的网络影响较小(长期依赖问题),且反向传播的梯度也很难影响很久以前的输入,因此提出了LSTM。
核心:记忆单元和门机制
记忆单元:若遗忘门一直不通过的话,记忆单元就将从开始到最后的值都累加起来
门:由Sigmoid神经网络层和乘法运算,本质:确定信息通过的多还是少
- 遗忘门:让记忆单元中的历史信息通过多少过去,遗忘门连接到记忆单元是乘
- 输入门:有多少信息能够加入到记忆单元中,连接到记忆单元是加
- 输出门:有多少信息能够传递到输出中,更新后的记忆单元的值与输出门的值进行一个点乘作为当前神经元的输出
- sigmoid神经元输出0到1之间的数字,这个数字描述有多少信息可以通过,0表示不通过任何信息,1表示全部通过
- 一个神经元的输入除了这一时刻的输入,还包含上一时刻的输出的值
需要训练的参数是RNN的四倍,因为LSTM每个神经元的输入变为4个,而RNN只有一个
变种:堆叠式LSTM(需要解决梯度消失梯度爆炸问题);peephole:可以把 c t c_t ct加入到输入中;GRU模型:将输入门和遗忘门合并到一起:更新门,用更新门决定保留或放弃;同时还合并了记忆单元和隐藏神经元。
LSTM问题:部分解决梯度消失问题,但对于更长的序列仍会显得棘手;LSTM串行处理,计算费时且无法并行化处理。
双向循环神经网络
单向的只能用到前面的信息;双向的神经元可以考虑上下文的信息,缩小选择范围
Forward层:从0时刻到i时刻正向计算,得到并保存每个时刻向前隐含层的输出
Backward层:从i时刻到0时刻反向计算一遍,得到并保存每个时刻向后隐含层的输出
输出:每个时刻结合Forward层和Backward层对应时刻的结果
应用
- Multiple to one:输入:序列 输出:类别,如:情感分类、文本分类、主题识别
- 同步序列到序列:输入和输出等长,序列加标注问题
- 异步序列到序列:输入和输出不是等长的,通常采用编码解码器来实现
- 机器翻译:编码:读入源句子,转换成一个固定的上下文向量;解码:给定上下文和之前预测的词,预测下一个翻译的词
- 对话系统:编码:输入问句;解码:答句
- 构建句子嵌入:对于句子我也想用一个向量来表示它;输入:句子,输出如果是同样的句子,中间的向量就可以作为句子向量
- 多标签分类:多分类是指来个东西看是多个类别中哪个;多标签分类是一个样本可以分给多个类别。输入:seq,输出:由多个类别构成的seq。
- one to many:看图说话
- 自动写诗:输入:关键词、标题等信息;输出:完整的一首诗
注意力机制
传统的基于RNN的seq2seq模型的问题:定长的中间向量c限制了模型性能;输入序列的不同部分对于输出序列的重要性不同。
输出端如何找到和它对应的最相关的输入呢?注意力机制,以机器翻译为例
解决方案:1.解码器中每个时刻不是输入固定的向量c,而是不同的向量;2.每个时刻的向量自动选取与当前输出最相关的上下文
c如何计算? c i = ∑ j = 1 T x a i j h j c_i = \sum \limits_{j = 1}^{T_x}a_{ij}h_j ci=j=1∑Txaijhj, a i j a_{ij} aij是目标词 y i y_i yi与源词 x j x_j xj对齐的概率,输出与某个输入相关度高, a i j a_{ij} aij就大一点。能够解决远距离依赖问题。
系数 a i j a_{ij} aij怎么算?计算encoder的中间向量 h i h_i hi哪些是和decoder的中间向量 h j ′ h_j' hj′相关的,相关的就给较高的权重。
步骤:用 h j − 1 ′ h_{j-1}' hj−1′和所有的 h i h_i hi计算相似度(如:内积、向量的夹角余弦等),如图,计算 h 3 ′ h_3' h3′,通过 h 2 ′ h_2' h2′计算出 a 31 , a 32 , a 33 , a 34 a_{31} ,a_{32} ,a_{33} ,a_{34} a31,a32,a33,a34
机器阅读中的注意力机制:给定一个问题,从候选句子集合中选出答案。
往期文章:
自然语言处理1——NLP概述
自然语言处理2——语言学基础
自然语言处理3——语言学资源
自然语言处理4——统计语言模型
自然语言处理5——词法分析
自然语言处理6——HMM模型和词性标注
自然语言处理7——句法分析
自然语言处理8——语义分析

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)