assignment 2

• 66 min read • 13116 words
Tags: Deep Learning NLP Word2vec
Categories: NLP

Assignment 2

Word2Vec

(a)(a)

Because the true distribution of yy is a one-hot vector, where yw=0y_w=0 for all w0w \neq 0 and wo=1w_o=1, the summation ywlog(y^y)\sum y_w \log(\hat{y}_y) simplifies to log(y^o)\log(\hat{y}_o)

(b)(b)

i.i.

我们需要求解下面这个偏导数:

J=logexpuoTvcwvocabexpuwTvc=u0T+logwvocabexpuwTvcJ=-\log \frac{\exp^{u_o^T v_c}}{\sum _{w \in vocab} \exp^{u_w^T v_c}}=-u_0^T+\log \sum _{w \in vocab} \exp^{u_w^T v_c}

f(vc)=wvocabexpuwTvcf(v_c)=\sum _{w \in vocab} \exp^{u_w^T v_c},则:

Jvc=Jf(vc)f(vc)vc=1f(vc)f(vc)vc\frac{\partial J}{\partial v_c}=\frac{\partial J}{\partial f(v_c)}\frac{\partial f(v_c)}{\partial v_c}=\frac{1}{f(v_c)}\frac{\partial f(v_c)}{\partial v_c}

而:

f(vc)vc=wvocabuwTexpuwTvc\frac{\partial f(v_c)}{\partial v_c}=\sum _{w \in vocab} u_w^T \exp^{u_w^T v_c}

于是:

1f(vc)f(vc)vc=wvocabuwTexpuwTvckvocabexpukTvc=wvocabexpuwTvckvocabexpukTvcuwT\frac{1}{f(v_c)}\frac{\partial f(v_c)}{\partial v_c}=\frac{\sum _{w \in vocab} u_w^T \exp^{u_w^T v_c}}{\sum _{k \in vocab}\exp^{u_k^T v_c}}=\sum _{w \in vocab}\frac{\exp^{u_w^T v_c}}{\sum _{k \in vocab}\exp^{u_k^T v_c}}u_w^T

而由 y^o\hat{y}_o的定义:

y^o=expuwTvcwvocabexpuwTvc\hat{y}_o=\frac{\exp^{u_w^T v_c}}{\sum _{w \in vocab}\exp^{u_w^T v_c}}

可得:

wvocabexpuwTvckvocabexpukTvcuwT=uwTy^w\sum _{w \in vocab}\frac{\exp^{u_w^T v_c}}{\sum _{k \in vocab}\exp^{u_k^T v_c}}u_w^T=u_w^T \hat{y}_w

最终结果为:

Jvc=(wvocabuwTy^w)uoT\frac{\partial J}{\partial v_c}=(\sum _{w \in vocab} u_w^T\hat{y}_w)-u_o^T

现在我们需要将这个式子向量化:

  • uou_o 是真实向量值的 outsider 向量,我们可以通过矩阵 UU 与独热向量相乘得到:UyUy
  • wvocabuwTy^w\sum _{w \in vocab} u_w^T\hat{y}_w 是 outsider 向量的加权平均,可以看作是模型预测的期望 outsider 向量,等价于矩阵 UU 乘以概率向量 Uy^U\hat{y}

因此我们得到最终的向量表示:

Jvc=U(y^y)\frac{\partial J}{\partial v_c}=U(\hat{y}-y)
iiii

梯度为0时,有:

y^=y\hat{y}=y

这意味着模型的预测概率分布 y^\hat{y} 和真实的独热向量分布完全相同,模型已经有100%的把握预测真实的外围词 oo 就是外围词,而其他所有词的概率都为0。

iiiiii

参数 vcv_c 的梯度下降更新过程如下:

vcnew=vcoldα(Uy^Uy)v_{c_{new}} = v_{c_{old}} - \alpha (U\hat{y} - Uy)

梯度 Uy^UyU\hat{y} - Uy 由两个部分组成:

  1. Uy^U\hat{y}: 这是期望项。它代表了根据当前模型预测,"期望中"的外围词向量应该是长什么样的。它是所有词的 outside 向量 uwu_w 根据预测概率 y^w\hat{y}_w 进行的加权平均。
  2. UyUy: 这是观测项。它是真实观测到的那个外围词 oo 的 outside 向量 uou_o

