算法模型
intent_classifier_tensorflow_embedding
点击此处获取算法代码
算法框架
算法思想
把训练样本和意图编码到同一个向量空间,设计损失函数,使得样本与真实意图更相近,样本与其他意图更相反,意图之间编码更相反,达到意图分类的目的。
举个例子说明,假设有两条训练样本“我要充话费”和“我要订机票”,有四个意图“订机票”、“查天气”,“充话费”,“查运势”,意图分类算法的目的就是把“我要充话费”分到“充话费”上,“我要订机票”分到“订机票”上。
样本与真实意图更相近就对应“我要充话费”和“充话费”向量相似度更高,同理,“我要订机票”和“订机票”向量相似度更高;
样本与其他意图更相反就对应“我要充话费”和“订机票”、“查天气”、“查运势”向量相似度更小;
意图之间编码相反就对应“订机票”、“查天气”,“充话费”,“查运势”向量相似度更小。
网络结构
1、样本输入x
输入层采用bag-of-word方式,只考虑词频,n_words是词汇表词语总数
MLP有两个隐含层,采用relu激活函数,并配置 dropout和L2正则
2、意图输入y
输入层是意图数*意图数的方阵,对角线元素为1,其余为0,方阵的第一行是样本的真实意图,剩下行数是其他意图(负样本)
3、embedding层
样本输入和意图输入的embedding层维度均为20
相似度计算
向量相似度计算采用常见的余弦相似度。但是本算法计算两个相似度,一个是sim,即样本与意图之间的相似度;另一个是sim_emb,即意图之间的相似度。
损失函数
max_sim_neg = tf.reduce_max(sim[:, 1:], -1)
max_sim_emb = tf.maximum(0., tf.reduce_max(sim_emb, -1))
loss1 = tf.reduce_mean(tf.maximum(0., self.mu_pos - sim[:, 0]) +
tf.maximum(0., self.mu_neg + max_sim_neg))
loss = (loss1 +
# penalize max similarity between intent embeddings
tf.reduce_mean(max_sim_emb) * self.C_emb +
# add regularization losses
tf.losses.get_regularization_loss())
损失函数定性理解,损失=样本与真实意图的相似度取反+样本与最相近的其他意图的相似度取正+真实意图与最相近的其他意图的相似度取正
最小化损失相当于,训练过程中逐渐让样本的编码向量与真实意图的编码向量更相近,样本的编码向量与其他意图的编码向量更相反,不同意图之间的编码向量更相反。