LLM的魔法揭秘:神经网络

前言

在当今人工智能的浪潮中,大语言模型(LLM)如 OpenAI 的 GPT 系列、DeepSeek 等,凭借其强大的语言理解与生成能力,着实令人惊叹。这些模型为何如此智能?其实,这背后的关键力量便是神经网络。今天,我们就来探讨一下 LLM 背后的神经网络基本原理。

到底什么是模型?

模型就像一个最强大脑,可以帮我们解决各种问题,比如预测明天的天气、识别图片中的物体、判断一段文本的情感倾向等,都可以借助模型来完成。

从神经网络的角度来看,模型的本质是由大量神经元相互连接构成的复杂网络。这些神经元就像一个个微小的处理器,它们接收来自其他神经元的输入信号,经过一定的处理后,再将结果传递给下一层神经元。通过这种层层传递和处理,神经网络能够对输入数据进行分析和理解,并输出我们所需要的结果。

从数学的视角来看,模型的核心是一组数学公式的集合。这些数学公式定义了模型的结构和行为,它们描述了输入数据如何通过模型进行变换和处理,最终得到输出结果。设计模型,实际上就是设计一组能够有效解决真实问题的数学公式。

一个简单的例子:水果分类问题

想象我们有酸橙和水蜜桃两种水果,我们知道它们在甜度、酸度这两个特征维度上有所不同。

现在给出10 条水果数据,每条数据包含酸度、甜度两个特征:

水果类别 甜度 (0-10) 酸度 (0-10)
酸橙 3 8
水蜜桃 8 2
酸橙 2 9
水蜜桃 7 1
酸橙 4 7
水蜜桃 9 1
酸橙 3 8
水蜜桃 6 2
酸橙 5 6
水蜜桃 8 3

我们希望实现一个简单的分类器,可以根据一组水果的(甜度,酸度)数据判断水果的类别。

通过观察这些样本,我们发现:

  • 酸橙通常 甜度低、酸度高
  • 水蜜桃通常 甜度高、酸度低

于是我们可以把这些水果表示为二维空间中的点(甜度,酸度),并尝试在图中画一条"分界线",把这两类水果区分开:

在这条直线的一侧,我们认为属于某一类(比如水蜜桃),另一侧属于另一类(比如酸橙)。对于一个新的水果,只要我们知道它的甜度和酸度,就可以把它放在这个平面上,并根据它位于哪一侧来判断它属于哪一类。

线性分类器

这就是一个简单的线性分类器。它的核心思想是:在特征空间中,寻找一个超平面(在二维中是直线),使得它能够将不同类别的样本尽可能地分隔开。

我们把这条直线用数学公式来表达。假设这条直线可以表示为:

<math xmlns="http://www.w3.org/1998/Math/MathML"> w 1 ⋅ x 1 + w 2 ⋅ x 2 + b = 0 w1⋅x1+w2⋅x2+b=0 </math>w1⋅x1+w2⋅x2+b=0

其中:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> x 1 x1 </math>x1 是甜度, <math xmlns="http://www.w3.org/1998/Math/MathML"> x 2 x2 </math>x2 是酸度
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> w 1 w1 </math>w1, <math xmlns="http://www.w3.org/1998/Math/MathML"> w 2 w2 </math>w2 是这条直线的权重(weight),决定了每个特征对分类的影响程度
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> b b </math>b 是偏置项(bias),决定这条直线的位置

我们定义分类规则为:

