zoukankan      html  css  js  c++  java
  • NLP面试问题个人总结-交叉熵&RNN

    列出几种文本特征提取算法

    答:文档频率、信息增益、互信息、X^2统计、TF-IDF

    (引用自:https://www.cnblogs.com/jiashun/p/CrossEntropyLoss.html)

    信息:

    由于概率I 是一个)0至1的值,所以当事件发生的概率越大时,信息量越小。

    相对熵

    相对熵又称KL散度(Kullback-Leibler (KL) divergence),用于衡量对于同一个随机变量x的两个单独的概率分布P(x)和Q(x)之间的差异。

    KL散度的值越小表示两个分布越接近.

    在一定程度上面,相对熵可以度量两个随机分布的距离。也常常用相对熵来度量两个随机分布的距离。当两个随机分布相同的时候,他们的相对熵为0,当两个随机分布的差别增大的时候,他们之间的相对熵也会增大。 

    熵:

    是表示随机变量不确定的度量,是对所有可能发生的事件产生的信息量的期望。

    信息增益:

    分类前的信息熵减去分类后的信息熵

    交叉熵:

    我们将KL散度公式进行变形得到:

     

     

     这里前半部分是事件P自己的信息熵, 后面那部分可以作为事件P和事件q的信息熵(交叉)

    交叉熵广泛用于逻辑回归的Sigmoid和Softmax函数中作为损失函数使用。

     

    二分类交叉熵误差:

    模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为 [公式] 和 [公式] 。此时表达式为:

    意思就是每个类别都做一个信息熵的计算,然后加起来,(目的最小)

    同样,预测输出越接近真实样本标签 0,损失函数 L 越小;预测函数越接近 1,L 越大。函数的变化趋势也完全符合实际需要的情况

     

    多分类交叉熵误差:

    M表示标签的种类数

    交叉熵误差函数和softmax(神经网络用到的输出函数)和sigmoid函数(logistic回归用到的函数)的复合函数是凸函数,即存在全局最优解

     

    2 RNN基本原理

    (引用自:https://zhuanlan.zhihu.com/p/32755043

     

     

    RNN循环神经元的计算过程:

    1. 将输入时间步提供给网络,也就是提供给网络[公式]
    2. 接下来利用输入和前一时刻的状态计算当前状态,也就是[公式]
    3. 当前状态变成下一步的前一状态[公式]
    4. 我们可以执行上面的步骤任意多次(主要取决于任务需要),然后组合从前面所有步骤中得到的信息。
    5. 一旦所有时间步都完成了,最后的状态用来计算输出[公式]
    6. 输出与真实标签进行比较并得到误差。
    7. 误差通过后向传播(后面将介绍如何后向传播)对权重进行升级,进而网络训练完成。

    反向传播:

    1. 首先使用预测输出和实际输出计算交叉熵误差
    2. 网络按照时间步完全展开
    3. 对于展开的网络,对于每一个实践步计算权重的梯度
    4. 因为对于所有时间步来说,权重都一样,所以对于所有的时间步,可以一起得到梯度(而不是像神经网络一样对不同的隐藏层得到不同的梯度)
    5. 随后对循环神经元的权重进行升级

    交叉熵误差:

    [公式]

    [公式]

     

    梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑一下三种方案解决:

     

    1. 用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函数。
    2. 用Batch Normalization。
    3. LSTM的结构设计也可以改善RNN中的梯度消失问题。

     

    梯度爆炸问题和消失问题:

    RNN基于这样的机制,信息的结果依赖于前面的状态或前N个时间步。普通的RNN可能在学习长距离依赖性方面存在困难。例如,如果我们有这样一句话,“The man who ate my pizza has purple hair”。在这种情况下,purple hair描述的是The man,而不是pizza。所以这是一个长距离的依赖关系

    如果我们在这种情况下后向传播,我们就需要应用链式法则。在三个时间步后对第一个求梯度的公式如下:

    ∂E/∂W = ∂E/∂y3* ∂y3/∂h3* ∂h3/∂y2 *∂y2/∂h1 .. 这就是一个长距离的依赖关系.

    在这里,我们应用了链式规则,如果任何一个梯度接近0,所有的梯度都会成指数倍的迅速变成零。这样将不再有助于网络学习任何东西。这就是所谓的消失梯度问题。

    同理:

    梯度爆炸就是由于单个或多个梯度值变得非常高,梯度变得非常大。

     

    3 RNN常见的几种设计模式

    (引用自:https://blog.csdn.net/dqcfkyqdxym3f8rb0/article/details/82922386)

    为了来处理消失梯度问题。人们提出了LSTM结构(长短期记忆网络)和GRU(门控性单位)可以用来处理消失的梯度问题。

     

     LSTM也有这样的链式结构,但重复模块有不同的结构。不是有一个单一的神经网络层,而是有四个,他们之间以一种非常特殊的方式进行交互。

    LSTM一共三个门:遗忘门输入门输出门

     例子: He is a boy and She is a girl.

    LSTM 的第一个门是遗忘门,用sigmoid 来激活,为0就是遗忘,为1就是记住.

    遗忘门


     输入门

    下一步是决定我们将要在单元状态中存储哪些新的信息。这有两个部分。首先,激活函数为sigmoid的称为“输入门”的层决定我们将更新哪些值。接下来,激活函数为tanh的层创建一个新的候选值向量,,可以添加到单元状态。 下一步,我们将结合这两部分更新状态。

    在语言模型的例子中,我们希望将新的主语的性别添加到单元状态,以替换我们“遗忘”的旧主语。


     更新细胞状态

     我们让旧的状态乘以来“遗忘”我们决定忘记的事情。然后我们加上,这是新的候选值,按照我们决定更新每个单元状态值的比例进行缩放。


     输出层

    最后,我们需要决定输出的内容。这个输出将基于我们的单元状态,但将是一个过滤版。首先,我们运行一个sigmoid层,决定我们要输出单元状态的哪些部分。然后,我们通过tanh函数(把值转换为[-1,1]区间)把它的单元状态与sigmoid门的输出相乘,这样我们只输出我们决定的部分。

    对于语言模型来说,因为它只是看到一个主语,所以它可能要输出与动词相关的信息。例如,它可能会输出主语是单数还是复数,以便我们知道如果接下来是动词,应该是什么形式。


    总结:

    遗忘门确定前一个步长中哪些相关的信息需要被保留;

    输入门确定当前输入中哪些信息是重要的,需要被添加的;

    输出门确定下一个隐藏状态应该是什么。


    GRU:

    与 LSTM 相比,GRU 去除掉了细胞状态,使用隐藏状态来进行信息的传递。它只包含两个门:更新门和重置门。

    更新门

    更新门的作用类似于 LSTM 中的遗忘门和输入门。它决定了要忘记哪些信息以及哪些新信息需要被添加。

    重置门

    重置门用于决定遗忘先前信息的程度。

    这就是 GRU。GRU 的张量运算较少,因此它比 LSTM 的训练更快一下。很难去判定这两者到底谁更好,研究人员通常会两者都试一下,然后选择最合适的。

  • 相关阅读:
    [模板] 循环数组的最大子段和
    [最短路][几何][牛客] [国庆集训派对1]-L-New Game
    [洛谷] P1866 编号
    1115 Counting Nodes in a BST (30 分)
    1106 Lowest Price in Supply Chain (25 分)
    1094 The Largest Generation (25 分)
    1090 Highest Price in Supply Chain (25 分)
    树的遍历
    1086 Tree Traversals Again (25 分)
    1079 Total Sales of Supply Chain (25 分 树
  • 原文地址:https://www.cnblogs.com/tfknight/p/12493286.html
Copyright © 2011-2022 走看看