barriers / 阅读 / 详情

【NLP】BERT常见问题汇总

2023-07-17 09:09:54
共1条回复
cloudcone

bert结构大体上可分为 输入 N层transformer的encoder 输出 三部分组成。

输入 由 token embedding 、 segment embedding 和 position embedding 三部分相加组成;

N层transformer的encoder ,在bert_base中N=12,bert_large中N=24

输出 有 model.get_sequence_out() 和 model.get_pooling_out() 两种输出,其shape分别为[batch_size, seq_length, hidden_size]和[batch_size, hidden_size]。

model.get_sequence_out() 输出主要用于特征提取再处理的序列任务,而 model.get_pooling_out() 输出可直接接softmax进行分类(当然需要外加一层dense层将hidden_size转换为num_tag)。

bert适合于自然语言理解(Natural language Understanding, NLU)类任务,如文本分类、信息抽取等;

bert不适合于自然语言生成(Natural language Generation, NLG)类任务。

因为bert采用的是双向的语言模型,除了被mask的词语外,该词语前后的词语都可以看到。

而NLG任务的目标是在已知当前词与之前词语的情况下,预测出下一个词语,直至所有词语预测完成。

相关推荐

embedding在工业界应用以及训练的tricks

embedding在工业界是非常常用的手段。例如双塔模型学习用户与内容的隐式向量表达,其产出可以用于召回,粗排,精排模型等多个阶段。 以下为一些使用的细节: 1、大规模粗排用离线计算的embedding加速,可以扩大粗排规模 2、利用预训练的embedding为模型提供更好的用户表达(一些模型对于某目标的预测不会使用用户的全量行为特征,所以能获取其在全量行为下计算的embedding作为初始化便能提升效果) 这与CV和NLP领域的pre training + fine turning是一样的方法 3、对于很多离散值,使用embedding输入dnn更有利于学习 4、对于一些连续值,也使其离散化后再用emb输入dnn 5、一些长尾用户的embedding更新几率很小,会导致其学习不充分。利用用户一些特征的刻画做用户分桶或聚类可以提升其学习效率(airbnb kdd1028) 6、对embedding层做专门的loss函数(multi-task),只更新其对应参数梯度,能加快其收敛。 7、也可以对一些过于低频的特征值做过滤,能减少参数空间,同样能提升其emb的收敛速度,避免过拟合 8、可以利用embedding做特征扩展。 通过embedding做特征“扩展” 9、建立单独的网络,仅对embedding层进行训练(参见狼厂的abacus)
2023-07-17 04:48:331

开浏览器百度老弹这个1 embedding东西怎么办

去投诉在这里发没用的在这里投诉http://tousu.baidu.com/zhidao你试试吧
2023-07-17 04:48:421

chrome://embedding/是什么意思

是网页错误的意思。
2023-07-17 04:48:584

BERT 结构与原理(1)--Embedding

u2003u2003BERT主要是多个Transformer的Encoder作为主题,主要包含Embedding层,Encoder层。 u2003u2003BERT中的Embedding主要有3种: u2003u2003Token Embedding 是对词向量进行编码。原始的输入是[batch,seq_len]。经过 Token Embedding 后数据的维度为[batch,seq_len,d_model]。 u2003u2003在BERT中Token Embedding的内部计算流程是初始化一个二维数组,大小为[vocab_size,d_model],然后将输入的数据进行one-hot编码,维度为[batch,seq_len,vocab_size],进行tensor的乘法。验证如下: 可以看见两者的结果是一样的,所以猜测embedding内部就是先将句子中每个词的索引表示转化为one-hot表示,然后对编码后的数据进行矩阵的变换,其中参数开始是输出化的,后面训练的时候可以用来学习。编码后的输出为[batch,seq_len,d_model] u2003u2003BERT中的Position Embedding和Transformer不一样,transormer中式直接利用公式,计算出对用维度的值。在BERT中是要学习的。比如说d_model的大小为512,那么每个句子就会生成一个[0,1,2,...511]的一维数组,然后重复batch次,因此实际的输入为[batch,d_model],将其送到one_hot中进行编码,具体的编码过程和Token Embedding一样,然后最后的输出为[batch,seq_len,d_model]。和Token Embedding输出的维度一样。一般是不用的,只在句子对的时候采用。其编码后的维度也是[batch,seq_len,d_model]。
2023-07-17 04:49:061

encoding与embedding

encoding和embedding都是自然语言处理中将词语向量化的方法。 不考虑词之间的联系,每个词之间是独立的。 在这种方法中,没有考虑到同个词不同的语义。 常用的对类别标签进行encoding的one hot encode就是采用了这种方法。因为每个类别是一个数字,它们之间并没有内在联系。 同个词即是同个type。 将类似的词语聚类在一起,使得相似的词语之间的余弦值较小。 由于同一个词语在不同的语境下可能会有不同的含义,同个词可能根据语义不同会有不同的编码方式。这种方法使得同一个词(type)可以有不同的语义(token)。也就是说,同个type不代表同个token。 可以参考知乎上的文章 Word Embedding--介绍
2023-07-17 04:49:131

pytorch中nn.Embedding原理及使用

torch.nn包下的Embedding,作为训练的一层,随模型训练得到适合的词向量。 实际上,上面通过随机初始化建立了词向量层后,建立了一个“二维表”,存储了词典中每个词的词向量。每个mini-batch的训练,都要从词向量表找到mini-batch对应的单词的词向量作为RNN的输入放进网络。那么怎么把mini-batch中的每个句子的所有单词的词向量找出来放进网络呢, 输入是什么样子,输出是什么样子? 首先我们知道肯定先要建立一个词典,建立词典的时候都会建立一个dict:word2id:存储单词到词典序号的映射。假设一个mini-batch如下所示: 显然,这个mini-batch有3个句子,即batch_size=3 第一步首先要做的是:将句子标准化,所谓标准化,指的是:大写转小写,标点分离,这部分很简单就略过。经处理后,mini-batch变为: 可见,这个list的元素成了一个个list。还要做一步:将上面的三个list按单词数从多到少排列。标点也算单词。至于为什么,后面会说到。 那就变成了: 可见,每个句子的长度,即每个内层list的元素数为:5,5,4。这个长度也要记录。 之后,为了能够处理,将batch的单词表示转为在词典中的index序号,这就是word2id的作用。转换过程很简单,假设转换之后的结果如下所示,当然这些序号是我编的。 同时,每个句子结尾要加EOS,假设EOS在词典中的index是1。 那么长度要更新: 很显然,这个mini-batch中的句子长度不一致。所以为了规整的处理,对长度不足的句子,进行填充。填充PAD假设序号是2,填充之后为: 这样就可以直接取词向量训练了吗? 不能。上面batch有3个样例,RNN的每一步要输入每个样例的一个单词,一次输入batch_size个样例,所以batch要按list外层是时间步数(即序列长度),list内层是batch_size排列。即batch的维度应该是: 怎么变换呢? 变换方法可以是:使用itertools模块的zip_longest函数。而且,使用这个函数,连填充这一步都可以省略,因为这个函数可以实现填充。 经变换,结果应该是: batch还要转成LongTensor: 这里的batch就是词向量层的输入。 词向量层的输出是什么样的? 好了,现在使用建立了的embedding直接通过batch取词向量了,如: 假设词向量维度是6,结果是: 维度的前两维和前面讲的是一致的。可见多了一个第三维,这就是词向量维度。所以,Embedding层的输出是:
2023-07-17 04:49:201

怎么形象理解embedding这个概念

embedding 可以理解为比如降维,或者说把一些复杂难以表达的特征用相对来说可以用数学表达或者更易计算的形式来表达的一种映射。比如把单词转化成向量,把数字(的奇偶正负实复等性质)转化成n维矩阵。
2023-07-17 04:49:471

word embedding 是什么

word embedding的意思是:给出一个文档,文档就是一个单词序列比如 “A B A C B F G”, 希望对文档中每个不同的单词都得到一个对应的向量(往往是低维向量)表示。比如,对于这样的“A B A C B F G”的一个序列,也许我们最后能得到:A对应的向量为[0.1 0.6 -0.5],B对应的向量为[-0.2 0.9 0.7] (此处的数值只用于示意)之所以希望把每个单词变成一个向量,目的还是为了方便计算,比如“求单词A的同义词”,就可以通过“求与单词A在cos距离下最相似的向量”来做到。
2023-07-17 04:49:561

生物中的embedding是指什么

是指细胞在生命过程中,把储存在DNA序列中的遗传信息,经过转录和翻译,转变成具有生物活性的蛋白质分子的过程。FDC是一种细胞的名字,这种细胞会大量合成Fc受体和补体受体这两种蛋白。
2023-07-17 04:50:041

embedding文件打不开

文件被锁定了。出现embedding文件打不开的现象可能是文件被锁定了导致的,可以在文件里找见lck的文件名称进行删除(注意不止一个),删除后,就不再提示打不开的现象了。
2023-07-17 04:50:111

神经网络中embedding 什么意思

简单说:超阈值,引起某变化,超阈值,论少,都产影响.定性理解,数字逻辑电路电平阈值类比
2023-07-17 04:50:181

Embedding manifest是什么意思?

嵌入清单
2023-07-17 04:50:263

word2vec和word embedding有什么区别

个人理解是,word embedding 是一个将词向量化的概念,来源于Bengio的论文《Neural probabilistic language models》,中文译名有"词嵌入"。word2vec是谷歌提出一种word embedding 的工具或者算法集合,采用了两种模型(CBOW与skip-gram模型)与两种方法(负采样与层次softmax方法)的组合,比较常见的组合为 skip-gram+负采样方法。可以查看以下两个来源,word embedding :Word embedding - Wikipediaword2vec中的数学原理详解:word2vec 中的数学原理详解(一)目录和前言对于起源与其他的word embedding方法可以查看 Deep Learning in NLP (一)词向量和语言模型
2023-07-17 04:50:351

DIN原理和代码实现

DIN模型的创新点在于增加了注意力机制,用于生成用户的embedding向量。具体公式如下其中, 是用户的embedding向量, 是候选商品的Embedding向量, 是用户u的第i次行为的embedding向量。 用户embedding = Sum(候选商品与历史行为商品的注意力分*用户历史行为商品的embedding向量) 注意力分g(Vi, Va)函数是如何计算的呢? 对候选商品embedding和历史行为商品的embedding的元素减、候选商品embedding、历史行为商品的embedding进行concat,然后输入fc层,最后神经元输出层得到注意力得分。 tf.tile()函数是对张量进行扩展的。对张量内的数据按一定规则复制。 tf.squeeze()函数是从张量中移除大小为1的维度。 tf.where()函数。
2023-07-17 04:50:421

tf.nn.embedding_lookup() 详解

tf.nn.embedding_lookup() 的用途主要是选取一个张量里面索引对应的元素。 原理 u2003u2003假设一共有 个物体,每个物体有自己唯一的id,那么从物体的集合到 有一个trivial的嵌入,就是把它映射到 中的标准基,这种嵌入叫做 One-hot embedding/encoding . u2003u2003应用中一般将物体嵌入到一个低维空间 ,只需要在compose上一个从 到 的线性映射就好了。每一个 的矩阵 都定义了一个从 到 的线性映射: 。当 是一个标准基向量的时候 对应矩阵 中的一列,这就是对应id的向量表示。这个概念用神经网络图来表示如下: 函数原型: 返回值是一个dense tensor。返回的shape为shape(ids)+shape(params)[1:] 实际上tf.nn.embedding_lookup的作用就是找到要寻找的embedding data中的对应的行下的vector。 先让我们看下不同数据对应的维度: 这个是怎么做到的呢?关键的部分来了,看下图: lk中的值,在要寻找的embedding数据中找对应的index下的vector进行拼接。永远是look(lk)部分的维度+embedding(data)部分的除了第一维后的维度拼接。很明显,我们也可以得到,lk里面值是必须要小于等于embedding(data)的最大维度减一的。 以上的结果就是: 最后,partition_strategy是用于当len(params) > 1,params的元素分割不能整分的话,则前(max_id + 1) % len(params)多分一个id. 当partition_strategy = "mod"的时候,13个ids划分为5个分区:[[0, 5, 10], [1, 6, 11], [2, 7, 12], [3, 8], [4, 9]],也就是是按照数据列进行映射,然后再进行look_up操作。 当partition_strategy = "div"的时候,13个ids划分为5个分区:[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10], [11, 12]],也就是是按照数据先后进行排序标序,然后再进行look_up操作。 参考: https://www.jianshu.com/p/abea0d9d2436
2023-07-17 04:50:501

打开CAD就有Embedding是什么

commandline 即"命令行"的意思dashboard 即“表格”的意思在CAD界面中你在无任何指令下按空格键都会出现 commandline,意思就是让你在命令行输入命令。从上述情况看你的CAD安装得没有问题。
2023-07-17 04:51:121

什么是embedding space

非常丰富
2023-07-17 04:51:212

Transformer中Decoder的Embedding layers架构设计、运行流程和数学原理是什么?

Transformer解释下这个结构图。首先,Transformer模型也是使用经典的encoder-decoder架构,由encoder和decoder两部分组成。用Nx框出来的,就是我们encoder的一层。encoder一共有6层这样的结构。用Nx框出来的,就是我们decoder的一层。decoder一共有6层这样的结构。输入序列经过word embedding和positional embedding相加后,输入到encoder中。输出序列经过word embedding和positional embedding相加后,输入到decoder中。最后,decoder输出的结果,经过一个线性层,然后计算softmax。
2023-07-17 04:51:291

embedding projector怎么用

降维的方法Embedding Projector 提供了三种常用的数据降维(data dimensionality reduction)方法,这让我们可以更轻松地实现复杂数据的可视化,这三种方法分别是 PCA、t-SNE 和自定义线性投影(custom linear projections):PCA 通常可以有效地探索嵌入的内在结构,揭示出数据中最具影响力的维度。t-SNE 可用于探索局部近邻值(local neighborhoods)和寻找聚类(cluster),可以让开发者确保一个嵌入保留了数据中的所有含义(比如在 MNIST 数据集中,可以看到同样的数字聚类在一起)。自定义线性投影可以帮助发现数据集中有意义的「方向(direction)」,比如一个语言生成模型中一种正式的语调和随意的语调之间的区别——这让我们可以设计出更具适应性的机器学习系统。Embedding Projector 这个工具使用起来很简单,它可以实现数据的 2D 或 3D 效果展示。轻点鼠标,便可实现数据的旋转、缩放。我们按照 word2vec 教程在 TensorFlow 上训练了一些词向量,将这些词向量通过我们的工具进行可视化展示,点击图中任意一点(表示词向量的点),那么通过这种算法算出的,与这个词语义相关的词以及其向量空间距离就会罗列出来。它给我们提供了一种非常重要的探究算法性能的方法
2023-07-17 04:51:361

word2vec算出的词向量怎么衡量好坏

