├── 2019-10-14.md ├── 2019-10-21.md ├── 2019-10-28.md ├── 2019-11-04.md ├── 2019-11-11.md ├── 2019-11-18.md ├── 2019-12-16.md ├── 2019-12-2.md ├── 2020-01-06.md ├── 2020-01-13.md ├── 2020-09-21.md ├── 2020-10-08.md ├── 2020-10-15.md ├── 2020-10-22.md ├── 2020-10-29.md ├── 2020-11-12.md ├── 2020-11-26.md ├── 2020-12-02.md ├── 2020-12-10.md ├── 2020-12-16.md ├── 2021-01-07.md ├── 2021-04-06.md ├── 2021-04-13.md ├── 2021-04-20.md ├── 2021-05-11.md ├── 2021-05-27.md ├── 2021-06-03.md ├── 2021-06-17.md ├── 2021-06-24.md ├── 2021-07-01.md ├── LICENSE └── README.md /2019-10-14.md: -------------------------------------------------------------------------------- 1 | 讨论 2019-10-14 2 | = 3 | 4 | # 机器翻译 5 | 机器翻译目标是把源语言的文本翻译为目标语言 6 | ## 问题定义 7 | - $P(target|source)$ 定义为宽泛的条件概率模型 8 | - $P(y_t|y_{t<1},z)$ contextual language model 条件语言模型(上下文相关语言模型),其中 $z$ 可以为一个向量(vanilla seq2seq)或一个序列(attention-based) 9 | - 非概率模型,通常为部分使用概率模型,同时结合规则或其他模型,不能显示计算结果的概率 10 | 11 | ### 语言模型之前的时代 12 | 很多传统机器翻译方法不把问题转化成一个语言模型问题,但其中会考虑语言的流畅度。例如各种匹配模型,最为基本的字典翻译(字,单词级别),词组翻译(phrase-based)。词组翻译模型需要同时考虑词组的划分问题和翻译的质量问题,已经可以胜任很多结构相似的语言间的翻译。 13 | ### 语言模型与神经网络 14 | 神经网络在语言模型取得很大进展后(比N-gram统计有大幅提高),主流工作把机器翻译问题转化为条件语言模型(或称上下文相关语言模型)。即把源语言作为条件,在目标语言中利用语言模型来生成文本,这类方法初期将源语言先转换为单一向量表示,并且大多要考虑生成顺序的影响。之后更多地将源语言作为序列并使用attention机制。在神经网络以及语言模型的帮助下,机器翻译的流畅度大大提高,但同时也产生了新的问题,词级别的翻译不如匹配模型,同时饱受OOV(out-of-vocabulary)问题的困扰。后期发展出众多character model,word embedding,copy mechanism,sub-word model,才使得这一问题得以缓解。 15 | ### 推断与自回归 (略) 16 | 17 | ## 数据 18 | 常用数据集有WMT系列,IWSLT系列,中文还有NIST系列。翻译数据集众多,场景繁琐,同一系列的数据集在预处理,后处理,评测方法等方面也有不同。翻译数据的基本格式就是(源语言,目标语言)得句子对,也称平行语料。 19 | ![](https://i.imgur.com/mObL0YZ.png) 20 | 21 | ### 规模 22 | ![](https://i.imgur.com/fe0qIGl.png) 23 | ![](https://i.imgur.com/Eypvhrh.png) 24 | 25 | ### 来源 26 | 语料的来源,标注方法,质量都会对结果产生巨大影响,翻译语料的来源众多,有新闻稿,书籍,刊物,维基百科,网页,非正式文本等。标注方法又分为人工标注和利用本地化信息两种方法,本地化信息指网页,产品本身含有的本地化信息,例如很多网站有多种语言的版本,显然这种方式的语料质量很差,很多都不是句子级别对应的,并且信息增减都很不确定。另一方面,有些语料的来源十分特殊,比如multi30K数据集的所有文字来源于COCO数据集,这就导致所有句子都是陈述句,并且结构高度相似。 27 | 28 | ### 数据增强与单语言语料(略) 29 | 30 | ## 评测 31 | ### N-gram based 32 | 以N-gram为基础的评测方法中最具代表性的是BLEU和ROUGE,其中BLEU score 考察N-gram的precision,ROUGE则关注F1-score。METEOR不是严格的N-gram,但弥补了一些BLEU的缺点,例如考虑语序,动态分词等。 33 | 34 | ### 评测方法 35 | 评测的算法比较复杂,同样是BLEU score,用不同的分词方法,字符集,OOV的处理都会产生影响,不同语言间也有差异,比如不同的编码的标点符号都有区别,对非文本的处理(HTML标签等)。在实验过程要首先确认目标数据集的评测方法。 36 | 37 | # 关于研究的一些建议 38 | ## 灵感哪里来 39 | - **温故知新** 很多概念几年,几十年前就有人考虑过,从概念到实际需要多方面条件,过去做不出的也许现在就可以了。 40 | - **移花接木** 隔行如隔山,其他领域的知识,甚至是基础知识都可能带来很大的帮助 41 | - **望表知里** 多观察数据,发现其中的规律。“人工”智能,帮助机器发现一些数据规律也是十分有用的。 42 | - **生活实践** 43 | 44 | ## 不要为论点找论据 45 | 不要先有一个结论,然后想方设法做实验,找到证据来证明这个论点。 46 | - **贝叶斯公式** 先验概率是很有指导意义的,不要有太多侥幸心理,虽然很多科学发现来源于失败的实验或意外,但总体而言,尽量不要把小概率事件作为实验的目标。 47 | - **辩证法** 实验之前,考虑导致成功的因素有哪些,为什么成功,同时也要考虑导致失败的因素有哪些,为什么失败 48 | - **逻辑知识** 同一个实验结果是否有其他解释,控制变量,充分和必要条件,三段论等 49 | 50 | ## 好习惯 51 | - 良好的实验记录,由于实验需要进行非常多次(上百,上千),实验记录是非常必要的,并且实验记录可以很琐碎,最后阅读实验记录也是程序。 52 | - 预分析实验结果,在实验结果出来之前,先为每一种可能结果做预案,比如出现哪种结果说明什么,需要进一步进行什么实验。 53 | - 关注实验过程,例如训练误差,校验集的变化,测试结果的变化,乃至各种中间变量,统计量的变化都值得关注,一个实验结果可能是偶然,但整个过程,各种变量都一致的偶然是十分罕见的,这也是一个检验程序正确性的好方法。 54 | -------------------------------------------------------------------------------- /2019-10-21.md: -------------------------------------------------------------------------------- 1 | 讨论 2019-10-21 2 | = 3 | 4 | # Seq2Seq 5 | - ## seq2seq 模型是如何理解翻译问题的 6 | - ## seq2seq 模型是如何解决翻译问题的 7 | - ## seq2seq 模型的视角有何特点(略,seq与struct的联系的区别,text seq与action seq的关系) 8 | 9 | ## “按需说话” 10 | seq2seq模型把翻译问题考虑为一个按照一定需求或条件进行文本生成的问题,同时还限定了输入的条件和输出的目标都是以序列为载体的。以序列为载体阐明了seq2seq模型对文本结构的态度,尽管有很多工作将文本中的结构信息引入seq2seq模型,但最基础的seq2seq模型只考虑了文本中最基本的结构信息,即顺序信息,或者说把文本当作一个数据链(linear-chain)。 11 | 12 | ## encoder-decoder模型 13 | 早期的seq2seq模型其实是一个两段式的模型,是由seq2vector和vector2seq两部分组成的,这两部分功能分别由encoder和decoder两个模块完成。整个流程如下图所示 14 | ![](https://i.imgur.com/Yb5Iv2k.gif) 15 | 16 | ### RNN-based 17 | 18 | $\text{src}=\text{Embedding}(w_1,w_2,w_3,\cdots,w_N)$ 19 | $H^e = \text{LSTM}(\text{src})$ 20 | $z = \frac{1}{N} \sum_i h^e_i$ 21 | $h^d_0=\mathbf{0}$ 22 | $h^d_t = \text{LSTM}([\text{tgt}_t;z],h^d_{t-1})$ 23 | $y_t=\text{softmax}(\text{MLP}(h^d_t)$) 24 | 25 | 26 | 27 | # Seq2Seq with Attention 28 | - ## 为什么要在seq2seq模型中引入attention 29 | - ## attention解决了什么问题,引发了什么新问题 30 | 31 | ## seq2seq遇到的问题 32 | seq2seq模型在提出后不久就暴露出了很多实验上的问题,比如decoder的表现往往是虎头蛇尾(开始很好,后续词的生成质量越来越差),翻译出的句子很多时候过于偏向高频词的堆叠,流畅但不达意。基于这些观察到的问题,一部分研究认为只用一个向量来表示整个源语言的输入杯水车薪,应该让模型更好的访问源语言句子的细节而不是一个高度概括的向量。 33 | 34 | ## Attention的物理含义 35 | Attention机制在机器翻译领域取得了很大的成功,所以也有大量的研究者对Attention机制的原理提出了解释。在此只罗列几种简单的,一是动态选择说,这种假说对Attention过程提出了两种观点,把Attention Score类比为相似度,把Softmax函数类比为argmax的选择。第二种假说是二元关系说,主要观点与Relation Networks一致,认为Attention建模了pair-wise relations。 36 | 37 | 38 | ![](https://i.imgur.com/uymmAW1.gif) 39 | 40 | ### RNN-based 41 | 42 | $\text{src}=\text{Embedding}(w_1,w_2,w_3,\cdots,w_N)$ 43 | $H^e = \text{LSTM}(\text{src})$ 44 | $h^d_0=\mathbf{0}$ 45 | $z_t = \text{LSTM}([\text{tgt}_t;h^d_{t-1}], z_{t-1})$ 46 | $h^d_t = \text{Attention}(z_t, H^e)$ 47 | $y_t=\text{softmax}(\text{MLP}(h^d_t)$) 48 | 49 | ### Transformer 50 | 51 | $\text{src}=\text{Embedding}(w_1,w_2,w_3,\cdots,w_N)$ 52 | $\text{pe} = \text{Embedding}(1,2,3,\cdots,N)$ 53 | $H^e = \text{SubLayer}(\text{src}+\text{pe},\text{src}+\text{pe})$ 54 | $\text{SubLayer}(x,y)=\text{LayerNorm}(z+\text{FFN}(z))$ 55 | $z = \text{LayerNorm}(x+\text{Attention}(x,y))$ 56 | $h^d_t = \text{SubLayer}(\text{SubLayer}(\text{tgt}_t,h^d_{ NP VP 26 | VP -> V NP | V NP PP 27 | PP -> P NP 28 | V -> "saw" | "ate" | "walked" 29 | NP -> "John" | "Mary" | "Bob" | Det N | Det N PP 30 | Det -> "a" | "an" | "the" | "my" 31 | N -> "man" | "dog" | "cat" | "telescope" | "park" 32 | P -> "in" | "on" | "by" | "with" 33 | ``` 34 | 每一条叫产生式 35 | 36 | ### Chomsky normal form (CNF) 37 | ``` 38 | A → BC, or 39 | A → a, or 40 | S → ε, 41 | ``` 42 | 任何CFG都能转化到CNF形式 43 | 44 | ### 概率上下文无关语法 (PCFG) 45 | ``` 46 | S -> NP VP (1.0) 47 | VP -> V NP (0.6) | V NP PP (0.4) 48 | ``` 49 | ### 上下文无关 50 | 顾名思义,上下无关就是每一元素扩展时不需要率其他元素,所以下列规则就是上下文有关 51 | ``` 52 | VP NP -> "go home" 53 | ``` 54 | 55 | ### 语言本身存在歧义性 56 | ![](https://i.imgur.com/5I4NBFU.png) 57 | ![](https://i.imgur.com/vCZJNkr.png) 58 | 59 | ### 表示结构的方法 60 | 61 | ![](https://i.imgur.com/vyCHTSE.png) 62 | ![](https://i.imgur.com/lRwkCfW.png) 63 | 64 | 65 | ![](https://i.imgur.com/hyOtw1k.png) 66 | 67 | 68 | ### Chomsky hierarchy 69 | 70 | from wiki https://en.wikipedia.org/wiki/Chomsky_hierarchy 71 | ![](https://i.imgur.com/cU1cxma.png) 72 | 73 | -------------------------------------------------------------------------------- /2019-12-2.md: -------------------------------------------------------------------------------- 1 | 讨论 2019-12-2 2 | = 3 | 4 | # 机器翻译在文本生成任务的定位 5 | 6 | NLP中有众多的文本生成任务,本次讨论会涉及有代表性的几种任务,分别是NLG(狭义,特指data-to-text),摘要,翻译,对话。讨论的重点会在于机器翻译与其他任务之间的联系和区别。 7 | 8 | ## NLG 简介 9 | 介于其他任务大家了解较多,就不在赘述,这里只简单概述下传统NLG的任务场景。 10 | 11 | https://nlgsummer.github.io/slides/Ehud_Reiter-Intro_to_NLG.pdf 12 | 13 | 例子:天气预报 14 | 给定一系列天气相关的数据,产生一段文字播报。 15 | 16 | 例子:路况提示 17 | 给定一系列道路信息(例如堵车,大雪,修路,事故),产生文字播报。 18 | 需要考虑轻重缓急,消息有优先级,每次生成内容或多或少,不固定。 19 | 20 | **Overview** Road surface temperatures will reach marginal levels on most routes from this evening until tomorrow morning. 21 | **Wind (mph)** NW 10-20 gusts 30-35 for a time during the afternoon and evening in some southwestern places, veering NNW then backing NW and easing 5-10 tomorrow morning. 22 | **Weather** Light rain will affect all routes this afternoon, clearing by 17:00. Fog will affect some central and southern routes after midnight until early morning and light rain will return to all routes. Road surface temperatures will fall slowly during this afternoon until tonight, reaching marginal levels in some places above 200M by 17:00. 23 | 24 | ## 信息角度 25 | 从文本生成过程中的信息传递角度出发, 26 | - NLG:信息或增或减,取决于原数据的抽象程度,如果类似AMR则信息基本恒定,但如果信息过多,例如路况信息,输出文本只包含了重要部分,而对于天气预报类,要补充语言知识和常识。 27 | - 摘要:信息减少,10句话变1句话,显然浓缩 28 | - 翻译:不多不少,信达雅,第一条“信”便要求信息不增不减 29 | - 对话:信息不是核心,同感和共情更为重要,任务相关的对话也强调信息传递,但通常可以看做应用问答或其他技术,对话系统本身重点不在此。 30 | 31 | 但从文本生成角度出发,信息应不增不减,对信息的调整更多设计语言理解和语义关系,常识等。以此出发,机器翻译具有优势,但同时也有劣势,从信息角度可以看出,机器翻译不一定需要语言理解,或者说在有些情况下不需要语言理解。 32 | 33 | ## 复杂性角度 34 | 研究问题要讲控制变量,从任务场景复杂性来讲 NLG < 摘要 < 翻译 < 对话,但从任务本身来讲 翻译 < 摘要 < 对话 < NLG 35 | 36 | 这部分比较主观,仅供参考 37 | ### 任务场景 38 | NLG简单来讲就是 结构化数据 到 文本的过程,输入格式往往是固定的,比如天气预报,就总是那个输入数据,内部逻辑高度一致,几乎所有数据都是一个模型。 39 | 摘要就是挑些重点,再组织成一句话,并且大部分输入也是想尽的领域,比如都是新闻。 40 | 翻译相对就复杂一些,第一是输入高度自由,第二是模式不固定,陈述句,主动,被动,问句,感叹句,都要翻译,难以一言蔽之。 41 | 对话最为复杂,要考虑的因素也最多。 42 | 43 | ### 任务本身 44 | 翻译在相似语言中就是复述,遣词造句都可以模仿输入,不需要深入理解语义。不相似语言之间有些难度,但天下语言无非几大类,共通点很多。 45 | 摘要,摘抄些句子在合并即可,比翻译复杂在挑选句子和合并。合并本身并非易事。 46 | 对话,考虑很多,但可以通过状态机模拟很多场景。 47 | NLG,很多输入是不包含任何语言信息,例如一组纯数字,无中生有最难,所以NLG很难有通用结构。 48 | 49 | ## 评测角度 50 | 从两点出发,一是答案的数量和多样性,二是度量指标的合理性。 51 | 首先从答案的分布出发,翻译问题的歧义性最少,换言之最多只有几种正确的翻译的方法,而其他几种都高度多样化。试想对话场景中,会有非常多不同说法。 52 | 再者,度量指标(BLEU,ROUGE)大部分受长度影响很大,所以想要准确的度量,首先要保证长度与参考标注一致,而这一点其实只有翻译可以做到。 53 | 所以从评测角度来说,翻译是目前最标准的,但也差很多。 54 | -------------------------------------------------------------------------------- /2020-01-06.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-01-06 2 | = 3 | 4 | # 文本中的结构 (二) 5 | 6 | 大量参照 https://cl.lingfil.uu.se/~sara/kurser/5LN455-2014/lectures/5LN455-F7.pdf, http://ivan-titov.org/teaching/nlp1-15/nlp1-l9.pdf ,对于文本结构的研究和教程数不胜数,本文只起抛砖引玉之用。 7 | 8 | 10 | ### 生成树问题 11 | 首先,句法树是一棵树,而我们的要通过某种方法来构建这个树,一种很自然的方法是从两个节点的关系,也就是一条边入手,假如我们对任意两个节点之间都有一个权重,那么构造树的问题就是属于生成树问题。 12 | 给定一个图G(V,E),目标是选出一些边构成子图G',且G'包含所有V中节点,G'是一棵树。假如我们要求边权最小,那就是最小生成树。在句法树中,我们求解的还是有向图。 13 | ### Projective 14 | 假如一棵树的节点可以通过一种固定的访问方式(称为遍历不准确)和原句的语序一样,那就是projective,否则就是non-projective。当然很多现有文献主要讨论了交叉边问题,实际是等价的,没有交叉边一定有固定访问方式,有的话一定没有。更为直观的做法(熟悉的可以略过这个牵强的解释)是观察一棵树的括号表达式,树总能表达成一个括号表达式(树的集合定义)。上述的固定访问方式在成分树中是中序遍历只取叶节点,而依存树是中序遍历。 15 | 下面是一个non-projective的例子,其括号表达式总是和原句语序不符。 16 | 17 | ![](https://i.imgur.com/4LV7QlA.png) 18 | 大家可以尝试一下 19 | 20 | ### 动态规划 21 | 今天介绍的三种方法(CYK算铺垫)都是动态规划算法,也都是在Projective假设下的。 22 | 简断截说,动态规划总有一个状态表,一个转移方程(带边界条件)。其结果是总能把一个问题分成其他的问题再求解(一个状态可以从其他状态转移而来)。 23 | ### CYK Algorithm 24 | 这里只讲最原始的CYK,用来检测一个输入字符串是否符合一段给定的CNF(标准的上下文无关文法,见上次讲义)。 25 | 一个长度为n的字符串输入,non-terminal数量为r的语法,其状态表为(n,n,r),前两维表示一段连续区间,r表示是哪种non-terminal。 26 | \begin{gather} 27 | D[i,j,k] = \cup_{q,A,B} (D[i,q,A]\cap D[q,j,B]\cap k\rightarrow AB \in Grammar) 28 | \end{gather} 29 | 30 | 初值为non-terminal到terminal对应表,如果最后D[0,n-1]中有一个元素为真,那么输入字符串就是符合相应语法的。 31 | ### Collins Algorithm 32 | 假如我们有任意两个元素依存关系的权重$r_{ij}$,其中$r_{ij}$表示$i \rightarrow j$,$r_{ji}$表示 $j \rightarrow i$。 Collins算法定义的状态表为(n,n,n),其含义为(start,end,head),即一段区间(st,ed)的head是h的情况。显然,转移方程如下 33 | \begin{gather} 34 | D[st,ed,hl] = \max_{q,hr} (D[st,q,hl]+D[q,ed,hr]+r_{hl,hr}) \\ 35 | D[st,ed,hr] = \max_{q,hl}(D[st,q,hl]+D[q,ed,hr]+r_{hr,hl}) 36 | \end{gather} 37 | 见板书 38 | ### Eisner Algorithm 39 | Eisner算法和Collins目标一致,但使用了更好的状态设计,所以复杂度更低,状态表为(n,n,2,2),即(start,end, is start a head or end a head, end at interval or boundary),Eisner规定head节点一定是区间的左端点或右端点,第三维就是表示这个信息的,同时带来的问题是head确定在了端点,但另一边仍不确定,即head指向的是不是另一个端点,用第四维表示。 40 | \begin{gather} 41 | D[st,ed,\rightarrow,true] = \max_{q}(D[st,q,\rightarrow,false]+D[q+1,ed,\leftarrow,false])+r_{st,ed} \\ 42 | D[st,ed,\leftarrow,true] = \max_{q}(D[st,q,\rightarrow,false]+D[q+1,ed,\leftarrow,false])+r_{ed,st} \\ 43 | D[st,ed,\rightarrow,false] = \max_{q}(D[st,q,\rightarrow,false]+D[q,ed,\rightarrow,true]) \\ 44 | D[st,ed,\leftarrow,false] = \max_{q}(D[st,q,\leftarrow,true]+D[q,ed,\leftarrow,false]) \\ 45 | \end{gather} 46 | 47 | ### 一些问题 48 | - Non-Projective 怎么解? 49 | - 上述所有$r_{ij}$都是独立的,如果$r$内部有联系怎么办 50 | 51 | ### 朱刘算法(下次讲) 52 | ### Transition-Based(下次讲) 53 | -------------------------------------------------------------------------------- /2020-01-13.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-01-13 2 | = 3 | 4 | # 文本中的结构 (三) 5 | 6 | 大量参照 http://www.cs.umd.edu/class/fall2017/cmsc723/slides/slides_13.pdf ,对于文本结构的研究和教程数不胜数,本文只起抛砖引玉之用。 7 | 8 | ## Non-Projective 解法 9 | 没有了 Projective假设,没法做子问题拆解(不满足区间划分的要求),所以就不再适用上次讲的动态规划算法了。 10 | 退回到在一个全连接有向图上找生成树的问题,有向图的最小生成树有相应的解法,朱刘算法 11 | 12 | ## 朱刘算法 13 | 14 | - 为每个点找最小入边 15 | - 如果最小入边不成环,就是最小生成树 16 | - 如果成环,缩点,重复流程 17 | - 求解出一个缩点后的最小生成树,可以逐层展开,对于一个环,只去掉和整个环的入边相矛盾的一条边即可 18 | 19 | ## Non-Projective的困境 20 | 虽然我们给出了一些 Non-Projective的例子,并且在一些语言中更为频繁,但语言本身还是比较简单的,当做一个图论问题来解过于宽松,容易出现一些过于复杂的例子,并且对误差敏感。如果语法树和文字语序对应关系很差,实际上是不利于人们理解的,所以在Non-Projective和Projective之间应该有合理的假设(或者说不同语言有各自的合理假设)。 21 | 22 | ## Transition-Based 23 | 转移式/传递式的句法分析从另一个角度考虑问题,既然目标是一棵树,并且在Projective假设下,是一个语序和原句一致的括号表达式,那么就直接按照括号表达式的处理方式来做即可。换言之,我们可以把问题看做是如何在一个序列中加括号,只不过是有顺序,贪心的。其实用上次讲的动态规划思想解括号问题更自然,但是在Context-free Grammar中有一种简化的解法就是 Shift-Reduce 算法(用栈解表达式求值)。 Transition-Based的工作大部分受Shift-Reduce的影响,虽然处理的目标不是CFG了,仍然近似的使用这种算法。所以Transition-Based从本质是贪心的,局部最优的,换言之Transition-Based一开始就放弃了求最优解,但因此他的速度也很快(在NN中相反,因为要考虑历史信息)。 24 | 25 | Shift-Reduce 26 | ```= 27 | a+b*(c+d*e)+f 28 | |a 29 | |a+ 30 | |a+b 31 | |a+b* 32 | |a+b*( 33 | |a+b*(c 34 | |a+b*(c+ 35 | |a+b*(c+d 36 | |a+b*(c+d* 37 | |a+b*(c+d*e A=d*e 38 | |a+b*(c+A 39 | |a+b*(c+A) B=(c+A) 40 | |a+b*B C=b*B 41 | |a+C 42 | |a+C+ 43 | |a+C+f D=C+f 44 | |a+D E=a+D 45 | |E 46 | ``` 47 | 48 | ![](https://i.imgur.com/RlVdPLZ.png) 49 | Arc-Standard 50 | ![](https://i.imgur.com/cLYmf5X.png) 51 | Arc-Eager 52 | ![](https://i.imgur.com/CTZfDah.png) 53 | 54 | 55 | # 句法分析的合理性 56 | 其实Graph-Based和Transition-Based都不能完整的表达句法分析问题。 57 | 58 | Graph的中的边应该是互相无关的,很少有图论算法会考虑求解子图结果时会影响边权,比如求一个最短路,加入一条边,另一条边权值就会改变。当然,在网络流中有一些例子,但权值影响都很简单。 59 | 60 | Transition-Based把问题拆解成有后效性的局部贪心问题,显然就是有瑕疵的,另一方面,他也不是个MDP问题,并且从左到右不一定是后效性最小的顺序。 61 | 62 | 所以说,句法分析问题抽象化之后的模型就已经是一个很复杂的模型了,目前还没有很好的解答。 63 | -------------------------------------------------------------------------------- /2020-09-21.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-09-21 2 | = 3 | 4 | ## NLP是做什么的? 5 | 自然语言处理的根本目标是让计算机做到两件事,读懂自然语言和生成自然语言,也就是读和写。 6 | ### 一个简单的例子 7 | 8 | 读懂一句话也就是理解其中的含义,或者说把文本内容的语义提取出来。所以读懂/理解一句话就是把它的语义抽象出来。比如“好吃”,“真好吃”,“好吃!”都会被抽象成正面评价“好”,而“难吃”,“不好吃”则被抽象成“坏”。 9 | 10 | 用形式化的语言来描述这个问题就是我们要找到一个函数$f$,满足$$f(好吃)=好, f(难吃)=坏$$ 11 | 当然,我们还要满足很多其他条件,比如输入是可以拆分的。我们这里的情况比较简单,可以把“好吃”当做一个输入,但假如处理长句子“昨天天气不错,今天天气也不错,这个汉堡好吃。”,显然把这一整句话当做一个输入就比较困难了,因为语言的组合和说法太多,不可能为每个句子一一存储。所以,我们通常需要把输入拆分成更小的单元,比如词,字。 12 | 13 | 下面我们考虑如何构造$f$,绝大多数情况下,我们都采取人为设计函数形式,再用优化的方法估计其中的参数。 14 | 15 | $f(好吃)=\alpha e(好) + \beta e(吃), f(难吃)=\alpha e(难) + \beta e(吃)$ 16 | 这里面的 $e$是每个字的代称,实际上每个字都是一个变量,比如$e(好)=x_1, e(吃)=x_2$ 17 | 18 | 有了这些设定后,我们从求解$f$就变成了求解$\alpha,\beta,e$。 19 | (这种转换的目的是什么?) 20 | 21 | 为了方便,我们把要满足的目标改为0,1,实际上可以是任意不相等的两个数,所以 22 | 23 | \begin{gather} 24 | f(好吃)=0, f(难吃)=1 \\ 25 | L = ||0-f(好吃)||_2 + ||1-f(难吃)||_2 26 | \end{gather} 27 | 而$L$,loss function,误差函数的作用是衡量我们离目标有多远。 28 | 至此,我们发现有一种通用的求解参数$\alpha,\beta,e$的方法,那就是利用$\frac{\partial L}{\partial \alpha}, \frac{\partial L}{\partial \beta}, \frac{\partial L}{\partial e}$。 29 | 30 | 不管$\alpha,\beta,e$的初始值是什么,利用梯度,我们总能找到一个局部最优解。 31 | 32 | 有了$f$的具体参数,我们就可以用它去处理新数据,完成相应的任务。 33 | 34 | 35 | 但这个例子中忽略很多重要问题,我们下面会一一讨论。 36 | 37 | ### NLP问题的通用流程 38 | - Data,数据,数据是我们解决问题最基础的条件,数据的质量,数量往往决定了我们可以达到的上限。特别需要注意的是数据处理在NLP中非常重要,其作用远胜于其他环节,良好的数据处理加上简单的模型可以很容易超越粗糙的数据处理加上精妙的模型。 39 | - Model,模型,也就是我们人为规定的参数形式,是我们接触最多也修改最多的,但要明确模型是骨架,设计出一个好的模型只是个开始,我们还需要其他环节把内容填好。 40 | - Loss,误差函数,误差函数是我们定义的游戏规则,我们要尽量避免漏洞,保证其目标和我们期望的一致。 41 | - Optimization,优化,loss制定了游戏规则,model和data决定了我们的上限,但optimization决定了我们实际能做得多好。其他设计的再好,优化不好,也拿不到好结果。 42 | - Analysis,分析,参数估计的方法决定了我们不是从已知条件推理出答案的,而是从茫茫大海中挑选了一个可行的答案,这个答案为什么对,怎么来的,我们都不知道。为了知道我们拿到的结果在其他地方有什么作用,有什么反应,分析是必不可少的。 43 | 44 | ![](https://i.imgur.com/s8pD841.jpg) 45 | 46 | ### 读 47 | http://nlpprogress.com/ 48 | 49 | 50 | Constituency parsing, Coreference resolution, Dependency parsing, Information extraction, Intent Detection and Slot Filling, Named entity recognition, Natural language inference, Part-of-speech tagging, Question answering, Semantic parsing, Semantic role labeling, Sentiment analysis, Text classification, Word segmentation, etc. 51 | 52 | #### 整句分类 53 | 从输入序列映射到单一输出是文本分类中很常见的一种设定,比如情感分析,判断一句话的情感极性,这里主要涉及一个问题就是如何把变长输入变成定长输出。方法虽多,但不外乎几种思路,一是把变长序列补成定长,二是时间维度的pooling,例如取序列最大值,平均值,topk等。三是加权求和,其中又分为归一化的求和,比如attention,和不归一化的求和,比如gate。此外,还有一种方法就是递归求解,比如把一个序列两两合并,直至只剩一个元素。 54 | #### 序列标注 55 | 序列标注其实是最直观的分类任务,因为每一个输入都对应一个输出,只需要把特征映射到类别即可。但序列标注经常会遇到的一个问题就是类别不均衡问题,比如NER中O比其他tag出现要多很多。如果是SRL和slot filling等任务中,这一现象就更为明显。 56 | #### 结构抽取 57 | 结构抽取的概念比较杂,比如关系抽取,指代消解,事件抽取,句法分析等等。他们的机制各不相同,并且与生成有一定联系,但他们的共同点是在很有限的范围里做出决策。比如关系抽取只能在预先定义的关系中选择一种,指代消解也只能在输入中进行选择,事件抽取只能从模板中选取。这些任务有时可以用生成模型来处理,但和生成问题的区别主要还是在这些问题决策的范围是非常有限的,并且是紧紧围绕在输入信息上面的。而生成任务往往更自由,选择范围更大。 58 | 59 | ### 写 60 | Data-to-Text Generation, Grammatical error correction, Language modeling, Machine translation, Summarization, Dialogue, etc. 61 | 62 | #### 无源文本生成 63 | 无源生成就是指随意生成人话,之所以不直接叫语言模型,是因为GAN和VAE序列的工作和语言模型还有一定的区别,这些模型可以生成文本,但很多时候不能显式给出其概率。或者VAE也可以叫有源,但这个信息源是噪声分布,所以归于无源生成更好些。 64 | #### 有源文本生成 65 | 有源生成也就是根据给定信息进行文本生成,给定信息可以是各种形式,比如是图片,那就是Image Caption,如果是外语,那就是Machine Translation,如果是大段文本,可能就是 Summarization。 这类任务最常见的架构就是encoder-decoder,要注意decoder是如何利用encoder信息的。 66 | ![](https://i.imgur.com/T7q3Sp1.jpg) 67 | 68 | https://www.tensorflow.org/tutorials/text/nmt_with_attention 69 | 70 | https://github.com/pytorch/fairseq/blob/master/fairseq/modules/transformer_layer.py 71 | 72 | #### 复制粘贴及带限制的文本生成 73 | 有些时候,我们需要生成过程满足一些规律,比如在翻译过程中出现的人名,地点,就可以直接复制过去,而不是从完整词表中选择。有的时候我们需要输入的信息都要被用到,而不是有大量遗漏,又或者,我们不希望生成的文字有太多重复的内容。 74 | 75 | #### 自回归和非自回归生成 76 | 人说话和写字都是有顺序的,那机器一定要和人顺序一样吗,或者说一定要有序吗?非自回归模型讨论了一种新的可能性,也就是所有位置同时生成,而不设定具体的顺序。 77 | 78 | ### 常见模型 79 | NLP中常用模型为CNN,RNN,Attention,近年来对GNN的使用也在增多。 80 | 81 | #### NLP特有问题 82 | 和一般机器学习问题相比,NLP问题有两大特点 83 | 84 | - 输入变长且有长距离依赖 85 | - 离散且数据空间极大 86 | 87 | #### CNN 88 | 卷积可以看做对一个局部区域按位置求和,在图像上卷积核的物理意义比较明显,比如模糊,锐化,方向检测等等。但在文本上无明确的物理含义,因为文字是离散的,我们很难理解语义的几何关系,比如我们可以理解 “一般”在“好”和“不好”的中间,但很难去思考“月球”和“汽车”的中间值是什么。 89 | $$y_i = W_1 x_{i-k} + W_2 x_{i-k+1}+ ...+W_{2k+1} x_{i+k}$$ 90 | 91 | ![](https://i.imgur.com/wgBu3zb.png) 92 | http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/ 93 | 94 | 95 | 96 | #### RNN 97 | 循环神经网的本质是时间步之间的参数共享,即从$i \rightarrow i+1$和$j \rightarrow j+1$的规律相同。虽然这一假设在广义上总能满足,但实际上还是有困难,比如一段文字的背后规律是DAG,自动机这种。可另一方面,RNN可以近似任意阶的Markov Chain,已经很强了。 98 | 99 | ![](https://i.imgur.com/y1OuoJw.png) 100 | http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 101 | 102 | #### Attention 103 | 注意力机制不像RNN和CNN有明显的归纳偏好,注意力机制允许任意输入元素间两两交互,但实际上它也自己的假设,只是不如RNN和CNN那样明显。注意力机制实际上对两两交互关系做了分解,用向量外积来生成交互矩阵,而这些被使用的向量是与位置无关的,是每个位置的特征独立运算所得。 104 | \begin{align} 105 | \alpha =& QK^T \\ 106 | \alpha =& H W_Q (H W_K)^T\\ 107 | \alpha =& H W_Q W_K^T H^T \\ 108 | \alpha =& H R H^T \\ 109 | \end{align} 110 | $R$实际上定义了特征之间如何两两交互,注意力机制把交互矩阵$\alpha$参数化为$H H^T$的形式其实也是一种归纳偏好。比如处理的语言,它不论内容如何,一定是回文的,即正反读是一样的,那注意力机制就不好直接刻画这种关系。 111 | 112 | #### 词嵌入表示 113 | 因为语言涉及的离散状态实在太多,人们就想到用一种连续的表示来覆盖这些状态,也就是词嵌入表示。 114 | 115 | https://projector.tensorflow.org/ 116 | 117 | #### 小结 118 | 理论上,RNN和注意力机制都是有广泛适用性的,换言之绝大多数NLP问题都可以用RNN和注意力机制,并且存在可行解,但实际中存在不代表我们可以找到。每种模型甚至是同一模型的不同的实现方法都有各自的特点。具体问题要具体分析。 119 | 120 | ## 几个问题 121 | ### 为什么需要非线性? 122 | 线性模型有局限性,难以涵盖一些情况,所以需要非线性。 123 | |输入|输出| | 124 | |-|-|-| 125 | |好好吃| 正面| a+x = 0| 126 | |不好吃| 反面| b+x = 1| 127 | |好难吃| 反面| a+y = 1| 128 | |不难吃| 正面| b+y = 0| 129 | 130 | ### 自然语言的“自然”是什么意思? 131 | Chomsky hierarchy 把语言分成四个层级,正则表达式,上下文无关文法,上下文有关文法,和无限制文法。而自然语言就属于最后一种,机器所用的语言大多属于前两种。 132 | 133 | ### 语言的最小单元是什么? 134 | 在之前的例子中我们也有提到,希望把输入信息分解成由小单元组成的序列,这也就涉及了最小单元的概念,实际上,有很多不同理解,字,词,subword,拼音,笔画,unicode的一个字节等等。不同工作,不同场景下拆分的粒度也有不同。但大体上要考虑三方面因素,一是长度,拆得越细,长度越长,二是词表大小,粒度越粗,词表越大,三是表达能力,粒度越细,往往每个元素包含的语义信息越少,我们也就需要更复杂的网络来融合它们。 135 | 136 | 137 | # 关于研究的一些建议 138 | ## 代码可以借鉴,论文不能抄袭 139 | 140 | ## 灵感哪里来 141 | - **站在巨人的肩膀上** 很多问题,很多解法前人都考虑过,充分利用这些知识会很重要的,过去失败的方法可能只是需要的条件没达到,放到现在也许就是成功的。 142 | - **多观察** 多观察数据,多观察实验结果,在发现规律这个问题上,人比机器强 143 | - **多比较** 新颖性永远是个相对的概念,首先要熟知相关工作的做法,才能知道什么是新颖的,自己方法的特色是什么 144 | - **生活实践** 生活常识有时也是方法的来源,同时当我们有新想法时,也要考虑是否符合常识 145 | 146 | ## 不要为论点找论据 147 | 不要先有一个结论,然后想方设法做实验,找到证据来证明这个论点。 148 | - **贝叶斯公式** 先验概率是很有指导意义的,不要有太多侥幸心理,虽然很多科学发现来源于失败的实验或意外,但总体而言,尽量不要把小概率事件作为实验的目标。 149 | - **辩证法** 实验之前,考虑导致成功的因素有哪些,为什么成功,同时也要考虑导致失败的因素有哪些,为什么失败 150 | - **逻辑知识** 同一个实验结果是否有其他解释,控制变量,充分和必要条件,三段论等 151 | 152 | ## 好习惯 153 | - 良好的实验记录,由于实验需要进行非常多次(上百,上千),实验记录是非常必要的,并且实验记录可以很琐碎,最后阅读实验记录的也是程序。 154 | - 预分析实验结果,在实验结果出来之前,先为每一种可能结果做预案,比如出现哪种结果说明什么,需要下一步进行什么实验。 155 | - 关注实验过程,例如训练误差,校验集的变化,测试结果的变化,乃至各种中间变量,统计量的变化都值得关注,一个实验结果可能是偶然,但整个过程,各种变量都一致的偶然是十分罕见的,这也是一个检验程序正确性的好方法。 156 | -------------------------------------------------------------------------------- /2020-10-08.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-10-08 2 | = 3 | 4 | # NLP中的常用模型 (一) 5 | 6 | ## RNN 循环神经网 7 | 假设有一个序列$X=x_0, x_1, x_2, ..., x_n$,与HMM类似,RNN通过递推的方式来建模这个序列,$$ h_t = \mathrm{tanh}(Wx_t+U h_{t-1}) $$ 8 | 9 | 这种方式的好处是同一个模型可以应对任意长度的序列。同时RNN也有很多性质,而其中不乏双刃剑,比如RNN建模序列式可以考虑相对次序,输出与$t$无关。这在很多场景下是优势,比如类周期性的信号,没有明确的开始与结束。但同时有时确实劣势,因为与$t$无关也就意味着RNN不能感知绝对位置。但假如了解RNN的特性,这一缺点完全可以规避。\ \就可以解决这一问题。 10 | 11 | 在对RNN的研究中,最具代表性的就是长时记忆问题,也就是探讨RNN记忆力如何的问题。实际上,在应用RNN的过程中,许多人都发现了RNN不能记住多步之前的信息(通常指几十步以上)。对此主流的解释是梯度弥散和梯度爆炸问题 12 | 13 | \begin{align} 14 | \frac{\partial h_t}{\partial h_{t-1}} &= (1-h_t^2)U \\ 15 | \frac{\partial h_t}{\partial h_{t-k}} &= \prod_{i=t-k+1}^t (1-h_i^2) U^k 16 | \end{align} 17 | 18 | 我们可以很容易发现,k步间的导数传递十分不问题,很容易快速增大或快速减小。也就带来了梯度爆炸和梯度弥散问题。另外这种现象同样存在于深层网络中,因为相应的项从$U^k$变为$\prod_i U_i$同样很不稳定。同时根据这一推导我们也可以理解为甚RNN难以记住几十步以前的信息。并且我们发现只有$U$接近于1,RNN才可能稳定这一思想也影响了后续众多对RNN的改进工作。 19 | 20 | ### 正交初始化 21 | 假如矩阵$A$满足$A^TA=AA^T=I$,则A为正交阵,同时正交阵有一个重要性质,即模长不变 22 | \begin{align} 23 | ||x||_2 &= x^T x \\ 24 | ||Ax||_2 & = (Ax)^T Ax \\ 25 | & = x^T A^T A x \\ 26 | & = x^T x \\ 27 | & = ||x||_2 \\ 28 | \end{align} 29 | 知道了经过正交矩阵不会改变模长,我们就想到如果 $U$是一个正交矩阵,那么长距离梯度传递问题是不是就得到很好解决? 30 | 受这种想法启发,现在很多RNN的实现都会把 $U$初始化为一个正交阵。但遗憾的是在优化过程中很难保持正交性质,把$U$重参数化,让其强制为正交阵又会使网络能力大大下降。 31 | 32 | ### 激活函数的选择 33 | 我们已经知道了tanh的导数,并且发现它在0~1之间的,这不利于长距离梯度传递。所以也有一些工作探讨了是否有其他更适合RNN的激活函数,比如使用ReLU替代tanh,我们知道ReLU在正数部分的导数就是1,所以很有利于长距离传递。一些研究也表明这种改进在一些情况下确实提高了RNN的记忆能力,但我的个人经验是这种结构非常脆弱,很难调。(大家可以思考一下为什么比tanh难调) 34 | 35 | ### 集大成者 LSTM 36 | LSTM既考虑了长距离梯度传递问题,又兼顾了网络的表达能力,看似复杂,其实考虑周全。 37 | \begin{align} 38 | i_t &= \sigma(Wx_t+Uh_{t-1}) \\ 39 | o_t &= \sigma(Wx_t+Uh_{t-1}) \\ 40 | f_t &= \sigma(Wx_t+Uh_{t-1}) \\ 41 | \hat{h}\_t &= \mathrm{tanh}(Wx_t+Uh_{t-1}) \\ 42 | c_t &= f_t * c_{t-1} + i_t * \hat{h}\_t \\ 43 | h_t &= o_t * \mathrm{tanh} (c_t) 44 | \end{align} 45 | 注意每一行的$W$和$U$都是不同参数。 我们可以发现$c_t$是一条记忆的通路,与$U$无关,只收gate的控制。假如gate常开,LSTM可以允许长距离的梯度传输。 但也要注意,$f_t$ 是sigmoid函数出来的,所以初值不会太接近1,而指数衰减速度很快,所以想要学习长距离关系,一般要把$f_t$相应的参数单独初始化,让其初始值就接近1。 46 | 47 | ## 预告 48 | ### 外部记忆 49 | ### NTM 神经图灵机 50 | ### RNN中的Attention 51 | ### 层次化的RNN 52 | ### 超越序列的RNN 53 | -------------------------------------------------------------------------------- /2020-10-15.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-10-15 2 | = 3 | 4 | # NLP中的常用模型 (二) 5 | ### 外部记忆 6 | 7 | 在上一次讨论中,我们重点讲述了RNN的长时记忆问题,作为RNN最显著的缺点,围绕其展开的研究也众多。而运用外部记忆是其中非常重要的一种思路。 8 | 简而言之,既然RNN难以记住很久以前的信息,我们便在RNN之外添加一个记忆模块。比起改造RNN本身,这种方法更偏工程,但很实际,我们所处的NLP领域中也是以应用研究为主,所以解决问题比方法优美更加重要。 9 | 10 | 大部分使用外部记忆的模型都可以抽象为三部分,控制器(通常是一个RNN),读取内存,写入内存。 11 | 12 | ![](https://i.imgur.com/rb4EmZQ.png) 13 | 14 | 首先,内存(Memory)是一个固定大小的矩阵(N $\times$ M),而读取和写入的单位都是一个向量,所以我们要考虑从什么地方读,写什么和写在哪的问题。我们以NTM为例,把这些过程类比到内存寻址问题,即内存由key value pair组成,我们通过比对key来找的最后的位置,然后读取它的value作为结果。 15 | \begin{align} 16 | r_t = \sum_i w_t(i)M_t(i) 17 | \end{align} 18 | $w_t$是一个分布,我们再看如何写入 19 | \begin{align} 20 | M_t(i) = M_{t-1}(i)[1-w_t(i)e_t] + w_t(i)a_t 21 | \end{align} 22 | $e_t$控制擦除那些维度,$a_t$是要写入的新内容 23 | 24 | 我们发现读写最重要的部分就是分布$w$,我们也可以用Attention的思想理解它,它就是对每个位置Attention的系数。而求这个Attention的方法和我们现在常用的有一定区别。 25 | 26 | 大致可以分为两种思路,很多模型都同时使用了这两种思路,一是内容索引,二是位置索引,顾名思义,内容索引指只根据内容决定读写的位置,不考虑所在位置。即同一个向量放在内存中不同位置是等效的,而位置索引相反,只考虑所在位置,不考虑内容,比如存放在第一个位置的向量就应该如何如何而不考虑它的具体内容。 27 | 28 | ![](https://i.imgur.com/En5gfQc.png) 29 | 30 | 具体方法比较繁琐,但不难,原paper写的比较清楚 31 | https://arxiv.org/pdf/1410.5401.pdf 32 | 33 | ![](https://i.imgur.com/pJbqyV1.png) 34 | 35 | ### RNN中的Attention 36 | Attention最早出现并不是我们现在常用的self-attention,当时通常是把attention作为一种信息选取的工具,类似于NTM的读取机制。 37 | 除了在encoder-decoder模型中大量使用外,attention还有很多其他用法,比如在RNN的每一步都对历史信息进行attention。 38 | 39 | 当然我们在这里更为关注的是attention的形式问题, 40 | \begin{align} 41 | \alpha_i &= V^T \mathrm{tanh}(WQ+UK_i) \\ 42 | \alpha_i &= MLP([Q;K_i]) 43 | \end{align} 44 | 早期的Attention大部分使用加法,或者拼接(实际是一种)的方式。其实和我们的现在常用的点积形式并没有太多性能差别。但如果拓展到self-attention,效率就比较底了。 45 | 从这里也可以看出,Attention系列的研究动机比RNN时代要简略,很多工作更倾向于通过实验从多种设计中选择一种,而不是探讨不同设计的特性。 46 | 47 | ### Attention的含义演变 48 | 如我们以上所示,attention的含义开始是从多个候选项中选择一个,而之后一些工作提出,这种选择是否也应该考虑特征的维度,即不同维度是否可以套用不同的attention。而其代表工作就是多维attention,每个维度都有不同的attention。这种方法确实显著提高了attention的表达能力,但物理含义和效率都不佳,人们又慢慢转向了多头机制(multi-head)。其实多头机制很早就有了,在NTM中就有应用,但过了几年,才最终形成我们现在常用的 multi-head dot-product self-attention。其实现在的做法未必最优,只是一个权衡了多方面因素的暂时解决方案。 49 | 50 | 51 | 图太长就不贴上来了,[这篇工作](https://arxiv.org/pdf/1709.04696.pdf)对self-attention的探索很有意义 52 | 53 | 54 | Attention的具体含义其实并不清晰,有人解释为多选一,有人解释为动态卷积,有人解释为GNN。 55 | 但有一些基本的概念,即Attention和CNN和RNN不同,在关系建模上与输入内容相关,换言之是对不同输入是动态处理的。这里的“动态”和“静态”指的是直接影响,因为从参数角度,所有网络都是“静态”的。另外需要注意的是attention并不一定是bilinear形式的。 56 | 57 | \begin{align} 58 | \alpha = x^T W y 59 | \end{align} 60 | 61 | ## 预告: 62 | ### RNN的层级结构 63 | ### 超越序列的RNN 64 | ### Transformer 65 | -------------------------------------------------------------------------------- /2020-10-22.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-10-21 2 | = 3 | 4 | # NLP中的常用模型 (三) 5 | ### RNN的层级结构 6 | 层级结构是一个在RNN及序列分析中很热门的一个词,但我们需要首先明确有两种层级结构,一是指数据本身的层级结构,如字符到单词,单词到词组,以及从句等。而另一种层级结构指的是模型本身的层级结构,可以简单理解为神经网络的层数。 7 | 8 | 绝大多数相关工作都是在探讨数据的层次和模型的层次之间的联系。一种自然的想法是浅层网络(近输入)对应低级数据结构,深层网络(近输出)对应高级数据结构。不少工作都验证了这种直觉,但也有一些反例。不过如果我们深入思考,会发现不论实际结果是否符合直觉,其背后的逻辑与我们通常所想并不相同。 9 | 10 | 实际上,网络每层的行为规律和它与输入和输出的距离更为相关。例如如果输入是一个主题,输出是一段相应的故事,那么深浅关系就反过来了。以此类推,我们既要考虑解决问题所需的深度,也要考虑网络本身的连续性。 11 | ![](https://i.imgur.com/e0zzxHq.png) 12 | 13 | 这篇文章是一个典型的认为不同网络层功能有差异,并且有互补性的工作,这种观点在当时比较流行,认为这种Top-down的信息是对浅层有帮助的。 14 | https://arxiv.org/pdf/1502.02367.pdf 15 | 16 | ![](https://i.imgur.com/lwHpVv8.png) 17 | 18 | 这篇文章是做层次化结构比较清楚的一篇文章,以可解释性为第一目标,虽然性能未必有很大提升,但确实捕捉到了数据本身的层次特征。换言之,算是一个比较明确指出网络层如何与数据含有的层次对应的工作。论文见图 19 | https://arxiv.org/pdf/1609.01704.pdf 20 | 21 | ### 超越序列的RNN 22 | 我们了解了RNN是如何处理序列(一维数据的),那么一个自然而然的问题便是RNN能否处理多维数据。解法也比较多,一种是逐个遍历各个维度,另一种是把多维数据当做一维数据处理,例如通过定序把二维图像变成一维序列。而Grid LSTM是一个比较有趣的工作,它把网络的深度也当成一个深度,这样原本的一维序列也变成了二维,一维的数据加上一维的网络深度。 23 | ![](https://i.imgur.com/enWKKUZ.png) 24 | 25 | https://arxiv.org/pdf/1801.00887.pdf 26 | 27 | Grid LSTM 把多维问题进行了抽象,把它作为一个多输入问题,即一个LSTM单元会同时接受多个输入,对应不同的维度。而整个状态转移过程会同时兼顾多个维度的信息。 28 | \begin{align} 29 | H = [x_t^1, x_t^2,\cdots,x_t^K,h_t^1,\cdots,h_t^K] \\ 30 | H'_1 = LSTM_1(m_1,H) \\ 31 | H'_K = LSTM_K(m_K,H) 32 | \end{align} 33 | https://arxiv.org/pdf/1507.01526.pdf 34 | 35 | ### Transformer 36 | 37 | #### 什么是Transformer(广义) 38 | 由多层self-attention层叠加而成的模型,可以搭配全连接层,卷积层。attention机制也可以从多种实现中挑选任意一种。 39 | ![](https://i.imgur.com/vnMGY4L.png) 40 | 41 | #### 什么是Transformer(狭义) 42 | Transformer远不止一个模型,更提出了相应的训练框架,优化方法。 43 | ![](https://i.imgur.com/E4Gg1eB.png) 44 | 45 | 46 | #### 动机和实现的差异 47 | Transformer主要有两个优势,一是速度快,并行度高,二是可以轻易访问相距很远的节点,解决了CNN和RNN常提到的local,non-local问题。可反观Transformer的设计,其中不乏很多“多余”之举。下面通过几个小例子来看看这些设计会否真的“多余”。 48 | ```python= 49 | import torch 50 | import torch.nn as nn 51 | import tqdm 52 | import numpy as np 53 | 54 | BATCH_SIZE = 16 55 | D_MODEL = 256 56 | N_HEAD = 4 57 | N_LAYER = 6 58 | IN_LEN = 10 59 | IN_DIM = 50 60 | 61 | class Trans(nn.Module): 62 | def __init__(self): 63 | super(Trans, self).__init__() 64 | self.trans = nn.TransformerEncoder(nn.TransformerEncoderLayer(D_MODEL, N_HEAD), N_LAYER) 65 | self.in_fc = nn.Linear(IN_DIM*2, D_MODEL) 66 | self.out_fc = nn.Linear(D_MODEL, IN_DIM) 67 | 68 | def forward(self, x): 69 | h = self.in_fc(x) 70 | h = self.trans(h) 71 | y = self.out_fc(h) 72 | return y 73 | 74 | def run(model, test=False): 75 | model.train() 76 | losses = [] 77 | lr = 1e-3 78 | optimizer = torch.optim.Adam(model.parameters(), lr=lr) 79 | with tqdm.trange(1000) as tq: 80 | for i,_ in enumerate(tq): 81 | a = torch.randn((BATCH_SIZE, IN_LEN, IN_DIM)).cuda() 82 | b = torch.randn((BATCH_SIZE, IN_LEN, IN_DIM)).cuda() 83 | tar = (a+1)**2 + b 84 | y = model(torch.cat([a,b], -1)) 85 | loss = (0.5*(y-tar)**2).mean() 86 | model.zero_grad() 87 | if not test: 88 | loss.backward() 89 | optimizer.step() 90 | tq.set_postfix({'loss':loss.item()}) 91 | losses.append(loss.item()) 92 | if test: 93 | print('AVG Loss', np.mean(losses)) 94 | 95 | if __name__ == '__main__': 96 | model = Trans() 97 | model.cuda() 98 | run(model) 99 | run(model, True) 100 | 101 | ``` 102 | 103 | 104 | |Setting|MSE| 105 | |-|-| 106 | |lr=1e-3, no warm-up| 3.37| 107 | |lr=1e-4, no warm-up| 0.56| 108 | |lr=1e-5, no warm-up| 2.31| 109 | |lr=1e-3, 1% warm-up| 0.10| 110 | 111 | |Setting|MSE| 112 | |-|-| 113 | |default| 0.097| 114 | |xavier_uniform| 0.191| 115 | |xavier_normal| 0.189| 116 | |normal 0.02| 0.66| 117 | |normal 0.002| 2.95| 118 | |normal 0.1| 3.50| 119 | |uniform +-0.05| 3.50| 120 | |uniform +-0.01| 0.424| 121 | |uniform +-0.001| 3.44| 122 | |kaiming_uniform| 3.50| 123 | |kaiming_normal| 3.50| 124 | 125 | 126 | |Setting|MSE| 127 | |-|-| 128 | |kaiming_normal 2 layer| 0.524| 129 | |kaiming_uniform 2 layer| 0.531| 130 | |xavier_uniform 2 layer| 0.124| 131 | |default 2 layer| 0.092| 132 | |uniform +-0.01 2 layer| 0.117| 133 | 134 | |Setting|MSE| 135 | |-|-| 136 | |lr=1e-3, no warm-up 2 layer| 0.086| 137 | |lr=1e-4, no warm-up 2 layer | 0.614| 138 | 139 | |Setting|MSE| 140 | |-|-| 141 | |lr=1e-3, no warm-up batch_size 64| 0.037| 142 | 143 | ### 为什么Transformer不好训练 144 | 145 | - 初值问题,Transformer初始倾向于bag of words,CNN倾向于N-gram,RNN倾向于moving average 146 | - 太自由,Transformer的解空间(严格说是比较探索到的解空间)比RNN和CNN要大,范围越大,搜索难度越高。 147 | ## 预告: 148 | # 经典模型及算法导览 (一) 149 | ### Variational Auto Encoder(VAE) 150 | -------------------------------------------------------------------------------- /2020-10-29.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-10-29 2 | = 3 | 4 | # 经典模型及算法导览 (一) 5 | ## Variational Auto Encoder(VAE) 6 | 7 | VAE是一个我个人很喜欢的生成模型,我认为在很多方面它都是优于GAN和Normalizing flow的,但本次我们不深入这个话题。以VAE本身的推导和介绍为主。 8 | 9 | 首先,与所有生成模型一样,VAE试图找到一种方式来建模$P(X)$,即数据分布,更具体来讲,我们希望找到一种方式,可以不停的从$P(X)$采样出数据点。而VAE是通过分布变换来实现这样一点的,分布变换指的是从一个分布中采样得到一个样本$z$,通过一个确定性函数$f(\cdot)$可以把$z$映射到另一分布。这种采样方法也称之为逆变换采样。 10 | 11 | ### 逆变换采样 12 | 对一个随机变量X,它的累计分布函数, 13 | $$F(x)=P(X\leq x)=\int_{-\inf}^x p(x) dx $$ 14 | 假如存在严格单调递增函数$T: [0,1] \rightarrow R$,我们可以把0,1间的均匀分布$U$映射到实数轴上,让$T(U)=X$,所以, 15 | $$F(x)=P(X\leq x)=P(T(U)\leq x)=P(U\leq T^{-1}(x))$$ 16 | 又因为$U$的累计分布在0,1区间就是$F(u)=u$,所以上式变为$F(x)=T^{-1}(x)$,可推出$F^{-1}(u) = T(u)$,即$F^{-1}(u)=x$ 17 | 所以我们可以通过从均匀分布采样来得到任意分布的采样点。 18 | 19 | VAE的目标就是通过auto encoder的形式,找到这个映射函数。 20 | 21 | ### VAE推导方法1 22 | 23 | \begin{align} 24 | \log P(x) =& \log \sum_z P(x,z) \\ 25 | =& \log \sum_z P(x,z) \frac{Q(z|x)}{Q(z|x)} \\ 26 | =& \log \sum_z Q(z|x) \frac{P(x|z) P(z)}{Q(z|x)} \\ 27 | =& \log \mathbb{E}\_{z \sim Q(z|x)} \frac{P(x|z) P(z)}{Q(z|x)} \\ 28 | \geq& \mathbb{E}\_{z \sim Q(z|x)} \log \frac{P(x|z) P(z)}{Q(z|x)} \\ 29 | \geq& \mathbb{E}\_{z \sim Q(z|x)} [\log P(x|z) + \log P(z) -\log Q(z|x)] \\ 30 | \geq& \mathbb{E}\_{z \sim Q(z|x)} \log P(x|z) - \mathrm{KL}(Q(z|x)||P(z)) 31 | \end{align} 32 | 33 | 我们可以发现Q(z|x)可以被替换成任意分布,但它的影响是什么呢? 34 | 35 | ### VAE推导方法2 36 | \begin{align} 37 | \mathrm{KL}(Q(z|x)||P(z|x)) =& \mathbb{E}\_{z \sim Q(z|x)} [\log Q(z|x) - \log P(z|x)] \\ 38 | =& \mathbb{E}\_{z \sim Q(z|x)} [\log Q(z|x) - \log P(x|z) - \log P(z) + \log P(x)] \\ 39 | =& -\mathbb{E}\_{z \sim Q(z|x)} \log P(x|z) + \mathrm{KL}(Q(z|x)||P(z)) + \log P(x) \\ 40 | \log P(x) =& \mathrm{KL}(Q(z|x)||P(z|x)) + \mathbb{E}\_{z \sim Q(z|x)} \log P(x|z) - \mathrm{KL}(Q(z|x)||P(z)) \\ 41 | \log P(x) \geq& \mathbb{E}\_{z \sim Q(z|x)} \log P(x|z) - \mathrm{KL}(Q(z|x)||P(z)) 42 | \end{align} 43 | 44 | 由第二种方法可知,$\mathrm{KL}(Q(z|x)||P(z|x))$决定了VAE所求的ELBO和真实$P(x)$之间的差距,所以$Q$的选取是非常重要的。 45 | 46 | ### 先验分布 47 | 很多工作假设$P(z)$为标准正态分布,这个假设可以这样理解, 48 | $$P(z) \sim N(0,1), P(z)=\sum_x P(z,x)=\sum_x P(z|x)P(x)=\mathbb{E}\_x P(z|x) $$ 49 | 也就是说我们需要数据集所对应的z满足标准正态分布,而不是每一个样本点。 50 | 另外P(z)可以任意选择,甚至是带参数,可学习的。 51 | 52 | ### mini-batch 53 | 上述推导中没有涉及数据集的问题,实际上,我们要求的不是 $\max P(x)$而是$\max \frac{1}{N} \sum_x P(x)$. 54 | 所以相应的VAE目标为 55 | \begin{align} 56 | \max \quad & \frac{1}{N}\sum_x [\mathbb{E}\_{z \sim Q(z|x)} \log P(x|z) - \mathrm{KL}(Q(z|x)||P(z))] \\ 57 | \max \quad & \frac{1}{N}\sum_x \mathbb{E}\_{z \sim Q(z|x)} \log P(x|z) - \frac{1}{N}\sum_x \mathrm{KL}(Q(z|x)||P(z))] 58 | \end{align} 59 | 60 | 我们可以看到,当使用SGD方法时,对前后两项的估计可能误差是不一样的,所以当batch size很小时,会增加一个对KL项的额外系数,让其在整个epoch上和为1. 61 | 62 | ### VAE解释1 63 | VAE的第一种解释是噪声信道,Encoder $Q(z|x)$的输出会经过一个噪声信道,传递给 Decoder $P(x|z)$,而KL项决定了噪声的强弱。 64 | 65 | ### VAE解释2 66 | VAE追求最小表示,不论z的维度设定为多少,KL项会使model用尽量少的表达能力去传递信号。这等同于用最小的维度来传递信息,因为可以找到一种映射方法,让某一些维度尽量稳定来高效的传递信息,而让其他维度贴近噪声分布。 67 | 68 | ### 两种collapse 69 | 一是KL项太大,model完全不使用z,二是KL项太小,decoder退化 70 | 71 | ### CVAE 72 | $$\log P(x|c) \geq \mathbb{E}\_{z \sim Q(z|x)} \log P(x|c,z) - \mathrm{KL}(Q(z|x)||P(z|c))$$ 73 | 事实上,$P(z|c)$可以对于每个$c$都是标准正态分布,实际就退化为了$P(z)$ 74 | -------------------------------------------------------------------------------- /2020-11-12.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-11-12 2 | = 3 | 4 | # 经典模型及算法导览 (二) 5 | ## Generative Adversarial Network (GAN) 6 | 首先,GAN模型也是个生成模型,其目的是通过上次讲到的逆变换采样,把已知的噪声样本映射到数据样本,但不同于VAE,GAN通过一个博弈游戏来找到最合适的映射。简单来说,GAN设定了两个角色,一个是造假者,一个是审查者,造假者需要尽可能地骗过审查者,而审查者需要尽可能分辨真伪。而造假者就是我们最终要的生成器。具体形式如下 7 | 8 | $$ \mathrm{argmin}\_\theta \mathrm{argmax}\_\phi \mathbb{E}\_{z\sim P_{data}} \log D_\phi(z) + \mathbb{E}\_{z\sim P_\theta} \log (1-D_\phi(z)), \quad P_\theta(z) = P(z=G(z';\theta)),z'\sim N(0,1) $$ 9 | 其中G,D是两个模型,对应造假者和审查者。简单分析上式,不难发现D的最优取值是$\frac{P_{data}}{P_{data}+P_\theta}$。当D是唯一变量时,对原式求导即可得到。 10 | \begin{align} 11 | & \mathbb{E}\_{z\sim P_{data}} \log D(z) + \mathbb{E}\_{z\sim P_\theta} \log (1-D(z)) \\ 12 | = & \sum_z P_{data}(z) \log D(z) + P_\theta(z) \log (1-D(z)) \\ 13 | \nabla_{D(z)} = & P_{data}(z) \frac{1}{D(z)} + P_\theta(z)\frac{1}{1-D(z)} * (-1) = 0 \\ 14 | & P_{data}(z) \frac{1}{D(z)} = P_\theta(z) \frac{1}{1-D(z)} \\ 15 | & D(z) = \frac{P_{data}(z)}{P_{data}(z)+P_\theta(z)} 16 | \end{align} 17 | 18 | 此时,再将D的最优值代回原式,可得 19 | $$ \mathbb{E}\_{z\sim P_{data}} \log \frac{P_{data}}{P_{data}+P_\theta} + \mathbb{E}\_{z\sim P_\theta} \log (1-\frac{P_{data}}{P_{data}+P_\theta}) $$ 20 | 显然,$P_{data} = P_\theta$时,上式最大,为$-\log2-\log2 = -\log4$,我们之后在把原式减去$-\log4$得 21 | \begin{gather} 22 | \mathbb{E}\_{z\sim P_{data}} \log \frac{P_{data}}{P_{data}+P_\theta} + \mathbb{E}\_{z\sim P_\theta} \log (1-\frac{P_{data}}{P_{data}+P_\theta}) -(-\log4) \\ 23 | = \mathbb{E}\_{z\sim P_{data}} \log \frac{2P_{data}}{P_{data}+P_\theta} + \mathbb{E}\_{z\sim P_\theta} \log (\frac{2P_\theta}{P_{data}+P_\theta}) \\ 24 | = \mathrm{KL}(P_{data}|\frac{P_{data}+P_\theta}{2})+\mathrm{KL}(P_\theta|\frac{P_{data}+P_\theta}{2}) \\ 25 | = 2\mathrm{JSD}(P_{data}||P_\theta) 26 | \end{gather} 27 | 所以最优的D其实是$2\mathrm{JSD}(P_{data}||P_\theta)-\log4$ 28 | 由此可以看出GAN为什么有效,它本质上拉近了数据分布和生成分布之间的JSD距离,这是非常合理的,也是生成模型的一大追求。但需要注意的是只有在D取最优值时,它才度量了JSD距离,如果不是最优,没有任何保证。所以GAN的收敛性也是假定每步D先收敛到最优,G再收敛,如此迭代直到二者平衡。在实际中,我们也要保证D的学习略快于G,才能提供良好的学习信号。 29 | 30 | GAN的基本知识我们讲完了,下面讲GAN在文本生成中的用途。 31 | ## Auto regressive model 32 | 自回归模型是序列生成的标配,但不是唯一选择,近年来,非自回归的方法层出不穷,但两种思路各有利弊。自回归本质是链式分解,即$P(x_0,x_1,\cdots,x_{n-1})= x_0 \prod_i P(x_i|x_{ 41 | #include 42 | #include 43 | #include 44 | namespace { 45 | // (b, n, 1) * (b, m, 1) = (b, n, m) n>m 46 | template 47 | __global__ void op_kernel(const scalar_t* __restrict__ A, const scalar_t* __restrict__ B, scalar_t* __restrict__ C, const int b, const int n, const int m) { 48 | int i = blockIdx.x; 49 | int tx = threadIdx.x; 50 | int ty = threadIdx.y; 51 | 52 | for (int j=i; j<<>>( 78 | A.data_ptr(), 79 | B.data_ptr(), 80 | y.data_ptr(), 81 | b, n, m); 82 | })); 83 | 84 | return y; 85 | } 86 | 87 | ``` 88 | 89 | ```=c++ 90 | #include 91 | #include 92 | #define CHECK_CUDA(x) AT_ASSERTM(x.type().is_cuda(),#x "must be a CUDA tensor") 93 | #define CHECK_CONTIGUOUS(x) AT_ASSERTM(x.is_contiguous(), #x "must be contiguous") 94 | #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) 95 | 96 | torch::Tensor op_cuda(const torch::Tensor&A,const torch::Tensor&B); 97 | 98 | torch::Tensor op(const torch::Tensor&A,const torch::Tensor&B){ 99 | CHECK_INPUT(A); 100 | CHECK_INPUT(B); 101 | return op_cuda(A,B); 102 | } 103 | 104 | 105 | 106 | 107 | PYBIND11_MODULE(TORCH_EXTENSION_NAME,m){ 108 | m.def("demo_op",&op,"A demo"); 109 | 110 | } 111 | 112 | ``` 113 | ```=python 114 | import torch 115 | from torch.autograd import Function 116 | import demo_op 117 | import time 118 | class DEMOfunc(Function): 119 | @staticmethod 120 | def forward(ctx, A, B): 121 | with torch.no_grad(): 122 | outs = demo_op.demo_op(A, B) 123 | ctx.save_for_backward(A, B) 124 | return outs 125 | 126 | @staticmethod 127 | def backward(ctx, grad): 128 | with torch.no_grad(): 129 | A, B = ctx.saved_variables 130 | dA = torch.matmul(grad, B[:,:,None]) 131 | dB = torch.matmul(grad.permute(0, 2,1), A[:,:,None]) 132 | return dA[:,:,0], dB[:,:,0] 133 | 134 | Fop = DEMOfunc.apply 135 | 136 | if __name__=='__main__': 137 | b, N, M = 50, 200, 300 138 | A = torch.randn(b, N).double().cuda() 139 | A.requires_grad=True 140 | A1 = A.clone().detach() 141 | A1.requires_grad=True 142 | B = torch.randn(b, M).double().cuda() 143 | B.requires_grad=True 144 | B1 = B.clone().detach() 145 | B1.requires_grad=True 146 | C = torch.matmul(A[:,:,None], B[:,None,:]) 147 | D = Fop(A1, B1) 148 | print('Forward Check') 149 | torch.allclose(C,D,1e-5) 150 | loss = torch.sum(C) 151 | loss1 = torch.sum(D) 152 | loss.backward() 153 | loss1.backward() 154 | print('Backward Check') 155 | torch.allclose(A.grad, A1.grad, 1e-5) 156 | torch.allclose(B.grad, B1.grad, 1e-5) 157 | 158 | baseline = [] 159 | TT = 1000 160 | for i in range(TT): 161 | if i>5: 162 | A = torch.randn(b, N).cuda() 163 | B = torch.randn(b, M).cuda() 164 | torch.cuda.synchronize() 165 | st = time.time() 166 | C = torch.matmul(A[:,:,None], B[:,None,:]) 167 | torch.cuda.synchronize() 168 | baseline.append(time.time()-st) 169 | print('Baseline', sum(baseline), sum(baseline)/TT) 170 | 171 | ours = [] 172 | TT = 1000 173 | for i in range(TT): 174 | if i>5: 175 | A = torch.randn(b, N).cuda() 176 | B = torch.randn(b, M).cuda() 177 | torch.cuda.synchronize() 178 | st = time.time() 179 | C = Fop(A1, B1) 180 | torch.cuda.synchronize() 181 | ours.append(time.time()-st) 182 | print('Ours', sum(ours), sum(ours)/TT) 183 | 184 | ``` 185 | 186 | ```=python 187 | from setuptools import setup 188 | from torch.utils.cpp_extension import BuildExtension, CUDAExtension 189 | setup( 190 | name='demo_op', 191 | version="0.0.0", 192 | ext_modules=[ 193 | CUDAExtension( 194 | 'demo_op',[ 195 | 'demo1.cpp', 196 | 'demo.cu', 197 | ] 198 | ), 199 | ], 200 | cmdclass={ 201 | 'build_ext': BuildExtension.with_options(use_ninja=False) 202 | } 203 | ) 204 | 205 | ``` 206 | -------------------------------------------------------------------------------- /2020-12-02.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-12-02 2 | = 3 | 4 | # 经典模型及算法导览 (四) 5 | ## Meta Learning 浅谈 6 | Meta Learning 本身的概念很大,设计的方法和工作也很多,这里只做一些简单的探讨,狭义地理解meta learning,主要讨论 7 | Model-Agnostic Meta-Learning (MAML)相关的方法。 8 | 9 | 网上教程很多,可参考 10 | https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html 11 | https://www.facebook.com/icml.imls/videos/400619163874853/ 12 | 13 | ### Meta Learning的目标是什么? 14 | 比较通俗的解释的是,如果一般的学习任务是找到解决实际问题的方法,那meta-learning的目标是找到一套好的学习方法,也就是我们从小听到大的辅导班广告语,好的学习方法可以让我们成绩提高,花的时间还少。但需要指出的是,实际上大部分meta-learning的方法都比这一解释要局限的多,说他们是在寻找最好的学习方法通常是不准确的。 15 | 16 | 以MAML为例,他实际上是寻找最好迁移的网络初始化参数,问题定义比我们上面说的找学习方法要小很多,其他方法也类似。 17 | 18 | 另一个比较含糊的问题是,meta-learning是不是需要涉及泛化性,或者是否要考量在多个数据集上的表现。这个问题其实不太好回答,MAML相关的,以及很多meta-learning的方法都把多个数据集写入了他们的问题定义,但有一些工作,比如可学习的优化器(learning to learn)就是只考虑一个数据集的。 19 | 20 | 上述内容有些抽象,下面我们主要介绍两个工作 21 | 22 | ### Learning to learn by gradient descent by gradient descent 23 | Learning to learn 的 motivation非常直白,在我们训练一个神经网的时候都会用优化器,比如SGD,Adam,RMSprop等,那么优化器本身可不可以学习?这系列的工作就是要学习一个好的优化器(通常是一个以gradient为输入的小网络),学习一个好的优化器和我们说的找到一个好的学习方法非常相关,我个人也认为这个系列是很符合meta-learning精神的。 24 | 25 | 稍微具体些,参数的更新过程通常为 26 | 27 | \begin{align} 28 | \theta_{t+1} = \theta_t -\alpha \nabla L(D;\theta_t), 29 | \end{align} 30 | $D$是数据,$\alpha$是学习率,$L$是误差函数,$\theta$是参数 31 | 而Learning to learn把这个流程修改为 32 | \begin{align} 33 | \theta_{t+1} = \theta_t -\alpha g(\nabla L(D;\theta_t);\phi), 34 | \end{align} 35 | 这里$g$和$\phi$就是要学习的优化器和它的参数。 36 | 其实这类方法的思路就是这么简单,剩下的问题就是如何设计这个函数$g$,这里只做大概的介绍,就是用一个LSTM来接受每一步的gradient,然后再生成真正的更新量。另外这里通常会做 优化器与被优化参数无关的假设,即优化器不应该随网络参数不同而采取不同策略。这样可以减少高阶导的计算。当然,这类的工作trick很多,感兴趣的同学可以研究。 37 | ![](https://i.imgur.com/Z2k5EFW.png) 38 | 39 | 40 | ### Model-Agnostic Meta-Learning (MAML) 41 | MAML的思想就是让以目前参数初始化,finetune之后的模型表现最优。换言之,不是让模型当前状态最好,而是让模型走两步之后效果最好。 42 | ![](https://i.imgur.com/Qc1Pz2t.png) 43 | 44 | 45 | 这类算法基本都采用二级结构,内层模拟在每个任务上学习,外层负责更新meta参数。 46 | ![](https://i.imgur.com/fxsuHNB.png) 47 | 48 | 但是,实际上MAML不是这么用的,通常要结合few-shot的场景 49 | ![](https://i.imgur.com/uAGSGJH.png) 50 | 51 | 那么MAML怎么变到这一步的呢?实际上从MAML本身过不来。。。 需要另一篇文章,https://arxiv.org/pdf/1606.04080.pdf 52 | 53 | 54 | 另外,很多时候人们都会采用MAML的一阶近似,即不求二阶导,理论上这样不好,但实际有些时候,只用一阶信息比二阶信息还要好。这其实会牵涉很多方面的原因,一个比较简单的原因就是神经网络对修改量比较敏感,通常不能承受很大的修改量,而二阶项会比一阶项更难以控制,更容易爆炸或弥散。 55 | -------------------------------------------------------------------------------- /2020-12-10.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-12-10 2 | = 3 | 4 | # 经典模型及算法导览 (五) 5 | ## 编码方法:字,词,subword的异同 6 | 7 | 在NLP领域中有多种不同的输入层级,字符 character, 词 word, 和subword,这三种方法是最常用的输入方式,他们实际上可以表达同样的句子和语义,对人来说并无特殊含义与区别,但对机器来说,确实很不一样。正如我们在第一次分享中提到的,我们需要把输入元素转换成数值,把语义理解转换成数值计算。而不同的粒度输入对此很有影响。 8 | 9 | ### Embedding 10 | 我们首先需要复习一下Embedding这一概念,把一个离散的输入元素代换成一个(一组)数值,这就是embedding,他的名字来自于把一个离散点嵌入到连续空间中。Embedding背后的理论认为,任何输入元素之间的交互可以被基于对他们的连续表示的进一步运算所替代。而不同的输入粒度会导致不同的语义理解过程,比如在词级别,“你好”是一个整体,“你好”的含义与“你”和“好”无关,而在字级别,“你好”就等于“你”和“好”经过某种运算。同理,“麦克风”等于“麦”,“克”,“风”经过某种运算得到。 11 | 12 | ### 字典的拓展性问题 13 | 字典本质上还是一个静态的表格,它的内容是固定的,不能处理未知项,比如训练时只看过英文字母,那就无法处理中文。同样的,如果我们把字典定在词级别,那么它能处理的词就是固定数量的,无法应对新词,比如新出现的流行语或网络用语。这类问题通常被称为Out-of-vocabulary(OOV),是一个长期被关注的问题。 14 | 15 | ### 字词之争 16 | 对于字级别还是词级别比较好这个问题,其实有过一些争论,从语义组成的复杂性来讲,词级别更好,表达得更准,但从拓展性来讲,显然字级别更好,覆盖的面更大。此外,还有一个重要因素就是用字或词表示序列,会让序列长度有很大变化,比如英文单词平均有5个多字母组成。 17 | 18 | https://arxiv.org/pdf/1508.06615.pdf 19 | 20 | ![](https://i.imgur.com/rw8NEe1.png) 21 | 22 | ![](https://i.imgur.com/f7D4odG.png) 23 | 24 | ### Subword 25 | 字和词各有优劣,所以后来人们把目光投向了一个折中的方案,subword,即把一串字母作为一个单元。而如何构造它们则需要用到编码学的知识。目前主流构造subword的算法实际上是借用了压缩算法,即如何用尽量少的subword让语料库压缩的最多。不同于哈夫曼编码,我们认为每一个编码后的元素是等长的,并且压缩过程是一个替换过程,把原文中一部分连续的字符串替换成一个新的字符,以达到长度缩减的目的。在这种条件下,Byte Pair Encoding (BPE)便是一种比较合适的解法,简而言之,BPE是一个迭代,贪心的算法,每次迭代选取一个最高频的字符对(相邻的两个字符),把它替换成一个新的字符,如此反复,直到达到指定的合并次数。 26 | 27 | https://en.wikipedia.org/wiki/Byte_pair_encoding 28 | 29 | 但需要注意的是,BPE在英文,或西方语言中是不跨空格合并的,也就是合并只在一个单词中进行,第二是BPE既包含character也包含word,很多时候覆盖了大部分常用词,所以和word level是等效的。 30 | 31 | 32 | ### Unigram language model (ULM) 33 | 34 | https://www.aclweb.org/anthology/P18-1007.pdf 35 | 36 | ULM认为一句话,或者一个字符串的概率等于个元素概率的乘积,即假设各元素出现时独立的,所以有 37 | \begin{align} 38 | P(w_1,w_2,\cdots,w_N)=\prod_i^NP(w_i) \\ 39 | P(w_1,w_2,\cdots,w_N)=\prod_i^M P(m_i) 40 | \end{align} 41 | 实际求解中,预设出众多候选字符串 $m$,在整个语料上,迭代求解对每句话的切分方案和每个$P(m)$。然后用leave one out的方式求出去掉每一个$m$的代价,以此排序,缩小词表,如此反复,直到词表足够小。 42 | 43 | ### BPE dropout 44 | 非常简单,以概率删掉一些BPE中的合并规则。 45 | -------------------------------------------------------------------------------- /2020-12-16.md: -------------------------------------------------------------------------------- 1 | 讨论 2020-12-16 2 | = 3 | 4 | # 经典模型及算法导览 (六) 5 | ## 监督学习,半监督,弱监督,无监督,强化学习 6 | 7 | 机器学习中有很多不同的场景,而其中比较常见的分类方法是根据数据标注情况来的: 8 | - 监督学习:训练集中所有数据都带有人工标注 9 | - 半监督:训练集中部分数据带有人工标注 10 | - 弱监督:训练集中所有数据都带有人工标注,但标注内容与任务所需有差别,比如要求检测一张图片中的所有物体,但标注只标出了一个 11 | - 无监督:训练集中所有数据都不带人工标注,由人设计的规则得到的标注不算人工标注 12 | - 强化学习:强化学习所采用的的监督信号与上述都有差异,一般认为强化学习没有固定的训练集,而是不停与环境交互,得到反馈 13 | 14 | ### 监督学习 15 | 监督学习是最常用,但也是成本最高的,大部分机器学习都适用于监督学习的场景,也是最容易接近实际任务需求的。 16 | 17 | ### 半监督学习 18 | 半监督指的是有一部分标注数据,但同时也有一部分无标注数据,比如在翻译中,有中英对照的译文(标注数据)也有单纯的中文语料库(无标注数据)。又或者,需要从照片中识别物体,有一部分是有人工标注出哪些位置有什么物体的(标注数据),而另一部分是单纯的图像(无标注数据)。这些都属于典型的半监督学习。 19 | 当然,还有一些更为的特殊的场景,比如二类分类问题中,只有正样本。也就是Positive Unlabel (PU) Learning,需要相应的算法来应对。 20 | 21 | ### 弱监督学习 22 | 弱监督,即指标注数据不是任务所需的,比如让找东西,结果标注只是在哪个附近。或者给质量打分(10分制),但标注是优良中差。简单来说,弱监督的特点是答非所问,但也有点联系。我个人认为,distant learning也属于这一范畴。 23 | 24 | ### 无监督学习 25 | 无监督,即没有人工标注,但不是没有标注,我们同样需要label和监督信号,只不过他不是人工提供的。所以“无监督”指的是“无人工监督”而不是没有监督。所以只要是不需借助人工就可以提供标注的方法都是无监督学习。像Auto encoder,Language model 都属于无监督学习,他们的label可以从数据本身推测得到,而不需任何人工参与。当然,无监督的界定也有模糊的时候,比如借助人工编写的规则,在网上自动爬取数据,算不算无监督?这其实不好说,大家标准不一样,主要看人工编写的规则是不是很复杂,是不是通用,包含了多少知识等。 26 | 27 | ### 强化学习 28 | 强化学习没有固定的训练集这一概念,他给了模型一个可以交互的环境,模型做任何事情都会从环境中获得相应的反馈,而这些反馈就是监督信号。交互与自由探索是强化学习的特色。 29 | https://cs.stanford.edu/people/karpathy/convnetjs/demo/rldemo.html 30 | 31 | ### 半监督学习范式 32 | 半监督学习大部分都遵循几种范式 33 | - 无标注数据上的预训练+有标注数据上的监督学习 34 | - 无监督与有监督的多任务学习 35 | - 有监督学习预热,再无监督学习 36 | 37 | ### 弱监督学习范式 38 | 弱监督学习范围很广,每种场景的处理方法都不同,这里指介绍两种常见的 39 | - 标注不完整 40 | - 标注粒度不对 41 | - 标注有噪声 42 | 43 | ## 预告 44 | ### Distant learning 45 | 46 | ### PU learning 47 | 48 | ### Learning with noise 49 | -------------------------------------------------------------------------------- /2021-01-07.md: -------------------------------------------------------------------------------- 1 | 讨论 2021-01-07 2 | = 3 | 4 | # 经典模型及算法导览 (七) 5 | ## 弱监督学习:从distant learning到PU learning 6 | 7 | ### 取之不尽的数据 8 | 目前深度学习高度依赖于数据,而高质量的标注数据往往需要高昂的成本,数据规模十分受限。所以研究者们放眼于一种新的数据获取方式,即通过一定规则和知识,自动的收集数据。这种方法可以廉价地,大量地收集数据,但随之而来的问题也十分明显,数据的标注可能有误,并且采集到的数据分布可能与真实数据分布不一致。 9 | 10 | ### distant learning 11 | 不同于无监督学习中随意抓取数据,distant learning通常需要人为提供的一些知识,比如在知识抽取领域中的著名假设,假设一句话中出现了两个特定的实体,这句话大概率体现了他们之间的关系。即给定三元组 (e1,r,e2),如果一句话包含e1,e2,则一定体现了r。 12 | 13 | |Relation name |Size |Example| 14 | |-|-|-| 15 | |/people/person/nationality |281,107 |John Dugard, South Africa| 16 | |/location/location/contains| 253,223| Belgium, Nijlen| 17 | |/people/person/profession| 208,888| Dusa McDuff, Mathematician| 18 | |/people/person/place of birth |105,799| Edwin Hubble, Marshfield| 19 | |/dining/restaurant/cuisine |86,213| MacAyo’s Mexican Kitchen, Mexican| 20 | |/business/business chain/location |66,529| Apple Inc., Apple Inc., South Park, NC| 21 | 22 | 又或者在NER,entity linking等任务中,我们通过字典筛选出一部分数据,这些标注很大概率是有缺失的,比如只能找到一些有名的地方和人物,但知名度较低的就会错过。 23 | 24 | 这也就引出了两个问题 25 | - 数据标注有噪声 26 | - 数据标注有缺失 27 | 28 | 这两个问题分别对应了 Learning with noise 和 Positive-Unlabeled Learning 两个方向。 29 | 30 | ### Learning with noise 31 | 首先我们要理解一个问题是什么是噪声抗性。它的定义是无噪声情况的最优解一定是有噪声情况下的最优解。也就是我们通过学习有噪声的样本可以找到无噪声的最优解,这是至关重要的性质,否则我们是在求解优化另一问题,而不是原问题。 32 | 函数f在loss L下的风险为$$R_L(f) = E_{x,y^*} L(f(x), y^*)$$ 33 | 另外噪声概率为n,共k类 34 | 假设有$$\sum_i^k L(f(x),i)=C$$,C为常数 35 | \begin{align} 36 | R^n_L(f) =& E_{x,y} L(f(x), y) \\ 37 | =& \sum_x \sum_y P(x,y) L(f(x), y) \\ 38 | =& \sum_x \sum_y \sum_{y^*} P(x,y,y^*) L(f(x),y)\\ 39 | =& \sum_x \sum_y \sum_{y^*} P(x) P(y^*|x) P(y|x,y^*) L(f(x),y) \\ 40 | =& \sum_x \sum_{y^*} P(x) P(y^*|x) [(1-n) L(f(x),y^*) + \frac{n}{k-1} \sum_{i,i\neq y*} L(f(x),i)] \\ 41 | =& \sum_{x,y^*} P(x,y^*) [(1-n) L(f(x),y^*) + \frac{n}{k-1} \sum_{i,i\neq y*} L(f(x),i)] \\ 42 | =& (1-n) R_L(f) + \frac{n}{k-1} (C-R_L(f)) \\ 43 | =& \frac{Cn}{k-1} + (1-\frac{nk}{k-1}) R_L(f) \\ 44 | \end{align} 45 | 46 | 那么无噪声的最优解$f^*$和任意解$f$在噪声数据上有 47 | $$R^n_L(f^*)-R^n_L(f) = (1-\frac{nk}{k-1})(R_L(f^*)-R_L(f)) $$ 48 | 所以$n<\frac{k-1}{k}$时,上式小于等于0,即无噪声最优解还是噪声数据上的最优解。 49 | 50 | 总loss为常数这一设定其实很好满足,对任意loss进行归一化即可,但原始的cross entropy不满足。 51 | 52 | 大家也可以尝试用CE推导,其他工作有提及CE是不能保证有噪声抗性的,即不一定满足无噪声最优还是有噪声最优。 53 | 54 | 不过,抗噪声的loss经常学习效率不高,一种最近提出的解释是这类loss通常可以再只少量提高或不提高正确类别置信的情况下减小一定量的loss 55 | 56 | 57 | ### Positive-Unlabeled Learning 58 | PU learning 有很多不同的方法和思路,同时也会借助各种各样的假设。这里只提及一种比较简单的方法,同时其假设是事先知道正负样本的比例。假设正负比例为$\pi_p : \pi_n$,我们可以把具有正负类样本的经验风险$R_{pn}$改写成只有正样本的经验风险$R_{pu}$,从而得到正确的loss形式。 59 | \begin{gather} 60 | R^-_p(f) = E_{x_p} L(f(x_p), -1) \\ 61 | R^+_p(f) = E_{x_p} L(f(x_p), 1) \\ 62 | R_{pn}(f) = \pi_p R^+_p(f) + \pi_n R^-_n(f) \\ 63 | \pi_n p_n (x) = p(x)-\pi_p p_p(x) \\ 64 | R_{pu} = \pi_p R^+_p (f)- \pi_p R^-_p(f) + R^-_u(f) 65 | \end{gather} 66 | 67 | ### 小结 68 | 如果样本噪声强度不高,可以采用learning with noise的方法,如果噪声强度实在太高,可以退化为PU learning问题。这两者本质是都是不可解的问题,所以一定需要某种程度上的假设,对数据本身的理解和估计才是根本问题,如果在数据上采用了不合适的假设,效果必然有限。 69 | -------------------------------------------------------------------------------- /2021-04-06.md: -------------------------------------------------------------------------------- 1 | 讨论 2021-04-06 2 | = 3 | 4 | ## 前言 5 | 6 | 欢迎各位同学的参与,本学期的分享将围绕几个小专题展开,每个专题对应一种方法论,比如Cycle-consistency、Contrastive Learning等。每个专题除了介绍基础概念和一些已有工作外,也将给出一些个人见解和一些可做的idea,欢迎感兴趣的同学尝试。 7 | 8 | # Cycle-consistency 9 | 10 | 为方便起见,我们将Cycle-consistency译为环形一致性,该方法的基本思想是跨模态的自编码器,即把原始输入经过一个环之后再次复原。假如有两个数据分布$X$和$Y$,环形一致性即指$X \rightarrow Y \rightarrow X$和$Y \rightarrow X \rightarrow Y$,这里面的$X,Y$指两个没有交集或交集足够小的数据分布,比如文本和图像,知识图谱和文本,中文和英文等。 11 | 12 | ## 基本形式 13 | 14 | \begin{gather} 15 | f : X \rightarrow Y, \quad g: Y \rightarrow X, \\ 16 | L_{X2X} = \mathbb{E}_{x \sim X} D(g(f(x)), x), \\ 17 | L_{Y2Y} = \mathbb{E}_{y \sim Y} D(f(g(y)), y), \\ 18 | \end{gather} 19 | 20 | 其中$D$为度量函数,可为交叉熵,欧式距离等。 21 | 22 | 需要注意的是环形一致性通常需要两个环同时存在,在没有附加条件下,只取一个是有问题的。 23 | 24 | 可以看出如果把两个数据分布中的一个换为隐变量并只取一个环,那么环形一致性方法就退化为了自编码器。 25 | 26 | ## 理论问题 27 | * 环形一致性有无穷解,无法保证优化目标有意义 28 | * 如果保证$f,g$是对应空间的映射函数 29 | * 必须存在一组互为可逆函数的$f,g$,优化过程才可能收敛到有价值的固定点,即两个空间存在一一对应关系 30 | * 环形一致性的可解性依赖于数据分布存在低维流形的假设 31 | 32 | ### 无穷解问题 33 | 假设$X$的样本点有A,B,C,$Y$的样本点有1,2,3,那么存在多种$f,g$都可以满足环形一致性。当两个空间连续时,就存在无穷多种$f,g$满足环形一致性。如何保证二者是有意义的便成为了一个重要的研究问题,目前主流方法可分为融合先验知识法和辅助任务法。前者指设计特定的模型结构,让其初值或解空间具备某种物理意义。后者则利用预训练或辅助任务,先训练模型参数,让其参数有一定意义。 34 | 35 | 这里简单介绍下辅助任务的方法,因为融合先验知识的方法需要因地制宜,结合不同任务有不同处理方式。 36 | 37 | [Denoising Autoencoder](https://openreview.net/pdf?id=rkYTTf-AZ) 38 | 噪声自编码器即在输入信号中加入噪声干扰,再让模型复原完整信号。在环形学习的过程中,模型需要接受另一模型生成的伪造样本,该方法认为伪造样本和带噪声样本之间存在一定关联性,让模型熟悉带噪声样本有助于处理伪造样本。同时,噪声自编码器也可以让模型具备良好的初始状态。当然,这种方法其实只适用于两种数据分布是同构的情况,比如中文和英文,如果是图像和文字,这种方法会有一定的问题。 39 | 40 | ![](https://i.imgur.com/80Xc04S.jpg) 41 | 42 | 43 | [MASS](https://arxiv.org/pdf/1905.02450.pdf) 44 | 专为无监督机器翻译设计的预训练任务,利用mask来模拟翻译的过程,即参照原文生成新的文字。 45 | ![](https://i.imgur.com/hBGGcph.png) 46 | 47 | [adversarial training](https://openreview.net/pdf?id=rkYTTf-AZ) 48 | ![](https://i.imgur.com/VRuqIbf.png) 49 | ### 输出空间合法性 50 | 环形一致性要求$f,g$两个函数可以把数据点从一个空间映射到另一个空间,但实际使用中,由于二者都是带参数的模型,很难保证它们是合法映射,即$f(x)$不一定在$Y$空间中,反之$g(y)$也不一定在$X$空间中。如果发生这种情况,那么环形一致性就变得无意义,因为可以有$f(x)=x,g(y)=y$这样的解存在。 51 | 52 | 同样的,我们可以引入先验知识,从模型结构角度限制输出空间。不过这类方法同样需要结合具体任务进行分析。 53 | 54 | 另一种做法是引入[adversarial training](https://arxiv.org/pdf/1703.10593.pdf),训练判别器来考察两个函数的输出点是否属于要求的空间。 55 | ![](https://i.imgur.com/YYlwSnn.png) 56 | 57 | 58 | 59 | 其实还有一种比较巧妙的方法来解决前两个问题,即通过self-training或其他方法构建弱监督信号,以此训练模型。弱监督的缺点是监督信号不够准确,但足以解决以上两个问题,而环形一致性又可以提供一个严格的优化目标,综合二者一般可以得到很好的效果。 60 | 61 | ### 双射假设 62 | 假如两个空间不存在一一对应关系,设想有$x_1 \rightarrow y_1,x_2 \rightarrow y_1$,那么$D(g(f(x_1)), x_1),D(g(f(x_2)), x_2)$互相矛盾,二者始终无法同时降为0,并且模型会收敛到$x_1,x_2$的某种中间点(视度量函数而定),这很有可能是错误的点,甚至不在$X$空间内。如果这类非一对一关系过多,会严重干扰到模型的正常训练过程。 63 | 64 | 为此,我们可以利用引入隐变量的方式来消除歧义,假定是一对多的情况,可以有 65 | \begin{gather} 66 | f : X \rightarrow Y, \quad g: Y \rightarrow X, \\ 67 | L_{X2X} = \mathbb{E}_{x \sim X} D(g(f(x), z), x), z \sim P(z|x) \\ 68 | L_{Y2Y} = \mathbb{E}_{y \sim Y} D(f(g(y, z)), y), z \sim N(0,1) \\ 69 | \end{gather} 70 | ![](https://i.imgur.com/QncLjok.png) 71 | 72 | ![](https://i.imgur.com/V95MkIb.png) 73 | ![](https://i.imgur.com/UDYkL4u.png) 74 | 75 | 76 | ### 低维流形假设 77 | 78 | 假设两个空间是文本和经过加密的文本,那么环形一致性就转变为了组合优化问题,求解复杂度极高。换言之,现行的环形学习都假设了两个数据分布都服从低维流形的控制,所以模型可以在可接受时间内找到双向对应关系。 79 | 80 | # 下次预告 81 | 82 | ## 相关工作 83 | 84 | ## 一些简单的idea 85 | -------------------------------------------------------------------------------- /2021-04-13.md: -------------------------------------------------------------------------------- 1 | 讨论 2021-04-13 2 | = 3 | 4 | ## 相关工作 5 | 6 | ### Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 7 | CycleGAN 是一篇非常有影响力的文章,原本场景设定在不同类型图像之间的转换,比如照片变油画或水彩风格,后来发展到线稿上色,图像超分辨率,医疗图像降噪等。之后还慢慢影响到了语音和自然语言领域。 8 | 9 | https://arxiv.org/pdf/1703.10593.pdf 10 | 11 | ![](https://i.imgur.com/qB9MlOM.jpg) 12 | 13 | 14 | CycleGAN除了上一讲提到的环形一致性外,还引入了两个对抗学习模块,分别负责约束生成的Y样本要与真实Y样本空间相近,生成的X样本要与真实X样本空间接近。 15 | ![](https://i.imgur.com/QVzVtFA.png) 16 | 17 | 图像领域对环形一致性的研究最深,但重构误差仍是肉眼可见的,个人认为这是因为图像的细节是无法被domain信息完全覆盖的,就好比同样是油画,每位画家都会有自己的风格,就是类型一样,细节仍有很多不确定性。这也就导致了环形一致性很难达到极致。语音信号同样有类似的问题,而自然语言恰恰是最有潜力的,因为其天然的离散性有效控制了细节的影响程度。 18 | ![](https://i.imgur.com/C0WoaVB.jpg) 19 | 20 | 21 | 22 | ### Curriculum CycleGAN for Textual Sentiment Domain Adaptation with Multiple Sources 23 | 24 | Low-resource 是自然语言处理中经久不衰的话题,这篇文章通过在特征空间的环形一致性,实现了从source feature domain到 target feature domain的迁移,从而把source domain的样本当做target domain来训练分类器,得到的分类器就可以直接用于target domain。这其中涉及到了重构误差,环形一致性,对抗学习,以及课程学习。 25 | https://arxiv.org/pdf/2011.08678.pdf 26 | 27 | ![](https://i.imgur.com/KenFUpK.png) 28 | 29 | ### CycleGAN-VC: Non-parallel Voice Conversion Using Cycle-Consistent Adversarial Networks 30 | 31 | 照搬CycleGAN实现人工合成语音和自然语音的转化,虽然创新性不强,但应用价值很大。 32 | https://www.eurasip.org/Proceedings/Eusipco/Eusipco2018/papers/1570438014.pdf 33 | 34 | 35 | ### Uncertainty-aware Generalized Adaptive CycleGAN 36 | 考虑了样本的分布,比如生成的样本和真实样本的概率性质。以图像为例,每个像素点是有不同的不确定性的,应把他们纳入到度量函数的考察范围中。在文本中也一样,应该考虑每个词的不确定性是不一样的。可以直接应用到无监督翻译中(个人不太推荐,创新点有点小) 37 | 38 | https://arxiv.org/pdf/2102.11747.pdf 39 | 40 | ![](https://i.imgur.com/8jrkGI1.png) 41 | 42 | ![](https://i.imgur.com/QdMSsFQ.png) 43 | 44 | 45 | 46 | ## 一些简单的idea 47 | 48 | ### distant supervision + cycle consistency 49 | 远程监督的最大挑战就是降噪,而环形一致性可以有效地筛选样本,以实现降噪目的。通过环形一致性打分(经过环形之后的重构误差),重构越好,说明二者匹配度越高。 50 | https://web.stanford.edu/~jurafsky/mintz.pdf 51 | 52 | https://arxiv.org/pdf/2103.15365.pdf 53 | 54 | 55 | ### unsupervised image caption 56 | 这一问题实际上是unpaired image text transformation,非常适合环形一致性,不过也有很多挑战,比如text$\rightarrow$image太难的问题,目前有借助scene-graph等方法。当然也可以借助我们上一讲提到的隐变量方法。 57 | 58 | https://ieeexplore.ieee.org/document/9362305 59 | 60 | https://arxiv.org/pdf/1903.10658.pdf 61 | -------------------------------------------------------------------------------- /2021-04-20.md: -------------------------------------------------------------------------------- 1 | 讨论2021-04-20 2 | = 3 | 4 | # Pre-training 第一讲 5 | 6 | ## 为什么需要预训练 7 | 预训练模型在各个深度学习领域中均大放异彩,取得了诸多成果,是近年来热度最高的方向之一。尽管预训练方法在大量任务上取得了显著的效果,但一个根本性的问题是为什么需要预训练模型,预训练过程对最终模型究竟产生了何种影响? 8 | 9 | 10 | 11 | 12 | ### 预训练作为正则项 13 | 首先,一种非常经典的观点是预训练可以视作一种正则约束,即模型参数在一定区域内不受惩罚,在其他区域受到惩罚,从而把模型参数约束在一个特定范围内。不论预训练的任务如何选取,其本质仍是一个优化问题,假如预训练和最终任务的定义域相同或者有很大交集,预训练的优化过程就把模型参数限定在了一个能取得很好的预训练误差的区域内。鉴于预训练任务通常是数据量很大,误差函数简单,可以认为其误差平面比较平滑,在这种条件下,假如后续训练信号强度不高时,模型很大概率在训练后仍在预训练误差较小的区域内。 14 | 15 | ### 半监督学习 16 | 17 | 另一种观点是把预训练和半监督学习联系到一起,比较经典的形式就是考虑 18 | $$P(X,Y|\theta)+P(X|\theta)$$ 19 | 即找寻同时满足联合概率和边际概率的参数$\theta$,在很多机器学习模型中,对$P(X|\theta)$的估计是有利于估计$P(Y|X;\theta)$或$P(X,Y|\theta)$的。比如朴素贝叶斯等。另一方面,对边际概率的估计至少不能干扰模型的学习(理想情况下),因为假如存在一个参数可以良好地建模联合概率,那么它同样可以描述边际概率。 20 | 21 | 当然,很多实验都证明了预训练或无监督对模型学习可能是有害的,这是因为我们设定的的模型空间中并不包含正确解。即最优化的$\theta^*$并不在我们的解空间中,在这种情况下,会差生两个误差项$e_l,e_u$前者代表有label时监督学习的误差,后者代表无监督或预训练的误差。当二者数据比例改变时,这两个误差项的占比也随之改变。所以会出现引入更多的无监督和预训练反而使模型变差的问题。 22 | 23 | ### 知识/关系迁移 24 | 除了上述的理论外,还有一种不同的观点,考虑以下例子,RoBERTa的训练集由以下几个部分组成 25 | - BOOKCORPUS plus English WIKIPEDIA. This is the original data used to train BERT. (16GB). 26 | - CC-NEWS, which we collected from the English portion of the CommonCrawl News dataset. The data contains 63 million English news articles crawled between September 2016 and February 2019. (76GB after filtering). 27 | - OPENWEBTEXT, an open-source recreation of the WebText corpus. The text is web content extracted from URLs shared on Reddit with at least three upvotes. (38GB). 28 | - STORIES, a dataset containing a subset of CommonCrawl data filtered to match the story-like style of Winograd schemas. (31GB). 29 | 30 | BookCorpus 31 | |\# of books| # of sentences| # of words| # of unique words mean| # of words per sentence median| # of words per sentence| 32 | |-|-|-|-|-|-| 33 | |11,038|74,004,228| 984,846,357| 1,316,420| 13| 11| 34 | 35 | For Winograd schemas, an example: 36 | The trophy doesn’t fit in the suitcase because it is too big. What is too big? 37 | Answer 0: the trophy. Answer 1: the suitcase 38 | 39 | 除了OPENWEBTEXT是从Reddit上抓取的之外,其他来源都比较清晰,并且OPENWEBTEXT也说明其滤掉了非英文页面,并作了tokenize。所以RoBERTa很大程度上是不了解代码,程序语言的。而下图中展示了其在代码搜索中的效果。可以看出,该模型仍有很大的作用,这是为什么? 40 | 41 | 其原因很难用上述两种思路解释,因为他们都认为预训练的数据和后续任务的数据是同分布或高度相关的。而这里显然程序语言和自然语言相差极大,为甚预训练依旧有效。一种可行的解释是套用迁移学习中关系迁移的概念,即样本之间的关系被迁移了而非样本本身被迁移。这种迁移被认为是无需i.i.d条件的。举例而言,自然语言中有“如果”,“假如”,“否则”等概念,而程序语言中有ifelse,他们的功能,或者说和其他元素的关系存在一定的共性。 42 | https://www.aclweb.org/anthology/2020.findings-emnlp.139.pdf 43 | 44 | ![](https://i.imgur.com/L2rXtuk.png) 45 | 46 | 47 | ![](https://i.imgur.com/VB1l0UO.png) 48 | 49 | 50 | ## 预训练的出发点 51 | 52 | ### P(X|$\theta$) 53 | 预训练的一个出发点就是估计数据分布本身,LM,MLM,DAE都属于此类。 54 | 这类方法的本质都是去估计数据分布或者获得$P(X|\theta)$的一部分功能,比如DAE不能直接给出概率估计,但它可以模拟临近采样,同样的,MLM也可以通过Gibbs采样的方式获得文本,但其不能直接给出数据点的概率,以此类推,XLNet,word2vec等各式各样的预训练信号都具备$P(X|\theta)$的一部分功能。 55 | 56 | ### 目标任务相关的辅助任务 57 | 另一大类则是设计与目标任务有关的辅助任务 58 | 59 | 其具体又可以分为几大类型 60 | 61 | #### 语义相关 62 | 比如利用同义词,复述等任务作为训练目标(比如借助WordNet)。这类任务的出发点是让模型理解语义,从而获得更强的语言理解能力 63 | 64 | #### 结构相关 65 | 比如利用“因为、所以”,“虽然、但是”等信息,构建一个判断句子之间关系的预训练任务,输入两句话,根据上述关键词,判断其是因果关系,递进关系,并列关系或转折关系等。显然这一预训练任务对NLI是很有帮助的。以此类推,同样也可以利用Syntax信息进行预训练。 66 | 67 | #### 上下文相关 68 | 还有一些预训练任务专注于让模型重视上下文信息,比如跳跃预测,即只给定较远的上下文信息而减少或去除近处的信息,迫使模型利用远处的上下文。 69 | 70 | ### 交互相关 71 | 此外,有些预训练方法强调交互性,比如机器翻译需要两句话交互,那预训练任务也会有相似的设计。 72 | 73 | # 下期预告 74 | 75 | ## 预训练与迁移学习 76 | 77 | ## 为什么需要fine-tune 78 | -------------------------------------------------------------------------------- /2021-05-11.md: -------------------------------------------------------------------------------- 1 | 讨论2021-05-11 2 | = 3 | 4 | # Pre-training 第二讲 5 | ## 预训练与迁移学习 6 | 7 | 迁移学习,顾名思义是把一个模型从一个地方迁移到另一个地方,而二者之间又存在着某种差异。对于监督学习来讲,一般可以做如下归类。假设模型输入为X,输出为Y,出发地为S,到达地为T,那么有五种差异,即$X_S$和$X_T$不同,即输入空间不同,比如中文和英文。$P(X_S)$和$P(X_T)$不同,即输入空间相同或高度重合,但分布不同,比如书面语言和口语。$Y_S$和$Y_T$不同,即输出空间不同,分好坏和分特性。$P(Y_S)$和$P(Y_T)$不同,即输出空间相同但分布不同,比如一边是好坏各半,另一边是90%好,10%坏。 $P(X_S, Y_S)$ $P(X_T, Y_T)$输入输出空间,边际概率都相同,但二者关系不同,比如有的人以胖为美,有的人以瘦为美,评价标准不同,但输入输出一样。迁移学习的目的就是寻找合适的迁移方法,让模型尽可能把学到的知识应用到目标问题。 8 | 9 | 假如我们的模型学习了如何分别以下四张图中的某一张,如何拓展到其他的三个? 10 | | | | 11 | |-|-| 12 | |![](https://i.imgur.com/afnlti1.png )|![](https://i.imgur.com/jUv9nMZ.png )| 13 | |![](https://i.imgur.com/m8mfzkS.jpg )|![](https://i.imgur.com/XIHNjDh.png ) 14 | 15 | ### 传统迁移学习 16 | 传统迁移学习一般分四类,即基于实体(instance-based), 基于特征(feature-based), 基于参数(parameter-based), 基于关系(relational-based)的迁移方法。我个人认为这四种方法可以通过数据和特征空间来解释,即我们面对两个空间,真实样本所在的数据空间和模型提取的特征所在的特征空间。想办法如何融合两地的数据空间,便是基于实体的方法,融合两地的特征空间,便是基于特征的方法。参数决定了数据到特征的映射函数,所以参数迁移实际是迁移了两地数据到特征空间的映射关系。关系则是多个实体或多个特征之间的联系,可以理解为迁移了两地的度量空间。 17 | 18 | ![](https://i.imgur.com/BfphUiK.png) 19 | 20 | ### 深度迁移学习 21 | 深度学习之后,由于模型的进步,训练数据的增大等多方面的因素,传统迁移学习的分类方法逐渐被淡化,转而出现一批深度迁移方法。主要分两类,一是领域适应,二是预训练。前者本质是拉近迁移双方的空间,可以是数据空间也可以是特征空间。具体方法可能是对抗学习,最小化分布间距离,比如MMD。而预训练方法又可以分为以下几类,fine-tune,增加额外模块后fine-tune,或直接使用。fine-tune即在目标训练集上二次训练,这一过程中可以调整全部参数,也可以保留一部分,增加一些额外的参数等。 22 | 23 | 此外,meta-learning同样属于一种预训练的方法。即如何让学习到的模型容易被迁移。 24 | 25 | ![](https://i.imgur.com/PzPKFOj.png) 26 | 27 | 28 | ### 如何保证迁移的有效性? 29 | 30 | 迁移学习中一个重要问题就是如何保证迁移是有效的,预训练也是同样的,为什么预训练可以在下游任务上取得效果,为什么是有帮助的?为此,我们需要考虑模型的哪些部分或能力是可以被迁移的,比如双方的输入空间是否一样,双方的输出空间是否有关,双方的联合概率是否有差异等。再根据差异对症下药,比如输入空间不同就可以用对抗学习,输出空间不同就可以引入额外参数,关系改变可以考虑只迁移部分参数。假如输入空间高度重合,但分布不同,这时可以采用重要性采样方法。 31 | 32 | ## 预告 33 | ### 预训练的局限和机遇 34 | 35 | -------------------------------------------------------------------------------- /2021-05-27.md: -------------------------------------------------------------------------------- 1 | 讨论2021-05-27 2 | = 3 | 4 | # Pre-training 第三讲 5 | 6 | # 预训练的局限和机遇 7 | 预训练模型发展的如火如荼,受到了大量的关注,也提供了非常多的科研机会。但其中一些关键的基本问题还尚未得到很好地解决。 8 | 9 | ## BERT到底会什么?不会什么? 10 | 以BERT为代表的预训练模型在众多任务上取得了优异的成绩,但BERT本身掌握了哪些知识还有待探索。已有不少工作聚焦于这一点,他们对BERT的各项特点进行了分析和探究,总结出了很多有价值的观点,其中典型的有以下几点: 11 | 12 | ### 字面信息 13 | 14 | 有一些经典的测试任务来检测一个模型对于语言现象的敏感程度,类似于unit test 15 | 16 | Surface Information: 17 | - SentLen: Number of words in a sentence 18 | - WC (Word Content): Presence or absence of a word 19 | 20 | 21 | Syntactic Information: 22 | - BShift (Bigram Shift): Sensitivity to legal word orders – i.e. swapping adjacent words 23 | - TreeDepth: Depth of hierarchical relationships in the sentence – longest path from node to leaf 24 | - TopConst (Top Constituents): Classify top constituents below root node 25 | 26 | Semantic Information: 27 | - Tense: Tense of main-clause verb 28 | - SubjNum (Subject Number): Number of the subject of the main clause 29 | - ObjNum (Object Number): Number of the object of the main clause 30 | - SOMO (Semantic Odd-Man-Out): Replace a random noun or verb with another that has comparable bigram frequency 31 | - CoordInv (Coordinate Inversion): Invert order of clauses in sentences containing two coordinate clauses. “They might be only memories, but I can still feel each one” -> “I can still feel each one, but they might only be memories” 32 | 33 | ![](https://i.imgur.com/EQKclki.png) 34 | 35 | ![](https://i.imgur.com/TPGiPIO.png) 36 | 37 | 可以看出,BERT尽在 Bshift 和 CoordInv两个测试中优于之前的方法,但需要注意的是BERT的综合实力很强并且是无监督的。同时,我们应该从几个方面看这些提高,首先WC和BShift这类提高和Attention机制应该关系不大,更多是来源是大规模训练数据和模型参数量。而CoordInv则是典型的需要长距离信息,这点上Transformer结构确实有它的优越性。 38 | 39 | https://www.aclweb.org/anthology/2020.tacl-1.54.pdf 40 | 41 | ## 不完整的Syntax 42 | 43 | 一些工作指出BERT不理解否定词的用法,对齐否定的范围和一图不能正确理解。同时BERT理解的Syntax结构似乎比语言学家认为的要浅,或者BERT还不能掌握深层嵌套结构。另一些工作也同步指出了BERT对指代关系理解不完整的问题。 44 | 45 | ## 缺失的语义 46 | 47 | BERT对主谓宾等语义角色有一定了解,对人名、地点有一定知识,但其对数字表现很差,并且对NER是死记硬背,简单的专有名词替换就很可能改变BERT的理解。 48 | 49 | ## 几乎没有推理 50 | 51 | 很多工作都指出了BERT几乎没有推理能力,不能回答应用题,只能回答事实性问题,不能很好的接纳和运用新知识。比如能回答对人能走进房子,也能回答出体积大的物体能容纳体积小的物体,但确不知道人比房子小。 52 | 53 | 54 | ![](https://i.imgur.com/X9eDMm2.png) 55 | ## 一些治标的问题 56 | - 长文本预训练还不成熟 57 | - Attention冗余过多(head的模式同质化、很多Attention都是汇总到cls或sep) 58 | - 更好的结合语言特点 59 | 60 | ## 对基本假设的质疑 61 | 62 | 语言模型或者说估计$P(x)$的预训练方法真的能够学到足够多的知识吗? 63 | 64 | 目前主流观点是存在一个自然语言空间,我们收集到的文本都满足i.i.d.采样,但这种观点可能存在一些问题,语言本身随时间、地域、民俗、各种人类社会的事件而变化。现有的采样方式很可能会引入外部因素(即语言之外的因素),这很有可能导致巨大的训练集也不能让我们对$P(x)$建模的更好,或者说陷入瓶颈期,因为采样和假设导致的系统性风险远大于数据集给出的经验风险时,模型的学习效率会变得极低。 65 | 66 | 另一方面,人们对语言的建模程度很可能没有我们想象的那么好,我们通常以语义一致作为标准而非字面一致。我在转达别人的消息时,很容易做到语义一致,但经常无法做到字面一致,即逐字逐句复述。而语言模型追求的字面一致可能过于偏激。 67 | 68 | 由此,可能一种模拟信息交流过程的,有两个模型参与的预训练模型会更为有意义。 69 | -------------------------------------------------------------------------------- /2021-06-03.md: -------------------------------------------------------------------------------- 1 | 讨论 2021-06-03 2 | = 3 | 4 | ## 正确率和误差函数的不一致 5 | 6 | 神经网络的训练过程离不开误差函数,但在很多时候我们可以在实验中观察到以下情况 7 | 8 | - 误差函数最优值和正确率最优值不同时出现,甚至相差很远 9 | - 在测试集上,误差函数和正确率变动程度不一致 10 | 11 | 这两种现象都表明了正确率和误差函数不一致,我们今天就主要讨论为什么会发生这种情况。 12 | 13 | ![](https://i.imgur.com/51WuKaH.png ) 14 | 15 | 这里面的首要问题就是交叉熵这些函数和正确率的目标不一样,假如正确的类别已经取得了最高的预测权重,那么这个预测已经是“正确”的,但他们的误差函数可能还很大。 16 | 17 | 这里实际上会引出正反两部分的考虑 18 | 19 | ### 决策边界的安全性 20 | 21 | ![](https://i.imgur.com/EyJxFws.png ) 22 | 首先我们可以考虑这个过度正确的优势,最重要的用途就是决策边界更安全,比如在新的测试环境里面,由于噪声的干扰,模型的预测分布出现了偏差,那么随之而来的结果就可能被改变,而正确结果和其他结果的区分度决定了这一预测有多容易被干扰。所以一个模型预测的分布如果区分度很高的话,它的抗噪声能力也就更强。 23 | 24 | 25 | ### 过分信任 26 | ![](https://i.imgur.com/W0XUp6b.png) 27 | 28 | ![](https://i.imgur.com/YEMG7TP.png) 29 | 30 | 另一方面,模型预测过度正确也有很多负面影响,比如过分信任问题,简单来说模型过拟合到最后,对所有判断都是非黑即白,那么可能对一些拿不准的样例也给予极高的预测权重。这就会误导后续使用。 31 | 32 | 33 | ### 应对方法 34 | 35 | 目前主要的应对方法有两类,一是label smoothing,二是最大熵。 36 | label smoothing就是人为把正确类别的概率设为0.9或一个更小的值,同时把其他错误类别设为一个很小的值,这主要是为了交叉熵考虑的,因为log函数对这些边界取值比较敏感。二是最大熵原理,即在保证训练集正确的条件下,尽可能让预测的熵变大。 37 | 38 | \begin{gather} 39 | \mathrm{argmin}_\theta \quad -\sum_{x,y^* \in D} \log P(y^*|x) - H(P(y|x;\theta)) \\ 40 | \end{gather} 41 | -------------------------------------------------------------------------------- /2021-06-17.md: -------------------------------------------------------------------------------- 1 | 讨论 2021-06-17 2 | = 3 | 4 | ## 浅谈Neural ODE 5 | 6 | ## 固定时间步,点过程,和连续时间 7 | 对于时间序列,有三种理解方式,一是rnn常用的时间序列,它通常是等时间间隔的离散序列,也就是序列中每个元素间相隔时间相等。二是点过程,即元素间时间间隔不想等,比如第一分钟有个信号,一小时后第二个信号,五分钟后第三个信号。三是连续时间,这时就不能用序列表示了,信号是一个连续的信号,比如声音,无线电。 8 | 9 | 今天要讲的就是关于连续时间过程,首先,我们应该考虑连续时间和离散时间序列间的联系。实际上,如果把目标随时间变化的函数定义出来,同时这个变化就对应了目标函数对时间的导数。我们把这个函数记为$f()$。那么离散时间序列就可以看作对连续时间过程的分段积分。对任何一段时间间隔,已知其起点状态,我们可以知道终点状态应该为 10 | 11 | \begin{gather} 12 | \frac{dz}{dt} = f(z(t);\theta) \\ 13 | z(t_1) = z(t_0) + \int_{t_0}^{t_1} f(z(t);\theta) dt 14 | \end{gather} 15 | 16 | 17 | ## Neural ODE 18 | 19 | 观察这个形式可以发现,新的时间点等于旧的时间点加上积分路程的变化,这和残差网络在形式上是相近的。所以我们同样可以考虑用神经网络代替变化函数。 20 | 21 | 假如时间间隔是固定的,这个积分过程就是一个rnn。但如rnn不同的是我们可以定义变化的间隔,以及任意精度的时间间隔,比如0.5时间步,3.1415926时间步等。我们可以认为这是一个把时间间隔作为参数的,可以建模点过程的模型。 22 | 23 | 当然,有一个显著问题是既然没有固定时间步的概念,序列的长度就很自由,并且小问题也可以看作长序列,所以学者们还讨论了一些梯度估计的方法,用于超长序列的回传。这里只介绍最简单的adjoint method。 24 | 25 | ## Adjoint Method 26 | 27 | 梯度回传其实是一个逆时间方向,进行回溯的过程,所以他同样是可以用常微分当成来建模,当然,我们既然知道正向时间是神经网络,所以反向也是有界的,是可积的。所以adjoint method把反向过程在时间步之间的部分再次用常微分当成求解,对一段区间的导数变化进行积分。 28 | 29 | 这样的好处是你可以调整反向传播的精度和效率,结合经典算法和正向得到的信息,可以自适应的调整反向过程。 30 | 31 | 接下来就是讲解如何求反向过程的变化函数,实际上他是有解析解的,可以通过网络结构求出,下面进行推导。 32 | 33 | (这个推导非常好,就直接粘贴了) 34 | https://personal.ntu.edu.sg/lixiucheng/paper/neural-ode.html 35 | 36 | 到z(t)之后还差一步,就是求出对参数的导数。这里学者提出了一种比较不直观的方法,把参数也看做时间的函数,只不过它对时间的导数为0。同样的,如果有需要,也可以把时间看作时间的函数,导数就是1。 37 | 38 | 这样,把参数和时间扩充到状态中,即可求出相应的导数,再进行更新。 39 | 40 | 今天的介绍只是粗浅的介绍了 neural ode相关的内容,实际有很多技巧和高端用法没有提及,大家感兴趣可以自己查阅资料。 41 | -------------------------------------------------------------------------------- /2021-06-24.md: -------------------------------------------------------------------------------- 1 | 讨论 2021-06-24 2 | = 3 | 4 | 5 | ## Multi-Instance Learning 6 | 7 | ![](https://i.imgur.com/9nnZOKE.png) 8 | 9 | MIL研究的问题是当标注信息是针对整体的,而我们知道这个整体的标签是由某些更小的标签(Instance-level)组合而成的。这时通过整体求组成个体标签的过程就成为MIL。其实MIL和解线性方程组挺像的,只不过我们不知道组合系数,并且允许取最大值等操作。 10 | 11 | 首先,我们把整体成为 bag,我们能获得的标签都是针对bag的,而bag里有若干个instance,我们需要通过bag的标签以及假设的bag和instance之间的关系来推理出instance的标签。从而完成下游任务。 12 | 13 | ## 简单情况 14 | 15 | 只考虑正负两类,并且假设bag的标签为正当且仅当至少有一个instance标签为正,而bag标签为负当且仅当所有instance标签为负。这也是经典的MIL假设,可以通过最大值操作来建模。 16 | 17 | 至少存在一个正标签等价于标签最大值为正(设正标签大于负标签)。所以存在性问题很容易对应成取最大值。类似的,计数问题可以转化为1范数或2范数。 18 | 19 | 所以,其实MIL的通用解决方法很直接,假如bag为$B=\{s_1,s_2,\cdots,s_n\}$,由n个instance组成,我们有一个可学习的网络$f$ 20 | 21 | $$\hat{Y}_B = \max_i f(s_i)$$ 22 | 我们对bag的预测就可以转为对每个instance分类并取最大值。 23 | 24 | ## Non i.i.d. 25 | 上述模型认为一个bag的instance是相互独立的,但通常不是,所以需要考虑同一个bag中不同instance之间的关系,有多建模关系的方式,不过最近的工作通常直接用self-attention解决。 26 | 两种方式 27 | $$\hat{Y}_B = \max_i f(s_i;s_{-i})$$ 28 | 29 | $$\hat{Y}_B = \mathrm{Att} (f(s_1), \cdots, f(s_n))$$ 30 | 31 | ## 线性组合 32 | 另一思路则是把问题拓展,不局限于存在性问题,比如一个 33 | bag有A类instance至少3个,B类1个,标签才为正,或者bag有4-6个正类instance才为正。这类问题其实用途不是很多,因为很难指导如此具体的约束,大致的解法就是先把原问题转为多个存在性问题,再用MIL求解。对这类问题的研究相对较少。 34 | 35 | 36 | ## 实例 37 | 38 | https://www.aclweb.org/anthology/Q18-1002.pdf 39 | ![](https://i.imgur.com/Cg4L6HT.png) 40 | 41 | https://www.aclweb.org/anthology/2020.emnlp-main.287.pdf 42 | ![](https://i.imgur.com/vTxRO63.png) 43 | 44 | 45 | https://arxiv.org/pdf/2106.10855.pdf 46 | ![](https://i.imgur.com/R1lVHXP.png) 47 | -------------------------------------------------------------------------------- /2021-07-01.md: -------------------------------------------------------------------------------- 1 | 讨论 2021-07-01 2 | = 3 | 4 | ## Beam Search 5 | 序列生成中总归要涉及到解码算法,这次先介绍最常用的Beam Search,之后如有机会再介绍其他更复杂的解码算法。 6 | 7 | ### 条件独立 8 | 解码各步骤条件独立,解码得到的结果与解码顺序无关,这也是非自回归模型的目标,即可以并行解码。如图所示,各位置独立选择即可。 9 | 10 | ![](https://i.imgur.com/63x2o3p.png) 11 | 12 | ### 1-Markov 13 | 一阶马尔可夫条件,即每个元素只依赖前面一个元素的取值,此时可以采用动态规划,局部最优即是全局最优,每步贪心的选取最优值即可。 14 | 15 | ![](https://i.imgur.com/qtlDoY2.png) 16 | 17 | ### Beam Search 18 | 高阶马尔可夫条件,每个元素依赖之前的多个元素,此时局部最优不在是全局最优,只能求近似解。如图是Beam=2的情况,保留得分最高的两个序列。 19 | 20 | ![](https://i.imgur.com/rtQ8lNG.png) 21 | 22 | ### 转移限制 23 | 实际上元素和元素之间不是可以随意转换的,比如EOS之后不能再有其他元素,比如某些元素后只能跟某些元素等。在Beam Search过程中需要关注这些问题,通常对EOS有如下处理,对每个Beam设置标签,代表已经EOS还是没有,如果一个Beam出现EOS,提出整个列表,同时选取得分顺位在总Beam数+1且不是EOS的序列加入,保证总Beam数不变。为此需要将Beam按两倍展开,对其中一半的序列交易限制,让其不可选择EOS。 24 | 25 | ![](https://i.imgur.com/p4tS0Ju.png) 26 | 27 | ### cache重排序 28 | 自回归生成的解码过程通常都要使用cache功能,也就是已经解码的序列所对应的特征有些是不需要重复计算的。如果不考虑Beam Search,那么我们只要维护Batch个cache即可,每步往里面添加一个元素即可,但Beam Search会改变前缀数量和顺位,如之前例子中给出的,一个Beam可能会派生成出两个新的Beam,也可能一个Beam中分数都很低,无派生,这都会导致其序列前缀改变,同时对应的cache也不一样。为此,就需要每一步根据Beam的派生关系(由上一步的某一个Beam衍生出这一步的某一个Beam),需要继承其来源的cache。而这一过程通常称之为cache重排序。 29 | 30 | 关于如何Batch,有需要可以参考我自己写的Beam Search 31 | https://github.com/QipengGuo/GraphWriter-DGL/blob/reproduce/graphwriter.py#L98-L180 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2020, Guo Qipeng 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NLP-Notes 2 | Notes of my introduction about NLP in Fudan University 3 | 4 | 仅供内部使用,请勿转载 5 | 6 | 由于是讲义草稿,所以很多内容在没有讲解的情况是不完整的,有问题可以问我,线上线下均可。 7 | 在尝试解决公式显示问题,如果有熟悉的,烦请告知。目前暂时的解决方式是安装[chrome插件](https://chrome.google.com/webstore/detail/mathjax-plugin-for-github/ioemnmodlmafdkllaclgeombjnmnbima) 或直接访问hackmd。 8 | 9 | Gitee对latex公式支持相对较好,所以以后会同步更新到https://gitee.com/QipengGuo/NLP-Notes ,不过对多行公式的支持依旧有限,有很多不对齐的公式,希望大家不要介意。 PS:有些多行可以,有些就不行 :( 10 | 11 | 12 | [2019/10/14](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/rkMAcRltB) 13 | [2019/10/21](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/B1lNhfJwtS) 14 | [2019/10/28](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/S1fEww2Yr) 15 | [2019/11/04](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/Sy0VE8Q9H) 16 | [2019/11/11](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/HykvcHBiS) 17 | [2019/11/18](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/Sk_AGXk3r) 18 | [2019/12/02](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/BJ6TE_b6B) 19 | [2019/12/16](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/H1LE9fA6H) 20 | [2020/01/06](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/Sy9K4qJgL) 21 | [2020/01/13](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/ByvqsAOeU) 22 | 23 | [2020/09/21](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/HJJ2vmIHP) 24 | [2020/10/08](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/HyxSr7iUD) 25 | [2020/10/15](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/ryy1dr4PP) 26 | [2020/10/22](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/HyOAWu6vD) 27 | [2020/10/29](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/B1vp94Duv) 28 | [2020/11/12](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/ryoZ95KYw) 29 | [2020/11/19](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/HJkh1FXcw) 30 | [2020/11/26](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/BkJQrX2qP) 31 | [2020/12/02](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/rJoPDMHiv) 32 | [2020/12/10](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/BkUHSgAiv) 33 | [2020/12/16](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/S14DzZInv) 34 | [2021/01/07](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/SkqtZiXAP) 35 | 36 | 37 | [2021/04/06](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/SySFpRuBd) 38 | [2021/04/13](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/r1Vh6Gf8d) 39 | [2021/04/20](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/By5VQrsLd) 40 | [2021/05/11](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/rkN8Gmx_u) 41 | [2021/05/27](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/r1QTeQ2Ku) 42 | [2021/06/03](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/S1J2ZJUqO) 43 | [2021/06/10](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/S1Yy5-0q_) 44 | [2021/06/17](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/SkeGlLOju) 45 | [2021/06/24](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/ryS1zdZ2u) 46 | [2021/07/01](https://hackmd.io/@IlMAi12lT42ESFI1KhOT8g/Hk1i0a5n_) 47 | --------------------------------------------------------------------------------