一、把这个代码的网络结构化出来,画图出来
二、emb_sum这个函数的逻辑,用文字表达出来
三、minibatch + ranking model样本结合起来,评估一下效果
以a9a为训练集,利用train_3.py训练模型,在a8a上进行测试,评估指标AUC值为0.817251
四、模型对比
1.增加一层隐藏层,第一个隐藏层数据维度为32→20,第二个隐藏层数据维度为20→10。在a9a训练集上的最高精度为0.829。在a8a上进行测试,评估指标AUC值为0.804259。增加epoch至30,在a9a训练集上的最高精度为0.841。在a8a上进行测试,评估指标AUC值为0.831354。
2.增加一层隐藏层,第一个隐藏层数据维度为32→20,第二个隐藏层数据维度为20→10;并且在第一个隐藏层之后增加relu激活函数,在第二个隐藏层之后增加relu激活函数。在a9a训练集上的最高精度为0.8。在a8a上进行测试,评估指标AUC值为0.761151。增加epoch至30,在a9a训练集上的最高精度为0.852。在a8a上进行测试,评估指标AUC值为0.838551。
3.拓展字典维度至64维,增加两层隐藏层,第一个隐藏层数据维度为64→32,第二个隐藏层数据维度为32→20,第三个隐藏层数据维度为20→10。并在第一、二个隐藏层之后使用relu激活函数。在a9a训练集上的最高精度为0.799。在a8a上进行测试,评估指标AUC值为0.749009。增加epoch至30,在a9a训练集上的最高精度为0.855。在a8a上进行测试,评估指标AUC值为0.868145。
结论:随着适当增加网络的宽度和深度并添加激活函数,能够提高模型的性能,复杂的网络需要更多的训练轮数。
五、面试题
1、为什么选择batch size?
batch size能够解决全数据集训练时产生的以下问题,
- 收敛的时间会变得很慢(我们就会需要更长的训练时间)
- 内存占用会更大(如果数据量大的话,大多数人的硬件设备可能达不到这样的要求)
还能解决单样本训练时训练不稳定的问题。
2、为什么需要激活函数,各个常用激活函数的优点和缺点(Relu、Tanh、Sigmoid)?
可以引入非线性因素,对于理解复杂和非线性的函数具有重要作用。如果不使用激活函数,则输出信号只是一个简单的线性函数,神经网络就无法学习和模拟其他复杂类型的数据,比如图像、视频、语音等;
使用非线性激活函数,可以使网络更加强大,学习到复杂的任务,能够在输入和输出之间生成复杂的非线性映射;
可以把当前特征空间通过一定的线性映射转换到另一个空间。
Sigmoid的优点:(1)便于求导 (2)能压缩数据,保证幅度不会有问题
缺点:(1)容易出现梯度消失 (2)幂运算耗时 (3)Sigmoid的输出不是0均值的,这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响
Tanh的优点:(1)便于求导 (2)能压缩数据,保证幅度不会有问题 (3)输出是0均值的
缺点:(1)容易出现梯度消失 (2)幂运算耗时
ReLU的优点:(1)计算简单 (2)解决梯度消失的问题,收敛速度比sigmoid 和 tanh 快
缺点:(1)神经元坏死现象 (2)ReLu的输出不是zero-centered (3)不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张
3、为什么激活函数需要非线性函数,如何选择激活函数?
假设我们正在做一项复杂任务,需要使用多层神经网络。然而如果每一层都使用线性变换,不管我们有多少层,最终输出的还是输入的线性变换。因此,线性函数只适用于容易解释的简单任务。
用于分类器时,Sigmoid函数或Softmax函数通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。ReLU函数是一个通用的激活函数,目前在大多数情况下使用。如果神经网络中出现死神经元,可以使用Leaky ReLU或PReLU。
4、为什么Tanh收敛速度比Sigmoid快?
这与激活函数的求导有关:
,其导数范围在(0,1]
,其导数范围在(0,1/4]
由此可见,tanh(x)梯度消失的问题比sigmoid(x)轻,所以tanh收敛速度比较快。
5、如何理解Relu激活函数的稀疏激活性?
当前,深度学习一个明确的目标是从数据变量中解离出关键因子。原始数据(以自然数据为主)中通常缠绕着高度密集的特征。然而,如果能够解开特征间缠绕的复杂关系,转换为稀疏特征,那么特征就有了鲁棒性(去掉了无关的噪声)。稀疏特征并不需要网络具有很强的处理线性不可分机制。那么在深度网络中,对非线性的依赖程度就可以缩一缩。一旦神经元与神经元之间改为线性激活,网络的非线性部分仅仅来自于神经元部分选择性激活。
对比大脑工作的95%稀疏性来看,现有的计算神经网络和生物神经网络还是有很大差距的。庆幸的是,ReLu只有负值才会被稀疏掉,即引入的稀疏性是可以训练调节的,是动态变化的。只要进行梯度训练,网络可以向误差减少的方向,自动调控稀疏比率,保证激活链上存在着合理数量的非零值。