Vintage NLP for Work
Affect-LM: A Neural Language Model for Customizable Affective Text Generation https://arxiv.org/abs/1704.06851 Sayan Ghosh, Mathieu Chollet, Eugene Laksana, Louis-Philippe Morency, Stefan Scherer
这篇工作被 ACL-2017 录用。本文试图将情感加入语言模型中,以生成带情感的句子。这种控制生成目标的具体属性是一个很常见的需求。
他们考虑将情绪属性(哀伤、发怒、焦虑、负面情感、正面情感)和情感强度分开,作为一个属性向量和一个权重嵌入 LSTM 中。为了区别于情感(sentiment),这里用了情绪(emotion)这个词,从哲学上这些字眼虽然很难说清,但是具体作“情感分析”的任务讲时只是指带积极或消极的观点(例如索黑、任豚)的句子。
情绪的词典从 LIWC(Pennebaker et al. 2001) 获得,已生成的上下文中出现了对应词就推测其具备相应情感,从而控制后续 LSTM 的生成。
他们考虑将情绪属性(哀伤、发怒、焦虑、负面情感、正面情感)和情感强度分开,作为一个属性向量和一个权重嵌入 LSTM 中。为了区别于情感(sentiment),这里用了情绪(emotion)这个词,从哲学上这些字眼虽然很难说清,但是具体作“情感分析”的任务讲时只是指带积极或消极的观点(例如索黑、任豚)的句子。
情绪的词典从 LIWC(Pennebaker et al. 2001) 获得,已生成的上下文中出现了对应词就推测其具备相应情感,从而控制后续 LSTM 的生成。
Vintage NLP for Work
这篇工作被 ACL-2017 录用。本文试图将情感加入语言模型中,以生成带情感的句子。这种控制生成目标的具体属性是一个很常见的需求。 他们考虑将情绪属性(哀伤、发怒、焦虑、负面情感、正面情感)和情感强度分开,作为一个属性向量和一个权重嵌入 LSTM 中。为了区别于情感(sentiment),这里用了情绪(emotion)这个词,从哲学上这些字眼虽然很难说清,但是具体作“情感分析”的任务讲时只是指带积极或消极的观点(例如索黑、任豚)的句子。 情绪的词典从 LIWC(Pennebaker et al. 2001)…
具体公式长这样,beta 是情感权重,e 是具体想要控制的情绪向量 (one-hot)
Vintage NLP for Work
这篇工作被 ACL-2017 录用。本文试图将情感加入语言模型中,以生成带情感的句子。这种控制生成目标的具体属性是一个很常见的需求。 他们考虑将情绪属性(哀伤、发怒、焦虑、负面情感、正面情感)和情感强度分开,作为一个属性向量和一个权重嵌入 LSTM 中。为了区别于情感(sentiment),这里用了情绪(emotion)这个词,从哲学上这些字眼虽然很难说清,但是具体作“情感分析”的任务讲时只是指带积极或消极的观点(例如索黑、任豚)的句子。 情绪的词典从 LIWC(Pennebaker et al. 2001)…
直观效果如图,当预设不同情绪时,生成的句子有明显变化。
Deep API Learning
https://arxiv.org/abs/1605.08535
Xiaodong Gu, Hongyu Zhang, Dongmei Zhang, Sunghun Kim
https://arxiv.org/abs/1605.08535
Xiaodong Gu, Hongyu Zhang, Dongmei Zhang, Sunghun Kim
Vintage NLP for Work
Deep API Learning https://arxiv.org/abs/1605.08535 Xiaodong Gu, Hongyu Zhang, Dongmei Zhang, Sunghun Kim
劳动节快乐!
本文发表在似乎是 ACM 的一个软件工程相关的会议 FSE 2016 上,管理狗对这个不太熟。
他们做的任务是输入一个自然语言描述的句子,输出对应的 API 调用序列。
这里 API 指的是比较基础的 JDK 中的 API,并不是指 HTTP 封装好的服务接口,但应该可以扩展。
他们的解决方法是直接建模句子和 API 序列之间的关系,因此本质是一个生成模型,并不是在现成的代码库里搜索,而是从训练集中学习 API 和词语义的共现关系。
例如输入句子为 "parse XML files",输出序列为
本文发表在似乎是 ACM 的一个软件工程相关的会议 FSE 2016 上,管理狗对这个不太熟。
他们做的任务是输入一个自然语言描述的句子,输出对应的 API 调用序列。
这里 API 指的是比较基础的 JDK 中的 API,并不是指 HTTP 封装好的服务接口,但应该可以扩展。
他们的解决方法是直接建模句子和 API 序列之间的关系,因此本质是一个生成模型,并不是在现成的代码库里搜索,而是从训练集中学习 API 和词语义的共现关系。
例如输入句子为 "parse XML files",输出序列为
DocumentBuilderFactory.newInstance
DocumentBuilderFactory.newDocumentBuilder
DocumentBuilder.parse
Vintage NLP for Work
劳动节快乐! 本文发表在似乎是 ACM 的一个软件工程相关的会议 FSE 2016 上,管理狗对这个不太熟。 他们做的任务是输入一个自然语言描述的句子,输出对应的 API 调用序列。 这里 API 指的是比较基础的 JDK 中的 API,并不是指 HTTP 封装好的服务接口,但应该可以扩展。 他们的解决方法是直接建模句子和 API 序列之间的关系,因此本质是一个生成模型,并不是在现成的代码库里搜索,而是从训练集中学习 API 和词语义的共现关系。 例如输入句子为 "parse XML files",输出序列为…
模型是基本的 RNN Encoder-Decoder 框架。输入为句子,用 attention 考虑了句子中的词对生成序列的影响。另一方面,他们把 API 的 IDF 值加入到目标函数中作为惩罚项,可以避免把例如 Logger.log 这类对用户 query 没什么用的 API 生成出来。
Vintage NLP for Work
模型是基本的 RNN Encoder-Decoder 框架。输入为句子,用 attention 考虑了句子中的词对生成序列的影响。另一方面,他们把 API 的 IDF 值加入到目标函数中作为惩罚项,可以避免把例如 Logger.log 这类对用户 query 没什么用的 API 生成出来。
现在这类模型没什么新鲜的,但是本文工作最重要的应该是数据集构建了。
他们从 GitHub 上爬了1星以上的 Java 代码库,总数超过40万。
他们从 GitHub 上爬了1星以上的 Java 代码库,总数超过40万。
Vintage NLP for Work
现在这类模型没什么新鲜的,但是本文工作最重要的应该是数据集构建了。 他们从 GitHub 上爬了1星以上的 Java 代码库,总数超过40万。
首先用 Eclipse JDT 去 parse 代码获得 AST,然后用一些简单规则抽取 API 序列,例如:
- 有构造函数则将其 C.new 的调用加入序列
- 对方法调用则将 C.method 的调用加入序列
- o1.m1(o2.m2(o3.m3())) 这类嵌套调用则从里到外将每个方法加入序列
- 条件语句则将条件和所有的分支分别作为不同样本加入序列
- 循环语句则将循环条件和执行语句加入序列
另一方面,他们抽取了所有的 Java 方法注释的第一句话作为文档说明(Javadoc 推荐实践)。
此外还丢弃了所有没有 javadoc 的方法,并忽略包含 "TODO"、"NOTE"、"Test" 之类的注释。
- 有构造函数则将其 C.new 的调用加入序列
- 对方法调用则将 C.method 的调用加入序列
- o1.m1(o2.m2(o3.m3())) 这类嵌套调用则从里到外将每个方法加入序列
- 条件语句则将条件和所有的分支分别作为不同样本加入序列
- 循环语句则将循环条件和执行语句加入序列
另一方面,他们抽取了所有的 Java 方法注释的第一句话作为文档说明(Javadoc 推荐实践)。
此外还丢弃了所有没有 javadoc 的方法,并忽略包含 "TODO"、"NOTE"、"Test" 之类的注释。
Vintage NLP for Work
首先用 Eclipse JDT 去 parse 代码获得 AST,然后用一些简单规则抽取 API 序列,例如: - 有构造函数则将其 C.new 的调用加入序列 - 对方法调用则将 C.method 的调用加入序列 - o1.m1(o2.m2(o3.m3())) 这类嵌套调用则从里到外将每个方法加入序列 - 条件语句则将条件和所有的分支分别作为不同样本加入序列 - 循环语句则将循环条件和执行语句加入序列 另一方面,他们抽取了所有的 Java 方法注释的第一句话作为文档说明(Javadoc 推荐实践)。 此外还丢弃了所有没有…
BLEU 值指标结果,相比以前非深度模型而言相当的高
Vintage NLP for Work
人工评价相关性以及生成句子示例
其他实验也挺多的这里就不说了。
作者简单分析了一下他们方法有效的原因(这点也是很多深度模型所欠缺的):
词向量相比 one-hot 能更好地概括语义、
用序列建模而不是词袋模型可以更好地区分如 "convert int to string" 和 "convert string to int" 等不同的需求、
用生成模型而不是具体搜索可以使得生成的东西更常见而不是具体在某个项目中的奇技淫巧。
作者简单分析了一下他们方法有效的原因(这点也是很多深度模型所欠缺的):
词向量相比 one-hot 能更好地概括语义、
用序列建模而不是词袋模型可以更好地区分如 "convert int to string" 和 "convert string to int" 等不同的需求、
用生成模型而不是具体搜索可以使得生成的东西更常见而不是具体在某个项目中的奇技淫巧。
https://medium.com/zendesk-engineering/how-zendesk-serves-tensorflow-models-in-production-751ee22f0f4b
把基于 TensorFlow 的模型用到实际服务中时如何解决常见的需求:低延时、水平扩展、A/B测试、模型更新等。Zendesk 介绍了自己这方面的一些工程实践。 #practice
把基于 TensorFlow 的模型用到实际服务中时如何解决常见的需求:低延时、水平扩展、A/B测试、模型更新等。Zendesk 介绍了自己这方面的一些工程实践。 #practice
Generating Sentences From a Continuous Spaces
https://aclweb.org/anthology/K/K16/K16-1002.pdf
Bowman and Vilnis, 2016
https://aclweb.org/anthology/K/K16/K16-1002.pdf
Bowman and Vilnis, 2016
Vintage NLP for Work
Generating Sentences From a Continuous Spaces https://aclweb.org/anthology/K/K16/K16-1002.pdf Bowman and Vilnis, 2016
本文是比较早将 VAE 运用到句子生成中的一篇工作。一般生成器(如RNN)会从一个向量表示生成一个具体的句子,但是若逐渐改变这个隐表示,生成的句子变化却很大,甚至不合语法(如上图的几个英语句子的变化情况)。因此我们想让这个表示能更好地影响语言模型,使得最终效果能逐渐平滑。此时就可以认为这个隐向量具备了一些特征,不再是无序的了。
这也是为什么要用 VAE 的原因。
这也是为什么要用 VAE 的原因。
Vintage NLP for Work
本文是比较早将 VAE 运用到句子生成中的一篇工作。一般生成器(如RNN)会从一个向量表示生成一个具体的句子,但是若逐渐改变这个隐表示,生成的句子变化却很大,甚至不合语法(如上图的几个英语句子的变化情况)。因此我们想让这个表示能更好地影响语言模型,使得最终效果能逐渐平滑。此时就可以认为这个隐向量具备了一些特征,不再是无序的了。 这也是为什么要用 VAE 的原因。
本文的主要贡献并不是模型新颖性,模型如图,比较简单。两个 LSTM 分别充当 encoder decoder,由于 z 的先验假设为多元高斯,因此这里用了两个线性变换将其分别转化为高斯的两个参数(均值、方差)。
Vintage NLP for Work
本文的主要贡献并不是模型新颖性,模型如图,比较简单。两个 LSTM 分别充当 encoder decoder,由于 z 的先验假设为多元高斯,因此这里用了两个线性变换将其分别转化为高斯的两个参数(均值、方差)。
本文亮点是 VAE 的效果验证和训练方法。训练主要问题是 decoder 太敏感,会很快让 KL 散度降为0,这样表示本身就完全失去了预期的效果,退化为一个普通的 RNN 语言模型了。
Vintage NLP for Work
本文亮点是 VAE 的效果验证和训练方法。训练主要问题是 decoder 太敏感,会很快让 KL 散度降为0,这样表示本身就完全失去了预期的效果,退化为一个普通的 RNN 语言模型了。
本文提出了两种方法处理这个问题:
- KL 代价退火:给 loss 中的 KL 项加一个权重,一开始为0,训练进行过程中逐渐增大到1
- Word Dropout:设定一个比例,将生成的词替换为 UNK,这样强迫生成器更多地依赖隐变量,弱化 decoder 的能力
这两点对后面的工作影响很大,基本都有借鉴。
- KL 代价退火:给 loss 中的 KL 项加一个权重,一开始为0,训练进行过程中逐渐增大到1
- Word Dropout:设定一个比例,将生成的词替换为 UNK,这样强迫生成器更多地依赖隐变量,弱化 decoder 的能力
这两点对后面的工作影响很大,基本都有借鉴。
A Hybrid Convolutional Variational Autoencoder for Text Generation
https://arxiv.org/abs/1702.02390
Stanislau Semeniuta, Aliaksei Severyn, Erhardt Barth
https://arxiv.org/abs/1702.02390
Stanislau Semeniuta, Aliaksei Severyn, Erhardt Barth
Vintage NLP for Work
A Hybrid Convolutional Variational Autoencoder for Text Generation https://arxiv.org/abs/1702.02390 Stanislau Semeniuta, Aliaksei Severyn, Erhardt Barth
相比经典的 (Bowman and Vilnis, 2016) 用 LSTM 来构建 encoder 和 decoder,本文尝试用卷积(convolutional)和逆卷积(deconvolutional)层来分别做 encoder 和 decoder。
这样做主要是基于两点,一个是并行化程度高有很高效的 GPU 实现,另一个是前馈网络比循环网络要更容易优化。
为了解决前馈网络建模句子上下文联系的不足,他们在最后逆卷积之后又补上了一个 LSTM decoder,整体上形成三层结构。
实验结果证明他们的办法比 (Bowman and Vilnis, 2016) 的模型能将更长的句子编码进 z 中。
这样做主要是基于两点,一个是并行化程度高有很高效的 GPU 实现,另一个是前馈网络比循环网络要更容易优化。
为了解决前馈网络建模句子上下文联系的不足,他们在最后逆卷积之后又补上了一个 LSTM decoder,整体上形成三层结构。
实验结果证明他们的办法比 (Bowman and Vilnis, 2016) 的模型能将更长的句子编码进 z 中。
Vintage NLP for Work
相比经典的 (Bowman and Vilnis, 2016) 用 LSTM 来构建 encoder 和 decoder,本文尝试用卷积(convolutional)和逆卷积(deconvolutional)层来分别做 encoder 和 decoder。 这样做主要是基于两点,一个是并行化程度高有很高效的 GPU 实现,另一个是前馈网络比循环网络要更容易优化。 为了解决前馈网络建模句子上下文联系的不足,他们在最后逆卷积之后又补上了一个 LSTM decoder,整体上形成三层结构。 实验结果证明他们的办法比…
(Bowman and Vilnis, 2016) 提到关于 VAE 优化的困难在他们加上了第三层之后一样存在,同时解决办法也可以照搬过来。但是之前的 Word Dropout 方法让收敛很慢,因此他们在逆卷积层的输出上也加入了一个 loss。