一枚NLPer小菜鸡

rewards

Action space: 动作的选择空间。

Policy:根据当前的状态给出action概率分布。

Traj:轨迹,状态和动作序列。episode rollout
{s_0,a_0,s1,a1,sn,an}

return: rewards累积和。

期望:每个可能的结果和对应概率乘积之和。

强化学习目标:

目标:训练一个神经网络 $\pi$,在所有状态S下,给出相应的action,得到return的期望最大。

或者:训练一个神经网络 $\pi$,在所有trajetory中,得到的return最大。

梯度上升⚽️期望最大。

上述为:policy gradient

on policy采集数据,训练神经网络。
off policy:先采集完数据,再训练神经网络。

actor critor:
增加base line 使得在不同 局势下都可以得到优化,
好的局势时,朝着好的方向进行,但可以区分哪些更好,哪些相对较好。

Action-Value Function
$Rt^n$ 每次都是一次随机采样,方差很大,训练不稳定。
$Q
\theta(s, a)$ 在state $s$ 下,做出Action a,期望的回报。动作价值函数。
State-Value Function
$V_\theta(s)$ 在state $s$ 下,期望的回报。状态价值函数。

Advantage Function
$A\theta(s, a)=Q\theta(s, a)-V_\theta(s)$ 在state s下,做出Action a,比其他动作能带来多少优势。

动作状态函数

价值状态函数

下面第一个是seigema 表达是
第二个GAE优势函数表达式
第三个是:策略梯度优化目标函数

ppo算法:

在Task-oriented-Dialog任务中,[1]提到任务导向型端到端对话系统主要的面临的问题是:第一个是如何有效结合外部的知识到模型的学习框架之中,第二个是如何准确的捕获历史对话的语义信息,通过KG的方式,可以获得更充分的信息知识,比如说多跳的知识信息的查询,这相比较于传统的关系型数据库的查找有更大的优势。

QA任务可以认为是一种单轮对话模式的对话系统,在QA任务中运用知识为对话提供知识的方式有多种多样,在[2]中提到了关于如何结合KG做自然流畅的QA问题,主要运用了seq-seq模型和copy机制,和对相关topic实体的retrival。[3]中将自然语言转换为相应的语义解析器,主要提出了一种结合memory network机制的RNN based的转换网络,其主要贡献为通过memory network优化了在经常遇到省略现象的交互中找到指代实体。[4]遍历符号知识图谱以学习对话中的上下文转换,并使用注意力知识图谱路径解码器预测实体从而响应用户相关信息
通过知识图谱结的构化知识提供了信息丰富的常识观察并充当关系归纳偏差,这促进了最近关于多跳推理的符号空间和语义空间之间的常识知识融合的研究[5],

在开放域对话系统中,通过知识图谱中的知识增强,可以使得对话系统的话语中的知识符合世界知识,防止出现存储在模型参数中错误知识的生成[6].[7]进一步通过外部知识完成预训练模型的工作,通过引入知识信息增强对话的真实性。

另外,通过对话系统结合知识图谱完成对话推荐也是一个十分有趣的研究方向[8]

[1]GraphDialog: Integrating Graph Knowledge into End-to-End Task-Oriented Dialogue Systems

[2]Generating natural answers by incorporating copying and retrieving mechanisms in sequence-to-sequence learning

[3]Dialog-to-Action: Conversational Question Answering Over a Large-Scale Knowledge Base

[4]OpenDialKG: Explainable Conversational Reasoning with Attention-based Walks over Knowledge Graphs

[5]Commonsense for generative multi-hop question answering task

[6]Neural generative question answering

[7]PLATO: Pre-trained Dialogue Generation Model with Discrete Latent Variable

[8]Towards Knowledge-Based Recommender Dialog System

之前实习的时候做过一些语法推导(Grammar Induction)方面的工作,当时用的方法主要基于N-gram的一些推导,虽然工作量大,但是基本上属于baseline的方法,最近空下来,打算对这部分内容进行深入的研究和学习。

阅读全文 »

这两天读了一些(两篇..)关于Parameter Efficient的文章,结构并不复杂,但是感觉还是有些内容可以分享。

什么是参数高效的迁移学习呢?

在自然语言处理的任务中,目前各个任务中常用的方法普遍基于Transformer模型,更具体来说,基于以Transformer的backbone模型的大规模预训练模型,以此为基础在各种任务上进行fine-tuning。通常情况下,
会对所有的模型参数进行微调,当然,通过这样的方式,可以更容易使得模型达到比较好的效果。因此也是大多数工作所进行的方式。

但是呢,这就会衍生出一个问题,首先,训练和部署效率的问题,先说训练,对于全局模型进行微调势必会消耗大量算力以及有一点点费电,那当然也可以通过frozen预训练模型在下有任务微调,这就和今天的主题有些相似了。另外呢,如果有很多很多的任务,你对每一个任务都进行fine-tuning,然后部署保存模型,对于现在动辄billion级别的模型参数来说,比如说你一个模型10GB,那你有100个任务,则需要1TB的存储量。

这时候,如果我们可以插入一小部分网络结构并且只对这一小部分进行微调就能达到一个比较好的效果,岂不美哉。

因此关于这部分的内容就应运而生。

阅读全文 »

