自然语言处理神经网络模型入门
主要内容
- 自然语言输入编码
- 前馈网络
- 卷积网络
- 循环网络(recurrent networks )
- 递归网络(recursive networks)
- 自动计算梯度的计算图抽象( the computation graph abstraction for automatic gradient computation)
1.神经网络中的术语
- feature:具体的语言输入
- input vector: the actual input that is fed to the neural-network classifier
- input vector entry: 输入的特定值(a specific value of the input)
数学符号
- 加粗大写字母(X,Y, Z ) 表示矩阵
- 加粗小写字母代表向量 b
- W1表示神经网络中的第一层
- (W)2 (W1)2 矩阵的幂
- [v1;v2] 表示向量连接
2.神经网络架构
feed-forward networks
: 包括具有完全连接层的网络,例如多层感知器,以及具有卷积(convolutional )和池化层(pooling)的网络。 All of the networks act as classifiers, but each with different strengths.
-
Fully connected feed-forward neural networks (完全连接层)
- 在任何使用线性学习器的地方都可以用作替代品。
- 非线性网络以及容易集成预训练的字嵌入能力,通常可以提高分类的准确性
- 作为分类器的替代品,provide benefits for CCG supertagging, dialog state tracking, pre-ordering for statistical machine translation and language modeling.
-
Networks with convolutional and pooling layers
- 对于我们希望找到关于class membership的强大本地线索的分类任务非常有用,但这些线索可以出现在输入的不同位置
- 允许模型学习找到这样的local indicators,而不用管其位置。
- show promising results(有希望的结果) on many tasks, including document classification(文件分类),short-text categorization(短文本分类),sentiment classification(情感分析),relation type classification between entities(实体之间的关系类型分类), event detection(事件探测), paraphrase identification(释义识别), semantic role labeling(语义角色标注),question answering(问答),predicting box-office revenues of movies based on critic reviews(基于评论的票房预测),modeling text interestingness(建模文本的趣味性),and modeling the relation between character-sequences and part-of-speech tags(模拟字符序列和词性标签之间的关系).
- 缺点:为了将任意大的 item 编码为捕获其最显着特征的固定大小向量,它牺牲了大部分结构信息。
- 幸运的是, 循环和递归架构允许我们使用序列(sequences)和树(tree),同时保留大量结构信息
递归网络(recursive networks)
: 旨在模拟序列
- can produce very strong results for language modeling(语言建模), sequence tagging(序列标记),machine translation(机器翻译),dependency parsing(依存关系句法分析),sentiment analysis,noisy text normalization(噪杂文本规范化),dialog state tracking(对话状态跟踪),response generation(响应生成),modeling the relation between character sequences and part-of-speech tags(模拟字符序列和词性标签之间的关系)
循环网络
: can handle trees
- 可以产生最先进或接近最先进的结果 for constituency and dependency parse re-ranking(选区和依赖解析重排序), discourse parsing(语义关系分类),semantic relation classification(语义关系分类),political ideology detection based on parse trees(政治意识形态检测),sentiment classification,target-dependent sentiment classification(依赖目标的情绪分类),question answering.
3.特征表示
- a feed-forward neural network 是一个函数 NN(x),其输入是一个din dimensional vector x,输出是doutdimensional output vector
- 该函数作为一个分类器,assigning the input x a degree of membership in one or more of dout classes(为输入x在一个或多个dout类中分配一个隶属度)
- 不再将每个特征表示为唯一维度而是将其表示为密集向量。也就是说,将每个核心特征嵌入到d维空间中,并表示为该空间的向量。然后可以像函数NN的其他参数一样训练这种嵌入。
- 基于前馈神经网络的NLP分类系统的基本架构如下:
- 提取一系列与预测输出项相关的核心语言特征f1,.....,fk
- 对于每个感兴趣的特征fi,检索对应的向量v(fi)
- 将这些向量组合成输入向量x
- 将x馈入非线性分类器
- 这个结构的关键在于使用密集型特征向量而不是稀疏特征向量,使用核心特征而不是特征组合
[图片上传失败...(image-2d7ec1-1539350214260)] - 对于这些核心特征的表示主要有稀疏和稠密两种表现形式即one-hot和Dense Vectors,如上图所示。其主要区别为:
1)one-hot:每个维度表示一个特征,其特征值是二维的,即若该特征值存在即为1,不存在则为0。每个特征都有其自身的维度。
2)Dense Vectors:每个核心特征代表一个向量,每个输入向量X对应几个输入向量条目。特征到向量的映射来自于嵌入表。每个特征都是d维向量,训练会使得相似的特征具有相似的向量。 - 应用场景
1)如果我们在一个类别中具有相对较少的不同特征,并且我们相信在不同特征之间没有关系,这时采用one-hot表示。
2)如果我们相信在一个组的不同特征之间存在联系,那么此时应该采用Dense Vectors,可以让神经网络弄清楚特征间的相关性并通过共享参数获得一些统计强度
3.1可变数量的特征
- 在很多情况下,特征的数量我们提前是不知道的。因此,我们需要用一个固定长度的向量表示一组无限数量的特征。一种方法就是CBOW(连续词袋),它与传统的词袋表示非常相似但是抛弃了顺序信息。
- CBOW(f1,...,fk) =
- 一个CBOW表示的变体就是权重CBOW,不同的向量有不同的权重:
WCBOW(f1,...,fk) =
:表示不同特征的相对重要性。例如,可以是TF-IDF分数
3.2距离和位置特征
- 句子中两个词的先行距离可以被看成一个informative feature
- 距离特征编码:将距离分成几组,每一组(bin)与一个d维向量相关联(得到distance-embedding vector),然后将这些向量作为网络中的常规参数去训练
3.4特征组合
- 在神经网络中,特征提取仅涉及核心特征
- 在传统的基于线性模型的神经网络中,功能设计师不仅要手动指定感兴趣的核心特征,还要指定这些特征之间的相互关系。
-
在线性模型中特征组合很重要,因为他们为输入引入了更多的维度,使得空间数据点更接近线性可分。
?
而在神经网络中定义的非线性的分类器用于寻找指定的特征组合,减少了工程量
-Kernel methods(核方法)允许功能设计师仅指定核心特征,而将特征组合的方面留给学习算法,它允许精确的最优化问题。然而,其运算复杂度与训练的数据量成线性关系,因此不适用于很大的数据集。神经网络的分类的复杂度与训练的数据大小无关,而只与神经网络的大小线性相关。
3.5维度(Dimensionality )
- 维度随着类成员的数量增加而增长。
- 由于维度对内存需求和处理时间有直接的影响,所以要多尝试几次不同的大小,选择一个在速度和任务准确性上选择一个最好的。
3.6特征共享(Vector Sharing)
- 在一些情况下,一些特征共享相同的词汇表(vocabulary)。
- 对于两个向量,是否共享词汇表是一个经验问题。如果认为单词出现在不同位置时表现不同,那么久使用两个不同的词汇表。否则就共享一个词汇表。
3.7网络输出(Network’s Output)
- 在多类分类问题中,网络的输出是一个k维向量,每个维度代表一个特定输出类的强度。也就是说,输出仍然保持在传统的线性模型中。
- 在第四章中,输出层对应一个d*k维的矩阵。其中,每一列表示d维embeddings,向量表示之间的相似性表示输出类之间模型学习的相似性。
4.前馈神经网络
本章包括:
- representation power
- common non-linearities
- loss function
4.1一个典型的神经网络如下图所示:
[图片上传失败...(image-559882-1539350214260)]
1)其中,每个圆圈代表一个神经元,射入箭头是神经元的输入,射出箭头是神经元的输出。每个箭头都携带一个权重,代表其重要性。
2)最底层没有传入箭头,是网络的输入层。最顶层没有外出箭头,是网络的输出层。其他层称之为“隐藏层”。神经元中的代表一个非线性函数,通常是
3)在这个图的表示中,每一个神经元都与下一层的所有神经元相连接,对于类似网络结构称之为完全连接层或者仿射层
4)将具有标量输入和输出的计算单元看作神经元,计算出每个神经元与其权重的乘积,在进行加和,之后通过一个非线性函数对该加和进行运算,得到输出。
5)下面,用一些简洁的数学符号来描述整个运算过程。
- 把输入层看成一个4维的向量x,其上层是一个6维向量(h1)
- h = xW,其中W是一个向量矩阵,指的是输入行中第i个神经元与其连接的第j个神经元的权重
- 每次向下层传递时,都要经过激活函数g的变换
- 因此,第三层得到的输入为:(g(x****W1))W2
4.2用数学符号表示
- 最简单的神经网络是感知机,是关于输入的一个线性函数:
= xW + b (x∈,W∈, b∈)
其中,W是权重矩阵,b是偏差项
- 包含一个隐藏层的多层感知机(MLP1):
= g() +
(x∈,∈, ∈, ∈,∈)
- 包含两个隐藏层的多层感知机(如上图所示):
= +
使用中间变量可能更清晰:
= y
y =
1)由每个线性变换产生的向量成为"layer",最外层变换结果成为输出层(其偏差项往往为0),其他线性变换称为"hidden layer"(每个"hidden layer"都要经过一个非线性的激活函数)。
2)具有多个隐藏层的网络称为是深度网络,因此也称深度学习
3)神经网络的每一层将维向量作为其输入,并将其转换为维向量。层的维度被视为其输出的维度。对于感知机来说,x的维度是1,W的维度是,b的维度是1
4)对于,
- 如果=1,那么网络的输出是一个标量,以通过输出的值来用于回归(或评分),或者通过查询输出的符号用于二进制分类
- 如果=k > 1,可以将每一个维度与一个类相关联,并找出具有最大值的维度,以此用于k-class分类。如果输出向量条目为正并且总和为1,则可以将输出看作为类分配上的分布。(这种输出归一化常在输出层上应用,通过softmax变换来实现)
4.3 表现力
- MLP1是一种通用的逼近器,他可以用所需的非零误差逼近一系列函数,包括有界子集上的所有连续函数,以及从任何有限维离散空间到另一个有限维离散空间的任何函数映射
- 然而,MPL1并不能保证训练算法可以找到生成训练数据的正确函数,也没有说明隐藏层应该有多大。
- 因此,在实践中,我们使用本地搜索算法在相对少量的数据上训练,并且使用相对适中的隐藏层(上限几千)。
4.4 Common Non-linearities(常见的非线性,即激活函数g)
在什么场景下使用哪种非线性函数,目前还没有一个很好的结论,这大多还是一个经验问题。常见的非线性函数大概有如下几种:
- Sigmoid(S型)
σ(x) = , σ(x)[0,1]
- TANH(双曲正切)
tanh(x) = ,tanh(x)[-1,1]
3.HARD TANH(是tanh的近似值,其计算速度更快)
hardtanh(x) =
4.RELU(整流线性单元,易于使用,结果出色)
ReLU(x) = max(0, x) = =
5.根据经验,其工作性能:RELU > tanh > singmoid
注:另外两种的工作性能在不同情况下有很好的非线性
1)Cube:g(x) = ,它在用于预测行动的前馈网络中更有效
2)tanhCube: g(x) = tanh( + x), 在用于基于图形的依赖解析器的结构预测中的一个组件更有效。
这些激活功能在某些情况下可以改善性能,但其通用性还不确定
4.5输出转换(Output Transformations)
-
当我们对可能的输出类的概率分布建模感兴趣时,我们可以采用softmax转换,将输出向量转换成为一个非负实数的向量且总和为1,并使其成为k个可能结果的离散概率分布。
x =x1, . . . , xk
softmax(xi) =
-
为了更高效,softmax通常与概率训练目标一起使用,例如交叉熵
-
当softmax应用于没有隐藏层的output时,结果是著名的多项逻辑回归模型,也称最大熵分类器
4.6 嵌入层(Embedding Layers)
-
在NLP应用中,输入向量x由几个嵌入向量组成。我们可以明确x的来源,并将其包含在网络的定义中。我们引入c(·),一个从核心特征到输入向量的函数。
1)c通常提取与每个特征相关联的嵌入向量,并进行连接。x = c(f1, f2, f3) =
=(c())
=()
= + )) +2)另一个常见的选择是c对嵌入向量求和(假设嵌入向量具有相同的维度)
x = c(f1, f2, f3) =
=(c())
=()
= + )) + -
假设有一个V个单词的词表,每个词嵌入d维向量 。则可以将向量集合视为| V |×d的嵌入矩阵E,其中每行对应嵌入特征。令:
: 1 x |V|向量,除了一个索引值为1外全为0(该索引对应第i个特征的值)
E将选择相应的E的行,因此,v()可以用E和来定义,即:v() = E
例如:
= (0,1,0),E=因此,v() = ()
-
类似的,
CBOW(,...,) = = ()E -
然后,网络的输入被认为是一个one-hot向量的集合。虽然这在数学上很好地定义,但是有效的实现通常涉及基于散列的数据结构,将特征映射到它们对应的嵌入向量,而不是通过one-hot表示
-
在本文中,我们将c与网络架构分开:网络的输入始终是密集的实值输入向量,并且在输入传递到网络之前应用c
4.6.2 关于符号的注记(A Note on Notation)
当一个网络的输入是几个向量的的连接时,
1)显式连接:([x;y;z]W+b)
- 仿射变换:(xU + yV + zW +b),如果矩阵U,V,W彼此不同,那么这两种向量表示等价
4.6.3 关于稀疏与密集特征的注记(A Note on Sparse vs. Dense Features)
- 考虑传统的没有嵌入层的网络,其中
- V是所有可用的特征组合,
- 个特征, V
- 网络输入:x = , x
- 因此第一层(忽略非线性激活函数):
xW + b = ()W
W,b
- 这非常类似于在特征上产生CBOW表示的嵌入层,其中矩阵
- W充当嵌入矩阵
- 主要区别在于偏置矢量b的引入,以及嵌入层通常不经历非线性激活而是直接传递到第一层
- 另一个区别是上述情况迫使每个特征接收一个单独的向量(W中的行),而嵌入层提供更大的灵活性,例如允许特征“next word is dog”和“previous word is dog”共享相同的向量。
4.7 损失函数 (Loss Function)
训练神经网络时,就像训练线性分类器时一样,需要定义一个损失函数L(,y),说明当真实输出为y时预测的丢失(是网络的输出,y则是真实的输出)。训练的目标是最小化这种损失。
给定真实预期输出y时,损失函数L(,y)将为网络的输出指定数值分数(标量)。损失函数可以是将两个向量映射到标量的任意函数,出于优化的实际目的,我们将其局限于可以轻松计算梯度(或子梯度)的函数。下面给出一些常用的Loss Function:
- Hinge(二进制)
- 对于一个二元分类问题,网络的输出是一个单个的标量,预期输出y{+1,-1}。
- Hinge loss,也称为边缘损失或SVM loss
- = max(0,1-y*)
- 只有当y* > 0(也就是说,两者同号)时,分类才正确
- 如果y* > 0并且|| 1,那么loss为0。也就是说,二元hinge函数要实行正确的分类,其边界至少为1。
- Hinge (multiclass)
-
= ,网络的输出向量。
y:one-hot vector,正确的output class - 分类规则:选择具有最高分数的class:
prediction = arg max - t= arg : 正确的的class
k = arg : 最高得分的类
并且使得
那么, = max(0,1 - ()) - 每当我们需要一个 hard decision rule时并且不需要去模拟类成员概率,该方法就很有效
-
= ,网络的输出向量。
- Log Loss
- 是一个 hinge loss的一个变体,with an infinite margin
- =
- Categorical Cross-Entropy Loss(分类交叉熵)
- 当分数的概率解释理想时,该方法有效
- y = ,在标签1,...,n上代表真正的多项分布
= ,是被sonftmax激活函数转化过的网络输出,表示class membership的条件分布, = P(y = i | x) - 分类交叉熵Loss测量真实标签分布y和预测标签的不相似性,并定义为交叉熵: = -
- 对于hard classification problems(硬分类问题),其中每个训练示例仅有一个正确的类分配。此时y是一个one-hot vector,表示正确的class,其交叉熵简化为: = -
其中,t为correct class assignment。 - 目的:将正确的分类的概率质量设置为1。因为分数使用softmax函数转换并表示条件分布,所以增加the mass assigned to the correct class意味着减少 the mass assigned to all the other classes。
- 益处:不仅能预测 the one-best class label,而且也能预测a distribution over the possible labels。
- 但是要使用分类交叉熵Loss时,必须保证网络输出已经使用softmax进行了转换
- Ranking Losses
-
有时,我们并没有对标签进行监督,而是根据对正确和不正确的条目进行监督,并且我们要将正确条目的得分高于错误的。当我们只有positive examples时才会出现这样的训练情况,从而我们需要通过破坏一个positive examples来得到一个negative examples。在这种情况下有效的损失函数是margin-based ranking loss,定义如下:
= max
:网络给input vector x的打分
目的:正确的inputs score高于不正确的 -
一个通常的变体是使用ranking loss的log version:
= -
在语言任务中使用ranking hinge loss的例子是,训练导出预训练的字嵌入的辅助任务的训练。我们给出一个正确的单词序列和损坏的单词序列,我们的目标是正确序列的得分高于损坏的。
-
5.Word Embeddings(词嵌入)
神经网络方法的一个重要要组成部分是使用嵌入 - 将每个特征表示为低维空间中的向量。但是这些vector来自于何处?这就是本节要讨论的内容。
5.1 Random Initialization(随机初始化)
- 当有足够的监督训练数据时,可以将特征嵌入视为与其他模型参数相同:将嵌入向量初始化为随机值,并让网络训练程序将它们调整为“good”vectors。
- 执行初始化的方式
- word2vec implementation
将单词向量初始化为[]范围内的均匀采样随机数,其中d是维数 - xavier initialization
使用[] 的均匀采样值进行初始化
- word2vec implementation
- 在实践中
- 使用随机初始化方法初始化常见特征的嵌入向量,例如词性标签或单个字母
- 使用某种形式的监督或无监督预训练来初始化潜在的稀有特征,例如单个单词的功能。预训练的vector在网络训练过程中被视为fixed vectors或者randomly-initialized vectors
5.2 Supervised Task-Specific Pre-training(有监督的特定任务的预训练)
- 如果我们对任务A感兴趣,但只有有限数量的标记数据(例如:语法分析)
若此时有一个辅助任务B,有比较多的标记数据(比如:词性标记) - 我们想要预先训练我们的word vectors,以便它们作为任务B的预测变量时表现的更好,然后再使用这些训练过的词向量来训练任务A。这样,我们就可以利用任务B所具有的大量标记数据。
- 在训练任务A时,我们可以将预训练的vector视为fixed,或者将其进一步调整他们用于任务A.另一种选择是将两个目标联合训练。
5.3 Unsupervised Pre-training(无监督的预训练)
-
常见的情况是,我们没有拥有足够大量的注释数据的辅助任务。在这种情况下,我们采用“无监督的“方法,可以在大量未注释的文本上进行训练。
-
训练单词向量的技术本质上是监督学习的技术,但我们不是监督我们关心的任务,而是从原始文本创建几乎无限数量的监督训练实例,从而希望我们创建的任务与我们关心的最终任务相匹配(或足够接近)。
-
key idea: "similar" words的嵌入向量具有相似的向量
-
由于词的相似性很难定义,因此当前所使用的方法来自于分布假设,即如果两个词的上下文相同,那么这两个词的表示也是相似的
-
不同的方法都创建了有监督的训练实例,其目标是从其上下文预测单词,或从单词预测上下文。
-
在大量未注释的数据上训练词嵌入的一个重要好处是,它为未出现在监督训练集中的词提供了向量表示。理想情况下,这些单词的表示将与训练集中出现的相关单词的表示相似,从而允许模型更好的概括unseen events。
-
常用的无监督学习算法:
- word2vec
- GloVe
- Collobert and Weston embeddings algorithm
这些模型的灵感来自于神经网络,并基于随机梯度训练(stochastic gradient training)
-
可以说,辅助问题的选择(基于什么样的上下文预测的内容)对结果向量的影响远远超过用于训练它们的学习方法的选择。因此,我们专注于可用的辅助问题的不同选择,并且仅略过训练方法的细节。
-
值得注意的是,由无监督训练算法导出的词嵌入在NLP中除了用于初始化神经网络模型的词嵌入层之外,还有广泛的应用。
5.4 训练目标
1给定一个词w和其上下文c
2)不同的算法会制定不同的辅助任务(auxiliary tasks)
3在所有的case下,每个单词被表示为d维向量,其被初始化为随机值
4)训练模型使其很好地执行辅助任务从而产生用于把词和上下文联系起来的good word embeddings反过来使得相似单词的嵌入向量也彼此相似
- Language-modeling inspired approaches(语言建模的启发式方法),目标是根据其上下文预测单词。这是在概率设置中提出的,试图去模拟条件概率P(w|c)
- 其他方法将问题简化到二进制分类的问题:
- 除了观察到的 ”word-context pairs“的集合D之外,还生成了一个"random words and context pairings"的集合。
- 二元分类的问题是:给定的(w,c)对是否来自集合D?
- 这些方法有三个不同之处
5.5 上下文的选择
- context:单词的上下文。是指出现在其周围的其他单词(可以是在其周围的短窗口中,也可以是在同一个句子,段落或文档中)。在某些情况下,文本是由语法分析器自动解析的,并且上下文是从自动分析树引发的语法邻域派生的。
- 有时,单词和上下文也可以是单词的一部分,例如前缀或后缀
- 神经词嵌入源于语言建模的世界,其中训练网络以基于先前词的序列预测下一个词。
- 在这里,文本用于创建辅助任务,其中目的是基于k个先前词的上下文来预测词。
- 虽然对语言建模辅助预测问题的训练确实产生了有用的嵌入,但是这种方法受到语言建模任务的约束,其中只允许查看前面的单词。
- 如果我们不关心语言建模而只关心最终的嵌入,我们可以通过忽略这个约束并使上下文成为焦点词的对称窗口来做得更好。
5.5.1 窗口方法(Window Approach)
- 滑动窗口方法
- 辅助任务的创建:查看2k + 1个字的序列,其中中间的词被称为是焦点词,焦点词的两边各有k个词,成为context(上下文)
- 随后:
1)创建一个任务,其目标是基于所有上下文的词(用CBOW或矢量连接)来预测焦点词。
2)或者创建2k个不同的任务(distinct tasks),每个任务将焦点词与不同的上下文词配对。 - 2k任务方法被称为Skip-gram模型,基于Skip-gram的方法被证明对于训练是强健和有效的,并且经常产生最先进的结果。
-
窗口大小的影响:滑动窗口的大小对结果向量的相似性有很大的影响。
1)较大的窗口倾向于产生更多的局部相似性(即“dog”, “bark” 和 “leash” 将被组合在一起,以及 “walked”, “run” 和 “walking”)
2)较小的窗口倾向于产生更多的功能和句法相似性(即“Poodle”(贵宾犬), “Pitbull”(比特犬), “Rottweiler”(罗威犬), or “walking”,“running”和“approaching”) -
带位置的窗口(Positional Windows)
1)当使用CBOW或skip-gram上下文表示时,窗口内的所有不同上下文单词被平等对待,即焦点词的距离、是出现在焦点词前还是后没有区别。
2)通过使用positional contexts可以考虑这样的信息:为每个上下文单词指示它与焦点单词的相对位置(即,上下文单词不是“the”而是“the:+2”,表示单词出现在焦点词右侧的两个位置)。
3)优点:①与小窗口的结合能产生更多语法相似性,并且具有将共享词性的词组合在一起的强烈倾向,以及在语义功能上相似
②当用于初始化网络以进行词性标注和语法依赖性解析时,Positional vectors比window-based vectors表现的更加有效。 -
Variants(变体):窗口方法可能有许多变体。
1)可以在学习之前对单词进行词典化,应用文本归一化,过滤太短或太长的句子,或者去除大小写。
2)可以对语料库的一部分进行子样本处理,跳过一些常见的或太罕见的焦点词的窗口的创建任务。
3)窗口大小可以是动态的,在每次尝试中使用不同的窗口大小。可以用不同的方式来衡量窗口的不同位置,更多地关注于试图正确的预测附近的word-context pairs而不是更远的。
4)这些选择中的每一个都将影响结果向量。
5.5.2 Sentences, Paragraphs or Documents
- 使用skip-gram(或CBOW)方法,可以将单词的上下文视为与同一句子,段落或文档中出现的所有其他单词。
- 这相当于使用非常大的窗口,并且会捕获与主题相似的word vector(来自同一主题的单词,即人们期望出现在同一文档中的单词,很可能会接收到类似的向量)
5.5.3 句法窗口(Syntactic Window)
- 一些工作用句法替换句子中的线性上下文。
- 文本被依赖解析器自动解析,单词的上下文被视为在解析树中的近似,两者被句法关系相连。
- 这些方法产生highly functional similarities,将单词分组而不是在句子中填充相同的角色(例如,不同的颜色、学校的名称、行为动词)。
5.5.4 多种语言(Multilingual)
- 另一种选择是使用多语言、基于翻译的上下文。
- 例如,给定大量句子对齐的并行文本,可以运行双语对齐模型,例如IBM模型1或模型2(即使用GIZA ++软件),然后使用生成的对齐方式来推导单词上下文。这里,一个单词实例的上下文是与其对齐的外语单词。这样的对比往往会导致得到相似向量的同义词。
- 有时候我们不依赖词对齐,而是使用句子对齐。
- 一种吸引人的方法是将单语窗口方法与多语言方法相结合,创建两种辅助任务。
- 这很可能产生类似于基于窗口的方法的向量,但减少了基于窗口方法的一些不希望的影响,其中的反义词(例如热和冷,高和低)倾向于接收类似的向量。
5.5.5 基于字符和子字表示(Character-Based and Sub-word Representations)
- 一个有趣的工作是尝试从组成它的字符中导出一个单词的向量表示。
- 对于语法上的任务特别有效,因为单词中的字符模式与它们的句法功能密切相关。
- 这些方法也有利于产生非常小的模型尺寸(对于字母表中的每个字符,只需要存储一个矢量以及少量的小矩阵),并且能够为可能遇到的每个单词提供嵌入向量。
- 从字符的表示中获得单词的表示是由未知单词问题驱动的:当遇到一个没有嵌入向量的单词时你会怎么做?
- 在字符级别上工作很大程度上缓解了这个问题,因为可能字符的词汇比可能单词的词汇要小得多。
- 但是,处理字符级别非常具有挑战性,因为语言中的形式(字符)和功能(语法,语义)之间的关系非常松散。
- 因此一些研究人员提出了一个中间立场,将word表示为其自身向量与构成它的子词单元的向量的组合。
- 然后,子词嵌入有助于在相似形式的不同单词之间共享信息,并且当词未被观察时时允许返回到子词级别
- 同时,只要有足够的词观察样本,模型不会被迫仅仅依赖于形式
6. 神经网络训练
- 神经网络训练:利用梯度的方法,使训练集上的损失函数最小
- 错略的说,所有的训练方法无非为三种:
- 重复计算数据集上的误差估计
- 计算相对于误差的梯度
- 沿梯度相反的方向移动参数
- 各个模型的不同之处在于如何计算误差估计,以及如何定义“在梯度的相反方向上移动”。
6.1 随机梯度训练(Stochastic Gradient Training)
- 训练神经网络的常用方法是使用随机梯度下降(SGD)算法或其变体。SGD是一种通用优化算法。
- 算法工作流程如下:
Input: f(x; θ) ,参数θ,输入向量x
Input: 训练输入集 和输出集
Input: 损失函数L.
while 停止标准未满足 do
训练样例抽样:xi, yi
计算损失 L(f(xi;θ), yi)
计算关于θ的梯度
θ ←
return θ
1)该算法的目标是设置参数θ,以便最小化训练集上的总损失
2)它通过重复抽样训练示例并根据参数θ计算样例中的误差梯度来工作--- 假设输入和预期输出是固定的,并且将损失视为参数θ的函数
3)然后在梯度的相反方向上更新参数θ,通过learning rate 进行缩放。learning rate可以在整个训练过程中固定,也可以作为时间步长t的函数进行衰减。
4)缺点:不精确,只针对一个训练样例,会产生noise,从而导致导致不准确的梯度。 - minibatch SGD algorithm(小批次SGD训练)
Input: 函数 f(x; θ) ,参数θ.
Input: 训练输入集 和输出集
Input: 损失函数L
while 停止标准未满足
抽取一个含有m个样例的minibatch {}
for i = 1 to m
计算损失L
← + L关于θ的梯度
θ ←
return θ
1)在第6-9行中,算法基于minibatch来估计语料库损失的梯度。在循环之后,g包含梯度估计,并且参数θ朝向g更新。
2)小批次的sizem可以从1到n。较高的值能够对语料库范围梯度产生更好的估计,而较小的值允许更多的更新,并且反过来可以更快地收敛。
3)除了提高梯度估计的准确性之外,小批量算法能够提高训练效率。对于适度的m大小,一些计算架构(即GPU)允许在第6-9行中有效地实现并行计算。如果函数是凸的,那么通过适当降低学习率,SGD可以保证收敛到全局最优。但是,它也可以用于优化非凸函数,如神经网络。虽然不再能保证找到全局最优,但该算法在实践中表现也很好。 - 在训练神经网络时,函数f是神经网络,参数θ是线性变换矩阵,偏置项,嵌入矩阵等。梯度计算是SGD算法以及所有其他神经网络训练算法中的关键步骤。
- 那么,如何根据参数计算网络误差的梯度呢?可以使用backpropagation algorithm(反向传播算法)。
6.1.1 Beyond SGD
- 虽然SGD算法可以并且通常确实产生了良好的结果,但也可以使用更先进的算法。SGD扩展可以通过SGD+Momentum或者Nesterov Momentum进行算法优化,也可以通过自适应学习率进行优化,常见的有AdaGrad、AdaDelta、RMSPorp、Adam适用于不同的网络结构。
6.2 计算图抽象(The Computation Graph Abstraction)
- 虽然可以手动计算网络各种参数的梯度并在代码中实现它们,但这个过程既麻烦又容易出错。在大多数情况下,最好使用自动工具进行梯度计算。计算图抽象允许我们轻松构建任意网络,评估它们对给定输入的预测(正向传递),并计算其参数相对于任意标量损失的梯度(向后传递)。
- 图计算是任意数学计算的表示,它是有向无环图(DAG),其中节点对应于数学运算或变量,边对应于节点间中间值的流动。图结构根据不同组件之间的依赖关系定义计算的顺序。图是DAG而不是树,因为一个操作的结果可以是几个连续的输入。
- 例如:上图的结果是 (a ∗ b + 1) ∗ (a ∗ b + 2)[图片上传失败...(image-7e8911-1539350214260)]
- 由于神经网络本质上是一种数学表达式,因此它可以表示为图计算。例如,图3a给出了具有一个隐藏层和softmax输出变换的MLP的计算图。在我们的表示法中,椭圆形节点表示数学运算或函数,阴影矩形节点表示参数。网络输入被视为常量,并且没有周围节点。输入和参数节点没有传入弧,输出节点没有传出弧。每个节点的输出是矩阵,其维度在节点上方指示。
- 但此图表不完整:由于未指定输入,我们无法计算输出。图3b显示了MLP的完整图表,该图表将三个单词作为输入,并预测第三个单词的词性标签的分布。此图可用于预测,但不用于训练,因为输出是向量(不是标量),图表未考虑正确答案或损失项。最后,3c中的图表显示了特定训练示例的计算图,其中输入是单词“the”,“black”,“dog”(嵌入),预期输出是“NOUN”(其索引是5)。pick节点实现索引操作,接收向量和索引(在本例中为5)并返回向量中的相应条目。
[图片上传失败...(image-2d2d27-1539350214260)] - 一旦构建了图形,就可以直接运行正向计算(计算结果)或反向计算(计算梯度),如下所示。构建图表可能看起来令人生畏,但使用专用软件库和API实际上非常容易。
6.2.1 正向计算(Forward Computation)
- 正向传递计算图中节点的输出。由于每个节点的输出仅取决于它自身和它的输入边,所以通过以拓扑顺序遍历节点,并根据其之前已经计算得到的输出计算每个节点的输出,以此来计算所有节点的输出是很简单的。
- 在N个节点的图中,索引 i 与各个节点的拓朴顺序相关联,是节点 i 的计算功能(如:乘法、加法)。是节点 i 的父节点,= { j | i ∈ π(j)}是节点 i 的子节点。v(i)表示节点i的输出,即对其参数的输出值的application。
- 对于变量和输入节点,是常数函数,是空的。该算法计算所有的v(i),其中 i∈ [1, N]。
-
Computation Graph Forward Pass:
for i = 1 to N
Let
v(i) ←
6.2.2 反向计算(Backward Computation)
- 向后传递从指定具有标量输出(1×1)的节点N作为 loss-node开始,并向前计算直到该节点。Backward Computation计算相对于该节点的值的梯度。
- d(i) = ,反向传播算法用于计算所有节点 i 的值d(i)。
-
Computation Graph Backward Pass (Backpropagation):
d(N) ← 1
for i = N-1 to 1
d(i) ←
其中,: 是对 i 求偏导, i ∈ 。该值依赖于和它的参数v((其中),这些值是在向前传递中计算的。
- 因此,为了定义新类型的节点,需要定义两种方法:一个用于根据节点输入计算正向值v(i),另一个用于计算,对于每一个x∈ 。
6.2.3 Software
- 几个软件包实现了计算图模型,包括Theano,Chainer,penne和CNN / pyCNN。所有这些软件包都支持所有基本组件(节点类型),用于定义各种神经网络体系结构,涵盖本教程中描述的结构等。通过使用运算符重载,图形创建几乎是透明的。框架定义了一种表示图形节点的类型(通常称为表达式),用于构造输入和参数的节点的方法,以及一组函数和数学运算,它们将表达式作为输入并产生更复杂的表达式。例如,使用pyCNN框架从图3c创建图计算的python代码是:
import pycnn as pc
# model initialization.
model = pc.Model()
pW1 = model.add_parameters((20,150))
pb1 = model.add_parameters(20)
pW2 = model.add_parameters((17,20))
pb2 = model.add_parameters(17)
words = model.add_lookup_parameters((100, 50))
# Building the computation graph:
pc.renew_cg() # create a new graph.
# Wrap the model parameters as graph-nodes.
W1 = pc.parameter(pW1)
b1 = pc.parameter(pb1)
W2 = pc.parameter(pW2)
b2 = pc.parameter(pb2)
def get_index(x): return 1 # place holder
# Generate the embeddings layer.
vthe = pc.lookup(words, get_index("the"))
vblack = pc.lookup(words, get_index("black"))
vdog = pc.lookup(words, get_index("dog"))
# Connect the leaf nodes into a complete graph.
x = pc.concatenate([vthe, vblack, vdog])
output = pc.softmax(W2*(pc.tanh(W1*x)+b1)+b2)
loss = -pc.log(pc.pick(output, 5))
loss_value = loss.forward()
loss.backward() # the gradient is computed
# and stored in the corresponding
# parameters.
- 大多数代码涉及各种初始化:第一个块定义了在不同计算图之间共享的模型参数(回想一下,每个图对应于特定的训练示例)。第二个块将模型参数转换为图形节点(表达式)类型。第三个块检索表达式以嵌入输入单词。最后,第四个块是创建图形的位置。请注意图形创建是多么透明——在创建图形和数学描述图形之间几乎存在一对一的对应关系。最后一个块显示前进和后退。其他软件框架遵循类似的模式。
6.2.4 Implementation Recipe
- 用图抽象计算的神经网络训练的伪代码(minibatch的大小为1):
定义网络参数
for iteration = 1 to N
for 训练样例(在数据集中)
loss_node build_computation_graph(,arameters)
loss_node.forward()
gradients loss_node().backward()
parameters update_parameters(parameters, gradients)
return parameters - 这里,build_computation_graph是一个用户定义的函数,它为给定的输入,输出和网络结构建立计算图,返回单个loss node。update_parameters是特定于优化程序的更新规则。The recipe指定为每个训练示例创建一个新图。这适用于训练示例之间的网络结构变化的情况,例如循环和递归神经网络。对于具有固定结构的网络,例如MLP,创建一个基本计算图并且仅改变示例之间的输入和预期输出可能更有效。
6.2.5 网络组成(Network Composition)
- 只要网络的输出是向量(1×k矩阵),通过将一个网络的输出作为另一个网络的输入来组成网络,从而创建任意的网络是很简单的。图抽象计算使得这种能力显而易见:计算图中的节点本身可以是具有指定输出节点的计算图。然后,人们可以设计任意深度和复杂的网络,并且由于自动前向和梯度计算,能够轻松地评估和训练它们。这使我们很容易定义和训练结构化输出和多目标训练的网络,以及复杂的循环和递归网络。
6.3优化问题
- 一旦考虑了梯度计算,就使用SGD或其他基于梯度的优化算法对网络进行训练。被优化的函数不是凸的,长期以来,神经网络的训练被认为是一种“黑色艺术”,只能由少数人完成。实际上,许多参数会影响优化过程,因此必须注意调整这些参数。虽然本教程不打算作为成功训练神经网络的全面指南,但我们在这里列出了一些突出的问题。
6.3.1 初始化
- 损失函数的非凸性意味着优化过程可能陷入局部最小值或鞍点,并且从不同的初始点开始(例如,参数的不同随机值)可能导致不同的结果。因此,建议从不同的随机初始化开始多次重新训练,并根据开发集选择最佳训练集。对于不同的网络公式和数据集,结果的方差量不同,无法提前预测。
- 将权重矩阵W∈初始化为:
W ∼ U[]
其中U [a,b]是[a,b]范围内的均匀采样随机值。 - He et al 建议:当使用ReLU非线性时,权重应通过从标准偏差为的零均值高斯分布中采样来初始化。涉及深度网络时,这种初始化更好。
6.3.2 消失和爆炸的梯度(Vanishing and Exploding Gradients)
- 在深度网络中,误差梯度通常在计算图传播时消失(变得非常接近0)或爆炸(变得非常高)。在更深层次的网络中问题变得更加严重,特别是在递归和循环网络中。
- 解决方案包括使网络更浅,逐步训练(首先根据一些辅助输出信号训练第一层,然后根据实际任务信号修复它们并训练整个网络的上层),执行批量标准化(对于每个小批量,将每个网络层的输入标准化为零均值和单位方差)或使用旨在帮助梯度流的专用架构(例如,用于循环网络的LSTM和GRU架构)。
- 处理爆炸梯度有一个简单但非常有效的解决方案:如果梯度超过给定阈值(threshold),则剪切梯度。设是网络中所有参数的梯度,而||||是它们的范数。
设置: ← ,如果|||| > threshold
6.3.3 饱和和死亡神经元(Saturation and Dead Neurons)
- 饱和:具有tanh和sigmoid激活的图层可能会变得饱和,将会导致该图层的输出值都接近1(即激活函数的上限)。饱和神经元梯度很小,应该避免。
改善:饱和神经元是由于进入该层的值太大引起的,可以改变初始化、缩放输入值的范围或改变学习速率来控制。另一种选择是在激活后对饱和层中的值进行标准化,即使用g(h) = 来代替g(h) =tanh(h) 。 - 死亡:具有ReLU激活的层可能会死亡,将会导致大多数或所有值都是负的,因此对于所有输入都将其限制为零,从而导致该层的梯度为零。
改善:死神经元是由于进入该层的所有信号都是负的引起的(例如,这可能在大梯度更新之后发生)。可以通过降低学习率来控制。
6.3.4 Shuffling
- 训练实例呈现给网络的顺序是很重要的。上面的SGD公式规定在每个回合中随机选择一个例子。在实践中,大多数实现都按顺序进行训练示例。建议在每次通过数据之前对训练实例进行混洗。
6.3.5 Learning Rate
- 选择学习率很重要。学习速率太大会阻止网络融合到有效的解决方案上。太小的学习率需要很长时间才能收敛。
- 根据经验,人们应该尝试范围[0,1]范围内的一系列初始学习率,例如0.001,0.01,0.1,1。
- 一直监控网络随时间的损失,一旦网络固定在某个固定的区间,则降低学习率。
- 学习速率调度(Learning rate scheduling)根据观察到的微小数量来降低速率。常见的调度是将初始学习率除以迭代次数。
- L'eon Bottou 建议使用 = 形式的学习率。其中是初始学习率,是在第t个训练样例上使用的学习率,λ是额外的超参数。他进一步建议,在运行整个数据集之前,根据一小部分数据确定的良好值。
6.3.6 Minibatches(小批次)
- 参数更新发生在每一个训练示例(size为1的小批量)或每个K训练示例中。一些问题受益于larger minibatch sizes的训练。
- 在抽象图计算方面,可以为每个k个训练实例创建计算图,然后将k个损失节点连接在一个平均节点下,该平均节点的输出将是 minibatch的损失。
- Large minibatched 训练在诸如GPU之类的专用计算体系结构上的计算效率以及用矩阵运算代替向量矩阵运算方面也是有益的。
6.4 Regularization(正则化)
- 神经网络模型具有许多参数,并且容易发生过度拟合。正则化可以在一定程度上缓解过度拟合。
- 常见的正则化方法是正则化,在损失函数的代价函数后加一个正则化项:. 其中,θ是模型参数的集合,是范数的平方,λ是控制正则化量的超参数。
- 通过向要最小化的目标函数添加加法λ2kθk2项,对具有大值的参数设置平方惩罚,其中θ是模型参数的集合,k·k2是平方L2norm(值的平方和),λ是控制正则化量的超参数
-
dropout:正则化的替代,旨在防止网络学习依赖特定权重。
方法:在每个训练示例中随机drop掉(设置为0)网络(或特定层)中一半的神经元
7. 级联和多任务学习(Cascading and Multi-task Learning)
- 将在线训练方法与使用计算图抽象的自动梯度计算相结合,可以轻松实现模型级联,参数共享和多任务学习。
7.1模型级联(Model Cascading)
- 模型级联是一种强大的技术,通过组合较小的组件网络来构建大型网络。
- 例如,前馈网络可以用于基于其相邻单词and/or组成单词的字符来预测单词的词性。在pipeline approach 中,我们将使用该网络来预测词性,然后将预测作为输入特征提供给进行语法分块或解析的神经网络。此外,我们可以把这个网络的隐藏层看作一种编码,它用于捕获预测词性的相关信息。在级联方法中,我们采用该网络的隐藏层并将它们(而不是词性预测本身)作为语法网络的输入进行连接。我们现在有一个更大的网络,它将单词和字符作为输入序列,并输出一个句法结构。计算图抽象允许我们容易地将语法任务丢失的错误梯度传播回字符。
- 为了解决深度网络的消失梯度问题,以及更好地利用可用的训练资源,可以通过在相关任务上分别训练单个组件网络的参数来引导它们,然后将它们插入更大的网络以进一步调整。
- 当使用卷积,递归和递归神经网络时,模型级联是非常常见的,例如,使用循环网络将句子编码成固定大小的向量,然后将其用作另一网络的输入。递归网络的监控信号主要来自上层网络,该上层网络在输入时消耗递归网络的输出。
7.2 多任务学习
- 用于:当我们有一些相关但是不一定相互影响的预测任务时,我们相信对一种预测有用的信息也可以对其他任务有用。
- 例如,分块,命名实体识别(NER)和语言建模是协同任务的示例。用于预测块边界,命名实体边界和句子中的下一个词的信息都依赖于一些共享的底层语法 - 语义表示。我们可以创建一个具有多个输出的网络,而不是为每个任务单独训练的网络。一种常见的方法是建立一个多层前馈网络,然后将其最终隐藏层(或所有隐藏层的串联)传递到不同的输出层。这样,网络的大多数参数在不同任务之间共享。从一个任务中学到的有用信息可以帮助消除其他任务的歧义。
- 同样,计算图抽象使得构建这样的网络并计算它们的梯度变得非常容易,通过为每个可用的监控信号计算单独的损失,然后将损失汇总成用于计算梯度的单个损失。如果我们有几个语料库,每个语料库都有不同类型的监督信号(例如我们有一个NER语料库和另一个用于分块的语料库),训练过程将混洗所有可用的训练示例,并在每轮执行梯度计算和针对不同的损失进行更新。
8.结构化输出预测(Structured Output Prediction)
- NLP中的许多问题涉及结构化输出:期望输出不是类标签或类标签上的分布,而是结构化对象(例如序列,树或图形)的情况。典型示例是序列标记(例如,词性标记)、序列分割(分块,NER)和句法分析。在本节中,我们将讨论前馈神经网络模型如何用于结构化任务。
8.1贪婪的结构预测(Greedy Structured Prediction)
- 结构化预测的贪婪方法是将结构预测问题分解为一系列局部预测问题,并训练分类器去执行每个局部决策。在测试时,训练的分类器以贪婪的方式使用。例如:从左到右的模型标记( left-to-right tagging models)和基于贪婪转换的解析(greedy transition-based parsing)。这些方法可以简单地将局部分类器从线性分类器(例如SVM或逻辑回归模型)替换为神经网络。
- 这种贪婪的方法会受到误差传播的影响,早期决策中的错误会延续并影响以后的决策。可以达到整体更高精度的非线性神经网络分类器在一定程度上有助于抵消该问题。此外,还可以通过尝试在更难的预测之前进行更容易的预测,或通过将训练过程暴露于可能由于错误导致的输入来使训练条件更类似于测试条件,来减轻错误传播问题的训练技术。
8.2 基于搜索的结构化预测(Search Based Structured Prediction)
- 预测自然语言结构的常用方法是基于搜索。基于搜索的结构化预测被公式化为可能结构范围的搜索问题:
[图片上传失败...(image-26a9f6-1539350214260)]
其中x是输入结构,y是x上的输出(例如:x是句子,y是句子上的 tag-assignment 或解析树),Y(x)是所有x的可用结构集合。我们想要找到一个输出y,它将使x,y对的得分最大化。 - 评分函数定义为一个线性模型:
score(x, y) = w · Φ(x, y)
其中Φ是特征提取函数,w是权重向量
为了便于搜索最优y,将结构y分解为若干部分,并根据各部分定义特征函数,其中 φ(p)是局部特征提取函数:
[图片上传失败...(image-30b212-1539350214260)]
对每个部分分别进行评分,结构评分是组成该结构的部分评分的总和:
[图片上传失败...(image-f3a21b-1539350214260)]
其中p∈y是p∈part(x,y)的简写。将y分解为多个部分是这样的,即存在一种推理算法,该算法允许在给定各个部分的得分的情况下有效的搜索最佳得分结构。 - 现在,我们可以用神经网络简单地替换组件上的线性评分函数:[图片上传失败...(image-d04786-1539350214260)]
其中c(p)将部分p映射到维向量。 - 在一个隐藏层的前馈网络的情况下,[图片上传失败...(image-8d1344-1539350214260)]
其中,c(p)∈,,, - 结构化预测的一个共同目标是使 gold structurey 的分数高于任何其他结构,从而导致下列(generalized perceptron)损失:
[图片上传失败...(image-faba91-1539350214260)] - 执行顺寻如下:
1)为每个可能的部分创建计算图,并计算其得分
2)对scored parts 进行 run inference, 找到最佳得分结构。
3)将对应于 gold(predicted)结构y()中的部分计算图的输出节点连接到求和节点
4)使用 "minus" node,,连接,并计算其梯度。 - 当在训练结构化预测神经网络(structured prediction neural networks)时,广义感知器损失不是一个好的损失函数,因为它没有 margin,因此 margin-based hinge loss 是首选:
[图片上传失败...(image-e3325b-1539350214260)] - 请注意,在这两种情况下,我们都会失去线性模型的优良特性。特别地,该模型不再是凸的了。这是在预期范围内的,因为即使最简单的非线性神经网络也已经是非凸的。尽管如此,我们仍然可以使用标准的神经网络优化技术来训练结构化模型。
- 训练和推理较慢,因为我们必须评估神经网络(并采用梯度)| parts(x,y) | 次。
8.2.1 Probabilistic Objective (CRF) :概率目标
-
在概率框架(条件随机字段,CRF)中,我们将每一部分分数视为 clique potential 并定义每个结构的分数y为:
[图片上传失败...(image-c48a0c-1539350214260)]评分函数定义条件分布P(y | x),并且我们希望设置网络的参数,使得语料库条件对数似然最大。
-
然后,给定训练示例(x,y)的损失为: - log 。
8.2.2 重新排序(Reranking)
- 用途:当搜索所有可能的结构是不现实的、低效的或是难以集成到模型中,经常使用 Reranking方法。
- 过程:在 Reranking 框架中,基础模型用于生成 k-best scoring structures 的列表。然后训练更复杂的模型以在 k-best 列表中对候选者进行评分,使得关于the gold one的最佳结构的得分最高。
- 由于现在搜索的是在k个项目上而不是在指数空间上执行的,因此复杂模型可以对得分结构的任意方面进行条件化(从中提取特征)。Reranking 方法是使用神经网络模型进行结构化预测的自然候选方法,因为它们允许建模者专注于特征提取和网络结构,同时无需将神经网络评分集成到解码器中。
8.2.3 MEMM和混合方法(MEMM and Hybrid Approaches)
- MEEM: 用MLP替换逻辑回归(“最大熵”)组件
- 神经网络模型和线性模型之间的混合方法: 在两阶段模型中基于转换的依赖关系解析
1)第一阶段:训练静态前馈神经网络(MLP2),使得在隔离的情况下对结构化问题的每个单独决策表现良好。
2)第二阶段:神经网络模型保持固定,然后将每个输入的不同层(输出以及隐藏层向量)连接起来,并用作线性结构感知器模型的输入特征。经过训练,可以对最佳结果进行波束搜索(beam-search)。 - 虽然目前尚不清楚这种训练方法是否比训练单个结构化预测神经网络更有效,但使用两个更简单的、孤立的模型允许研究人员进行更广泛的超参数搜索(例如调整图层大小、激活函数、学习率等等),相对于使用更复杂的网络,这无疑是个更可行的方案。