Save you from anything

0%

TLSTM的改良实验

实现itag的baseline之一——TLSTM时,顺便尝试了一个(上古时代的)改良方案,以下为实验思路和实验结果分析。

(实验实际上大概是在2019年10月~11月期间做的,这里只是挖坟而已,隔太久已经忘了做的具体时间了)

模型分析/改良思路

TLSTM结构

TLSTM的结构略简单,这里只提几句,详见文章 论文分析/实现:Hashtag recommendation with topical attentionbased LSTM。TLSTM是个使用了attention机制的RNN模型,但并不是seq2seq。模型通过attention机制结合了RNN和LDA输出的序列,输出端是个全连接层+softmax,即这个模型是个单tag推荐模型。

TLSTM的劣势

在对于itag(一个基于seq2seq的多tag推荐模型)的分析中我提到过,itag的seq2seq结构天然的适合预测多tag,因为seq2seq本身的目的就是输出一串序列。因而仅通过softmax进行输出的模型在多tag推荐任务上是必然比不过itag的。

改良思路

实现TLSTM时,我想起了吴恩达的机器学习课程中提到的一种多标签算法:对于输出空间大小为N的标签集,堆叠N个sigmoid输出,每个输出独立的判断输入的信息是否拥有标签i。

例如,假设总共有十个标签需要进行推荐,则输出端为10个sigmoid函数,独立的判断输入的文章是否有标签0~9。

现在,我已经知道这个方法是个非常原始的方法了,根据XXX的OOOO的说法,这属于多标签推荐任务中最初级的策略,这个策略完全没有考虑到标签间的互动关系。

另外,在当时我其实也应该意识到这个方法是个非常初级的办法,吴恩达的课的特性就是讲的非常清楚易懂,代价就是很多东西只讲到入门部分。而机器学习这门课的录制时间是2015年。也就是说,这个方法在2015年看来都是非常初级的方法,而我在2019年还在尝试这个方法。

(学生蠢是可以的,我当时也是拍脑袋一想,顺手就做了,之后在组会上汇报了基线系统实现的结果和这个改良方案)

实验方案

对于TLSTM,使用了3个实验方案,另外把ITAG加入作为对照。

在数据集方面,使用了itag的ask Ubuntu论坛数据集进行实验,数据集的tag编号按tag频率排列,tag频率越高,编号越小。

TLSTM的3个实验方案分别为:

  1. 按照原版TLSTM,以0.5作为softmax的输出阈值进行判断。学习时取每篇文章的第一个tag,即最高频的tag。以下命名为softmax1
  2. 无视softmax函数的阈值问题,直接从高到低取输出结果的前X个(对应推荐类任务的推荐前X个),主要是为了解决TLSTM不能预测多tag的问题,本身不涉及模型结构修改。学习时仍然只取每篇文章的第一个tag,即最高频的tag。以下命名为
  3. 将输出层的单个softmax替换为N个sigmoid函数。学习时输入多tag数据集。

进行三轮实验,分别为实验分别预测1个、3个、5个tag。

实验结果

单标签学习/推荐时,TLSTM的实验方案1和3效果一致,故对于单标签学习/推荐的测试,只执行TLSTM的实验方案1

itag TLSTM
精确 0.759 0.510
召回 0.278 0.133
F1 0.407 0.211

表1:预测1个tag

分析:没有特别的参考意义,TLSTM被itag吊打正常,这里的实验结果和itag论文中的基本接近

itag TLSTM/softmax1 TLSTM/softmax2 TLSTM/sigmoid
精确 0.527 0.084 0.431 0.662
召回 0.579 0.184 0.332 0.263
F1 0.552 0.115 0.375 0.370

表2:预测3个tag

分析:

  • 性能依然是itag最好(必然的结果)
  • Ask Ubuntu数据集平均tag数量是2.7个,对于softmax1,强行只取1个tag进行预测效果极差是预料之中,相比之下softmax2的表现好的多
  • N个sigmoid的精确度这么高是我一开始没想到的,但事后想到,sigmoid函数对于判断有/无的精确度是确实很高。由于N个sigmoid这个策略完全没有利用到tag间之间的信息,因而召回很低。
  • 相比之下softmax2结果稍好于sigmoid,因为softmax虽然学习的是单tag,但模型有可能遇到两篇内容接近的文档分别拥有两个近义tag。从而能“微弱的”捕捉到tag间的联系。
itag TLSTM/softmax1 TLSTM/softmax2 TLSTM/sigmoid
精确 0.389 0.007 0.252 0.641
召回 0.712 0.184 0.483 0.268
F1 0.503 0.102 0.321 0.380

表2:预测5个tag

分析:

  • 前面提及过,Ask Ubuntu数据集平均tag数量是2.7个,因而扩大预测长度到5个之后,itag和TLSTM/softmax2的精确都降低了,召回提高了(允许一次猜更多,能预测出的tag变多了, 预测的准确度降低了),由于平均tag2.7,所以总体来说这两个算法都降低了,但由于seq2seq允许输出终止符号,而这个符号在最终计算时是去掉的,因而性能损失较小。

  • softmax1,依然是差的抠脚,原因和3tag的分析一致。

  • N个sigmoid的精确与召回基本不变,因为这个算法不受预测输出长度的影响,概率大于0.5就是1,小于0.5就是0,不会因为要求输出5个tag就真能输出5个

结论

  • 对于TLSTM模型的实现基本成功,和itag所做的结果出入不大
  • N个sigmiod的老方法确实效果一般

不相关吐槽

这里有个槽点。前文提到,N个sigmoid这个方法是个相当老的多标签推荐方法,但我当时并没意识到这点,只是想起来有这么个方法,觉得可以试试。

在组会上进行汇报后,我的导师对这个方法表现出了极大的兴趣,他认为这个方法的精确度相当的高,只是召回偏低,如果能想办法提高召回,本身就是一个很好的改良方案。因而他让我先往这个方向尝试一下。

最后的结果当然是没有试出来什么能大幅提高召回的方案,浪费了一段时间,最后回头过来继续做itag改良。

(现在的话我倒是知道一些基于决策树的改良方案,不过即使实现了应该也不如itag)

我寻思,我是菜鸡我不懂这玩意儿能不能做,你作为导师居然不知道这东西是上古老旧方案,并且让我试试是不是不太合适?