深度学习与自然语言处理教程(3) - 神经网络与反向传播(NLP通关指南·完结)
时间:2022-12-04 03:00:00
- 作者:韩信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/36
- 本文地址:http://www.showmeai.tech/article-detail/234
- 声明:所有版权,请联系平台和作者,注明来源
- 收藏ShowMeAI查看更多精彩内容
本系列为斯坦福CS224n自然语言处理与深度学习(Natural Language Processing with Deep Learning)》全套学习笔记,相应的课程视频可以在 这里 查看。
ShowMeAI为CS224n课程的所有课件都完成了中文翻译和注释,并制作成了 GIF动图!点击 第3讲-词向量进阶 和 神经网络反向传播和计算图 查看课件注释和带学解读。获取更多信息的方法见文末。
引言
CS224n是斯坦福大学生产的深度学习和自然语言处理专业课程,涵盖核心内容RNN、LSTM、CNN、transformer、bert、前沿内容,如问答、摘要、文本生成、语言模型、阅读理解等。
这组笔记介绍了单层和多层神经网络,以及如何用于分类目的。然后我们讨论如何使用一种叫做反向传播的分布式梯度下降技术来训练它们。我们将看到如何按顺序使用链法则更新参数。在对神经网络进行严格的数学讨论后,我们将讨论一些训练神经网络的实用技能和技能,包括:神经单元(非线性)、梯度检查Xavier参数初始化,学习率,Adagrad等。最后,我们将鼓励使用递归神经网络作为语言模型。
内容要点
- 神经网络
- 反向传播
- 梯度计算
- 神经元
- 合页损失
- 梯度检查
- Xavier参数初始化
- 学习率
- Adagrad优化算法
1.神经网络基础
(本部分也可参考ShowMeAI吴恩达老师课程总结文章深度学习教程 | 神经网络基础,深度学习教程 | 浅层神经网络深度学习教程 | 深层神经网络)
根据前面的讨论,由于大多数数据是线性不可分割的,因此需要非线性分类器,否则线性分类器在这些数据中的性能有限。神经网络是一种具有非线性决策边界的分类器,如下图所示。我们可以在图中清楚地看到它的非线性决策边界。让我们来看看模型是如何学习它的。
神经网络是受生物学启发的分类器,这就是为什么它们通常被称为人工神经网络,以区别于有机物。然而,在现实中,人类神经网络比人工神经网络更有能力和复杂,所以最好不要在两者之间画太多的相似之处。
1.1 单个神经元
神经元是一个通用的计算单元,它被接受 n n n 输入并产生输出。根据神经元的不同参数(通常被认为是神经元的权重),不同的神经元会有不同的输出。
神经元的常见选择是 s i g m o i d sigmoid sigmoid ,或称为二元逻辑回归单元。这种神经元 n n n 作为输入作为输入,然后计算激活标量(输出) a a a 。还有一个神经元 n n n 维权重向量 w w w 偏置标量 b b b 相关联。
神经元的输出是:
a = 1 1 e x p ( ? ( w T x b ) ) a=\frac{1}{1 exp(-(w^{T}x b))} a=1+exp(−(wTx+b))1
我们也可以把上面公式中的权值和偏置项结合在一起:
a = 1 1 + e x p ( − [ w T x ] ⋅ [ x 1 ] ) a=\frac{1}{1+exp(-[w^{T}\;\;x]\cdot [x\;\;1])} a=1+exp(−[wTx]⋅[x1])1
上述公式可视化如下图所示:
❐ 神经元是神经网络的基本组成部分。我们将看到神经元可以是许多允许非线性在网络中积累的函数之一。
1.2 单层神经网络
我们将上述思想扩展到多个神经元,考虑输入 x x x 作为多个这样的神经元的输入,如下图所示。
如果我们定义不同的神经元的权值为 { w ( 1 ) , ⋯ , w ( m ) } \{w^{(1)}, \cdots ,w^{(m)}\} { w(1),⋯,w(m)} 、偏置为 { b 1 , ⋯ , b m } \{b_1, \cdots ,b_m\} { b1,⋯,bm} 和相对应的激活输出为 { a 1 , ⋯ , a m } \{a_1, \cdots ,a_m\} { a1,⋯,am} :
a 1 = 1 1 + e x p ( − ( w ( 1 ) T x + b 1 ) ) a_{1} =\frac{1}{1+exp(-(w^{(1)T}x+b_1))} a1=1+exp(−(w(1)Tx+b1))1
⋮ \vdots ⋮
a m = 1 1 + e x p ( − ( w ( m ) T x + b m ) ) a_{m} =\frac{1}{1+exp(-(w^{(m)T}x+b_m))} am=1+exp(−(w(m)Tx+bm))1
让我们定义简化公式以便于更好地表达复杂的网络:
σ ( z ) = [ 1 1 + e x p ( z 1 ) ⋮ 1 1 + e x p ( z m ) ] \sigma(z) = \begin{bmatrix} \frac{1}{1+exp(z_1)} \\ \vdots \\ \frac{1}{1+exp(z_m)} \end{bmatrix} σ(z)=⎣⎢⎡1+exp(z1)1⋮1+exp(zm)1⎦⎥⎤
b = [ b 1 ⋮ b m ] ∈ R m b = \begin{bmatrix} b_{1} \\ \vdots \\ b_{m} \end{bmatrix} \in \mathbb{R}^{m} b=⎣⎢⎡b1⋮bm⎦⎥⎤∈Rm
W = [ − w ( 1 ) T − ⋯ − w ( m ) T − ] ∈ R m × n W = \begin{bmatrix} -\;\;w^{(1)T}\;\;- \\ \cdots \\ -\;\;w^{(m)T}\;\;- \end{bmatrix} \in \mathbb{R}^{m\times n} W=⎣⎡−w(1)T−⋯−w(m)T−⎦⎤∈Rm×n
我们现在可以将缩放和偏差的输出写成:
z = W x + b z=Wx+b z=Wx+b
激活函数sigmoid可以变为如下形式:
[ a 1 ⋮ a m ] = σ ( z ) = σ ( W x + b ) \begin{bmatrix} a_{1} \\ \vdots \\ a_{m} \end{bmatrix} = \sigma(z) = \sigma(Wx+b) ⎣⎢⎡a1⋮am⎦⎥⎤=σ(z)=σ(Wx+b)
那么这些激活的作用是什么呢?我们可以把这些激活看作是一些加权特征组合存在的指标。然后,我们可以使用这些激活的组合来执行分类任务。
1.3 前向与反向计算
到目前为止我们知道一个输入向量 x ∈ R n x\in \mathbb{R}^{n} x∈Rn 可以经过一层 s i g m o i d sigmoid sigmoid 单元的变换得到激活输出 a ∈ R m a\in \mathbb{R}^{m} a∈Rm 。但是这么做的直觉是什么呢?让我们考虑一个NLP中的命名实体识别问题作为例子:
Museums in Paris are amazing
这里我们想判断中心词 Paris
是不是以命名实体。在这种情况下,我们很可能不仅想要捕捉窗口中单词的单词向量,还想要捕捉单词之间的一些其他交互,以便进行分类。例如,可能只有 Museums
是第一个单词和 in
是第二个单词的时候, Paris
才是命名实体。这样的非线性决策通常不能被直接提供给Softmax函数的输入捕获,而是需要添加神经网络中间层再进行评分。因此,我们可以使用另一个矩阵 U ∈ R m × 1 \mathbf{U} \in \mathbb{R}^{m \times 1} U∈Rm×1 与激活输出计算得到未归一化的得分用于分类任务:
s = U T a = U T f ( W x + b ) s=\mathbf{U}^{T}a=\mathbf{U}^{T}f(Wx+b) s=UTa=UTf(Wx+b)
其中, f f f 是激活函数(例如sigmoid函数)。
维度分析:如果我们使用 4 4 4 维的词向量来表示每个单词,并使用 5 5 5 个词的窗口,则输入是 x ∈ R 20 x\in \mathbb{R}^{20} x∈R20 。如果我们在隐藏层使用 8 8 8 个sigmoid单元和从激活函数中生成一个分数输出,其中 W ∈ R 8 × 20 W\in \mathbb{R}^{8\times 20} W∈R8×20 , b ∈ R 8 b\in \mathbb{R}^{8} b∈R8 , U ∈ R 8 × 1 U\in \mathbb{R}^{8\times 1} U∈R8×1 , s ∈ R s\in \mathbb{R} s∈R 。