作者:Fiberleif链接:http://www.zhihu.com/question/37489735/answer/73314819来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。目前常用的衡量word embedding质量好坏的task主要分为两类:word analogy & document classification1.wordanalogy task假设给了一对单词 (a , b) 和一个单独的单词c,task会找到一个单词d,使得c与d之间的关系相似于a与b之间的关系,举个简单的例子:(中国,北京)和 日本,应该找到的单词应该是东京,因为北京是中国的首都,而东京也是日本的首都。 在给定wordembedding的前提下,task一般是通过在词向量空间寻找离(b-a+c)最近的词向量来找到d。2.documentclassification task这是一种通过使用词向量来计算文本向量(可以被用来进行文本分类的工作)的方法,为了得到文本向量,task通常采用了一种很简单的方法:取文本中所有词的词向量的平均值来代表该文本的文本向量,进而通过文本分类的准确度来反向评价训练出的词向量的质量。对于给定的word embedding,以上的方法确实可以大致地评价词向量的质量好坏,但我们不应该局限于它们,就像楼上所言,我们应该以word embedding对于实际任务的收益为评价标准,如果脱离了实际任务,很难讲不同的word embedding谁比谁更“好”,因为word embedding更像是一个解决问题所使用的工具而不是一个问题的终点。
2023-07-17 04:51:461

《Attention Is All You Need》算法详解

该篇文章右谷歌大脑团队在17年提出,目的是解决对于NLP中使用RNN不能并行计算(详情参考 《【译】理解LSTM(通俗易懂版)》 ),从而导致算法效率低的问题。该篇文章中的模型就是近几年大家到处可以听到的Transformer模型。 由于该文章提出是解决NLP(Nature Language Processing)中的任务,例如文章实验是在翻译任务上做的。为了CV同学更好的理解,先简单介绍一下NLP任务的一个工作流程,来理解模型的输入和输出是什么。 首先拿CV中的分类任务来说,训练前我们会有以下几个常见步骤: 所以对于分类任务来说,模型的输入为预处理过的图片,输出为图片的类别(一般为预测的向量,然后求argmax获得类别)。 在介绍NLP任务预处理流程前,先解释两个词,一个是tokenize,一个是embedding。 tokenize 是把文本切分成一个字符串序列,可以暂且简单的理解为对输入的文本进行分词操作。对英文来说分词操作输出一个一个的单词,对中文来说分词操作输出一个一个的字。(实际的分词操作多有种方式,会复杂一点,这里说的只是一种分词方式,姑且这么定,方便下面的理解。) embedding 是可以简单理解为通过某种方式将词向量化,即输入一个词输出该词对应的一个向量。(embedding可以采用训练好的模型如GLOVE等进行处理,也可以直接利用深度学习模型直接学习一个embedding层,Transformer模型的embedding方式是第二种,即自己去学习的一个embedding层。) 在NLP中,拿翻译任务(英文翻译为中文)来说,训练模型前存在下面步骤: 所以对于翻译任务来说,翻译模型的输入为句子每个词的one-hot向量或者embedding后的向量(取决于embedding是否是翻译模型自己学习的,如果是则输入one-hot就可以了,如果不是那么输入就是通过别的模型获得的embedding向量)组成的序列,输出为当前预测词的类别(一般为词表大小维度的向量) 知道了Transformer模型的输入和输出后,下面来介绍一下Transformer模型的结构。 先来看看Transformer的整体结构,如下图所示: 可以看出它是一个典型的seq2seq结构(encoder-decoder结构),Encoder里面有N个重复的block结构,Decoder里面也有N个重复的block结构。 可以注意到这里的embedding操作是与翻译模型一起学习的。所以Transformer模型的输入为对句子分词后,每个词的one-hot向量组成的一个向量序列,输出为预测的每个词的预测向量。 为了更好的利用序列的位置信息,在对embedding后的向量加上位置相关的编码。文章采用的是人工预设的方式计算出来的编码。计算方式如下 上式中,pos表示当前词在句子中的位置,例如输入的序列长L=5,那么pos取值分别为0-4,i表示维度的位置,偶数位置用 公式计算, 奇数位置用 公式计算。 文章也采用了加入模型训练来自动学习位置编码的方式,发现效果与人工预设方式差不多。 Encoder包含了N个重复的block结构,文章N=6。下面来拆解一个每个块的具体结构。 为了便于理解,介绍Multi-Head Attention结构前,先介绍一下基础的Scaled Dot-Product Attention结构,该结构是Transformer的核心结构。 Scaled Dot-Product Attention结构如下图所示 Scaled Dot-Product Attention模块用公式表示如下 上式中,可以假设QK的维度皆为 ,V的维度为 ,L为输入的句子长度, 为特征维度。 得到的维度为 ,该张量可以理解为计算Q与K中向量两两间的相似度或者说是模型应该着重关注(attention)的地方。这里还除了 ,文章解释是防止维度 太大得到的值就会太大,导致后续的导数会太小。(这里为什么一定要除 而不是 或者其它数值,文章没有给出解释。) 经过 获得attention权重后,与V相乘,既可以得到attention后的张量信息。最终的 输出维度为 这里还可以看到在Scaled Dot-Product Attention模块中还存在一个可选的Mask模块(Mask(opt.)),后续会介绍它的作用。 文章认为采用多头(Multi-Head)机制有利于模型的性能提高,所以文章引入了Multi-Head Attention结构。 Multi-Head Attention结构如下图所示 Multi-Head Attention结构用公式表示如下 上述参数矩阵为 , , , 。 为multi-head attention模块输入与输出张量的通道维度,h为head个数。文中h=8, , 关于multi-head机制为什么可以提高模型性能 文章末尾给出了多头中其中两个头的attention可视化结果,如下所示 图中,线条越粗表示attention的权重越大,可以看出,两个头关注的地方不一样,绿色图说明该头更关注全局信息,红色图说明该头更关注局部信息。 从结构图不难看出网络加入了residual结构,所以add很好理解,就是输入张量与输出张量相加的操作。 Norm操作与CV常用的BN不太一样,这里采用NLP领域较常用的LN(Layer Norm)。(关于BN、LN、IN、GN的计算方式可以参考 《GN-Group Normalization》 ) 还要多说一下的是,文章中共Add&Norm结构是先相加再进行Norm操作。 该结构很简单,由两个全连接(或者kernel size为1的卷积)和一个ReLU激活单元组成。 Feed Forward结构用公式表示如下 Decoder同样也包含了N个重复的block结构,文章N=6。下面来拆解一个每个块的具体结构。 从名字可以看出它比2.3.1部分介绍的Multi-Head Attention结构多一个masked,其实它的基本结构如下图所示 可以看出这就是Scaled Dot-Product Attention,只是这里mask是启用的状态。 这里先从维度角度考虑mask是怎么工作的,然后再解释为什么要加这个mask操作。 mask工作方式 为了方便解释,先不考虑多batch和多head情况。 可以假设QK的维度皆为 ,V的维度为 。 那么在进行mask操作前,经过MatMul和Scale后得到的张量维度为 。 现在有一个提前计算好的mask为 ,M是一个上三角为-inf,下三角为0的方阵。如下图所示(图中假设L=5)。 的结果如下图所示(图中假设L=5) 注意:下图中的非0区域的值不一定是一样的,这里为了方便显示画成了一样的颜色 现在Scaled Dot-Product Attention的公式如下所示 可以看出经过M后,softmax在-inf处输出结果为0,其它地方为非0,所以softmax的输出为 ,该结果为上三角为0的方阵。与 进行相乘得到结果为 。 从上述运算可以看出mask的目的是为了让V与attention权重计算attention操作时只考虑当前元素以前的所有元素,而忽略之后元素的影响。即V的维度为 ,那么第i个元素只考虑0-i元素来得出attention的结果。 mask操作的作用 在解释mask作用之前,我们先解释一个概念叫 teacher forcing 。 teacher forcing这个操作方式经常在训练序列任务时被用到,它的含义是在训练一个序列预测模型时,模型的输入是ground truth。 举例来说,对于"I Love China -> 我爱中国"这个翻译任务来说,测试阶段,Encoder会将输入英文编译为feature,Decoder解码时首先会收到一个BOS(Begin Of Sentence)标识,模型输出"我",然后将"我"作为decoder的输入,输出"爱",重复这个步骤直到输出EOS(End Of Sentence)标志。 但是为了能快速的训练一个效果好的网络,在训练时,不管decoder输出是什么,它的输入都是ground truth。例如,网络在收到BOS后,输出的是"你",那么下一步的网络输入依然还是使用gt中的"我"。这种训练方式称为teacher forcing。如下图所示 我们看下面两张图,第一张是没有mask操作时的示例图,第二张是有mask操作时的示例图。可以看到,按照teacher forcing的训练方式来训练Transformer,如果没有mask操作,模型在预测"我"这个词时,就会利用到"我爱中国"所有文字的信息,这不合理。所以需要加入mask,使得网络只能利用部分已知的信息来模拟推断阶段的流程。 decoder中的Multi-Head Attention内部结构与encoder是一模一样的,只是输入中的Q为2.4.1部分提到的Masked Multi-Head Attention的输出,输入中的K与V则都是encoder模块的输出。 下面用一张图来展示encoder和decoder之间的信息传递关系 decoder中Add&Norm和Feed Forward结构都与encoder一模一样了。 1. 从图中看出encoder和decoder中每个block的输入都是一个张量,但是输入给attention确实QKV三个张量? 对于block来说,Q=K=V=输入张量 2. 推断阶段,解码可以并行吗? 不可以,上面说的并行是采用了teacher forcing+mask的操作,是的训练可以并行计算。但是推断时的解码过程同RNN,都是通过auto-regression方式获得结果的。(当然也有non auto-regression方面的研究,就是一次估计出最终结果) 参考:
2023-07-17 04:51:541

浏览器地址栏老是自动出现“http://-embedding/”然后显示无法访问该网站?

明显中毒了,杀毒即可
2023-07-17 04:52:142

召回阶段的多兴趣模型——MIND

2019年阿里团队发表在CIKM上的论文“Multi-Interest Network with Dynamic Routing for Recommendation at Tmall”,应用胶囊网络的动态路由算法来构建一个多兴趣网络MIND,是一个召回阶段的模型。 本文是在召回阶段的工作,来满足用户兴趣的物品的有效检索。建立 「用户兴趣模型」 和 「寻找用户兴趣表示」 是非常重要的,但由于 「用户的兴趣存在着多样性」 并不是一件容易的事。 现有的一些用户兴趣表示方法: 1.基于协同过滤的方法通过历史交互物品或隐藏因子来表示用户兴趣:会遇到稀疏和计算问题。 2.基于深度学习的方法用低维Embedding向量表示用户兴趣: 作者认为这是多兴趣表达的一个瓶颈,因为必须压缩所有与用户多兴趣相关的信息到一个表示向量,所以关于用户多兴趣的所有信息是混合在一起的,导致召回阶段物品检测不准确。 3.DIN在Embedding的基础上加入Attention机智:但采用attention机制对于每个目标物品,都需要重新计算用户表示,因此无法使用在召回阶段。 关于胶囊网络: 囊间动态路由算法,Dynamic Routing胶囊算法的核心就在于此处参数b的更新方法:更新参数时,综合考量了低层特征 与输出胶囊特征,由于二者都是向量,当二者同向时,即二者相似度较高,当前的低层特征更能反映图像特征,乘积为正,b权重增加,表示当前低层胶囊更被高层胶囊所“接纳”;相反,当二者反向时,代表当前低层特征与输出胶囊匹配度并不高,乘积为负,b权重减小,表示当前低层胶囊被更高层胶囊所“排斥”。通过这样的权重更新方式建立起了低层特征与高层特征的关联,使模型更能“理解”图像。 “胶囊”是一组聚合起来输出整个向量的小神经元。采用动态路由学习胶囊之间的连接权值,并利用期望最大化算法(EM)对其进行改进,克服了一些不足,获得了更好的精度。 主要贡献: 文章关注的是在召回阶段用户的多兴趣的问题,提出了使用 动态路由的多兴趣网络(MIND) 来学习用户表示。 最主要的「创新点」是:采用胶囊网络的动态路由算法来获得用户多兴趣表示,将用户的历史行为聚集成多个集合内容,每一组历史行为进一步用于推断对应特定兴趣的用户表示向量。这样,对于一个特定的用户,MIND输出了多个表示向量,它们共同代表了用户的不同兴趣。用户表示向量只计算一次,可用于在匹配阶段从十亿个尺度的物品中检索相关物品。 任务目标 召回任务的目标是对于每一个用户 从十亿规模的物品池检索出包含与用户兴趣相关的上千个物品集。 模型输入 对于模型,每个样本的输入可以表示为一个三元组 ,其中 代表与用户 交互过的物品集,即用户的历史行为; 表示用户的属性,例如性别、年龄等; 表示为目标物品 的一些特征,例如物品id和种类id等。 核心任务 学习一个函数可以将User-Item实例(原生特征)映射为用户兴趣Embedding表达集合 为用户 的向量表示, 为embedding的维度, 表示向量数量即兴趣的数量。 若 =1,即其他模型(如Youtube DNN)的Embedding表示方式,物品 的Embedding函数为: 其中 , 表示一个Embedding&Pooling层。 最终结果 根据评分函数检索得到top N个候选项: 根据评分函数检索:即根据 目标物品与用户表示向量的内积的最大值作为相似度依据 ,DIN的Attention部分也是以这种方式来衡量两者的相似度。 Embedding层的输入由三部分组成,用户属性 、用户行为 和目标物品标签 。每一部分都由多个id特征组成,则是一个高维的稀疏数据,因此需要Embedding技术将其映射为低维密集向量。 相对于单一向量进行用户兴趣表示,作者采用多个表示向量来分别表示用户不同的兴趣。通过这个方式,在召回阶段,用户的多兴趣可以分别考虑,对于兴趣的每一个方面,能够更精确的进行物品检索。 为了学习多兴趣表示,作者利用胶囊网络表示学习的动态路由将用户的历史行为分组到多个簇中。来自一个簇的物品应该密切相关,并共同代表用户兴趣的一个特定方面。 动态路由 “胶囊”是一种用一个向量表示的新型神经元,而不是普通神经网络中使用的一个标量。基于向量的胶囊期望能够表示一个实体的不同属性,其中胶囊的方向表示一个属性,胶囊的长度用于表示该属性存在的概率。 动态路由是胶囊网络中的迭代学习算法,用于学习低水平胶囊和高水平胶囊之间的路由对数 (logit) ,来得到高水平胶囊的表示。 我们假设胶囊网络有两层,即低水平胶囊 和高水平胶囊 , 表示胶囊的个数 表示每个胶囊内的神经元个数(向量长度)。路由对数 通过以下计算得到并进行更新: 其中 表示待学习的双线性映射矩阵(在胶囊网络的原文中称为转换矩阵)。 通过计算路由对数,将高阶胶囊 的候选向量计算为所有低阶胶囊的加权和: 采用多个向量来表达 User 不同的兴趣,将 User 的历史行为分组到多个 Interest Capsules 的过程。实现逻辑如下: 输入: 输出: 定义: (1) 动态兴趣个数 (2)低阶行为向量Embedding表达: 代表User的行为向量(同 ) (3)高阶兴趣向量Embedding表达: 代表User的兴趣向量(同 ) (4)行为向量 与兴趣向量 之间的路由logit: (5)双线性映射矩阵: 步骤: (1) 计算兴趣Embedding个数 (2)初始化 (使用正态分布初始化) (3)遍历迭代次数 (3.1)对所有的行为路由 ,计算 (3.2)对所有的兴趣路由 ,计算 和 (3.3)迭代更新 其中 是一个共享矩阵 通过多兴趣提取层,多个兴趣胶囊从用户行为embedding建立。在训练期间,我们设计一个标签意识注意力层:让标签(目标)物品选择使用过的兴趣胶囊。特别的,对于每一个标签物品,计算兴趣胶囊和标签物品embedding之间的相似性,并且计算兴趣胶囊的权重和作为目标物品的用户表示向量,通过相应的兼容性确定一个兴趣胶囊的权重。 训练 得到用户向量 和标签物品embedding 后,计算用户 和标签物品 交互的概率:
2023-07-17 04:52:211