<math xmlns="http://www.w3.org/1998/Math/MathML"> y = { 1 如果 w 1 x 1 + w 2 x 2 + b > 0 0 否则 y = \begin{cases} 1 & \text{如果 } w_1 x_1 + w_2 x_2 + b > 0 \\ 0 & \text{否则} \end{cases} </math>y={10如果 w1x1+w2x2+b>0否则

这样我们就有了一个分类函数,可以根据输入的甜度和酸度来预测水果类别。

有了数学公式之后,接下来要做的就是确定一组合适的参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> [ w 1 , w 2 , b ] [ w1, w2, b ] </math>[w1,w2,b],使得我们的分类器模型能够尽可能准确地将水果分为酸橙或水蜜桃。

更复杂的场景怎么办?

想象这样一个情况:

  • 我们不只是区分两种水果,而是要识别几十种水果;
  • 我们不只使用甜度和酸度两个特征,而是有十几甚至上百个特征,比如颜色、质地、气味、大小、形状等等。

这时候,简单的直线可能再也无法有效地区分这些类别了。

再比如,某些水果的分布可能是:

  • 不是线性可分的(不能用一条直线分开)
  • 数据点之间存在复杂的非线性关系
  • 某些特征之间还有隐藏的交互关系(例如"颜色 + 光泽"共同影响判断)

面对这些更复杂的模式,线性分类器就显得力不从心了。

为了解决这些更复杂的模式,我们就需要更强有力的工具 ------ 机器学习模型 ,特别是神经网络

我们希望找到一个函数:

<math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( x 1 , x 2 , ... , x n ; w 1 , w 2 , ... , w m ) y = f(x_1, x_2, \dots, x_n; w_1, w_2, \dots, w_m) </math>y=f(x1,x2,...,xn;w1,w2,...,wm)

其中:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> x 1 , x 2 , ... , x n x_1, x_2, \dots, x_n </math>x1,x2,...,xn 表示输入数据的各个特征维度,比如甜度、酸度、颜色、质地、气味等;
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> w 1 , w 2 , ... , w n w_1, w_2, \dots, w_n </math>w1,w2,...,wn 是这个函数中的参数(也称为权重和偏置);
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 是一个复杂的映射函数,它的作用是将输入特征经过一系列变换后,输出对应的类别(如苹果、香蕉、橙子等)或预测值。

在简单的线性分类器中, <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 只是一个加权求和再加激活函数的表达式;但在面对更复杂的问题时,我们需要让 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 具备更强的表达能力,能够捕捉特征之间的非线性关系、组合特征的影响以及更高层次的抽象信息。

神经网络:构建复杂函数的强大工具

这时候,神经网络 就派上用场了。它通过多层结构(输入层、隐藏层、输出层)和非线性激活函数,可以构造出非常复杂的函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f ,从而适应各种非线性、高维、交互性强的数据分布。

举个例子,如果我们想识别几十种水果,输入可能是上百个特征,而输出则是每一类水果的概率。神经网络会自动从原始输入中提取出有用的"中间特征",例如"果皮光滑 + 颜色红润"可能被神经网络识别为"苹果"的关键特征组合。

如何确定参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 1 , w 2 , ... , w m w_1, w_2, \dots, w_m </math>w1,w2,...,wm

这正是机器学习 的核心任务:给定大量标注好的训练数据(比如每种水果的特征和正确标签),我们希望通过某种算法,自动调整这些参数,使得函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 的预测尽可能接近真实标签。

机器学习与神经网络

从简单的水果分类问题出发,我们找到了一种解决复杂问题的通用模式:无论是图像识别、语音处理还是自然语言理解,几乎所有复杂的模式计算任务都可以归结为寻找一个合适的函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f,该函数能够将输入数据(如图片像素值、音频信号、文本序列等)映射到期望的输出(如物体类别、语音命令、情感分析结果等)。

在这个框架下:

<math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( x ; w ) y = f(x; w) </math>y=f(x;w)

其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x 是输入特征, <math xmlns="http://www.w3.org/1998/Math/MathML"> w w </math>w 是模型参数, <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 是一个由神经网络实现的复杂函数。

我们的目标就是通过机器学习 来找到最优的参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> w w </math>w,这些参数包括了所有层之间的权重和偏置,它们决定了模型对不同特征的重视程度以及最终的输出形式。

这些技术让我们不再依赖手工设计规则或手动调参,而是让模型自己从数据中"学会"如何做出准确的判断。这正是现代人工智能的核心思想之一。

为什么选择神经网络 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f

  • 强大的表达能力:神经网络可以通过多层非线性变换自动提取出输入数据中的高级特征,这使得它们非常适合处理那些具有复杂内部结构的数据集。

  • 适应性强:无论是简单的线性关系还是高度非线性的模式,神经网络都能够通过调整其架构(如层数、每层的神经元数量)和优化算法来找到最适合的解决方案。

  • 端到端的学习:与传统的机器学习方法相比,神经网络允许从原始输入直接预测输出,减少了中间步骤的手动设计,使得整个过程更加自动化和高效。

如何确定最佳参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> w w </math>w

为了找到最优的参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> w w </math>w,我们通常使用机器学习的方式来完成,采用以下步骤:

  • 定义损失函数:衡量当前模型预测结果与真实标签之间的差距。
  • 优化算法:如梯度下降法,根据损失函数的变化方向不断调整参数,使模型误差逐步减小。
  • 迭代训练:重复计算损失、更新参数的过程,直到模型表现稳定或达到预设的训练轮数。

通过这种方式,我们可以让模型"学习"到如何在面对新数据时做出准确的预测,而无需人为地设定详细的规则或特征工程。在深度学习中,这个过程由反向传播算法高效实现,使得即使模型包含上百万参数,也能在合理时间内完成训练。

神经网络的理论知识

神经网络到底是什么?它是怎么工作的呢?下面先梳理一下神经网络的发展历程和关键概念,以便我们更好地掌握神经网络的工作原理。

神经网络的发展历程

神经网络在今天展现出强大的能力,但它的发展历程并非一帆风顺,而是充满了曲折与挑战:

  • 1943年:McCulloch-Pitts 神经元模型 Warren McCulloch 和 Walter Pitts 提出第一个形式化的神经元模型,奠定了人工神经网络的理论基础。早期探索阶段中,科学家们尝试构建基本计算模型模拟大脑工作方式,但这些模型通常使用固定参数,缺乏灵活性。
  • 1949年:Hebb学习规则 心理学家 Donald Hebb 提出了著名的 Hebb 学习规则,指出人脑中的神经元连接强度可以根据经验变化。这一发现启发了计算机科学家思考如何让机器也能通过调整权重来进行学习,标志着从静态模型向能够自我优化的动态模型转变的重要一步。
  • 1958年:感知机(Perceptron)提出 Frank Rosenblatt 提出单层感知机模型,首次引入了权重学习机制,用于二分类任务。尽管感知器只能解决简单的线性分类问题(比如线性可分的数据集),但它开启了机器自动学习的新篇章。然而,感知器的一个显著局限在于它无法处理非线性问题,如异或(XOR)逻辑问题。
  • 1969年:《Perceptrons》出版 Marvin Minsky 和 Seymour Papert 出版了《Perceptrons》,指出单层感知机无法解决异或(XOR)问题,导致神经网络研究进入低潮期。这促使研究人员寻找新的方法来克服线性限制。
  • 1986年:反向传播算法(Backpropagation)推广 Rumelhart、Hinton 等人系统地推广了多层神经网络中的误差反向传播算法,使得训练深层网络成为可能。为了克服感知器的局限性,研究人员开发了多层感知器(MLP)。MLP不仅包含输入层和输出层,还增加了至少一个隐藏层。隐藏层的存在使得网络能够学习到输入数据中的非线性特征,从而解决了诸如异或问题等非线性分类任务。
  • 1990年代:支持向量机(SVM)等方法兴起 由于计算资源限制,神经网络的训练较为困难。统计学习方法如 SVM 暂时取代神经网络成为主流。不过,随着技术的进步,特别是计算能力的提升,研究人员开始探索更深的神经网络结构。
  • 2006年:深度信念网络(DBN)提出 Geoffrey Hinton 提出深度信念网络和"逐层预训练"思想,标志着深度学习的复兴。深度神经网络拥有多个隐藏层,每一层都能够提取出不同层次的特征。这种多层次的结构允许模型学习到数据中的高级抽象表示,从而实现对复杂任务(如图像识别、语音处理、自然语言理解等)的高效处理。
  • 2012年:AlexNet 在 ImageNet 夺冠 Alex Krizhevsky 等人使用深度卷积神经网络 AlexNet 在图像识别竞赛中大幅领先,掀起深度学习热潮。现代的大型语言模型(LLMs)就是深度神经网络应用的一个典型例子,它们能够理解和生成极其复杂的语言模式。
  • 2015年至今:Transformer 架构、GNN、GAN 等新结构涌现 神经网络在自然语言处理、图结构数据、生成对抗等方面持续创新。例如 Transformer 架构极大地提高了处理序列数据的效率,而 GNN 则为图数据提供了强大的工具。

我们可以清晰地看到,神经网络的历史是一部不断进化以适应更复杂任务和技术挑战的故事。正是在不断应对技术瓶颈和理论质疑的过程中,许多关键思想逐步被提出并完善,推动着这一领域持续向前发展。

神经网络的核心概念

从神经网络的演变过程中,我们提取了几个核心概念:

  1. 第一代 - 神经元模型:单个神经元,模拟生物神经元功能
  2. 第二代 - 单层网络:多个神经元并行,仅能解决线性问题
  3. 第三代 - 多层网络:引入隐藏层,具备非线性建模能力
  4. 第四代 - 深度神经网络:多隐藏层结构,实现自动特征提取和复杂模式识别

下面来看看这些核心概念。

神经元模型(Neuron Model)

神经元是神经网络的基本组成单元,模仿生物神经元的功能:接收输入信号,加权求和后通过激活函数输出。

数学表示

设输入为 <math xmlns="http://www.w3.org/1998/Math/MathML"> x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n </math>x1,x2,...,xn,对应的权重为 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 1 , w 2 , . . . , w n w_1, w_2, ..., w_n </math>w1,w2,...,wn,偏置为 $$$$,则神经元的输出为:

<math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( ∑ i = 1 n w i x i + b ) y = f\left( \sum_{i=1}^{n} w_i x_i + b \right) </math>y=f(∑i=1nwixi+b)

其中:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> ∑ w i x i + b \sum w_i x_i + b </math>∑wixi+b 对输入进行加权求和,称为净输入(net input)。
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( ⋅ ) f(\cdot) </math>f(⋅) 是激活函数,常用如 Sigmoid、ReLU、Tanh 等,它把净输入的结果通过非线性计算转换为目标输出。比如Sigmoid 函数可以把输入映射为(0, 1)之间的输出值,很适合作为二分类问题的概率结果。

这个简单的模型构成了所有神经网络的基础。

神经元的作用:通过输入已知的特征(如 <math xmlns="http://www.w3.org/1998/Math/MathML"> x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n </math>x1,x2,...,xn)和设定好的数学关系(由权值 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 1 , w 2 , . . . , w n w_1, w_2, ..., w_n </math>w1,w2,...,wn决定),就可以得到对未知目标属性的预测结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y。

单层神经网络(Single-Layer Neural Network)

单层神经网络由输入层、输出层组成,每层由多个神经元(节点)并行组成,每个神经元共享相同的输入,输出形成一个向量。其中:

  • 输入层的节点只负责传输数据,不做计算;
  • 输出层的节点负责对前一层的输入进行计算(加权求和+激活函数)

由于只有一个"计算层",所以称为单层神经网络。

两层节点之间的权重可以用一个权重矩阵来表示,因此输出层的加权求和可以用矩阵计算来表示。

数学表示

设输入向量为 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ∈ R n \mathbf{x} \in \mathbb{R}^n </math>x∈Rn,权重矩阵为 <math xmlns="http://www.w3.org/1998/Math/MathML"> W ∈ R m × n \mathbf{W} \in \mathbb{R}^{m \times n} </math>W∈Rm×n,偏置向量为 <math xmlns="http://www.w3.org/1998/Math/MathML"> b ∈ R m \mathbf{b} \in \mathbb{R}^m </math>b∈Rm,则输出为:

<math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( W x + b ) \mathbf{y} = f(\mathbf{W} \mathbf{x} + \mathbf{b}) </math>y=f(Wx+b)

其中:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m 是输出神经元数量;

  • 权重矩阵的每一行对应一个神经元的权重。

与神经元模型不同,单层神经网络的权重矩阵用的不是固定参数,而是通过训练来确定的。因此单层神经网络具备了可学习的特性,也被称为感知机 (Perceptron),它可以在一个N维的空间中划出一个N-1维的超平面作为决策分界 ,从而实现线性分类任务

局限性:只能解决线性可分问题(如AND、OR),不能解决非线性问题(如XOR)。

多层神经网络(Multi-Layer Neural Network)

单层神经网络无法解决非线性问题,但只要增加一层计算层就可以很好地解决非线性问题。引入的中间计算层就称为隐藏层 ,通过两层计算层、使用非线性激活函数(如Sigmoid、ReLU)来捕捉复杂关系,可以拟合任意连续函数,因此可以很好地处理非线性分类。这样得到的两层神经网络就称为多层神经网络,也叫多层感知机(Multilayer Perceptron, MLP)。

多层神经网络由输入层、隐藏层(Hidden Layer)、输出层构成。其中,隐藏层和输出层都属于计算层。

数学表达

假设第 <math xmlns="http://www.w3.org/1998/Math/MathML"> l l </math>l 层有 <math xmlns="http://www.w3.org/1998/Math/MathML"> h l h_l </math>hl 个神经元,其输入为前一层的输出 <math xmlns="http://www.w3.org/1998/Math/MathML"> a ( l − 1 ) \mathbf{a}^{(l-1)} </math>a(l−1),则第 <math xmlns="http://www.w3.org/1998/Math/MathML"> l l </math>l 层的输出为:

<math xmlns="http://www.w3.org/1998/Math/MathML"> z ( l ) = W ( l ) a ( l − 1 ) + b ( l ) \mathbf{z}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)} </math>z(l)=W(l)a(l−1)+b(l)

