对很久以前和近期一批业余实验的几点总结,依然是唠嗑的形式。
水平和精力有限,欢迎讨论。
Deep Learning 成为一种现象大约是在2014年以后。2016年谷歌的 AlphaGO 应该被列入史上最成功的营销案例。
在 Deep Learning 的 “Hinton 时代”(约2006~2014),Hinton 常提的一种训练模式,是 pretrain-finetune,即首先使用大量无标签样本进行无监督学习,然后在少量有标签样本上微调参数。
该一过程的“理论”基础是对 Deep Learning 的一种诠释——“表示学习”。
简单来说是认为深度学习之所以有效,在于反向传播使网络由浅到深、由简单到复杂地学习到了对数据的有效表示,也就是特征。
预训练的全称是逐层贪婪预训练,最初是在以受限玻尔兹曼机为基础的 DBN 中使用的。RBM 可以看作一种特殊的两层神经网络(只有输入、权重和输出),属于无监督模型。DBN 的思想即让每一组 RBM 学到最优表示,层层堆叠成为一个多层网络。
如果需要做分类任务,就把 DBN 的权重取出,增加一层对应类别的线性连接,然后在 BP 中微调各层权重。
这就是 pretrain-finetune 的过程。
Hinton 曾经认为这种模式会成为 Deep Learning 领域基石般的存在。至少直到2014年他还是这么认为。
现在看来,他说得对,也不对。
对,是因为至少在图像领域,这种模式确实成为了标配;错则是说,虽然还是 pretrain-finetune 的路子,但两个过程都是在有标签数据上做监督学习。几年过去了,至少到现在为止,无监督学习并没有像几位巨擘认为的那样,取得什么不得了的进展。
图像方面最常见的,是拿 ImageNet 训练完的模型,掐掉头换个新的,先微调最后一层,然后放开所有权重,微调每一层。连续两年的 Fastai 课程一直在强调这个事情。Lesson1 就展示了用他们的库在猫狗大战数据集上可以轻松达到 99.4% 的准确率,超过该比赛当年冠军的水平(98.3%)。
这样做之所以有效,把 Hinton 对 DBN 的解释放到 CNN 上显然更有说服力。CNN 之所以成功,主要是引入了局部或者说限制权重这条很强的先验。(残差和 BN 都是后来的事情了。)这条强先验同时还带有强正则化的效果。(想想删去了多少权重和连接)
当然直观来看也很好理解——图像是“方形”的,那我们就提取“方形”特征好了。
实验表明,自然图像是很吃这一套的。 在对 CNN 的可视化研究中,每一层的 feature map 都能看到一些“看起来有意义”的特征,边缘啊轮廓啊之类的。
CNN 之后复活的是 RNN,主要是 LSTM。与其说算法有多大进步,倒不如说数据多得足以让网络学到些有用的东西,同时算力的充沛让大家有了瞎捷豹试的胆子。有篇文章挺有趣的,大意是指责谷歌使用强化学习搜索网络结构的神操作是忽悠人——仗着有800块 TPU 有花不完的算力和电费到处水文章,实际上随机搜索都不见得比你的强化学习要差。
观点如何见仁见智,但强化学习领域的文章确实是公认的难复现。
扯远了。
(研究领域的简单的)图像问题基本算是解决了,NLP 方面的进展就不那么乐观。大样本预训练+标签数据微调的模式到去年底和今年初才姗姗来迟。Fastai 的 ULMFiT,OpenAI 的 transformer 都是很新的成果。
以 ULMFiT 为例,方法其实一点都不新,完全就是图像迁移的思路,只不过第一阶段换成了无监督而已。
该方法可以分成三个阶段。
换成图像的说法,(举个例子),就是 ImageNet 预训练一哈,动物大数据库再调一哈,最后把猫狗标签拿出来放上,收工。当然这篇文章还有其他的一些技术,是 Jeremy 本人在实践中得出的一些经验。比如三角 LR、逐层解锁权重、差异化 LR 等等,很多都是在打 Kaggle 和解决客户的实际问题中发现的。实用性还是很强的。
话说回来,这套东西到底好不好用?
我觉得,比较微妙。
从去年到现在,我断断续续做过一堆小实验,主要是360赛题的数据和今年 Kaggle 的 Toxic Comment。
这里顺便叹口气 Toxic Comment 这比赛,当时在做导师的项目整天着急上火就没跟。如果真能俩月坚持打下来估计现在也不是这副德行……(负能量倒完了继续说正题)
360赛题是中文数据,凸显的问题是中文高质量公开语料的匮乏。想想就知道,百度百科那烂玩意儿是不能用的。学术评测用数据集早不知道是多少年前的老古董了,还特别小,没法用来炼丹。我见过比较大的也就搜狗的新闻库、头条的作者库。肯定不是各厂没数据,是不公开罢了。
只有第三名彻底开源了代码,我就拿这几位的方法说事儿吧。
他们采用的 embedding 应该是在所有数据(110万条)上做的,相当于用浅层线性网络跑了一遍样本库。没有用外部数据,但调用了哈工大的 LTP 做分句和词性标注。
我在十分之一也就是十一万条数据上重测,最后2*F1大概是0.75,比起作者的0.90来还差很多。时间关系没有彻底重现。
他们的 HAN 写得似乎有点问题,参数量差不多,但结果比另一位在 GitHub 上开源的 HAN 要低大概两个百分点。
没有公开的高质量语料也就很难做 LM 的训练。所以我说中文 NLP 难做……
这套方案里,embedding 勉强算是 transfer 了,考虑到样本质量比较差我没有做 LM 的训练——翻看一部分数据的时候啼笑皆非,感觉这堆东西很难再做得更高了,人为制造的困难太多——一篇非常正式文档,把其中的【四个字】换个方向,你说你用 DNN 能测出来?鬼才信。
结合 Toxic Comment 还能看出更多有趣的东西。
Toxic Comment 好在是英文可以直接用。我按 ULMFiT 的思路走了一遍,发现结果一般,AUC 只有 0.97+,LM 部分的 loss 看起来还可以,但到 finetune 的时候早早过拟合,还不如直接训练的 TextCNN——对了,这比赛的分数咬得也特别紧,看 leaderboard,除了特别靠前的,都是在千分位万分位上拼。所以不奇怪所有人都在做 ensemble 了……
如果不用 Wikipedia 预训练的权重直接在所有数据上训练怎么样?更快的过拟合。
不训练 LM 怎么样?大同小异。
所以结合我之前的学习,最后做个总结吧。
来斯为在他的博士论文和几篇博客里讲过词嵌入的问题。
什么是好的词向量?
首先对“正常文本”来说,大语料库很重要。
对“特定文本”,专业领域的语料也很重要。
两者什么关系?做实验自己试……所以 FastText 作为生产工具还是很重要的……
没有预训练的 embedding 会怎么样?过早过拟合/对训练集过拟合选一种死法。除非你人品太好,跳过各种 bad local minimum 直接进到一个好的大平原。
为什么会出现这些问题,主要还是任务的搜索空间太大,尤其是 NLP 模型里,embedding 这一层很不好处理。
对的语料、好的训练集、精心设计(但实际上往往是仗着算力足瞎跑(所以做梦都想进大厂跟着大佬学怎么“正确”地炼丹))的训练过程缺一不可,最常见的死法就是在某一水平上过拟合,再也上不去(Dropout、BN到这都不好使了讲真)。
重新拾起规则和其他手工特征是没有办法的办法。
比如 Kaggle 马上结束的 Home Credit Default Risk 赛目测很难直接上 DL,就算要上,也得是做特征到炉火纯青能够发现那些可用的东西(特征太多了,没知识又是一个人实在搞不定……学人家直接躺尸 ensemble 好了)。
其实对大佬而言,“炼丹”只是一种笑谈。DL 确实降低了做算法的门槛,但真想当堂入室,要研究的东西多了去了。好比差不多的模型,人家能跑0.9,我只能跑0.7……
写得比较乱,见谅。只是一堆想法的罗列,谈不上有什么见解。想起来再补充吧。