tf.feature_column实用特征工程总结

tf.feature_column主要针对离散特征和连续特征, 概括而言, tf.feature_column可以实现四种场景 tf.feature_column对离散变量的处理有四个接口, 分别是 整数直接onehot , 指定词表onehot , hash降维onehot , embedding离散特征连续化 , 其中前三种都会把字符串/整数特征处理成onehot 0/1向量,最后一种embedding_column会对onehot的结果之上在做低维稠密向量映射, 接口如下 如果这一列离散特征本身就是用连续的整数表示的(从0开始),则可以直接映射为离散变量,提前指定最大取值数量,如果超出了用默认值填充,适合本来就是用整数ID编码,并且编码氛围不是很大的离散特征, 如果传入的值列表包含多个元素, 可以实现mutihot, 但是列表元素个数要相同 如果一列离散特征是字符串(也可以是整数), 并且取值范围不多, 可以使用这个接口, 定义好离散特征的取值就好, 当出现新值的时候可以分配新的索引位置,或者映射到已有的位置上, 词表映射也支持mutihot 如果设置num_oov_buckets=0, 或者不设置默认, 新词会直接忽略掉 另一种方式设置, 也可以处理新词问题, 直接映射到一个其他的词上面, 比如叫其他 测试mutihot, 同一个元素在一行出现多次, 计数会超过1 如果这一列是字符串离散变量(也可以是整数, 支持整数和字符串), 并且取值很多的情况下, 比如ID, 可以使用这个接口 如果输入是整数数值, 使用dtype设置dtype=tf.int32, 内部会把整数先转化为字符串在做hash 整数,词表,hash之后通过indicator_column直接离散化, 进一步可以使用embedding_column将onehot矩阵通过一个中间的embedding随机词表, lookup成一个embedding稠密向量, 默认情况下embedding可以跟着模型继续训练, 即trainable=True, 对于mutihot, embedding支持向量组合方式mean, sqrtn和sum 1.hash之后做embedding 2.词表onehot之后做embedding 3.整数直接onehot之后再embedding mutihot的embedding tf.feature_column对连续变量的处理有两个个接口, 分别是 连续值直接映射成连续变量 , 连续值分箱离散离散化 ,接口如下 连续变量分箱之后可以继续接embedding tf.feature_column.crossed_column可以对离散特征进行交叉组合, 增加模型特征的表征能力 尝试用连续特征和离散特征进行交叉, 结果报错 定义多个特征时, 在features字典中定义多个key, tensor对象传入一个list, 其中list的特征顺序不影响特征组合结果, 以 feature_a.name的字符串顺序 决定组合的特征组合的顺序
2023-07-17 04:52:481

一文带你畅游视觉关系检测(Visual Relationship Detection)

视觉关系识别/检测 任务不仅需要识别出图像中的物体以及他们的位置(detection),还要识别物体之间的关系(relationship)。例子如下图所示,输入为一张图片,输出为objects和bounding boxes,以及objects之间的关系,如<person on motorcycle>。 视觉关系识别是图像理解的基础,可以 应用 在 挑战: 这篇文章将整理与视觉关系相关的论文,并作简要的介绍。论文列表: 第一篇是比较经典的论文,提出了一个数据集VRD和一个结合语言先验的关系预测模型。 Visual Phrases只有13个类型,Scene Graph 有两万多关系,但是它平均每个对象只有大约2个谓词关系。除了这三个数据集,还有有名的 VIsual Genome 大数据集,包含99658张图片,19237个关系,标注了物体类型,位置,属性和物体间的关系(场景图),还有caption,qa。虽然数据量大了,但是数据集的标注还是会有一些没有被标注的,毕竟组合多。 思考:论文利用了语言先验word embedding,对预测起到了很大的帮助,但是先验知识可能会使得关系预测倾向于频繁的关系,而忽略了视觉方面的信息。一个解决方案是先预训练视觉模型。然而,真正合理的融合先验的方式我觉得不是简单的乘法(先验可能会误导),是一个思考的点。 **Motivation: **这篇论文的启发是来源于知识图谱中,使用转移向量(translation vector)来表示实体之间的关系(见 Trans系列的知识表示 )。在视觉关系中,通过将对象的视觉特征映射到低维的关系空间中,然后用对象间的转移向量来表示对象之间的关系,比如person+ride=bike。如下图所示: 所以为了让 能够接近 ,即相似,loss函数为 在实验中,单从在VRD数据集上的predicate预测,与上一篇论文Lu对比是没有提升的(44<47),这是这篇论文中没有说明的,是我从两篇论文的实验数据中发现的。这篇论文在另外两个任务上效果比Lu的好些,我觉得有可能是用了Faster RCNN的缘故。 除了这三个任务的实验对比,还加了图像检索,zero-shot关系检测(没有Lu的好),特征重要性分析的实验。实验也表明了关系检测任务对目标检测任务的准确率的提升,不过其实很少。 更多相关的可参考原论文。 思考:论文用TransE来表示关系空间中对象与predicate的关系,如何映射到关系空间,更好的表达对象的联系,甚至predicate间的关系,是值得研究的一个点。(比如结合语言先验等,因为我觉的它的效果其实应该比不上加了语言先验的) 这篇论文跟上一篇论文类似,都是将<subject, rel, object>中的subject和object映射到一个空间中,他们间的关系表示为 .上一篇是基于知识图谱embedding的TransE(NIPS2013,Translating embeddings for modeling multi-relational data),而这一篇是基于TransD(ACL2015,Knowledge graph embedding via dynamic mapping matrix)。这是一个研究的方向,怎么将object,relationship很好的在embedding空间中表示。 论文的整个框架如图: 思考:这也是篇关于投射对象和关系到另一空间的论文,不过任务稍有不同,效果也比上一篇好些。同上,embedding也是可研究的一个方向。 这篇论文使用场景图scene graph来建模图片中对象以及它们的关系,任务是生成场景图: 这篇论文的亮点就是利用上下文信息以及消息传递,迭代更新以更好地预测关系。这是一个在场景图层级上的新的预测关系的方式,其消息传递方法等都是可以改进的地方,甚至结合embedding。 这篇论文的主要贡献是使用因式分解的方法来得到信息先验(a factorization scheme that yields highly informative priors),也就是关系的先验分布,即两个object间的predicate分布。 这个分布是通过张量分解的方法得到,具体是: (1) 张量构建Tensorize :关系张量 , i, j是对象,k是关系,表示为关系k的矩阵 的堆叠,每一个值对象i, j在数据集中有关系k的次数。张量表示可以反映objects间的内在联系,关系分布等。 最后BP训练SG网络,θ设为0.2. 在实验中,论文对比了Lu的Visual Relationship Detection with Language Priors,和Xu的Scene Graph Generation by Iterative Message Passing,都有较好的提升。 思考:这篇论文通过张量分解的方式来得到关系的先验分布,与论文Visual Relationship Detection with Language Priors用到的语言先验有着异曲同工之处,都是用predicate的先验分布来调整网络预测的关系,提升zero shot能力。 不过我认为这种直接相乘的调整方式是比较粗糙的,需要更好的方式来融合先验分布与视觉上预测的分布。 这是一篇用场景上下文信息和实体间的关系来改进目标检测的论文,举个被错误检测的例子说明上下文的作用: 这篇论文做的任务不是关系预测,而是利用关系来消歧关系中的相同类的对象,其实是根据关系元组,来定位对象的位置。比如下图中需要确定人踢球是图中的哪个人,在什么位置。 论文首先用attention到对象object/subject,然后用predicate的卷积核来进行注意力的shift,同时object和subject需要结合。 这又是李飞飞团队做的工作(他们团队做了很多relationship相关的工作,语言先验那篇,迭代消息传递那篇等),做的是语句生成图像,利用了场景图表示语句中对象间的关系/联系,一个很有趣的研究,应该是第一个使用场景图的图像生成尝试了。 Sentence一般包含多个对象,以及对象间关系的描述,是比较复杂的,从上图也可以看出,直接从语句到图像效果是很差的。但是当我们把语句解析为场景图,然后再生成图像,可以更好的生成图像表示对象间的关系。 具体做法大致是根据场景图做布局预测 (layout prediction) 预测对象的位置,最后结合噪声,用生成网络生成图像。具体细节这里就不啰嗦了,列一下最终效果吧。 可以看出,对象的位置基本位于正确的位置,不过生成的图像质量不是很高,所以还是有很大的改进空间的。 这篇论文是Arxiv上今年7月份的论文,利用图像中的对象间的关系和对象属性,做QA任务。关系挖掘根据图像和问题得到一系列相关的fact——关系,对象属性,然后再attention到需要的fact上,联合视觉特征最后得到最终answer。 思考:这种提取fact的方法为QA提供了高层的语义信息,也符合人的思维方式。相比于我之前调研过的方法( 一文带你了解VQA ),可以认为这是知识的补充,之前的方法有的是只有类,属性信息,或者是额外的文本形式的知识,本论文的方法多了关系的检测,且用一个网络来提取高层语义用于QA,相比直接做数据增强更具解释性。不过论文没有用到那个bottom-up attention,这是我觉得可以改进的地方。 至此,有关VIsual Ralationship的相关问题,方法大家应该有个大致的了解和收获。有什么问题和想法欢迎一起交流学习。
2023-07-17 04:52:561

GCN在推荐系统中的应用之GraphSage-based

GraphSage是在论文Inductive Representation Learning on Large Graphs William中提出的一种归纳式的embedding表示训练方法。 在上一篇所讲的GCN是transductive learning(直推式学习),即通过一个固定的图,直接训练每个节点的embedding。但是在很多图场景下,图节点是实时更新的,所以本文提出了inductive learning(归纳式学习)。不是在一个静态图上训练每个节点的embedding,而是通过训练得到一个由neighbood到embedding的映射关系(aggregator),使得结果可以仅通过邻居关系得到新加入的节点的embedding。 针对无监督学习,训练loss用的是pair-wise,认为有联系的2个节点间embedding应该是接近的,而没有联系的2个节点间embedding应该是远离的。(用内积表达的是余弦距离) 在训练数据集中有每个节点的feature information,然后用feature information来训练得到用户的节点,那如果没有feature information怎么办呢?用index来表示吗? 这篇论文做融合的总体框架还是GraphSage:从neighbor中抽取一定数量进行融合。但是与Graph有所区别在于不是随机抽取而是importance pooling. 以下说一下这篇论文的主要创新点: 这篇论文的总体框架其实很经典: 这篇文章是对上述NGCF所做的一个改进。文章发现NGCF中的feature transformation(W1, W2)和nonlinear activation( )操作不但使训练更困难,并且降低了准确度。这个的主要原因在于:GCN is originally proposed for node classification on attributed graph, where each node has rich attributes as input features; whereas in user-item interaction graph for CF, each node (user or item) is only described by a one-hot ID, which has no concrete semantics besides being an identifier. In such a case, given the ID embedding as the input, performing multiple layers of nonlinear feature transformation —which is the key to the success of modern neural networks — will bring no benefits, but negatively increases the difficulty for model training. 优化后的LightGCN的forward propagation layer: 注:在forward propagation中并没有加入self connection是因为layer embedding 的weighted sum操作其实包含了self connection。具体证明过程如下: So inserting self-connection into A and propagating embeddings on it is essentially equivalent to a weighted sum of the embeddings propagated at each LGC layer. 这篇论文旨在解决2个问题: So MGNN-SPred jointly considers target behavior and auxiliary behavior sequences and explores global item-to-item relations for accurate prediction. 本文算法框架: 构图算法: Item Representation Learning: for each node , one-hot representation ; Sequence Representation Learning: It was found that simple mean-pooling could already achieve comparable performance compared with attention mechanism while retaining low complexity. It is self-evident that the contributions of auxiliary behavior sequence for the next item prediction are different in different situations.So a gated mechanism is designed to calculate the relative importance weight : where denotes the one-hot representation of the ground truth. 这篇论文是解决sequential recommendation.主要贡献点在于: 首先在一个序列中用sliding window strategy取出子序列 ,然后对每个子序列如下图所示对item添加边 用external memory units去存储随时间变化的用户长期兴趣。用户随时间接触的序列为: . 则首先用multi-dimensional attention model生成query embedding: 其中 是sinusoidal positional encoding function that maps the item positions into position embeddings. 然后对memory unit作操作: The superscript C denotes the fusion of long- and short-term interests. 表示短期内接触的item与所要求的item的关系远近
2023-07-17 04:53:041

通俗讲解pytorch中nn.Embedding原理及使用

其为一个简单的存储固定大小的词典的嵌入向量的查找表,意思就是说,给一个编号,嵌入层就能返回这个编号对应的嵌入向量,嵌入向量反映了各个编号代表的符号之间的语义关系。 输入为一个编号列表,输出为对应的符号嵌入向量列表。 torch.nn包下的Embedding,作为训练的一层,随模型训练得到适合的词向量。 找到对应的词向量放进网络:词向量的输入应该是什么样子 实际上,上面通过随机初始化建立了词向量层后,建立了一个“二维表”,存储了词典中每个词的词向量。每个mini-batch的训练,都要从词向量表找到mini-batch对应的单词的词向量作为RNN的输入放进网络。那么怎么把mini-batch中的每个句子的所有单词的词向量找出来放进网络呢, 输入是什么样子,输出是什么样子? 首先我们知道肯定先要建立一个词典,建立词典的时候都会建立一个dict:word2id:存储单词到词典序号的映射。假设一个mini-batch如下所示: 显然,这个mini-batch有3个句子,即batch_size=3 第一步首先要做的是:将句子标准化,所谓标准化,指的是:大写转小写,标点分离,这部分很简单就略过。经处理后,mini-batch变为: 可见,这个list的元素成了一个个list。还要做一步:将上面的三个list按单词数从多到少排列。标点也算单词。至于为什么,后面会说到。 那就变成了: 可见,每个句子的长度,即每个内层list的元素数为:5,5,4。这个长度也要记录。 之后,为了能够处理,将batch的单词表示转为在词典中的index序号,这就是word2id的作用。转换过程很简单,假设转换之后的结果如下所示,当然这些序号是我编的。 同时,每个句子结尾要加EOS,假设EOS在词典中的index是1。 那么长度要更新: 很显然,这个mini-batch中的句子长度 不一致! 所以为了规整的处理,对长度不足的句子,进行填充。填充PAD假设序号是2,填充之后为: 这样就可以直接取词向量训练了吗? 不能!上面batch有3个样例,RNN的每一步要输入每个样例的一个单词,一次输入batch_size个样例,所以batch要按list外层是时间步数(即序列长度),list内层是batch_size排列。即batch的维度应该是: 重要的问题说3遍! 怎么变换呢?变换方法可以是:使用itertools模块的zip_longest函数。而且,使用这个函数,连填充这一步都可以省略,因为这个函数可以实现填充! 经变换,结果应该是: 记得我们还记录了一个lens: batch还要转成LongTensor: 这里的batch就是词向量层的输入。 词向量层的输出是什么样的? 好了,现在使用建立了的embedding直接通过batch取词向量了,如: 假设词向量维度是6,结果是: 维度的前两维和前面讲的是一致的。可见多了一个第三维,这就是词向量维度。所以,Embedding层的输出是:
2023-07-17 04:53:231