<math xmlns="http://www.w3.org/1998/Math/MathML"> a ( l ) = f ( z ( l ) ) \mathbf{a}^{(l)} = f(\mathbf{z}^{(l)}) </math>a(l)=f(z(l))

其中:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> W ( l ) ∈ R h l × h l − 1 \mathbf{W}^{(l)} \in \mathbb{R}^{h_l \times h_{l-1}} </math>W(l)∈Rhl×hl−1 是第 <math xmlns="http://www.w3.org/1998/Math/MathML"> l l </math>l 层的权重矩阵;

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> b ( l ) ∈ R h l \mathbf{b}^{(l)} \in \mathbb{R}^{h_l} </math>b(l)∈Rhl 是偏置;

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( ⋅ ) f(\cdot) </math>f(⋅) 是激活函数。

引入隐藏层后,模型的参数分布在每个计算层的权重矩阵中,这些参数都要通过训练来确定。这样一来,计算量更大了,计算过程也更复杂了,传统的感知器(单层神经网络)训练方法就不够用了。于是,从多层神经网络开始,人们开始用机器学习来训练模型。

深度神经网络(Deep Neural Network, DNN)

当多层神经网络中隐藏层数目较多(一般认为超过5层)时,称为深度神经网络 ,而其对应的机器学习方法就称为深度学习

