2018年NLP的10个令人激动的想法

原文来自:http://ruder.io/10-exciting-ideas-of-2018-in-nlp/,文章列举的是10个作者认为比较令人激动的想法,成果不一定喜人,但是在未来可能是热门研究领域。

1)无监督机器翻译 – Unsupervised MT

2018年ICLR有两篇无监督机器翻译的文章,它们令人激动的点是真能工作,但是结果目前还不是很好,作者在这里划重点的文章是https://arxiv.org/abs/1804.07755

2)预训练语言模型 – Pretrained language models

使用预训练的语言模型可能是2018年最重大的成果,并取得了非常喜人的成果,主要提出的方法有:ELMo、ULMFiT、OpenAI Transformer、BERT。重点文章是https://arxiv.org/abs/1802.05365

3)常识推理数据集 – Common sense inference datasets

将我们人类的常识融入到我们的模型当中是一个非常重要的研究方向,然而创造这样的数据集并不容易,而且会出现比较大的偏置。2018年出现了一些比较好的数据集比如Event2Mind和SWAG,他们都是来自University of Washington,这里放张图感受一下,链接是http://visualcommonsense.com/

4)元学习 – Meta-learning

元学习又叫学会学习(learning to learn),它已经在few-shot learning、reinforcement learning、robotics领域里有所应用,其中最杰出的一个例子是model-agnostic meta-learning(MAML),但是在NLP领域里成功的应用并不多。元学习在有限样本集的任务里面非常有用。重点文章是http://aclweb.org/anthology/D18-1398

5)鲁棒的非监督方法 – Robust unsupervised methods

2018年作者和其他团队发现如果两个语言不相似的话,那么无监督的跨语言word embedding方法并不适用。这在迁移学习里面很常见,尤其是当源任务和目标任务不相似,导致迁移学习的不适用。所以使无监督模型更加鲁棒显得尤为重要。重点文章是http://www.aclweb.org/anthology/P18-1073

6)理解表示 – Understanding representations

已经有很多的努力在理解模型的representation上,重点文章是http://aclweb.org/anthology/D18-1179

7)高明的辅助任务 – Clever auxiliary tasks

我们已经看到仔细挑选辅助任务在多任务学习领域中的越来越广泛的应用。对于一个好的辅助任务,数据必须容易获取,其中一个年度最杰出的例子就是BERT,它使用的是next-sentence预测,而它其实在skip-thoughts和quick-thoughts里面已有应用。重点文章是http://aclweb.org/anthology/D18-1412https://arxiv.org/abs/1810.08854

8)半监督学习和迁移学习的结合 – Combining semi-supervised learning with transfer learning

对于近期在迁移学习领域取得的成果,我们不应该忘记对目标任务数据的更明确的使用。事实上,预训练的表示和很多形式的半监督学习都是互补的。作者提出了一个半监督的self-labelling方法,主要思路就是通过多任务的选举方法来产生样本。重点文章是http://aclweb.org/anthology/D18-1217

9)大文本的QA和reasoning – QA and reasoning with large documents

QA领域已经有不少数据集,18年新出了一个数据集,它是针对整个电影的剧本或者书来进行QA,由于文本的巨大,给模型提出了不少挑战。重点文章是http://aclweb.org/anthology/Q18-1023

10)归纳偏置 – Inductive bias

如CNN里面的卷积、正则化、dropout等其他机制的归纳偏置是神经网络的核心部分,可以使模型更加的sample-efficient,即更少样本更好泛化。然而更多的归纳偏置方法和将它们融入模型是个挑战。重点文章是http://aclweb.org/anthology/K18-1030http://aclweb.org/anthology/D18-1548。这里加个图可以更好地理解什么是归纳偏置:

Multi-Task Learning

最近在研究一个NLP任务,感觉用MTL(Multi-Task Learning,多任务学习)来解决会非常适合,所以就稍微调研了一下MTL,发现一篇比较好的文章,这里就简单理解了一下,现在翻译一下做个笔记,原文地址:http://ruder.io/multi-task/index.html#whydoesmtlwork,英文不错的话还是建议看原文。