词向量与Embedding究竟是怎么回事

∫sinydy/cosy=∫sinxdx/cosx-∫dcosy/cosy=-∫dcosx/cosx所以lncosy=lncosx+klnCcosy=C*cosx所以y=arccos(C*cosx)
2023-07-17 04:53:301

embedding dimension嵌入维 指的是什么

就是嵌入的空间,比如输入的特征向量是1000维度的,现在通过线性或非线性变换投影到100维,这个变换后的空间就是一个embedding space
2023-07-17 04:53:381

torch.nn.embedding是什么东西

都是阴性,说明就是以前和现在都没有被感染啊
2023-07-17 04:53:541

打开CAD2007老是弹出网页embedding,请问怎么能取消

你的CAD软件给别人修改过的。我有纯粹的CAD2007,打开后直接就是CAD界面的
2023-07-17 04:54:031

阿里CAN:特征交互的新思路

本篇文章介绍了阿里妈妈定向广告团队的最新作品:Co-Action Net(以下简称CAN)。CAN提出了一种全新的特征交互思路,将待交互的特征(用户侧和商品侧特征)分别作为DNN的输入和权重,用DNN的输出作为特征交互的结果。CAN在提升了特征交互的表达能力同时,降低了传统的笛卡尔积交叉所需要的计算复杂度。 论文地址: https://arxiv.org/abs/2011.05625 . 作者的知乎专栏: https://zhuanlan.zhihu.com/p/287898562 在CTR预估任务中,特征间的交互一直是业界研究的热点。由于DNN以一个隐式的方式来学习输入特征,很难单纯依靠DNN来从庞大的稀疏特征集中学习到有效的特征交互,因此许多工作都在特征工程中采用了了手动特征交互,FM, FNN, PNN, DCN和DeepFM等都从不同的方面阐述了这一点,感兴趣的同学可以参考笔者之前的文章: 《从FM到DeepFM:浅谈推荐系统中的模型演化》 。 在推荐系统模型的构建中,特征工程占有十分重要的地位。在海量的输入特征中,用户行为(user behaviors)和推荐商品(recommended item)两者的交互可以准确地建模用户兴趣,论文作者将这种交互特征统一命名为co-action. 如图1所示:A和B代表模型的输入,Target可以为ctr的预估值。一般来说,可以由DNN来学习A和B之间的关系。但如果我们在输入端就手动将A、B进行交互,学习的难度会大大降低。 对于特征交互,最基本的方式就是做 笛卡尔积(Cartesian Product) 。在tensorflow中,这个操作就是cross column[1]. 对于特征A和B,笛卡尔积将两者组合成一个新特征(A, B);改变A或B的值,就会得到一个全新的特征。这种方式可以刻画出A、B间的所有组合。在训练样本充足,不考虑性能的情况下,笛卡尔积是最好的特征交互方式。但笛卡尔积有两个缺点: 顾名思义,CAN的目的在于建模不同特征之间的Co-Action,可以理解为一种新的特征交互方式。简单来说,该论文实现了一个pluggable的CAN网络单元,将待交互的两类特征分别作为CAN网络的输入和权重,网络的输出作为特征交互的结果。 图2展示了CAN的基本结构。输入特征可以分为用户行为序列(user behavior sequence),候选商品(target item),用户画像特征(user age 等)和其他特征。其中user sequence、target item和other feature通过embedding层后输入到DIEN网络结构。对于CAN部分,user sequence和target item的embedding被用作CAN的输入和权重参数,最后输出的结果sum pooling起来,与DIEN的输出concat在一起过后面的DNN部分。下面重点介绍一下整个网络结构中的关键:Co-Action Unit. CAN的整体实现逻辑还是比较简单的。将CAN中的全连接网络记为 ,候选商品特征 作为 网络的weight和bias,而用户行为序列特征 则是 网络的输入。这里 是所有unique ID的个数,即item ID的参数空间; 和 是embedding size,且 < . 在广告系统中,与用户点击过的商品相比,target item的个数较少,因此用 来作为 的参数。 由于 包含了 多层的参数,因此其维度需要大于 ,即 < . 通过split和reshape操作转化为weight和bias参数,这一过程可以表述如下: 与其他特征交互方式相比,CAN有以下几个优点: 前述的CAN结构只能显示地建模一阶特征交互。对于更高阶的情况,可以通过高阶输入来实现,即 其中c是特征交互的阶数。 论文中引入了3种做法来保证CAN学习的独立性。 由Table 2可以看出,CAN在两个实验数据集上的AUC指标均优于PNN,NCF[2],DeepFM;除此之外,笛卡尔积(Cartesian)作为最基础的特征交互手段,其结果是优于PNN,NCF和DeepFM的。但CAN的实验结果甚至比笛卡尔积还要好,这里的原因我想有两点: 为了验证CAN的泛化性,作者将test数据集中的那些在训练集中出现过的特征组合都删除,构造了一个冷数据测试集,该测试集中所有的特征组合都是模型之前没有见过的。实验结果如Table 5 所示: 可以看出,NCF和DeepFM的结果要优于笛卡尔积。与Table 2中的结论相比,证明笛卡尔积的泛化性确实存在问题;同时,CAN的AUC最高,也证明了CAN结构的泛化性明显强于笛卡尔积以及其他的特征交互方式。 笔者认为这是本论文最精华的部分之一。 作者在本节中详细论述了CAN模型在部署到阿里巴巴展示广告系统时遇到的一些困难和解决方案,对复杂ctr预估模型的落地有很大的指导意义。 特征交互,是在原始特征的基础上对特征对(feature pair)进行额外的组合,势必会引入额外的存储和计算开销。我们知道,CTR模型的大部分参数都集中在embedding部分,而笛卡尔积会让embedding大小线性增加。对于两个维度( 此处维度指unique IDs的数目 )为M和N的特征,笛卡尔积需要引入一个(M x N, embedding_size)大小的embedding矩阵;除此之外,新增的embedding也会引入更多的lookup操作,严重影响模型的响应时间,latency增大。作者提到即使采用了IDs frequency filtering(个人理解是根据ID出现的频率,过滤掉一部分低频ID来减小参数量,即低频过滤)也无法缓解。 对于CAN模型,虽然参数大大减小,但以上问题还是会影响到模型的部署。论文中使用了6个ad侧特征和15个用户侧特征进行交互,理论上这样会引入15 x 6 = 90个特征组合。而用户侧特征多为用户的行为序列,普遍长度都超过100,会带来更大的负担。 为了解决以上问题,论文中采用了以下方案: 特征间的交互对ctr预估模型具有重要的意义。本论文阐述了笛卡尔积和一些常用模型结构(FM,PNN,DeepFM等)的不足,提出了一种新型网络CAN来建模Feature Co-Action。CAN用DNN的输入和权重来建模特征交互,既解决了笛卡尔积的空间复杂度和泛化性问题,又能够获得较好的特征交互效果(体现在模型auc的指标上)。同时,引入了多阶输入(multiorder enhancement )和模块间的独立性(multi-level independence)使CAN的功能更加完备。最后介绍了模型上线遇到的困难和解决方案,对大型ctr预估模型的部署有很大的借鉴意义。 .
2023-07-17 04:54:451

因果推断推荐系统工具箱 - CPR(一)

【AAAI-2019】【University College London/Noah"s Ark Lab】 Top-N Recommendation with Counterfactual User Preference Simulation 文章旨在解决现有L2R场景下,训练样本系数且不平衡对推荐模型造成的影响。作者把推荐形式化为因果推断问题,并从观测数据中学习SEM,基于此从反事实的角度模拟用户的反馈。利用learning-based方法学习如何高效选取反事实样本,基于模拟数据和观测数据训练目标排序模型。并从理论上分析了生成样本数量和模型预测误差的关系,基于此提出利用启发式的方法控制预测误差带来的负面影响。 数据稀疏和不平衡严重影响了推荐模型的性能,同时不断地训练会持续放大偏差。反事实思想是解决这一问题的可靠方向,然而在推荐系统中应用反事实的方法面临着许多挑战, 为解决上述问题,作者提出了CPR框架。 CPR包括推荐数据模型器(实际就是样本生成器,可以理解为样本增强的一种)和目标排序模型。文章的主要工作在于如何实现推荐模拟器,一言以蔽之, 接下来首先,看看如何定义所谓的推荐模拟器以及如何学习模拟器模型的参数,再看如何通过最大化目标排序模型的损失,来高效的、可学习的寻找反事实样本。 作者,模拟器定义为SEM,并利用观测数据学习其参数。模型的定义和符合归纳如下, 因为 是一个列表,如果考虑所有联合概率 ,结果是在全部物品集合上的组合,计算量巨大。因此,作者忽略了不同物品之间的交叉组合的因果效应,使得联合概率分布可以被分解为每个物品单独出现概率的乘积,具体公式如下图所示。 表示推荐列表 的具体取值,其中每一个物品独立出现在推荐列表中的概率被表示为softmax的形式。 分别表示用户和物品的embedding, 是外生变量的权重,通过优化学习目标学习得到。 类似的,可以构建 。 分别表示用户和物品的embedding。 这里作者刻意选择了不同的embedding,保证学习到服务于不同目的的信息 。 是用户选择交互的物品列表的具体取值, 类似 是外生变量的权重。 有了因子分解后的联合概率,可以结合负采样技术[18, 26]来优化如下目标函数学习 的参数。其中 表示负样本。外生变量 是从正态分布中采样的。 由于用户可选择的物品只在展示给用户的列表里,因此,在 的学习过程中不需要进行负采样,可以直接利用softmax进行优化。 学习了F的参数之后,即得到了SEM,可以基于此生成反事实样本。作者采用Pearl"s “abduction-action-prediction”[2]实现反事实干预的估计。具体做法是, 本节描述了CPR框架的整体结构以及其中因果结构模型(SEM)的参数学习的方法,下一节继续介绍如何高效的选取反事实样本,以及作者如何利用理论分析得到启发式的方法,来控制预测误差的负面影响。 整个反事实干预的过程或者说干预过程的重点集中在估计推荐列表中的哪个物品会被点击。也就是说,反事实只发生在点击阶段, 而没有发生在推荐列表产生阶段 。模拟生成的只是用户的反馈。个人理解,这样做的好处可以减小噪声带来的方差,同时不会引入过多偏差。但是可生成的内容会不会比较局限,可能需要看具体场景。 [1] David M Blei, Alp Kucukelbir, and Jon D McAuliffe. 2017. Variational inference: A review for statisticians. Journal of the American statistical Association 112, 518 (2017), 859–877. [2] Judea Pearl, Madelyn Glymour, and Nicholas P Jewell. 2016. Causal inference in statistics: A primer. John Wiley & Sons. [3] Xiangnan He, Lizi Liao, Hanwang Zhang, Liqiang Nie, Xia Hu, and Tat-Seng Chua. 2017. Neural collaborative filtering. In Proceedings of the 26th interna- tional conference on world wide web. International World Wide Web Conferences Steering Committee, 173–182. [4] SteffenRendle,ChristophFreudenthaler,ZenoGantner,andLarsSchmidt-Thieme. 2009. BPR: Bayesian personalized ranking from implicit feedback. In Proceedings of the twenty-fifth conference on uncertainty in artificial intelligence. AUAI Press, 452–461.
2023-07-17 04:54:531

系统进程——关于PPlive.exe--Embedding

软件设计的问题
2023-07-17 04:54:591

DotProduct, RecSys20,重新审视Dot Product与NeuMF

Neural Collaborative Filtering vs. Matrix Factorization Revisited 这是一篇引起轰动的论文,motivation就是NCF[2]在推荐系统的引用量太高了(2427+),作者通过实验与分析,说明 dot product在推荐系统的计算相似度任务里效果比MLP更好 ,大家别被带偏了。 Dot Product就是矩阵分解, ; 与 可以理解成user与item的embedding。 MLP是用神经网络计算,先随机初始化user与item的embedding,然后concat起来经过DNN学习得到偏好得分, GMF是[2]提出的 与 的element-wise的加权Dot product,是矩阵分解的泛化版本。 NeuMF把embedding的一部分用来做MLP,一部分用来做GMF。 作者经过试验证明,经过调参的Dot product效果远好于MLP以及NCF提出的NeuMF(MLP+GMF)。 作者分析了,GMF引入了权重参数 ,如果L2正则化不加上 ,实际上学习没有任何效果;引入更多的参数,实际上需要更多数据来学习。 作者构造了一些Dot Prodcut的数据,用MLP去学习。 从实验结果中可以看出,MLP的学习误差非常大,RMSE大于0.02;说明如果问题的归纳偏置(induction bias,即问题的假设)是Dot Product的,MLP是不能很好地学习出来的。 作者举了几个例子,虽然MLP是万能模拟器,但是在很多领域是不能取代特定的归纳偏置的,比如CNN里的卷积、池化;RNN的参数共享;transformer结构等。在推荐系统里,可能归纳偏置就是Dot Product。 也可以看出,大部分情况下是从MLP往特定结构走,而不是往回走(再搞一个大新闻)。 思考: (1)看论文不可尽信,要有自己的思考,更要动手去实践。 (2)不要总想搞一个大新闻,要多思考问题的本质。 [1] Rendle, Steffen, et al. "Neural collaborative filtering vs. matrix factorization revisited." Fourteenth ACM Conference on Recommender Systems. 2020. [2] He, X., Liao, L., Zhang, H., Nie, L., Hu, X., and Chua, T.-S. Neural collaborative filtering. In Proceedings of the 26th International Conference on World Wide Web (Republic and Canton of Geneva, Switzerland, 2017), WWW "17, International World Wide Web Conferences Steering Commit- tee, pp. 173–182.
2023-07-17 04:55:071

GCAN:可解释的社交媒体假新闻检测方法