结构特点

  • 输入层 → 多个隐藏层 → 输出层;

  • 每一层都进行线性变换+非线性激活;

  • 层数越深,抽象层次越高。

数学建模(递归式)

对于 <math xmlns="http://www.w3.org/1998/Math/MathML"> L L </math>L 层网络:

<math xmlns="http://www.w3.org/1998/Math/MathML"> 输入层: a ( 0 ) = x \text{输入层: } \mathbf{a}^{(0)} = \mathbf{x} </math>输入层: a(0)=x

<math xmlns="http://www.w3.org/1998/Math/MathML"> 隐藏层: z ( l ) = W ( l ) a ( l − 1 ) + b ( l ) , a ( l ) = f ( z ( l ) ) ( l = 1 , 2 , . . . , L − 1 ) \text{隐藏层: } \mathbf{z}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}, \quad \mathbf{a}^{(l)} = f(\mathbf{z}^{(l)}) \quad (l = 1, 2, ..., L-1) </math>隐藏层: z(l)=W(l)a(l−1)+b(l),a(l)=f(z(l))(l=1,2,...,L−1)

<math xmlns="http://www.w3.org/1998/Math/MathML"> 输出层: y ^ = a ( L ) = f ( W ( L ) a ( L − 1 ) + b ( L ) ) \text{输出层: } \hat{\mathbf{y}} = \mathbf{a}^{(L)} = f(\mathbf{W}^{(L)} \mathbf{a}^{(L-1)} + \mathbf{b}^{(L)}) </math>输出层: y^=a(L)=f(W(L)a(L−1)+b(L))

那么,深度神经网络引入了更多的隐藏层后,带来了什么收益呢?

  • 表达能力增强:更深的网络架构允许模型学习到更复杂的函数映射。

    • 每一层可以看作是对输入数据进行一次变换,更多的层意味着可以对原始数据进行更深层次的抽象和特征提取
    • 深度网络能够自动地从数据中学习层次化的特征表示。低层特征通常是通用的、基础性的特征,如边缘或纹理;随着网络深度的加深,高层特征逐渐变得更加具体和高级,比如复杂的形状和对象结构。
    • 这种特性使得深度学习特别适合处理需要复杂模式识别的任务,如语音识别、自然语言处理等。
  • 参数效率提升:相比于宽度较大的浅层网络,深度网络可以通过较少的参数数量实现相似甚至更好的性能。这是因为深层结构能够在较低维度的空间内有效地编码复杂的信息,从而减少了过拟合的风险,并提高了计算效率。

  • 解决非线性问题的能力更强:深层网络中的多个非线性激活函数组合起来,能够逼近任意复杂的非线性关系。这使得深度学习模型在处理高度非线性的现实世界数据时表现出色,例如在计算机视觉领域中的目标检测与识别。

  • 迁移学习的可能性 :由于深度网络学到的特征具有较好的泛化能力,因此它们非常适合用于迁移学习场景。即在一个任务上训练好的模型可以在相关但不同的任务上重新使用或微调,以加速新任务的学习过程并改善最终效果。

因此,深层的网络架构能够从原始输入中自动学习抽象特征,并且具有更强的表示能力,特别适用于处理高维、复杂的数据,如图像、语音和文本。

随着计算机能力的提升和大规模数据集的可用,深度神经网络的规模也不断增大。

现代的深度神经网络通常包含数十到数百层,一些先进的模型(如深度残差网络 ResNet)甚至可以达到上千层。随着网络深度的增加,模型的参数数量也大幅上升,当前主流的深度模型参数量通常在千万级到百亿级之间,例如像 BERT、GPT 等大型语言模型,其参数规模甚至可以达到数十亿到上千亿。

