讨论 2023-11-16 = ###### tags: `tutorials` `Fudan` `2023` # 神经网络基础(二) ## 简单回顾 我们之前介绍了大部分语言模型想要找到一个通用的函数关系,根据前文预测下一个词是什么。 $$ P_\theta(X) = P_\theta (x_1 | <bos>) \prod_i P_\theta (x_i | x_{<i}) $$ ![](https://hackmd.io/_uploads/SJRysiIGT.png =400x) ## 单词的表示 本次主要讨论一下自然语言处理中的基础单元,token $x_i$ 是如何表示的,以及为何要这样表示。为此,我们需要先介绍一些背景知识 ### 内积空间 我们对欧氏空间非常熟悉,两点之间距离为各维度坐标的根号平方和。 $$\sqrt{\sum_i(u_i-v_i)^2}$$ 另一种常用的距离为内积距离。 \begin{gather} <u,v> = u^T v = \sum_i u_i v_i \\ <u,v> = <v,u> \\ <\alpha u + \beta v, w> = \alpha <u, w> + \beta <v, w> \\ (u,u) \ge 0 \end{gather} 假如我们观察内积的定义可以发现,其有如下几个特点 - 内积的大小与向量本身模长高度相关 - 高维空间的内积有可能用低维形式表示 \begin{align} <u,v;W> =& u^T W v = \sum_{i,j} u_i W_{ij} v_j \quad u,v \in \mathbb{R}^d \\ =& u^T W_1 W_2 v \quad W_1 \in \mathbb{R}^{d \times e} W_2 \in \mathbb{R}^{e \times d} \end{align} 如果我们单独看$u^T W_1$和$W_2v$,会发现它们都是$e$维空间中的向量。所以$u,v$两个向量之间的距离度量其实和W矩阵的rank直接相关,而不一定和$u,v$本身的维度相关。当然欧氏距离其实是和维度直接相关的,因为他对应的W相当于一个对角阵、满秩。 常见神经网络的最后一层,其功能就是计算处理好的特征与备选项之间的内积。并将内积归一化得到概率。换言之,神经网最后的分类过程可以理解为度量提取到的特征与备选项之间的相似度,然后选取相似度最高的选项作为答案。假如大部分数据的最后一层特征模长接近,那么候选项的模长就代表了一个固有偏好,比如某个类别高频出现,比其他类更容易作为答案。反之,假如候选项的模长固定,那么处理的特征的模长就反应了模型的置信度。 ### Word2Vec 回到如何表示输入token $x_i$的问题上,我们考虑两个token之间的关系。最简单的做法是直接把token的序号,比如1,2,3,4,5这种作为表示,但我们要考虑这些表示对后续神经网络的影响。 目前大部分神经网络的连续性是比较好的,即$$f(x+\Delta x) - f(x) < \epsilon \Delta x $$,假如我们认为两个词$w_i, w_j$对学习任务起到了相同的作用,比如在情感分类中都是正面词,那么我们也就希望$$ f(w_i) - f(w_j) < \epsilon ||w_i-w_j|| $$ 换言之,如果两个词语对模型的含义相同,那么他们的词向量也应该尽量相同,这样模型会更容易学习。上述描述是以欧式空间为例,对内积空间也一样。这从另一个侧面也阐述了为什么end-to-end训练是重要的,由于网络的连续性,假如两个需要区分的样本在输入阶段非常相似,网络是很难后续把他们区分开的。同样的,对于在输入阶段很不同的样本,网络后续把他们合并也不容易。当然,这种限制在网络深度大幅增加之后会被减轻。但从设计角度上来讲,尽量应该避免制造这种困难。 如果我们不采用end-to-end模型,而输入模块的参数已经固定,但其特征的分布与后续任务很不一致,前者相似的在后续任务中差别很大或前者差别很大的在后续任务中很相似。这都会给后续模型的训练带来很大的困难。 一种经典的做法,Word2Vec,认为单词的向量表示应该和邻近词(经常出现在前后几个位置之内)有关,由此设计了一个非常简单的训练目标。 \begin{align} \max &\sum_k P(w_{i+k}|w_i) \\ &=\frac{\exp(w_{i+k}^T w_i)}{\sum_j \exp(w_j^T w_i)} \end{align} 我们可以看到这实际上就是让邻近词在内积空间中尽可能相近。这里我们需要避开一个误区,相似度是可以定义和限定的,不是总表示含义相同。实际上,我们很多时候是让模型学习的相似度只是某个方面的相似,而非人一般理解的相似。word2vec中的相似也并不是同义词反义词这种相似。 ![image](https://hackmd.io/_uploads/r1Dd4mQ4a.png =400x) https://projector.tensorflow.org/ 由于距离关系尊在三角不等式,即$$d(a,b)+d(b,c)\geq d(a,c)$$ 可以引出一个有趣的设计,模型抽取多个特征,每个候选项也有多个特征,但这种设计会对训练过程提出挑战,我们以后会讲到一些应对的方法。 ## 单词间的关系 单词间或语言中包含的关系可以归结成四个层次,字面,句法,语义,篇章。 ![](https://i.imgur.com/Csxc4Hj.png =400x) 首先我们讨论一个问题是为什么需要结构,或者说为什么语言需要句法。假设语言是定长的(每句话的字符数都一样),那么为了传达信息的便捷性(解码方法尽可能唯一,解码代价尽可能小),我们需要尽可能减少类似的句子(比如前缀相同)但意思截然不同的情况,为此,我们可以扩大字符集,或者引入结构。比如经典的问题是否定词的作用范围,如果没有结构,我们的语言很难只通过一个否定词来表达一个复杂语义的否定。 由此,我们可以猜测字符集越大的语言,往往对语序要求越不严格,反之亦然。 人们不光需要理解语言,还需要生成语言,所以我们还要考虑一种结构是否是容易生成的,即编码复杂度。比如语言中不太可能有身份证校验位这种编码方式,需要计算量太大。 ### Chomsky hierarchy from wiki https://en.wikipedia.org/wiki/Chomsky_hierarchy ![](https://i.imgur.com/cU1cxma.png) ### 上下文无关语法 (CFG) ``` S -> NP VP VP -> V NP | V NP PP PP -> P NP V -> "saw" | "ate" | "walked" NP -> "John" | "Mary" | "Bob" | Det N | Det N PP Det -> "a" | "an" | "the" | "my" N -> "man" | "dog" | "cat" | "telescope" | "park" P -> "in" | "on" | "by" | "with" ``` 每一条叫产生式 ### 组合为中心的结构 该类方法始终认为语言是合并出来的,高层语义总是由底层语义合并得到的。 ![](https://i.imgur.com/lRwkCfW.png) ### 意图为中心的结构 该类方法认为语言结构总有一个主干,其他是层层修饰。比如某人想做某事,其他成分是在修饰是什么人,做什么事等。 ![](https://i.imgur.com/vyCHTSE.png) ### 结构和语义是同步的 ![](https://i.imgur.com/5I4NBFU.png) ![](https://i.imgur.com/vCZJNkr.png) 原句不变,结构改变,理解的意思也会改变,与上文提到的增加信息密度的思想类似,语义可以通过换词改变,也可以通过改变结构来改变。 ### 篇章分析 考虑句子是如何串联成一个文档的 ![image](https://hackmd.io/_uploads/S1p-jXQNa.png)