第三讲-神经网络知识
1 神经网络基础
1.1 分类问题基础
对于分类问题,我们有训练数据集:它由一些样本组成: \[ \{x_i,y_i\}^N_{i=1} \]
- \(x_i\)是输入,例如单词(索引或是向量),句子,文档等等(维度为d)
- \(y_i\)是我们尝试预测的标签(C个类别中的一个),例如:
- 类别:感情,命名实体,购买/售出的决定
- 其他单词
- 多词序列(之后会提到)
1.2 分类问题直观理解
用一个最简单的2维词向量分类问题作为案例
- 使用softmax / logistic回归
- 构建线性决策边界
传统的机器学习/统计学方法:假设\(x_i\)是固定的,训练 softmax/logistic 回归的权重\(W \in R^{C \times d}\)来决定决定边界(超平面)
预测阶段,对每个\(x\),预测:
\[ p(y \mid x)=\frac{\exp \left(W_{y} \cdot x\right)}{\sum_{c=1}^{C} \exp \left(W_{c} \cdot x\right)} \]
1.3 softmax分类器的细节
我们可以将预测函数分为两个步骤:
1 将\(W\)的\(y^{th}\)行和\(x\)中的对应行相乘得到分数:
\[ W_{y} \cdot x=\sum_{i=1}^{d} W_{y i} x_{i}=f_{y} \]
对c=1,2,...,C计算所有的\(f_y\)
2 使用softmax函数获得归一化的概率:
\[ p(y \mid x)=\frac{\exp \left(f_{y}\right)}{\sum_{c=1}^{C} \exp \left(f_{c}\right)}=\operatorname{softmax}\left(f_{y}\right) \]
1.4 softmax和交叉熵损失
在softmax分类器中最常用到交叉熵损失,也是负对数概率形态。
对于每个训练样本\((x,y)\),我们的目标是最大化正确类\(y\)的概率,或者我们可以最小化该类的负对数概率: \[ -\log p(y \mid x)=-\log \left(\frac{\exp \left(f_{y}\right)}{\sum_{c=1}^{C} \exp \left(f_{c}\right)}\right) \]
1.5 交叉熵损失理解
- 交叉熵的概念来源于信息论,衡量两个分布之间的差异,交叉熵越大,变量的取值越不确定,反之则越确定。
- 令真实概率分布为\(p\),我们计算的模型概率分布为\(q\)
- 交叉熵为:
\[ H(p, q)=-\sum_{c=1}^{C} p(c) \log q(c) \]
- 假设标准答案的概率分布是,在正确的类上为1,在其他类别上为0:
\[ p=[0,...,0,1,...,0] \]
- 因为是独热向量(one-hot vector),所以唯一剩下的项是真实类的负对数概率。
1.6 完整数据集上的分类
在整个数据集\(\{x_i,y_i\}_{i=1}^N\)上的交叉熵损失函数,是所有样本的交叉熵的均值 \[ J(\theta)=\frac{1}{N} \sum_{i=1}^{N}-\log \left(\frac{e^{f_{y_{i}}}}{\sum_{c=1}^{C} e^{f_{c}}}\right) \] 不使用 \[ f_{y}=f_{y}(x)=W_{y} \cdot x=\sum_{j=1}^{d} W_{y j} x_{j} \] 而是使用向量化的形态,基于矩阵来表示\(f:f=W_x\)
1.7 传统的机器学习优化算法
对于传统的机器学习算法(如逻辑回归)来说,一般机器学习的参数\(\theta\)通常只由\(W\)的列组成 \[ \theta=\left[\begin{array}{c} W_{\cdot 1} \\ \vdots \\ W_{\cdot d} \end{array}\right]=W(:) \in \mathbb{R}^{C d} \] 因此,我们只通过以下方式更新决策边界 \[ \nabla_{\theta} J(\theta)=\left[\begin{array}{c} \nabla_{W_{1}} \\ \vdots \\ \nabla_{W_{d}} \end{array}\right] \in \mathbb{R}^{C d} \]
1.8 神经网络分类器
- 单独使用线性分类器Softmax( ≈ logistic回归)并不十分强大
- 如上图所示,Softmax得到的是线性决策边界
- 对于复杂问题来说,它的表达能力是有限的
- 有一些分错的点,需要更强的非线性表达能力来区分
1.9 神经网络非线性切分
神经网络可以学习更复杂的函数和非线性决策边界
tip :更高级的分类需要
- 词向量
- 更深层次的深层神经网络
1.10 基于词向量的分类差异
- 一般在NLP深度学习中:
- 我们学习了矩阵\(W\)和词向量\(x\)。
- 我们学习传统参数和表示。
- 词向量是对独热向量的重新表示——在中间层向量空间中移动它们——以便 (线性)softmax分类器可以更好地分类。
- 即将词向量理解为一层神经网络,输入单词的独热向量并获得单词的词向量表示,并且我们需要对其进行更新。
\[ \nabla_{\theta} J(\theta)=\left[\begin{array}{c} \nabla_{W_{1}} \\ \vdots \\ \nabla_{W_{\text {dardvark }}} \\ \vdots \\ \nabla_{x_{z e b r a}} \end{array}\right] \in \mathbb{R}^{C d+V d} \]
- 其中,\(Vd\)是数量很大的参数。
1.11 神经计算
- An artificial neuron
- 神经网络有自己的术语包
- 但如果你了解 softmax 模型是如何工作的,那么你就可以很容易地理解神经元的操作
- Neural computation:神经计算
- Neural selectivity:神经选择性
- Hierarchy of neural processing:神经处理层次
1.12 单个神经元:可视作二元逻辑回归单元
\[ h_{w, b}(x)=f\left(w^{T} x+b\right) \]
\[ f(z)=\frac{1}{1+e^{-z}} \]
- \(b\):我们可以有一个“总是打开”的特性,它给出一个先验类,或者将它作为一个偏向项分离出来。
- \(w\),\(b\)是神经元的参数。
1.13 一个神经网络:多个逻辑回归组合
- 如果我们输入一个向量通过一系列逻辑回归函数,那么我们得到一个输出向量。
- 但是我们不需要提前决定这些逻辑回归试图预测的变量是什么。
- 我们可以输入另一个logistic回归函数。
- 损失函数将指导中间隐藏变量应该是什么,以便更好地预测下一层的目标。
我们添加更多层的神经网络,就得到了多层感知器。
1.14 单层神经网络的矩阵形态表示
我们有: \[ a_{1}=f\left(W_{11} x_{1}+W_{12} x_{2}+W_{13} x_{3}+b_{1}\right) \]
\[ a_{2}=f\left(W_{21} x_{1}+W_{22} x_{2}+W_{23} x_{3}+b_{2}\right) \]
在矩阵中: \[ z=Wx+b \] 激活函数\(f\)在运算时是element-wise逐元素的 \[ f\left(\left[z_{1}, z_{2}, z_{3}\right]\right)=\left[f\left(z_{1}\right), f\left(z_{2}\right), f\left(z_{3}\right)\right] \]
1.15 非线性变换的必要性
- 例如:函数近似,如回归或分类
- 没有非线性,深度神经网络只能做线性变换
- 多个线性变换,也还是组成一个线性变换\(W_1W_2x=Wx\)
- 因为线性变换是以某种方式旋转和拉伸空间,多次的旋转和拉伸可以融合为一次线性变换
- 对于非线性函数而言,使用更多的层,他们可以近似更复杂的函数
2 命名实体识别
2.1 命名实体识别(NER)
- 可能的用途
- 跟踪文档中提到的特定实体(组织、个人、地点、歌曲名、电影名等)
- 对于问题回答,答案通常是命名实体
- 许多需要的信息实际上是命名实体之间的关联
- 同样的技术可以扩展到其他 slot-filling 槽填充分类
- 通常后面是命名实体链接/规范化到知识库
2.2 句子中的命名实体识别
我们通过在上下文中对单词进行分类,然后将实体提取为单词子序列来预测实体。
2.3 NER的难点
- 很难计算出实体的边界
- 第一个实体是 “First National Bank” 还是 “National Bank”
- 很难知道某物是否是一个实体
- 是一所名为“Future School” 的学校,还是这是一所未来的学校?
- 很难知道未知/新奇实体的类别
- “Zig Ziglar” ? 一个人
- 实体类是模糊的,依赖于上下文
- 这里的“Charles Schwab” 是 PER 不是 ORG
3.基于窗口数据的分类预测
3.1. 词-窗分类
- 思路:为在上下文中的语言构建分类器
- 一般来说,很少对单个单词进行分类
- 例如,上下文中一个单词的命名实体分类
- 人、地点、组织、没有
- 在上下文中对单词进行分类的一个简单方法,可能是对窗口中的单词向量进行平均,并对平均向量进行分类
- 问题:这会丢失位置信息
3.2 窗口分类器:softmax
训练softmax分类器对中心词进行分类,方法是在一个窗口内将中心词周围的词向量串联起来
例子:在这句话的上下文中对“Paris”进行分类,窗口长度为2
结果向量\(x_{w i n d o w}=x \in R^{5 d}\)是一个列向量
3.3 最简单的窗口分类器:Softmax
对于\(x=x_{window}\),我们可以使用与之前相同的softmax分类器 \[ \hat{y}_{y}=p(y \mid x)=\frac{\exp \left(\sqrt{W_{y} \cdot x}\right)}{\sum_{c=1}^{C} \exp \left(W_{c} \cdot x\right)} \] 如何更新向量?
- 简而言之:就像之前讲的那样,求导和优化
3.4 稍微复杂一点:多层感知器
假设我们要对中心词是否为一个地点,进行分类
与word2vec类似,我们将遍历语料库中的所有位置。但这一次,它将受到监督,只有一些位置能够得到高分。
- 例如,在他们的中心有一个实际的NER Location的位置是“真实的”位置会获得高分
3.5 神经网络前馈计算
使用神经激活\(a\)简单地给出一个非标准化的分数 \[ \operatorname{score}(x)=U^{T} a \in \mathbb{R} \] 我们用一个三层神经网络计算一个窗口的得分
- s = score(“museums in Paris are amazing”)
3.6 附加层
中间层学习输入词向量之间的非线性交互
例如:只有当“museum”是第一个向量时,“in”放在第二个位置才重要
4.基于pytorch实现的分类器
4.1 替代:最大边缘损失
关于训练目标的想法:让真实窗口的得分更高,而其他窗口的得分更低(直到足够好为止)
- \(s = score(museums\ in\ Paris\ are\ amazing)\)
- \(s_c = socre(Not\ all\ museums\ in\ Paris)\)
最小化: \[ J=max(0,1-s-s_c) \] 这是不可微的,但它是连续的 → 我们可以用SGD
补充解析
- 单窗口的目标函数为\(J=max(0,1-s-s_c)\)
- 每个中心有NER位置的窗口的得分应该比中心没有位置的窗口高1分
- 要获得完整的目标函数:为每个真窗口采样几个损坏的窗口。对所有训练样本窗口求和
- 类似于word2vec中的负抽样
4.2 随机梯度下降
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!