本文由readlecture.cn转录总结。ReadLecture专注于音、视频转录与总结,2小时视频,5分钟阅读,加速内容学习与传播。
大纲
-
引言
-
课程介绍
-
主讲人介绍
-
课程内容概述
-
-
神经网络基础知识
-
神经网络的定义和结构
-
神经元的基本单元
-
多维输入和权重
-
激活函数的作用
-
-
神经网络的层级结构
-
输入层、隐藏层和输出层
-
权重和偏置的矩阵表示
-
-
激活函数的选择和作用
-
Sigmoid函数
-
双曲正切函数
-
ReLU函数
-
-
-
大型语言模型的基本信息
-
神经网络的层数增加的原因
-
神经网络的学习方法
-
拟合机制
-
损失函数和梯度下降
-
-
神经网络在语言理解中的应用
-
语言的离散性和符号系统
-
One-hot编码和词嵌入
-
语言模型的建模方法
-
-
-
RNN和CNN在语言模型中的应用
-
RNN的基本原理和结构
-
循环神经网络的定义
-
隐藏状态和序列数据处理
-
-
CNN的基本原理和结构
-
卷积神经网络的定义
-
局部特征提取
-
-
RNN和CNN的比较
-
计算速度和参数数量
-
反向传播链路的长度
-
-
-
Transformer模型的介绍
-
Transformer的基本原理和结构
-
注意力机制的引入
-
编码器和解码器的结构
-
-
Transformer在机器翻译中的应用
-
序列处理和信息保留
-
-
Transformer的优势和特点
-
计算速度和记忆能力
-
模型结构的灵活性
-
-
内容总结
一句话总结
本文深入探讨了神经网络和大型语言模型的基础知识,包括神经网络的结构、激活函数的选择、以及RNN、CNN和Transformer在语言模型中的应用。
观点与结论
-
神经网络的层数增加可以提高模型的表达能力。
-
激活函数在神经网络中是不可或缺的,它确保模型具有更复杂的表达能力。
-
RNN和CNN在处理序列数据时各有优势,CNN在计算速度上更快,而RNN能更好地处理长序列。
-
Transformer模型通过注意力机制替代了RNN的结构,提高了计算速度和记忆能力。
自问自答
-
为什么神经网络需要激活函数?
-
激活函数确保模型具有更复杂的表达能力,防止随着层数的增加而退化为单层网络。
-
-
RNN和CNN在处理序列数据时有什么不同?
-
RNN能处理长序列并保留信息,而CNN计算速度更快,但主要提取局部特征。
-
-
Transformer模型相比RNN有哪些优势?
-
Transformer通过注意力机制提高了计算速度和记忆能力,更适合处理长序列数据。
-
-
什么是One-hot编码,它在语言模型中有什么作用?
-
One-hot编码是一种将离散符号转换为数学上可运算向量的方法,用于语言模型的输入表示。
-
-
词嵌入在语言模型中有什么作用?
-
词嵌入将高维的One-hot向量降维到低维空间,使模型更容易处理和学习。
-
关键词标签
-
神经网络
-
大型语言模型
-
激活函数
-
RNN
-
CNN
-
Transformer
-
词嵌入
-
注意力机制
适合阅读人群
-
机器学习初学者
-
神经网络研究者
-
自然语言处理工程师
-
数据科学家
术语解释
-
神经网络:一种模仿人脑结构设计的机器学习架构。
-
激活函数:在神经网络中,用于处理输入和权重内积后得到的输出,引入非线性因素。
-
RNN(循环神经网络):一种能够处理序列数据的神经网络,通过隐藏状态保留之前的信息。
-
CNN(卷积神经网络):一种主要用于图像处理的神经网络,通过卷积核提取局部特征。
-
Transformer:一种基于注意力机制的神经网络模型,广泛应用于自然语言处理任务。
-
词嵌入:将高维的One-hot向量映射到低维空间的过程,便于模型处理和学习。
-
注意力机制:一种模拟人类注意力分配的机制,用于提高模型处理长序列数据的能力。
视频来源
bilibili: 视频去哪了呢?_哔哩哔哩_bilibili
讲座回顾
大家好,我是曾国洋。非常高兴今天我们有机会一起分享我们在大模型和神经网络方面的一些研究成果。
-
韩旭因临时有事晚到,前半节课由我主讲。
-
课程内容包括神经网络基础知识和大型语言模型基本信息。
-
课程节奏可能较快,鼓励随时提问。
-
讲解节奏较慢,适合不同技术水平的同学。
今天本来是我和韩旭共同分享,但韩旭因临时有事会晚些到达。因此,前半节课将由我主讲。今天的课程内容主要包括神经网络的基础知识以及大型语言模型的基本信息。课程节奏可能会较快,若有任何疑问,欢迎随时举手提问,我们将及时解答。我通常讲解这些内容时节奏较慢,因此适合不同技术水平的同学。当然,大家随时可以提出问题。
可以随时去问。第一部分内容主要讲一下就是
-
神经网络是模仿人脑设计的机器学习架构。
-
神经网络的基本学习单元是神经元。
-
神经元处理多维输入x,通过权重w和偏置b进行计算。
-
计算结果经过激活函数处理后输出。
在机器学习领域,除了神经网络,还存在多种其他机器学习算法,但目前神经网络的提及频率较高。神经网络是一种模仿人脑结构设计的机器学习架构,其中最基本的学习单元是神经元。一个神经元支持多维输入,记作x,具有可学习的权重w和偏置b。通过输入与一维权重向量w的内积加上偏置b,再经过激活函数处理,从而得到输出。
-
神经元设计模仿人类神经元,接收多信号输入并产生激活输出。
-
大脑中的激活输出通常表现为开启或关闭状态。
-
早期神经元设计采用简单的激活函数,类似开关。
-
随着神经元数量增加,构建出更复杂的神经网络。
-
神经网络中,每层权重对应一个A值,A值转换为输出。
这个神经元的输出设计思路与人类神经元相似,它能够接收多个信号输入,并通过内部的复杂反应,最终产生一个激活输出。在大脑中,这种激活输出已有广泛研究,通常表现为开启或关闭状态。因此,早期的神经元设计也与此类似,最初的激活函数类似于一个简单的开关。随着神经元数量的增加,我们可以构建出更复杂的神经网络,这是目前常见的神经网络结构。在这种结构中,每一层的权重w会对应得到一个A值,这些A值随后被转换为相应的输出。
-
向量级的W可以转换为矩阵,并通过矩阵乘法处理。
-
输入X是向量,W是矩阵,乘法后加上偏置,再通过逐元素激活函数。
-
这种结构构成了现代神经网络的基本架构。
-
神经网络包括输入层、输出层和隐藏层。
其实我们可以将向量级的W转换为一个矩阵,然后通过矩阵乘法。输入X是一个向量,W是一个矩阵,向量乘以矩阵再加上一个向量维度的偏置,然后通过一个逐元素的激活函数,这个激活函数是对向量的每一维分别进行的。通过这种方法,基本上就能得到现代神经网络的一个基本架构。随着我们将神经网络堆叠在一起,最早的这部分蓝色部分被称为输入层,即我们提供的数据部分,最后输出的部分被称为输出层,而在中间的这些层我们称之为隐藏层。
-
神经网络中的中间状态(“黑盒子”内部状态)意义不明确,由模型学习赋予。
-
激活函数在神经网络中不可或缺,确保模型具有复杂的表达能力。
-
去掉激活函数会导致模型表达能力下降,可能退化为单层网络。
-
早期激活函数如开关函数,符合直觉。
在神经网络中,那些既非输入也非输出的状态,即我们通常所说的“黑盒子”内部状态,其实际意义取决于模型学习的内容。与输入和输出不同,这些中间状态的意义并不明确,而是由模型通过学习来赋予的。在此过程中,有几个关键点值得关注。首先,为何必须引入激活函数?是否可以仅通过一系列数值运算来替代激活函数?实际上,这种做法并不恰当。如果我们回顾之前的公式,假设去掉激活函数F,公式将简化为单纯的矩阵运算,这将导致模型的表达能力大幅下降。因此,激活函数在神经网络中是不可或缺的。无论我们如何构建神经网络,其中必然包含激活函数,它位于矩阵运算之间,确保模型具有更复杂的表达能力,并防止随着层数的增加而退化为单层网络。最早的激活函数,如我之前提到的类似开关的函数,非常符合我们的直觉。
当输入信号较小时,它处于关闭状态;而当输入信号较大时,它则处于开启状态。有人可能会好奇,为何不采用Z字型函数,而是选择平滑版本。实际上,选择平滑版本是有其特定原因的。
这有一点点原因,这个我会在后面介绍。后来经过一些实践发现这个东西效果不佳。大家发现这样一个函数是最小的。
-
初始激活函数(如Sigmoid)存在局限性,难以处理复杂情况和有效学习。
-
引入双曲正切函数(hyperbolic tangent)作为替代,被广泛采用。
-
最新研究表明,双曲正切函数在性能上优于其他函数。
最大值为0,最大值为1,未激活时为0,激活时为1。这种机制使得模型难以处理复杂的情况或进行有效的学习。因此,后来提出了将激活函数从Sigmoid函数下移至双曲正切函数(hyperbolic tangent),这种方法被广泛采用。最新的技术表明,双曲正切函数相较于其他函数表现更为出色。
无少的这种开关型的大家发现就这种ReLU的max和零值max就够了。然后现在的话在那个大模型。
第二是说,为什么一定要增加神经网络的层数呢?前面已经讲过,IT领域为何需要增加神经网络的层数。
-
单层神经网络的表达能力有限。
-
增加网络层数可以提升表达能力,并在某些中间层揭示有价值的信息。
-
在计算机视觉任务中,中间层(隐藏空间维度)能从简单图片中提取信息。
实际上,这里存在一些原因。对于单层的神经网络而言,其表达能力相对有限。然而,当我们增加网络层数时,可以观察到在某些中间状态,网络能够揭示出一些有价值的信息。例如,在进行计算机视觉任务时,前面提到的中间层属于隐藏空间的维度。此时,我们发现网络能够从最简单的图片中提取信息。
-
模型通过自我学习提取边缘信息,逐步形成与物件相关的信息,最终得到目标级别的信息。
-
增加模型层数有助于模型理解内容,每层执行特定任务。
-
计算机视觉和自然语言处理领域中,模型处理信息的方式类似。
-
已讲解神经网络的构成、搭建方法及激活函数运算,接下来将讨论学习方法。
它能提取这些边缘信息,再将边缘信息逐步处理,从而形成与物件相关的信息,最终得到目标级别的信息。在这个过程中,这些信息其实是模型通过自我学习获得的。通过增加模型的层数,它可以像人类一样大致理解内容。在每一层中,模型都在执行特定的任务。这在计算机视觉(CV)领域中尤为明显,而在自然语言处理(NLP)领域也有类似的机制。前面已经讲解了神经网络的构成方式、搭建方法以及其中涉及的激活函数如何运算。接下来,我们将讨论神经网络的学习方法。
-
材料内容包含较多数学知识,但整体难度不高。
-
神经网络模型的学习过程可简化为拟合机制。
-
模型通过学习输入数据,映射到相应的输出,以构建有效模型。
学习我们希望学习的数据,这份材料包含较多数学内容,但整体较为简单。对于神经网络模型而言,其学习过程可以简化为一种拟合机制。最基本的是,我们有一些输入,我们希望模型能够学习这些输入,并对应到某些输出,从而构建一个有效的模型。
-
任务目标:找到最优参数 ( \Theta ) 以使神经网络 ( F_{\Theta} ) 的输出 ( y_i ) 与目标值尽可能接近。
-
神经网络 ( F_{\Theta} ):视为黑盒,输入 ( x_i ) 通过网络处理后输出。
-
优化过程:通过优化 ( \Theta ) 完成模型训练。
-
损失函数 ( L ):用于度量模型输出与目标之间的距离。
这个任务可以在数学上构建成一种最优化的任务,目的是找到最优参数,使得对于所有输入 ( x_i ),能够找到最合适的 ( y_i )。这里涉及到的符号 ( F{\Theta} ) 代表神经网络,如果将其视为一个黑盒,输入通过 ( F{\Theta} ) 处理后输出,其中 ( \Theta ) 是网络的参数。我们的目标是找到最优的 ( \Theta ),使得预测目标值与模型输出值尽可能接近。通过优化 ( \Theta ),我们可以完成模型的训练。此外,符号 ( L ) 代表损失函数,用于度量模型输出与目标之间的距离。
-
拟合任务示例:从天气预测降水量,使用平方函数计算预期值与真实值的差异。
-
收敛特性:平方函数计算结果会收敛到均值。
-
数学方法应用:神经网络学习机制可通过数学方法定义和求解。
-
常见求解方法:梯度下降法,适用于高维数学模型。
这其实也是可以很多样化的。举个最简单的例子,比如我们去做一个拟合,比如我们要拟合从今天的天气到今天的降水量,我们可以使用一个平方函数,即我们的预期值和真实值之间一减,然后求个平方。这样的话,你会发现它最后会收敛到一个均值。如果大家感兴趣,其实可以从数学上去算一算。在这里,这个L也有很多现成的选项,在后边我们也会稍微介绍到一些。当我们从数学上能很好地把神经网络学习的机制定义清楚时,我们就可以通过数学的方法去求解它了。在这里,一个最常见的方法叫做梯度下降,我相信大家也有所听说过。梯度其实就代表,如果我们把神经网络通过数学表达,把它看成一个高维的或者说一个比较数学的模型。
说到数学的运算,这个运算其实我们可以对它进行求导。这个求导的话,
-
描述了数值求导(符号求导)的过程,指出其可能较为复杂。
-
强调数值求导的运算相对简单。
-
举例说明数值求导的应用,即在特定输入点求导数,并解释导数近似于该点的切线。
它是一个数值的求导,即符号求导。对于符号求导而言,其过程可能较为复杂。然而,数值求导的运算则相对简单。例如,对于某个当前的输入,我们能够求得该输入点上的导数。根据导数的定义,这实际上近似于在该位置上拟合的一条切线。
-
优化算法中常用沿导数方向更新参数的方法。
-
以二次函数 ( x^2 ) 为例,导数 ( 2x ) 指导参数更新方向。
-
当 ( x ) 小于 0 时,向正方向移动;当 ( x ) 大于 0 时,向负方向移动。
-
该方法可能陷入局部最优解而非全局最优解。
-
神经网络的复杂结构有助于避免局部最优问题。
在优化算法中,我们通常会提到一种方法,它会沿着导数的方向进行参数更新。通过这种方法,算法最终会收敛到一个极值点。以最简单的二次函数为例,假设我们考虑函数 ( x^2 ),其导数为 ( 2x )。当 ( x ) 小于 0 时,导数为负,我们会沿着负导数的方向移动,即向正方向前进。相反,当 ( x ) 大于 0 时,导数为正,我们会沿着负导数的方向移动,即向负方向前进。通过这种方式,我们可以逐渐逼近最小值。然而,这种方法也存在一些问题,例如对于某些简单的函数,它可能不会达到全局最优解,而是陷入局部最优解。这种情况在函数中存在小坑时尤为常见。尽管最初人们对此问题感到担忧,但随着神经网络参数量的增加和模型深度的增长,人们发现神经网络结构能够变得足够复杂,从而避免这些问题。
-
在实际应用中,局部最优解通常不会极其糟糕,可以从多个初始位置找到相对较优的解。
-
学习率(alpha)是梯度下降方法中的关键参数,影响每一步的步长。
-
学习率设置过大可能导致跳出合理范围,设置过小则会导致进展缓慢。
在实际应用中,很难遇到那种极其糟糕的局部最优解,导致陷入其中的情况。这使得我们基本上从多个初始位置都能找到一个相对较优的解,虽然不一定是全局最优解,但至少是一个较为优秀的解。此外,还有一个特别的参数称为alpha,实际上就是学习率。这里的学习率指的是梯度下降方法中每一步所走的距离,因为这是一个迭代方法,每一步如果走得太远,可能会跳出合理范围。例如,如果学习率设置得过大,可能会从当前点向负方向跳跃,结果反而对应到一个更大的值。因此,学习率在这里也是一个非常关键的因素。如果学习率设置得太小,问题则是进展缓慢,尽管步幅小,但前进速度慢。
-
行进缓慢可以获得相对优秀的位置。
-
除了梯度下降法,还有其他方法寻找局部最优解。
-
梯度下降法在大规模神经网络训练中因其经济性和可实现性被广泛采用。
如果我们行进缓慢,至少能够达到一个相对优秀的位置。此外,除了梯度下降法,实际上还有其他多种方法可以用来寻找局部最优解。在数学领域,这方面的研究相当丰富。然而,在大规模神经网络训练中,梯度下降法因其经济性和可实现性而被广泛采用,成为寻找局部最优解的一种有效方法。
在实操过程中,其实就需要用到我们在计算梯度时的一个链式法则。
-
在数学中,对多维向量求导的结果等于函数对每个分量的偏导数。
-
利用链式法则,例如求Y对X的导数dydx,等于U对X的导数乘以Y对U的导数。
-
这种方法可以用于分解复杂的神经网络,求出导数。
-
这种方法还带来了一个额外要求。
在数学中,计算函数F对一个多维向量求导时,其结果等于F对每个分量的偏导数。在此过程中,我们可以利用链式法则。例如,求Y对X的导数dydx,实际上等于U对X的导数乘以Y对U的导数。基于这种方法,我们可以将复杂的神经网络分解,从而求出导数。这种方法还带来了一个额外要求。
在神经网络运算中,每一步操作必须是可导的,即其导数必须能够引导我们向更优的方向靠近。这就是为什么之前提到的节约型激活函数无法发挥作用的原因。例如,对于这种情况,我尝试能否将其还原,以便更好地解释。
当我们使用阶跃函数作为激活函数时,在负半轴部分,其导数为零;在正半轴部分,导数同样为零。因此,一旦经过该函数,导数便会消失。
-
在某些点位上,无法确定哪个方向更好,因此需要确保这些部分不为零,包括负半部分。
-
推出了优化方法以确保负半部分也不为零。
-
提到了两种方法,并举例说明如何在代码实现中计算每个输入和权重的梯度。
-
使用计算图的方法来表达,最简单的例子中,输入x通过线性运算得到z。
这导致在某些点位上,你无法确定哪个方向会更好。因此,大家会尽力确保这些部分不为零,包括在负半部分也会避免为零。后来也推出了一些优化方法,以确保负半部分也不为零。刚才提到了两种方法,接下来举一个实际例子,展示在代码实现中如何计算每个输入和权重的梯度。通常,我们使用一种称为计算图的方法来表达。最简单的例子中,左边是一个实际运算,x是输入,然后通过一个线性运算得到z。
-
描述了一个线性运算过程:线性运算 -> 激活函数 -> 隐状态h -> 内积运算 -> 标量s -> 损失函数。
-
提到反向传播求导过程:从s到u的导数 -> 从s到h的导数。
-
强调了求导的步骤和结果:s到u的导数一步即可求得,s到h的导数经过一个s。
这现在是一个线性的运算,然后再通过一个激活函数得到h隐状态。然后h最终和一个u进行内积运算,得到最终的标量s。s作为我们的损失函数。如果我们要对它进行求导,实际上可以从反向进行计算。对于s,它和u进行简单的内积运算,因此可以通过一步就能求到导数。对s到u的导数求出后,它是模型的参数。h是上一步的输入,因此可以求到s到h的导数。求完之后,我们看到它经过了一个s。
-
激活函数F的可导性,通过链式法则进行反向传播。
-
反向传播涉及H对Z的导数和S对H的导数的乘积,均为数值运算。
-
反向传播过程简单,避免引入符号,逐步影响所有终止节点。
-
通过反向传播计算整个网络的梯度,结合梯度下降算法实现神经网络学习。
-
梯度下降算法数学上直观,但实际操作中效率较低。
激活函数F,由于F是可导的,因此我们可以继续应用链式法则进行传播。具体来说,这是通过H对Z的导数乘以S对H的导数来实现的。这一过程涉及的都是数值运算,应避免引入符号,因此相对简单。通过逐步向后传递,最终能够影响到包括参数和树在内的所有终止节点。通过这种方法,我们可以实现反向传播,从而计算出整个网络的梯度。利用刚刚提到的梯度下降算法,最终可以实现神经网络模型的学习。然而,梯度下降算法虽然在数学上直观,但在实际操作中效率较低。
-
当前模型在实际学习中需要大量迭代步骤才能收敛。
-
梯度下降法效率较低,但其方向至关重要。
-
方向正确是模型朝着好方向发展的关键。
-
出现了更简单的方法,如仅记录每个维度的方向。
-
这些方法也能使模型收敛,提供了操作空间。
-
神经网络的定义和训练方式已简单介绍。
-
接下来将探讨神经网络如何进行语言理解编码。
它也导致了当前模型在实际学习过程中需要迭代非常多的步骤,才能收敛到一个较好的状态。对此感兴趣的人也可以尝试一下。因此,一方面是因为梯度下降法效率较低,另一方面大家也发现,对于梯度下降算法而言,最关键的是其方向。本质上,只要方向正确,最终都会朝着好的方向发展。随后,出现了一些更简单的方法,例如不采用复杂的梯度下降,而是仅记录每个维度的方向,判断是正向还是负向,这样的方法也能使模型收敛。因此,这实际上提供了很大的操作空间。之前简单介绍了神经网络的定义及其训练方式,接下来将探讨神经网络如何进行语言理解编码。语言理解是一个非常复杂的过程,我们之前讨论了大量的数学内容,其输入是,
-
描述了一个向量,其输入和输出均为数值向量。
-
指出语言处理的主要挑战是语言的离散性,即语言作为符号系统的特性。
-
早期语言研究关注的问题类型,如近义词、反义词和复合词的解析。
-
强调将离散符号转化为数学可表示和可运算形式的重要性。
-
提到存在多种方法来实现这种转化。
它是一个向量,它是数值的,其输出也是一个向量,同样是数值的。然而,语言处理面临的最大挑战在于语言的离散性,它是一种符号系统。在早期,语言研究主要集中在诸如“A的近义词是什么?”、“A的反义词是什么?”以及“A加B,即A的B是什么?”等问题上。例如,“中国首都是北京”这一陈述的运算方式。这些研究的核心在于如何将离散的符号转化为数学上可表示和可运算的形式。因此,我们在使用模型解决语言问题时,需要考虑如何实现这一转化。此外,存在多种表示方法来处理这一问题。
如果不显示的话,我定义一个我的词表,我有一个我自己的词典,一个包含n个词的词表,这些词是我预先放置好的,针对这n个词,
然后可以构建一个非常大的n维向量,在这个位置上设为1,代表它是这个词,而其他位置均为0,这种方法称为one-hot编码。通过这种方法,我们可以实现简化处理。
-
语言可以通过数学方法进行建模,尽管这种方法可能较为粗糙但具有实用性。
-
语言建模的一个例子是根据语言前缀预测下一个词,这实际上是对逻辑的建模。
-
文字的信息密度通常是最高的,因此读书被认为是信息获取中最累的方式。
-
语言模型的概念先于动物态模型出现,且在大模型中同样适用。
简单的就能把这些词给转化成数学上可运算的东西,虽然很粗糙,但是其实是有用的。这样的话,我们就可以在语言上对语言进行建模。什么叫语言的建模呢?其实在这里有个简单的例子。当我们给定了一段语言的前缀时,我们去预测它的下个词可能是什么。语言中其实包含了非常多人的逻辑。在这里边,预测语言的下个词,其实就是在对逻辑进行建模。大家其实多看看也会发现,在我们日常会接触到的这些表达方式中,比如我们会去看视频,会去听音乐,会去读书。其中最累的肯定是读书。为什么呢?因为文字的信息密度一般是最大的。这也是为什么先诞生了语言模型,然后才有后来的动物态模型。在大模型里,它也是一个道理。在这里,我们的语言模型是一样的。
-
使用条件概率方法预测下一个词语。
-
具体方法:给定前面的所有词语,预测下一个词语。
-
公式拆解:P表示联合概率,可以拆解为P(never),即给定“never”出现的概率,预测下一个词语。
我们可以将其简化为一个数学表达,即条件概率的方法。具体来说,就是给定前面的所有词语,预测下一个词语。通过这种建模方法,模型能够理解世界是如何运作的。我们可以将这个公式拆开来看,例如,P表示联合概率,它可以拆解为P(never),即给定never出现的概率,预测下一个词语。
-
描述了通过条件概率公式计算特定短语在特定上下文中的出现概率的方法。
-
强调这种方法是语言模型建模过程中的核心概念。
-
说明了通过将概率相乘可以得到整个句子在语言中出现的总概率。
-
指出模型的建模过程基于一定的逻辑基础。
通过这种方式,我们可以得到上述的联合概率,虽然我有些遗忘其确切名称。通过应用条件概率公式并进行相应的计算,我们可以得出“Never too late to”这一短语在特定上下文中的出现概率。这种方法实际上是我们用来描述语言模型在建模过程中所涉及的核心概念。进一步地,这种表达可以简化为以下定义:通过将这些概率相乘,我们可以得到整个句子在该语言中出现的总概率。这就是为什么模型的建模过程包含一定的逻辑基础。
-
字母表正向阅读容易,倒序阅读困难。
-
困难原因在于语言的内在逻辑和非均等出现的字符串概率。
-
语言中存在常见模式,这些模式是记忆的基础。
-
模型通过记忆序列中的模式来理解语言。
-
采用新的方法建模语言,关注语言模式。
最简单的例子是字母表。当我们正向阅读时,可以迅速地念出每一个字母,甚至在询问某个字母的位置时,我们也能轻松地回忆并指出。然而,如果我们将字母表倒序排列,这一任务就会变得异常困难,因为大多数人没有练习过倒序背诵。这种困难的原因在于语言的内在逻辑,即并非所有字符串的出现概率都是均等的。实际上,语言中包含了一些常见的模式,这些模式是我们记忆的基础。在语言理解和模型构建中,这一点是共通的。模型本质上也是一种序列记忆,它通过记忆序列中出现的模式来理解语言。因此,我们采用了新的方法来建模语言,这种方法关注于语言模式。
例如,我们的RNN,即循环神经网络,是神经网络模型的一种高级版本。它包括输入层,并且还包含一个隐藏层,隐藏层的定义与先前所述相同。
然而,不同之处在于,由于它是一个时间序列模型,每个时刻都会输入一个新的数据,这会导致隐藏状态发生变化。通过这种变化后的隐藏状态来输出其状态。
-
RNN的核心特点是隐状态的变化,这种变化通过输入向量和前一步状态的运算来实现。
-
RNN通过输入向量与权重相乘,加上前一步状态与转移矩阵的乘积及偏置,通过激活函数得到当前隐状态。
-
当前隐状态可用于计算模型输出,使模型能够建模序列数据,掌握语言中的概率和说话模式。
-
RNN的发展经历了演进过程。
然后这样的方法,其实大家可以进一步简单理解一下。你可以将其想象成一台计算机,其中hidden states代表计算机的内存,输入如鼠标和键盘的操作,输出则是显示器上的内容。这些输入经过计算机的运算处理,导致内存状态发生变化,这种变化虽然不可见,但可以通过显示器上的内容来感知。这种内在状态的变化,即隐状态的变化,是RNN的核心特点。
RNN是如何实现这一点的呢?其实原理相对简单。它通过输入向量XI乘以可学习的权重WX,再加上前一步的状态hidden states I-1乘以转移矩阵,并加上偏置,最后通过激活函数得到当前的隐状态Hi。这个Hi可以进一步用于计算最终的模型输出YI。通过这种简单的方法,神经网络模型能够建模序列数据。一旦能够建模序列,模型就能掌握语言中的概率,理解人们说话的模式以及词语出现的概率。RNN的发展也经历了一段时间的演进。
传统的RNN模型相对简单,其表达能力较弱。若深入研究RNN模型,不难发现其性能受序列内容的影响显著。
-
语言模型依赖于序列模型,需要回顾前面的内容来预测下一个词汇。
-
模型的内存大小影响其准确性和生成语句的长度。
-
RNN(循环神经网络)存在记忆容量限制,导致语句生成受限。
-
为了改进RNN,引入了LSTM(长短期记忆网络),通过增加内部结构和开关机制来优化模型输出。
-
后续出现了GRU(门控循环单元)等架构,虽然在序列建模中常见,但在语言模型中的应用减少,主要原因是训练学习过程较慢。
在语言模型中,由于语言本身是一个序列模型,如果不回顾前面的内容,就无法准确预测下一个词汇。关键在于模型的内存必须足够大,否则容易遗忘。当记忆容量有限时,自然不会生成过长的语句。对于RNN(循环神经网络)也是如此。因此,研究者对RNN进行了多种改进,例如引入了LSTM(长短期记忆网络),它通过增加内部结构的复杂性和引入新的操作(如开关机制)来决定哪些部分需要修改,从而优化模型输出。虽然这些内容不是今天的重点,但值得一提的是,后续还出现了GRU(门控循环单元)等架构,这些架构在序列建模中仍然常见,但在语言模型中的应用相对减少,主要原因是模型训练学习过程较为缓慢。
-
反向传播在长序列中计算图增大,导致训练速度慢。
-
使用RNN建模语言的实际例子。
-
输入符号转换为数学向量的方法,如one-hot编码。
-
one-hot编码通过大词表将每个词映射为词表大小维度的向量。
大家可以看到前面的架构,如果要对它进行反向传播,即梯度下降的反向传播,需要从这里一步步计算到那里。随着序列越来越长,计算图会越来越大,需要通过更多步的计算才能算回去,因此在训练时速度较慢。接下来,我将通过一个实际例子展示如何使用RNN建模语言。在此过程中,我刚才提到,对于输入,我们可以通过简单的方法将离散的符号转换为数学上可运算的向量,例如使用one-hot方法。通过一个大词表,每个词对应一个词表大小维度的向量,当这个词是词表中的第几个时,将该维度设为1,其他维度设为0,这是一种简单的表示方法。
-
词嵌入通过矩阵运算将高维词向量降维到低维空间。
-
降维后的词向量更容易进行模型运算。
-
降维后的向量x1被输入到循环神经网络(RNN)中进行处理。
在输入之前,我们通常会通过一个矩阵运算来进行词嵌入(word embedding)。这一过程将高维的词向量,由于词汇表通常非常大,通过矩阵运算降维到低维空间。通过这种投影或类似的操作,词向量被降维到低维空间,从而更容易进行模型运算。经过词嵌入操作后,我们可以得到向量x1,随后将其输入到循环神经网络(RNN)中。输入后,这是第二个词的处理过程。
我们将所有词汇输入后,得到的隐藏状态 ( h_4 ) 可以被视为一种内存记忆,它已经接收并处理了之前的所有输入。因此,理论上,它包含了之前所有的信息,我们利用这些信息来实现特定的功能。
然后我们会在后边经过,然后接上一个新的运算。这个u实际上是一个可以学习的矩阵,通过hidden层与矩阵相乘加上偏置,再通过一个特殊的函数称为softmax,最终将其映射回整个词表的大小。
然后它会得到一个整个词表大小的一个维度的向量,每个维度对应每个词出现的概率分布。
-
Word embedding将one-hot向量映射到低维空间。
-
逆向操作将低维空间中的向量还原或转换到高维空间。
其实你可以把这个步骤理解成word embedding的逆向操作。Word embedding是将一个one-hot向量映射到一个低维空间中。而这一步则是将低维空间中的向量(如h4, h3, h4等)进行逆向操作,将其还原或转换到原始的高维空间中。
-
理想情况下,模型输出应为one-hot编码,即每个字后边的词是其本身。
-
实际语言中,给定前缀后,下一个词存在多种可能性。
-
softmax类似于一个概率,将一个词映射回词表大小的空间。
显示回词表大小的一个空间里边。当模型学得足够好时,它输出的结果应为one-hot编码,即每个字后边的词应是其本身。然而,在实际语言中,由于给定前缀后,后边确实存在多种可能性,因此下一个词也会有多种可能性。因此,这里提到的softmax,我也可以简单介绍一下。softmax实际上类似于一个概率,它将一个词映射回词表大小的一个空间里边。
其公式实质上可以简化为通过前序运算为每个词汇赋予一个分数,随后依据这些分数进行类似于加权平均的操作。
-
概率分布显示高概率词更有可能出现在后续词中。
-
例子“never too late too”中,“too cold”和“too late”出现概率高。
-
低概率词不太可能出现在后续词中。
-
模型通过这种方法掌握输入与后续词的关系,理解语言逻辑。
通过这个概率分布,实际上,概率高的词表示对于输入下一个出现概率更大的词,例如“never too late too”,随后会发现“too cold”和“too late”的出现概率都较高。而概率较低的词则代表不太可能出现在后续的词中。通过这种方法,模型间接掌握了前面输入与后续词语之间的关系,从而间接理解了语言的内在逻辑。
这个是刚刚介绍的一个内容,然后在这里的话,RNN对于每一步的输入,能够将上一步的状态和这一步的输入有效地混合在一起,通过一个激活函数得到下一步的输出。
-
信息通过特定方法可以无限传递,生成整个序列的输出。
-
计算过程中使用内在的隐藏状态表示。
-
通过矩阵运算将低维度向量映射回词表大小。
-
使用Softmax操作得到最终的概率分布。
通过这种方法,信息可以无限传递,从而得到整个序列的输出。在此过程中,内在的隐藏状态表示被用于进行计算。此外,刚才也提到了,u 是一个将低维度向量映射回词表大小的矩阵运算。通过 Softmax 操作,可以得到最终的概率分布。
-
人们倾向于关注近期发生的事情。
-
在RNN训练中,由于隐藏层大小限制,通常只能关注前几个词。
-
为了解决这一局部问题,引入了CNN作为推导方案。
在实际操作过程中,大家会发现,无论机器设置多大,人们更多关注的是近期发生的事情。在实际训练过程中,大家发现,原本关注的都是前几个词,因为更远的地方由于RNN的隐藏层大小限制,无法看到那么远。因此,后来出现了一种推导方案,即使用CNN来解决这个局部问题。
-
研究者简化语言模型,从考虑所有先前输入的词的概率,变为仅考虑最近N个词的影响。
-
这种简化模型被称为N-gram语言模型。
-
当N足够大时,N-gram模型与原始模型在概率计算上几乎等价。
-
目前N的取值通常受限,但当N足够大时,简化模型与原始模型的差异可以忽略不计。
-
例如,Bi-gram模型仅考虑前两个词的影响。
在研究平移不变模式时,有些图像能提供更直观的理解。在此背景下,研究者对语言模型进行了简化,将原本研究所有先前输入情况下下一个词出现概率的模型,退化为仅关注最近N个词的影响。这种模型被称为N-gram语言模型。当N足够大时,这种简化模型与原始模型在概率计算上几乎等价。目前,N的取值通常受限,但当N足够大时,简化模型与原始模型的差异可以忽略不计。例如,Bi-gram模型仅考虑前两个词的影响。
然后进行下一个预测,或者仅考虑前两个词,例如“plane is”,实际上是将一句话分解成连续的两个词或三个词的组合。
三元组(trigram)即观察三个词,并预测下一个词。当n足够大时,其原理与前述方法相同。在此情况下,我们可以采用卷积神经网络(CNN)的方法来处理。CNN主要用于图像处理,我们将输入视为一个整体,
-
描述了两个维度:序列维度和向量维度。
-
向量维度指的是输入数据的维度,例如四维向量。
-
卷积核(filter)在CNN中作为基础组件。
这个维度是序列,这个维度是它的向量维度。向量维度,就是对于每个书的输入x,比如说它是一个四维向量,然后student也是一个四维向量。这个是序列维度,这是向量维度。然后filter呢,其实是CNN里边的一个卷积核,它本质上就是作为一个基础。
-
通过添加特征(feature),可以得到网络的输出。
-
该网络方法可应用于语言表达中。
-
示例:使用最近的三个词(如“the student open”),通过滤波器、偏置和非线性层处理,最终激活得到特征。
-
这种方法类似于卷积神经网络(CNN)的简化版本。
然后加上特征(feature),最终就能得到其输出。在这里边的话,我们也可以将这样的一个网络应用到我们的语言表达当中。举个简单的例子,我们可以只看最近的三个词,即通过“the student open”,然后乘以一个滤波器(filter),再加上一个偏置,再通过一个非线性层(non-linear layer),然后激活(activation)就能得到这个特征(feature)。这样的话,它其实相当于是一个卷积神经网络(Convolutional Neural Networks, CNN)的退化版。
当我们把这个窗口无限线下平移时,它实际上能够三个词三个词地处理。这种方法在RN之后被广泛使用,与RN相比,它的一个显著优势是计算速度非常快。刚才讲解RN时,大家可能会注意到这一点。
-
反向传播过程与序列长度密切相关。
-
限制在n-gram范围内的反向传播长度显著缩短。
-
使用CNN模型相比RNN模型,训练速度更快,参数数量更少,反向传播链路更短。
-
RNN模型受限于序列长度,长序列时传播速度下降。
在反向传播过程中,其与序列长度密切相关。然而,当我们将其限制在n-gram范围内时,传播长度显著缩短。具体而言,只需经过几个步骤即可完成传播。这一改进带来的显著优势是训练速度的提升。通过对比,我们可以看到,最初使用RNN模型能够建模长序列之间的关系,而当我们采用CNN模型时,则能够提取局部特征。从参数角度来看,CNN模型所需学习的参数数量较少,且无需像RNN那样为确保长序列的建模能力而维持庞大的记忆容量。此外,CNN模型的反向传播链路更为简短,能够迅速完成传播,而RNN模型则受限于序列长度,当序列较长时,传播速度会显著下降。这一差异在之前的讨论中已有提及。
-
NOP中采用了神经网络模型架构。
-
Transformers是一种广泛使用的建模方案,最初用于机器翻译。
-
Transformers由Google的机器翻译团队提出,因其训练速度快且效果与RNN相当而被广泛应用。
在NOP中,我们采用了一些神经网络模型的架构。随后,出现了Transformers,这是一种目前广泛使用的建模方案。Transformers最初源自一个经典任务——机器翻译。该架构最初由Google的机器翻译团队提出。提出Transformer架构的原因是其在训练速度上比RNN更快,并且当时的效果与RNN不相上下。因此,它在机器翻译任务中表现出色。
-
翻译过程中,源语言需转换为目标语言。
-
最初使用RNN(循环神经网络)进行翻译。
-
RNN包括编码器RNN,通过逐词输入源语言词汇,改变其内部状态。
在输入源语言时,需要将其翻译成目标语言。例如,输入中文时,应将其翻译成英文。在此过程中,最初通常使用RNN(循环神经网络)来实现。具体来说,RNN包括一个编码器RNN,通过逐个输入源语言的词汇,使得其内部状态不断变化。
-
描述了一种翻译方法:通过输入起始标记,逐字预测下一个字,将英文翻译成中文。
-
强调了记忆在翻译过程中的重要性。
-
指出当记忆力不足时,长句子可能导致翻译内容无法被记住。
然后我将h4接过来,接到这边。在解码时,我输入一个起始标记,然后每个字预测下一个字,这样就能将输入的英文翻译成一系列中文。在这里,大家会发现记忆变得更加重要了。当记忆力不足时,如果句子太长,就无法记住翻译的内容。
实际上,机器翻译任务中存在一些问题,这也是为什么该任务更关注长序列的原因。在机器翻译过程中,通常会特别注意这些长序列的处理。
在这里的话,大家可以看一下,这个是一个多步的例子。
-
机器翻译系统使用编码器和解码器进行翻译。
-
解码器开始翻译时接收一个起始信号(START)。
-
解码器预测下一个字并将其反馈给自身,继续预测下一个字。
-
翻译过程持续到解码器输出结束信号(END)。
-
这种方法是最早机器翻译系统的主要方法,Google的机器翻译系统也采用了类似方法。