目前假新闻检测问题仍然存在一些重要的挑战。比如: ①目前的一些方法要求文档为长文本,以便于能够更好地学习词和句子的表示。然而社交媒体上的一些推文大多是短文本,这就导致了一些数据稀疏性问题。 ②一些SOTA的方法要求收集大量的用户评论,然而大多数用户仅仅是简单地转发推文而并不留下任何评论。 ③一些研究认为社交网络中的信息扩散(即retweet)路径有助于错误信息的分类,从而学习基于树的传播结构的表示。然而,由于隐私问题,获取转发的扩散结构往往代价高昂,许多用户选择隐藏或删除社交记录。 ④目前的一些方法缺乏可解释性,不能为支持谣言的可疑用户以及他们在制造谣言时关心的话题提供证据。 本文提出的方法利用源推文的短文本内容、转发用户序列以及用户资料来进行假新闻检测。也就是说本文的方法满足以下设置: ①短文本源推文; ②没有使用用户评论文本; ③没有使用社交网络和扩散网络的网络结构。 此外,我们要求假新闻检测模型具有可解释性,即在判断新闻是否虚假时突出证据。该模型将指出支持传播假新闻的可疑转发者,并突出他们特别关注的源推文中的词。 本文提出一个新的模型,即Graph-aware Co-Attention Network(GCAN)。首先从用户资料和社交互动中提取用户特征,然后使用CNN和RNN来学习基于用户特征的转发传播表示。另外使用图来建模用户之间的潜在交互,并且采用GCN来学习graph-aware的用户交互的表示。同时提出了dual co-attention机制来学习源推文和转发传播之间的相关性,以及源推文和用户交互之间的相互影响。最终利用学习到的embedding来进行假新闻的二分类预测。 1. 问题陈述 是推文的集合, 是用户的集合。每个 都是短文本文档(也叫做源推文)。 表明 由 个单词组成。 中的每个用户 都对应一个用户特征向量 。当一个推文 发布以后,一些用户将会转发 从而形成一个转发记录的序列,这被称为 传播路径 。给定一个推文 ,它的传播路径表示为 , 表明第 个用户(其用户特征向量为 )转发了 ,这里 。转发了 的用户集合记作 ,最先转发 的用户记作 ,转发时间记作 ,其余用户 在时间 转发了 ( )。每个 有一个binary的标签 表明是否是假新闻( 代表 是假新闻)。我们希望能够利用上述数据来利用神经网络模型识别 是否是假新闻,另外,希望模型能够突出能够表明 真实性的一部分用户 和一些推文中的词 。 2. GCAN框架 GCAN主要包括5个部分: ①user characteristics extraction,创建特征来量化用户如何参与在线社交网络; ②new story encoding,生成源推文中单词的表示; ③user propagation representation,使用提取的用户特征建模和表示源推文如何由用户传播; ④dual co-attention mechanisms,捕获源推文和用户交互/传播之间的相关性; ⑤making prediction,通过连接所有学习的表示生成检测结果。 GCAN的架构图如下: 3. 模型 用户 的特征向量 是定义得到的,具体的,包含以下特征: ①用户自我描述的字数; ②用户账户名的字数; ③关注用户 的数量; ④用户关注的人的数量; ⑤用户创建的story数量; ⑥举例用户第一个story经过的时间; ⑦用户的账户是否被验证过; ⑧用户是否允许地理空间定位; ⑨源推文发布时间和用户转发时间的时差; ⑩用户和源推文之间转发路径的长度(如果用户转发源推文则为1)。 最终得到 , 是特征的数量。 给定的源推文将使用一个word-level的encoder进行编码,输入是 中的每一个单词的独热向量。由于每个推文长度都不一样,这里设置 为最大长度,不足 的推文进行zero padding。使用 来表示源推文的独热编码表示, 是词的独热向量,使用一个全连接网络来获得word embedding , 是word embedding的维度,过程是: 然后使用GRU来学习词序列表示,也就是 ,最终得到 。 我们的目的是利用提取的用户特征 以及推文的传播序列来学习用户传播表示。其根本观点是,真实新闻传播中的用户特征与虚假新闻传播中的用户特征是不同的。这里的输入是推文 的转发用户特征向量序列,用 表示, 是选定的固定长度的转发用户数量。如果转发用户数量超过 则截取前 个,如果少于 则从 中重采样直至长度为 。 给定传播序列 ,使用GRU来学习传播表示, ,最终通过平均池化获得传播表示 , 。 采用2D卷积来学习 内特征的相关性,考虑 个连续用户来建模其序列相关性,比如 ,卷积核 的大小就是 ,总共使用 个卷积核,因此最终学习到的表示序列 。 我们的目的是创建一个图来建模转发用户之间潜在的交互,想法是拥有特殊特征的用户之间的相关性对揭示源推文是否是假新闻能够起到作用。每个源推文 的转发用户集合 都被用来构建一个图 。由于用户间的真实交互是不清楚的,因而这个图是全连接的,也就是任意节点相连, 。结合用户特征,每条边 都被关联到一个权重 ,这个权重也就是节点用户特征向量 和 的余弦相似度,即 ,图的邻接矩阵 。 然后使用第三代GCN来学习用户交互表示。给定邻接矩阵 和用户特征矩阵 ,新的 维节点特征矩阵 计算过程为: 是层数, , 是度矩阵, 是第 层的学习参数, 是激活函数。这里 ,实验时选择堆叠两层GCN层,最终学习到的表示为 。 我们认为假新闻的证据可以通过调查源推文的哪些部分是由哪些类型的转发用户关注的来揭开,并且线索可以由转发用户之间如何互动来反映。因此,本文提出了dual co-attention机制,来建模: ①源推文( )与用户传播embedding( )之间以及 ②源推文( )与graph-aware的交互embedding( )之间 的相互作用。通过dual co-attention的注意力权重,模型可以具有可解释性。 首先计算一个相似性矩阵 : 这里 是一个 的参数矩阵。接着按照以下方式得到 和 : 这里 ,这里的 和 可以看做在做user-interaction attention空间和source story word attention空间的转换。接下来得到attention的权重: 这里 , 是学习的参数。最后可以得到源推文和用户交互的attention向量: 和 描述源推文中的单词是如何被用户参与互动的。 按照上述类似过程生成 和 的attention向量 和 。 注意基于GRU的传播表示没有用来学习与 的交互。这是因为对于假新闻的预测来说,转发序列的用户特征能够起到重要的作用。因此本文采用基于GRU和CNN的两种方式来学习传播表示,其中基于CNN的传播表示被用来学习与 的交互,基于GRU的传播表示在进行最终预测时用作最终分类器的直接输入。 最终使用 来进行假新闻检测: 损失函数采用交叉熵损失。 对比了多项baseline的结果,效果有明显的提升: GCAN也可以用于假新闻早期的检测,也就是在转发用户不多的时候进行检测,实验改动了使用的转发用户数量来进行验证: 另外移除了一部分组件进行了消融实验,图中-A,-R,-G,-C分别代表移除dual co-attention,基于GRU的表示,graph-aware的表示和基于CNN的表示: -S-A代表既没有源推文embedding也没有dual co-attention,由于源推文提供了基本线索,因此-S-A有一个明显的性能下降。 source-propagation co-attention学习到的attention权重可以用来为预测假新闻提供证据,采用的方式就是标识出源推文中的重要的词和可疑的用户。注意,我们不考虑source-interaction Co-attention的可解释性,因为从构造的图中学到的用户交互特征不能直观地解释。 下图是根据对源推文中的attention权重绘制的两个例子的词云(权重越大,词云中的词就越大): 图中结果满足常识,也就是假新闻倾向于使用戏剧性和模糊的词汇,而真实新闻则是被证实和核实事实的相关词汇。 另外我们希望利用传播中的转发顺序来揭示假新闻与真新闻的行为差异。下图采集并展示了三个假新闻和三个真新闻的传播序列attention的权重: 结果表明,要确定一个新闻是否虚假,首先应该检查早期转发源推文的用户的特征。假新闻的用户attention权重可能在传播过程中均匀分布。 source-propagation co-attention可以进一步解释可疑用户的特征及其关注的词语,举例如下图: 可以发现,可疑用户在转发传播中的特征有: ①账号未被验证; ②账号创建时间较短; ③用户描述长度较短; ④距发布源推文用户的图路径长度较短。 他们高度关注的词是“breaking”和“pipeline”这样的词。我们认为这样的解释有助于解读假新闻的检测,从而了解他们潜在的立场。
2023-07-17 04:55:141

BERT:深度双向预训练语言模型

论文标题:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 论文链接: https://arxiv.org/abs/1810.04805 BERT(Bidirectional Encoder Representations from Transformers)通过预训练来学习无标注数据中的深度双向表示,预训练结束后通过添加一个额外的输出层进行微调,最终在多个NLP任务上实现了SOTA。 预训练语言模型在实践中证明对提高很多自然语言处理任务有效,其中包括句子层级的任务,比如自然语言推断(natural language inference)和复述(paraphrasing),还有token层级的任务,比如命名实体识别(named entity recognition)和问答(question answering)。 在下游任务中应用预训练语言模型表示的方法有两种:feature-based的方法和fine-tuning的方法。举例来说,ELMo这种预训练语言模型使用feature-based的方法,通过将ELMo的预训练的表示作为额外的特征输入到特定于任务的模型中去;GPT使用fine-tuning的方法,通过引入少量的特定于任务的参数,在下游任务中训练时所有的预训练参数。 截止BERT之前的预训练语言模型都是单向的(unidirectional),包括GPT和ELMo,这样的方法对句子层级的任务不是最优的,而且对于token层级的任务比如问答非常有害。BERT使用masked language model(MLM)的方法来预训练,这种方法能够训练一个双向的(directional)语言模型。除了masked language model的预训练的方法,BERT还使用了next sentence prediction的预训练方法。 BERT的使用分为两个阶段:预训练(pre-training)和微调(fine-tuning)。预训练阶段模型通过两种不同的预训练任务来训练无标注数据。微调阶段模型使用预训练参数初始化,然后使用下游任务(downstream task)的标注数据来微调参数。 BERT的一个显著特点是它在不同的任务上有统一的架构,使用时只需要在BERT后面接上下游任务的结构即可使用。 BERT的模型架构是一个多层双向的Transformer的encoder。我们标记模型的层数(每一层是一个Tranformer的block)为 ,模型的hidden size为 ,self-attention head的数量为 。两个比较通用的BERT架构为 和 。 对比GPT,BERT使用了双向self-attention架构,而GPT使用的是受限的self-attention, 即限制每个token只能attend到其左边的token。 BERT的输入表示能够是一个句子或者是一个句子对,这是为了让BERT能够应对各种不同的下游任务。BERT的输入是一个序列,该序列包含一个句子的token或者两个句子结合在一起的token。 具体地,我们会将输入的自然语言句子通过 WordPiece embeddings 来转化为token序列。这个token序列的开头要加上 [CLS] 这个特殊的token,最终输出的 [CLS] 这个token的embedding可以看做句子的embedding,可以使用这个embedding来做分类任务。 由于句子对被pack到了一起,因此我们需要在token序列中区分它们,具体需要两种方式: ①在token序列中两个句子的token之间添加 [SEP] 这样一个特殊的token; ②我们为每个token添加一个用来学习的embedding来区分token属于句子A还是句子B,这个embedding叫做segment embedding。 具体地,BERT的输入由三部分相加组成:token embeddings、segment embeddings和position embeddings。如下图所示: BERT使用两个无监督的任务进行预训练,分别是Masked LM和Next Sentence Prediction(NSP)。如下图所示,我们定义输入的embedding为 ,BERT最终输出的 [CLS] 的embedding为 ,最终输出的第 个token的embedding为 。 我们有理由相信一个深度双向模型比left-to-right模型和left-to-right和right-to-left简单连接的模型的效果更加强大。不幸的是,标准的条件语言模型只能够够left-to-right或者right-to-left地训练,这是因为双向条件会使每个token能够间接地“看到自己”,并且模型能够在多层上下文中简单地预测目标词。 为了能够双向地训练语言模型,BERT的做法是简单地随机mask掉一定比例的输入token(这些token被替换成 [MASK] 这个特殊token),然后预测这些被遮盖掉的token,这种方法就是Masked LM(MLM),相当于完形填空任务(cloze task)。被mask掉的词将会被输入到一个softmax分类器中,分类器输出的维度对应词典的大小。在预训练时通常为每个序列mask掉15%的token。与降噪自编码器(denoising auto-encoders)相比,我们只预测被mask掉的token,并不重建整个输入。 这种方法允许我们预训练一个双向的语言模型,但是有一个缺点就是造成了预训练和微调之间的mismatch,这是因为 [MASK] 这个token不会在微调时出现。为了缓解这一点,我们采取以下做法:在生成训练数据时我们随机选择15%的token进行替换,被选中的token有80%的几率被替换成 [MASK] ,10%的几率被替换成另一个随机的token,10%的几率该token不被改变。然后 将使用交叉熵损失来预测原来的token。 一些重要的NLP任务如Question Answering (QA)或者Natural Language Inference (NLI)需要理解句子之间的关系,而这种关系通常不会被语言模型直接捕捉到。为了使得模型能够理解句子之间的关系,我们训练了一个二值的Next Sentence Prediction任务,其训练数据可以从任何单语语料库中生成。具体的做法是:当选择句子A和句子B作为训练数据时,句子B有50%的几率的确是句子A的下一句(标签是 IsNext ),50%的几率是从语料库中随机选择的句子(标签是 NotNext )。 [CLS] 对应的最后一个隐层输出向量被用来训练NSP任务,这个embedding就相当于sentence embedding。虽然这个预训练任务很简单,但是事实上在微调时其在QA和NLI任务上表现出了很好的效果。在前人的工作中,只有sentence embedding被迁移到下游任务中,而BERT会迁移所有的参数来初始化下游任务模型。 Transformer的self-attention机制允许BERT建模多种下游任务。对于包含句子对的任务,通常的做法是先独立地对句子对中的句子进行编码,然后再应用双向交叉注意(bidirectional cross attention)。而BERT使用self-attention机制统一了这两个过程,这是因为对拼接起来的句子对进行self-attention有效地包含了两个句子之间的双向交叉注意(bidirectional cross attention)。 对于每个任务来说,我们只需要将任务特定的输入输出插入到BERT中然后端到端地微调即可。举例子来说,BERT的预训练输入句子A和句子B在微调时可以类比为: ①paraphrasing任务中的句子对; ②entailment任务中的hypothesis-premise对; ③question answering任务中的question-passage对; ④text classification或者sequence tagging任务中的text-u2205对(也就是只输入一个text,不必一定需要两个句子)。 对于BERT的输出,对于一些token-level的任务,BERT的token表示将被输入到一个输出层,比如sequence tagging或者question answering任务;对于entailment或者sentiment analysis这样的任务,可以将 [CLS] 对应的表示输入到一个输出层。 我们使用 [CLS] 这个token的最后一层的隐层向量 作为聚合的表示,可以认为是sentence embedding。在微调时只引入一个新的权重 ,这里的 代表标签的数量,然后计算标准分类损失 。下图展示了BERT在GLUE上的效果: 在这个数据集上,我们将question和passage拼接起来作为一个输入序列(中间是 [SEP] )。在微调时引入一个start向量 和一个end向量 ,计算 和 的点积然后通过 函数作为word 是答案的span起始位置的概率: 。答案的终止位置也做上述类似处理。从 到 的候选区间的得分记作 ,我们挑选 的最大得分区间作为预测的结果。下图展示了BERT在SQuAD v1.1上的效果: SQuAD v2.0有的question在提供的passage中没有答案存在。在微调时我们设置没有答案的问题的span的起始和结束位置都是 [CLS] 这个token,也就是start和end的可能性空间包含进了 [CLS] 的位置。在预测时,我们比较没有答案的span得分 和最优的有答案得分 。当 时,我们预测这是一个有答案的问题,这里的 用来在dev set上选择最优的 。下图展示了BERT在SQuAD v2.0上的效果: 微调时我们为BERT构建4个输入序列,每一个是所给的句子(句子A)和一个可能的延续(句子B)。然后引入一个向量,该向量和每一个输入对应的 [CLS] 的embedding的点积再通过一个 层来得到每个选择的得分。下图展示了BERT在SWAG上的效果:
2023-07-17 04:55:211

Transformer详解,输入部分(词嵌入、位置编码)

由图可知: inputs和带标签的输入分别进encoder和decoder Positional Encoding 线性层 softmax层 由N个编码器堆叠而成 每个编码器有两个子层相连接 第一个子层->多头 自注意力机制 和规范化层以及一个残差连接 第二个子层->全连接层和规范化层以及一个残差连接 由N个解码器堆叠而成 每个编码器有三个子层相连接 第一个子层->一个多头 自注意力机制 层和规范化层以及一个残差连接 第二个子层->多头 注意力机制 和规范化层以及一个残差连接 第三个子层->全连接层和规范化层以及一个残差连接 目的是为了将目标文本的 数字表示 ->向量表示,为了在高维空间捕捉词汇间的关系 效果如下 在Transformer编码器中没有针对词汇位置信息的处理,故需要在embedding层后加入位置编码器,将 词汇位置不同可能会产生不同语义的信息 加入到嵌入张量中(embedding),用来弥补位置信息的缺失。
2023-07-17 04:55:281

