文本匹配
文本匹配是NLP中的一个核心问题,例如信息检索可以归结成查询项和文档的匹配;智能问答可以归结为问题和候选答案的匹配;对话系统可以归结为对话和回复的匹配。
文本匹配任务发展历程:单语义模型–>多语义模型–>匹配矩阵模型–>深层句间交互模型。
DSSM模型
DSSM将query和doc映射到同一个低维向量空间,在这个空间内,query和doc的相似度可以由这两个向量的空间距离计算得出。(向量间的距离表示匹配程度)
模型优化策略:给定输入时,最大化正确标签出现的条件概率,即相当于分类任务,利用softmax交叉熵损失。
关键点: 采用词哈希技术应对大规模的网络搜索。
词哈希技术
本质为一种embedding技术,以#开始,#结束,利用n-gram滑动窗口记录每次滑过的单词切片,简历单词切片索引字典。
例如:单词text , n=3(即3-gram)
第一步,添加开始结束标识:#text#
第二步,设置步长为1,大小为n的滑动窗口,记录每次滑过的单词切片。 结果: #te,tex,ext,xt#
优点:
- 压缩空间,采用词哈希技术,可以词的向量空间大幅度减少,同时增强泛化能力。
- 使得形态上相近的单词有相近的表达,有很强的鲁棒性,大幅度缓解OOV问题。
问题:
- 切分冲突,即不同的切分后的n-gram存在相同的情况。
网络结构
-
词哈希–线性映射
-
全连接层
-
余弦相似度计算语义相关性
优化函数:
代码
class DSSM(nn.Module):
def __init__(self):
super(DSSM, self).__init__()
self.embedding = nn.Embedding(args.char_size, args.embedding_size)
self.liner1 = nn.Linear(args.embedding_size, 256)
self.liner2 = nn.Linear(256, 128)
self.liner3 = nn.Linear(128, 64)
self.dropout = nn.Dropout(p=0.2)
def forward(self, a, b):
a = self.embedding(a).sum(dim=1)
b = self.embedding(b).sum(dim=1)
a = torch.tanh(self.liner1(a))
a = self.dropout(a)
a = torch.tanh(self.liner2(a))
a = self.dropout(a)
a = torch.tanh(self.liner3(a))
b = torch.tanh(self.liner1(b))
b = self.dropout(b)
b = torch.tanh(self.liner2(b))
b = self.dropout(b)
b = torch.tanh(self.liner3(b))
cosine = torch.cosine_similarity(a, b, dim=1, eps=1e-8)
return cosine
def _initialize_weights(self):
for m in self.modules():
if isinstance(m, nn.Linear):
torch.nn.init.xavier_normal_(m.weight, gain=1)