- PyTorch入门
所有的框架都是基于计算图的。计算图分为静态和动态的。静态是先先定义后执行,动态图是运行过程中被定义的。
Tensor是PyTorch中重要数据结构,可以认为是一个高维数组,可以是一个数(标量),一维数组(向量),二维数组(矩阵)或更高维数组。与numpy的区别是可以GPU加速。
- Autograd
深度学习的本质是通过反向传播求导数。PyTorch的Autograd模块实现了自动求导功能,在Tensor上的所有操作,都能自动提供微分。
- Variable主要包含3个属性:
data:保存Variable所包含的Tensor
grad:保存data对应的梯度
grad_fn:纸箱一个function对象,用来计算梯度
from torch.autograd import Variable
x = Variable(t.ones(2,2),requires_grad = True) #使用Tensor新建一个Variable
y = x.sum()
y.backward() #反向传播计算梯度
x.grad() #查看梯度值
神经网络
torch.nn是专门为神经网络设计的模块化接口。nn构建与Autograd之上,可以用来定义和运行神经网络。nn.Module是nn中最重要的类,可以看做是一个网络的封装,包含各层网络的定义及forward方法。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.conv1 = nn.Conv2d(1,6,5)
self.conv2 = nn.Conv2d(6,16,5)
self.fc1 = nn.Linear(16*5*5,120)
self.fc2 = nn.Linear(120,84)
self.fc3 = nn.Linear(84,10)
def forword(self,x):
x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x = F.max_pool2d(F.relu(self.conv2(x)),2)
x = x.view(x.size()[0],-1)
x = x.relu(self.fc1(x))
x = x.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
只要在nn.Module子类中定义了forward函数,backward函数就会被自动实现(利用Autograd).在forward函数中可以使用任何Variable支持的函数。forward函数的输入和输出都是Variable,只有Variable才具有自动求导功能。输入时需要将Tensor封装为Variable。
损失函数及优化器
nn实现了神经网络中大部分的损失函数。
output = net(input)
target = Variable(t.arange(0,10))
criterion = nn.MSELoss()
loss = criterion(output,target)
在反向传播计算完所有参数的梯度后,还需要使用优化方法更新网络的权重和参数。
torch.optim中实现了大部分深度学习中的优化方法
import torch.optim as optim
optimizer = optim.SGD(net.parameters(),lr = 0.01) #新建一个优化器 指定参数和学习率
optimizer.zero_grad() #先梯度清0
output = net(input)
loss = criterion(output,target) #计算损失
loss.backward() #反向传播
optimizer.step() #更新参数
循环神经网络
PyTorch中实现了最常用的RNN、LSTM、GRU。此外还有3种对应的RNNCell。RNN和RNNCell的区别在于RNN可以处理整个序列,RNNCell一次只能处理序列上的一个时间点的数据。RNN更完备更易于使用,RNNCell更灵活
input = V(t.randn(2,3,4)) # 输入序列长度为2 batch_size为2 每个元素占4维
lstm = nn.LSTM(4,3,1) # lstm输入向量4维 3个隐含单元 1层
h0 = V(t.randn(1,3,3))
c0 = V(t.randn(1,3,3)) # 记忆单元
out, hn = lstm(input,(h0.c0))
词向量在NLP中应用广泛,PyTorch同样提供了Embedding层
embedding = nn.Embedding(4,5) # 有四个词 每个词用5维的向量表示
embedding.weight,data = t.arange(0,20).view(4,5) # 可以用预训练好的词向量初始化embedding
对于其中的实体链接阶段进行介绍:
实体链接一般分为候选实体生成和候选实体消歧两个阶段。候选实体生成是指为了待链接的实体指称初步筛选出一批待选命名实体。候选实体生成的方法一般有:词典映射法和检索排序法。候选实体生成以后,我们需要在候选实体中选出真正的目标实体,我们称这个过程为实体消歧。常用的实体消歧方法以下分别介绍。
基于检索的方法
该方法将指称实体及其附近的关键词作为查询项,在知识库中进行查询,选取得分最高的候选实体作为目标实体;能够有效利用上下文信息
基于空间向量模型的方法
根据上下文分别构建指称实体和候选实体的特征向量,然后计算它们的余弦相似度,选取相似度最高的候选实体作为目标实体。但空间向量为词袋模型,不能反映词语之间的语义关系
基于排序模型的方法
该方法主要利用Learn to Rank(LTR)排序模型,根据查询与文档的文本相似度(余弦相似度)、欧氏距离、编辑距离、主题相似度、实体流行度等等特征进行训练和预测,选取排序最高的作为目标实体。它的优势就是可以有效地融入不同的特征。
基于主题模型的方法
根据指称实体与候选实体的主题分布相似度进行目标实体的确认。该方法的主要优势是能在一定程度上反映实体的语义相关性,避免维度灾难,在上下文信息比较丰富的情况下,能够取得很好的效果。
基于深度语义表示的方法
利用维基百科中实体链接关系与邻接关系等训练实体语义表示;然后结合上下文,使用类似于PageRank的方法对各个候选实体进行打分,选取得分最高的作为目标实体。
关键技术:
引用表构建:引用表存储一个名字所有可能指向的实体
实体知识构建
- 实体知名度(表示一个实体被人们了解的程度,知名度越高越有可能提起)
- 实体的名字分布(一个实体的名字通常 定的 以 定的 个实体的名字通常是固定的,且以一定的
概率出现)
- 实体上下文(特定实体的上下文规律性
上下文中出现iPad、视网膜屏的更有可能是苹果公司 出现好吃、甜的更可能是水果苹果
- 实体语义关联度(捕捉实体和实体之间的语义关系)
相关实体更有可能出现在一篇文章中
如何衡量两个实体之间的相似度? 1.在知识网络中的距离 2.在文章中共现的次数
- 文章主题(一篇文章的实体应该与其主题相关)
苹果公司更容易出现在IT相关主题文档中
水果苹果更容易出现在吃或农业相关文档中
链接推理算法
链接推理算法就是综合实体知识进行决策的过程。
局部推理
考虑单个实体的上下文,考虑文章中其它实体对该实体的影响
本文大部分内容均借鉴于:https://blog.csdn.net/qq_17677907/article/details/86486366