首先什么是MTL,多任务学习就是将多个任务放在一起进行训练(它们会共享一些参数,并会将loss进行weighting)来获得更好的效果,获得更好的泛化能力。MTL已经被成功应用于很多领域,譬如natural language processing、speech recognition、computer vision、drug discovery等。在深度学习领域,它的实现主要有两种方法:hard parameter sharing和soft parameter sharing。Hard parameter sharing应用的更多些,也比较简单,就是把所有的任务的hidden layers的参数给共享出来,而且保持自己的task-specific输出层,如下图所示:

Hard parameter sharing

Hard parameter sharing极大降低了过拟合的风险,直觉上理解它就是如果我们同时学习很多任务,模型就必须学习到一个可以捕获所有任务特征的表示,从而它过拟合到其中一个任务的概率就大大降低了。

Soft parameter sharing共享方式稍微复杂些,每个模型都会有自己的隐藏层参数,但是任务间的隐藏层参数会加入一些正则化限制使得它们会比较相似,如图所示:

Soft parameter sharing

那么为什么MTL会有用呢,会有这么好效果呢,上文已经提到一些,这里详细列举下原因,也是这篇文章的主题:

  1. Implicit data augmentation
  2. Attention focusing
  3. Eavesdropping
  4. Representation bias
  5. Regularization

对于implicit data augmentation,主要是由于MTL的每个任务都会有自己的噪声分布,仅仅学习任务A的话模型只会集中精力在处理任务A的噪声分布上,而MTL就会想方设法去学习一个普适表示去适应所有的噪声模式从而提升泛化。

对于attention focusing,如果一个任务是非常的noisy或者样本很少,维度很高的情况下,单任务就会很难区分哪些是相关、哪些是不相关的特征,MTL由于添加了其他任务,对这个任务敏感的特征就会被其他任务给共享到,就可以帮助模型区分这些相关和不相关特征,从而辅助模型决策。

对于eavesdropping,主要就是这个任务学到的特征会对其他任务有用,而这个学到的特征可能在其他任务里面很难去学习到。

对于representation bias,MTL可以使模型偏好其他任务也偏好的表示,使得它可以更好地泛化到新的任务。因为理论上MTL在越多的任务上泛化的好,对于未知的任务就越大概率泛化得好,类比来说就是深度学习领域里面样本越多,模型泛化越好。

对于regularization,MTL共享参数本身就是一个正则化模型。

文首提到的文章里面还有很多其他内容,譬如MTL最近的工作、非神经网络模型的MTL等,有兴趣的可以去看看,这里到此为止~

— 2019-01-12 09:09

理解PCA和SVD

PCA(Principal components analysis,主成分分析)和SVD(Singular value decomposition,奇异值分解)从我开始接触机器学习至今一直困扰着我,感觉理解起来超困难,怪我没好好学线性代数。这里简单写写迄今为止对它们的一些理解。

要理解他们,首先要从PCA开始。PCA是啥?第一篇介绍PCA的文章是Hotelling在1933年写的,由卡尔皮尔逊1901年发明,到现在依然应用在很多领域,可见其重要性。简单来说,PCA是一种分析、简化数据集的技术,主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。(维基百科抄的)

还是不好理解,我们看图说话:

我们从图上可以看到PC1和PC2分别是第一主成分和第二主成分(很好理解),所有点在第一主成分上的投影的方差最大,第一主成分确定后,第二主成分与第一主成分垂直并且是第二大投影方差。到这里主成分就讲完了,我们只要理解投影方差最大,然后有一些数学手段推导求出这个向量就行了,具体推导可以参考机器学习圣经《pattern recognition and machine learning》,倒不是很难。还要注意,这个向量就是X^TX的特征向量

巧了不是,我们通过PCA求出的若干个特征向量刚好是SVD求出的右奇异向量。

啥?SVD是啥?看图说话:

任何一个矩阵都可以分解成三个矩阵的乘积,并且满足很多好玩的特性,这里不做赘述,我们只要注意这里V的行向量就是PCA的各个主成分

更详细的阐述见这里:

主要就是协方差矩阵S=\frac{1}{n-1}X^TX的奇异值\lambda_i(主成分的对应奇异值)跟X的奇异值\sigma_i的关系是

    \[\lambda^2_i=(n-1)\lambda_i\]

右奇异矩阵的行向量就是各个主成分
对于左奇异向量我们有

    \[u_i=\frac{1}{\sqrt{n-1}}Xv_i\]