这些庞大的参数规模使得深度神经网络具备强大的建模能力,能够从海量数据中学习到复杂的模式和规律,但也带来了训练成本高、计算资源需求大等挑战。因此,高效的训练方法、优化算法以及硬件支持(如 GPU、TPU)成为了深度学习发展的重要支撑。

神经网络-小结

我们来看看神经网络的组成:

层级结构

  • 输入层:接收外部数据,每个节点代表一个特征维度,直接传递给下一层。
  • 隐藏层:由多个节点组成,通过加权求和与激活函数提取数据特征。层数和节点数决定网络的深度和宽度。
  • 输出层:产生最终预测结果,根据任务类型(分类或回归)设计,同样由多个节点组成。

连接与参数

  • 权重:位于节点之间的连接上,用于调节信号强度,即调整每个输入信号的重要性。
  • 偏置:加在每个节点的输入总和上,帮助控制该节点被激活的难易程度,是训练过程中调整的对象之一。

节点内部处理

  • 节点(神经元) :神经网络的基本计算单元,负责执行以下操作:

    • 接收来自前一层的输入信号。
    • 对这些信号进行加权求和,并加上偏置。
    • 使用激活函数处理加权和后的值,决定是否及如何将该信息传递给下一层。
  • 激活函数:应用于每个节点内部,在完成加权求和和加上偏置后使用,为网络引入非线性因素,使网络能够学习复杂模式。

随着神经网络层数和参数数量的增加,其表达能力和模型复杂度也随之提升,能够学习更复杂的特征和模式,但同时也带来更大的计算开销、训练难度和过拟合风险。

神经网络所表现出的"智能"本质上就存在于权重和偏置的数值组合(参数矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> W W </math>W)之中。这些参数通过训练过程不断调整,使网络能够从数据中自动学习规律并做出预测。

以上介绍的是最经典的神经网络类型------前馈神经网络(FNN),它代表了神经网络的基本结构,是一种单向传播信息的网络,不考虑输入数据之间的顺序关系。神经网络的发展历程是一个不断探索和创新的过程,从最初的前馈神经网络(FNN)开始,逐渐发展出多种适应不同任务需求的网络架构,比如递归神经网络(RNN)、卷积神经网络(CNN)、生成式对抗网络(GAN)等,它们针对特定的应用场景进行了优化,但它们都是基于FNN的基本概念发展而来的,共享了许多核心原则和技术:

  • 基本组件:所有这些网络都包含类似的基本组件,如神经元、权重、偏置、激活函数等。

  • 学习机制:大多数现代神经网络使用反向传播算法和梯度下降法来调整参数,以最小化损失函数。

  • 层级结构:它们都采用了分层结构,每一层负责提取不同层次的信息。

案例:基于MNIST数据库的图片识别

现在我们对神经网络的工作原理已经有了大概的了解,那么神经网络在实际应用中到底长什么样?

为了对此有更直观的理解,我们来看一个MNIST手写体识别的例子,这是深度学习最经典的入门任务之一。

MNIST 数据库是一个广泛使用的大型手写数字图像数据集,常用于训练和测试各种图像识别的机器学习算法:

  • 包含了70,000张手写数字的图像,其中60,000张用于训练,10,000张用于测试。
  • 每张图像都是28*28像素的灰度图像(像素值0~255),包含一个手写数字(0~9),且带有该数字的标注。

我们要基于MNIST 数据库训练一个模型,让它能够识别0~9的手写数字:提供一张测试数据集的图像作为输入,经过模型的计算,最终输出10个概率值,分别对应于该图像表示数字0至9的可能性。这是一个典型的分类问题。

那我们的模型应该使用什么样的神经网络结构呢?

假设我们用的是多层感知机(Multilayer Perceptron, MLP)架构,也就是传统的全连接神经网络,那么它的每一层神经元都会与前一层的所有神经元连接。此时,输入应该是一个一维向量,这样才能和第一层的权重进行矩阵乘法运算。于是我们可以这样设计:

  • 输入:对于一张28 * 28像素的图片,可以转换为28 * 28=784个数字。所以输入为784维的向量;
  • 输入层:包含784个节点,接收并传递输入;
  • 隐藏层:包含28个节点,每个节点提取图片中一行像素区域的特征值;
  • 输出:预测数字分别为0~9的概率,可以用10维的向量表示

那么,神经网络中就包含了两个参数矩阵,参数矩阵的大小由它的输入、输出向量的节点数确定:

  • 输入层 -> 隐藏层:参数矩阵W1包含784 * 28个参数,从784维输入层中提取特征,得到28维的特征向量
  • 隐藏层 -> 输出层:参数矩阵W2包含28 * 10个参数,从28维的特征向量中计算出数字分别为0~9的概率

这就是我们的模型需要通过训练确定的全部参数。

为了演示的目的,这里我们设计了一个最简单的神经网络结构。而在实际应用中,设计一个神经网络需要考量众多因素,包括任务的具体需求、数据集的特点、计算资源的限制以及模型性能的要求等。

基于神经网络的机器学习

在神经网络的架构下,复杂的模式计算问题都可以转换为一套通用的数学公式: <math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( x ; w ) y = f(x; w) </math>y=f(x;w)。其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x 是输入特征, <math xmlns="http://www.w3.org/1998/Math/MathML"> w w </math>w 是模型参数, <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 是一个由神经网络实现的复杂函数。

当我们设计好一个神经网络的结构(包括层数、每层的尺寸、参数矩阵、激活函数)之后,模型的结构基本上就确定了。接下来的关键步骤就是确定神经网络中的具体参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> W W </math>W,这个过程就交给机器学习了!

机器学习的过程通常通过迭代的方式自动进行,模型会不断调整参数以逐步提升性能。尤其是在神经网络层数较多、参数数量庞大的情况下,这种基于数据驱动的自动学习方式显得尤为重要。

