- 博客(51)
- 收藏
- 关注
原创 【C++】指针
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。指针是一个变量,其值为另一个变量的地址。*a 找a这个地址里存的值。&a 找a这个变量的地址。访问指针变量中可用地址的值。把变量地址赋值给指针、
2022-11-11 14:22:37
277
原创 【C++】智能指针
智能指针不是一个指针,它其实是一个对象。它是通过C++的RAII机制实现的。主要是利用C++中对象在释放的时候,会自动调用析构函数这一特性。所以,当智能指针对象释放的时候,在智能指针对象的析构函数中来释放其管理的内存资源。这样,开发人员就不需要手动去释放已经分配的内存空间。shared_ptr是智能指针的一种,不仅通过RAII机制来管理内存资源,还引入了引用计数来解决当多个智能指针指向同一块内存空间的时候,何时释放这块内存空间的问题。
2022-11-11 14:22:24
615
原创 【C++】动态内存
栈:在函数内部声明的所有变量都将占用栈内存。堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。
2022-11-10 14:34:33
533
原创 std::解读
std是一个类(输入输出标准),它包括了cin成员和cout成员,“using namespace std;”以后才能使用它的成员。#include中不存在类std,但是他有cin,out的相关函数,不需要使用命名空间了。#include< iostream>,它包含了一个类,在类的使用之前要预处理一下,“using namespace std;”就是这个功能,然后你就可以使用cin,cout这两个成员函数了。
2022-11-10 11:31:01
3180
原创 cmake基础知识
既然每个 .cpp 文件的这个部分是一模一样的,不如我把 hello() 的声明放到单独一个文件 hello.h 里,然后在需要用到 hello() 这个声明的地方,打上一个记号,#include “hello.h”。一个个调用g++太慢了----------->make程序----->在定义依赖关系后,能自动实现多文件编译和链接。—> 分成多个文件编译成.o文件(不可执行的汇编文件)----》在合成.out文件。一个.cpp文件太大时---->不利于模块化和理解。在改动一个文件后只会编译更改过的文件。
2022-10-12 10:45:29
2100
原创 将“softmax+交叉熵”推广到多标签分类问题
在模型的最后用一个全连接层输出每个类的分数,然后用softmax激活并用交叉熵作为损失函数。指的就是单标签分类问题,即从n个候选类别中选1个目标类别。假设各个类的得分分别为s1,s2,…,sn,目标类为t∈{1,2,…,n},那么所用的loss为这个loss的优化方向是让目标类的得分st变为s1,s2,…,st中的最大值。即从n个候选类别中选k个目标类别。一般方法:这种情况下我们一种朴素的做法是用sigmoid激活,然后变成n个二分类问题,用二分类的交叉熵之和作为loss。缺点:显然,当n≫k时,这
2022-06-17 18:44:31
622
原创 基于词颗粒度的中文WoBERT
序列变短,处理速度更快;在文本生成任务上,能缓解Exposure Bias问题;词义的不确定性更低,降低建模复杂度。
2022-06-16 12:39:10
160
原创 GPLinker:基于GlobalPointer的实体关系联合抽取
关系抽取乍看之下是三元组(s,p,o)(即subject, predicate, object)的抽取,但落到具体实现上,它实际是“五元组”(shs_{h}sh,sts_{t}st,p,oho_{h}oh,oto_{t}ot)的抽取,其中(shs_{h}sh,sts_{t}st分别是s的首、尾位置,而oho_{h}oh,oto_{t}ot则分别是o的首、尾位置。从概率图的角度来看,我们可以这样构建模型:问题:直接枚举所有的五元组数目太多,假设句子长度为l,p的总数为n,即便加上shs_{h
2022-06-13 14:48:28
2128
1
原创 RoPE(旋转式位置编码)
对q,k进行操作(f())使得他们带上位置m,n的绝对位置信息,通过内积后,希望结果带上相对位置信息,因此假设存在下列恒等关系假设f(q,0)=q 和f(k,0)=k先求出在二维情景下的情况,在推广到高纬度借助复数来求解。在复数中有⟨q,k⟩=Re[qk∗],Re[] 代表复数的实部,所以我们有简单起见,我们假设存在复数g(q,k,m−n),使得f(q,m)f∗(k,n)=g(q,k,m−n),然后我们用复数的指数形式,设那么代入方程后就得到方程组...
2022-06-13 14:48:18
3418
原创 TPLinker
TPLinker融合了多头multi-head抽取范式(创建token-pair的矩阵)+ 标注方式(定义三种标注EH2ET,SH2OH,ST2OT的标签)的思想,有些巧妙。假设序列长为N,实体类数为T个,关系类别为R个,则会根据标注标签生成2R+1个结果矩阵,TP_Linker其实就是在上面这种multi-head的思想基础上,最后输出的是一个[batch, seq_len, seq_len, num_label], num_label=2R+11). entity head to entity ta
2022-06-11 20:59:27
1956
原创 注意力机制
如何实现:Q与K进行点乘,点乘的实质是—一个向量在另一个向量上投影的长度-----标量,放映两个向量上的相似度,越大越相似WQW^{Q}WQWKW^{K}WKWVW^{V}WV是参数,需要计算为什么除以dk\sqrt{d_{k}}dkQ与K相乘后值很大,直接做softmax,softmax梯度很小,很容易造成梯度消失。 除以dk\sqrt{d_{k}}dk为了控制方差为1...
2022-06-11 17:03:46
294
原创 GlobalPointer:用统一的方式处理嵌套和非嵌套NER
实体嵌套:指在一句文本中出现的实体,存在某个较短实体完全包含在另外一个较长实体内部的情况假设要识别文本序列长度为n,简单起见先假定只有一种实体要识别,并且假定每个待识别实体是该序列的一个连续片段,长度不限,并且可以相互嵌套(两个实体之间有交集),那么该序列有多少个“候选实体”呢?不难得出,答案是n(n+1)/2个,即长度为n的序列有n(n+1)/2个不同的连续子序列,这些子序列包含了所有可能的实体,而我们要做的就是从这n(n+1)/2个“候选实体”里边挑出真正的实体,其实就是一个“n(n+1)/2选k”的多
2022-06-09 20:38:22
1864
原创 使用bert4keras进行关系抽取的代码
三元组抽取任务,基于“半指针-半标注”结构文章介绍:https://kexue.fm/archives/7161数据集:http://ai.baidu.com/broad/download?dataset=sked最优f1=0.82198换用RoBERTa Large可以达到f1=0.829+说明:由于使用了EMA,需要跑足够多的步数(5000步以上)才生效,如果你的数据总量比较少,那么请务必跑足够多的epoch数,或者去掉EMA。2. 数据加载3. 加载模型4. 预测出SDense
2022-06-09 19:06:33
1375
2
原创 使用bert4keras进行关系抽取的原理
Layer Norm : 进行归一化条件Layer Norm出现问题:抽取S,P,O时候类别不均衡,0太多1太少解决方法:将概率值做n次方。解决思路:原来输出一个概率值p,代表类别1的概率是p,我现在将它变为pnp^{n}pn,也就是认为类别1的概率是pnp^{n}pn,除此之外不变,loss还是用正常的二分类交叉熵loss。由于原来就有0≤p≤1,所以pn整体会更接近于0,因此初始状态就符合目标分布了,所以最终能加速收敛。...
2022-06-09 19:06:12
501
原创 基于DGCNN和概率图的轻量级信息抽取模型
抽取出SPO三元组难点:1、如何确定S/O2、SPO的关系不固定来源于,seq2seq的概率图思路先预测s,然后传入s来预测该s对应的o,然后传入s、o来预测所传入的s、o的关系p,实际应用中,我们还可以把o、p的预测合并为一步,所以总的步骤只需要两步:先预测s,然后传入s来预测该s所对应的o及p。P(s,p,o)=P(s)P(o|s)P(p|s,o)">理论上,上述模型只能抽取单一一个三元组,而为了处理可能由多个s、多个o甚至多个p的情况,我们全部使用“半指针-半标注”结构,并且在关系分类的时
2022-06-03 09:42:20
294
原创 BERT微调—关系分类任务
概念关系分类任务就是从非结构化文本中抽取出结构化知识;具体为:区分出头实体与尾实体之间的语义关系,比如:给两个实体,判断关系如何实现方法一:将句子输入到BERT模型中,然后分别拿到头实体与尾实体的向量表征(实体多个词的表征经过pooling得到),然后将头尾实体向量拼接,再经过线性层分类将两个实体,经过编码器编码后,输入线性层进行分类方法二:BERT的embedding层中加入关系位置编码。在方法一的基础上加上关系位置编码,告诉BERT模型何处为头实体何处为尾实体。方法三:在句子中
2022-05-28 21:22:43
647
原创 FGM对抗训练应用于NLP任务
一、基础概念为什么需要对抗训练:在CV领域,我们需要通过对模型的对抗攻击和防御来增强模型的稳健型,比如在自动驾驶系统中,要防止模型因为一些随机噪声就将红灯识别为绿灯。在NLP领域,类似的对抗训练也是存在的,不过NLP中的对抗训练更多是作为一种正则化手段来提高模型的泛化能力对抗:一个是生成对抗网络(Generative Adversarial Networks,GAN),代表着一大类先进的生成模型;另一个则是跟对抗攻击、对抗样本相关的领域,它跟GAN相关,但又很不一样,它主要关心的是模型在小扰动下
2022-05-28 18:09:43
1536
原创 BERT模型的深度解读
一、BERT整体概要Bert由两部分组成:预训练(Pre-training):通过两个联合训练任务得到Bert模型微调(Fine-tune):在预训练得到bert模型的基础上进行各种各样的NLP二、预训练输入经过bert encoder层编码后,进行MLM任务和NSP任务,产生联合训练的损失函数从而迭代更新整个模型中的参数。Bert Encoder:采用默认的12层transformer encoder layer对输入进行编码MLM任务:掩蔽语言模型,遮盖句子中若干词,用周围词去预
2022-05-28 15:30:13
2881
原创 Transformer模型的深度理解
一、NLP中的encoder和decoder本质:多个编码器和解码器(编码器结构相同,参数不同)(原文用了6个)为什么要先编码后解码?NLP处理的是Sequence2Sequence任务,主要是泛指一些Sequence到Sequence的映射问题。通常的做法是将输入的源Sequence编码到一个中间的context当中,这个context是一个特定长度的编码(可以理解为一个向量),然后再通过这个context还原成一个输出的目标Sequence。编码之后不必每次训练都预处理一次数据,可
2022-05-26 17:00:33
1285
原创 使用bert4keras中的bert模型,完成关系抽取任务
参考来源:这里预训练模型中的文件分析bert_config.jsonbert_model.ckpt.metabert_model.ckpt.data-00000-of-00001bert_model.ckpt.indexvocab.txtbert_config.json是BERT在训练时可选调整参数bert_model.ckpt开头的文件是负责模型变量载入的使用bert,其实是使用几个checkpoint(ckpt)文件。上面下载的zip是google训练好的
2022-05-21 20:56:18
686
原创 CHIP-2020 中文医学文本实体关系抽取
这个项目的本质是-----------医学文本的实体关系联合抽取问题,既要解决命名实体识别,又要解决关系分类问题。使用RoFormerV2模型作为预训练模型,GPLinker作为下游模型,在Embedding层添加FGM对抗训练增加模型性能。CHIP-2020-2中文医学文本实体关系抽取数据集数据集格式本代码需要将数据处理成如下的格式:schemas格式(数据库的组织和结构)介绍:限定待加入知识图谱数据的格式;相当于某个领域内的数据模型,包含了该领域内有意义的概念类型以及这些类型的属性
2022-05-21 17:12:27
4273
17
原创 BERT相关中文论文学习
基于深度学习的中文生物医学实体关系抽取系统来源:这里引言:为什么重要+概念解释+本文提出的算法生物医学语料构建语料库的标注体系-----TEI-----标注体系包括以下内容:蛋 白 质(proteins)、化 学 物(chemicals)、疾 病(diseases)、药名(drug)、脱氧核糖核酸(DNA)以及核糖核酸(RNA)。实 体 间 关 系 标 注 为 存 在 关 系 或者不存在关系语料库的构建-----BioCreativeCDR/JNLPBA生物医学实体识别生物
2022-05-20 13:53:11
194
原创 如何用bert进行关系抽取(给定句子和句子中的两个实体,判断这两个实体之间的关系)
目标:给定句子和句子中的两个实体,判断这两个实体之间的关系来源:关系抽取代码解读:model.pyimport torchimport torch.nn as nnfrom transformers import BertModel class SentenceRE(nn.Module): def __init__(self, hparams): super(SentenceRE, self).__init__() self.pretrai
2022-05-20 00:57:38
569
1
原创 如何用BERT进行关系抽取(从给定的一个句子中抽取所有三元组)
本文学习对象: bert实践:关系抽取解读任务来源: https://github.com/yuanxiaosc/Entity-Relation-Extraction任务目标:从给定的一个句子中抽取所有三元组解决思路(两个模型)关系的分类模型----多标签分类任务-----句子中哪些文本属于哪些关系,例如:未弱和古世属于作者这个关系实体抽取的模型----多分类的单标签任务-----预测每一个tokens的标示,最后根据标示可提取出实体对,例如预测未弱是obj(客体),古世是sub(主体
2022-05-19 16:16:04
1640
原创 BERT代码解析
一、bert的原理1、最核心的一点是:MLM损失函数的计算什么是MLM损失函数?损失函数就是用来表现预测与实际数据的差距程度-----我根据数据预测出一个函数来预测我之后的变化,而损失函数就是L=(Y-f(x))2,最后计算一个平均损失函数求和的值来表示差距。MLM损失函数:这个任务就是将sentence中一些token进行掩盖,模型会输出这些掩盖的token的隐藏状态,将这些隐藏状态输入softmax可以得到候选单词的概率分布,这样根据ground truth就可以计算cross entropy
2022-05-19 14:07:41
3488
原创 【汇编】我的第一个汇编程序
导言:本次篇主要用两种方法实现汇编便成,分别为Masm 2015和一、Masm 2015;完整段的Hello World程序DATAS SEGMENT STRING DB 'Hello World!',13,10,'$'DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: MOV ...
2020-03-05 10:50:18
325
原创 【C#系列】C#入门
一、C#简介1.特点面向对象、面向组件、结构化语言、可以在多种计算机平台上编译。2.环境C#属于解释型语言,构想十分接近于传统高级语言 C 和 C++,是一门面向对象的编程语言,但是它与 Java 非常相似,有许多强大的编程功能。二、程序结构//输出Hello World!using System;namespace test1{ class Program {...
2020-02-23 10:46:20
111
原创 【算法系列05】回溯法
一、回溯法思想贪心算法和动态规划算法在解决最优解的问题上都有原问题具备最优子结构特征,贪心还需要设计最优量度标准。因此贪心和动态规划都不算解决此类问题最常规的方法。但是可以分析此类问题后得出最后结构都是n-元组的解集。因此我们可以用穷举法把所有解集都列出来,但是明显穷举法时间复杂度和空间复杂度一定很大,因此需要用到优化方法。列出所有解集:利用树的结构。优化:用约束函数、限界函数进行剪枝。结...
2020-02-09 23:14:28
182
原创 【算法系列04】动态规划及其应用
一、动态规划思想:二、应用1.每对结点间的最短路径(弗洛伊德算法)任意两点之间可能存在第三个点使得距离两点之间距离变近(可能存在二个三个更多)所以核心算法也就是if(d[i][j]>d[i][k]+d[k][j] ) d[i][j]=d[i][k]+d[k][j];主要是要理解几个图,零阶矩阵来表示图,用path[ ][ ]来记录路程。剩下的就是初始化一一赋值。核...
2020-02-09 23:13:49
223
原创 【算法系列03】贪心算法
一、贪心算法思想贪心选择性质有一个最优解以贪心选择开始最优子结构仅在当前状态下做的最好,不依赖子问题的解二、应用1.背包问题单位重量价值最高的物品优先装包。先计算单位价值排序依次装包#include <bits/stdc++.h>using namespace std;struct GOODS{ int weight; int value;...
2020-02-09 23:13:13
178
原创 【算法系列02】分治法
一、分治法思想:二、应用1.求最大最小元#include <bits/stdc++.h>using namespace std;int MAX(int a,int b){return a>b?a:b;}int MIN(int a,int b){return a>b?b:a;}typedef struct{ int max; int min...
2020-02-09 23:12:22
240
原创 【算法系列】理解算法复杂度
算法的定义:求解问题的一系列计算或者操作步骤性质:输入、输出、确定性、能动性、能行性、有穷性衡量方法运行时间所占空间大小一般关注运行时间运行时间受计算机硬件和环境影响,和程序本身。排除计算机环境,进行事前分析。程序步用渐近复杂法可以用程序步进行分析:1.大O表示法表示的上界,O(n)表示运行时间不超过n常的常数倍数。2.Ω表示法表示的下界,Ω(n)表示运行时间不低于n...
2020-02-09 23:09:48
483
原创 【Java系列】网络连接
一、基础概念IP地址来定义一台计算机在哪里(IPV6编码)127.0.0.1本机地址域名:网络地址的助记符。例如:www.sohu.com, localhost (DNS域名解析)服务类型:应用层提供的网络服务例如:http,smtp,ftp端口port,每台计算机上有0~65535共这么多的端口。是逻辑上的端口。http端口号为80,ftp端口号为21,0 ~1023为系统保留...
2019-12-31 02:00:03
209
原创 【Java系列】抽象类和接口
一、抽象类抽象类的概念:用abstract修饰的类称为抽象类,用abstract 修饰的成员方法称为抽象方法。完整的类有方法并且都已经实现,抽象类就是那些不完整的类,有部分方法没有方法体(没有实现)1.抽象类的创建和使用//创建一个抽象类public abstract class Shape { int area;//面积 public abstract void calA...
2019-12-31 01:16:00
123
1
原创 【Java系列】面向对象三大特点:封装、继承、多态
一、类的继承为了代码的重用便出现了类的继承相比OP的优越性二、继承的实现用extend,继承父类的所有方法和属性注意private,继承私有属性但是访问不了区别C++单根继承Java中所有类都继承Objectsuper()直接调用父类的构造函数,()里面传参三、抽象类完整的类有方法并且都已经实现,抽象类就是那些不完整的类,有部分方法没有方法体(没有实现)创建时用abstra...
2019-12-31 00:59:00
119
1
原创 【Java系列】面向对象
一、面向对象思想类是模板规范,对象是类的实例化比如:类如果相当如酸辣土豆丝的菜谱,那对象就是一盘酸辣土豆丝。我们可以根据这个菜谱做出很多盘酸辣土豆丝,即一个类能实例化很多对象。对象包含,成员变量和成员方法。输入参数进去会返回结果出来。二、具体的表现如何产生一个对象A ojb=new A;在C++中ojb就是指针Java中ojb存在栈空间中,对象实例放在堆内存中。三、构造函数对...
2019-12-30 23:33:32
79
原创 【Java系列】入门需要的最基础知识
一、Java整体的一个印象1.特点:面向对象、平台无关可移植性、多线程、分布式2.环境编译jdk运行jre属于解释型,和python一样边解释,边执行二、基础知识了解最基本的字符的意思1.标识符开头要求只能是:字母、“下划线”、“$”不能出现任何除了"下划线"、"$"意外的特殊字符。2.数据类型要注意的(1)、各个类型的大小和范围,在用的时候不要越界(2)、类型之间...
2019-12-30 23:09:58
92
原创 【Java系列】I/O流
一、概念以及前情提要主要讨论文件的输入和输出及Java与文件之间文件主要分为文本文件和二进制文件(比如照片,视频等)Java中的数据是字符,文件中的数据是字节(文本文件中的数据以字节的形式保存,但是也可以直接用字符进行读写)所以要考虑两个问题1.该怎么输入输出2.该字节字符怎么转换Java以数据流的形式从文件中读取数据流是连续而不是分批发送数据记录的过程。二、...
2019-12-30 14:45:30
118
原创 【Java系列】static、final和常量
一、static静态可用的地方变量、方法、类、匿名方法块特点1.静态变量只依赖类存在不依赖对象实例存在,可以用类名直接调用即无论有多少个实例对象,他们共享的是同一个static静态变量。public class Potato { static int price = 5;//静态变量 String content = ""; public Potato(int price, S...
2019-12-30 10:18:29
313
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人