Transformer最全解析(attention is all you need)

Transformer出自google,被广泛应用于NLP的各项任务中,在transformer基础上改进优化的BERT模型在2019年11项NLP任务中表现SOTA。 论文原文: https://arxiv.org/pdf/1706.03762.pdf 《attention is all you need》 在处理变长的序列问题时,一般的做法是利用卷积神经网络或循环神经网络。 无论卷积还是循环神经网络其实都是对变长序列的一种“局部编码”:卷积神经网络显然是基于N-gram的局部编码;而对于循环神经网络,由于梯度消失等问题也只能建立短距离依赖。 Attention可以理解为一种序列聚焦方法,基本思想是对序列分配注意力权重,把注意力集中在最相关的序列上。 Attention 机制实质上就是一个寻址过程,通过给定一个任务相关的查询 Query 向量 Q,通过计算与 Key 的注意力分布并附加在 Value 上,从而计算 Attention Value,这个过程实际上是 Attention 缓解神经网络复杂度的体现,不需要将所有的 N 个输入都输入到神经网络进行计算,而是选择一些与任务相关的信息输入神经网络,与 RNN 中的门控机制思想类似。 用X = [x_1, · · · , x_N ]表示N 个输入样本;通过线性变换得到为查询向量序列,键向量序列和值向量序列: 所谓self-attention自注意力机制,即其注意力概率分布来自网络自身的输入的变换,而传统attention的注意力概率分布来自外部。 Transformer模型中采用了 encoer-decoder 架构,论文中encoder层由6个encoder堆叠在一起,decoder层也一样。 每一层的encoder和decoder的结构如下图所示: transformer模型中缺少一种解释输入序列中单词顺序的方法,它跟序列模型还不不一样。为了处理这个问题,transformer给encoder层和decoder层的输入添加了一个额外的向量Positional Encoding,维度和embedding的维度一样,这个向量采用了一种很独特的方法来让模型学习到这个值,这个向量能决定当前词的位置,或者说在一个句子中不同的词之间的距离。这个位置向量的具体计算方法有很多种,论文中的计算方法如下: 其中pos是指当前词在句子中的位置,i是指向量中每个值的index,可以看出,在偶数位置,使用正弦编码,在奇数位置,使用余弦编码。最后把这个Positional Encoding与embedding的值相加,作为输入送到下一层。 在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接,并且都跟随着一个“层-归一化”步骤。 Normalization有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为0方差为1的数据。我们在把数据送入激活函数之前进行normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。 mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 decoder 的 self-attention 里面用到。 原论文中说到进行Multi-head Attention的原因是将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。其实直观上也可以想到,如果自己设计这样的一个模型,必然也不会只做一次attention,多次attention综合的结果至少能够起到增强模型的作用,也可以类比CNN中同时使用 多个卷积核 的作用,直观上讲,多头的注意力 有助于网络捕捉到更丰富的特征/信息 。 seq2seq缺点 :这里用代替这个词略显不妥当,seq2seq虽已老,但始终还是有其用武之地,seq2seq最大的问题在于 将Encoder端的所有信息压缩到一个固定长度的向量中 ,并将其作为Decoder端首个隐藏状态的输入,来预测Decoder端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失Encoder端的很多信息,而且这样一股脑的把该固定向量送入Decoder端,Decoder端不能够关注到其想要关注的信息。 Transformer优点 :transformer不但对seq2seq模型这两点缺点有了实质性的改进(多头交互式attention模块),而且还引入了self-attention模块,让源序列和目标序列首先“自关联”起来,这样的话,源序列和目标序列自身的embedding表示所蕴含的信息更加丰富,而且后续的FFN层也增强了模型的表达能力,并且Transformer并行计算的能力是远远超过seq2seq系列的模型,因此我认为这是transformer优于seq2seq模型的地方
2023-07-17 04:55:361

利用神经网络进行文本分类算法综述(持续更新中)

传统的文本分类一般都是使用词袋模型/Tf-idf作为特征+机器学习分类器来进行分类的。随着深度学习的发展,越来越多的神经网络模型被用来进行文本分类。本文将对这些神经网络模型做一个简单的介绍。 本文介绍了一种词向量模型,虽然算不得文本分类模型,但由于其可以说是fasttext的基础。因此也简单提一下。 作者认为cbow和skipgram及大部分词向量模型都没有考虑到单词的多态性,而简单的将一个单词的多种形态视为独立的单词。例如like的不同形式有likes,liking,liked,likes,这些单词的意思其实是相同的,但cbow/skipgram模型却认为这些单词是各自独立的,没有考虑到其形态多样性。 因此作者提出了一个可以有效利用单词字符级别信息的n-gram词向量模型,该模型是以skipgram模式实现的。例如单词 where,其n-gram表示为<wh, whe, her, ere, re>, where。其中<>分别表示前后缀。在原始的skipgram模型中,输入仅仅只是where的onehot向量,而在此模型中输入则变成了<wh, whe, her, ere, re>, where的onehot编码的加和,有效的利用了字符级别的信息,因此效果更加好。 而在loss方面,文中采用了负采样+binary LogisticRegression的策略。即对每一个目标单词都预测为正负中的一种。 在本文中作者提供了一个基于神经网络的文本分类模型,这个模型是基于cbow的,与cbow非常类似。 和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征的embeding表示方式,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。输出层的实现同样使用了层次softmax,当然如果自己实现的话,对于类别数不是很多的任务,个人认为是可以直接使用softmax的。 最后,贴一个Keras的模型fasttext简化版。 基于词向量表示,本文提出利用卷积神经网络来进行文本分类。其算法如上图所示: 在本文中,作者尝试了多种不同的词向量模式: 在上一篇文章中CNN网络的输入一般是预训练好的词向量,而在本文中作者提出一种直接将embedding训练与分类任务结合在一起,且能有效提取/保留词序信息,也即有效训练出n-gram的模型方法,其实也可以理解为一种利用CNN来进行embedding的方法。此外,另一个问题是输入序列长度变化问题(在上一篇文章textCNN中通过padding解决的?),在本文作者提出使用一个动态可变的pooling层来解决这个问题,使得卷积层输出的大小是相同的。关于可变pooling其实与图像识别中的 空间金字塔池化 (Spatial Pyramid Pooling) 是类似的。 这篇文章有点将fastText与TextCNN结合在一起的感觉,将n-gram embedding与分类任务结合在了一起进行训练,通过CNN来进行Embedding。 Text Categorization via Region Embedding》 在本篇文章中作者提出了一个tv-embedding(即two-view embedding),它也属于region embedding(也可以理解为ngram embedding)。这种方法与上面的bow-CNN表示相似,使用bow(bag of words)的方式来表示一个区域的词句,然后通过某个区域(region,左右邻域的单词或词句)来预测其前后的区域(单词或词句),即输入区域是view1,target区域是view2。tv-embedding是单独训练的,在使用的时候与CNN中的embedding组合在一起(形成多个channel?)。作者认为,word2vec方法预训练得到的embedding向量是普适性的,而通过特定任务的数据集的训练得到tv-embedding具有任务相关的一些信息,更有利于提升我们的模型效果。 吐槽一下,这篇文章没太看懂,也可能是英语太差,作者文章中没有那种一眼就能让人理解的网络图,像textCNN的图就非常一目了然,看图就知道是怎么做的了。 本文提出了一个使用监督学习加半监督预训练的基于LSTM的文本分类模型。文章作者与上面相同,所以用到的很多技术可以说与上面也是同出一辙。因此简单说下本文的一些思路。 作者认为已有的直接使用LSTM作为文本分类模型并直接将LSTM的最后一个输出作为后续全连接分类器的方法面临两个问题:(1)这种方式一般都是与word embedding整合在一起(即输入onehot经过一个embedding层再进入LSTM),但是embedding训练不稳定,不好训练;(2)直接使用LSTM最后一个输出来表示整个文档不准确,一般来说LSTM输入中后面的单词会在最后输出中占有较重的权重,但是这对于文章表示来说并不总是对的。因此作者对这两点进行了改进: 本文其实可以看作是作者将自己前面的tv-embedding半监督训练与RCNN的一个融合吧,大有一种一顿操作猛如虎,一看人头0-5的感觉(因为作者的实验结果跟一般的CNN相比其实也抢不了多少)。 本文的作者也是前面两篇使用CNN来进行文本分类处理的文章的作者。因此在本文中,结合了前面两篇文章提出的一些方法,并使用了一个深层的卷积神经网络。具体的细节包括: 更多详细的关于DPCNN的细节可以查看 从DPCNN出发,撩一下深层word-level文本分类模型 。 本文提出了一种基于CNN+Attention的文本分类模型。作者认为已有的基于CNN的文本分类模型大都使用的是固定大小的卷积核,因此其学习到的表示也是固定的n-gram表示,这个n与CNN filter大小相关。但是在进行句子的语义表示时,不同句子发挥重要作用的ngram词语常常是不同的,也即是变化的。因此,模型能根据句子来自适应的选择每个句子最佳的n-gram对于提升模型的语义表示能力是非常关键的。本文便是由此思路提出了一种自适应的来选择不同n-gram表示的模型。 本文模型在主题结构上参照了CV中的DenseNet,借由DenseNet中的稠密连接来提取到丰富的n-gram特征表示。举例来说,在layer3的特征不仅能学习到f(x1, x2, x3),还能学习到f(x1(x2,x3))这种更多层次,更加丰富的特征。网络的结构主要包括三部分:DenseCNN主网络,Attention module和最后的全连接层分类网络。下面对这三部分进行简单的说明: 本文通过Dense connection + Attention来自动获取对于文本语义最重要的n-gram特征,结果很好。但是缺点是,这个网络比较适合较短的文本,文中对输入文本进行了padding补齐,对于不同数据集最大长度分别为50,100等,但这对于较长的文本明显是不足的。因此对于较长的文本或许HAN这种借用RNN来不限制输入长短的网络会更好。 本文提出了一种结合循环神经网络(RNN)和卷积神经网络来进行文本分类的方法,其结构如上图所示,该网络可以分为三部分: 虽然说是RNN与CNN的结合,但是其实只用到了CNN中的pooling,多少有一点噱头的意思。文中还提到了RCNN为什么比CNN效果好的原因,即为什么RCNN能比CNN更好的捕捉到上下文信息:CNN使用了固定大小window(也即kernel size)来提取上下文信息,其实就是一个n-gram。因此CNN的表现很大程度上受window大小的影响,太小了会丢失一些长距离信息,太大了又会导致稀疏性问题,而且会增加计算量。 在众多自然语言处理任务中,一个非常突出的问题就是训练数据不足,且标注难度大。因此文本提出了一种多任务共享的RNN模型框架,其使用多个不同任务数据集来训练同一个模型共享参数,已达到扩充数据集的作用。 文中作者提出了三个模型,如上图所示: 三个模型的训练方式相同: 本文提出了一个层次LSTM+Attention模型。作者认为,虽然一篇文章有多个句子组成但真正其关键作用的可能是其中的某几个,因此对各个句子施加了注意力机制,以使得对文章语义贡献较多的句子占有更多的权重。同样的,组成一个句子的单词有多个,但是发挥重要作用的可能就那么几个,因此使用注意力机制以使得重要单词发挥更大的作用,这些便是本文的核心思想。整个网络可分为三层,两个LSTM层分别用来进行word encode和sentence encode,最顶上为一个全连接分类层。若加上两层注意力层,则可认为网络为5层。下面简单聊聊这五层网络的结构: 总体来说,本文看起来还是比较有意思的,符合人阅读文章的习惯,我们写文章的时候也是有中心词和中心句的。但是由于这个层级结构是否会导致训练慢或者不好训练还不得而知。最后,文中还提出对文章按长短先进行排序,长度相似的进入一个batch,这将训练速度加快了3倍。 本文提出了一个基于图神经网络的文本分类方法。该方法的主要思想是将所有文章及其包含的词汇都放到一个图网络里面去,图网络中的节点分为两种类型:单词节点和文章节点。其中连接单词节点和文章节点的边的权重使用TF-IDF来表示,而单词与单词之间边的权重则是使用点互信息(PMI)来表示。点互信息与传统语言模型中的条件概率计算方式非常相似。只不过PMI采用的是滑窗方式而条件概率是直接在所有语料中进行统计,可以认为是将所有语料当做一个大窗口,这时就又与PMI相同了。 A表示图网络的邻接矩阵,表示如下: GCN同样也是可以含有多层隐藏层的,其各个层的计算方式如下: 其中A"为归一化对称邻接矩阵, W0 ∈ R^(m×k) 为权重矩阵,ρ是激活函数,例如 ReLU ρ(x) = max(0,x) 如前所述,可以通过叠加多个GCN层来合并更高阶的邻域信息: 其中j表示层数。 损失函数定义为所有已标记文档的交叉熵误差: 文中提到Text GCN运行良好的原因有两个方面: 但是其也有一些缺: 总的来说,文章的idea还是挺有意思的,效果也还不错。初识GCN可能还是有一点难以理解,可以参考如下资料进行进一步学习: 基于图卷积网络的文本分类算法 如何理解 Graph Convolutional Network(GCN)?
2023-07-17 04:55:501

StableDidfusion教程AI绘画