机器学习的过程可以划分为以下几个阶段:

  1. 数据准备阶段

    • 数据预处理:包括数据清洗、标准化、归一化、缺失值处理、特征编码等。
    • 划分数据集:将数据划分为训练集、验证集和测试集(如 70%/15%/15% 比例)。
  2. 模型构建与配置阶段

    • 初始化参数:对神经网络的权重等参数进行初始化(如随机初始化或使用预训练参数)。

    • 定义损失函数:用于衡量预测误差。

      • 定义损失(Loss):表示预期输出和实际输出之间的误差,常用的有均方误差(MSE)或交叉熵(Cross-Entropy)。
      • 定义损失函数(Loss Function):把损失表示成关于参数(权重矩阵)的函数,以便能够通过优化算法来调整这些参数。
    • 选择优化器:如梯度下降(SGD)、Adam、RMSprop 等,决定如何更新模型参数以最小化损失。

  3. 模型训练阶段

    • 确定训练目标:寻找使损失函数最小化的参数组合。
    • 使用反向传播算法结合优化器优化损失函数:通过前向传播计算输出,再通过反向传播计算梯度并更新参数。
    • 设置停止准则:如设定最大迭代次数、早停机制(当验证集性能不再提升时终止训练)。
  4. 模型评估与调优阶段

    • 评估模型:在测试集上评估模型表现,常用指标包括准确率、精确率、召回率、F1 分数等。

    • 超参数调优(可选):根据验证集结果调整学习率、批量大小、网络结构等,进一步提升模型性能。

反向传播 和 梯度下降

梯度下降算法的基本思想是利用损失函数相对于模型参数的梯度(即导数),确定参数应该如何调整才能使得损失函数的值降低。具体过程为:

  1. 初始化参数:首先为模型参数设置初始值,通常这些值是随机生成的。
  2. 计算梯度:对于当前参数值,计算损失函数关于每个参数的梯度。梯度是一个向量,它指向的是损失函数增加最快的方向。因此,为了减少损失函数的值,我们需要沿着梯度的反方向更新参数。
  3. 更新参数:沿着损失函数下降最快的方向,一小步一小步地调整模型参数;这里的步长通过学习率来控制;
  4. 重复迭代:重复步骤2和步骤3,直到满足某个停止条件,如达到最大迭代次数或参数变化小于某一阈值等。

简单来说,梯度下降的作用就是根据损失函数对每个参数的"敏感程度"(即梯度),去更新这些参数。

然而,要在复杂的神经网络模型中计算损失函数对每个参数的梯度,代价很高。我们怎么快速、高效地计算出每一个参数对应的梯度呢?这就用到了反向传播算法

为什么要用反向传播算法?

  • 因为神经网络是多层结构,每一层的参数会影响下一层的输出,最终影响损失值。
  • 想要使用梯度下降更新参数,就必须知道:损失函数相对于每个参数的导数是多少。
  • 反向传播利用链式法则,从输出层开始,逐层向前回传误差信息,自动高效地计算出所有参数的梯度。

所以说,反向传播是为梯度下降服务的:反向传播负责"算梯度",梯度下降负责"用梯度来更新参数"。反向传播结合梯度下降优化方法,对于训练深层神经网络至关重要。

反向传播是怎么工作的:反向传播从输出层往输入层方向,一层一层地把误差"传递回去",并利用链式法则计算每一层参数的梯度,以便后续用梯度下降进行参数更新。

对于一个二层神经网络来说,整个训练过程可以概括为:

  • 前向传播:输入 → 隐藏层 → 输出层 → 得到预测值

  • 计算损失:预测值 vs 真实值;

  • 反向传播开始:

    • 先算输出层误差
    • 把误差传回给隐藏层,计算隐藏层的梯度
    • 再传回给输入层......
  • 得到所有参数的梯度后,梯度下降登场:用这些梯度去更新各个层的权重和偏置

损失函数

从模型训练过程来看,定义一个合适的损失函数是关键。有了损失函数后,模型的训练效果就有了衡量的指标、优化的方向,训练的目标就转化成了损失函数的优化问题,反向传播和梯度下降的方法都是围绕损失函数的优化而展开的。

那损失函数应该怎么定义呢?一个良好的损失函数应该满足以下几个通用性质:

  • 非负性:损失函数的值应该是非负的。损失函数本质上是用来衡量预测错误的程度,而错误程度不能是负数。
  • 对错得当:当预测完全正确时,损失函数的值应当为最小值(理想情况下为0)。随着预测误差的增加,损失也应相应增加,以反映预测与实际结果之间的差异。
  • 平滑性和可导性:为了便于使用梯度下降等优化算法,损失函数最好是连续且可微的。这意味着对于大多数参数值,我们能够计算出损失函数关于这些参数的梯度,从而允许通过调整参数来减少损失。
  • 对异常值敏感度适中:某些损失函数可能会对异常值(outliers)非常敏感,这可能导致模型训练过程中过分关注减少这些异常点上的误差,而忽视了整体数据集的表现。因此,理想的损失函数应该能够在不过分放大异常值影响的同时,依然能有效地指导模型学习。
  • 公平性:一个好的损失函数还应该公正地对待不同类型的错误。例如,在不平衡分类问题中,简单地最小化总体错误率可能会导致模型偏向于预测多数类,因此在这种情况下,可能需要采用加权损失或其他策略来确保少数类也被充分考虑。

此外,选择具体的损失函数时也需要考虑到具体问题的特点。例如,在分类问题中常用的交叉熵损失函数,在回归问题中则可能更倾向于使用均方误差(MSE)或平均绝对误差(MAE)作为损失函数。

总之,损失函数在机器学习和深度学习中扮演着至关重要的角色,它不仅指导模型的学习方向,还直接影响到模型的最终性能。