在梯度更新 vcnew=vcoldα(Uy^Uy)v_{c_{new}} = v_{c_{old}} - \alpha (U\hat{y} - Uy) 中:

  • +αUy+ αUy: 这个部分把中心词向量 vcv_c 向真实观测到的外围词向量 uou_o 的方向拉近。为了让损失变小,模型需要增大 P(O=oC=c)P(O=o|C=c),也就是增大 uoTvcu_o^T v_c 的值。让两个向量更相似(在同一方向上)会使它们的点积变大。
  • αUy^- αU\hat{y}: 这个部分把中心词向量 vcv_c 向模型期望的外围词向量的反方向推离。期望向量 Uy^U\hat{y} 是一个被所有(大部分是错误的)词所影响的“平均”向量。把 vcv_c 推离它,就相当于在整体上减小了 vcv_c 和那些不应该出现的词的 uwu_w 的相似度,从而降低了它们的出现概率。

cc

当词向量的长度本身编码了有用的语义信息时,归一化就会造成信息损失。

在题目给出的情感分类任务中,一个词的正面或负面“强度”可能就由其向量长度表示。

  • 例子: "ecstatic" (欣喜若狂) 和 "happy" (开心) 都指向正面的方向,但 "ecstatic" 的情感强度远大于"happy"。在理想的词向量空间中,这可以通过向量长度来体现,即 ||u_ecstatic|| > ||u_happy||。
  • 信息损失: 如果我们将它们都进行L2归一化,它们的向量会变得非常接近甚至相同(如果它们方向一致的话),我们就丢失了“欣喜若狂”比“开心”更强烈的这层信息。在对一个短语的情感进行加总计算时,这种强度的区别就无法体现出来了。

当词向量的长度与下游任务无关,或者其携带的信息是噪声时,归一化就不会造成损失,甚至可能是有益的。

  • 情况一:长度与任务无关。如果我们的任务只关心一个词是“正面”还是“负面”(方向),而不关心其强度,那么归一化是无损的。
  • 情况二:长度是噪声。 在word2vec的训练过程中,高频词(如 "the", "a", "is")往往会获得比低频词更大的向量长度。但在情感分类任务中,这些词通常是中性的停用词。它们较大的向量长度反而会在求和时“压制”住那些真正携带情感但频率较低的词(如 "amazing", "terrible")的影响。在这种情况下,L2归一化可以通过消除频率带来的影响,降低噪声,从而提升模型性能。
dd
JU=[Ju1,Ju2,,JuVocab]\frac{∂J}{∂U} = [ \frac{∂J}{∂u_1}, \frac{∂J}{∂u_2}, ···, \frac{∂J}{∂u_{|Vocab|}} ]

Machine Learning & Neural Networks

aa

ii

这里的 mm (动量) 是对过去梯度的一个指数加权移动平均。可以把它想象成一个滚下山的小球,它的方向不仅取决于当前地面的坡度(当前批次的梯度 θt∇_{θ_t}),还很大程度上取决于它之前的滚动方向(历史梯度 mtm_t)。

因为 β1β_1 通常是一个接近1的数值(比如0.9),所以新的动量 mt+1m_{t+1} 主要由旧的动量 mtm_t 决定,只有一小部分受当前梯度 θt∇_{θ_t} 的影响。如果某一个批次的数据导致梯度方向突然剧烈变化(即噪声较大),这个突然的变化会被历史积累的动量“平滑”掉。因此,更新的方向会更加稳定,变化更小。

这种稳定的、低方差的更新非常有益。在损失函数的“地形图”中,它能帮助优化器更快地收敛,因为它沿着一个更加平滑和直接的路径前进,避免了在峡谷地带来回震荡的问题

iiii

这里的 vv 追踪的是梯度平方的指数加权移动平均。一个参数对应的 vv 值很大,意味着这个参数在历史上经常有很大的梯度。而该值的更新策略如下:

  • 如果一个参数历史梯度一直很小,那么它的 vt+1v_{t+1} 就会很小,用一个小数字去除,最终的更新步长就更大。
  • 如果一个参数历史梯度一直很大,它的 vt+1v_{t+1} 就会很大,最终的更新步长就更小。