Stable Dlf fusion原理让每个人都看懂AI绘画基本原理在我们去逛C站的过程中我们知道, Stable Diffusion可用模型有两类:(1) safe tensors:safe tensors文件是用numpy保存的, 这意味着它们只包含张量数据, 没有任何代码, 加载.safe tensors文件更安全和快速。供调用的AI绘图大模型。(2) ck pt:ck pt文件是用pickle序列化的, 这意味着它们可能包含恶意代码, 如果你不信任模型来源, 加载.ck pt文件可能会危及你的安全。这里大家简单了解,在C站下载模型的时候,优先下载.safe tensors即可03大模型微调技术Dream booth是google在2022年8月提出的一种新的图像算法,其方法可以完整的获得你想要的模型的视觉特征,它的提出既不是为了训练人物也不是为了训练画风,而是为了能在少量训练图像的基础上完美的还原细节特征。大家来看下图,是在当时微软研发大会上(如果我没记错的话)发布这个模型的时候对细节特征的描绘:03大模型微调技术1.为什么要进行大模型微调?刚刚上文我们介绍的Unet模型是SD中最重要的模型网络, 内部包含上亿个参数,要训练这样一个超大的模型,大概需要15亿个图像文本, 使用256张A 100显卡跑15万个GPU小时, 大概成本是60万美元,我们设计师不能像程序员那样动不动就调函数参数训练模型(主要是不会)。那咋整?上面我们讲到UNET泛用性极强, 泛用性极强就会带来风格化不足,可能无法满足特定风格的需要。所以我们往往会对UNET大模型进行微调, 让他更符合我们的使用场景。接下来我将要给大家介绍模型微调技术。也就是大家之后在Stable Diffusion里常用的训练方法, 今天不会讲具体怎么训练,我只会给大家讲原理,讲明白了原理,大家在自学训练方法的时候则更容易理解。2.大模型微调需要解决的两个问题所有的大模型微调技术,都是基于要解决以下两个问题:(1)如何减少训练参数,提高训练效率和生成图像的质量;(2)如何解决模型泛化性差的问题;a.过拟合(Overfitting) 是指微调模型对原始模型的语义理解程度发生了变化,整体训练出现语义漂移的现象:比如有一只猫, 名字叫jojo, 我拍了他的几十张照片, 一直用a jojo cat这个名字来强化模型对这只猫的认知, 等以后我输入a jojo cat的时候确实能出现想要的这只猫, 但是我输入a cat的时候则出现的画面会很怪异, 这就说明cat这个词被污染了, 出现了过度拟合的现象。b.欠拟合(Under fitting) 是无法识别这一特征, 比如它就完全识别不出jojo和cat的关系, 这往往是训练样本量不足或者训练样本质量等因素导致,属于训练无效。好,那么我们来看下常见的大模型微调技术都有哪些,以及他们是如何解决上面两个问题的。我们常见的大模型微调技术就是以下这四个:Dream booth/LoRA/Embedding/Hyper network, 这在我们后续学习Stable Diffusion过程中会经常用到, 相信大家都已经或多或少了解一点了,接下来就带大家揭开他们神秘的面纱。3.Dream booth:我们先来看Dream booth是怎么解决过拟合这个问题的:Dream booth要求我们在训练过程中,“特征词+类别”和“类别”成对出现,解决过拟合的问题;比如之前提到的我如果想训练这只叫JOJO的猫的模型, 又不能让它跟“猫”这个词过度拟合,我们可以采用的这样的输入方法。这样的话AI就能识别到:JOJO cat is a cat named jojo。我们说过CLIP模型是Text Encoder算法的一种,Text Encoder主要是把自然语义prompt转变为词特性向量Embedding, 所以我们可以针对我们的Prompt到向量的这个映射过程进行训练,去修改他们之间的映射记录关系,从而达到训练特定的人或物的效果,由于他生成的是一套纯文字映射记录,所以体积非常小,一般只有几百k。举个实际应用的例子,比如下面这个人物大家都很熟悉,是守_望先锋里的Dva:Dream booth优点是:可以将视觉特征完美融入;Dream booth缺点是:需要调整UNet所有内部参数, 训练时间长,模型体积大。4.LoRA(大模型的低秩适配器) :讲完了Dream booth之后我们来讲一下LoRA, 相信大家都听过这个词了,一定对它非常感兴趣对不对?正因为LoRA他的插入层较少, 他相较于Dream booth, 可以把训练参数降低1000倍, 对CPU的要求也会下降三倍, 所以训练出来的LoRA模型就会非常小, 一般大家在C站下载过就知道,往往他们只有几十m,而一个大模型往往有几个g,所以他在我们日常工作中变得非常常用。大家作为新手学习的时候, 可以理解Lora是在原有模型上添加一个“滤镜”,让这个底模往我们期望的效果走。如下图所示,我用了一个rev Animated(一个偏动漫的底模型) , 当我们Prompt不变的情况下, 加了一个盲盒效果的LoRA之后, 相当于是给这个底模型上了一个滤镜,让整体底模型出来的效果往盲盒方向偏重:5.Embedding(Text In version) :接下来我们来讲一下Embedding, Embedding也叫Text in version(大家在C站下载的时候注意, 他主要是用于训练特定的人或物) , 它反映的是一个Prompt与对应向量的映射记录关系的算法,可以用于训练特定的人或物。还记得上面讲我们的咒语是如何起作用的时候的这张图么?举个实际应用的例子,比如下面这个人物大家都很熟悉,是守望先锋里的Dva:如果我们要通过描述她的特征去把她描述出来, 可能要几千个prompt tag才行, 那我如果每次想生成Dva 都要再打一次这么多prompt肯定不科学, 这时候我们可以把这一串tag打包映射成一个新的词汇叫OW_Dva。由于这个词是我们自创的, 在CLIP映射集合里找不到对应的映射关系, 所以CLIP会默认给他创建一个新的映射空间, 经过一系列训练之后,我们后续就可以通过输入一个简单的词汇来完成一系列tag的打包效果。6.Hyper network:最后我们来看一下Hyper network, 他作为一种即将要被Lora 淘汰了的技术,我们大概略讲一下他的原理就好了。大家先看下图, 我们来总结一下三种技术的原理和在UNET中的使用范围:Dream booth调整了整个UNET的函数和参数, 所以他体积最大,适用范围最全,但是训练难度和训练耗时和成本最大。LoRA只将训练参数注入到了部分Transform ar函数中, 所以他不改变原模型,即插即用,模型大小也可控,是我们后续学习的重点。而Hyper network, 大家看图, 他是新建了一个单独的神经网络模型, 插入到原UNet模型的中间层。在训练过程中, 冻结所有参数,只训练插入部分,从而使输出图像与输入指令之间产生关联关系,同时只改变原模型的一小块内容。从这个原理的描述上, 大家就能发现, Hyper network这种方法更适合用于训练某种画风,比如像素画之类的,大家在C站能找到的Hyper network模型也几乎都是画风训练的, 但是不是说他不能训练别的, 它也是可以训练人物的, 就是比LoRA 麻烦一点。总之, 他几乎是一个在国内几乎要被LoRA淘汰的技术(注意是国内,注意是几乎,杠精别杠),大家去知乎什么的看paper, 关于Hyper Networks的相关paper都在2022年前,所以大家就也把他当成一个”滤镜“来理解即可。最后说一下声明:在本文中为了方便大家通俗理解,作者对算法原理进行了某种程度的简化,并不能代表模型函数运行的100%实质(防杠)。
2023-07-17 04:56:081

NLP应用于司法系统(综述)

司法人员经常考虑使用rule-based和symbol-based方法解决任务,NLP研究者主要考虑data-driven和embedding方法。 在这篇文章中就主要讨论Legal AI的历史、现况、和未来的研究方向。 进行了一些试验来对现有的工作进行更有深度的分析,分析他们的优缺点,并揭示一些未来的研究方向。 可解释性强的symbolic models的效率不高,embedding-methods有更好的性能,但通常没有好的解释性,在一些道德相关的问题上有比较大的问题:经典性别和种族偏见。 我们总结了symbol-based methods和embedding-based方法共同面临的三个主要的挑战: 本文的研究贡献主要如下: 字和词嵌入很重要。 直接从司法案情描述中学习出专业词汇很困难。为了克服这种困难,可以同时捕捉 语法信息 和 司法知识 。 knowledge graph methods在司法领域很有前景,但是在实际使用之前,还是有两个主要的挑战: 这两种挑战让LegalAI通过embedding进行知识建模不平凡(non-trivial)。研究者在未来会尝试去克服这些困难。 预训练的语言模型(Pretrained language model,PLM)比如BERT,最近集中于很多NLP的领域。鉴于预训练模型的成功,在LegalAI中使用预训练模型是一个很合理很直接的选择。但是在司法文本中,这里还有一些不同,如果直接使用这些PLM会导致不好的性能。这些不同就来自于司法文本中所包含的术语和知识。为了解决这些问题,Zhong(2019)提出了一个中文司法文档的预训练模型,包括民事和(civil)刑事(criminal)案件的文档。针对司法领域设计的PLM给LegalAI任务提供了一个更有质量的baseline系统。我们在实验中对比不同的BERT模型应用于LegalAI任务。 对于在未来探索LegalAI中的PLM,研究者可以把目标放在整合knowledge进入PLM。整合knowledge进入预训练模型可以帮助推理司法概念之间。很多工作已经做了,去把general domain融入模型。 symbol-based methods也被叫做structured prediction methods。 符号化的司法知识包括:事件(events)和关系(relationship),这些可以提供可解释性。 深度学习方法可以用于提高symbol-based methods的性能。 信息提取(information extraction,IE)已经被广泛地在NLP中被研究。IE强调从文本中提取有价值的信息,一些技术比如:实体识别(entity recognition),关系提取(relation extraction),事件提取(event extraction)。 为了更好的使用司法文本,研究者尝试使用本体论(ontology)或者全球一致性(global consistency)在LegalAI的命名实体识别(named entity recognition)任务中。为了从司法文本中提取关系和事件,研究者尝试去使用不同的方法,包括:人工规则(hand-crafted rules),CRF(不知道这是啥),联合模型比如SVM,CNN,GRU,或者(scale-free identifier network)(不知道这是啥)。 现存的工作已经做出了很大努力去改善IE的效果,但我们需要跟多的注意力放在怎么好好利用这些提取出来的信息。这些提取出来的符号有司法基础(legal basis)而且可以对司法应用提供可解释性。所以我们不能只把目标定在方法的性能。在这里我们展示两个利用提取出的符号来提高LegalAI可解释性的例子: 在未来的工作中,我们需要更多注意,应用提取的信息在LegalAI任务中。这些信息的利用取决于特定任务的要求,而且这些信息可以提供更多的可解释性。 除了NLP中的共同的symbol,LegalAI有独有的symbol,称作legal elements。提取legal element专注于提取一些关键元素,比如:某个人是不是被杀了,或者某个东西是不是被偷了。这些元素是犯罪活动(crime)的基本组成元素,而且我们可以基于这些元素,直接给犯罪者定罪。利用这些元素,不仅可以给判决预测任务带来直接的监管信息,而且可以让模型的预测结果更加可解释。 从这个例子可以看出,提取元素可以决定判决结果。这些元素对于下游任务很有用。 为了更深度分析基于元素的symbol,Shu(2019)构造了用于提取元素的三个数据集:离婚纠纷,劳工纠纷,贷款纠纷。这些数据集需要我们检测相关元素是否被满足,并把这个任务规范化为一个多标签的分类任务。为了展示现存方法在element extraction上的性能,我们进行了一系列实验,如下表格所示。 我们实现了NLP中几个经典的encoding模型,为了检验elemetnt extraction。包括TextCNN,DPCNN,LSTM,BiDAF,BERT。我们用了两种不同的BERT预训练参数(原始BERT、用中文司法文档训练的BERT:BERT-MS)。从这个结果中可以看到,在广泛领域(general domain)上的预训练模型效果不如在特定领域(domain-specific)训练的预训练模型,这就是在LegalAI中推进PLM的必要性。paper的以下部分,我们就会使用在legal documents上预训练的BERT来达到一个更好的表现。 从目前的element extraction的结果来看,现存的方法已经达到了一个很好的性能,但是在相关的应用上仍然不够。这些元素可以被看作是预先定义好的legal knowledge并且帮助下游任务。怎么改善element extraction也是需要进一步研究。 介绍几个典型的应用: Legal Judgment Prediction Similar Case Matching Legal Question Answering Legal Judgment Prediction 和Similar Case Matching可以看作民事法律(Civil Law)和普通法系(Common Law System,英美法系,普通法系)判决的核心功能。Legal Question Answering可以给不懂法律的人提供咨询服务。因此探究这三个任务可以基本上涵盖LegalAI的大部分方面。 Legal Judgment Predction(LJP)在民事法律体系中很中国要。在民事法律体系中,判决结果是基于事实和法律条文。LJP主要关心怎么通过 事实描述 和民法中 相关条文 ,来预测判决结果。 下面将介绍LJP方面的研究进展,和未来的研究方向。 早期的工作包括:使用统计和数学方法在特定场景下分析司法案件。同时结合数学方法和司法规则让预测结果具有可解释性。 为了LJP的进展,Xiao(2018)提出了一个大规模的中文刑事判决预测数据集,C-LJP(c指chinese)。这个数据集包含2.68 million个司法文档,是一个LJP的有效的benchmark。C-LJP包含三个子任务:相关文章relevant articles,应用的指控applicable charges,刑期term of penalty。前两个可以被formalize为多标签分类任务,最后一个是回归任务。英文的LJP也有,但是规模比较小。 随着NLP发展,研究者开始考虑在LJP中使用NLP任务。这些工作可以分为两个主要方向:1. 使用更新的模型提高性能:Chen(2019)用门机制提高预测刑期(term of penalty)的性能,Pan(2019)提出使用多尺度(multi-scale)的attention,来处理含有多个被告的案件。除此之外,其他的研究者探究怎么使用legal knowledge和LJP的一些属性。Luo(2017)在fact和law articles之间使用attention来帮助预测可应用的指控(applicable charges)。Zhong(2018)使用拓扑图来利用不同LJP不同任务之间的关系。Hu(2018)整合了是个可辩别的(discriminative)司法属性(legal attributes)来帮助预测低频率的指控。 一系列在C-LJP上的实验 实验结果: 可以看到很多模型在预测高频率指控(high-frequency charges)和文章(articles)中达到了很好的性能。 但是在低频率的标签上表现不好,表现为micro-F1和macro-F1之间有很大的差距。 Hu(2018)展示了把few-shot learning应用于LJP。然而他们的模型需要额外的人工添加一些属性信息,这就导致很费劲,而且难以在其他的数据集上应用。除此之外,我们发现BERT的性能不够好,因为在一些模型参数较少的模型上没有什么提升。主要的原因是司法文本的长度一般较长,但是BERT最长的文本长度是512。根据统计数据,最长的司法文本长度是5w多字,15%文档场都超过了512。因此LJP需要一些文本理解(document understanding)和推理技术(reasoning technique)。 虽然embedding-based方法已经有很好的效果了,但是在LJP中我们需要结合embedding-based和symbol-based。拿TopJudge作为一个例子,这个模型规范化LJP任务中(symbol-based part)的拓扑序, 并使用TextCNN用于编码fact description。 (有点好奇这个TopJudge里是怎么通过symbol-based搞一个拓扑序的?对模型是怎么样有用的。)通过结合symbol-based和embedding-based,TopJudge达到了一个很好的效果。通过对比TextCNN和TopJudge可以发现加judgements 的顺序(order)可以提升性能。 为了更好的LJP性能。 一些挑战需要研究者来探索: 在使用Common Law System(这好像可以解释为卷宗法律系统,通过相似的案件来判案)的国家中,比如美国,加拿大,印度,判决决策是通过相似案件和有代表性的(representative)案件来进行的。因此,怎么识别出相似的案件,时Common Law System中所最需要的。 为了更好的预测Common Law System的判决结果,Similar Case Matching(SCM)成了LegalAI的一个重要的话题。SCM中对于相似度(similarity)的定义也是多种多样。SCM需要从不同的信息粒度(information of different granularity)来建模(modeling)案件之间的关联(relationship),比如事实级别(fact-level),事件级别(event-level),和元素级别(element-level)。换一种话说,就是SCM是语义匹配的一种特殊形式(semantic matching),这个对于提取司法信息(legal information retrieval)有帮助。 传统的IR方法集中于使用统计方法来衡量term-level 的相似性,比如TF-IDF。除此之外,其他研究者还尝试利用元信息(meta-information),来捕捉语义相似度。许多机器学习方法也被应用于IR,比如SVD或者矩阵分解(factorization),随着深度学习发展,多层感知机(multi-layer perceptron),CNN,RNN也被应用于IR。 已经有一些LegalIR的数据集:COLIEE,CaseLaw,CM。COLIEE和CaseLaw都被用于从大的语料库中提取最相关的文章。CM中的数据样例提供了三个司法文档用于计算相似度。这些dataset都提供了一个benchmark。许多研究者专注于建立易用的司法搜索引擎(legal search engine,司法版google)。 以计算语义级别(semantic-level)的相似度为目标,深度学习方法被用于LegalIR。Tran(2019)提出了一个CNN-based model,结合了文档级别(document-level)和句子级别(sentence-level)的池化(pooling),在COLIEE上达到了SOTA的效果。 为了对当前的LegalIR进展有一个更好的理解视角,我们使用CM(Xiao 2019)来进行实验。CM包含8964个三元组,每个三元组包含三个司法文档(A, B, C)。CM的任务就是分辨出B和C哪个更接近A。我们实现了几个不同类型的baseline: 我们发现,能够捕捉语义信息的模型性能超过了TF-IDF,但是应用到SCM还不够。如Xiao(2019)所说,主要的原因是司法人员认为数据集中的elements定义了司法案件之间的相似度。司法人员会比较看重两个案件是否有相关的元素(elements)。只考虑term-level和semantic-level的相似度是不足够的。 更深的SCM研究有以下几个方向需要努力: Legal Question Answering(LQA):司法方面的问答系统。 司法专业人员的一个很重要的任务是向不懂法的人提供可靠的、高质量的司法咨询服务。 LQA中,问题的形式会有比较大的变化:有的问题强调对于司法概念的解释,有的问题主要考虑对于特定案件的分析。另外,从专业人员和非专业人员口中表达专业词汇可能会有差别。这些问题给LQA带来了很多挑战。 LegalAI中有很多数据集,Duan(2019)提出CJRC,一个司法阅读理解数据集,和SQUAD 2.0有相似的格式,包括span extraction(不懂),yes/no questions,unanswerable questions。另外COLIEE包含500个yes/no questions。另外,律师资格考试(bar exam)对于律师来说是一个很重要的考试,因此律师资格考试数据集会比较难,因为需要专业的司法知识和技能。 除了这些数据集之外,研究者还用了很多方法在LQA上。rule-based systems在早期的研究中效果显著。为了更好的性能,研究者利用更多的信息,比如概念解释(explanation of concepts)或者把相关文档格式化为图(formalize relevant documents as graph)来帮助推理。机器学习和深度学习方法比如CRF,SVM,CNN也用于LQA。但是,大多数现存方法只在小数据集上进行了实验。 我们选择JEC-QA来作为实验的数据集,因为这是从律师资格考试中收集到的最大的数据集,保证他的困难程度。JEC-QA包含了28641个多项选择、多项回答问题,还包含了79433个相关的文章来帮助回答问题。JEC-QA把问题分为知识驱动问题(knowledge-driven questions, KD-Questions)和案件分析问题(case-analysis questions),并且提供了人类的表现。我们实现了几个有代表性的QA模型,包括BiDAF、BERT、Co-matching、HAF,这些实验结果在表6中呈现。 对比发现,这些模型不能在回答这些司法问题上跟回答open-domain的问题时有一样好的效果。在LQA上,模型和人类之间有巨大的差距。 为了有更好的LQA方法,这里有几个困难需要克服: 除了这篇文章中的,还有其他的LegalAI任务:司法文献概述(legal text summarization),从司法合同中进行信息提取(information extraction from legal contracts)。不管怎样,我们都能够应用embedding-based方法来提高性能,结合symbol-based方法提高可解释性。 三个主要的挑战: 未来的研究者可以主要结合embedding方法和symbol方法解决这三个挑战。 对于一些任务,还没有数据集,或者数据集不够大。我们可以尝试构建规模大、质量高的数据集,或者使用few - shot / zero - shot learning方法来解决这些问题。
2023-07-17 04:57:511