LLM场景下的神经网络

在大语言模型(LLM)的背后,正是深度神经网络在支撑着其强大的语言理解和生成能力。接下来,我们看看深度神经网络是怎么应用到LLM 的文本生成场景的。

  1. 数据准备:首先,需要收集并预处理大量的文本数据作为训练集。这些数据可能来自互联网、书籍、文章等多样化的来源,并经过清洗和格式化以便于模型学习。

  2. 初始化模型参数:创建一个深度神经网络架构,通常包含多个隐藏层,每层有成千上万甚至数亿个参数。这些参数初始值随机设定或采用特定策略初始化。

  3. 前向传播 :输入一段文本序列到模型中,通过每一层进行计算,最终输出每个时间步 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t 上下一个词的概率分布 <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( x t ∣ x 1 , x 2 , . . . , x t − 1 ) P(x_t | x_1, x_2, ..., x_{t-1}) </math>P(xt∣x1,x2,...,xt−1)。这一过程涉及复杂的矩阵运算和非线性变换,旨在捕捉输入文本中的语义信息。

  4. 损失计算

    • 对于每个时间步 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t,模型会根据前面的词 <math xmlns="http://www.w3.org/1998/Math/MathML"> x 1 , x 2 , . . . , x t − 1 x_1, x_2, ..., x_{t-1} </math>x1,x2,...,xt−1 预测下一个词 <math xmlns="http://www.w3.org/1998/Math/MathML"> x t x_t </math>xt 的概率分布。
    • 使用损失函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> Loss = − ∑ t = 1 T log ⁡ P ( x t ∣ x 1 , x 2 , . . . , x t − 1 ) \text{Loss} = -\sum_{t=1}^{T} \log P(x_t | x_1, x_2, ..., x_{t-1}) </math>Loss=−∑t=1TlogP(xt∣x1,x2,...,xt−1) 计算总损失。该公式表示在整个文本序列 <math xmlns="http://www.w3.org/1998/Math/MathML"> T T </math>T 中,模型预测每个词 <math xmlns="http://www.w3.org/1998/Math/MathML"> x t x_t </math>xt 的负对数似然之和。
    • 具体来说,对于每个时间步 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t,如果模型预测的词与实际目标词一致,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( x t ∣ x 1 , x 2 , . . . , x t − 1 ) P(x_t | x_1, x_2, ..., x_{t-1}) </math>P(xt∣x1,x2,...,xt−1) 会越大,其负对数则较小,从而使得损失值较低;反之,如果预测错误,则损失值较高。
  5. 反向传播与梯度下降

    • 利用反向传播算法计算出每个参数对总损失的影响程度(即梯度)。由于损失函数是基于负对数似然的,因此梯度反映了如何调整参数以提高预测准确率。
    • 根据计算得到的梯度,应用优化算法(如Adam)调整模型参数,使损失函数值尽可能减小,从而提升模型的预测能力。
  6. 迭代训练:重复上述步骤,遍历整个训练数据集多次(称为epoch)。随着训练的进行,模型逐渐学会根据上下文预测合理的后续词汇,从而具备了生成连贯且有意义文本的能力。

  7. 评估与调优:在验证集上评估模型性能,检查诸如困惑度(perplexity)等指标,必要时调整超参数以改善模型表现。

  8. 部署与应用:训练完成后,将模型部署到生产环境中,用于各种应用场景,比如自动摘要、机器翻译、对话系统等。用户输入提示后,模型基于所学知识生成相应文本回复。

通过这样的训练流程,深度神经网络能够从海量文本数据中学习语言规律,并利用这些规律生成高质量的文本内容。

LLM文本预测场景下的损失函数

损失函数在LLM的训练中起到了关键作用,它指导模型不断优化参数,以更好地预测下一个词,从而生成更加自然流畅的文本。根据损失函数公式:

<math xmlns="http://www.w3.org/1998/Math/MathML"> Loss = − ∑ t = 1 T log ⁡ P ( x t ∣ x 1 , x 2 , . . . , x t − 1 ) \text{Loss} = -\sum_{t=1}^{T} \log P(x_t | x_1, x_2, ..., x_{t-1}) </math>Loss=−∑t=1TlogP(xt∣x1,x2,...,xt−1)

段落的损失函数 相当于对 <math xmlns="http://www.w3.org/1998/Math/MathML"> − l o g ( 每个字的段落联合概率 ) -log(每个字的段落联合概率) </math>−log(每个字的段落联合概率)的求和,为什么要这样定义呢?

简单来说,段落的总损失等于段落中每个字的损失之和,而模型输出的是每个字的段落联合概率P,所以还需要有一个转换函数:每个字的段落联合概率P -> 每个字的损失loss,这个转换函数就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> loss = − log ⁡ ( P ) \text{loss} = -\log(P) </math>loss=−log(P)。

具体来说:

在文本生成任务中,模型输出的是一个概率分布 ,也就是说,对于每一个可能的词(或者 token),模型会给出它出现的概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> P P </math>P,这些概率值都落在区间 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( 0 , 1 ) (0,1) </math>(0,1) 中。

我们用 负对数似然(Negative Log-Likelihood, NLL) 来衡量预测的好坏,即对真实标签对应的概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> P P </math>P 取负对数 <math xmlns="http://www.w3.org/1998/Math/MathML"> loss = − log ⁡ ( P ) \text{loss} = -\log(P) </math>loss=−log(P),它将原本在 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( 0 , 1 ) (0,1) </math>(0,1) 区间内的概率值 $$$$ 映射到了 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( + ∞ , 0 ) (+\infty, 0) </math>(+∞,0) 的范围:

  • 当 <math xmlns="http://www.w3.org/1998/Math/MathML"> P → 0 P \to 0 </math>P→0 时, <math xmlns="http://www.w3.org/1998/Math/MathML"> − log ⁡ ( P ) → + ∞ -\log(P) \to +\infty </math>−log(P)→+∞:表示预测很差,损失很大;
  • 当 <math xmlns="http://www.w3.org/1998/Math/MathML"> P = 1 P = 1 </math>P=1 时, <math xmlns="http://www.w3.org/1998/Math/MathML"> − log ⁡ ( P ) = 0 -\log(P) = 0 </math>−log(P)=0:表示预测完全正确,损失为0。