序言

自 Transformer 模型的文章《Attention is all you need》这篇经典发表的时刻,整个自然语言处理界发生了天翻地覆的变化,强大的注意力机制使得模型能够摆脱RNN模型的长时依赖的问题,且在各种NLP下游任务中,效果吊打RNN系列模型。随后经典名作GPT,BERT这些预训练模型的paper相继发表,从此NLP进入预训练时代。由于其对基础的语意句法等nlp的特征超强的捕获能力,基于Transformer系列的backbone预训练模型在下游任务微调成一种常用的方法。

虽然每年有大量的前沿研究基于Bert这样的模型,但是很多文章—-表面是对模型进行了创新获得了不错的效果,究其本质,无非是扩大了模型的参数量,提高训练数据的质量和数量。因此,取得了更为理想的效果。关于为什么模型的效果好,以及每一层的神经网络到底是取得了如何的效果则没有系统的阐释。今天读到了一篇《A Primer in BERTology: What We Know About How BERTWorks》发表于Transactions of the Association for Computational Linguistics。这篇文章对于bert模型的一些细节进行了系统的论述,很全面,因此,读了一下,把它分享给大家。

动机

众所周知,BERT已经在nlp领域大杀四方,但是对于“why it works well”相对来说没有那么多的研究。如此一来,想要更进一步做出更加solid的研究,需要对该模型有更多的了解。 相比较一些经典的backbone,比如说卷积神经网络(CNN),在感性上的动机则没有特别明显。我们希望对其中的一些结构进行分析,使得模型中具体所做的事情更容易被人们所认识,但是,对于模型过于大的尺寸所造成的预训练不好做(大部分研究人员没有超多的显卡,以及预训练所耗费的经费十分多)且想要做消融实验并不容易。因此对于近些年来对解释bert的文章做一个综述,方便大家对于该模型的认识。

阅读全文 »

batch版本的条件随机场

在上一篇文章中我们按照了 pytorch的官方教程复现了 简单版本的 条件随机场。基本了解了其中的代码实现。但是我们可以看到上一篇中的 crf需要反复的条件循环,同时也没有支持批处理的操作,如果实际应用的话,速度应该会慢很多,因此,在这里,我们实现了Batch版本的条件随机场。to be honest, batch版本相比较 傻瓜版本的实现有一丢丢的复杂,尤其是需要考虑大量的矩阵并行的操作,十分伤脑筋。还好,我参考了batch lstm+crf代码并且认真的剖析其中的细节后,基本弄清了其中的实现细节。如果你对 这部分代码感兴趣,可以参考我下面的代码跑起来学一学。在这部分代码中,一些核心地方给出了注释,但是可能仍然不够清晰,希望你可以自己画画图搞清楚这些细节。

阅读全文 »

CRF 代码实现

最近没啥事情,想把CRF相关的内容再捋一捋,因此研究了Pytoch的CRF实现,代码如下展示,之后将会研究如何做batch版本的CRF。

关于CRF的实现,表面上和HMM模型基本一致,从我的角度来看,因为其观测矩阵的实现由模型给出,即 $P(Y|X)$,因此其展示的是判别模型。所以才认为其是CRF模型,
如果变成隐马尔可夫模型,需要建模$P(Y,X)$, 十分有趣,不同观测矩阵的给出方式决定了模型的类型。

阅读全文 »

k-means算法

k-means作为基本的无监督机器学习算法,在一些面试场景下经常会被拉起来让做手动实现,算法本身其实不难,但在面试场景下复现的准确且简洁则十分重要,因此,本篇博文实现了k-means基本算法,希望大家都可以动手自己实现一遍以保证在需要手写的时候能够快速完成。关于k-means算法的基本原理,我相信大家都应该十分的清楚,因此在这个不多展开介绍,不懂的同学请自行百度或者Google。

阅读全文 »

什么是 Autograd?

Autograd是反向自动微分系统。从概念上讲,autograd 记录一个图结构,记录执行操作时创建数据的所有操作,一个有向无环图,其叶子是输入张量,根是输出张量。通过从根到叶跟踪此图,可以使用链式法则自动计算梯度。

阅读全文 »

1
%matplotlib inline

Sequence-to-Sequence Modeling with nn.Transformer and TorchText

This is a tutorial on how to train a sequence-to-sequence model
that uses the
nn.Transformer <https://pytorch.org/docs/master/nn.html?highlight=nn%20transformer#torch.nn.Transformer> module.
PyTorch 1.2 release includes a standard transformer module based on the
paper Attention is All You Need <https://arxiv.org/pdf/1706.03762.pdf>
The transformer model
has been proved to be superior in quality for many sequence-to-sequence
problems while being more parallelizable. The nn.Transformer module
relies entirely on an attention mechanism (another module recently
implemented as
nn.MultiheadAttention <https://pytorch.org/docs/master/nn.html?highlight=multiheadattention#torch.nn.MultiheadAttention>)
to draw global dependencies between input and output. The nn.Transformer module is now highly modularized such that a single component (like nn.TransformerEncoder <https://pytorch.org/docs/master/nn.html?highlight=nn%20transformerencoder#torch.nn.TransformerEncoder>in this tutorial) can be easily adapted/composed.

阅读全文 »