1.孪生神经网络(Siamese Networks)
1.1 基本概念
同义与歧义:
同义:两个完全不同的句子可能有相同的意思
歧义:两个基本相同的句子可能有完全不同的意思
定义:由左右两个神经网络构成,两个网络共享权值
功能:用于衡量相似程度;在NLP中常用于衡量两个句子是否同义
应用:
签名检测、歧义检测、询问...
1.2 网络结构与计算流程
结构:两个网络共用一组参数,因此只需要训练一次
流程:输入->词嵌入层->LSTM->向量结果->余弦相似度
2.损失函数
2.1 余弦相似度
定义:通过计算两向量间夹角,直观衡量两个输入的相似程度
问题:只考虑了角度关系,没考虑距离关系,缺失了一定信息
2.2 triplet loss
2.2.1 基本概念
定义:一种深度学习损失函数,主要用于比较差异很小的样本
构成:
参考点(A,Anchor):比较的基准
正例(P):与A同一类别的样本;即同义句
反例(N):与A不同类别的样本;即不同义句
原理:
正例应与参考点距离更近,负例应与参考点距离更远,因此正例与参考点越近损失越小、负例与参考点越远损失越小
2.2.2 计算方法
(1)Simple loss:
定义:直接用差作为损失值,实现简单,但会出现损失值为负数的情况
(2)Non linearity:
定义:修正负值,使损失值不为负数,但使得训练效果变差
(3)Alpha margin:
定义:引入margin(α),使损失值不为负且保证了训练效果
问题:
若α过大,会使损失值很大,导致模型难以收敛
若α过小,会使损失值容易趋于0,虽然模型能快速收敛但效果不好
2.2.3 样本类型
(1)easy triplets:
无需优化,天然满足A与P的距离近,A与N的距离远
(2)hard triplets:
A与P远,A与N近,此处损失值最大,需要优化
(3)semi-hard triplets:
虽然A与P较近,但A与N不够远,也需要优化
2.2.4 样本选择方法
(1)随机选择:容易实现,但效果不好
(2)选择hard triplets:虽然更难训练,但能使模型学到更多,效果更好
2.3 计算损失函数
数据准备:使用hard triplets选择法,将不同含义的句子放到一列,相同含义的句子放到一行
计算向量:通过网络计算分别得到两个向量和
计算损失函数:使用Alpha margin法计算损失
2.4 改良技巧
损失函数改良技巧:
(1)mean negative:
方法:将一行中的非对角线元素求均值,能减少噪音,加速训练
例:如第一行中非对角线元素均值为(-0.8 + 0.3 - 0.5)/3;
(2)closest negative:
方法:取一行中与对角线元素最接近的值,加速训练
例:如第一行中与对角线元素0.9最接近的值为0.3
改良后损失函数的计算:
3.单样本学习(One Shot Learning)
3.1 基本概念
定义:只针对一类样本进行学习,然后通过比较相似度的方法判断输入样本与训练样本是否属于同一类
优点:因为只需要比较输入样本与原样本是否一致,因此有新数据加入也不需要重新训练
3.2 训练
(1)构建训练数据集:
(2)构建批数据:
(3)使用孪生神经网络训练:
3.3 测试
测试流程:
(1)将输入句子转化为数字索引
(2)输入模型中计算,得到两结果向量
(3)比较两结果向量的余弦相似度
(4)相似度与阈值比较,大于则认为是同类别
项目代码:https://github.com/Ogmx/Natural-Language-Processing-Specialization
可将代码与数据下载至本地,使用jupyter notebook打开