这样转换的意义在于:

  • 保持了单调性:

    • 对正确词的预测概率越大,损失越小;概率越小,损失越大。
    • 而且这种关系是单调的,不会出现"概率变大但损失也变大"的情况,便于优化算法稳定地进行梯度下降。
  • 对错误程度进行了放大

    • 如果模型给一个正确词分配了很小的概率(比如 <math xmlns="http://www.w3.org/1998/Math/MathML"> P = 0.01 P=0.01 </math>P=0.01),那么损失就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> − log ⁡ ( 0.01 ) = 4.6 -\log(0.01)=4.6 </math>−log(0.01)=4.6,这已经是一个很大的数值。
    • 相反,如果模型信心十足(如 <math xmlns="http://www.w3.org/1998/Math/MathML"> P = 0.9 P=0.9 </math>P=0.9),那损失就只有 <math xmlns="http://www.w3.org/1998/Math/MathML"> − log ⁡ ( 0.9 ) = 0.105 -\log(0.9)=0.105 </math>−log(0.9)=0.105,说明预测很好。
    • 这让模型在训练过程中,能明确区分出"自信且正确"和"犹豫或错误"的预测,并惩罚那些不自信的错误预测。
  • 与信息论中的"信息量"一致

    • 在信息论中,一个事件的信息量定义为 <math xmlns="http://www.w3.org/1998/Math/MathML"> I ( x ) = − log ⁡ P ( x ) I(x) = -\log P(x) </math>I(x)=−logP(x)。
    • 一个低概率事件发生时,它的信息量大,对应损失也大;高概率事件发生时,信息量小,损失也小。
    • 因此,这种损失函数本质上是在让模型学习如何减少对"意外"事件的依赖,提高整体预测的确定性和一致性。

假设我们有两个模型:

模型 对正确词的预测概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> P P </math>P 损失值 <math xmlns="http://www.w3.org/1998/Math/MathML"> − log ⁡ ( P ) -\log(P) </math>−log(P)
A 0.9 0.105
B 0.1 2.303

很明显,模型 A 预测得更准,所以损失更小;而模型 B 给出的概率很低,说明它没把握,损失也就更大。

因此,使用 <math xmlns="http://www.w3.org/1998/Math/MathML"> − log ⁡ ( P ) -\log(P) </math>−log(P) 来衡量每个词的误差,实际上是一种将概率转化为损失的自然方式,它既保留了概率的意义,又使损失具有良好的数学性质和可优化性,因此广泛应用于语言模型等基于概率建模的任务中。

神经网络 与 LLM

大语言模型主要基于Transformer架构,这是一种专门为处理序列数据设计的深度学习模型。

Transformer是一种特殊的神经网络架构,它不仅使用了神经网络的基本组件(如全连接层, FNN),还通过引入新的机制(如自注意力机制)来解决传统神经网络在处理长距离依赖等问题上的局限性。

下面是Transformer的架构图,其中编码器、解码器中的Multi-Head Self Attention、FeedFoward等模块中包含了多个神经网络

简单来说,神经网络是基石,Transformer作为关键架构推动了序列处理领域的进步,而大型语言模型则是这一进步的具体应用成果,展示了当前人工智能在理解和生成自然语言方面的强大能力。

总结

机器学习和神经网络并不是魔法,而是一种让计算机通过大量数据自动学习规律、发现模式、做出决策的技术。这正是今天AI的核心能力之一。

神经网络作为一种灵活且强大的工具,为我们解决复杂问题提供了全新的视角和方法。它能够从海量数据中提取关键特征,识别潜在的关联关系,并用于预测与决策,广泛应用于图像识别、自然语言处理、自动驾驶、医疗诊断、金融风控、推荐系统等多个前沿领域。

随着计算能力的提升和数据规模的增长,神经网络的能力也在不断增强。从最初的感知机到如今的深度学习模型,我们已经能够在许多任务上达到甚至超越人类水平。掌握其原理与应用,不仅有助于理解当前AI技术的基础,也为探索更高级的智能形式打下坚实基础。

相关推荐
堆栈future1 小时前
深度剖析Manus:如何打造低幻觉、高效率、安全可靠的Agentic AI系统
llm·aigc·mcp
AI大模型1 小时前
大模型炼丹术(七):LLM微调实战:训练一个垃圾邮件分类器
程序员·llm·agent
2401_878624793 小时前
pytorch 神经网络
人工智能·pytorch·神经网络
Gyoku Mint4 小时前
深度学习×第7卷:参数初始化与网络搭建——她第一次挑好初始的重量
人工智能·pytorch·rnn·深度学习·神经网络·算法·机器学习
feihui4 小时前
跟着 Nanogpt 实践 Transformer
llm
302AI4 小时前
全面刷新榜单,“全球最强 AI” Grok 4 评测:真实实力与局限性解析
人工智能·llm
AI大模型6 小时前
大模型炼丹术(六):别只会用Greedy!6种主流LLM解码策略全面解析,附适用场景
程序员·llm·agent
GA琥珀20 小时前
LLM系统性学习完全指南
llm
可观测性用观测云20 小时前
OpenLLMetry 助力 LLM 应用实现可观测性
llm