几个比较重要的理解点已经叙述完了,这里给出一篇解析的很到位的关于PCA和SVD的文章供参考:
Refer:https://intoli.com/blog/pca-and-svd/
为了更深入理解,可以看看更多的应用,记得有一篇文章讲述奥黛丽赫本的图片压缩讲的很好,找不到了:(

— 2018-11-10 19:00:00

SVM

===== 写在前面 =====
本文的主旨是让那些数学功底一般的人对SVM(Support Vector Machine)和核函数有个直观的理解, 让他们在项目中可以准确理解参数的含义, 准确调参, 避免不必要的劳动. 如果想深入了解SVM, 建议仔细阅读吴恩达老师的讲义.
===== 超平面 =====
学习SVM的人我想对超平面这个词并不陌生, 超平面是什么? 超平面(hyperplane)的定义是: When the dimension of the linear surface is one less than the dimension of the space, that is, when in \mathbb{R}^n we have an (n-1)-flat, the surface is called a //hyperplane//. 所以对于一维向量空间来说, 点是超平面; 对于二维向量空间来说, 线是超平面; 对于三维向量空间来说, 面是超平面…不要被”平面”这个词所误导了.
===== 支持向量 =====
为什么叫支持向量机? 因为决定超平面位置的那一组向量数学上被称为支持向量. 如下图所示:
支持向量机
在两个分界面\vec{w}^T\vec{x}+b=+1\vec{w}^T\vec{x}+b=-1上的向量即支持向量. 对于线性可分的数据集(可以用线性超平面分隔), SVM所做的事就是寻找\vec{w}^T\vec{x}+b=0使得两个分界面的距离最大. 理解了线性可分的情况, 线性不可分(这里特指包含杂点的不可分情况)可以通过加入松弛变量来求解, 理解起来会简单很多, 这里不做解释.
注: +1和-1是为了数学上计算方便定义的值, 理论上可以为任意值, SVM的求解也可以有无数种定义方式, 具体见讲义.
===== 二次规划 =====
高中我们学习了直线距离公式, 不难看出两个分界面的距离为\frac{2}{||\vec{w}||}. SVM的目标就是在满足能够区分两个类别的情况下最大化这个间隔(最优间隔分类器), 最大化\frac{2}{||\vec{w}||}等价于最小化\frac{1}{2}||\vec{w}||^2, 数学上形式化的定义如下:

(1)   \[\begin{split} min_{w,b}&\quad\frac{1}{2}||\vec{w}||^2\\ s.t&\quad{y^{(i)}}(\vec{w}^T\vec{x}^{(i)}+b)\geq1,i=1,...,m \end{split}\]

这是一个比较简单的二次规划(Quadric Programming)问题, 需要优化的是个二次函数, 满足一些线性约束, 可以用一些QP软件求出, 但是它不能处理线性不可分的情况.
===== 维数灾难 =====
现实生活中真正线性可分的情况很少, 也就是说上述情况很少成立, 所以需要将向量映射到更高维的空间, 使其线性可分. 为啥映射到高维之后就线性可分了呢? 参考关联特征挖掘. 但是高维过后对计算量的影响是巨大的, 尤其是映射到无穷维的向量空间时. 所幸的是我们不用映射到高维后进行计算, 因为我们有kernel trick.
===== 对偶问题 =====
通过一些数学知识(拉格朗日乘子, 对偶问题, KKT等), 我们可以将1式转换成以下对偶问题:

(2)   \[\begin{split} max_{\alpha}&\quad{}W(\alpha)=\sum_{i=1}^m\alpha_i-\frac{1}{2}\sum_{i,j=1}^{m}y^{(i)}y^{(j)}\alpha_i\alpha_j\langle\vec{x}^{(i)},\vec{x}^{(j)}\rangle\\ s.t.&\quad\alpha_i\geq0,i=1,...,m\\ &\quad\sum_{i=1}^m\alpha_iy^{(i)}=0 \end{split}\]

以及:

(3)   \[\begin{split} \vec{w}+b^T\vec{x}&=(\sum_{i=1}^{m}\alpha_iy^{(i)}\vec{x}^{(i)})^T\vec{x}+b\\ &=\sum_{i=1}^{m}\alpha_iy^{(i)}\langle\vec{x}^{(i)},\vec{x}\rangle+b \end{split}\]

从式中发现, 所有的运算都是基于向量内积的. 对于升维过后的内积与升维之前的内积之间的关系, 我们有核函数来定义.
===== 核函数 =====
**研究发现, 计算向量内积时, 一般不需要通过先升维, 再在高维上计算, 而是可以通过核函数直接在低维向量上进行运算, 得出的结果和在高维上运算的结果相同.** 讲义上面有例子分析的很透彻, 这里就不搬过来了, 有兴趣的可以看看. 比较流行的核函数有高斯核和多项式核, **多数情况下核函数需要由自己定义才能达到相当好的效果**.
===== 其他 =====
还有松弛变量以及SVM实现细节上的考虑, 这里不做赘述, 对于理解SVM没有很大影响.
===== 总结 =====
SVM是个很完美的模型, 风靡了很多年, 很多人至今还是认为它是最优的一个机器学习算法, 当然这是仁者见仁智者见智的.

— 2016

机器学习算法的实际应用

===== 前言 =====
Andrew Ng在斯坦福大学教授机器学习算法的时候, 有专门一节课讲授ml-advice, 讲述了我们在将机器学习算法应用到实际过程中应该注意哪些问题, 性能不够好时应该怎么去调试, 让我们少走弯路, 非常的具有指导意义. 同样Deep learning作为一种机器学习算法, 在实际应用过程中也会碰到一些问题, 下面讨论下怎么去将算法落地应用以及碰到问题怎么去有针对性调试解决.
===== 基本流程 =====
对于一个复杂的项目, 机器学习算法的应用一般包括以下几大步:
– 制定衡量指标, 给项目设定目标, 一般准确率召回率用的比较多
– 快速建立基准模型, 衡量相应的性能
– 调试项目, 发现性能瓶颈
– 优化性能瓶颈模块, 快速迭代
以上过程基本上是一个通用的算法落地过程, 第三步比较难, 也是最应该注意的点, 大多数人在框架搭好之后就去调整参数, 殊不知性能不好不是由于算法模型导致的, 浪费大量人力. 所以需要有针对性的进行优化才能很快将项目迭代应用起来.
===== 注意事项 =====
以上只是纲领性陈述, 下面详细列举下可能碰到的问题以及解决方案:
* 如何设定目标, 实际项目中需要根据业务需求来制定, 通俗的说就是达到什么状态可以达到上线标准, 一般来说准确率和召回率比较常用, 有时也要考虑覆盖率, 用户满意度等.
* 对于基准模型, 可以根据最新研究状况来定, 譬如对于机器翻译/物体识别/语音识别都有相应的比较成熟的深度学习模型能够应用.
* 如果训练集上的准确度比较低, 那么很可能是模型的能力不够或者数据集噪声比较多, 对于前向深度神经网络可以适当增加隐层层数和隐藏单元个数; 如果训练集上的准确度很高, 但是测试集的准确度比较低, 并且差很大, 那么可以考虑收集更多的数据(只要你有很高的训练准确率, 通过收集更多的有用数据基本上一定能提升你模型的泛化能力, 需要看收集数据的性价比), 或者通过调节参数检查一下是否过拟合, 绘制曲线是个很不错的方法.
* 对于调节参数, 可以手动可以自动化, 调节的时候需要同时关注训练集合测试集来确定参数往哪个方向调节. 学习率应该是最应该关注的一个参数. 自动化可以通过写一个新的机器学习算法来调节, 不过会引入新的参数, 也比较耗时; 参数比较少时可以通过grid search或者random search来确定参数, 一般来说random search比较高效.
* 模型的调试比较难, 尤其是机器学习算法, 因为它是自适应的, 一个component的错误可以通过其他component的自适应能力给掩盖并一定程度校正. 可视化工作可以帮助调试, 例如可视化机器学习模型, 可视化**模型最有信心的badcase**, 在分类模型中就是概率很高的badcase; 分析训练集和测试集准确率是否符合预期; 用小数据集来尝试; **监控隐层输出和梯度**, 尤其是进入非线性函数之前.
===== 结束语 =====
以上几条不是泛泛而谈, 实际项目中需要时时刻刻牢记, 可以帮你少走很多弯路, 更可以给你的下一步指明方向.

— 2016/08/06 11:08