实现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个实验方案分别为:
- 按照原版TLSTM,以0.5作为softmax的输出阈值进行判断。学习时取每篇文章的第一个tag,即最高频的tag。以下命名为softmax1
- 无视softmax函数的阈值问题,直接从高到低取输出结果的前X个(对应推荐类任务的推荐前X个),主要是为了解决TLSTM不能预测多tag的问题,本身不涉及模型结构修改。学习时仍然只取每篇文章的第一个tag,即最高频的tag。以下命名为
- 将输出层的单个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)
我寻思,我是菜鸡我不懂这玩意儿能不能做,你作为导师居然不知道这东西是上古老旧方案,并且让我试试是不是不太合适?