这对于处理稀疏数据或特征非常有用。在很多任务中,一些参数很少被激活,因此它们的梯度大多数时候都很小。通过自适应学习率,当这些稀疏参数偶尔获得梯度时,它们会得到一个较大的更新,从而确保它们也能被有效训练。对于那些梯度一直很大的参数,减小它们的更新步长可以防止更新过猛,避免“冲过”最优点,使训练过程更稳定

bb

ii

我们的目标是让经过 dropout 后的隐藏层单元 hdroph_{drop} 的期望值等于原始的隐藏层单元 hh。对于单个神经元 ii 有:

hdropi=γdihih_{drop_i} = γ d_i h_i

其中 did_i 是一个随机变量,它以 pdropp_{drop} 的概率为 0,以 1pdrop1 - p_{drop} 的概率为 1。

于是hdropih_{drop_i} 的期望 E[hdropi]E[h_{drop_i}]

E[hdropi]=E[γdihi]E[h_{drop_i}] = E[γ d_i h_i]

因为 γγhih_i 相对于随机过程 did_i 来说是常数,我们可以把它们提出来:

E[hdropi]=γhiE[di]E[h_{drop_i}] = γ h_i E[d_i]

接下来计算 did_i 的期望 E[di]E[d_i]

E[di]=(0pdrop)+(1(1pdrop))=1pdropE[d_i] = (0 p_{drop}) + (1 (1 - p_{drop})) = 1 - p_{drop}

代入得:

E[hdropi]=γhi(1pdrop)E[h_{drop_i}] = γ h_i (1 - p_{drop})

根据题目要求,这个期望值必须等于 hih_i

hi=γhi(1pdrop)h_i = γ * h_i * (1 - p_{drop})

于是解得:

γ=1/(1pdrop)γ = 1 / (1 - p_{drop})
iiii

在测试阶段,我们的目标是获得模型最稳定、最精确的预测结果。

  • 确定性: 如果在测试时还随机丢弃神经元,那么对于同一个输入,每次的输出都会不一样,这是我们不希望看到的。我们需要一个确定的、可复现的结果。
  • 利用全部能力: 在测试时,我们希望利用到模型已经训练好的全部能力。我们已经花费了大量资源训练了整个网络,自然希望所有神经元都参与进来,共同做出最好的决策。由于我们在训练时已经通过缩放因子 γγ 保证了激活值的期望不变,所以在测试时可以直接使用完整的网络,而不用担心输出的尺度问题。

Neural Transition-Based Dependency Parsing

ee

ii

我们定义 z=xW+b1z = xW + b_1,则:

hixj=khizkzkxj\frac{∂h_i}{∂x_j} = \sum _k \frac{∂h_i}{∂z_k} \frac{∂z_k} {∂x_j}

zkxj=Wjk\frac{∂z_k} {∂x_j}=W_{jk}ReLUReLU 函数的偏导数是指示函数。于是:

hixj=1(zi>0)Wji\frac{∂h_i}{∂x_j} = 1(z_i \gt 0) W_{ji}
iiii
Jli=jJy^jy^jli\frac{∂J} {∂l_i} = \sum _j \frac{∂J} {∂\hat{y}_j} \frac{∂\hat{y}_j} {∂l_i}

首先计算 Jy^j\frac{∂J} {∂\hat{y}_j}。真实标签是 cc,所以 yc=1y_c = 1,对于所有 jcj \neq cyj=0y_j = 0。因此有:

Jj={log(y^c)if j=c0otherwiseJ_j = \begin{cases} -\log(\hat{y}_c) & \text{if } j = c \\ 0 & \text{otherwise} \end{cases} Jy^j={1y^cif j=c0otherwise\frac{∂J} {∂\hat{y}_j} = \begin{cases} -\frac{1}{\hat{y}_c} & \text{if } j = c \\ 0 & \text{otherwise} \end{cases}

然后计算 y^jli\frac{∂\hat{y}_j} {∂l_i},根据 softmax 的梯度公式即得:

y^jli={y^i(1y^i)if i=jy^jy^iif ij\frac{\partial \hat{y}_j}{\partial l_i} = \begin{cases} \hat{y}_i (1 - \hat{y}_i) & \text{if } i = j \\ -\hat{y}_j \hat{y}_i & \text{if } i \neq j \end{cases}

于是:

Jli={y^c1if i=cy^iif ic\frac{\partial J}{\partial l_i} = \begin{cases} \hat{y}_c - 1 & \text{if } i = c \\ \hat{y}_i & \text{if } i \neq c \end{cases}

ff

  1. 介词短语挂载错误 (Prepositional Phrase Attachment Error)
    • 介词短语(比如 "on the table", "with a fork", "into Afghanistan")就像一个“挂件”,它需要挂在正确的词上才能让句子意思通顺。当它挂错地方时,就产生了这种错误。
    • 例子:Moscow sent troops into Afghanistan.(莫斯科派军队进入阿富汗)。
      • 短语 into Afghanistan(进入阿富汗)是描述 sent(派遣)这个动作的,所以它应该挂在 sent 上,但是错误的解析把它挂在了 troops(军队)上,变成了 troops into Afghanistan(进入阿富汗的军队),这在语义上不通顺。
  2. 动词短语挂载错误 (Verb Phrase Attachment Error)
    • 一个动词短语(通常由分词引导,如 leaving the store unattended)也是一个“挂件”,它描述的是句子中某个动作或主体的状态。如果它挂错了,句子的主语就会混淆。
    • 例子:Leaving the store unattended, I went outside.(我把商店晾在一边,然后出门了)。
      • Leaving the store unattended(把商店晾在一边)这个动作是 I(我)发出的。所以这个短语应该挂在主句的动词 went 上,来修饰主句的主语 I。如果挂错,比如挂在 store 上,意思就完全错了。
  3. 修饰语挂载错误 (Modifier Attachment Error)
    • 修饰语(比如副词 extremely 或形容词 red)用来修饰其他词。当它修饰了错误的词时,就产生这种错误。
    • 例子:I am extremely short.(我非常矮)。
      • 副词 extremely(非常)是用来修饰形容词 short(矮)的,强调“矮”的程度。如果错误地挂在 am 上,就失去了它应有的语义。
  4. 并列连词挂载错误 (Coordination Attachment Error)
    • 当使用 and, or, but等并列连词连接两个或多个成分时,这几个成分在结构上是平等的。解析器应该将第二个(以及后续的)成分连接到第一个成分上。如果连接到了别的词上,就产生了这种错误。
    • 例子:Would you like brown rice or garlic naan?(你想要糙米饭还是蒜香烤饼?)。
      • brown rice 和 garlic naan 是并列关系。正确的结构是 garlic naan 应该连接到 rice 上。如果 garlic naan 连接到了 Would 或者 like 上,就破坏了这种并列结构。

gg

相比只使用单词本身,额外加入词性标签能给模型带来哪些单词本身无法提供的信息:

  1. 提高泛化能力 (Generalization):
    • 语言中的词汇量非常大,很多词在训练数据中可能只出现几次,甚至不出现(未登录词,OOV)。如果只用词作为特征,模型很难学到适用于所有词的普遍语法规则。
    • 词性标签将具体的单词抽象成语法类别(如名词 NOUN、动词 VERB、形容词 ADJ)。例如,模型可以学到一个普遍规则:“一个形容词(ADJ)很可能修饰一个名词(NOUN)”,而不是去分别学习“beautiful修饰 girl”、“big 修饰 house”等无数个具体实例。这使得模型能够更好地处理在训练中未见过的词汇和句子结构,泛化能力大大增强。
  2. 消除词义和语法歧义 (Disambiguation):
    • 英语中很多单词身兼数职,同一个词在不同上下文中可以有不同的词性。例如:
      • book 可以是名词(a book)或动词(book a flight)。
      • duck 可以是名词(a duck)或动词(duck down)。
    • 如果不使用词性标签,解析器很难区分这些情况。而POS标签可以直接告诉模型这个词在当前句子中的语法角色。知道了 book 是一个动词 VERB,模型就知道它可以带一个直接宾语(如 flight);如果知道它是名词 NOUN,模型就知道它可以被一个形容词修饰。这对于正确判断依赖关系至关重要。
  3. 提供核心语法结构信息 (Providing Syntactic Structure):
    • 依赖解析的本质就是寻找词与词之间的语法关系。词性标签本身就是最基础和核心的语法信息。例如,介词(ADP)通常是一个介词短语的开始,它会连接一个名词;助动词(AUX)通常会依附于一个主动词(VERB)。这些基于词性的规则是构建整个依赖树的基石。