Transformer常见问题汇总

答: 多头可以使参数矩阵形成多个子空间,矩阵整体的size不变,只是改变了每个head对应的维度大小,这样做使矩阵对多方面信息进行学习,但是计算量和单个head差不多。 答: 请求和键值初始为不同的权重是为了解决可能输入句长与输出句长不一致的问题。并且假如QK维度一致,如果不用Q,直接拿K和K点乘的话,你会发现attention score 矩阵是一个对称矩阵。因为是同样一个矩阵,都投影到了同样一个空间,所以泛化能力很差。 答: K和Q的点乘是为了得到一个attention score 矩阵,用来对V进行提纯。K和Q使用了不同的 , 来计算,可以理解为是在不同空间上的投影。正因为有了这种不同空间的投影,增加了表达能力,这样计算得到的attention score矩阵的泛化能力更高。 答: 假设 Q 和 K 的均值为0,方差为1。它们的矩阵乘积将有均值为0,方差为dk,因此使用dk的平方根被用于缩放,因为,Q 和 K 的矩阵乘积的均值本应该为 0,方差本应该为1,这样可以获得更平缓的softmax。当维度很大时,点积结果会很大,会导致softmax的梯度很小。为了减轻这个影响,对点积进行缩放。 参考链接: https://blog.csdn.net/tailonh/article/details/120544719 答: 对需要mask的位置设为负无穷,再对attention score进行相加 答: 将原有的高维空间转化为多个低维空间并再最后进行拼接,形成同样维度的输出,借此丰富特性信息,降低了计算量 答: 输入嵌入-加上位置编码-多个编码器层(每个编码器层包含全连接层,多头注意力层和点式前馈网络层(包含激活函数层)) 答: embedding matrix的初始化方式是xavier init,这种方式的方差是1/embedding size,因此乘以embedding size的开方使得embedding matrix的方差是1,在这个scale下可能更有利于embedding matrix的收敛。 答: 因为self-attention是位置无关的,无论句子的顺序是什么样的,通过self-attention计算的token的hidden embedding都是一样的,这显然不符合人类的思维。因此要有一个办法能够在模型中表达出一个token的位置信息,transformer使用了固定的positional encoding来表示token在句子中的绝对位置信息。 答: 相对位置编码(RPE)1.在计算attention score和weighted value时各加入一个可训练的表示相对位置的参数。2.在生成多头注意力时,把对key来说将绝对位置转换为相对query的位置3.复数域函数,已知一个词在某个位置的词向量表示,可以计算出它在任何位置的词向量表示。前两个方法是词向量+位置编码,属于亡羊补牢,复数域是生成词向量的时候即生成对应的位置信息。 答: encoder和decoder的self-attention层和ffn层都有残差连接。反向传播的时候不会造成梯度消失。 答: 多头注意力层和激活函数层之间。CV使用BN是认为channel维度的信息对cv方面有重要意义,如果对channel维度也归一化会造成不同通道信息一定的损失。而同理nlp领域认为句子长度不一致,并且各个batch的信息没什么关系,因此只考虑句子内信息的归一化,也就是LN。 答: 批归一化是对每一批的数据在进入激活函数前进行归一化,可以提高收敛速度,防止过拟合,防止梯度消失,增加网络对数据的敏感度。 答: 输入嵌入-加上位置编码-多个编码器层(每个编码器层包含全连接层,多头注意力层和点式前馈网络层(包含激活函数层))-多个解码器层(每个编码器层包含全连接层,多头注意力层和点式前馈网络层)-全连接层,使用了relu激活函数 答: 通过转置encoder_ouput的seq_len维与depth维,进行矩阵两次乘法,即q*kT*v输出即可得到target_len维度的输出 答: Decoder有两层mha,encoder有一层mha,Decoder的第二层mha是为了转化输入与输出句长,Decoder的请求q与键k和数值v的倒数第二个维度可以不一样,但是encoder的qkv维度一样。 答: Transformer的并行化主要体现在self-attention模块,在Encoder端Transformer可以并行处理整个序列,并得到整个输入序列经过Encoder端的输出,但是rnn只能从前到后的执行 答: 训练的时候可以,但是交互的时候不可以 答: 传统词表示方法无法很好的处理未知或罕见的词汇(OOV问题) 传统词tokenization方法不利于模型学习词缀之间的关系” BPE(字节对编码)或二元编码是一种简单的数据压缩形式,其中最常见的一对连续字节数据被替换为该数据中不存在的字节。后期使用时需要一个替换表来重建原始数据。 优点:可以有效地平衡词汇表大小和步数(编码句子所需的token次数)。 缺点:基于贪婪和确定的符号替换,不能提供带概率的多个分片结果。 答: LN是为了解决梯度消失的问题,dropout是为了解决过拟合的问题。在embedding后面加LN有利于embedding matrix的收敛。 答: BERT和transformer的目标不一致,bert是语言的预训练模型,需要充分考虑上下文的关系,而transformer主要考虑句子中第i个元素与前i-1个元素的关系。
2023-07-17 04:57:571

Transformer模型解析记录

整个Transformer模型由Encoder和Decoder两部分组成。Encoder负责对输入数据的编码,而Decoder负责对编码后的数据进行解码。 Encoder由N个结构相同,参数不共享的模块组成,每个模块又由多头自注意力层和全连接层组成,其中多头自注意力层和全连接层都加上了残差连接和layer normalization。 Decoder与Encoder结构类似,相比于Encoder,Decoder部分多了一个 Multi-Head Attention ,第一个 Multi-Head Attention 采用Masked操作,第二个 Multi-Head Attention 的 K 和 V 使用Encoder的输出,而Q使用上一个Decoder block的输出。 Decoder的输出通过一个线性层和softmax输出下一个翻译单词的概率。 Encoder由N个结构相同,参数不共享的的Layer组成(论文中N=6),也即图1左侧的单元,最左边有个“Nx”。 每个Layer由 Multi-Head Attention 和 Feed-Forward 两个sub_layer组成。其中每个sub_layer都加了残差连接(Residual Connect)和归一化(Normalization)操作。则每个sub_layer的输出可表示为: Muti-Head Attention从结构上来看就是通过h个不同的线性变换将输入 投影到h个不同的 组合,最后将h个不同的Attention结果拼接起来,最后经过一个Liner层得到Muti-Head Attention的输出。 其中, 、 Muti-Head Attention输出的维度是 关于Attention的详细介绍,可以参考之前文档: Feed Forward也称Position-wise feed-forward networks,该层主要提供非线性变换。之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。 该层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应公式为: 问 :Attention输出之后的结果会和 相乘来进行维度变换,那这里为什么又要增加一个2层的FFN网络呢? 答 :FFN网络的加入给模型增加了非线性(Relu激活函数),增加了模型的表现能力。当然去掉FFN层也是可以的,只不过效果上会差些。 Decoder是图1的右半部分,与左半部分的Encoder类似,但又存在一些区别。 Decoder比Encoder多了一个Multi-Head Attention,第一个Multi-Head Attention采用Masked操作,因为在生成任务中,前面的词语是看不到后面词语的信息的,因此需要加入Masked来避免信息泄露。第二个Multi-Head Attention输入的 是根据Encoder的输出编码矩阵映射而来,而 是根据上一个Decoder的输出映射而来。 最后有一个 Softmax 层计算下一个翻译单词的概率。 模型在解码的过程中需要注意的是训练和预测不一样。 在训练时,解码是一次全部decode出来,用上一步的ground truth来预测(mask矩阵也会改动,让解码时看不到未来的token); 而预测时,因为没有ground truth了,需要一个个预测。 上面简单介绍了 Encoder 和 Decoder 模块,下面简单介绍一下Transformer的Position Embedding。 引入Position Embedding主要是为了弥补Transformer模型对位置信息的不足,将Position Embedding与token Embedding相加后,即可保留各个token的位置信息。 论文作者提出了两种添加位置信息的的方法: 一种方法是直接用不同频率的正余弦函数直接计算各个token的位置id,公式如下: 另一种方法是直接学习出一个Position Embedding。 通过实验发现,两种方法结果差不多,最后作者选择了第一种方法。 Transformer 与 RNN 不同,可以比较好地并行训练。 Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。 Transformer 的重点是 Self-Attention 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。 Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。 Transformer 模型详解 (推荐) 【NLP】Transformer模型原理详解 【经典精读】Transformer模型深度解读
2023-07-17 04:58:121

Word Microsoft 中的 Thai Distributed这个软件用汉文怎么写的?

军训基地男的女的男的女的你男的女的你的内心你的呢你发你的几点能到你电脑呢
2023-07-17 04:58:2815

css样式引入有哪几种方式,优先级是怎么样的?

在HTML中常用以下三种方式定义CSS:embedding(嵌入式)、linking(外部引用式)和inline(内联式,也称行内样式)。一:嵌入式 用户可在HTML文档头部定义多个style元素,实现多个样式表。二:外部引用式 ①可以在多个文档间共享样式表,对于较大规模的网站,将CSS样式定义独立成一个一个的文档,可有效地提高效率,并有利于对网站风格的维护。 ②可以改变样式表,而无需更改HTML文档,这也与HTML语言内容与形式分开的原则相一致。 ③可以根据介质有选择的加载样式表。三:内联式 使用该属性可以直接指定样式,当然,该样式仅能用于该元素的内容,对于另一个同名的元素则不起作用。优先级: 内联式&gt;内嵌式&gt;外部引用式
2023-07-17 04:58:5210

国内外在自然语言处理领域的研究热点和难点有哪些?

先看大方向,这个比较好统计。NLP研究的大方向可以参考NLP会议的领域进行划分。各方向的热度可以参考顶会各个领域的论文接收数。虽然这个方法可能不是很实时,但我认为长期(五年)看还是能反映研究热度的,毕竟如果一个领域热门,研究人员多、进展多、论文多,大会组织者就会相应的扩大论文的接收数。不过会不会论文多是因为灌水多?所以我说要看长期而且是看顶会,一个会议如果长期允许这么灌水其档次肯定会下跌,市场规律嘛,这年头办个好会议也不容易。个人也可以根据这些数据自行判断各个领域的热门情况与趋势。
2023-07-17 04:59:353

matlab中的降维函数是什么?

drttoolbox : Matlab Toolbox for Dimensionality Reduction是Laurens van der Maaten数据降维的工具箱。里面囊括了几乎所有的数据降维算法: - Principal Component Analysis ("PCA") - Linear Discriminant Analysis ("LDA") - Independent Component Analysis ("ICA") - Multidimensional scaling ("MDS") - Isomap ("Isomap") - Landmark Isomap ("LandmarkIsomap") - Locally Linear Embedding ("LLE") - Locally Linear Coordination ("LLC") - Laplacian Eigenmaps ("Laplacian") - Hessian LLE ("HessianLLE") - Local Tangent Space Alignment ("LTSA") - Diffusion maps ("DiffusionMaps") - Kernel PCA ("KernelPCA") - Generalized Discriminant Analysis ("KernelLDA") - Stochastic Neighbor Embedding ("SNE") - Neighborhood Preserving Embedding ("NPE") - Linearity Preserving Projection ("LPP") - Stochastic Proximity Embedding ("SPE") - Linear Local Tangent Space Alignment ("LLTSA") - Simple PCA ("SPCA")
2023-07-17 05:00:022

如何开发一个特定领域的自动问答机器人?

现在各级别的会议都在研究这玩意,问答效果,只要取决于你这个 domain 的大小,以及数据集的大小。 最近看的 paper,用神经网络做的,有两个模型:一个订餐厅,而且要提前设定好对话的状态,就是让 human 说出价格,地点,菜系..等等,才能完成;另一个,根据你的描述,从数据库一张表中找到一个 item。 开放型的被机器人 很难。 不过,你想练手可以: 存储一些问题以及答案,然后问一个问题,计算这个问题和已有问题的相似度rule based,这东西是世界难题,哪有练手那么简单...... 从中文 NLP 最基础的分词开始,就够你吃一壶了,还有词性标注、实体命名识别、句法依存,每前进一步都很困难。 单纯想熟悉一下,gayhub 上搜索`chatbot deep learning`,一堆,弄个测试,大概一下午就好了。当然,你训练的对话结果如果不是“你好”、“你好”、“你好”,算我输......
2023-07-17 05:00:262

很多链接打开后都是http://-embedding/

中病毒了
2023-07-17 05:01:274