ESIM.

ESIM

ESIM

整体结构:
在这里插入图片描述
输入(input embedding)
利用预训练的词向量或者添加embeddin层
采用双向LSTM对输入做特征提取,并将其隐藏值保存下来
在这里插入图片描述
局部推理建模层
句子间注意力计算:
首先,基于点积函数的注意力打分矩阵:在这里插入图片描述
获取 a_title(b_bar的加权向量)和b_title(a_bar的加权向量)
在这里插入图片描述
矩阵拼接
在这里插入图片描述
目的:为了获取更多的特征
即得到encoding值与加权encoding值之后,下一步是分别对这两个值做差异性计算,作者认为这样的操作有助于强化每个单词的表征,方式:对位相减和对位相乘。
推理组合层
m a m_a ma m b m_b mb送入双向LSTM得到 V a V_a Va V b V_b Vb,对 V a V_a Va V b V_b Vb分别使用平均和最大池化得到 V a a v e V_aave Vaave V a m a x V_amax Vamax V b a v e V_bave Vbave V b m a x V_bmax Vbmax,将这四个向量拼接成V。
在这里插入图片描述
输出预测
利用全连接层+tanh激活函数+softmax函数进行分类
在这里插入图片描述

代码

import torch
import torch.nn as nn


class Esim(nn.Module):
    def __init__(self, config, TEXT):
        super(Esim, self).__init__()

        self.embed = nn.Embedding(*TEXT.vocab.vectors.size())
        self.embed.weight.data.copy_(TEXT.vocab.vectors)

        self.a_lstm = nn.LSTM(input_size=TEXT.vocab.vectors.size()[1],
                              hidden_size=config.hidden_size,
                              batch_first=True,
                              bidirectional=True,
                              num_layers=2,
                              dropout=0.2)

        self.b_lstm = nn.LSTM(input_size=TEXT.vocab.vectors.size()[1],
                              hidden_size=config.hidden_size,
                              batch_first=True,
                              bidirectional=True,
                              num_layers=2,
                              dropout=0.2)

        self.a_lstm_infer = nn.LSTM(8 * config.hidden_size,
                                    config.hidden_size,
                                    batch_first=True,
                                    bidirectional=True)
        self.b_lstm_infer = nn.LSTM(8 * config.hidden_size,
                                    config.hidden_size,
                                    bidirectional=True,
                                    batch_first=True)

        self.liner = nn.Sequential(nn.Linear(8 * config.hidden_size, 2 * config.hidden_size),
                                   nn.Tanh(),
                                   nn.Linear(2 * config.hidden_size, config.linear_size),
                                   nn.Tanh(),
                                   nn.Linear(config.linear_size, config.classes))

    def forward(self, a, b):
        emb_a = self.embed(a)
        emb_b = self.embed(b)

        a_bar, _ = self.a_lstm(emb_a)
        b_bar, _ = self.b_lstm(emb_b)

        e = torch.matmul(a_bar, b_bar.premute(0, 2, 1))
        a_title = torch.matmul(torch.softmax(e, dim=1).premute(0, 2, 1), b_bar)
        b_title = torch.matmul(torch.softmax(e, dim=1).prenute(0, 2, 1), a_bar)

        ma = torch.cat([a_bar, a_title, a_bar - a_title, a_bar * a_title], dim=2)
        mb = torch.cat([b_bar, b_title, b_bar - b_title, b_bar * b_title], dim=2)

        va, _ = self.a_lstm_infer(ma)
        vb, _ = self.b_lstm_infer(mb)

        va_avg = torch.mean(va, dim=1)
        va_max = torch.max(va, dim=1)[0]

        vb_avg = torch.mean(vb, dim=1)
        vb_max = torch.max(vb, dim=1)[0]

        v = torch.cat([va_avg, va_max, vb_avg, vb_max], dim=1)
        out = self.liner(v)
        return out
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值